r2843 - in trunk/topia-persistence/src: main/java/org/nuiton/topia main/java/org/nuiton/topia/framework main/java/org/nuiton/topia/generator test/java/org/nuiton/topia test/java/org/nuiton/topia/framework test/java/org/nuiton/topia/generator test/java/org/nuiton/topia/persistence test/java/org/nuiton/topia/test/ano1882 test/java/org/nuiton/topiatest test/java/org/nuiton/topiatest/deletetest
Author: athimel Date: 2013-10-12 00:40:03 +0200 (Sat, 12 Oct 2013) New Revision: 2843 Url: http://nuiton.org/projects/topia/repository/revisions/2843 Log: Migrate tests to the new ToPIa architecture Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaJpaSupportTest.java Removed: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaContextFindTest.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateProvider.java trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaReplicationSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaReplicationDestination.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaServiceSupportImpl.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ApplicationContextTransformer.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaDatabase.java trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextReplicateTest.java trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaUtilTest.java trunk/topia-persistence/src/test/java/org/nuiton/topia/generator/TopiaTestCase.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/EntityVisitorExportXmlTest.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaDAOTest.java trunk/topia-persistence/src/test/java/org/nuiton/topia/test/ano1882/DAOAbstractTransformerTest.java trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java trunk/topia-persistence/src/test/java/org/nuiton/topiatest/deletetest/DeleteEntityTest.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-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaApplicationContext.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -26,12 +26,16 @@ 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; @@ -40,6 +44,7 @@ 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; @@ -48,6 +53,7 @@ import org.nuiton.topia.persistence.TopiaIdFactory; import java.beans.PropertyChangeListener; +import java.lang.ref.WeakReference; import java.util.List; import java.util.Map; import java.util.Properties; @@ -74,6 +80,10 @@ protected HibernateProvider hibernateProvider; + protected boolean closed = false; + + protected List<WeakReference<TopiaPersistenceContext>> persistenceContexts = Lists.newArrayList(); // TODO AThimel 11/10/13 Which implementation ? + public abstract K newPersistenceContext(); public AbstractTopiaApplicationContext(Properties properties) { @@ -89,6 +99,8 @@ } this.configuration = ImmutableMap.copyOf(configurationCopy); this.topiaServiceSupport = new TopiaServiceSupportImpl(this); + // FIXME AThimel 11/10/13 This is not nice, need a 2-step init because of mutual dependency with hibernateProvider + ((TopiaServiceSupportImpl)this.topiaServiceSupport).init(); } protected abstract Class<? extends TopiaEntity>[] getImplementationClasses(); @@ -101,6 +113,10 @@ return buffer.substring(1); } + protected void registerPersistenceContext(TopiaPersistenceContext persistenceContext) { + persistenceContexts.add(new WeakReference<TopiaPersistenceContext>(persistenceContext)); + } + protected HibernateProvider getHibernateProvider() { if (hibernateProvider == null) { hibernateProvider = new HibernateProvider(configuration, topiaServiceSupport); @@ -336,4 +352,29 @@ } } + 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(); +// } +// } + + hibernateProvider.close(); + closed = true; + + if (log.isDebugEnabled()) { + log.debug("TopiaApplicationContext closed"); + } + } + + public boolean isClosed() { + return closed; + } + } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -35,6 +35,7 @@ import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.nuiton.topia.framework.TopiaFiresSupport; +import org.nuiton.topia.framework.TopiaHibernateEventListener; import org.nuiton.topia.persistence.AbstractTopiaDAO; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; @@ -109,6 +110,7 @@ this.listenableSupport = listenableSupport; this.topiaIdFactory = topiaIdFactory; + this.firesSupport = new TopiaFiresSupport(); // Hibernate support can be created using the given hibernateProvider this.hibernateSupport = new InternalTopiaHibernateSupport(hibernateProvider); @@ -117,7 +119,6 @@ startTransaction(); // Create the different supports that may be needed by the DAOs - this.firesSupport = new TopiaFiresSupport(); this.jpaSupport = new HibernateTopiaJpaSupport(hibernateSupport, firesSupport); this.sqlSupport = new HibernateTopiaSqlSupport(hibernateSupport); } @@ -355,7 +356,7 @@ } @Override - public void close() { + public void closeContext() { checkClosed(); closed = true; Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateProvider.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateProvider.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateProvider.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -42,7 +42,9 @@ import org.hibernate.event.spi.EventType; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; -import org.nuiton.topia.framework.TopiaFiresSupport; +import org.hibernate.service.jdbc.connections.spi.ConnectionProvider; +import org.hibernate.service.spi.Stoppable; +import org.nuiton.topia.framework.TopiaHibernateEventListener; import org.nuiton.topia.framework.TopiaService; import org.nuiton.topia.framework.TopiaUtil; @@ -193,6 +195,18 @@ return hibernateConfiguration; } + public void close() { + if (hibernateSessionFactory != null) { + hibernateSessionFactory.close(); + // close connection provider if possible (http://nuiton.org/issues/2757) + ConnectionProvider service = ((SessionFactoryImplementor) hibernateSessionFactory).getServiceRegistry().getService(ConnectionProvider.class); + if (service instanceof Stoppable) { + Stoppable stoppable = (Stoppable) service; + stoppable.stop(); + } + } + } + public SessionFactory getSessionFactory() { if (hibernateSessionFactory == null) { @@ -208,7 +222,7 @@ ServiceRegistry serviceRegistryInit = ((SessionFactoryImplementor) hibernateSessionFactory).getServiceRegistry(); EventListenerRegistry eventListenerRegistry = serviceRegistryInit.getService(EventListenerRegistry.class); // TopiaFiresSupport.TopiaHibernateEvent listener = new TopiaFiresSupport.TopiaHibernateEvent(this); - TopiaFiresSupport.TopiaHibernateEvent listener = new TopiaFiresSupport.TopiaHibernateEvent(null); // FIXME AThimel 11/10/13 Give a correct instance + TopiaHibernateEventListener listener = new TopiaHibernateEventListener(null); // FIXME AThimel 11/10/13 Give a correct instance eventListenerRegistry.appendListeners(EventType.PRE_INSERT, listener); eventListenerRegistry.appendListeners(EventType.PRE_LOAD, listener); eventListenerRegistry.appendListeners(EventType.PRE_UPDATE, listener); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -24,6 +24,10 @@ * #L% */ +import java.util.Collection; +import java.util.List; +import java.util.Map; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.FlushMode; @@ -32,10 +36,6 @@ import org.nuiton.topia.framework.TopiaFiresSupport; import org.nuiton.topia.framework.TopiaUtil; -import java.util.Collection; -import java.util.List; -import java.util.Map; - /** * This class is the Hibernate implementation of TopiaJpaSupport. It realizes the bridge between the JPA specification * and the technical choice made for its implementation : Hibernate. @@ -119,6 +119,27 @@ } @Override + public <T> T findUnique(String jpaql, Map<String, Object> parameters) { + + // Execute query, and ask for up to 2 results only + List<T> results = find(jpaql, 0, 1, parameters); + + // If there is more than 1 result, throw an exception + if (results.size() > 1) { + String message = String.format( + "Query '%s' returns more than 1 unique result", jpaql); + throw new TopiaException(message); + } + + // otherwise return the first one, or null + T result = null; + if (!results.isEmpty()) { + result = results.get(0); + } + return result; + } + + @Override public <T> List<T> find(String jpaql, int startIndex, int endIndex, Map<String, Object> parameters) { try { Query query = prepareQuery(jpaql, parameters); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaReplicationSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaReplicationSupport.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaReplicationSupport.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -1,5 +1,29 @@ package org.nuiton.topia; +/* + * #%L + * ToPIA :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaReplicationSupport.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -117,10 +117,25 @@ * support something else than queries on TopiaEntity * * @param jpaql the JPA-QL query + * @param parameters a map which keys are the attribute names and values are the attributes expected values + * @return The result instance or null + */ + <T> T findUnique(String jpaql, + Map<String, Object> parameters); + + /** + * Allow to do some JPA-QL query and return an unique result. If nothing if + * found by the query, will return null. If more than one result is found, + * will throw an exception. + * <p/> + * WARNING : Depending on the registered service, this method may not + * support something else than queries on TopiaEntity + * + * @param jpaql the JPA-QL query * @param propertyNamesAndValues the query parameters. Arguments are key-value paired : * [propertyName;value;propertyName;value;...] * @return The result instance or null - * @deprecated prefer using {@link #find(String, int, int, java.util.Map)} + * @deprecated prefer using {@link #findUnique(String, java.util.Map)} */ @Deprecated <T> T findUnique(String jpaql, Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaPersistenceContext.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -68,7 +68,7 @@ * Closes the context. All the children contexts will be closed in the same * time. */ - void close(); + void closeContext(); /** * Tells if the context is closed Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaReplicationDestination.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaReplicationDestination.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaReplicationDestination.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -1,5 +1,29 @@ package org.nuiton.topia; +/* + * #%L + * ToPIA :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + import org.nuiton.topia.persistence.TopiaEntity; /** Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaReplicationDestination.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaServiceSupportImpl.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaServiceSupportImpl.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaServiceSupportImpl.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -49,6 +49,9 @@ public TopiaServiceSupportImpl(AbstractTopiaApplicationContext applicationContext) { this.applicationContext = applicationContext; this.services = loadServices(applicationContext.getConfiguration()); + } + + public void init() { preInitServices(this.services); applicationContext.getHibernateProvider().getHibernateConfiguration(); // force mapping loading postInitServices(this.services); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/AbstractTopiaContext.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -579,7 +579,7 @@ // we must call getServiceRegistry on factory to get a working one ServiceRegistry serviceRegistryInit = ((SessionFactoryImplementor) hibernateFactory).getServiceRegistry(); EventListenerRegistry eventListenerRegistry = serviceRegistryInit.getService(EventListenerRegistry.class); - TopiaFiresSupport.TopiaHibernateEvent listener = new TopiaFiresSupport.TopiaHibernateEvent(this); + TopiaHibernateEventListener listener = new TopiaHibernateEventListener(this); eventListenerRegistry.appendListeners(EventType.PRE_INSERT, listener); eventListenerRegistry.appendListeners(EventType.PRE_LOAD, listener); eventListenerRegistry.appendListeners(EventType.PRE_UPDATE, listener); @@ -613,7 +613,8 @@ if (log.isDebugEnabled()) { log.debug("Load persistence from dir : " + dir); } - hibernateConfiguration.addDirectory(new File(dir)); + File dirFile = new File(dir); + hibernateConfiguration.addDirectory(dirFile); } } @@ -891,11 +892,6 @@ } @Override - public void close() { - closeContext(); - } - - @Override public void closeContext() throws TopiaException { // Throw exception if context is already closed checkClosed("Context was already closed"); @@ -1019,20 +1015,8 @@ checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", "findUnique")); - List<E> results = find(jpaql, 0, 1, propertyNamesAndValues); - - // If there is more than 1 result, throw an exception - if (results.size() > 1) { - String message = String.format( - "Query '%s' returns more than 1 unique result", jpaql); - throw new TopiaException(message); - } - - // otherwise return the first one, or null - E result = null; - if (!results.isEmpty()) { - result = results.get(0); - } + Map<String, Object> parameters = TopiaUtil.convertPropertiesArrayToMap(propertyNamesAndValues); + E result = findUnique(jpaql, parameters); return result; } @@ -1113,6 +1097,26 @@ } @Override + public <T> T findUnique(String jpaql, Map<String, Object> parameters) { + + List<T> results = find(jpaql, 0, 1, parameters); + + // If there is more than 1 result, throw an exception + if (results.size() > 1) { + String message = String.format( + "Query '%s' returns more than 1 unique result", jpaql); + throw new TopiaException(message); + } + + // otherwise return the first one, or null + T result = null; + if (!results.isEmpty()) { + result = results.get(0); + } + return result; + } + + @Override public int execute(String jpaql, Map<String, Object> parameters) { checkClosed(String.format("This context is closed, it is not possible to release the operation '%1$s'", "find")); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaFiresSupport.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -25,33 +25,19 @@ package org.nuiton.topia.framework; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.beans.VetoableChangeSupport; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.commons.collections.map.IdentityMap; -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.Session; -import org.hibernate.event.spi.PostDeleteEvent; -import org.hibernate.event.spi.PostDeleteEventListener; -import org.hibernate.event.spi.PostInsertEvent; -import org.hibernate.event.spi.PostInsertEventListener; -import org.hibernate.event.spi.PostLoadEvent; -import org.hibernate.event.spi.PostLoadEventListener; -import org.hibernate.event.spi.PostUpdateEvent; -import org.hibernate.event.spi.PostUpdateEventListener; -import org.hibernate.event.spi.PreDeleteEvent; -import org.hibernate.event.spi.PreDeleteEventListener; -import org.hibernate.event.spi.PreInsertEvent; -import org.hibernate.event.spi.PreInsertEventListener; -import org.hibernate.event.spi.PreLoadEvent; -import org.hibernate.event.spi.PreLoadEventListener; -import org.hibernate.event.spi.PreUpdateEvent; -import org.hibernate.event.spi.PreUpdateEventListener; -import org.hibernate.event.spi.SaveOrUpdateEvent; -import org.hibernate.event.spi.SaveOrUpdateEventListener; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaDAOSupplier; -import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaJpaSupport; import org.nuiton.topia.TopiaListenableSupport; import org.nuiton.topia.TopiaPersistenceContext; @@ -70,20 +56,9 @@ import org.nuiton.topia.event.TopiaTransactionVetoable; import org.nuiton.topia.persistence.AbstractTopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaEntityContextable; import org.nuiton.util.CategorisedListenerSet; import org.nuiton.util.ListenerSet; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.beans.VetoableChangeSupport; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * TODO-fdesbois-20100507 : Need translation of javadoc. * <p/> @@ -95,44 +70,32 @@ */ public class TopiaFiresSupport implements TopiaListenableSupport { - static private Log log = LogFactory.getLog(TopiaFiresSupport.class); + private static final Log log = LogFactory.getLog(TopiaFiresSupport.class); /** used to fire read event */ final static Object NO_CHANGE = new Object(); /** used to collect entity modification during transaction */ - protected Map<TopiaEntity, EntityState> transactionEntities = - new IdentityMap(); + protected Map<TopiaEntity, EntityState> transactionEntities = new IdentityMap(); - protected Set<PropertyChangeListener> propertyChangeListeners = - new HashSet<PropertyChangeListener>(); + protected Set<PropertyChangeListener> propertyChangeListeners = new HashSet<PropertyChangeListener>(); /* Pour la transaction */ + protected ListenerSet<TopiaTransactionListener> transactionListeners = new ListenerSet<TopiaTransactionListener>(); - protected ListenerSet<TopiaTransactionListener> transactionListeners = - new ListenerSet<TopiaTransactionListener>(); + protected ListenerSet<TopiaTransactionVetoable> transactionVetoables = new ListenerSet<TopiaTransactionVetoable>(); - protected ListenerSet<TopiaTransactionVetoable> transactionVetoables = - new ListenerSet<TopiaTransactionVetoable>(); - /* Pour les entités */ + protected CategorisedListenerSet<TopiaEntityListener> entityListeners = new CategorisedListenerSet<TopiaEntityListener>(); - protected CategorisedListenerSet<TopiaEntityListener> entityListeners = - new CategorisedListenerSet<TopiaEntityListener>(); + protected CategorisedListenerSet<TopiaEntityVetoable> entityVetoables = new CategorisedListenerSet<TopiaEntityVetoable>(); - protected CategorisedListenerSet<TopiaEntityVetoable> entityVetoables = - new CategorisedListenerSet<TopiaEntityVetoable>(); - /* Pour les listes d'entités */ + protected ListenerSet<TopiaEntitiesVetoable> entitiesVetoables = new ListenerSet<TopiaEntitiesVetoable>(); - protected ListenerSet<TopiaEntitiesVetoable> entitiesVetoables = - new ListenerSet<TopiaEntitiesVetoable>(); - /* Pour les actions du topia context */ + protected ListenerSet<TopiaSchemaListener> topiaSchemaListeners = new ListenerSet<TopiaSchemaListener>(); - protected ListenerSet<TopiaSchemaListener> topiaSchemaListeners = - new ListenerSet<TopiaSchemaListener>(); - /** * used to register objects loaded during transaction. * @@ -239,8 +202,7 @@ if (log.isDebugEnabled()) { log.debug("fireOnPostCommit"); } - TopiaTransactionEvent e = new TopiaTransactionEvent(context, - transactionEntities); + TopiaTransactionEvent e = new TopiaTransactionEvent(context, transactionEntities); for (TopiaTransactionListener listener : transactionListeners) { try { listener.commit(e); @@ -257,8 +219,7 @@ if (log.isDebugEnabled()) { log.debug("fireOnPostRollback"); } - TopiaTransactionEvent e = new TopiaTransactionEvent(context, - transactionEntities); + TopiaTransactionEvent e = new TopiaTransactionEvent(context, transactionEntities); for (TopiaTransactionListener listener : transactionListeners) { try { listener.rollback(e); @@ -273,14 +234,13 @@ /* Fires sur les entités */ - public void fireOnPreCreate(TopiaContextImplementor context, + public void fireOnPreCreate(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPreCreate"); } TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity.getClass()); l.hasNext();) { try { l.next().create(event); } catch (Exception eee) { @@ -289,34 +249,31 @@ } } - public void fireOnPostCreate(TopiaContextImplementor context, + public void fireOnPostCreate(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPostCreate"); } warnOnCreateEntity(entity); TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity.getClass()); l.hasNext();) { try { l.next().create(event); } catch (Exception eee) { if (log.isErrorEnabled()) { - log.error("Can't fireOnPostCreate for entity: " + entity, - eee); + log.error("Can't fireOnPostCreate for entity: " + entity, eee); } } } } - public void fireOnPreLoad(TopiaContextImplementor context, + public void fireOnPreLoad(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPreLoad"); } TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity .getClass()); l.hasNext();) { try { l.next().load(event); } catch (Exception eee) { @@ -332,29 +289,24 @@ } warnOnLoadEntity(entity); TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity.getClass()); l.hasNext();) { try { l.next().load(event); } catch (Exception eee) { if (log.isErrorEnabled()) { - log - .error( - "Can't fireOnPostLoad for entity: " - + entity, eee); + log.error("Can't fireOnPostLoad for entity: " + entity, eee); } } } } - public void fireOnPreUpdate(TopiaContextImplementor context, + public void fireOnPreUpdate(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPreUpdate"); } TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity.getClass()); l.hasNext();) { try { l.next().update(event); } catch (Exception eee) { @@ -363,34 +315,31 @@ } } - public void fireOnPostUpdate(TopiaContextImplementor context, + public void fireOnPostUpdate(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPostUpdate"); } warnOnUpdateEntity(entity); TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity.getClass()); l.hasNext();) { try { l.next().update(event); } catch (Exception eee) { if (log.isErrorEnabled()) { - log.error("Can't fireOnPostUpdate for entity: " + entity, - eee); + log.error("Can't fireOnPostUpdate for entity: " + entity, eee); } } } } - public void fireOnPreDelete(TopiaContextImplementor context, + public void fireOnPreDelete(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPreDelete"); } TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityVetoable> l = entityVetoables.iterator(entity.getClass()); l.hasNext();) { try { l.next().delete(event); } catch (Exception eee) { @@ -399,21 +348,19 @@ } } - public void fireOnPostDelete(TopiaContextImplementor context, + public void fireOnPostDelete(TopiaPersistenceContext context, TopiaEntity entity, Object[] state) { if (log.isDebugEnabled()) { log.debug("fireOnPostDelete"); } warnOnDeleteEntity(entity); TopiaEntityEvent event = new TopiaEntityEvent(context, entity, state); - for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity - .getClass()); l.hasNext();) { + for (Iterator<TopiaEntityListener> l = entityListeners.iterator(entity.getClass()); l.hasNext();) { try { l.next().delete(event); } catch (Exception eee) { if (log.isErrorEnabled()) { - log.error("Can't fireOnPostDelete for entity: " + entity, - eee); + log.error("Can't fireOnPostDelete for entity: " + entity, eee); } } } @@ -465,8 +412,7 @@ } warnOnReadEntity(entity); try { - listeners.fireIndexedPropertyChange(propertyName, index, value, - NO_CHANGE); + listeners.fireIndexedPropertyChange(propertyName, index, value, NO_CHANGE); } catch (Exception eee) { if (log.isErrorEnabled()) { log.error("Can't fireOnPostRead", eee); @@ -502,15 +448,13 @@ } warnOnUpdateEntity(entity); if (propertyChangeListeners.size() > 0) { - PropertyChangeEvent e = new PropertyChangeEvent(entity, - propertyName, oldValue, newValue); + PropertyChangeEvent e = new PropertyChangeEvent(entity, propertyName, oldValue, newValue); for (PropertyChangeListener l : propertyChangeListeners) { try { l.propertyChange(e); } catch (Exception eee) { if (log.isErrorEnabled()) { - log.error("Can't fire property change for: " - + propertyName, eee); + log.error("Can't fire property change for: " + propertyName, eee); } } } @@ -536,8 +480,7 @@ } warnOnUpdateEntity(entity); try { - listeners.fireIndexedPropertyChange(propertyName, index, oldValue, - newValue); + listeners.fireIndexedPropertyChange(propertyName, index, oldValue, newValue); } catch (Exception eee) { if (log.isErrorEnabled()) { log.error("Can't fireOnPostWrite", eee); @@ -546,232 +489,6 @@ } /** - * Object permettant de faire le lien entre les events hibernate et topia - * - * @author poussin <poussin@codelutin.com> - */ - static public class TopiaHibernateEvent implements PreInsertEventListener, - PostInsertEventListener, PreLoadEventListener, - PostLoadEventListener, PreUpdateEventListener, - PostUpdateEventListener, PreDeleteEventListener, - PostDeleteEventListener, SaveOrUpdateEventListener { - - private static final long serialVersionUID = 7303593133642169218L; - - protected TopiaContextImplementor rootContext; - - public TopiaHibernateEvent(TopiaContextImplementor rootContext) { - this.rootContext = rootContext; - } - - /** - * Recherche le context utilisant la session hibernate passe en - * parametre - * - * @param parent le context parent - * @param hibernate la session hibernate que doit utiliser le - * TopiaContext pour etre retourne - * @return le TopiaContext utilisant cette session hibernate ou null si - * aucun TopiaContext n'utilise cette session. - */ - protected TopiaContextImplementor getContext( - TopiaContextImplementor parent, Session hibernate) { - TopiaContextImplementor result = null; - - // FD-20100421 : Ano #546 : no need to copy childContext, the - // {@link #getChildContext()} provides a thread-safe copy to iterate - // on it. -// Set<TopiaContextImplementor> contextChilds = new HashSet<TopiaContextImplementor>(parent.getChildContext()); - for (TopiaContextImplementor context : parent.getChildContext()) { - -// by sletellier 24/09/09 : Fix concurent acces error -// ArrayList<TopiaContextImplementor> children = new ArrayList(parent.getChildContext()); -// for (TopiaContextImplementor context : children) { - try { - if (context.getHibernate() == hibernate) { - result = context; - } else { - // TODO: poussin 20090706 on pourrait ameliorer en ne faisant pas un parcours recursif, en utilisant la liste children (sans doute a transformer en stack) - result = getContext(context, hibernate); - } - if (result != null) { - break; - } - } catch (TopiaException eee) { - if (log.isWarnEnabled()) { - log.warn("Error durant la recherche d'un context pour" - + " lancer un event", eee); - } - } - } - return result; - } - - private void attachContext(Object entity, - TopiaDAOSupplier daoSupplier) { - if (entity instanceof TopiaEntityContextable) { - TopiaEntityContextable topiaEntityContextable = (TopiaEntityContextable) entity; - if (topiaEntityContextable.getTopiaDAOSupplier() == null) { - try { - topiaEntityContextable.setTopiaDAOSupplier(daoSupplier); - } catch (TopiaException eee) { - if (log.isWarnEnabled()) { - log.warn("Impossible d'initialiser le TopiaContext" - + " sur cette entité : " + topiaEntityContextable, - eee); - } - } - } - } - } - - /* Création */ - - @Override - public boolean onPreInsert(PreInsertEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - TopiaEntity entity = (TopiaEntity) event.getEntity(); - context.getFiresSupport().fireOnPreCreate(context, entity, event.getState()); - - // when using composition, hibernate will persist entities by him self - // entity must have an id in this case. - if (StringUtils.isBlank(entity.getTopiaId())) { - if (log.isDebugEnabled()) { - log.debug("Adding topia id on entity " + entity.getClass().getSimpleName()); - } - } - } - - return false; - } - - @Override - public void onPostInsert(PostInsertEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - context.getFiresSupport().fireOnPostCreate(context, - (TopiaEntity) event.getEntity(), event.getState()); - } - } - - /* Chargement */ - - @Override - public void onPreLoad(PreLoadEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - // try { - context.getFiresSupport().fireOnPreLoad(context, - (TopiaEntity) event.getEntity(), event.getState()); - //TODO (thimel 20071213) On commente pour le moment @see(TopiaDAOHibernate#filterElements) - // } catch (TopiaVetoException tve) { - // //On ne fait pas de remontee d'exception - // vers Hibernate pour le preLoad, on va agir au niveau du DAO - // } - } - } - - @Override - public void onPostLoad(PostLoadEvent event) { -// TopiaContextImplementor context = getContext(rootContext, event -// .getSession()); - TopiaDAOSupplier daoSupplier = null; // TODO brendan 30/09/13 Implment - if (daoSupplier != null && event.getEntity() instanceof TopiaEntity) { - attachContext(event.getEntity(), daoSupplier); - TopiaEntity entity = (TopiaEntity)event.getEntity(); - AbstractTopiaDAO<? extends TopiaEntity> dao = (AbstractTopiaDAO)daoSupplier.getDAO(entity.getClass()); - dao.getTopiaFiresSupport().fireOnPostLoad(dao, - (TopiaEntity) event.getEntity(), new Object[]{}); - } - } - - /* Modification */ - - @Override - public boolean onPreUpdate(PreUpdateEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - context.getFiresSupport().fireOnPreUpdate(context, - (TopiaEntity) event.getEntity(), event.getOldState()); - } - return false; - } - - @Override - public void onPostUpdate(PostUpdateEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - context.getFiresSupport().fireOnPostUpdate(context, - (TopiaEntity) event.getEntity(), event.getState()); - } - // FIXME indexation - // if (!(entity instanceof NotIndexable) && context.isIndexEnabled()) { - // context.getIndexEnginImplementor().recordForIndexation(id, event.getState()); - // } - } - - /* Suppression */ - - @Override - public boolean onPreDelete(PreDeleteEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - context.getFiresSupport().fireOnPreDelete(context, - (TopiaEntity) event.getEntity(), - event.getDeletedState()); - } - return false; - } - - @Override - public void onPostDelete(PostDeleteEvent event) { - TopiaContextImplementor context = getContext(rootContext, event - .getSession()); - if (context != null && event.getEntity() instanceof TopiaEntity) { - context.getFiresSupport().fireOnPostDelete(context, - (TopiaEntity) event.getEntity(), - event.getDeletedState()); - } -// FIXME indexation -// if (!(entity instanceof NotIndexable) && context.isIndexEnabled()) { -// context.getIndexEnginImplementor().recordForIndexation(id, null); -// } - } - - @Override - public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { - try { - // this event is called when hibernate try to persist entities - // using cascade (save) - TopiaContextImplementor context = getContext(rootContext, event.getSession()); - // warning, event.getEntity() return null here :( - if (event.getObject() instanceof TopiaEntity) { - TopiaEntity entity = (TopiaEntity)event.getObject(); - if (StringUtils.isBlank(entity.getTopiaId())) { - if (log.isDebugEnabled()) { - log.debug("Adding topiaId into entity " + entity.getClass()); - } - // FIXME echatellier 20130713 : hack to find interface for current entity class - // #newTopiaId only accept interface - Class entityInterface = Class.forName(event.getEntityName().replace("Impl", "")); - String topiaId = context.getTopiaIdFactory().newTopiaId(entityInterface, entity); - entity.setTopiaId(topiaId); - } - } - } catch (ClassNotFoundException ex) { - throw new HibernateException("Can't set id", ex); - } - } - } - - /** * Notify topia context listeners for create schema pre operation * * @param context topia context @@ -852,7 +569,7 @@ * * @param context topia context */ - public void firePreRestoreSchema(TopiaContext context) { + public void firePreRestoreSchema(TopiaPersistenceContext context) { if (log.isDebugEnabled()) { log.debug("firePreRestoreSchema"); } @@ -871,7 +588,7 @@ * * @param context topia context */ - public void firePostRestoreSchema(TopiaContext context) { + public void firePostRestoreSchema(TopiaPersistenceContext context) { if (log.isDebugEnabled()) { log.debug("firePostRestoreSchema"); } Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java (rev 0) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -0,0 +1,270 @@ +package org.nuiton.topia.framework; + +/* + * #%L + * ToPIA :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +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.Session; +import org.hibernate.event.spi.PostDeleteEvent; +import org.hibernate.event.spi.PostDeleteEventListener; +import org.hibernate.event.spi.PostInsertEvent; +import org.hibernate.event.spi.PostInsertEventListener; +import org.hibernate.event.spi.PostLoadEvent; +import org.hibernate.event.spi.PostLoadEventListener; +import org.hibernate.event.spi.PostUpdateEvent; +import org.hibernate.event.spi.PostUpdateEventListener; +import org.hibernate.event.spi.PreDeleteEvent; +import org.hibernate.event.spi.PreDeleteEventListener; +import org.hibernate.event.spi.PreInsertEvent; +import org.hibernate.event.spi.PreInsertEventListener; +import org.hibernate.event.spi.PreLoadEvent; +import org.hibernate.event.spi.PreLoadEventListener; +import org.hibernate.event.spi.PreUpdateEvent; +import org.hibernate.event.spi.PreUpdateEventListener; +import org.hibernate.event.spi.SaveOrUpdateEvent; +import org.hibernate.event.spi.SaveOrUpdateEventListener; +import org.nuiton.topia.TopiaDAOSupplier; +import org.nuiton.topia.TopiaException; +import org.nuiton.topia.persistence.AbstractTopiaDAO; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaEntityContextable; + +/** + * @author Arnaud Thimel <thimel@codelutin.com> + */ +public class TopiaHibernateEventListener implements PreInsertEventListener, PostInsertEventListener, + PreLoadEventListener, PostLoadEventListener, PreUpdateEventListener, PostUpdateEventListener, + PreDeleteEventListener, PostDeleteEventListener, SaveOrUpdateEventListener { + + private static final Log log = LogFactory.getLog(TopiaHibernateEventListener.class); + + private static final long serialVersionUID = -9206039888626756924L; + + protected TopiaContextImplementor rootContext; + + public TopiaHibernateEventListener(TopiaContextImplementor rootContext) { + this.rootContext = rootContext; + } + + /** + * Recherche le context utilisant la session hibernate passe en + * parametre + * + * @param parent le context parent + * @param hibernate la session hibernate que doit utiliser le + * TopiaContext pour etre retourne + * @return le TopiaContext utilisant cette session hibernate ou null si + * aucun TopiaContext n'utilise cette session. + */ + protected TopiaContextImplementor getContext( + TopiaContextImplementor parent, Session hibernate) { + TopiaContextImplementor result = null; + + // FD-20100421 : Ano #546 : no need to copy childContext, the + // {@link #getChildContext()} provides a thread-safe copy to iterate + // on it. +// Set<TopiaContextImplementor> contextChilds = new HashSet<TopiaContextImplementor>(parent.getChildContext()); + if (parent != null) { // TODO AThimel 11/10/13 It should never be null, fix it + for (TopiaContextImplementor context : parent.getChildContext()) { + + // by sletellier 24/09/09 : Fix concurent acces error + // ArrayList<TopiaContextImplementor> children = new ArrayList(parent.getChildContext()); + // for (TopiaContextImplementor context : children) { + try { + if (context.getHibernate() == hibernate) { + result = context; + } else { + // TODO: poussin 20090706 on pourrait ameliorer en ne faisant pas un parcours recursif, en utilisant la liste children (sans doute a transformer en stack) + result = getContext(context, hibernate); + } + if (result != null) { + break; + } + } catch (TopiaException eee) { + if (log.isWarnEnabled()) { + log.warn("Error durant la recherche d'un context pour" + + " lancer un event", eee); + } + } + } + } + return result; + } + + private void attachContext(Object entity, + TopiaDAOSupplier daoSupplier) { + if (entity instanceof TopiaEntityContextable) { + TopiaEntityContextable topiaEntityContextable = (TopiaEntityContextable) entity; + if (topiaEntityContextable.getTopiaDAOSupplier() == null) { + try { + topiaEntityContextable.setTopiaDAOSupplier(daoSupplier); + } catch (TopiaException eee) { + if (log.isWarnEnabled()) { + log.warn("Impossible d'initialiser le TopiaContext" + + " sur cette entité : " + topiaEntityContextable, + eee); + } + } + } + } + } + + /* Création */ + + @Override + public boolean onPreInsert(PreInsertEvent event) { + TopiaContextImplementor context = getContext(rootContext, event.getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + TopiaEntity entity = (TopiaEntity) event.getEntity(); + context.getFiresSupport().fireOnPreCreate(context, entity, event.getState()); + + // when using composition, hibernate will persist entities by him self + // entity must have an id in this case. + if (StringUtils.isBlank(entity.getTopiaId())) { + if (log.isDebugEnabled()) { + log.debug("Adding topia id on entity " + entity.getClass().getSimpleName()); + } + } + } + + return false; + } + + @Override + public void onPostInsert(PostInsertEvent event) { + TopiaContextImplementor context = getContext(rootContext, event + .getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + context.getFiresSupport().fireOnPostCreate(context, (TopiaEntity) event.getEntity(), event.getState()); + } + } + + /* Chargement */ + + @Override + public void onPreLoad(PreLoadEvent event) { + TopiaContextImplementor context = getContext(rootContext, event + .getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + // try { + context.getFiresSupport().fireOnPreLoad(context, (TopiaEntity) event.getEntity(), event.getState()); + //TODO (thimel 20071213) On commente pour le moment @see(TopiaDAOHibernate#filterElements) + // } catch (TopiaVetoException tve) { + // //On ne fait pas de remontee d'exception + // vers Hibernate pour le preLoad, on va agir au niveau du DAO + // } + } + } + + @Override + public void onPostLoad(PostLoadEvent event) { +// TopiaContextImplementor context = getContext(rootContext, event +// .getSession()); + TopiaDAOSupplier daoSupplier = null; // TODO brendan 30/09/13 Implment + if (daoSupplier != null && event.getEntity() instanceof TopiaEntity) { + attachContext(event.getEntity(), daoSupplier); + TopiaEntity entity = (TopiaEntity) event.getEntity(); + AbstractTopiaDAO<? extends TopiaEntity> dao = (AbstractTopiaDAO) daoSupplier.getDAO(entity.getClass()); + dao.getTopiaFiresSupport().fireOnPostLoad(dao, (TopiaEntity) event.getEntity(), new Object[]{}); + } + } + + /* Modification */ + + @Override + public boolean onPreUpdate(PreUpdateEvent event) { + TopiaContextImplementor context = getContext(rootContext, event + .getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + context.getFiresSupport().fireOnPreUpdate(context, (TopiaEntity) event.getEntity(), event.getOldState()); + } + return false; + } + + @Override + public void onPostUpdate(PostUpdateEvent event) { + TopiaContextImplementor context = getContext(rootContext, event + .getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + context.getFiresSupport().fireOnPostUpdate(context, (TopiaEntity) event.getEntity(), event.getState()); + } + // FIXME indexation + // if (!(entity instanceof NotIndexable) && context.isIndexEnabled()) { + // context.getIndexEnginImplementor().recordForIndexation(id, event.getState()); + // } + } + + /* Suppression */ + + @Override + public boolean onPreDelete(PreDeleteEvent event) { + TopiaContextImplementor context = getContext(rootContext, event + .getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + context.getFiresSupport().fireOnPreDelete(context, (TopiaEntity) event.getEntity(), event.getDeletedState()); + } + return false; + } + + @Override + public void onPostDelete(PostDeleteEvent event) { + TopiaContextImplementor context = getContext(rootContext, event + .getSession()); + if (context != null && event.getEntity() instanceof TopiaEntity) { + context.getFiresSupport().fireOnPostDelete(context, (TopiaEntity) event.getEntity(), event.getDeletedState()); + } +// FIXME indexation +// if (!(entity instanceof NotIndexable) && context.isIndexEnabled()) { +// context.getIndexEnginImplementor().recordForIndexation(id, null); +// } + } + + @Override + public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { + try { + // this event is called when hibernate try to persist entities + // using cascade (save) + TopiaContextImplementor context = getContext(rootContext, event.getSession()); + // warning, event.getEntity() return null here :( + if (event.getObject() instanceof TopiaEntity) { + TopiaEntity entity = (TopiaEntity) event.getObject(); + if (StringUtils.isBlank(entity.getTopiaId())) { + if (log.isDebugEnabled()) { + log.debug("Adding topiaId into entity " + entity.getClass()); + } + // FIXME echatellier 20130713 : hack to find interface for current entity class + // #newTopiaId only accept interface + Class entityInterface = Class.forName(event.getEntityName().replace("Impl", "")); + String topiaId = context.getTopiaIdFactory().newTopiaId(entityInterface, entity); + entity.setTopiaId(topiaId); + } + } + } catch (ClassNotFoundException ex) { + throw new HibernateException("Can't set id", ex); + } + } +} Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaHibernateEventListener.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native 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-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -68,7 +68,7 @@ public class TopiaUtil { /** to use log facility, just put in your code: log.info(\"...\"); */ - static private Log log = LogFactory.getLog(TopiaUtil.class); + private static final Log log = LogFactory.getLog(TopiaUtil.class); /** * Permet de récupérer le fichier de propriété ayant le nom passé en @@ -81,7 +81,7 @@ * le fichier devant contenir les propriétés * n'est pas retrouvé. */ - static public Properties getProperties(String pathOrUrl) + public static Properties getProperties(String pathOrUrl) throws TopiaNotFoundException { return getProperties(null, pathOrUrl); } @@ -99,7 +99,7 @@ * le fichier devant contenir les propriétés * n'est pas retrouvé. */ - static public Properties getProperties(Properties parent, String pathOrUrl) + public static Properties getProperties(Properties parent, String pathOrUrl) throws TopiaNotFoundException { Properties result = new RecursiveProperties(parent); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ApplicationContextTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ApplicationContextTransformer.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ApplicationContextTransformer.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -174,7 +174,10 @@ addAnnotation(output, op, Override.class); setOperationBody(op, "" /*{ - return new <%=persistenceContextConcreteName%>(getHibernateProvider(), getTopiaListenableSupport(), getTopiaIdFactory()); + <%=persistenceContextConcreteName%> newContext = new <%=persistenceContextConcreteName%>( + getHibernateProvider(), getTopiaListenableSupport(), getTopiaIdFactory()); + registerPersistenceContext(newContext); + return newContext; }*/ ); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/DAOHelperTransformer.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -39,6 +39,7 @@ import org.nuiton.eugene.models.object.xml.ObjectModelAttributeImpl; import org.nuiton.eugene.models.object.xml.ObjectModelEnumerationImpl; import org.nuiton.topia.TopiaContext; +import org.nuiton.topia.TopiaDAOSupplier; import org.nuiton.topia.TopiaException; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; @@ -183,12 +184,12 @@ // specialized getXXXDao method op = addOperation(daoHelper, "get" + daoClazzName, clazz.getPackageName() + '.' + daoClazzName, ObjectModelJavaModifier.PUBLIC, ObjectModelJavaModifier.STATIC); - addParameter(op, TopiaContext.class, "context"); + addParameter(op, TopiaDAOSupplier.class, "supplier"); addImport(daoHelper, clazz); addException(op, TopiaException.class); setOperationBody(op, "" /*{ - <%=daoClazzName%> result = context.getDAO(<%=clazzName%>.class, <%=daoClazzName%>.class); + <%=daoClazzName%> result = supplier.getDAO(<%=clazzName%>.class, <%=daoClazzName%>.class); return result; }*/ ); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaDatabase.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaDatabase.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaDatabase.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -26,6 +26,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.cfg.Configuration; import org.junit.rules.TestWatcher; import org.junit.runner.Description; @@ -70,8 +71,10 @@ private Properties dbConfiguration; - private TopiaContext rootCtxt; + private TopiaTestTopiaApplicationContext applicationContext; + private Configuration hibernateCfg; + private final String configurationPath; public TopiaDatabase() { @@ -122,7 +125,15 @@ onDbConfigurationCreate(dbConfiguration, testBasedir, dbPath); - rootCtxt = TopiaContextFactory.getContext(dbConfiguration); +// rootCtxt = TopiaContextFactory.getContext(dbConfiguration); + applicationContext = new TopiaTestTopiaApplicationContext(dbConfiguration) { + @Override + protected HibernateProvider getHibernateProvider() { + HibernateProvider provider = super.getHibernateProvider(); + hibernateCfg = provider.getHibernateConfiguration(); + return provider; + } + }; } catch (Exception e) { throw new IllegalStateException( "Could not start db at " + testBasedir, e); @@ -132,16 +143,16 @@ @Override public void finished(Description description) { - if (rootCtxt != null && !rootCtxt.isClosed()) { + if (applicationContext != null && !applicationContext.isClosed()) { try { - rootCtxt.closeContext(); + applicationContext.closeContext(); } catch (TopiaException e) { if (log.isErrorEnabled()) { log.error("Could not close topia root context", e); } } } - rootCtxt = null; + applicationContext = null; dbConfiguration = null; } @@ -149,18 +160,22 @@ return testBasedir; } - public TopiaContext getRootCtxt() { - return rootCtxt; - } - public Properties getDbConfiguration() { return dbConfiguration; } - public TopiaContext beginTransaction() throws TopiaException { - return rootCtxt.beginTransaction(); + public TopiaTestTopiaApplicationContext getApplicationContext() { + return applicationContext; } + public Configuration getHibernateCfg() { + return hibernateCfg; + } + + public TopiaTestTopiaPersistenceContext beginTransaction() throws TopiaException { + return applicationContext.newPersistenceContext(); + } + protected void onDbConfigurationCreate(Properties configuration, File testDir, String dbPath) { Copied: trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaJpaSupportTest.java (from rev 2842, trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaContextFindTest.java) =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaJpaSupportTest.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/TopiaJpaSupportTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -0,0 +1,161 @@ +/* + * #%L + * ToPIA :: Persistence :: Test Compatibility Kit + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2012 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ +package org.nuiton.topia; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.nuiton.topiatest.Address; +import org.nuiton.topiatest.AddressDAO; +import org.nuiton.topiatest.Gender; +import org.nuiton.topiatest.Personne; +import org.nuiton.topiatest.PersonneDAO; + +/** + * Tests the TopiaContext#find|findAll|findUnique methods + * + * @author Arnaud Thimel <thimel@codelutin.com> + */ +public class TopiaJpaSupportTest { + + @Rule + public final TopiaDatabase db = new TopiaDatabase(); + + protected TopiaTestTopiaPersistenceContext persistenceContext; + protected TopiaJpaSupport jpaSupport; + protected AddressDAO addressDAO; + protected PersonneDAO personneDAO; + protected Address address; + + @Before + public void createCompanies() throws TopiaException { + persistenceContext = db.beginTransaction(); + jpaSupport = persistenceContext.jpaSupport; + + personneDAO = persistenceContext.getPersonneDAO(); + addressDAO = persistenceContext.getAddressDAO(); + + address = addressDAO.create( + Address.PROPERTY_ADRESS, "17 rue de la Pote Gellée, 44200 NANTES"); + + personneDAO.create( + Personne.PROPERTY_NAME, "Arnaud", + Personne.PROPERTY_GENDER, Gender.MALE); + personneDAO.create( + Personne.PROPERTY_NAME, "Charlotte", + Personne.PROPERTY_GENDER, Gender.FEMALE); + personneDAO.create( + Personne.PROPERTY_NAME, "Hortense", + Personne.PROPERTY_GENDER, Gender.FEMALE); + persistenceContext.commitTransaction(); + } + + @Test + public void testFindDAO() throws TopiaException { + Assert.assertEquals(3, personneDAO.count()); + + Assert.assertEquals(2, personneDAO.findAllByGender(Gender.FEMALE).size()); + Assert.assertNotNull(personneDAO.findByGender(Gender.FEMALE)); + Assert.assertNotNull(personneDAO.findByGender(Gender.MALE)); + Assert.assertNull(personneDAO.findByGender(null)); + + Assert.assertEquals(0, personneDAO.findAllByName("nobody").size()); + } + + @Test + public void testFindAll() throws TopiaException { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + List females = jpaSupport.findAll(query, "g", Gender.FEMALE); + Assert.assertEquals(2, females.size()); + + List males = jpaSupport.findAll(query, "g", Gender.MALE); + Assert.assertEquals(1, males.size()); + + List all = jpaSupport.findAll("from " + Personne.class.getName()); + Assert.assertEquals(3, all.size()); + + List none = jpaSupport.findAll("from " + Personne.class.getName() + + " where " + Personne.PROPERTY_NAME + "=:pax", "pax", "nobody"); + Assert.assertEquals(0, none.size()); + } + + @Test + public void testFind() throws TopiaException { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + List females = jpaSupport.find(query, 0, 100, "g", Gender.FEMALE); + Assert.assertEquals(2, females.size()); + + females = jpaSupport.find(query, 0, 0, "g", Gender.FEMALE); + Assert.assertEquals(1, females.size()); + Personne charlotte = (Personne)females.get(0); + + females = jpaSupport.find(query, 1, 1, "g", Gender.FEMALE); + Assert.assertEquals(1, females.size()); + Personne hortense = (Personne)females.get(0); + + Assert.assertFalse(hortense.equals(charlotte)); + + // endIndex = -1 not supported in ToPIA 2.6, wait for 3.0 +// females = context.find(query, 0, -1, "g", Gender.FEMALE); +// Assert.assertEquals(2, females.size()); + } + + @Test + public void testFindUnique() throws TopiaException { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + Object male = jpaSupport.findUnique(query, "g", Gender.MALE); + Assert.assertNotNull(male); + + Object none = jpaSupport.findUnique("from " + Personne.class.getName() + + " where " + Personne.PROPERTY_NAME + "=:pax", "pax", "nobody"); + Assert.assertNull(none); + } + + @Test(expected = TopiaException.class) + public void testFindUniqueOutOfBounds() throws TopiaException { + Assert.assertEquals(3, personneDAO.count()); + + String query = "from " + Personne.class.getName() + + " where " + Personne.PROPERTY_GENDER + "=:g"; + + Object female = jpaSupport.findUnique(query, "g", Gender.FEMALE); + Assert.assertNotNull(female); + } + +} Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaConnectionProviderTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -27,11 +27,11 @@ import org.junit.Assert; import org.junit.Rule; import org.junit.Test; -import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import org.nuiton.topia.test.entities.Person; import org.nuiton.topia.test.entities.PersonDAO; import org.nuiton.topiatest.Personne; @@ -122,7 +122,7 @@ } private void doStuffOnDb() throws TopiaException { - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext transaction = db.beginTransaction(); try { PersonDAO dao = TopiaTestDAOHelper.getPersonDAO(transaction); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextReplicateTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextReplicateTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextReplicateTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -31,6 +31,7 @@ import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import org.nuiton.topia.test.entities.Person; import org.nuiton.topia.test.entities.PersonDAO; import org.nuiton.topia.test.entities.Pet; @@ -85,21 +86,19 @@ // "replicateTarget"); // - TopiaContext contextSource = dbSource.getRootCtxt(); - TopiaContext contextTarget = dbTarget.getRootCtxt(); // try { // contextSource = TopiaContextFactory.getContext(configSource); // contextTarget = TopiaContextFactory.getContext(configTarget); - TopiaContext txSource; - TopiaContext txTarget; + TopiaTestTopiaPersistenceContext txSource; + TopiaTestTopiaPersistenceContext txTarget; PersonDAO daoSource, daoTarget; PetDAO petDAOSource, petDAOTarget; Person personSource, personTarget; Pet petSource, petTarget; - txSource = contextSource.beginTransaction(); + txSource = dbSource.beginTransaction(); daoSource = TopiaTestDAOHelper.getPersonDAO(txSource); petDAOSource = TopiaTestDAOHelper.getPetDAO(txSource); @@ -126,7 +125,7 @@ Assert.assertEquals(1, personSource.sizePet()); Assert.assertEquals(petSource, personSource.getPet().iterator().next()); - txTarget = contextTarget.beginTransaction(); + txTarget = dbTarget.beginTransaction(); txSource.replicateEntity(txTarget, petSource); txSource.replicateEntity(txTarget, personSource); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaUtilTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaUtilTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaUtilTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -25,16 +25,16 @@ package org.nuiton.topia.framework; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.hibernate.cfg.Configuration; import org.junit.Rule; import org.junit.Test; -import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.test.entities.PersonImpl; import org.nuiton.topiatest.Personne; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -92,24 +92,22 @@ @Test(expected = IllegalArgumentException.class) public void testIsSchemaExistFailed() throws Exception { - TopiaUtil.isSchemaExist(db.getRootCtxt(), "fake"); + TopiaUtil.isSchemaExist(db.getHibernateCfg(), "fake"); } @Test public void testIsSchemaExist() throws Exception { - TopiaContext rootContext = db.getRootCtxt(); - boolean actual = TopiaUtil.isSchemaExist(rootContext, - PersonImpl.class.getName()); - // FIXME echatellier 20130315 ce test fail depuis probablement a cause - // de hibernate.hbm2ddl.auto=update, à confirmer... - assertTrue(actual); - TopiaContext tx = rootContext.beginTransaction(); + String personClassName = PersonImpl.class.getName(); + Configuration hibernateCfg = db.getHibernateCfg(); - tx.createSchema(); - actual = TopiaUtil.isSchemaExist(rootContext, PersonImpl.class.getName()); + // First, test before DB is created, the table should not exist + assertFalse(TopiaUtil.isSchemaExist(hibernateCfg, personClassName)); - assertTrue(actual); + // Create schema + db.getApplicationContext().createSchema(); + // Now table should exist + assertTrue(TopiaUtil.isSchemaExist(hibernateCfg, personClassName)); } } Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/generator/TopiaTestCase.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/generator/TopiaTestCase.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/generator/TopiaTestCase.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -34,6 +34,7 @@ import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import org.nuiton.topiatest.Company; import org.nuiton.topiatest.CompanyDAO; import org.nuiton.topiatest.Department; @@ -121,10 +122,10 @@ } // try { - TopiaContext newContext = db.beginTransaction(); + TopiaTestTopiaPersistenceContext newContext = db.beginTransaction(); - CompanyDAO companyDAO = TopiaTestDAOHelper.getCompanyDAO(newContext); - DepartmentDAO departmentDAO = TopiaTestDAOHelper.getDepartmentDAO(newContext); + CompanyDAO companyDAO = newContext.getCompanyDAO(); + DepartmentDAO departmentDAO = newContext.getDepartmentDAO(); Company company = companyDAO.create(); company.setName("Ma société"); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/EntityVisitorExportXmlTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/EntityVisitorExportXmlTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/EntityVisitorExportXmlTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -30,10 +30,9 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import org.nuiton.topiatest.Address; import org.nuiton.topiatest.AddressDAO; import org.nuiton.topiatest.Company; @@ -70,17 +69,17 @@ @Before public void setUp() throws TopiaException { - TopiaContext newContext = db.beginTransaction(); + TopiaTestTopiaPersistenceContext newContext = db.beginTransaction(); try { // company - CompanyDAO companyDAO = TopiaTestDAOHelper.getCompanyDAO(newContext); + CompanyDAO companyDAO = newContext.getCompanyDAO(); Company clCompany = companyDAO.create(Company.PROPERTY_NAME, "CodeLutin"); // employe - EmployeDAO employeDAO = TopiaTestDAOHelper.getEmployeDAO(newContext); + EmployeDAO employeDAO = newContext.getEmployeDAO(); Employe empl1 = employeDAO.create(Employe.PROPERTY_NAME, "boss", Employe.PROPERTY_SALARY, 30000); - AddressDAO adressDAO = TopiaTestDAOHelper.getAddressDAO(newContext); + AddressDAO adressDAO = newContext.getAddressDAO(); Address addr1 = adressDAO.create(Address.PROPERTY_CITY, "Nantes", Address.PROPERTY_ADRESS, "12 Avenue Jules Vernes"); empl1.setAddress(addr1); @@ -89,7 +88,7 @@ empl2.setAddress(addr2); // departement - DepartmentDAO departmentDAO = TopiaTestDAOHelper.getDepartmentDAO(newContext); + DepartmentDAO departmentDAO = newContext.getDepartmentDAO(); Department depComm = departmentDAO.create(Department.PROPERTY_NAME, "Commercial"); depComm.setLeader(empl1); @@ -116,9 +115,9 @@ @Test public void testExportXMLDepth() throws TopiaException { - TopiaContext context = db.beginTransaction(); + TopiaTestTopiaPersistenceContext context = db.beginTransaction(); - CompanyDAO companyDAO = TopiaTestDAOHelper.getCompanyDAO(context); + CompanyDAO companyDAO = context.getCompanyDAO(); Company clCompany = companyDAO.findByName("CodeLutin"); EntityVisitor delegateVisitor = new ExportXMLVisitor(); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/NaturalIdTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -34,7 +34,10 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; +import org.nuiton.topia.TopiaPersistenceContext; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; +import org.nuiton.topia.TopiaTransaction; import org.nuiton.topiatest.NaturalizedEntity; import org.nuiton.topiatest.NaturalizedEntityDAO; @@ -59,36 +62,36 @@ @Test public void testCreateSucessfull() throws Exception { log.debug("Test naturalId : create succesfull"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext persistenceContext = db.beginTransaction(); NaturalizedEntityDAO dao = - TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); + persistenceContext.getNaturalizedEntityDAO(); // No exception will be thrown with the two properties dao.createByNaturalId(5, "str"); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); // No exception will only the need property dao.createByNotNull(3); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); // No exception will only the need property dao.create(NaturalizedEntity.PROPERTY_NATURAL_ID_NOT_NULL, 3); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); } @Test public void testCreateFailed() throws Exception { log.debug("Test naturalId : create failed"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext persistenceContext = db.beginTransaction(); NaturalizedEntityDAO dao = - TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); + persistenceContext.getNaturalizedEntityDAO(); // Exception will be throw try { dao.create(); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); // Note : this is possible to create an empty entity if the type // is primitive like 'int' which have a default value of '0' @@ -106,19 +109,19 @@ public void testUpdateFailed() throws Exception { log.debug("Test naturalId : update failed"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext persistenceContext = db.beginTransaction(); NaturalizedEntityDAO dao = - TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); + persistenceContext.getNaturalizedEntityDAO(); NaturalizedEntity entity = dao.createByNaturalId(5, "str"); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); // Exception will be throw : not allowed to modify a naturalId property try { entity.setNaturalIdNotNull(8); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); } catch (TopiaException eee) { Assert.assertEquals("org.hibernate.HibernateException", eee.getCause().getClass().getName()); @@ -128,14 +131,15 @@ @Test public void testFindByNaturalId() throws Exception { log.debug("Test naturalId : findByNaturalId"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext persistenceContext = db.beginTransaction(); + NaturalizedEntityDAO dao = - TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); + persistenceContext.getNaturalizedEntityDAO(); NaturalizedEntity entity = dao.createByNaturalId(5, "str"); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); NaturalizedEntity result = dao.findByNaturalId(5, "str"); @@ -145,13 +149,14 @@ @Test public void testExistNaturalId() throws Exception { log.debug("Test naturalId : existNaturalId"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext persistenceContext = db.beginTransaction(); + NaturalizedEntityDAO dao = - TopiaTestDAOHelper.getNaturalizedEntityDAO(transaction); + persistenceContext.getNaturalizedEntityDAO(); dao.createByNaturalId(5, "str"); - transaction.commitTransaction(); + persistenceContext.commitTransaction(); boolean result = dao.existByNaturalId(5, "str"); Deleted: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaContextFindTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaContextFindTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaContextFindTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -1,162 +0,0 @@ -/* - * #%L - * ToPIA :: Persistence :: Test Compatibility Kit - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2012 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ -package org.nuiton.topia.persistence; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.nuiton.topia.TopiaContext; -import org.nuiton.topia.TopiaDatabase; -import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaTestDAOHelper; -import org.nuiton.topiatest.Address; -import org.nuiton.topiatest.AddressDAO; -import org.nuiton.topiatest.Gender; -import org.nuiton.topiatest.Personne; -import org.nuiton.topiatest.PersonneDAO; - -import java.util.List; - -/** - * Tests the TopiaContext#find|findAll|findUnique methods - * - * @author Arnaud Thimel <thimel@codelutin.com> - */ -public class TopiaContextFindTest { - - @Rule - public final TopiaDatabase db = new TopiaDatabase(); - - protected TopiaContext context; - protected AddressDAO addressDAO; - protected PersonneDAO personneDAO; - protected Address address; - - @Before - public void createCompanies() throws TopiaException { - context = db.beginTransaction(); - personneDAO = TopiaTestDAOHelper.getPersonneDAO(context); - addressDAO = TopiaTestDAOHelper.getAddressDAO(context); - - address = addressDAO.create( - Address.PROPERTY_ADRESS, "17 rue de la Pote Gellée, 44200 NANTES"); - - personneDAO.create( - Personne.PROPERTY_NAME, "Arnaud", - Personne.PROPERTY_GENDER, Gender.MALE); - personneDAO.create( - Personne.PROPERTY_NAME, "Charlotte", - Personne.PROPERTY_GENDER, Gender.FEMALE); - personneDAO.create( - Personne.PROPERTY_NAME, "Hortense", - Personne.PROPERTY_GENDER, Gender.FEMALE); - context.commitTransaction(); - } - - @Test - public void testFindDAO() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); - - Assert.assertEquals(2, personneDAO.findAllByGender(Gender.FEMALE).size()); - Assert.assertNotNull(personneDAO.findByGender(Gender.FEMALE)); - Assert.assertNotNull(personneDAO.findByGender(Gender.MALE)); - Assert.assertNull(personneDAO.findByGender(null)); - - Assert.assertEquals(0, personneDAO.findAllByName("nobody").size()); - } - - @Test - public void testFindAll() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); - - String query = "from " + Personne.class.getName() + - " where " + Personne.PROPERTY_GENDER + "=:g"; - - List females = context.findAll(query, "g", Gender.FEMALE); - Assert.assertEquals(2, females.size()); - - List males = context.findAll(query, "g", Gender.MALE); - Assert.assertEquals(1, males.size()); - - List all = context.findAll("from " + Personne.class.getName()); - Assert.assertEquals(3, all.size()); - - List none = context.findAll("from " + Personne.class.getName() + - " where " + Personne.PROPERTY_NAME + "=:pax", "pax", "nobody"); - Assert.assertEquals(0, none.size()); - } - - @Test - public void testFind() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); - - String query = "from " + Personne.class.getName() + - " where " + Personne.PROPERTY_GENDER + "=:g"; - - List females = context.find(query, 0, 100, "g", Gender.FEMALE); - Assert.assertEquals(2, females.size()); - - females = context.find(query, 0, 0, "g", Gender.FEMALE); - Assert.assertEquals(1, females.size()); - Personne charlotte = (Personne)females.get(0); - - females = context.find(query, 1, 1, "g", Gender.FEMALE); - Assert.assertEquals(1, females.size()); - Personne hortense = (Personne)females.get(0); - - Assert.assertFalse(hortense.equals(charlotte)); - - // endIndex = -1 not supported in ToPIA 2.6, wait for 3.0 -// females = context.find(query, 0, -1, "g", Gender.FEMALE); -// Assert.assertEquals(2, females.size()); - } - - @Test - public void testFindUnique() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); - - String query = "from " + Personne.class.getName() + - " where " + Personne.PROPERTY_GENDER + "=:g"; - - Object male = context.findUnique(query, "g", Gender.MALE); - Assert.assertNotNull(male); - - Object none = context.findUnique("from " + Personne.class.getName() + - " where " + Personne.PROPERTY_NAME + "=:pax", "pax", "nobody"); - Assert.assertNull(none); - } - - @Test(expected = TopiaException.class) - public void testFindUniqueOutOfBounds() throws TopiaException { - Assert.assertEquals(3, personneDAO.count()); - - String query = "from " + Personne.class.getName() + - " where " + Personne.PROPERTY_GENDER + "=:g"; - - Object female = context.findUnique(query, "g", Gender.FEMALE); - Assert.assertNotNull(female); - } - -} Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaDAOTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaDAOTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/TopiaDAOTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -31,10 +31,9 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import org.nuiton.topia.test.entities.Person; import org.nuiton.topia.test.entities.PersonDAO; @@ -54,7 +53,7 @@ @Rule public final TopiaDatabase db = new TopiaDatabase(); - protected TopiaContext context; + protected TopiaTestTopiaPersistenceContext context; protected PersonDAO dao; @@ -62,8 +61,7 @@ public void setup() throws TopiaException { context = db.beginTransaction(); - - dao = TopiaTestDAOHelper.getPersonDAO(context); + dao = context.getPersonDAO(); } /** Modified: trunk/topia-persistence/src/test/java/org/nuiton/topia/test/ano1882/DAOAbstractTransformerTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/test/ano1882/DAOAbstractTransformerTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/test/ano1882/DAOAbstractTransformerTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -29,6 +29,7 @@ import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import java.util.Arrays; @@ -39,7 +40,7 @@ @Test public void testAno1882() throws Exception { - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext transaction = db.beginTransaction(); FrenchCompanyDAO dao = TopiaTestDAOHelper.getFrenchCompanyDAO(transaction); SIRETDAO siretDAO = TopiaTestDAOHelper.getSIRETDAO(transaction); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topiatest/EnumTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -31,6 +31,7 @@ import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; /** * Test the support of possibility to have an attribute of type enumeration @@ -51,7 +52,7 @@ */ @Test public void storeEntityWithEnumValue() throws TopiaException { - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext transaction = db.beginTransaction(); PersonneDAO dao = TopiaTestDAOHelper.getPersonneDAO(transaction); Personne personne = new PersonneImpl(); Modified: trunk/topia-persistence/src/test/java/org/nuiton/topiatest/deletetest/DeleteEntityTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topiatest/deletetest/DeleteEntityTest.java 2013-10-11 16:53:04 UTC (rev 2842) +++ trunk/topia-persistence/src/test/java/org/nuiton/topiatest/deletetest/DeleteEntityTest.java 2013-10-11 22:40:03 UTC (rev 2843) @@ -47,6 +47,7 @@ import org.nuiton.topia.TopiaDatabase; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaTestDAOHelper; +import org.nuiton.topia.TopiaTestTopiaPersistenceContext; import org.nuiton.topiatest.Gender; import org.nuiton.topiatest.Personne; import org.nuiton.topiatest.PersonneDAO; @@ -81,7 +82,7 @@ public void testDeleteEntityWithInheritance() throws TopiaException { log.debug("START TEST : testDeleteEntityWithInheritance"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext transaction = db.beginTransaction(); log.debug("DAO : PersonneDAO"); PersonneDAO dao = TopiaTestDAOHelper.getPersonneDAO(transaction); @@ -132,7 +133,7 @@ public void testDeleteEntityWithManyToManyRelation() throws TopiaException { log.debug("START TEST : testDeleteEntityWithManyToManyRelation"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext transaction = db.beginTransaction(); PersonneDAO dao = TopiaTestDAOHelper.getPersonneDAO(transaction); @@ -183,7 +184,7 @@ public void testIsPersisted() { log.debug("START TEST : testIsPersisted"); - TopiaContext transaction = db.beginTransaction(); + TopiaTestTopiaPersistenceContext transaction = db.beginTransaction(); PersonneDAO dao = TopiaTestDAOHelper.getPersonneDAO(transaction);
participants (1)
-
athimel@users.nuiton.org