This is an automated email from the git hooks/post-receive script. New commit to branch feature/2892 in repository topia. See http://git.nuiton.org/topia.git commit cd45d603cb25c3556e4d8ed262dd42282f35b82e Author: Brendan Le Ny <bleny@codelutin.com> Date: Wed Dec 17 18:53:19 2014 +0100 Move configuration in properties reading in builder, refactor BeanTopiaConfiguration to extends BeanJdbcConfiguration --- .../topia/persistence/BeanTopiaConfiguration.java | 59 ++------ .../persistence/PropertiesTopiaConfiguration.java | 151 --------------------- .../persistence/TopiaConfigurationBuilder.java | 149 ++++++++++++++++++-- .../internal/AbstractTopiaApplicationContext.java | 7 +- .../persistence/internal/HibernateProvider.java | 4 +- .../persistence/jdbc/BeanJdbcConfiguration.java | 51 +++++++ .../topia/persistence/jdbc/JdbcConfiguration.java | 4 +- .../persistence/jdbc/JdbcConfigurationBuilder.java | 40 +++--- .../nuiton/topia/persistence/jdbc/JdbcHelper.java | 15 +- .../persistence/TopiaConfigurationBuilderTest.java | 33 +++++ .../topia/migration/TopiaMigrationEngine.java | 2 +- 11 files changed, 262 insertions(+), 253 deletions(-) diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java index c9a0af4..dd5050e 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java @@ -1,22 +1,17 @@ package org.nuiton.topia.persistence; +import org.nuiton.topia.persistence.jdbc.BeanJdbcConfiguration; +import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; + import java.util.LinkedHashMap; import java.util.Map; -public class BeanTopiaConfiguration implements TopiaConfiguration { +public class BeanTopiaConfiguration extends BeanJdbcConfiguration implements TopiaConfiguration { protected String topiaIdFactoryClassName; protected String schemaName; - protected String jdbcDriverClassName; - - protected String jdbcConnectionUrl; - - protected String jdbcConnectionUser; - - protected String jdbcConnectionPassword; - protected Map<String, String> hibernateExtraConfiguration = new LinkedHashMap<String, String>(); @@ -34,6 +29,16 @@ public class BeanTopiaConfiguration implements TopiaConfiguration { protected Integer connectionPoolMaxSize; + public BeanTopiaConfiguration() { + } + + public BeanTopiaConfiguration(JdbcConfiguration jdbcConfiguration) { + setJdbcConnectionUrl(jdbcConfiguration.getJdbcConnectionUrl()); + setJdbcConnectionUser(jdbcConfiguration.getJdbcConnectionUser()); + setJdbcConnectionPassword(jdbcConfiguration.getJdbcConnectionPassword()); + setJdbcDriverClass(jdbcConfiguration.getJdbcDriverClass()); + } + @Override public String getTopiaIdFactoryClassName() { return topiaIdFactoryClassName; @@ -53,42 +58,6 @@ public class BeanTopiaConfiguration implements TopiaConfiguration { } @Override - public String getJdbcDriverClassName() { - return jdbcDriverClassName; - } - - public void setJdbcDriverClassName(String jdbcDriverClassName) { - this.jdbcDriverClassName = jdbcDriverClassName; - } - - @Override - public String getJdbcConnectionUrl() { - return jdbcConnectionUrl; - } - - public void setJdbcConnectionUrl(String jdbcConnectionUrl) { - this.jdbcConnectionUrl = jdbcConnectionUrl; - } - - @Override - public String getJdbcConnectionUser() { - return jdbcConnectionUser; - } - - public void setJdbcConnectionUser(String jdbcConnectionUser) { - this.jdbcConnectionUser = jdbcConnectionUser; - } - - @Override - public String getJdbcConnectionPassword() { - return jdbcConnectionPassword; - } - - public void setJdbcConnectionPassword(String jdbcConnectionPassword) { - this.jdbcConnectionPassword = jdbcConnectionPassword; - } - - @Override public Map<String, String> getHibernateExtraConfiguration() { return hibernateExtraConfiguration; } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/PropertiesTopiaConfiguration.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/PropertiesTopiaConfiguration.java deleted file mode 100644 index 3e3fb08..0000000 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/PropertiesTopiaConfiguration.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.nuiton.topia.persistence; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; -import org.apache.commons.lang3.StringUtils; -import org.hibernate.cfg.AvailableSettings; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Properties; - -public class PropertiesTopiaConfiguration implements TopiaConfiguration { - - protected static final String TOPIA_SERVICE_CONFIGURATION_PREFIX = "topia.service."; - - protected ImmutableMap<String, String> configuration; - - protected Map<String, Class<? extends TopiaService>> declaredServices; - - protected Map<String, Map<String, String>> declaredServicesConfiguration; - - public PropertiesTopiaConfiguration(Map<String, String> configuration) { - Preconditions.checkNotNull(configuration); - this.configuration = ImmutableMap.copyOf(configuration); - } - - public PropertiesTopiaConfiguration(Properties properties) { - this((Map) ImmutableMap.copyOf(properties)); - } - - @Override - public boolean isInitSchema() { - String initSchemaConfigValue = configuration.get(TopiaConfigurationConstants.CONFIG_PERSISTENCE_INIT_SCHEMA); - boolean initSchema = StringUtils.isBlank(initSchemaConfigValue) || Boolean.parseBoolean(initSchemaConfigValue); - return initSchema; - } - - @Override - public String getTopiaIdFactoryClassName() { - return configuration.get(TopiaConfigurationConstants.CONFIG_PERSISTENCE_TOPIA_ID_FACTORY_CLASS_NAME); - } - - @Override - public String getSchemaName() { - return configuration.get(TopiaConfigurationConstants.CONFIG_DEFAULT_SCHEMA); - } - - @Override - public String getJdbcDriverClassName() { - return configuration.get(TopiaConfigurationConstants.CONFIG_DRIVER); - } - - @Override - public String getJdbcConnectionUrl() { - return configuration.get(TopiaConfigurationConstants.CONFIG_URL); - } - - @Override - public String getJdbcConnectionUser() { - return configuration.get(TopiaConfigurationConstants.CONFIG_USER); - } - - @Override - public String getJdbcConnectionPassword() { - return configuration.get(TopiaConfigurationConstants.CONFIG_PASS); - } - - @Override - public Integer getConnectionPoolMinSize() { - return Integer.valueOf(configuration.get(AvailableSettings.C3P0_MIN_SIZE)); - } - - @Override - public Integer getConnectionPoolMaxSize() { - return Integer.valueOf(configuration.get(AvailableSettings.C3P0_MAX_SIZE)); - } - - @Override - public ImmutableMap<String, String> getHibernateExtraConfiguration() { - Map<String, String> extraHibernateConfiguration = new LinkedHashMap<String, String>(); - for (Map.Entry<String, String> entry : configuration.entrySet()) { - String key = entry.getKey(); - boolean keyMustBeIncludedInHibernateExtraConfiguration = - ! TopiaConfigurationConstants.MAIN_CONFIGURATION.contains(key) - && key.startsWith("hibernate."); - if (keyMustBeIncludedInHibernateExtraConfiguration) { - extraHibernateConfiguration.put(key, entry.getValue()); - } - } - return ImmutableMap.copyOf(extraHibernateConfiguration); - } - - protected void readServices() { - declaredServices = new LinkedHashMap<String, Class<? extends TopiaService>>(); - declaredServicesConfiguration = new LinkedHashMap<String, Map<String, String>>(); - for (Map.Entry<String, String> entry : configuration.entrySet()) { - String prefixedConfigurationKey = entry.getKey(); - String configurationValue = entry.getValue(); - if (prefixedConfigurationKey.startsWith(TOPIA_SERVICE_CONFIGURATION_PREFIX)) { - String configurationKey = StringUtils.removeStart(prefixedConfigurationKey, TOPIA_SERVICE_CONFIGURATION_PREFIX); - String[] split = StringUtils.split(configurationKey, '.'); - Preconditions.checkState(split.length > 0, "'" + prefixedConfigurationKey + "' is not a valid configuration key"); - String serviceName = split[0]; - if (split.length == 1) { - // service declaration instantiate it - try { - Class<?> loadedClass = Class.forName(configurationValue); - // TODO brendan 26/11/14 check cast - Class<? extends TopiaService> serviceClass = (Class<? extends TopiaService>) loadedClass; - declaredServices.put(serviceName, serviceClass); - } catch (ClassNotFoundException e) { - throw new TopiaMisconfigurationException("unable to find class " + configurationValue + " in classpath", this); - } - } else { - // service configuration, save it to push it back later - Map<String, String> serviceConfiguration = declaredServicesConfiguration.get(serviceName); - if (serviceConfiguration == null) { - serviceConfiguration = new LinkedHashMap<String, String>(); - declaredServicesConfiguration.put(serviceName, serviceConfiguration); - } - String serviceConfigurationKey = StringUtils.removeStart(configurationKey, serviceName + "."); - serviceConfiguration.put(serviceConfigurationKey, configurationValue); - } - } - } - declaredServices = ImmutableMap.copyOf(declaredServices); - declaredServicesConfiguration = ImmutableMap.copyOf(declaredServicesConfiguration); - } - - @Override - public Map<String, Class<? extends TopiaService>> getDeclaredServices() { - if (declaredServices == null) { - readServices(); - } - return declaredServices; - } - - @Override - public Map<String, Map<String, String>> getDeclaredServicesConfiguration() { - if (declaredServicesConfiguration == null) { - readServices(); - } - return declaredServicesConfiguration; - } - - @Override - public boolean isConnectionPoolingEnabled() { - return configuration.containsKey(AvailableSettings.C3P0_MIN_SIZE); - } - -} diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java index 1fc1dfc..dbb9e1c 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java @@ -1,20 +1,31 @@ package org.nuiton.topia.persistence; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.cfg.AvailableSettings; import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; import org.nuiton.util.beans.Binder; import org.nuiton.util.beans.BinderFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.Properties; public class TopiaConfigurationBuilder { private static final Log log = LogFactory.getLog(TopiaConfigurationBuilder.class); + protected static final String TOPIA_SERVICE_CONFIGURATION_PREFIX = "topia.service."; + /** * Do nothing but throws {@link TopiaMisconfigurationException} if there is a problem in * given configuration. @@ -29,14 +40,9 @@ public class TopiaConfigurationBuilder { if (topiaConfiguration.getJdbcConnectionPassword() == null) { throw new TopiaMisconfigurationException("you must provide JDBC connection password", topiaConfiguration); } - if (StringUtils.isBlank(topiaConfiguration.getJdbcDriverClassName())) { + if (topiaConfiguration.getJdbcDriverClass() == null) { throw new TopiaMisconfigurationException("you must provide JDBC connection driver", topiaConfiguration); } - try { - Class.forName(topiaConfiguration.getJdbcDriverClassName()); - } catch (ClassNotFoundException e) { - throw new TopiaMisconfigurationException("unable to find JDBC driver class " + topiaConfiguration.getJdbcDriverClassName() + " in classpath", e, topiaConfiguration); - } if (topiaConfiguration.isConnectionPoolingEnabled()) { if (topiaConfiguration.getConnectionPoolMinSize() == null || topiaConfiguration.getConnectionPoolMaxSize() == null) { throw new TopiaMisconfigurationException("You must configure pool size if you want it to be enabled", topiaConfiguration); @@ -60,19 +66,129 @@ public class TopiaConfigurationBuilder { } } + public static BeanTopiaConfiguration readProperties(File propertiesFile) { + FileInputStream fileInputStream = null; + try { + Properties properties = new Properties(); + fileInputStream = new FileInputStream(propertiesFile); + properties.load(fileInputStream); + return readProperties(properties); + } catch (IOException e) { + throw new RuntimeException("unable to read file " + propertiesFile, e); + } finally { + IOUtils.closeQuietly(fileInputStream); + } + } + + public static BeanTopiaConfiguration readProperties(Properties properties) { + return readMap((Map) ImmutableMap.copyOf(properties)); + } + + public static BeanTopiaConfiguration readMap(Map<String, String> configuration) { + + // JDBC connection + String url = configuration.get(TopiaConfigurationConstants.CONFIG_URL); + String user = configuration.get(TopiaConfigurationConstants.CONFIG_USER); + String password = configuration.get(TopiaConfigurationConstants.CONFIG_PASS); + String driverName = configuration.get(TopiaConfigurationConstants.CONFIG_DRIVER); + JdbcConfiguration jdbcConfiguration = JdbcConfigurationBuilder.forDatabase(url, user, password, driverName); + + BeanTopiaConfiguration result = new BeanTopiaConfiguration(jdbcConfiguration); + + // Schema initialization + String initSchemaConfigValue = configuration.get(TopiaConfigurationConstants.CONFIG_PERSISTENCE_INIT_SCHEMA); + boolean initSchema = StringUtils.isBlank(initSchemaConfigValue) || Boolean.parseBoolean(initSchemaConfigValue); + result.setInitSchema(initSchema); + + // connection pooling + String connectionPoolMinSize = configuration.get(AvailableSettings.C3P0_MIN_SIZE); + String connectionPoolMaxSize = configuration.get(AvailableSettings.C3P0_MAX_SIZE); + + boolean connectionPoolingEnabled = StringUtils.isNotBlank(connectionPoolMinSize) + && StringUtils.isNotBlank(connectionPoolMaxSize); + result.setConnectionPoolingEnabled(connectionPoolingEnabled); + if (connectionPoolingEnabled) { + result.setConnectionPoolMinSize(Integer.valueOf(connectionPoolMinSize)); + result.setConnectionPoolMaxSize(Integer.valueOf(connectionPoolMaxSize)); + } + + // others + result.setTopiaIdFactoryClassName(configuration.get(TopiaConfigurationConstants.CONFIG_PERSISTENCE_TOPIA_ID_FACTORY_CLASS_NAME)); + result.setSchemaName(configuration.get(TopiaConfigurationConstants.CONFIG_DEFAULT_SCHEMA)); + + // Hibernate + for (Map.Entry<String, String> entry : configuration.entrySet()) { + String key = entry.getKey(); + boolean keyMustBeIncludedInHibernateExtraConfiguration = + !TopiaConfigurationConstants.MAIN_CONFIGURATION.contains(key) + && key.startsWith("hibernate."); + if (keyMustBeIncludedInHibernateExtraConfiguration) { + result.getHibernateExtraConfiguration().put(key, entry.getValue()); + } + } + + // services + for (Map.Entry<String, String> entry : configuration.entrySet()) { + String prefixedConfigurationKey = entry.getKey(); + String configurationValue = entry.getValue(); + if (prefixedConfigurationKey.startsWith(TOPIA_SERVICE_CONFIGURATION_PREFIX)) { + String configurationKey = StringUtils.removeStart(prefixedConfigurationKey, TOPIA_SERVICE_CONFIGURATION_PREFIX); + String[] split = StringUtils.split(configurationKey, '.'); + Preconditions.checkState(split.length > 0, "'" + prefixedConfigurationKey + "' is not a valid configuration key"); + String serviceName = split[0]; + if (split.length == 1) { + // service declaration instantiate it + try { + Class<?> loadedClass = Class.forName(configurationValue); + if (TopiaService.class.isAssignableFrom(loadedClass)) { + Class<? extends TopiaService> serviceClass = (Class<? extends TopiaService>) loadedClass; + result.getDeclaredServices().put(serviceName, serviceClass); + } else { + throw new TopiaMisconfigurationException("class " + configurationValue + " is not a topia service, it does not implement " + TopiaService.class.getName(), null); + } + } catch (ClassNotFoundException e) { + throw new TopiaMisconfigurationException("unable to find class " + configurationValue + " in classpath", null); + } + } else { + // service configuration, save it to push it back later + Map<String, String> serviceConfiguration = result.getDeclaredServicesConfiguration().get(serviceName); + if (serviceConfiguration == null) { + serviceConfiguration = new LinkedHashMap<String, String>(); + result.getDeclaredServicesConfiguration().put(serviceName, serviceConfiguration); + } + String serviceConfigurationKey = StringUtils.removeStart(configurationKey, serviceName + "."); + serviceConfiguration.put(serviceConfigurationKey, configurationValue); + } + } + } + + check(result); + return result; + } + + public static Map<String, String> toMap(TopiaConfiguration topiaConfiguration) { + check(topiaConfiguration); + Map<String, String> map = new LinkedHashMap<String, String>(); + + throw new UnsupportedOperationException("yet"); + } + + public static Properties toProperties(TopiaConfiguration topiaConfiguration) { + Map<String, String> map = toMap(topiaConfiguration); + Properties properties = new Properties(); + properties.putAll(map); + return properties; + } + public static ConfigureConnectionPoolingStep forDatabase(JdbcConfiguration jdbcConfiguration) { - BeanTopiaConfiguration beanTopiaConfiguration = new BeanTopiaConfiguration(); - beanTopiaConfiguration.setJdbcConnectionUrl(jdbcConfiguration.getJdbcConnectionUrl()); - beanTopiaConfiguration.setJdbcConnectionUser(jdbcConfiguration.getJdbcConnectionUser()); - beanTopiaConfiguration.setJdbcConnectionPassword(jdbcConfiguration.getJdbcConnectionPassword()); - beanTopiaConfiguration.setJdbcDriverClassName(jdbcConfiguration.getJdbcDriverClassName()); + BeanTopiaConfiguration beanTopiaConfiguration = new BeanTopiaConfiguration(jdbcConfiguration); return new ConfigureConnectionPoolingStep(beanTopiaConfiguration); } public static BeanTopiaConfiguration forTest(Class<?> testClass, String methodName) { JdbcConfiguration jdbcConfiguration = JdbcConfigurationBuilder.forTest(testClass, methodName); BeanTopiaConfiguration configuration = forDatabase(jdbcConfiguration).doNotUseConnectionPooling().onlyCreateSchemaIfDatabaseIsEmpty().build(); - return copyOf(configuration); + return configuration; } public static BeanTopiaConfiguration copyOf(TopiaConfiguration topiaConfiguration) { @@ -151,8 +267,13 @@ public class TopiaConfigurationBuilder { } public BeanTopiaConfiguration build() { - check(beanTopiaConfiguration); - return beanTopiaConfiguration; + BeanTopiaConfiguration built = copyOf(beanTopiaConfiguration); + check(built); + return built; + } + + public Properties toProperties() { + return TopiaConfigurationBuilder.toProperties(beanTopiaConfiguration); } } } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java index 87da8ce..78d199d 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java @@ -33,7 +33,6 @@ import org.hibernate.HibernateException; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; -import org.nuiton.topia.persistence.PropertiesTopiaConfiguration; import org.nuiton.topia.persistence.TopiaApplicationContext; import org.nuiton.topia.persistence.TopiaApplicationContextCache; import org.nuiton.topia.persistence.TopiaConfiguration; @@ -103,15 +102,15 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence */ @Deprecated public AbstractTopiaApplicationContext(Properties properties) { - this(new PropertiesTopiaConfiguration(properties)); + this(TopiaConfigurationBuilder.readProperties(properties)); } /** * @deprecated use {@link #AbstractTopiaApplicationContext(org.nuiton.topia.persistence.TopiaConfiguration)} */ @Deprecated - public AbstractTopiaApplicationContext(Map<String, String> configuration) { - this(new PropertiesTopiaConfiguration(configuration)); + public AbstractTopiaApplicationContext(Map<String, String> map) { + this(TopiaConfigurationBuilder.readMap(map)); } public AbstractTopiaApplicationContext(TopiaConfiguration configuration) { diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java index 5579545..95c021f 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java @@ -119,7 +119,7 @@ public class HibernateProvider { // JDBC properties.put(Environment.URL, topiaConfiguration.getJdbcConnectionUrl()); - properties.put(Environment.DRIVER, topiaConfiguration.getJdbcDriverClassName()); + properties.put(Environment.DRIVER, topiaConfiguration.getJdbcDriverClass().getName()); properties.put(Environment.USER, topiaConfiguration.getJdbcConnectionUser()); properties.put(Environment.PASS, topiaConfiguration.getJdbcConnectionPassword()); @@ -148,7 +148,7 @@ public class HibernateProvider { public static String getHibernateDialect(TopiaConfiguration topiaConfiguration) { String hibernateDialect = topiaConfiguration.getHibernateExtraConfiguration().get(TopiaConfigurationConstants.CONFIG_DIALECT); if (hibernateDialect == null) { - hibernateDialect = guessHibernateDialect(topiaConfiguration.getJdbcConnectionUrl(), topiaConfiguration.getJdbcDriverClassName()); + hibernateDialect = guessHibernateDialect(topiaConfiguration.getJdbcConnectionUrl(), topiaConfiguration.getJdbcDriverClass().getName()); } return hibernateDialect; } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/BeanJdbcConfiguration.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/BeanJdbcConfiguration.java new file mode 100644 index 0000000..fa008a6 --- /dev/null +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/BeanJdbcConfiguration.java @@ -0,0 +1,51 @@ +package org.nuiton.topia.persistence.jdbc; + +import java.sql.Driver; + +public class BeanJdbcConfiguration implements JdbcConfiguration { + + protected Class<? extends Driver> jdbcDriverClass; + + protected String jdbcConnectionUrl; + + protected String jdbcConnectionUser; + + protected String jdbcConnectionPassword; + + @Override + public Class<? extends Driver> getJdbcDriverClass() { + return jdbcDriverClass; + } + + @Override + public String getJdbcConnectionUrl() { + return jdbcConnectionUrl; + } + + @Override + public String getJdbcConnectionUser() { + return jdbcConnectionUser; + } + + @Override + public String getJdbcConnectionPassword() { + return jdbcConnectionPassword; + } + + public void setJdbcDriverClass(Class<? extends Driver> jdbcDriverClass) { + this.jdbcDriverClass = jdbcDriverClass; + } + + public void setJdbcConnectionUrl(String jdbcConnectionUrl) { + this.jdbcConnectionUrl = jdbcConnectionUrl; + } + + public void setJdbcConnectionUser(String jdbcConnectionUser) { + this.jdbcConnectionUser = jdbcConnectionUser; + } + + public void setJdbcConnectionPassword(String jdbcConnectionPassword) { + this.jdbcConnectionPassword = jdbcConnectionPassword; + } + +} diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfiguration.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfiguration.java index 4566cd4..4e84feb 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfiguration.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfiguration.java @@ -1,5 +1,7 @@ package org.nuiton.topia.persistence.jdbc; +import java.sql.Driver; + /** * @since 3.0 */ @@ -11,6 +13,6 @@ public interface JdbcConfiguration { String getJdbcConnectionPassword(); - String getJdbcDriverClassName(); + Class<? extends Driver> getJdbcDriverClass(); } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfigurationBuilder.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfigurationBuilder.java index d9320d8..6cde698 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfigurationBuilder.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcConfigurationBuilder.java @@ -12,6 +12,7 @@ import org.nuiton.util.FileUtil; import java.io.File; import java.io.IOException; +import java.sql.Driver; /** * @@ -24,29 +25,26 @@ public class JdbcConfigurationBuilder { protected static final String TIMESTAMP = String.valueOf(System.nanoTime()); - public static JdbcConfiguration forDatabase(final String jdbcConnectionUrl, final String jdbcConnectionUser, final String jdbcConnectionPassword, final String jdbcDriverClassName) { - return new JdbcConfiguration() { - - @Override - public String getJdbcConnectionUrl() { - return jdbcConnectionUrl; - } - - @Override - public String getJdbcConnectionUser() { - return jdbcConnectionUser; - } - - @Override - public String getJdbcConnectionPassword() { - return jdbcConnectionPassword; + public static JdbcConfiguration forDatabase(String jdbcConnectionUrl, String jdbcConnectionUser, String jdbcConnectionPassword, String jdbcDriverClassName) { + try { + Class<?> jdbcDriverClass = Class.forName(jdbcDriverClassName); + if (Driver.class.isAssignableFrom(jdbcDriverClass)) { + return forDatabase(jdbcConnectionUrl, jdbcConnectionUser, jdbcConnectionPassword, (Class<? extends Driver>) jdbcDriverClass); + } else { + throw new IllegalArgumentException(jdbcDriverClassName + " seems not to be a JDBC driver: it does not implement " + Driver.class.getName()); } + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException("unable to find JDBC driver class " + jdbcDriverClassName + " in classpath", e); + } + } - @Override - public String getJdbcDriverClassName() { - return jdbcDriverClassName; - } - }; + public static JdbcConfiguration forDatabase(String jdbcConnectionUrl, String jdbcConnectionUser, String jdbcConnectionPassword, Class<? extends Driver> jdbcDriverClass) { + BeanJdbcConfiguration beanJdbcConfiguration = new BeanJdbcConfiguration(); + beanJdbcConfiguration.setJdbcConnectionUrl(jdbcConnectionUrl); + beanJdbcConfiguration.setJdbcConnectionUser(jdbcConnectionUser); + beanJdbcConfiguration.setJdbcConnectionPassword(jdbcConnectionPassword); + beanJdbcConfiguration.setJdbcDriverClass(jdbcDriverClass); + return beanJdbcConfiguration; } public static JdbcConfiguration forDatabase(String jdbcConnectionUrl, String jdbcConnectionUser, String jdbcConnectionPassword) { diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcHelper.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcHelper.java index a1dfa41..56db3b3 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcHelper.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/jdbc/JdbcHelper.java @@ -74,10 +74,6 @@ public class JdbcHelper { } } - protected String getJdbcDriverClassName() { - return jdbcConfiguration.getJdbcDriverClassName(); - } - protected Connection openConnection() throws SQLException { registerDriver(); Connection connection = DriverManager.getConnection( @@ -109,7 +105,7 @@ public class JdbcHelper { } protected Driver getJdbcDriver() { - Class<? extends Driver> jdbcDriverClass = getJdbcDriverClass(); + Class<? extends Driver> jdbcDriverClass = jdbcConfiguration.getJdbcDriverClass(); try { Driver driver = jdbcDriverClass.newInstance(); return driver; @@ -120,13 +116,4 @@ public class JdbcHelper { } } - protected Class<? extends Driver> getJdbcDriverClass() { - String jdbcDriverClassName = getJdbcDriverClassName(); - try { - Class<? extends Driver> jdbcDriverClass = (Class<? extends Driver>) Class.forName(jdbcDriverClassName); - return jdbcDriverClass; - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException(jdbcDriverClassName + " is not available in classpath", e); - } - } } diff --git a/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaConfigurationBuilderTest.java b/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaConfigurationBuilderTest.java index bb4c5c9..875af33 100644 --- a/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaConfigurationBuilderTest.java +++ b/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaConfigurationBuilderTest.java @@ -2,9 +2,13 @@ package org.nuiton.topia.persistence; import org.junit.Assert; import org.junit.Test; +import org.nuiton.topia.persistence.internal.LegacyTopiaIdFactory; +import org.nuiton.topia.persistence.internal.TopiaConnectionProvider; import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; +import java.util.Properties; + public class TopiaConfigurationBuilderTest { @Test @@ -28,4 +32,33 @@ public class TopiaConfigurationBuilderTest { TopiaConfigurationBuilder.forTest(getClass(), "forTest"); } + + @Test + public void testReadProperties() { + + Properties properties = new Properties(); + properties.put("hibernate.connection.driver_class", "org.h2.Driver"); + properties.put("hibernate.connection.url", "jdbc:h2:file:/tmp/my-super-directory/h2data"); + properties.put("hibernate.connection.username", "sa"); + properties.put("hibernate.connection.password", ""); + properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect"); + properties.put("hibernate.show_sql", "false"); + properties.put("hibernate.format_sql", "true"); + properties.put("hibernate.use_sql_comments", "true"); + properties.put("hibernate.ejb.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName()); + properties.put("hibernate.c3p0.min_size", "5"); + properties.put("hibernate.c3p0.max_size", "20"); + properties.put("hibernate.c3p0.timeout", "1800"); + properties.put("hibernate.c3p0.max_statements", "50"); + properties.put("hibernate.connection.provider_class", TopiaConnectionProvider.class.getName()); + properties.put("topia.persistence.topiaIdFactoryClassName", LegacyTopiaIdFactory.class.getName()); + properties.put("topia.service.migration", HibernateTopiaMigrationService.class.getName()); + + BeanTopiaConfiguration topiaConfiguration = TopiaConfigurationBuilder.readProperties(properties); + + Assert.assertTrue(topiaConfiguration.getHibernateExtraConfiguration().containsValue(org.hibernate.cfg.ImprovedNamingStrategy.class.getName())); + Assert.assertTrue(topiaConfiguration.isConnectionPoolingEnabled()); + + } + } \ No newline at end of file diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java index cbde69f..d2e928d 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java @@ -636,7 +636,7 @@ public class TopiaMigrationEngine implements TopiaMigrationService { prop.put(Environment.URL, topiaConfiguration.getJdbcConnectionUrl()); prop.put(Environment.USER, topiaConfiguration.getJdbcConnectionUser()); prop.put(Environment.PASS, topiaConfiguration.getJdbcConnectionPassword()); - prop.put(Environment.DRIVER, topiaConfiguration.getJdbcDriverClassName()); + prop.put(Environment.DRIVER, topiaConfiguration.getJdbcDriverClass().getName()); prop.put(Environment.DIALECT, HibernateProvider.getHibernateDialect(topiaConfiguration)); Configuration result = new Configuration(); -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.