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 java.io.Serializable;
029import javax.annotation.Nonnull;
030import javax.persistence.*;
031
032import static org.apache.commons.lang3.StringUtils.left;
033import static org.apache.commons.lang3.StringUtils.length;
034
035@Table(
036                name = "TRM_VALUESET_C_DESIGNATION",
037                indexes = {
038                        // must have same name that indexed FK or SchemaMigrationTest complains because H2 sets this index
039                        // automatically
040                        @Index(name = "FK_TRM_VALUESET_CONCEPT_PID", columnList = "VALUESET_CONCEPT_PID", unique = false),
041                        @Index(name = "FK_TRM_VSCD_VS_PID", columnList = "VALUESET_PID")
042                })
043@Entity()
044public class TermValueSetConceptDesignation implements Serializable {
045        private static final long serialVersionUID = 1L;
046
047        @Id()
048        @SequenceGenerator(name = "SEQ_VALUESET_C_DSGNTN_PID", sequenceName = "SEQ_VALUESET_C_DSGNTN_PID")
049        @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_VALUESET_C_DSGNTN_PID")
050        @Column(name = "PID")
051        private Long myId;
052
053        @ManyToOne(fetch = FetchType.LAZY)
054        @JoinColumn(
055                        name = "VALUESET_CONCEPT_PID",
056                        referencedColumnName = "PID",
057                        nullable = false,
058                        foreignKey = @ForeignKey(name = "FK_TRM_VALUESET_CONCEPT_PID"))
059        private TermValueSetConcept myConcept;
060
061        @Column(name = "VALUESET_CONCEPT_PID", insertable = false, updatable = false, nullable = false)
062        private Long myConceptPid;
063
064        @ManyToOne(fetch = FetchType.LAZY)
065        @JoinColumn(
066                        name = "VALUESET_PID",
067                        referencedColumnName = "PID",
068                        nullable = false,
069                        foreignKey = @ForeignKey(name = "FK_TRM_VSCD_VS_PID"))
070        private TermValueSet myValueSet;
071
072        @Column(name = "VALUESET_PID", insertable = false, updatable = false, nullable = false)
073        private Long myValueSetPid;
074
075        @Transient
076        private String myValueSetUrl;
077
078        @Transient
079        private String myValueSetName;
080
081        @Column(name = "LANG", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
082        private String myLanguage;
083
084        @Column(name = "USE_SYSTEM", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
085        private String myUseSystem;
086
087        @Column(name = "USE_CODE", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
088        private String myUseCode;
089
090        @Column(name = "USE_DISPLAY", nullable = true, length = TermConceptDesignation.MAX_LENGTH)
091        private String myUseDisplay;
092
093        @Column(name = "VAL", nullable = false, length = TermConceptDesignation.MAX_VAL_LENGTH)
094        private String myValue;
095
096        @Transient
097        private transient Integer myHashCode;
098
099        public Long getId() {
100                return myId;
101        }
102
103        public TermValueSetConcept getConcept() {
104                return myConcept;
105        }
106
107        public TermValueSetConceptDesignation setConcept(TermValueSetConcept theConcept) {
108                myConcept = theConcept;
109                return this;
110        }
111
112        public TermValueSet getValueSet() {
113                return myValueSet;
114        }
115
116        public TermValueSetConceptDesignation setValueSet(TermValueSet theValueSet) {
117                myValueSet = theValueSet;
118                return this;
119        }
120
121        public String getValueSetUrl() {
122                if (myValueSetUrl == null) {
123                        myValueSetUrl = getValueSet().getUrl();
124                }
125
126                return myValueSetUrl;
127        }
128
129        public String getValueSetName() {
130                if (myValueSetName == null) {
131                        myValueSetName = getValueSet().getName();
132                }
133
134                return myValueSetName;
135        }
136
137        public String getLanguage() {
138                return myLanguage;
139        }
140
141        public TermValueSetConceptDesignation setLanguage(String theLanguage) {
142                ValidateUtil.isNotTooLongOrThrowIllegalArgument(
143                                theLanguage,
144                                TermConceptDesignation.MAX_LENGTH,
145                                "Language exceeds maximum length (" + TermConceptDesignation.MAX_LENGTH + "): " + length(theLanguage));
146                myLanguage = theLanguage;
147                return this;
148        }
149
150        public String getUseSystem() {
151                return myUseSystem;
152        }
153
154        public TermValueSetConceptDesignation setUseSystem(String theUseSystem) {
155                ValidateUtil.isNotTooLongOrThrowIllegalArgument(
156                                theUseSystem,
157                                TermConceptDesignation.MAX_LENGTH,
158                                "Use system exceeds maximum length (" + TermConceptDesignation.MAX_LENGTH + "): "
159                                                + length(theUseSystem));
160                myUseSystem = theUseSystem;
161                return this;
162        }
163
164        public String getUseCode() {
165                return myUseCode;
166        }
167
168        public TermValueSetConceptDesignation setUseCode(String theUseCode) {
169                ValidateUtil.isNotTooLongOrThrowIllegalArgument(
170                                theUseCode,
171                                TermConceptDesignation.MAX_LENGTH,
172                                "Use code exceeds maximum length (" + TermConceptDesignation.MAX_LENGTH + "): " + length(theUseCode));
173                myUseCode = theUseCode;
174                return this;
175        }
176
177        public String getUseDisplay() {
178                return myUseDisplay;
179        }
180
181        public TermValueSetConceptDesignation setUseDisplay(String theUseDisplay) {
182                myUseDisplay = left(theUseDisplay, TermConceptDesignation.MAX_LENGTH);
183                return this;
184        }
185
186        public String getValue() {
187                return myValue;
188        }
189
190        public TermValueSetConceptDesignation setValue(@Nonnull String theValue) {
191                ValidateUtil.isNotBlankOrThrowIllegalArgument(theValue, "theValue must not be null or empty");
192                ValidateUtil.isNotTooLongOrThrowIllegalArgument(
193                                theValue,
194                                TermConceptDesignation.MAX_VAL_LENGTH,
195                                "Value exceeds maximum length (" + TermConceptDesignation.MAX_VAL_LENGTH + "): " + length(theValue));
196                myValue = theValue;
197                return this;
198        }
199
200        @Override
201        public boolean equals(Object theO) {
202                if (this == theO) return true;
203
204                if (!(theO instanceof TermValueSetConceptDesignation)) return false;
205
206                TermValueSetConceptDesignation that = (TermValueSetConceptDesignation) theO;
207
208                return new EqualsBuilder()
209                                .append(getLanguage(), that.getLanguage())
210                                .append(getUseSystem(), that.getUseSystem())
211                                .append(getUseCode(), that.getUseCode())
212                                .append(getUseDisplay(), that.getUseDisplay())
213                                .append(getValue(), that.getValue())
214                                .isEquals();
215        }
216
217        @Override
218        public int hashCode() {
219                if (myHashCode == null) {
220                        myHashCode = new HashCodeBuilder(17, 37)
221                                        .append(getLanguage())
222                                        .append(getUseSystem())
223                                        .append(getUseCode())
224                                        .append(getUseDisplay())
225                                        .append(getValue())
226                                        .toHashCode();
227                }
228                return myHashCode;
229        }
230
231        @Override
232        public String toString() {
233                return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
234                                .append("myId", myId)
235                                .append(myConcept != null ? ("myConcept - id=" + myConcept.getId()) : ("myConcept=(null)"))
236                                .append("myConceptPid", myConceptPid)
237                                .append(myValueSet != null ? ("myValueSet - id=" + myValueSet.getId()) : ("myValueSet=(null)"))
238                                .append("myValueSetPid", myValueSetPid)
239                                .append("myValueSetUrl", this.getValueSetUrl())
240                                .append("myValueSetName", this.getValueSetName())
241                                .append("myLanguage", myLanguage)
242                                .append("myUseSystem", myUseSystem)
243                                .append("myUseCode", myUseCode)
244                                .append("myUseDisplay", myUseDisplay)
245                                .append("myValue", myValue)
246                                .toString();
247        }
248}