cleanup
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / metadata / CdmMetaData.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.model.metadata;
11
12 import java.util.ArrayList;
13 import java.util.Comparator;
14 import java.util.List;
15 import java.util.UUID;
16
17 import javax.persistence.Column;
18 import javax.persistence.Entity;
19 import javax.validation.constraints.NotNull;
20 import javax.xml.bind.annotation.XmlAttribute;
21
22 import org.apache.log4j.Logger;
23 import org.hibernate.annotations.Type;
24 import org.joda.time.DateTime;
25
26 import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
27 import eu.etaxonomy.cdm.model.common.CdmBase;
28 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
29 import eu.etaxonomy.cdm.model.term.TermType;
30 import eu.etaxonomy.cdm.model.term.TermVocabulary;
31
32 /**
33 * @author a.mueller
34 * @since 07.09.2009
35 */
36 @Entity
37 public class CdmMetaData extends CdmBase{
38
39 private static final long serialVersionUID = -3033376680593279078L;
40 @SuppressWarnings("unused")
41 private static final Logger logger = Logger.getLogger(CdmMetaData.class);
42
43 private static final String UNNAMED = "- UNNAMED -";
44
45 /**
46 * The database schema version number.
47 * It is recommended to have the first two numbers equal to the CDM Library version number.
48 * But it is not obligatory as there may be cases when the library number changes but the
49 * schema version is not changing.
50 * The third should be incremented if the schema changes in a way that SCHEMA_VALIDATION.UPDATE
51 * will probably not work or will not be enough to transform old data into new data.
52 * The fourth number should be incremented when minor schema changes take place that can
53 * be handled by SCHEMA_VALIDATION.UPDATE
54 * The last number represents the date of change.
55 */
56 private static final String dbSchemaVersion = CdmVersion.V_05_18_04.versionString;
57
58 public enum CdmVersion {
59 V_05_12_00("5.12.0.0.20191202"),
60 V_05_15_00("5.15.0.0.20200510"),
61 V_05_15_01("5.15.1.0.20200610"),
62 V_05_15_02("5.15.2.0.20200611"),
63 V_05_18_00("5.18.0.0.20200902"),
64 V_05_18_01("5.18.1.0.20200914"),
65 V_05_18_02("5.18.2.0.20200921"),
66 V_05_18_03("5.18.3.0.20200924"),
67 V_05_18_04("5.18.4.0.20201020")
68 ;
69 private String versionString;
70 private CdmVersion(String versionString){
71 this.versionString = versionString;
72 }
73 public String versionString(){
74 return versionString;
75 }
76 }
77
78 /**
79 * The {@link TermType type} of this term. Needs to be the same type in a {@link DefinedTermBase defined term}
80 * and in it's {@link TermVocabulary vocabulary}.
81 */
82 @XmlAttribute(name ="PropertyName")
83 @Column(name="propertyName", length=20)
84 @NotNull
85 @Type(type = "eu.etaxonomy.cdm.hibernate.EnumUserType",
86 parameters = {@org.hibernate.annotations.Parameter(name = "enumClass", value = "eu.etaxonomy.cdm.model.metadata.CdmMetaDataPropertyName")}
87 )
88 private CdmMetaDataPropertyName propertyName;
89 private String value;
90
91
92 //********************* Constructor *********************************************/
93
94 /**
95 * Simple constructor to be used by Spring
96 */
97 protected CdmMetaData(){
98 super();
99 }
100
101 public CdmMetaData(CdmMetaDataPropertyName propertyName, String value) {
102 super();
103 this.propertyName = propertyName;
104 this.value = value;
105 }
106
107 // ******************** STATIC **********************************/
108
109 /**
110 * @return a list of default metadata objects
111 */
112 public static final List<CdmMetaData> defaultMetaData(){
113 List<CdmMetaData> result = new ArrayList<>();
114 // schema version
115 result.add(new CdmMetaData(CdmMetaDataPropertyName.DB_SCHEMA_VERSION, dbSchemaVersion));
116 // database create time
117 result.add(new CdmMetaData(CdmMetaDataPropertyName.DB_CREATE_DATE, new DateTime().toString()));
118 result.add(new CdmMetaData(CdmMetaDataPropertyName.INSTANCE_ID, UUID.randomUUID().toString()));
119 result.add(new CdmMetaData(CdmMetaDataPropertyName.INSTANCE_NAME, UNNAMED));
120 return result;
121 }
122
123 //****************** instance methods ****************************/
124
125 public CdmMetaDataPropertyName getPropertyName() {
126 return propertyName;
127 }
128 public void setPropertyName(CdmMetaDataPropertyName propertyName) {
129 this.propertyName = propertyName;
130 }
131
132 public String getValue() {
133 return value;
134 }
135 public void setValue(String value) {
136 this.value = value;
137 }
138
139 //******************** Version comparator **********************************/
140
141 public static class VersionComparator implements Comparator<String>{
142 Integer depth;
143 IProgressMonitor monitor;
144
145 public VersionComparator(Integer depth, IProgressMonitor monitor){
146 this.depth = depth;
147 this.monitor = monitor;
148 }
149
150 @Override
151 public int compare(String version1, String version2) {
152 int result = 0;
153
154 if (version1.equals(version2)){
155 return 0;
156 }
157
158 String[] version1Split = version1.split("\\.");
159 String[] version2Split = version2.split("\\.");
160
161 if(version1Split.length == 1 || version2Split.length == 1){
162 throwException("Tried to compare version but given Strings don't seem to " +
163 "contain version numbers. version1: " + version1 + ", version2:" + version2);
164 }
165
166 if(depth != null && (version1Split.length < depth || version2Split.length < depth )){
167 throwException("Desired depth can not be achieved with the given strings. depth: " + depth + ", version1: " + version1 + ", version2:" + version2);
168 }
169 //use the shorter version to avoid arrayOutOfBoundsException, if version2Split.length < version1Split.length but > depth
170 int length = (version1Split.length < version2Split.length) ? version1Split.length: version2Split.length;
171 if (depth != null){
172 length = length<depth?length:depth;
173 }
174 for (int i = 0; i < length; i++){
175 Long version1Part = Long.valueOf(version1Split[i]);
176 Long version2Part = Long.valueOf(version2Split[i]);
177 int partCompare = version1Part.compareTo(version2Part);
178 if (partCompare != 0){
179 return partCompare;
180 }
181 }
182 return result;
183 }
184
185 private Throwable throwException(String message){
186 RuntimeException exception = new RuntimeException(message);
187 if (monitor != null){
188 monitor.warning(message, exception);
189 }
190 throw exception;
191 }
192 }
193
194 /**
195 * Compares two version string. If version1 is higher than version2 a positive result is returned.
196 * If both are equal 0 is returned, otherwise -1 is returned.
197 * @see Comparator#compare(Object, Object)
198 * @return
199 */
200 public static int compareVersion(String version1, String version2, Integer depth, IProgressMonitor monitor){
201 VersionComparator versionComparator = new VersionComparator(depth, monitor);
202 return versionComparator.compare(version1, version2);
203 }
204
205 public static boolean isDbSchemaVersionCompatible(String version){
206 return compareVersion(dbSchemaVersion, version, 3, null) == 0;
207 }
208
209 public static String getDbSchemaVersion() {
210 return dbSchemaVersion;
211 }
212 }