Author: athimel Date: 2014-02-11 16:21:33 +0100 (Tue, 11 Feb 2014) New Revision: 3008 Url: http://nuiton.org/projects/topia/repository/revisions/3008 Log: fixes #2629 Updates to Hibernate 4.3.x ; Some projects were having troubles with this version because XxxTopiaApplicationContext were not unregistered from TopiaApplicationContextCache (fixed) Modified: trunk/pom.xml trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaConnectionProviderHardCoded.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaApplicationContextCache.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/TopiaConnectionProvider.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/pom.xml 2014-02-11 15:21:33 UTC (rev 3008) @@ -241,7 +241,7 @@ <nuitonI18nVersion>3.0</nuitonI18nVersion> <processorPluginVersion>1.3</processorPluginVersion> <xmlrpcVersion>3.1.2</xmlrpcVersion> - <hibernateVersion>4.2.8.Final</hibernateVersion> + <hibernateVersion>4.3.1.Final</hibernateVersion> <sl4jVersion>1.7.5</sl4jVersion> <h2Version>1.3.174</h2Version> <hamcrestVersion>1.3</hamcrestVersion> 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 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaConnectionProviderHardCoded.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -36,11 +36,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; @@ -52,6 +52,8 @@ */ public class TopiaConnectionProviderHardCoded implements ConnectionProvider, Configurable, Stoppable { + private static final long serialVersionUID = 7911628440635459964L; + private String url; private Properties connectionProps; Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaApplicationContextCache.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaApplicationContextCache.java 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaApplicationContextCache.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -66,11 +66,9 @@ * @param createContextFunction the function that will be in charge of the context creation. It might not be used * inside the method if the context is found and still opened * @return an opened instance of XyzTopiaApplicationContext - * @throws TopiaNotFoundException if any pb */ public static <C extends TopiaApplicationContext> C getContext( - Properties config, Function<Properties, C> createContextFunction) - throws TopiaNotFoundException { + Properties config, Function<Properties, C> createContextFunction) { // Put all properties from a hierarchy in the current properties object. // Resolve problem with hibernate which used iterator to get properties // and so only values from the current properties object and not all Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -35,6 +35,7 @@ import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; import org.nuiton.topia.persistence.TopiaApplicationContext; +import org.nuiton.topia.persistence.TopiaApplicationContextCache; import org.nuiton.topia.persistence.TopiaConfigurationConstants; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.TopiaNotFoundException; @@ -401,6 +402,9 @@ hibernateProvider.close(); closed = true; + // Context is closed, make sure it is not referenced anymore from the context cache + TopiaApplicationContextCache.removeContext(this); + if (log.isDebugEnabled()) { log.debug("TopiaApplicationContext closed"); } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -36,20 +36,21 @@ 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.Service; import org.hibernate.service.ServiceRegistry; -import org.hibernate.service.ServiceRegistryBuilder; -import org.hibernate.service.jdbc.connections.spi.ConnectionProvider; -import org.hibernate.service.spi.ServiceRegistryImplementor; import org.hibernate.service.spi.Stoppable; import org.nuiton.topia.persistence.TopiaConfigurationConstants; import org.nuiton.topia.persistence.TopiaNotFoundException; import org.nuiton.topia.persistence.TopiaService; +import org.nuiton.topia.persistence.internal.support.TopiaHibernateEventListener; import org.nuiton.topia.persistence.support.TopiaServiceSupport; -import org.nuiton.topia.persistence.internal.support.TopiaHibernateEventListener; import org.nuiton.topia.persistence.util.TopiaUtil; import com.google.common.collect.Lists; @@ -203,20 +204,35 @@ return hibernateConfiguration; } + /** + * Method to get an Hibernate service instance from a given Hibernate SessionFactory + * <p/> + * NB: This method is static to make sure it does not depend on the current instance + * + * @param sessionFactory the Hibernate's SessionFactory instance + * @param serviceClass the expected service class + * @return the found service instance + * @throws org.hibernate.service.UnknownServiceException Indicates the service was not known. + * @see org.hibernate.service.ServiceRegistry#getService(Class) + */ + protected static <S extends Service> S getHibernateService(SessionFactory sessionFactory, Class<S> serviceClass) { + SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + StandardServiceRegistry serviceRegistry = sessionFactoryOptions.getServiceRegistry(); + S result = serviceRegistry.getService(serviceClass); + return result; + } + public void close() { if (hibernateSessionFactory != null) { - hibernateSessionFactory.close(); // close connection provider if possible (http://nuiton.org/issues/2757) - SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) hibernateSessionFactory; - ServiceRegistryImplementor serviceRegistry = sessionFactoryImplementor.getServiceRegistry(); - ConnectionProvider service = serviceRegistry.getService(ConnectionProvider.class); + ConnectionProvider service = getHibernateService(hibernateSessionFactory, ConnectionProvider.class); - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// ConnectionProvider service = hibernateSessionFactory.getSessionFactoryOptions().getServiceRegistry().getService(ConnectionProvider.class); if (service instanceof Stoppable) { Stoppable stoppable = (Stoppable) service; stoppable.stop(); } + + hibernateSessionFactory.close(); } } @@ -225,22 +241,16 @@ if (hibernateSessionFactory == null) { // init service registry + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); Properties properties = getHibernateConfiguration().getProperties(); - ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(properties); - ServiceRegistry serviceRegistry = builder.buildServiceRegistry(); + StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); - hibernateSessionFactory = getHibernateConfiguration().buildSessionFactory(serviceRegistry); + hibernateSessionFactory = getHibernateConfiguration().buildSessionFactory(standardServiceRegistry); - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); -// Properties properties = getHibernateConfiguration().getProperties(); -// StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); -// -// hibernateSessionFactory = getHibernateConfiguration().buildSessionFactory(standardServiceRegistry); - // we can't reuse original serviceRegistry instance // we must call getServiceRegistry on factory to get a working one - ServiceRegistry serviceRegistryInit = ((SessionFactoryImplementor) hibernateSessionFactory).getServiceRegistry(); + SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) hibernateSessionFactory; + ServiceRegistry serviceRegistryInit = sessionFactoryImplementor.getServiceRegistry(); EventListenerRegistry eventListenerRegistry = serviceRegistryInit.getService(EventListenerRegistry.class); TopiaHibernateEventListener listener = new TopiaHibernateEventListener(sessionRegistry); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/TopiaConnectionProvider.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/TopiaConnectionProvider.java 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/TopiaConnectionProvider.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -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; @@ -65,7 +65,7 @@ * @author tchemit <chemit@codelutin.com> * @since 2.5.3 */ -public class TopiaConnectionProvider implements ConnectionProvider, Configurable, Stoppable {//}, ServiceRegistryAwareService { +public class TopiaConnectionProvider implements ConnectionProvider, Configurable, Stoppable { /** Logger. */ private static final Log log = @@ -115,8 +115,6 @@ /** Our pool of connections which are not closed and availables. */ protected final List<Connection> pool; -// protected ServiceRegistryImplementor serviceRegistry; - public TopiaConnectionProvider() { pool = new ArrayList<Connection>(); } @@ -337,11 +335,6 @@ return autocommit; } -// @Override -// public void injectServices(ServiceRegistryImplementor serviceRegistry) { -// this.serviceRegistry = serviceRegistry; -// } - @Override public boolean isUnwrappableAs(Class unwrapType) { return ConnectionProvider.class.equals(unwrapType) || Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaHibernateEventListener.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -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.persistence.TopiaDaoSupplier; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.internal.TopiaHibernateSessionRegistry; @@ -136,11 +137,11 @@ } } -// @Override -// public boolean requiresPostCommitHanding(EntityPersister persister) { -// // TODO AThimel 17/12/13 I don't know what to return -// return false; -// } + @Override + public boolean requiresPostCommitHanding(EntityPersister persister) { + // TODO AThimel 17/12/13 I don't know what to return + return false; + } /* Chargement */ Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java 2014-02-10 09:07:24 UTC (rev 3007) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java 2014-02-11 15:21:33 UTC (rev 3008) @@ -24,40 +24,40 @@ * #L% */ -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; +import java.io.Closeable; +import java.io.IOException; +import java.net.URL; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.regex.Pattern; + 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.service.spi.ServiceRegistryImplementor; import org.hibernate.tool.hbm2ddl.DatabaseMetadata; import org.hibernate.tool.hbm2ddl.TableMetadata; import org.nuiton.topia.persistence.TopiaConfigurationConstants; -import org.nuiton.topia.persistence.support.TopiaHibernateSupport; -import org.nuiton.topia.persistence.TopiaNotFoundException; import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaNotFoundException; +import org.nuiton.topia.persistence.support.TopiaHibernateSupport; import org.nuiton.util.RecursiveProperties; import org.nuiton.util.Resource; -import java.io.Closeable; -import java.io.IOException; -import java.net.URL; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.regex.Pattern; +import com.google.common.base.Preconditions; +import com.google.common.base.Supplier; /** * TODO-fdesbois-20100507 : Need javadoc + translations for existing methods. @@ -171,16 +171,8 @@ public static boolean isSchemaExist(TopiaHibernateSupport topiaHibernateSupport, String entityName) { - SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) topiaHibernateSupport.getHibernateFactory(); - ServiceRegistryImplementor serviceRegistry = sessionFactoryImplementor.getServiceRegistry(); - ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(serviceRegistry); + ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(topiaHibernateSupport); - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// SessionFactory sessionFactory = topiaHibernateSupport.getHibernateFactory(); -// SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); -// StandardServiceRegistry standardServiceRegistry = sessionFactoryOptions.getServiceRegistry(); -// ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(standardServiceRegistry); - boolean exist = false; try { @@ -397,18 +389,10 @@ */ public static boolean isSchemaEmpty(TopiaHibernateSupport topiaHibernateSupport) { + ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(topiaHibernateSupport); + Configuration configuration = topiaHibernateSupport.getHibernateConfiguration(); - SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) topiaHibernateSupport.getHibernateFactory(); - ServiceRegistryImplementor serviceRegistry = sessionFactoryImplementor.getServiceRegistry(); - ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(serviceRegistry); - - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// SessionFactory sessionFactory = topiaHibernateSupport.getHibernateFactory(); -// SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); -// StandardServiceRegistry standardServiceRegistry = sessionFactoryOptions.getServiceRegistry(); -// ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(standardServiceRegistry); - try { ConnectionProvider connectionProvider = @@ -471,27 +455,6 @@ } /** - * @param configuration the Hibernate configuration - * @return an initialized ConnectionProvider given by Hibernate - * @deprecated since 3.0, will be remove soon, do not use it, prefer use - * {@link org.nuiton.topia.persistence.util.TopiaUtil.ConnectionProviderSupplier}. - */ - @Deprecated - protected static ConnectionProvider getConnectionProvider(Configuration configuration) { - Properties properties = configuration.getProperties(); - ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(properties); - ServiceRegistry serviceRegistry = builder.buildServiceRegistry(); - ConnectionProvider result = serviceRegistry.getService(ConnectionProvider.class); - - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); -// Properties properties = configuration.getProperties(); -// StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); -// ConnectionProvider result = standardServiceRegistry.getService(ConnectionProvider.class); - return result; - } - - /** * Return hibernate schema name * * @param config of hibernate @@ -531,38 +494,31 @@ public static class ConnectionProviderSupplier implements Supplier<ConnectionProvider>, Closeable { - protected ServiceRegistry serviceRegistry; + protected StandardServiceRegistry standardServiceRegistry; - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// protected StandardServiceRegistry standardServiceRegistry; - protected ConnectionProvider connectionProvider; protected final boolean inlineRegistry; - public ConnectionProviderSupplier(ServiceRegistry standardServiceRegistry) { + public ConnectionProviderSupplier(TopiaHibernateSupport topiaHibernateSupport) { inlineRegistry = false; - this.serviceRegistry = standardServiceRegistry; + SessionFactory sessionFactory = topiaHibernateSupport.getHibernateFactory(); + SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + this.standardServiceRegistry = sessionFactoryOptions.getServiceRegistry(); } public ConnectionProviderSupplier(Configuration configuration) { inlineRegistry = true; + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); Properties properties = configuration.getProperties(); - ServiceRegistryBuilder builder = new ServiceRegistryBuilder().applySettings(properties); - this.serviceRegistry = builder.buildServiceRegistry(); - - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); -// Properties properties = configuration.getProperties(); -// this.standardServiceRegistry = builder.applySettings(properties).build(); - + 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; } @@ -570,9 +526,7 @@ @Override public void close() throws IOException { if (inlineRegistry) { - ServiceRegistryBuilder.destroy(serviceRegistry); - // TODO AThimel 18/12/13 Check this code compatibility with Hibernate 4.3.0.Final -// StandardServiceRegistryBuilder.destroy(standardServiceRegistry); + StandardServiceRegistryBuilder.destroy(standardServiceRegistry); } } }