Project

General

Profile

Download (7.16 KB) Statistics
| Branch: | Tag: | Revision:
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_23_00.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
        V_05_18_05("5.18.5.0.20201103"),
69
        V_05_18_06("5.18.6.0.20201124"),
70
        V_05_22_00("5.22.0.0.20210315"),
71
        V_05_23_00("5.23.0.0.20210422"),
72
        V_05_25_00("5.25.0.0.20210609")
73
        ;
74
        private String versionString;
75
	    private CdmVersion(String versionString){
76
	        this.versionString = versionString;
77
	    }
78
	    public String versionString(){
79
	        return versionString;
80
	    }
81
	}
82

    
83
	/**
84
     * The {@link TermType type} of this term. Needs to be the same type in a {@link DefinedTermBase defined term}
85
     * and in it's {@link TermVocabulary vocabulary}.
86
     */
87
    @XmlAttribute(name ="PropertyName")
88
    @Column(name="propertyName", length=20)
89
    @NotNull
90
    @Type(type = "eu.etaxonomy.cdm.hibernate.EnumUserType",
91
        parameters = {@org.hibernate.annotations.Parameter(name = "enumClass", value = "eu.etaxonomy.cdm.model.metadata.CdmMetaDataPropertyName")}
92
    )
93
	private CdmMetaDataPropertyName propertyName;
94
	private String value;
95

    
96

    
97
//********************* Constructor *********************************************/
98

    
99
	/**
100
	 * Simple constructor to be used by Spring
101
	 */
102
	protected CdmMetaData(){
103
		super();
104
	}
105

    
106
	public CdmMetaData(CdmMetaDataPropertyName propertyName, String value) {
107
		super();
108
		this.propertyName = propertyName;
109
		this.value = value;
110
	}
111

    
112
// ******************** STATIC **********************************/
113

    
114
    /**
115
     * @return a list of default metadata objects
116
     */
117
    public static final List<CdmMetaData> defaultMetaData(){
118
        List<CdmMetaData> result = new ArrayList<>();
119
        // schema version
120
        result.add(new CdmMetaData(CdmMetaDataPropertyName.DB_SCHEMA_VERSION, dbSchemaVersion));
121
        // database create time
122
        result.add(new CdmMetaData(CdmMetaDataPropertyName.DB_CREATE_DATE, new DateTime().toString()));
123
        result.add(new CdmMetaData(CdmMetaDataPropertyName.INSTANCE_ID, UUID.randomUUID().toString()));
124
        result.add(new CdmMetaData(CdmMetaDataPropertyName.INSTANCE_NAME, UNNAMED));
125
        return result;
126
    }
127

    
128
//****************** instance methods ****************************/
129

    
130
	public CdmMetaDataPropertyName getPropertyName() {
131
		return propertyName;
132
	}
133
	public void setPropertyName(CdmMetaDataPropertyName propertyName) {
134
		this.propertyName = propertyName;
135
	}
136

    
137
	public String getValue() {
138
		return value;
139
	}
140
	public void setValue(String value) {
141
		this.value = value;
142
	}
143

    
144
//******************** Version comparator **********************************/
145

    
146
	public static class VersionComparator implements Comparator<String>{
147
		Integer depth;
148
		IProgressMonitor monitor;
149

    
150
		public VersionComparator(Integer depth, IProgressMonitor monitor){
151
			this.depth = depth;
152
			this.monitor = monitor;
153
		}
154

    
155
		@Override
156
        public int compare(String version1, String version2) {
157
			int result = 0;
158

    
159
			if (version1.equals(version2)){
160
			    return 0;
161
			}
162

    
163
			String[] version1Split = version1.split("\\.");
164
			String[] version2Split = version2.split("\\.");
165

    
166
			if(version1Split.length == 1 || version2Split.length == 1){
167
				throwException("Tried to compare version but given Strings don't seem to " +
168
						"contain version numbers. version1: " + version1 + ", version2:" + version2);
169
			}
170

    
171
			if(depth != null && (version1Split.length < depth || version2Split.length < depth )){
172
				throwException("Desired depth can not be achieved with the given strings. depth: " + depth  + ", version1: " + version1 + ", version2:" + version2);
173
			}
174
			//use the shorter version to avoid arrayOutOfBoundsException, if version2Split.length < version1Split.length but > depth
175
			int length = (version1Split.length < version2Split.length) ? version1Split.length: version2Split.length;
176
			if (depth != null){
177
			    length = length<depth?length:depth;
178
			}
179
			for (int i = 0; i < length; i++){
180
				Long version1Part = Long.valueOf(version1Split[i]);
181
				Long version2Part = Long.valueOf(version2Split[i]);
182
				int partCompare = version1Part.compareTo(version2Part);
183
				if (partCompare != 0){
184
					return partCompare;
185
				}
186
			}
187
			return result;
188
		}
189

    
190
		private Throwable throwException(String message){
191
			RuntimeException exception =  new RuntimeException(message);
192
			if (monitor != null){
193
				monitor.warning(message, exception);
194
			}
195
			throw exception;
196
		}
197
	}
198

    
199
	/**
200
	 * Compares two version string. If version1 is higher than version2 a positive result is returned.
201
	 * If both are equal 0 is returned, otherwise -1 is returned.
202
	 * @see Comparator#compare(Object, Object)
203
	 * @return
204
	 */
205
	public static int compareVersion(String version1, String version2, Integer depth, IProgressMonitor monitor){
206
		VersionComparator versionComparator = new VersionComparator(depth, monitor);
207
		return versionComparator.compare(version1, version2);
208
	}
209

    
210
	public static boolean isDbSchemaVersionCompatible(String version){
211
		return compareVersion(dbSchemaVersion, version, 3, null) == 0;
212
	}
213

    
214
	public static String getDbSchemaVersion() {
215
		return dbSchemaVersion;
216
	}
217
}
(1-1/18)