package eu.etaxonomy.cdm.model.common;\r
\r
import java.util.ArrayList;\r
+import java.util.Comparator;\r
import java.util.List;\r
\r
import javax.persistence.Entity;\r
\r
import org.apache.log4j.Logger;\r
+import org.joda.time.DateTime;\r
+\r
+import eu.etaxonomy.cdm.common.IProgressMonitor;\r
\r
/**\r
* @author a.mueller\r
* @version 1.0\r
*/\r
@Entity\r
-public class CdmMetaData {\r
+public class CdmMetaData extends CdmBase{\r
+ private static final long serialVersionUID = -3033376680593279078L;\r
@SuppressWarnings("unused")\r
private static final Logger logger = Logger.getLogger(CdmMetaData.class);\r
\r
+ /* It is a little bit confusing that this specific information is located in\r
+ * a generic class for metadata. Think about moving the schema version \r
+ * \r
+ */\r
/**\r
* The database schema version number.\r
* It is recommended to have the first two numbers equal to the CDM Library version number.\r
* be handled by SCHEMA_VALIDATION.UPDATE\r
* The last number represents the date of change.\r
*/\r
- private static final String dbSchemaVersion = "2.1.0.0.200909071123";\r
+// private static final String dbSchemaVersion = "3.0.0.1.201101050000";\r
+ private static final String dbSchemaVersion = "3.0.0.0.201011090000"; \r
+\r
+ /**\r
+ * @return a list of default metadata objects \r
+ */\r
+ public static final List<CdmMetaData> defaultMetaData(){\r
+ List<CdmMetaData> result = new ArrayList<CdmMetaData>();\r
+ // schema version\r
+ result.add(new CdmMetaData(MetaDataPropertyName.DB_SCHEMA_VERSION, dbSchemaVersion));\r
+ //term version\r
+ result.add(new CdmMetaData(MetaDataPropertyName.TERMS_VERSION, termsVersion));\r
+ // database create time\r
+ result.add(new CdmMetaData(MetaDataPropertyName.DB_CREATE_DATE, new DateTime().toString()));\r
+ return result; \r
+ }\r
+ /**\r
+ * The version number for the terms loaded by the termloader (csv-files)\r
+ * It is recommended to have the first two numbers equal to the CDM Library version number.\r
+ * \r
+ * But it is not obligatory as there may be cases when the library number changes but the\r
+ * schema version is not changing.\r
+ * \r
+ * The third should be incremented if the terms change in a way that is not compatible\r
+ * to the previous version (e.g. by changing the type of a term)\r
+ * \r
+ * The fourth number should be incremented when compatible term changes take place\r
+ * (e.g. when new terms were added)\r
+ * \r
+ * The last number represents the date of change.\r
+ */\r
+ private static final String termsVersion = "3.0.1.0.201012150000";\r
+ \r
\r
public enum MetaDataPropertyName{\r
- DB_SCHEMA_VERSION\r
+ DB_SCHEMA_VERSION,\r
+ TERMS_VERSION,\r
+ DB_CREATE_DATE,\r
+ DB_CREATE_NOTE;\r
+ \r
+ public String getSqlQuery(){\r
+ return "SELECT value FROM CdmMetaData WHERE propertyname=" + this.ordinal();\r
+ }\r
}\r
\r
+ /* END OF CONFUSION */\r
private MetaDataPropertyName propertyName;\r
private String value;\r
\r
+ \r
+ /**\r
+ * Method to retrieve a CDM Libraries meta data\r
+ * @return\r
+ */\r
public static final List<CdmMetaData> propertyList(){\r
List<CdmMetaData> result = new ArrayList<CdmMetaData>();\r
result.add(new CdmMetaData(MetaDataPropertyName.DB_SCHEMA_VERSION, dbSchemaVersion));\r
+ result.add(new CdmMetaData(MetaDataPropertyName.TERMS_VERSION, termsVersion));\r
+ result.add(new CdmMetaData(MetaDataPropertyName.DB_CREATE_DATE, new DateTime().toString()));\r
return result;\r
}\r
- \r
+\r
+//********************* Constructor *********************************************/ \r
+\r
+ /**\r
+ * Simple constructor to be used by Spring\r
+ */\r
+ protected CdmMetaData(){\r
+ super();\r
+ }\r
+\r
public CdmMetaData(MetaDataPropertyName propertyName, String value) {\r
super();\r
this.propertyName = propertyName;\r
this.value = value;\r
}\r
\r
+//****************** instance methods ****************************************/ \r
+ \r
/**\r
* @return the propertyName\r
*/\r
public void setValue(String value) {\r
this.value = value;\r
}\r
+\r
+//******************** Version comparator **********************************/\r
+ \r
+ public static class VersionComparator implements Comparator<String>{\r
+ Integer depth;\r
+ IProgressMonitor monitor;\r
+ \r
+ public VersionComparator(Integer depth, IProgressMonitor monitor){\r
+ this.depth = depth;\r
+ this.monitor = monitor;\r
+ }\r
+ \r
+ /* (non-Javadoc)\r
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)\r
+ */\r
+ public int compare(String version1, String version2) {\r
+ int result = 0;\r
+ String[] version1Split = version1.split("\\.");\r
+ String[] version2Split = version2.split("\\.");\r
+ \r
+ if(version1Split.length == 1 || version2Split.length == 1){\r
+ throwException("Tried to compare version but given Strings don't seem to " +\r
+ "contain version numbers. version1: " + version1 + ", version2:" + version2); \r
+ }\r
+ \r
+ if(depth != null && (version1Split.length < depth || version2Split.length < depth )){\r
+ throwException("Desired depth can not be achieved with the given strings. depth: " + depth + ", version1: " + version1 + ", version2:" + version2); \r
+ } \r
+ \r
+ int length = (depth == null ||version1Split.length < depth) ? version1Split.length : depth;\r
+ for (int i = 0; i < length; i++){\r
+ Long version1Part = Long.valueOf(version1Split[i]);\r
+ Long version2Part = Long.valueOf(version2Split[i]);\r
+ int partCompare = version1Part.compareTo(version2Part);\r
+ if (partCompare != 0){\r
+ return partCompare;\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+ \r
+ private Throwable throwException(String message){\r
+ RuntimeException exception = new RuntimeException(message);\r
+ if (monitor != null){\r
+ monitor.warning(message, exception);\r
+ }\r
+ throw exception;\r
+ }\r
+ \r
+ }\r
+\r
+ /**\r
+ * Compares two version string. If version1 is higher than version2 a positive result is returned.\r
+ * If both are equal 0 is returned, otherwise -1 is returned.\r
+ * @see Comparator#compare(Object, Object)\r
+ * @param version1\r
+ * @param version2\r
+ * @param depth\r
+ * @param monitor\r
+ * @return\r
+ */\r
+ public static int compareVersion(String version1, String version2, Integer depth, IProgressMonitor monitor){\r
+ VersionComparator versionComparator = new VersionComparator(depth, monitor);\r
+ return versionComparator.compare(version1, version2);\r
+ }\r
+ \r
+ public static boolean isDbSchemaVersionCompatible(String version){\r
+ return compareVersion(dbSchemaVersion, version, 3, null) == 0;\r
+ }\r
+\r
+ public static String getDbSchemaVersion() {\r
+ return dbSchemaVersion;\r
+ }\r
\r
+ public static String getTermsVersion() {\r
+ return termsVersion;\r
+ }\r
+\r
+ public static boolean isTermsVersionCompatible(String version){\r
+ return compareVersion(termsVersion, version, 3, null) == 0;\r
+ }\r
\r
}\r