001/*-
002 * #%L
003 * HAPI FHIR JPA Model
004 * %%
005 * Copyright (C) 2014 - 2025 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.model.entity;
021
022import ca.uhn.fhir.context.FhirVersionEnum;
023import ca.uhn.fhir.util.StringUtil;
024import jakarta.persistence.Column;
025import jakarta.persistence.Entity;
026import jakarta.persistence.EnumType;
027import jakarta.persistence.Enumerated;
028import jakarta.persistence.ForeignKey;
029import jakarta.persistence.GeneratedValue;
030import jakarta.persistence.GenerationType;
031import jakarta.persistence.Id;
032import jakarta.persistence.Index;
033import jakarta.persistence.JoinColumn;
034import jakarta.persistence.JoinColumns;
035import jakarta.persistence.ManyToOne;
036import jakarta.persistence.OneToMany;
037import jakarta.persistence.SequenceGenerator;
038import jakarta.persistence.Table;
039import jakarta.persistence.Temporal;
040import jakarta.persistence.TemporalType;
041import jakarta.persistence.Version;
042import org.apache.commons.lang3.builder.ToStringBuilder;
043import org.apache.commons.lang3.builder.ToStringStyle;
044import org.hibernate.annotations.JdbcTypeCode;
045import org.hibernate.type.SqlTypes;
046
047import java.util.Date;
048import java.util.List;
049
050@Entity()
051@Table(
052                name = "NPM_PACKAGE_VER",
053                uniqueConstraints = {},
054                indexes = {
055                        @Index(name = "IDX_PACKVER", columnList = "PACKAGE_ID,VERSION_ID", unique = true),
056                        @Index(name = "FK_NPM_PKV_PKG", columnList = "PACKAGE_PID"),
057                        @Index(name = "FK_NPM_PKV_RESID", columnList = "BINARY_RES_ID")
058                })
059public class NpmPackageVersionEntity {
060
061        public static final int VERSION_ID_LENGTH = 200;
062        public static final int PACKAGE_DESC_LENGTH = 512;
063        public static final int FHIR_VERSION_LENGTH = 10;
064        public static final int FHIR_VERSION_ID_LENGTH = 20;
065
066        @SequenceGenerator(name = "SEQ_NPM_PACKVER", sequenceName = "SEQ_NPM_PACKVER")
067        @GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ_NPM_PACKVER")
068        @Id
069        @Column(name = "PID")
070        private Long myId;
071
072        @Column(name = "PACKAGE_ID", length = NpmPackageEntity.PACKAGE_ID_LENGTH, nullable = false)
073        private String myPackageId;
074
075        @Column(name = "VERSION_ID", length = NpmPackageVersionEntity.VERSION_ID_LENGTH, nullable = false)
076        private String myVersionId;
077
078        @ManyToOne
079        @JoinColumn(name = "PACKAGE_PID", nullable = false, foreignKey = @ForeignKey(name = "FK_NPM_PKV_PKG"))
080        private NpmPackageEntity myPackage;
081
082        @ManyToOne
083        @JoinColumns(
084                        value = {
085                                @JoinColumn(
086                                                name = "BINARY_RES_ID",
087                                                referencedColumnName = "RES_ID",
088                                                insertable = false,
089                                                updatable = false,
090                                                nullable = false),
091                                @JoinColumn(
092                                                name = "PARTITION_ID",
093                                                referencedColumnName = "PARTITION_ID",
094                                                insertable = false,
095                                                updatable = false,
096                                                nullable = false)
097                        },
098                        foreignKey = @ForeignKey(name = "FK_NPM_PKV_RESID"))
099        private ResourceTable myPackageBinary;
100
101        @Column(name = "BINARY_RES_ID", nullable = false)
102        private Long myPackageBinaryResourceId;
103
104        @Column(name = "PARTITION_ID", nullable = true)
105        private Integer myPackageBinaryPartitionId;
106
107        @Temporal(TemporalType.TIMESTAMP)
108        @Column(name = "SAVED_TIME", nullable = false)
109        private Date mySavedTime;
110
111        @Column(name = "PKG_DESC", nullable = true, length = PACKAGE_DESC_LENGTH)
112        private String myDescription;
113
114        @Column(name = "DESC_UPPER", nullable = true, length = PACKAGE_DESC_LENGTH)
115        private String myDescriptionUpper;
116
117        @Column(name = "PKG_AUTHOR", nullable = true, length = PACKAGE_DESC_LENGTH)
118        private String myAuthor;
119
120        @Column(name = "AUTHOR_UPPER", nullable = true, length = PACKAGE_DESC_LENGTH)
121        private String myAuthorUpper;
122
123        @Column(name = "CURRENT_VERSION", nullable = false)
124        private boolean myCurrentVersion;
125
126        @Column(name = "FHIR_VERSION_ID", length = NpmPackageVersionEntity.FHIR_VERSION_ID_LENGTH, nullable = false)
127        private String myFhirVersionId;
128
129        @Enumerated(EnumType.STRING)
130        @JdbcTypeCode(SqlTypes.VARCHAR)
131        @Column(name = "FHIR_VERSION", length = NpmPackageVersionEntity.FHIR_VERSION_LENGTH, nullable = false)
132        private FhirVersionEnum myFhirVersion;
133
134        @Column(name = "PACKAGE_SIZE_BYTES", nullable = false)
135        private long myPackageSizeBytes;
136
137        @Temporal(TemporalType.TIMESTAMP)
138        @Version
139        @Column(name = "UPDATED_TIME", nullable = false)
140        private Date myUpdatedTime;
141
142        @OneToMany(mappedBy = "myPackageVersion")
143        private List<NpmPackageVersionResourceEntity> myResources;
144
145        public Date getUpdatedTime() {
146                return myUpdatedTime;
147        }
148
149        public long getPackageSizeBytes() {
150                return myPackageSizeBytes;
151        }
152
153        public void setPackageSizeBytes(long thePackageSizeBytes) {
154                myPackageSizeBytes = thePackageSizeBytes;
155        }
156
157        public boolean isCurrentVersion() {
158                return myCurrentVersion;
159        }
160
161        public void setCurrentVersion(boolean theCurrentVersion) {
162                myCurrentVersion = theCurrentVersion;
163        }
164
165        public String getPackageId() {
166                return myPackageId;
167        }
168
169        public void setPackageId(String thePackageId) {
170                myPackageId = thePackageId;
171        }
172
173        public String getVersionId() {
174                return myVersionId;
175        }
176
177        public void setVersionId(String theVersionId) {
178                myVersionId = theVersionId;
179        }
180
181        public String getFhirVersionId() {
182                return myFhirVersionId;
183        }
184
185        public void setFhirVersionId(String theFhirVersionId) {
186                myFhirVersionId = theFhirVersionId;
187        }
188
189        public FhirVersionEnum getFhirVersion() {
190                return myFhirVersion;
191        }
192
193        public void setFhirVersion(FhirVersionEnum theFhirVersion) {
194                myFhirVersion = theFhirVersion;
195        }
196
197        public NpmPackageEntity getPackage() {
198                return myPackage;
199        }
200
201        public void setPackage(NpmPackageEntity thePackage) {
202                myPackage = thePackage;
203        }
204
205        public ResourceTable getPackageBinary() {
206                return myPackageBinary;
207        }
208
209        public void setPackageBinary(ResourceTable thePackageBinary) {
210                myPackageBinary = thePackageBinary;
211                myPackageBinaryResourceId = thePackageBinary.getId().getId();
212                myPackageBinaryPartitionId = thePackageBinary.getPersistentId().getPartitionId();
213        }
214
215        public void setSavedTime(Date theSavedTime) {
216                mySavedTime = theSavedTime;
217        }
218
219        public String getDescription() {
220                return myDescription;
221        }
222
223        public void setDescription(String theDescription) {
224                myDescription = theDescription;
225                myDescriptionUpper = StringUtil.normalizeStringForSearchIndexing(theDescription);
226        }
227
228        public String getAuthor() {
229                return myAuthor;
230        }
231
232        public void setAuthor(String theAuthor) {
233                myAuthor = theAuthor;
234                myAuthorUpper = StringUtil.normalizeStringForSearchIndexing(theAuthor);
235        }
236
237        @Override
238        public String toString() {
239                return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
240                                .append("myId", myId)
241                                .append("myPackageId", myPackageId)
242                                .append("myVersionId", myVersionId)
243                                .append("myDescriptionUpper", myDescriptionUpper)
244                                .append("myFhirVersionId", myFhirVersionId)
245                                .toString();
246        }
247
248        public List<NpmPackageVersionResourceEntity> getResources() {
249                return myResources;
250        }
251}