001/*
002 * #%L
003 * HAPI FHIR JPA Server
004 * %%
005 * Copyright (C) 2014 - 2023 Smile CDR, Inc.
006 * %%
007 * Licensed under the Apache License, Version 2.0 (the "License");
008 * you may not use this file except in compliance with the License.
009 * You may obtain a copy of the License at
010 *
011 *      http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 * #L%
019 */
020package ca.uhn.fhir.jpa.entity;
021
022import ca.uhn.fhir.util.ValidateUtil;
023import org.apache.commons.lang3.builder.EqualsBuilder;
024import org.apache.commons.lang3.builder.HashCodeBuilder;
025import org.apache.commons.lang3.builder.ToStringBuilder;
026import org.apache.commons.lang3.builder.ToStringStyle;
027
028import javax.annotation.Nonnull;
029import javax.persistence.*;
030import java.io.Serializable;
031
032import static org.apache.commons.lang3.StringUtils.left;
033import static org.apache.commons.lang3.StringUtils.length;
034
035@Table(name = "TRM_VALUESET_C_DESIGNATION", indexes = {
036        // must have same name that indexed FK or SchemaMigrationTest complains because H2 sets this index automatically
037        @Index(name = "FK_TRM_VALUESET_CONCEPT_PID",  columnList = "VALUESET_CONCEPT_PID", unique = false)
038})
039@Entity()
040public class TermValueSetConceptDesignation implements Serializable {
041        private static final long serialVersionUID = 1L;
042
043        @Id()
044        @SequenceGenerator(name = "SEQ_VALUESET_C_DSGNTN_PID", sequenceName = "SEQ_VALUESET_C_DSGNTN_PID")
045        @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_VALUESET_C_DSGNTN_PID")
046        @Column(name = "PID")
047        private Long myId;
048
049        @ManyToOne(fetch = FetchType.LAZY)
050        @JoinColumn(name = "VALUESET_CONCEPT_PID", referencedColumnName = "PID", nullable = false, foreignKey = @ForeignKey(name = "FK_TRM_VALUESET_CONCEPT_PID"))
051        private TermValueSetConcept myConcept;
052
053        @Column(name = "VALUESET_CONCEPT_PID", insertable = false, updatable = false, nullable = false)
054        private Long myConceptPid;
055
056        @ManyToOne(fetch = FetchType.LAZY)
057        @JoinColumn(name = "VALUESET_PID", referencedColumnName = "PID", nullable = false, foreignKey = @ForeignKey(name = "FK_TRM_VSCD_VS_PID"))
058        private TermValueSet myValueSet;
059
060        @Column(name = "VALUESET_PID", insertable = false, updatable = false, nullable = false)
061        private Long myValueSetPid;
062
063        @Transient
064        private String myValueSetUrl;
065
066        @Transient
067        private String myValueSetName;
068
069        @Column(name = "LANG", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
070        private String myLanguage;
071
072        @Column(name = "USE_SYSTEM", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
073        private String myUseSystem;
074
075        @Column(name = "USE_CODE", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
076        private String myUseCode;
077
078        @Column(name = "USE_DISPLAY", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
079        private String myUseDisplay;
080
081        @Column(name = "VAL", nullable = false, length = TermConceptDesignation.MAX_VAL_LENGTH)
082        private String myValue;
083
084        @Transient
085        private transient Integer myHashCode;
086
087        public Long getId() {
088                return myId;
089        }
090
091        public TermValueSetConcept getConcept() {
092                return myConcept;
093        }
094
095        public TermValueSetConceptDesignation setConcept(TermValueSetConcept theConcept) {
096                myConcept = theConcept;
097                return this;
098        }
099
100        public TermValueSet getValueSet() {
101                return myValueSet;
102        }
103
104        public TermValueSetConceptDesignation setValueSet(TermValueSet theValueSet) {
105                myValueSet = theValueSet;
106                return this;
107        }
108
109        public String getValueSetUrl() {
110                if (myValueSetUrl == null) {
111                        myValueSetUrl = getValueSet().getUrl();
112                }
113
114                return myValueSetUrl;
115        }
116
117        public String getValueSetName() {
118                if (myValueSetName == null) {
119                        myValueSetName = getValueSet().getName();
120                }
121
122                return myValueSetName;
123        }
124
125        public String getLanguage() {
126                return myLanguage;
127        }
128
129        public TermValueSetConceptDesignation setLanguage(String theLanguage) {
130                ValidateUtil.isNotTooLongOrThrowIllegalArgument(theLanguage, TermConceptDesignation.MAX_LENGTH,
131                        "Language exceeds maximum length (" + TermConceptDesignation.MAX_LENGTH + "): " + length(theLanguage));
132                myLanguage = theLanguage;
133                return this;
134        }
135
136        public String getUseSystem() {
137                return myUseSystem;
138        }
139
140        public TermValueSetConceptDesignation setUseSystem(String theUseSystem) {
141                ValidateUtil.isNotTooLongOrThrowIllegalArgument(theUseSystem, TermConceptDesignation.MAX_LENGTH,
142                        "Use system exceeds maximum length (" + TermConceptDesignation.MAX_LENGTH + "): " + length(theUseSystem));
143                myUseSystem = theUseSystem;
144                return this;
145        }
146
147        public String getUseCode() {
148                return myUseCode;
149        }
150
151        public TermValueSetConceptDesignation setUseCode(String theUseCode) {
152                ValidateUtil.isNotTooLongOrThrowIllegalArgument(theUseCode, TermConceptDesignation.MAX_LENGTH,
153                        "Use code exceeds maximum length (" + TermConceptDesignation.MAX_LENGTH + "): " + length(theUseCode));
154                myUseCode = theUseCode;
155                return this;
156        }
157
158        public String getUseDisplay() {
159                return myUseDisplay;
160        }
161
162        public TermValueSetConceptDesignation setUseDisplay(String theUseDisplay) {
163                myUseDisplay = left(theUseDisplay, TermConceptDesignation.MAX_LENGTH);
164                return this;
165        }
166
167        public String getValue() {
168                return myValue;
169        }
170
171        public TermValueSetConceptDesignation setValue(@Nonnull String theValue) {
172                ValidateUtil.isNotBlankOrThrowIllegalArgument(theValue, "theValue must not be null or empty");
173                ValidateUtil.isNotTooLongOrThrowIllegalArgument(theValue, TermConceptDesignation.MAX_VAL_LENGTH,
174                        "Value exceeds maximum length (" + TermConceptDesignation.MAX_VAL_LENGTH + "): " + length(theValue));
175                myValue = theValue;
176                return this;
177        }
178
179        @Override
180        public boolean equals(Object theO) {
181                if (this == theO) return true;
182
183                if (!(theO instanceof TermValueSetConceptDesignation)) return false;
184
185                TermValueSetConceptDesignation that = (TermValueSetConceptDesignation) theO;
186
187                return new EqualsBuilder()
188                        .append(getLanguage(), that.getLanguage())
189                        .append(getUseSystem(), that.getUseSystem())
190                        .append(getUseCode(), that.getUseCode())
191                        .append(getUseDisplay(), that.getUseDisplay())
192                        .append(getValue(), that.getValue())
193                        .isEquals();
194        }
195
196        @Override
197        public int hashCode() {
198                if (myHashCode == null) {
199                        myHashCode = new HashCodeBuilder(17, 37)
200                                .append(getLanguage())
201                                .append(getUseSystem())
202                                .append(getUseCode())
203                                .append(getUseDisplay())
204                                .append(getValue())
205                                .toHashCode();
206                }
207                return myHashCode;
208        }
209
210        @Override
211        public String toString() {
212                return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
213                        .append("myId", myId)
214                        .append(myConcept != null ? ("myConcept - id=" + myConcept.getId()) : ("myConcept=(null)"))
215                        .append("myConceptPid", myConceptPid)
216                        .append(myValueSet != null ? ("myValueSet - id=" + myValueSet.getId()) : ("myValueSet=(null)"))
217                        .append("myValueSetPid", myValueSetPid)
218                        .append("myValueSetUrl", this.getValueSetUrl())
219                        .append("myValueSetName", this.getValueSetName())
220                        .append("myLanguage", myLanguage)
221                        .append("myUseSystem", myUseSystem)
222                        .append("myUseCode", myUseCode)
223                        .append("myUseDisplay", myUseDisplay)
224                        .append("myValue", myValue)
225                        .toString();
226        }
227}