r2883 - trunk/topia-persistence/src/main/java/org/nuiton/topia
Author: athimel Date: 2013-11-22 18:48:55 +0100 (Fri, 22 Nov 2013) New Revision: 2883 Url: http://nuiton.org/projects/topia/repository/revisions/2883 Log: fixes #2922 ApplicationContext now keeps a weak reference on child PersistenceContexts Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java 2013-11-22 16:38:04 UTC (rev 2882) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java 2013-11-22 17:48:55 UTC (rev 2883) @@ -26,16 +26,12 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.cfg.Configuration; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.service.jdbc.connections.spi.ConnectionProvider; -import org.hibernate.service.spi.Stoppable; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; import org.nuiton.topia.event.TopiaEntitiesVetoable; @@ -44,7 +40,6 @@ import org.nuiton.topia.event.TopiaSchemaListener; import org.nuiton.topia.event.TopiaTransactionListener; import org.nuiton.topia.event.TopiaTransactionVetoable; -import org.nuiton.topia.framework.TopiaContextImplementor; import org.nuiton.topia.framework.TopiaFiresSupport; import org.nuiton.topia.framework.TopiaService; import org.nuiton.topia.framework.TopiaUtil; @@ -53,10 +48,12 @@ import org.nuiton.topia.persistence.TopiaIdFactory; import java.beans.PropertyChangeListener; -import java.lang.ref.WeakReference; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; +import java.util.WeakHashMap; /** * The application context is the main class in ToPIA usage. This class is a kind of equivalent of the RootTopiaContext. @@ -82,7 +79,8 @@ protected boolean closed = false; - protected List<WeakReference<TopiaPersistenceContext>> persistenceContexts = Lists.newArrayList(); // TODO AThimel 11/10/13 Which implementation ? + protected Set<TopiaPersistenceContext> persistenceContexts = Collections.newSetFromMap( + new WeakHashMap<TopiaPersistenceContext, Boolean>()); public abstract K newPersistenceContext(); @@ -114,7 +112,7 @@ } protected void registerPersistenceContext(TopiaPersistenceContext persistenceContext) { - persistenceContexts.add(new WeakReference<TopiaPersistenceContext>(persistenceContext)); + persistenceContexts.add(persistenceContext); } protected HibernateProvider getHibernateProvider() { @@ -353,17 +351,23 @@ } public void closeContext() throws TopiaException { + // Throw exception if context is already closed Preconditions.checkState(!closed, "Context was already closed"); - // TODO AThimel 11/10/13 Implement close on persistence contexts -// // Remove all children context -// for (TopiaPersistenceContext child : getChildContext()) { -// // Avoid to have exception from checkClosed method on child -// if (!child.isClosed()) { -// child.close(); -// } -// } + // Iterate over the children PersistenceContexts and close them + for (TopiaPersistenceContext persistenceContext : persistenceContexts) { + if (persistenceContext == null) { + if (log.isWarnEnabled()) { + log.warn("null TopiaPersistenceContext found in #persistenceContexts"); + } + } else { + // Avoid to have exception from checkClosed method on child + if (!persistenceContext.isClosed()) { + persistenceContext.closeContext(); + } + } + } hibernateProvider.close(); closed = true;
participants (1)
-
athimelï¼ users.nuiton.org