Author: athimel Date: 2013-12-17 16:56:08 +0100 (Tue, 17 Dec 2013) New Revision: 2925 Url: http://nuiton.org/projects/topia/repository/revisions/2925 Log: fixes #2969 Update to Hibernate 4.3.0.Final Modified: trunk/pom.xml trunk/topia-it/src/main/resources/TopiaContextImpl.properties trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaConnectionProviderHardCoded.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HibernateProvider.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/pom.xml 2013-12-17 15:56:08 UTC (rev 2925) @@ -240,7 +240,7 @@ <nuitonI18nVersion>2.5.2</nuitonI18nVersion> <processorPluginVersion>1.3</processorPluginVersion> <xmlrpcVersion>3.1.2</xmlrpcVersion> - <hibernateVersion>4.2.8.Final</hibernateVersion> + <hibernateVersion>4.3.0.Final</hibernateVersion> <sl4jVersion>1.7.5</sl4jVersion> <h2Version>1.3.172</h2Version> <hamcrestVersion>1.3</hamcrestVersion> Modified: trunk/topia-it/src/main/resources/TopiaContextImpl.properties =================================================================== --- trunk/topia-it/src/main/resources/TopiaContextImpl.properties 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/topia-it/src/main/resources/TopiaContextImpl.properties 2013-12-17 15:56:08 UTC (rev 2925) @@ -31,4 +31,7 @@ hibernate.connection.password= hibernate.connection.driver_class=org.h2.Driver # tchemit 2010-11-28 : comment this line, each test must define his own db path -#hibernate.connection.url=jdbc:h2:file:target/surefire-workdir/h2data \ No newline at end of file +#hibernate.connection.url=jdbc:h2:file:target/surefire-workdir/h2data + +# AThimel 16/12/2013 : Uncomment the next line to tests the ToPIA connection provider +#hibernate.connection.provider_class=org.nuiton.topia.framework.TopiaConnectionProvider Modified: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaConnectionProviderHardCoded.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaConnectionProviderHardCoded.java 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaConnectionProviderHardCoded.java 2013-12-17 15:56:08 UTC (rev 2925) @@ -28,7 +28,7 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Properties; @@ -36,10 +36,13 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.cfg.Environment; +import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.internal.util.ReflectHelper; import org.hibernate.internal.util.config.ConfigurationHelper; -import org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator; -import org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl; +import org.hibernate.service.UnknownUnwrapTypeException; +import org.hibernate.service.spi.Configurable; +import org.hibernate.service.spi.Stoppable; /** * Customized connection provider. @@ -47,7 +50,7 @@ * @author tchemit <chemit@codelutin.com> * @since 2.5.3 */ -public class TopiaConnectionProviderHardCoded extends DriverManagerConnectionProviderImpl { +public class TopiaConnectionProviderHardCoded implements ConnectionProvider, Configurable, Stoppable { private String url; @@ -55,35 +58,57 @@ private Integer isolation; - private final ArrayList pool = new ArrayList(); + /** + * Our pool of connections which are not closed and availables. + */ + protected final List<Connection> pool; private int poolSize; + private boolean stopped; + private int checkedOut = 0; private boolean autocommit; - /** Logger. */ + /** + * Logger. + */ private static final Log log = LogFactory.getLog(TopiaConnectionProviderHardCoded.class); + public TopiaConnectionProviderHardCoded() { + pool = new ArrayList<Connection>(); + } + @Override public void configure(Map configurationValues) throws HibernateException { - String driverClass = (String)configurationValues.get(Environment.DRIVER); poolSize = ConfigurationHelper.getInt(Environment.POOL_SIZE, configurationValues, 20); //default pool size 20 - log.info("Using Hibernate built-in connection pool (not for production use!)"); - log.info("Hibernate connection pool size: " + poolSize); + if (log.isDebugEnabled()) { + log.debug("Connection pool size: " + poolSize); + } autocommit = ConfigurationHelper.getBoolean(Environment.AUTOCOMMIT, configurationValues); - log.info("autocommit mode: " + autocommit); + if (log.isDebugEnabled()) { + log.debug("autocommit mode: " + autocommit); + } isolation = ConfigurationHelper.getInteger(Environment.ISOLATION, configurationValues); - if (isolation != null) - log.info("JDBC isolation level: " + Environment.isolationLevelToString(isolation)); + if (isolation != null) { + if (log.isDebugEnabled()) { + log.debug("JDBC isolation level: " + + Environment.isolationLevelToString(isolation)); + } + } + String driverClass = ConfigurationHelper.getString(Environment.DRIVER, configurationValues); if (driverClass == null) { - log.warn("no JDBC Driver class was specified by property " + Environment.DRIVER); + + if (log.isWarnEnabled()) { + log.warn("no JDBC Driver class was specified by property " + + Environment.DRIVER); + } } else { try { // trying via forName() first to be as close to DriverManager's semantics @@ -103,7 +128,7 @@ // the real directory where db is and then make sure hibernate always // use the connection provider... String directory = - (String)configurationValues.get(TopiaConnectionProviderTest.TEST_URL); + (String) configurationValues.get(TopiaConnectionProviderTest.TEST_URL); url = directory; // url = props.getProperty(Environment.URL); @@ -116,19 +141,24 @@ connectionProps = ConnectionProviderInitiator.getConnectionProperties(configurationValues); - log.info("using driver: " + driverClass + " at URL: " + url); - // if debug level is enabled, then log the password, otherwise mask it if (log.isDebugEnabled()) { - log.info("connection properties: " + connectionProps); - } else if (log.isInfoEnabled()) { - log.info("connection properties: " + ConfigurationHelper.maskOut(connectionProps, "password")); + log.debug("using driver: " + driverClass + " at URL: " + url); } + + // if debug level is enabled, then log the password, otherwise mask it + if (log.isTraceEnabled()) { + log.debug("connection properties: " + connectionProps); + } else if (log.isDebugEnabled()) { + log.debug("connection properties: " + + ConfigurationHelper.maskOut(connectionProps, "password")); + } } @Override public Connection getConnection() throws SQLException { - if (log.isTraceEnabled()) + if (log.isTraceEnabled()) { log.trace("total checked-out connections: " + checkedOut); + } synchronized (pool) { if (!pool.isEmpty()) { @@ -137,11 +167,13 @@ log.trace("using pooled JDBC connection, pool size: " + last); } checkedOut++; - Connection pooled = (Connection) pool.remove(last); - if (isolation != null) + Connection pooled = pool.remove(last); + if (isolation != null) { pooled.setTransactionIsolation(isolation.intValue()); - if (pooled.getAutoCommit() != autocommit) + } + if (pooled.getAutoCommit() != autocommit) { pooled.setAutoCommit(autocommit); + } return pooled; } } @@ -183,28 +215,51 @@ @Override protected void finalize() throws Throwable { + if (!stopped) { + stop(); + } super.finalize(); - close(); } - public void close() { + @Override + public void stop() { - log.info("cleaning up connection pool: " + url); + if (log.isDebugEnabled()) { + log.debug("cleaning up connection pool: " + url); + } - Iterator iter = pool.iterator(); - while (iter.hasNext()) { + for (Connection connection : pool) { try { - ((Connection) iter.next()).close(); + connection.close(); } catch (SQLException sqle) { - log.warn("problem closing pooled connection", sqle); + if (log.isWarnEnabled()) { + log.warn("problem closing pooled connection", sqle); + } } } pool.clear(); - + stopped = true; } @Override public boolean supportsAggressiveRelease() { return false; } + + @Override + public boolean isUnwrappableAs(Class unwrapType) { + return ConnectionProvider.class.equals(unwrapType) || + getClass().isAssignableFrom(unwrapType); + } + + @Override + @SuppressWarnings({"unchecked"}) + public <T> T unwrap(Class<T> unwrapType) { + if (ConnectionProvider.class.equals(unwrapType) || + getClass().isAssignableFrom(unwrapType)) { + return (T) this; + } else { + throw new UnknownUnwrapTypeException(unwrapType); + } + } } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaConnectionProvider.java 2013-12-17 15:56:08 UTC (rev 2925) @@ -28,11 +28,11 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.cfg.Environment; +import org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.internal.util.ReflectHelper; import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.service.UnknownUnwrapTypeException; -import org.hibernate.service.jdbc.connections.internal.ConnectionProviderInitiator; -import org.hibernate.service.jdbc.connections.spi.ConnectionProvider; import org.hibernate.service.spi.Configurable; import org.hibernate.service.spi.Stoppable; @@ -123,7 +123,6 @@ @Override public void configure(Map configurationValues) throws HibernateException { - String driverClass = (String) configurationValues.get(Environment.DRIVER); poolSize = ConfigurationHelper.getInt(Environment.POOL_SIZE, configurationValues, 20); //default pool size 20 if (log.isDebugEnabled()) { @@ -131,8 +130,9 @@ } autocommit = ConfigurationHelper.getBoolean(Environment.AUTOCOMMIT, configurationValues); - if (log.isDebugEnabled()) + if (log.isDebugEnabled()) { log.debug("autocommit mode: " + autocommit); + } isolation = ConfigurationHelper.getInteger(Environment.ISOLATION, configurationValues); if (isolation != null) { @@ -142,6 +142,7 @@ } } + String driverClass = ConfigurationHelper.getString(Environment.DRIVER, configurationValues); if (driverClass == null) { if (log.isWarnEnabled()) { @@ -165,8 +166,7 @@ url = (String) configurationValues.get(Environment.URL); if (url == null) { - String msg = "JDBC URL was not specified by property " + - Environment.URL; + String msg = "JDBC URL was not specified by property " + Environment.URL; if (log.isErrorEnabled()) { log.error(msg); } @@ -179,6 +179,7 @@ if (log.isDebugEnabled()) { log.debug("using driver: " + driverClass + " at URL: " + url); } + // if debug level is enabled, then log the password, otherwise mask it if (log.isTraceEnabled()) { log.debug("connection properties: " + connectionProps); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java 2013-12-17 15:56:08 UTC (rev 2925) @@ -48,6 +48,7 @@ import org.hibernate.event.spi.PreUpdateEventListener; import org.hibernate.event.spi.SaveOrUpdateEvent; import org.hibernate.event.spi.SaveOrUpdateEventListener; +import org.hibernate.persister.entity.EntityPersister; import org.nuiton.topia.TopiaDaoSupplier; import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaHibernateSessionRegistry; @@ -136,6 +137,12 @@ } } + @Override + public boolean requiresPostCommitHanding(EntityPersister persister) { + // TODO AThimel 17/12/13 I don't know what to return + return false; + } + /* Chargement */ @Override Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2013-12-17 15:56:08 UTC (rev 2925) @@ -28,14 +28,14 @@ import com.google.common.base.Supplier; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Table; -import org.hibernate.service.ServiceRegistry; -import org.hibernate.service.ServiceRegistryBuilder; -import org.hibernate.service.jdbc.connections.spi.ConnectionProvider; import org.hibernate.tool.hbm2ddl.DatabaseMetadata; import org.hibernate.tool.hbm2ddl.TableMetadata; import org.nuiton.topia.TopiaContextFactory; @@ -165,15 +165,17 @@ * base. * * @param topiaHibernateSupport the Hibernate support required for this operation - * @param entityName le nom de l'entite a tester + * @param entityName le nom de l'entite a tester * @return <tt>true</tt> si le schema de la table existe * @since 2.6.4 */ public static boolean isSchemaExist(TopiaHibernateSupport topiaHibernateSupport, String entityName) { - ConnectionProviderSupplier connectionProviderSupplier = - new ConnectionProviderSupplier(((SessionFactoryImplementor) topiaHibernateSupport.getHibernateFactory()).getServiceRegistry()); + SessionFactory sessionFactory = topiaHibernateSupport.getHibernateFactory(); + SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + StandardServiceRegistry standardServiceRegistry = sessionFactoryOptions.getServiceRegistry(); + ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(standardServiceRegistry); boolean exist = false; @@ -310,7 +312,7 @@ * * @param configuration hibernate db configuration * @return {@code true} if there is no schema for any of the dealed entities, - * {@code false} otherwise. + * {@code false} otherwise. * @since 2.5.3 */ public static boolean isSchemaEmpty(Configuration configuration) { @@ -339,7 +341,7 @@ if (testTable == null) { throw new IllegalArgumentException( "could not find entity with name " + - classMapping.getClassName()); + classMapping.getClassName()); } @@ -353,9 +355,9 @@ if (log.isDebugEnabled()) { log.debug("Existing table found " + - testTable.getName() + " for entity " + - classMapping.getClassName() + - ", db is not empty."); + testTable.getName() + " for entity " + + classMapping.getClassName() + + ", db is not empty."); } return false; @@ -386,15 +388,17 @@ * * @param topiaHibernateSupport the Hibernate support required for this operation * @return {@code true} if there is no schema for any of the dealed entities, - * {@code false} otherwise. + * {@code false} otherwise. * @since 2.5.3 */ public static boolean isSchemaEmpty(TopiaHibernateSupport topiaHibernateSupport) { Configuration configuration = topiaHibernateSupport.getHibernateConfiguration(); - ConnectionProviderSupplier connectionProviderSupplier = - new ConnectionProviderSupplier(((SessionFactoryImplementor) topiaHibernateSupport.getHibernateFactory()).getServiceRegistry()); + SessionFactory sessionFactory = topiaHibernateSupport.getHibernateFactory(); + SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + StandardServiceRegistry standardServiceRegistry = sessionFactoryOptions.getServiceRegistry(); + ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(standardServiceRegistry); try { @@ -417,7 +421,7 @@ if (testTable == null) { throw new IllegalArgumentException( "could not find entity with name " + - classMapping.getClassName()); + classMapping.getClassName()); } @@ -430,9 +434,9 @@ if (log.isDebugEnabled()) { log.debug("Existing table found " + - testTable.getName() + " for entity " + - classMapping.getClassName() + - ", db is not empty."); + testTable.getName() + " for entity " + + classMapping.getClassName() + + ", db is not empty."); } return false; @@ -464,9 +468,11 @@ */ @Deprecated protected static ConnectionProvider getConnectionProvider(Configuration configuration) { - ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings( - configuration.getProperties()).buildServiceRegistry(); - return serviceRegistry.getService(ConnectionProvider.class); + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); + Properties properties = configuration.getProperties(); + StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); + ConnectionProvider result = standardServiceRegistry.getService(ConnectionProvider.class); + return result; } /** @@ -509,27 +515,30 @@ public static class ConnectionProviderSupplier implements Supplier<ConnectionProvider>, Closeable { - protected ServiceRegistry serviceRegistry; + protected StandardServiceRegistry standardServiceRegistry; protected ConnectionProvider connectionProvider; protected final boolean inlineRegistry; - public ConnectionProviderSupplier(ServiceRegistry serviceRegistry) { + public ConnectionProviderSupplier(StandardServiceRegistry standardServiceRegistry) { inlineRegistry = false; - this.serviceRegistry = serviceRegistry; + this.standardServiceRegistry = standardServiceRegistry; } public ConnectionProviderSupplier(Configuration configuration) { inlineRegistry = true; - this.serviceRegistry = new ServiceRegistryBuilder().applySettings( - configuration.getProperties()).buildServiceRegistry(); + + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); + Properties properties = configuration.getProperties(); + this.standardServiceRegistry = builder.applySettings(properties).build(); + } @Override public ConnectionProvider get() { if (connectionProvider == null) { - connectionProvider = serviceRegistry.getService(ConnectionProvider.class); + connectionProvider = standardServiceRegistry.getService(ConnectionProvider.class); } return connectionProvider; } @@ -537,7 +546,7 @@ @Override public void close() throws IOException { if (inlineRegistry) { - ServiceRegistryBuilder.destroy(serviceRegistry); + StandardServiceRegistryBuilder.destroy(standardServiceRegistry); } } } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HibernateProvider.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HibernateProvider.java 2013-12-12 09:33:06 UTC (rev 2924) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/HibernateProvider.java 2013-12-17 15:56:08 UTC (rev 2925) @@ -36,13 +36,14 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; +import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.EventType; import org.hibernate.service.ServiceRegistry; -import org.hibernate.service.ServiceRegistryBuilder; -import org.hibernate.service.jdbc.connections.spi.ConnectionProvider; import org.hibernate.service.spi.Stoppable; import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaNotFoundException; @@ -206,7 +207,7 @@ if (hibernateSessionFactory != null) { hibernateSessionFactory.close(); // close connection provider if possible (http://nuiton.org/issues/2757) - ConnectionProvider service = ((SessionFactoryImplementor) hibernateSessionFactory).getServiceRegistry().getService(ConnectionProvider.class); + ConnectionProvider service = hibernateSessionFactory.getSessionFactoryOptions().getServiceRegistry().getService(ConnectionProvider.class); if (service instanceof Stoppable) { Stoppable stoppable = (Stoppable) service; stoppable.stop(); @@ -219,10 +220,11 @@ if (hibernateSessionFactory == null) { // init service registry - ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings( - getHibernateConfiguration().getProperties()).buildServiceRegistry(); + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); + Properties properties = getHibernateConfiguration().getProperties(); + StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); - hibernateSessionFactory = getHibernateConfiguration().buildSessionFactory(serviceRegistry); + hibernateSessionFactory = getHibernateConfiguration().buildSessionFactory(standardServiceRegistry); // we can't reuse original serviceRegistry instance // we must call getServiceRegistry on factory to get a working one