Changed DefinedTermBase.media form OneToMany to ManyToMany #560
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / model / common / CdmMetaData.java
index d9bfaa4e6fb846645bfe11678855e68867dac04b..c1519c2a46c0650f370e36d151b6aa7f3260c8c8 100644 (file)
 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
@@ -28,6 +32,10 @@ public class CdmMetaData extends CdmBase{
        @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
@@ -39,32 +47,85 @@ public class CdmMetaData extends CdmBase{
         * be handled by SCHEMA_VALIDATION.UPDATE\r
         * The last number represents the date of change.\r
         */\r
-       private static final String dbSchemaVersion = "2.1.2.2.200909301715";\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
+       /**\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
-       private CdmMetaData() {\r
+\r
+//********************* Constructor *********************************************/     \r
+\r
+       /**\r
+        * Simple constructor to be used by Spring\r
+        */\r
+       protected CdmMetaData(){\r
                super();\r
        }\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
@@ -93,6 +154,85 @@ public class CdmMetaData extends CdmBase{
                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