Project

General

Profile

Download (7.04 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_18_06.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
        ;
71
        private String versionString;
72
	    private CdmVersion(String versionString){
73
	        this.versionString = versionString;
74
	    }
75
	    public String versionString(){
76
	        return versionString;
77
	    }
78
	}
79

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

    
93

    
94
//********************* Constructor *********************************************/
95

    
96
	/**
97
	 * Simple constructor to be used by Spring
98
	 */
99
	protected CdmMetaData(){
100
		super();
101
	}
102

    
103
	public CdmMetaData(CdmMetaDataPropertyName propertyName, String value) {
104
		super();
105
		this.propertyName = propertyName;
106
		this.value = value;
107
	}
108

    
109
// ******************** STATIC **********************************/
110

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

    
125
//****************** instance methods ****************************/
126

    
127
	public CdmMetaDataPropertyName getPropertyName() {
128
		return propertyName;
129
	}
130
	public void setPropertyName(CdmMetaDataPropertyName propertyName) {
131
		this.propertyName = propertyName;
132
	}
133

    
134
	public String getValue() {
135
		return value;
136
	}
137
	public void setValue(String value) {
138
		this.value = value;
139
	}
140

    
141
//******************** Version comparator **********************************/
142

    
143
	public static class VersionComparator implements Comparator<String>{
144
		Integer depth;
145
		IProgressMonitor monitor;
146

    
147
		public VersionComparator(Integer depth, IProgressMonitor monitor){
148
			this.depth = depth;
149
			this.monitor = monitor;
150
		}
151

    
152
		@Override
153
        public int compare(String version1, String version2) {
154
			int result = 0;
155

    
156
			if (version1.equals(version2)){
157
			    return 0;
158
			}
159

    
160
			String[] version1Split = version1.split("\\.");
161
			String[] version2Split = version2.split("\\.");
162

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

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

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

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

    
207
	public static boolean isDbSchemaVersionCompatible(String version){
208
		return compareVersion(dbSchemaVersion, version, 3, null) == 0;
209
	}
210

    
211
	public static String getDbSchemaVersion() {
212
		return dbSchemaVersion;
213
	}
214
}
(1-1/16)