Author: athimel Date: 2013-11-28 09:39:47 +0100 (Thu, 28 Nov 2013) New Revision: 2901 Url: http://nuiton.org/projects/topia/repository/revisions/2901 Log: refs #2923 Extract the cache functionnality from TopiaContextFactory. New class is TopiaApplicationContextCache Added: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaApplicationContextCacheTest.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaApplicationContextCache.java Removed: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaContextFactoryTest.java Modified: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TestHelper.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContextFactory.java trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationOperationTest.java trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplAllTest.java trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplTest.java Modified: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TestHelper.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TestHelper.java 2013-11-28 00:43:28 UTC (rev 2900) +++ trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TestHelper.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -30,6 +30,7 @@ import org.hibernate.cfg.Environment; import org.junit.Ignore; import org.nuiton.topia.AbstractTopiaApplicationContext; +import org.nuiton.topia.TopiaApplicationContextCache; import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaNotFoundException; import org.nuiton.util.FileUtil; @@ -117,7 +118,7 @@ testDirectory, dbPropertiesPath, dbname); - return TopiaContextFactory.getContext(configuration, CREATE_TOPIA_TEST_CONTEXT); + return TopiaApplicationContextCache.getContext(configuration, CREATE_TOPIA_TEST_CONTEXT); } public static Properties initTopiaContextConfiguration(File testDirectory, Copied: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaApplicationContextCacheTest.java (from rev 2899, trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaContextFactoryTest.java) =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaApplicationContextCacheTest.java (rev 0) +++ trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaApplicationContextCacheTest.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -0,0 +1,205 @@ +/* + * #%L + * ToPIA :: Persistence + * + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2010 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.it.legacy; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.nuiton.topia.AbstractTopiaApplicationContext; +import org.nuiton.topia.TopiaApplicationContextCache; +import org.nuiton.topia.junit.ConfigurationHelper; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import com.google.common.base.Function; + +/** + * Created: 8 mai 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class TopiaApplicationContextCacheTest { + + private static final Log log = + LogFactory.getLog(TopiaApplicationContextCacheTest.class); + + protected static final Function<Properties,AbstractTopiaApplicationContext> CREATE_TOPIA_TEST_CONTEXT = new Function<Properties, AbstractTopiaApplicationContext>() { + @Override + public AbstractTopiaApplicationContext apply(Properties input) { + return new TopiaTestTopiaApplicationContext(input); + } + }; + + protected static Map<Properties, AbstractTopiaApplicationContext> contextCache; + + protected static File testBasedir; + + protected Properties properties; + + @BeforeClass + public static void init() throws IOException, IllegalAccessException { + + testBasedir = ConfigurationHelper.getTestSpecificDirectory(TopiaApplicationContextCacheTest.class, "dummy"); + Field field = FieldUtils.getField(TopiaApplicationContextCache.class, "contextCache", true); + contextCache = (Map<Properties, AbstractTopiaApplicationContext>) field.get(null); + } + + @Before + public void setUp() throws Exception { + properties = new Properties(); + properties.setProperty("prop1", "value1"); + properties.setProperty("prop2", "value2"); + contextCache.clear(); + } + + @Test + public void testGetRegisteredContextUrls() throws Exception { + log.debug("## testGetRegisteredContextUrls"); + + /** PREPARE DATA **/ + String databaseName = "h2data-testGetContextByProperties"; + File dbDirectory = new File(testBasedir, databaseName); + String url = "jdbc:h2:file:" + dbDirectory; + properties.setProperty("hibernate.connection.url", url); + + TopiaTestTopiaApplicationContext test = new TopiaTestTopiaApplicationContext(properties); + contextCache.put(properties, test); + + /** EXEC METHOD **/ + List<String> result = TopiaApplicationContextCache.getRegisteredContextUrls(); + Assert.assertEquals(1, result.size()); + Assert.assertEquals(url, result.get(0)); + } + + @Test + public void testRemoveContext() throws Exception { + log.debug("## testRemoveContext"); + + /** PREPARE DATA **/ + TopiaTestTopiaApplicationContext test = new TopiaTestTopiaApplicationContext(properties); + contextCache.put(properties, test); + + /** EXEC METHOD **/ + TopiaApplicationContextCache.removeContext(test); + Assert.assertEquals(0, contextCache.size()); + } + + //@Test + + public void testGetContext() throws Exception { + // TODO-fdesbois-20100508 : only used TopiaUtil.getProperties, need tests for this method + } + + @Test + public void testGetContextByProperties() throws Exception { + log.debug("## testGetContextByProperties"); + + /** PREPARE DATA **/ + Properties propertiesParent = new Properties(properties); + propertiesParent.setProperty("prop3", "value3"); + + Properties propertiesAll = new Properties(); + propertiesAll.setProperty("prop1", "value1"); + propertiesAll.setProperty("prop2", "value2"); + propertiesAll.setProperty("prop3", "value3"); + + /** EXEC METHOD **/ + + log.info("test 0 : add null properties"); + try { + TopiaApplicationContextCache.getContext(null, CREATE_TOPIA_TEST_CONTEXT); + } catch (Exception eee) { + Assert.assertEquals(NullPointerException.class, eee.getClass()); + } + + log.info("test 1 : add new properties, will instantiate a new" + + " TopiaContext"); + AbstractTopiaApplicationContext test1 = TopiaApplicationContextCache.getContext(propertiesParent, CREATE_TOPIA_TEST_CONTEXT); + Assert.assertNotNull(test1); + Assert.assertEquals(1, contextCache.size()); + + log.info("test 2 : with same properties, will retrieve existing" + + " TopiaContext"); + AbstractTopiaApplicationContext test2 = TopiaApplicationContextCache.getContext(propertiesParent, CREATE_TOPIA_TEST_CONTEXT); + Assert.assertEquals(test1, test2); + Assert.assertEquals(1, contextCache.size()); + + log.info("test 3 : use other properties, will instantiate a different" + + "TopiaContext"); + AbstractTopiaApplicationContext test3 = TopiaApplicationContextCache.getContext(properties, CREATE_TOPIA_TEST_CONTEXT); + log.debug("cache size : " + contextCache.size()); + log.debug("result : " + test1); + log.debug("result3 : " + test3); + Assert.assertNotSame(test1, test3); + Assert.assertEquals(2, contextCache.size()); + + log.info("test 4 : use other properties but equivalent to existing " + + "TopiaContext"); + // Test flating of properties + AbstractTopiaApplicationContext test4 = TopiaApplicationContextCache.getContext(propertiesAll, CREATE_TOPIA_TEST_CONTEXT); + Assert.assertEquals(test1, test4); + Assert.assertEquals(2, contextCache.size()); + + log.info("test5a : reinstantiate new TopiaContext after one is closed."); + // TEST + // Strange behavior the closed flag of context stay true if + // hibernateFactory is not loaded from real properties +// test1.closeContext(); +// Assert.assertTrue(test1.isClosed()); + + // Add properties for Hibernate to have real opened topiaContext + String databaseName = "h2data-testGetContextByPropertie"; + File f = new File(testBasedir, databaseName); + + properties.setProperty("hibernate.connection.username", "sa"); + properties.setProperty("hibernate.connection.password", ""); + properties.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); + properties.setProperty("hibernate.connection.url", + "jdbc:h2:file:" + f.getAbsolutePath()); + + + AbstractTopiaApplicationContext test5 = TopiaApplicationContextCache.getContext(properties, CREATE_TOPIA_TEST_CONTEXT); + Assert.assertNotSame(test1, test5); + Assert.assertEquals(3, contextCache.size()); + + log.info("test5b : beginTransaction to properly close the context"); + test5.newPersistenceContext(); + test5.closeContext(); + + AbstractTopiaApplicationContext test5b = TopiaApplicationContextCache.getContext(properties, CREATE_TOPIA_TEST_CONTEXT); + Assert.assertNotSame(test5, test5b); + Assert.assertEquals(3, contextCache.size()); + } +} Deleted: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaContextFactoryTest.java =================================================================== --- trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaContextFactoryTest.java 2013-11-28 00:43:28 UTC (rev 2900) +++ trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/TopiaContextFactoryTest.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -1,205 +0,0 @@ -/* - * #%L - * ToPIA :: Persistence - * - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2010 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.it.legacy; - -import org.apache.commons.lang3.reflect.FieldUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.nuiton.topia.AbstractTopiaApplicationContext; -import org.nuiton.topia.TopiaContextFactory; -import org.nuiton.topia.junit.ConfigurationHelper; - -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import com.google.common.base.Function; - -/** - * Created: 8 mai 2010 - * - * @author fdesbois <fdesbois@codelutin.com> - * @version $Id$ - */ -public class TopiaContextFactoryTest { - - private static final Log log = - LogFactory.getLog(TopiaContextFactoryTest.class); - - protected static final Function<Properties,AbstractTopiaApplicationContext> CREATE_TOPIA_TEST_CONTEXT = new Function<Properties, AbstractTopiaApplicationContext>() { - @Override - public AbstractTopiaApplicationContext apply(Properties input) { - return new TopiaTestTopiaApplicationContext(input); - } - }; - - protected static Map<Properties, AbstractTopiaApplicationContext> contextCache; - - protected static File testBasedir; - - protected Properties properties; - - @BeforeClass - public static void init() throws IOException, IllegalAccessException { - - testBasedir = ConfigurationHelper.getTestSpecificDirectory(TopiaContextFactoryTest.class, "dummy"); - Field field = FieldUtils.getField(TopiaContextFactory.class, "contextCache", true); - contextCache = (Map<Properties, AbstractTopiaApplicationContext>) field.get(null); - } - - @Before - public void setUp() throws Exception { - properties = new Properties(); - properties.setProperty("prop1", "value1"); - properties.setProperty("prop2", "value2"); - contextCache.clear(); - } - - @Test - public void testGetContextOpened() throws Exception { - log.debug("## testGetContextOpened"); - - /** PREPARE DATA **/ - String databaseName = "h2data-testGetContextByProperties"; - File dbDirectory = new File(testBasedir, databaseName); - String url = "jdbc:h2:file:" + dbDirectory; - properties.setProperty("hibernate.connection.url", url); - - TopiaTestTopiaApplicationContext test = new TopiaTestTopiaApplicationContext(properties); - contextCache.put(properties, test); - - /** EXEC METHOD **/ - List<String> result = TopiaContextFactory.getContextOpened(); - Assert.assertEquals(1, result.size()); - Assert.assertEquals(url, result.get(0)); - } - - @Test - public void testRemoveContext() throws Exception { - log.debug("## testRemoveContext"); - - /** PREPARE DATA **/ - TopiaTestTopiaApplicationContext test = new TopiaTestTopiaApplicationContext(properties); - contextCache.put(properties, test); - - /** EXEC METHOD **/ - TopiaContextFactory.removeContext(test); - Assert.assertEquals(0, contextCache.size()); - } - - //@Test - - public void testGetContext() throws Exception { - // TODO-fdesbois-20100508 : only used TopiaUtil.getProperties, need tests for this method - } - - @Test - public void testGetContextByProperties() throws Exception { - log.debug("## testGetContextByProperties"); - - /** PREPARE DATA **/ - Properties propertiesParent = new Properties(properties); - propertiesParent.setProperty("prop3", "value3"); - - Properties propertiesAll = new Properties(); - propertiesAll.setProperty("prop1", "value1"); - propertiesAll.setProperty("prop2", "value2"); - propertiesAll.setProperty("prop3", "value3"); - - /** EXEC METHOD **/ - - log.info("test 0 : add null properties"); - try { - TopiaContextFactory.getContext(null, CREATE_TOPIA_TEST_CONTEXT); - } catch (Exception eee) { - Assert.assertEquals(NullPointerException.class, eee.getClass()); - } - - log.info("test 1 : add new properties, will instantiate a new" + - " TopiaContext"); - AbstractTopiaApplicationContext test1 = TopiaContextFactory.getContext(propertiesParent, CREATE_TOPIA_TEST_CONTEXT); - Assert.assertNotNull(test1); - Assert.assertEquals(1, contextCache.size()); - - log.info("test 2 : with same properties, will retrieve existing" + - " TopiaContext"); - AbstractTopiaApplicationContext test2 = TopiaContextFactory.getContext(propertiesParent, CREATE_TOPIA_TEST_CONTEXT); - Assert.assertEquals(test1, test2); - Assert.assertEquals(1, contextCache.size()); - - log.info("test 3 : use other properties, will instantiate a different" + - "TopiaContext"); - AbstractTopiaApplicationContext test3 = TopiaContextFactory.getContext(properties, CREATE_TOPIA_TEST_CONTEXT); - log.debug("cache size : " + contextCache.size()); - log.debug("result : " + test1); - log.debug("result3 : " + test3); - Assert.assertNotSame(test1, test3); - Assert.assertEquals(2, contextCache.size()); - - log.info("test 4 : use other properties but equivalent to existing " + - "TopiaContext"); - // Test flating of properties - AbstractTopiaApplicationContext test4 = TopiaContextFactory.getContext(propertiesAll, CREATE_TOPIA_TEST_CONTEXT); - Assert.assertEquals(test1, test4); - Assert.assertEquals(2, contextCache.size()); - - log.info("test5a : reinstantiate new TopiaContext after one is closed."); - // TEST - // Strange behavior the closed flag of context stay true if - // hibernateFactory is not loaded from real properties -// test1.closeContext(); -// Assert.assertTrue(test1.isClosed()); - - // Add properties for Hibernate to have real opened topiaContext - String databaseName = "h2data-testGetContextByPropertie"; - File f = new File(testBasedir, databaseName); - - properties.setProperty("hibernate.connection.username", "sa"); - properties.setProperty("hibernate.connection.password", ""); - properties.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); - properties.setProperty("hibernate.connection.url", - "jdbc:h2:file:" + f.getAbsolutePath()); - - - AbstractTopiaApplicationContext test5 = TopiaContextFactory.getContext(properties, CREATE_TOPIA_TEST_CONTEXT); - Assert.assertNotSame(test1, test5); - Assert.assertEquals(3, contextCache.size()); - - log.info("test5b : beginTransaction to properly close the context"); - test5.newPersistenceContext(); - test5.closeContext(); - - AbstractTopiaApplicationContext test5b = TopiaContextFactory.getContext(properties, CREATE_TOPIA_TEST_CONTEXT); - Assert.assertNotSame(test5, test5b); - Assert.assertEquals(3, contextCache.size()); - } -} Added: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaApplicationContextCache.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaApplicationContextCache.java (rev 0) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaApplicationContextCache.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -0,0 +1,133 @@ +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 java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.apache.commons.collections.map.AbstractReferenceMap; +import org.apache.commons.collections.map.ReferenceMap; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; + +/** + * This class will provide a TopiaApplicationContext cache. Its usage is not necessary, contexts can be directly created + * outside of this cache, then the cache will not contain any reference to the created ApplicationContexts. + * <p/> + * This class is 'inspired' from the TopiaContextFactory of ToPIA 2.x + * + * @author Arnaud Thimel <thimel@codelutin.com> + * @since 3.0 + */ +public class TopiaApplicationContextCache { + + private static final Log log = LogFactory.getLog(TopiaApplicationContextCache.class); + + /** + * Cache that contains all some already registered caches + */ + protected static Map<Properties, AbstractTopiaApplicationContext> contextCache = + new ReferenceMap(AbstractReferenceMap.HARD, + AbstractReferenceMap.SOFT); + + /** + * Static method that can provide an ApplicationContext. If the found context is closed, or if it does not exist, a + * new one is created using the given Function<Properties, C>. + * + * @param <C> the type of TopiaApplicationContext you expect + * @param config the configuration of the context + * @param createContextFunction the function that will be in charge of the context creation. It might not be used + * inside the method if the context is found and still opened + * @return an opened instance of XyzTopiaApplicationContext + * @throws TopiaNotFoundException if any pb + */ + public static <C extends AbstractTopiaApplicationContext> C getContext( + Properties config, Function<Properties, C> createContextFunction) + throws TopiaNotFoundException { + // Put all properties from a hierarchy in the current properties object. + // Resolve problem with hibernate which used iterator to get properties + // and so only values from the current properties object and not all + // hierarchy + Properties cloned = new Properties(); + for (String key : config.stringPropertyNames()) { + cloned.setProperty(key, config.getProperty(key)); + } + C result = (C) contextCache.get(cloned); + if (result == null || result.isClosed()) { + if (createContextFunction == null) { + throw new TopiaException( + "Function<Properties, AbstractTopiaApplicationContext> is required to create context"); + } else { + result = createContextFunction.apply(cloned); + } + if (log.isDebugEnabled()) { + log.debug("New context created : " + result); + } + contextCache.put(cloned, result); + } else if (log.isDebugEnabled()) { + log.debug("Context found : " + result); + } + return result; + } + + /** + * Method to get the list of contexts in memory (each context is identified by its URL). + * <p/> + * To be used for debugging purpose only. + * + * @return a list of contexts URLs + */ + public static List<String> getRegisteredContextUrls() { + List<String> result = Lists.newArrayList(); + for (Properties e : contextCache.keySet()) { + result.add(e.getProperty(TopiaContextFactory.CONFIG_URL)); + } + return result; + } + + /** + * Remove the given TopiaApplicationContext from the registered ones + * + * @param context the context instance to remove + */ + public static void removeContext(AbstractTopiaApplicationContext context) { + + Iterator<AbstractTopiaApplicationContext> it = contextCache.values().iterator(); + + while (it.hasNext()) { + AbstractTopiaApplicationContext curr = it.next(); + if (curr == context) { + it.remove(); + break; + } + } + } + +} Property changes on: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaApplicationContextCache.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: svn:eol-style + native Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContextFactory.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContextFactory.java 2013-11-28 00:43:28 UTC (rev 2900) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaContextFactory.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -58,11 +58,6 @@ private static final String DEFAULT_CONFIG_PROPERTIES = "TopiaContextImpl.properties"; - /** Cache contenant tous les contexts deja créé. */ - protected static Map<Properties, AbstractTopiaApplicationContext> contextCache = - new ReferenceMap(AbstractReferenceMap.HARD, - AbstractReferenceMap.SOFT); - public final static String CONFIG_DEFAULT_SCHEMA = Environment.DEFAULT_SCHEMA; public final static String CONFIG_USER = Environment.USER; @@ -111,103 +106,4 @@ public final static String CONFIG_PERSISTENCE_TOPIA_ID_FACTORY_CLASS_NAME = "topia.persistence.topiaIdFactoryClassName"; - /** - * Permet de connaitre la liste des contexts encore en memoire, utile pour - * du debuggage. - * - * @return la liste des urls de connexion - */ - public static List<String> getContextOpened() { - List<String> result = new ArrayList<String>(); - for (Properties e : contextCache.keySet()) { - // Useless test : will never happened that e.getValue() is null, - // not allowed for {@link AbstractReferenceMap#SOFT}. -// if (e.getValue() != null) { - result.add(e.getProperty(CONFIG_URL)); -// } - } - return result; - } - - /** - * Used when TopiaContext root is closed - * - * @param context closed - */ - public static void removeContext(AbstractTopiaApplicationContext context) { -// Properties key = null; -// for (Entry<Properties, AbstractTopiaContext> e : contextCache.entrySet()) { -// if (e.getValue() == context) { -// key = e.getKey(); -// break; -// } -// } -// if (key != null) { -// contextCache.remove(key); -// } - - // Replaced by more powerful algorithm using iterator to remove context - - Iterator<AbstractTopiaApplicationContext> it = contextCache.values().iterator(); - - while (it.hasNext()) { - AbstractTopiaApplicationContext curr = it.next(); - if (curr == context) { - it.remove(); - break; - } - } - } - - /** - * Utilise par defaut le fichier de propriete AbstractTopiaContext.properties - * - * @return the context using the default configuration file - * @throws TopiaNotFoundException Si le fichier de configuration par defaut - * n'est pas retrouvé. - */ - public static AbstractTopiaApplicationContext getContext() throws TopiaNotFoundException { - Properties config = TopiaUtil.getProperties(DEFAULT_CONFIG_PROPERTIES); - AbstractTopiaApplicationContext result = getContext(config, null); - return result; - } - - /** - * Methode static permettant de recuperer un context. Si on donne plusieurs - * fois le meme objet config, on obtient la meme instance de - * AbstractTopiaContext. Si le context qui devrait etre retourné est ferme, - * alors un nouveau est creer et retourné. - * - * @param config the configuration of the context - * @return Un TopiaContext ouvert - * @throws TopiaNotFoundException if any pb - */ - public static <C extends AbstractTopiaApplicationContext> C getContext( - Properties config, Function<Properties, C> createContextFunction) - throws TopiaNotFoundException { - // Put all properties from a hierarchy in the current properties object. - // Resolve problem with hibernate which used iterator to get properties - // and so only values from the current properties object and not all - // hierarchy - Properties cloned = new Properties(); - for (String key : config.stringPropertyNames()) { - cloned.setProperty(key, config.getProperty(key)); - } - C result = (C)contextCache.get(cloned); - if (result == null || result.isClosed()) { - if (createContextFunction == null) { - throw new TopiaException("Function<Properties, AbstractTopiaApplicationContext> is needed to create context"); - } else { - result = createContextFunction.apply(cloned); - } - if (log.isDebugEnabled()) { - log.debug("instantiate new topiaContext : " + result); - } - contextCache.put(cloned, result); - } else if (log.isDebugEnabled()) { - log.debug("topiaContext found : " + result); - } - return result; - } - } Modified: trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationOperationTest.java =================================================================== --- trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationOperationTest.java 2013-11-28 00:43:28 UTC (rev 2900) +++ trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationOperationTest.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -33,7 +33,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.topia.AbstractTopiaApplicationContext; -import org.nuiton.topia.TopiaContextFactory; +import org.nuiton.topia.TopiaApplicationContextCache; import org.nuiton.topia.TopiaPersistenceContext; import org.nuiton.topia.it.TopiaConfigurationHelper; import org.nuiton.topia.it.legacy.TopiaTestEntityEnum; @@ -285,7 +285,7 @@ Properties config = getH2Properties(name); - sourceContext = TopiaContextFactory.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); + sourceContext = TopiaApplicationContextCache.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); TopiaPersistenceContext tx = sourceContext.newPersistenceContext(); Modified: trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplAllTest.java =================================================================== --- trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplAllTest.java 2013-11-28 00:43:28 UTC (rev 2900) +++ trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplAllTest.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -33,7 +33,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.topia.AbstractTopiaApplicationContext; -import org.nuiton.topia.TopiaContextFactory; +import org.nuiton.topia.TopiaApplicationContextCache; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaPersistenceContext; import org.nuiton.topia.it.TopiaConfigurationHelper; @@ -232,7 +232,7 @@ Properties config = getH2Properties(name); - sourceContext = TopiaContextFactory.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); + sourceContext = TopiaApplicationContextCache.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); TopiaPersistenceContext tx = sourceContext.newPersistenceContext(); @@ -259,7 +259,7 @@ Properties config = getH2Properties(name); - return TopiaContextFactory.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); + return TopiaApplicationContextCache.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); } @Override Modified: trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplTest.java =================================================================== --- trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplTest.java 2013-11-28 00:43:28 UTC (rev 2900) +++ trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplTest.java 2013-11-28 08:39:47 UTC (rev 2901) @@ -33,7 +33,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.topia.AbstractTopiaApplicationContext; -import org.nuiton.topia.TopiaContextFactory; +import org.nuiton.topia.TopiaApplicationContextCache; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaPersistenceContext; import org.nuiton.topia.it.TopiaConfigurationHelper; @@ -391,7 +391,7 @@ Properties config = getH2Properties(name); - sourceContext = TopiaContextFactory.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); + sourceContext = TopiaApplicationContextCache.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); TopiaPersistenceContext tx = sourceContext.newPersistenceContext(); @@ -420,7 +420,7 @@ Properties config = getH2Properties(name); - return TopiaContextFactory.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); + return TopiaApplicationContextCache.getContext(config, CREATE_TOPIA_TEST_APPLICATION_CONTEXT); } @Override