Schema update for referenceType persistence #2615
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / CdmDataSource.java
index 991bcf5df838136073fe9ad91f774ac8104a5995..3ab21af96cbcc8dd7ca6a4ba4b17ce972cc15a45 100644 (file)
+/**\r
+* Copyright (C) 2007 EDIT\r
+* European Distributed Institute of Taxonomy\r
+* http://www.e-taxonomy.eu\r
+*\r
+* The contents of this file are subject to the Mozilla Public License Version 1.1\r
+* See LICENSE.TXT at the top of this package for the full license terms.\r
+*/\r
+\r
 package eu.etaxonomy.cdm.database;\r
 \r
 import java.util.Enumeration;\r
 import java.util.Properties;\r
 \r
-import org.hibernate.cache.CacheProvider;\r
-import org.hibernate.cache.NoCacheProvider;\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.log4j.Logger;\r
+import org.hibernate.cache.internal.NoCachingRegionFactory;\r
+import org.hibernate.cache.spi.RegionFactory;\r
+import org.hibernate.cfg.Environment;\r
 import org.springframework.beans.MutablePropertyValues;\r
 import org.springframework.beans.factory.config.BeanDefinition;\r
 import org.springframework.beans.factory.config.PropertiesFactoryBean;\r
 import org.springframework.beans.factory.support.AbstractBeanDefinition;\r
 import org.springframework.beans.factory.support.RootBeanDefinition;\r
 \r
-import eu.etaxonomy.cdm.database.DatabaseTypeEnum;\r
-import eu.etaxonomy.cdm.database.DbSchemaValidation;\r
+import eu.etaxonomy.cdm.common.CdmUtils;\r
+import eu.etaxonomy.cdm.model.name.NomenclaturalCode;\r
 \r
 /**\r
  * @author a.mueller\r
  *\r
  */\r
-public class CdmDataSource implements ICdmDataSource {\r
+public class CdmDataSource extends CdmDataSourceBase {\r
+       @SuppressWarnings("unused")\r
+       private static final Logger logger = Logger.getLogger(CdmDataSource.class);\r
 \r
        private DatabaseTypeEnum dbType;\r
        private String server;\r
-       private String database; \r
+       private String database;\r
        private int port = -1;\r
        private String username;\r
        private String password;\r
+       private NomenclaturalCode nomenclaturalCode;\r
+\r
+       private String filePath;\r
+       private H2Mode mode;\r
+\r
        private boolean isLazy = true;\r
        private String initMethodName = null;\r
        private String destroyMethodName = null;\r
        private DbSchemaValidation hbm2dll = DbSchemaValidation.VALIDATE;\r
        private boolean showSql = false;\r
        private boolean formatSql = false;\r
-       private Class<? extends CacheProvider> cacheProviderClass = NoCacheProvider.class;;\r
+       private boolean registerSearchListener = false;\r
+       private Class<? extends RegionFactory> cacheProviderClass = NoCachingRegionFactory.class;\r
 \r
-       static public CdmDataSource  NewMySqlInstance(String server, String database, String username, String password){\r
-               return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, -1, username, password);\r
+       public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, String username, String password){\r
+               return new CdmDataSource(dbType, server, database, -1, username, password, null, null, null);\r
        }\r
-       \r
-       static public CdmDataSource  NewMySqlInstance(String server, String database, int port, String username, String password){\r
-               return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, port, username, password);\r
+\r
+       public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password){\r
+               return new CdmDataSource(dbType, server, database, port, username, password, null, null, null);\r
+       }\r
+\r
+       public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, String username, String password , NomenclaturalCode code){\r
+               return new CdmDataSource(dbType, server, database, -1, username, password, null, null, code);\r
+       }\r
+\r
+       public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password , NomenclaturalCode code){\r
+               return new CdmDataSource(dbType, server, database, port, username, password, null, null, code);\r
+       }\r
+\r
+\r
+       static public CdmDataSource  NewMySqlInstance(String server, String database, String username, String password ){\r
+               return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, -1, username, password, null, null, null);\r
+       }\r
+\r
+       static public CdmDataSource  NewMySqlInstance(String server, String database, String username, String password , NomenclaturalCode code){\r
+               return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, -1, username, password, null, null, code);\r
+       }\r
+\r
+       static public CdmDataSource  NewMySqlInstance(String server, String database, int port, String username, String password, NomenclaturalCode code){\r
+               return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, port, username, password, null, null, code);\r
+       }\r
+\r
+       static public CdmDataSource  NewPostgreSQLInstance(String server, String database, int port, String username, String password, NomenclaturalCode code){\r
+               return new CdmDataSource(DatabaseTypeEnum.PostgreSQL, server, database, port, username, password, null, null, code);\r
+       }\r
+\r
+       static public CdmDataSource  NewSqlServer2005Instance(String server, String database, int port, String username, String password, NomenclaturalCode code){\r
+               return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, port, username, password, null, null, code);\r
+       }\r
+\r
+       static public CdmDataSource  NewSqlServer2005Instance(String server, String database, int port, String username, String password /*, NomenclaturalCode code*/){\r
+               return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, port, username, password, null, null, null);\r
        }\r
 \r
+\r
+       /** in work\r
+        * @param code TODO*/\r
+       static public CdmDataSource  NewH2EmbeddedInstance(String database, String username, String password){\r
+               return NewH2EmbeddedInstance(database, username, password, null,  null);\r
+       }\r
+\r
+       /** in work\r
+        * @param code TODO*/\r
+       static public CdmDataSource  NewH2EmbeddedInstance(String database, String username, String password, NomenclaturalCode code){\r
+               return NewH2EmbeddedInstance(database, username, password, null, code);\r
+       }\r
+\r
+       /** in work\r
+        * @param code TODO*/\r
+       static public CdmDataSource  NewH2EmbeddedInstance(String database, String username, String password, String filePath, NomenclaturalCode code){\r
+               //FIXME in work\r
+               int port = -1;\r
+               H2Mode mode = H2Mode.EMBEDDED;\r
+               CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, database, port, username, password, null, mode, code);\r
+               return dataSource;\r
+       }\r
+\r
+       /** in work */\r
+       static public CdmDataSource  NewH2InMemoryInstance(){\r
+               //FIXME in work\r
+               int port = -1;\r
+               H2Mode mode = H2Mode.IN_MEMORY;\r
+               String username = "sa";\r
+               String password = "";\r
+               CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, null, port, username, password, null, mode, null);\r
+               return dataSource;\r
+       }\r
+\r
+\r
        /**\r
         * @param server\r
         * @param database\r
         * @param port\r
         */\r
-       private CdmDataSource(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password) {\r
+       protected CdmDataSource(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password, String filePath, H2Mode mode, NomenclaturalCode code) {\r
                super();\r
                this.dbType = dbType;\r
                this.server = server;\r
@@ -55,57 +143,64 @@ public class CdmDataSource implements ICdmDataSource {
                this.port = port;\r
                this.username = username;\r
                this.password = password;\r
+               this.initMethodName = dbType.getInitMethod();\r
+               this.destroyMethodName = dbType.getDestroyMethod();\r
+               this.filePath = filePath;\r
+               this.mode = mode;\r
+               this.nomenclaturalCode = code;\r
        }\r
-       \r
-       \r
+\r
+\r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.database.ICdmDataSource#getName()\r
+        * A CdmDataSource does not have a name representation therefor the database name is returned\r
         */\r
        public String getName() {\r
                return database;\r
        }\r
-       \r
+\r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getDatasourceBean()\r
         */\r
        public BeanDefinition getDatasourceBean(){\r
-               AbstractBeanDefinition bd = new RootBeanDefinition(dbType.getDriverManagerDataSourceClass());\r
+               AbstractBeanDefinition bd = new RootBeanDefinition(dbType.getDataSourceClass());\r
                //attributes\r
                bd.setLazyInit(isLazy);\r
-               if (initMethodName != null && ! initMethodName.trim().equals("") ){\r
+               if (! CdmUtils.Nz(initMethodName).trim().equals("") ){\r
                        bd.setInitMethodName(initMethodName);\r
                }\r
-               if (destroyMethodName != null  && ! destroyMethodName.trim().equals("") ){\r
+               if (! CdmUtils.Nz(destroyMethodName).trim().equals("") ){\r
                        bd.setInitMethodName(destroyMethodName);\r
                }\r
-               \r
+\r
                //properties\r
                MutablePropertyValues props = new MutablePropertyValues();\r
                Properties persistentProperties = getDatasourceProperties();\r
-               Enumeration<String> keys = (Enumeration)persistentProperties.keys(); \r
+               Enumeration<Object> keys = (Enumeration<Object>)persistentProperties.keys();\r
                while (keys.hasMoreElements()){\r
                        String key = (String)keys.nextElement();\r
                        props.addPropertyValue(key, persistentProperties.getProperty(key));\r
+                       Properties a = Environment.getProperties();\r
                }\r
 \r
                bd.setPropertyValues(props);\r
                return bd;\r
        }\r
-       \r
+\r
        /**\r
-        * Returns the list of properties that are defined in the datasource    \r
-        * @return \r
+        * Returns the list of properties that are defined in the datasource\r
+        * @return\r
         */\r
        private Properties getDatasourceProperties(){\r
                Properties result = new Properties();\r
                result.put("driverClassName", dbType.getDriverClassName());\r
-               String connectionString = ( port > 1 ? dbType.getConnectionString(server, database, port) : dbType.getConnectionString(server, database));\r
+               String connectionString = dbType.getConnectionString(this);\r
                result.put("url", connectionString);\r
                result.put("username", username);\r
                result.put("password", password);\r
                return result;\r
        }\r
-       \r
+\r
 \r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL)\r
@@ -113,14 +208,15 @@ public class CdmDataSource implements ICdmDataSource {
        public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll){\r
                boolean showSql = false;\r
                boolean formatSql = false;\r
-               Class<? extends CacheProvider> cacheProviderClass = NoCacheProvider.class;\r
-               return getHibernatePropertiesBean(hbm2dll, showSql, formatSql, cacheProviderClass);\r
+               boolean registerSearchListener = false;\r
+               Class<? extends RegionFactory> cacheProviderClass = NoCachingRegionFactory.class;\r
+               return getHibernatePropertiesBean(hbm2dll, showSql, formatSql, registerSearchListener, cacheProviderClass);\r
        }\r
-       \r
+\r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL, java.lang.Boolean, java.lang.Boolean, java.lang.Class)\r
         */\r
-       public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll, Boolean showSql, Boolean formatSql, Class<? extends CacheProvider> cacheProviderClass){\r
+       public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll, Boolean showSql, Boolean formatSql, Boolean registerSearchListener, Class<? extends RegionFactory> cacheProviderClass){\r
                //Hibernate default values\r
                if (hbm2dll == null){\r
                        hbm2dll = this.hbm2dll;\r
@@ -134,7 +230,10 @@ public class CdmDataSource implements ICdmDataSource {
                if (cacheProviderClass == null){\r
                        cacheProviderClass = this.cacheProviderClass;\r
                }\r
-               \r
+               if(registerSearchListener == null){\r
+                       registerSearchListener = this.registerSearchListener;\r
+               }\r
+\r
                DatabaseTypeEnum dbtype = dbType;\r
                AbstractBeanDefinition bd = new RootBeanDefinition(PropertiesFactoryBean.class);\r
                MutablePropertyValues hibernateProps = new MutablePropertyValues();\r
@@ -142,18 +241,90 @@ public class CdmDataSource implements ICdmDataSource {
                Properties props = new Properties();\r
                props.setProperty("hibernate.hbm2ddl.auto", hbm2dll.toString());\r
                props.setProperty("hibernate.dialect", dbtype.getHibernateDialect());\r
-               props.setProperty("hibernate.cache.provider_class", cacheProviderClass.getName());\r
+//             OLD:props.setProperty("hibernate.cache.provider_class", cacheProviderClass.getName());\r
+               props.setProperty("hibernate.cache.region.factory_class", cacheProviderClass.getName());\r
                props.setProperty("hibernate.show_sql", String.valueOf(showSql));\r
                props.setProperty("hibernate.format_sql", String.valueOf(formatSql));\r
+               props.setProperty("hibernate.search.autoregister_listeners", String.valueOf(registerSearchListener));\r
 \r
                hibernateProps.addPropertyValue("properties",props);\r
                bd.setPropertyValues(hibernateProps);\r
                return bd;\r
        }\r
-       \r
 \r
+       public String getInitMethodName() {\r
+               return initMethodName;\r
+       }\r
+\r
+       public void setInitMethodName(String initMethodName) {\r
+               this.initMethodName = initMethodName;\r
+       }\r
+\r
+       public String getDestroyMethodName() {\r
+               return destroyMethodName;\r
+       }\r
+\r
+       public void setDestroyMethodName(String destroyMethodName) {\r
+               this.destroyMethodName = destroyMethodName;\r
+       }\r
+\r
+       public String getDatabase() {\r
+               return database;\r
+       }\r
+\r
+       public DatabaseTypeEnum getDatabaseType() {\r
+               return dbType;\r
+       }\r
+\r
+       public String getFilePath() {\r
+               return filePath;\r
+       }\r
+\r
+\r
+       public int getPort() {\r
+               return port;\r
+       }\r
+\r
+       public String getServer() {\r
+               return server;\r
+       }\r
+\r
+       public H2Mode getMode() {\r
+               return mode;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.database.ICdmDataSource#getPassword()\r
+        */\r
+       public String getPassword() {\r
+               return password;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.database.ICdmDataSource#getUserName()\r
+        */\r
+       public String getUsername() {\r
+               return username;\r
+       }\r
+\r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.database.ICdmDataSource#getNomenclaturalCode()\r
+        */\r
+       public NomenclaturalCode getNomenclaturalCode() {\r
+               return nomenclaturalCode;\r
+       }\r
+\r
+       @Override\r
+       public String toString() {\r
+               if (StringUtils.isBlank(this.database)){\r
+                       return super.toString();\r
+               }else{\r
+                       String result = "DataSource<" + dbType.getConnectionString(this).replace(CdmUtils.Nz(password), "") + ">";\r
+                       return result;\r
+               }\r
+       }\r
        \r
        \r
-       \r
-       \r
+\r
 }\r
+\r