This is an automated email from the git hooks/post-receive script. New commit to branch feature/2892 in repository topia. See http://git.nuiton.org/topia.git commit d67aa114f2b1b63f32e3dcd517b32b82df318871 Author: Brendan Le Ny <bleny@codelutin.com> Date: Mon Jan 26 12:26:37 2015 +0100 Allow user to instantiate TopiaIdFactory --- .../persistence/util/TopiaEntityHelperTest.java | 4 +- .../persistence/internal/TopiaIdFactoryTest.java | 2 +- .../topia/persistence/BeanTopiaConfiguration.java | 34 ++++++- .../topia/persistence/TopiaConfiguration.java | 4 +- .../persistence/TopiaConfigurationBuilder.java | 2 +- .../nuiton/topia/persistence/TopiaIdFactory.java | 9 +- .../internal/AbstractTopiaApplicationContext.java | 25 +---- .../internal/DefaultTopiaIdFactory.java | 104 +-------------------- ... FullyQualifiedNamePlusUuidTopiaIdFactory.java} | 9 +- .../persistence/internal/LegacyTopiaIdFactory.java | 2 + .../persistence/internal/ShortTopiaIdFactory.java | 23 ++--- ...lyQualifiedNamePlusUuidTopiaIdFactoryTest.java} | 10 +- 12 files changed, 69 insertions(+), 159 deletions(-) diff --git a/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/util/TopiaEntityHelperTest.java b/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/util/TopiaEntityHelperTest.java index 5e8a32c..6bfc657 100644 --- a/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/util/TopiaEntityHelperTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/util/TopiaEntityHelperTest.java @@ -30,7 +30,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.it.legacy.TopiaItLegacyEntityEnum; -import org.nuiton.topia.persistence.internal.DefaultTopiaIdFactory; +import org.nuiton.topia.persistence.internal.FullyQualifiedNamePlusUuidTopiaIdFactory; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.TopiaIdFactory; @@ -59,7 +59,7 @@ import static org.junit.Assert.assertTrue; /** @author Tony Chemit - chemit@codelutin.com */ public class TopiaEntityHelperTest { - protected static TopiaIdFactory topiaIdFactory = new DefaultTopiaIdFactory(); + protected static TopiaIdFactory topiaIdFactory = new FullyQualifiedNamePlusUuidTopiaIdFactory(); protected static TopiaEntityEnum[] contracts; diff --git a/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaIdFactoryTest.java b/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaIdFactoryTest.java index 68ee19e..9b2d4aa 100644 --- a/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaIdFactoryTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/persistence/internal/TopiaIdFactoryTest.java @@ -47,7 +47,7 @@ public class TopiaIdFactoryTest { @Test public void testDefaultTopiaIdFactory() { - TopiaIdFactory topiaIdFactory = new DefaultTopiaIdFactory(); + TopiaIdFactory topiaIdFactory = new FullyQualifiedNamePlusUuidTopiaIdFactory(); testTopiaIdFactory(topiaIdFactory); } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java index dd5050e..2c5a446 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/BeanTopiaConfiguration.java @@ -1,5 +1,6 @@ package org.nuiton.topia.persistence; +import org.nuiton.topia.persistence.internal.FullyQualifiedNamePlusUuidTopiaIdFactory; import org.nuiton.topia.persistence.jdbc.BeanJdbcConfiguration; import org.nuiton.topia.persistence.jdbc.JdbcConfiguration; @@ -8,8 +9,6 @@ import java.util.Map; public class BeanTopiaConfiguration extends BeanJdbcConfiguration implements TopiaConfiguration { - protected String topiaIdFactoryClassName; - protected String schemaName; protected Map<String, String> hibernateExtraConfiguration = @@ -29,6 +28,8 @@ public class BeanTopiaConfiguration extends BeanJdbcConfiguration implements Top protected Integer connectionPoolMaxSize; + protected TopiaIdFactory topiaIdFactory = new FullyQualifiedNamePlusUuidTopiaIdFactory(); + public BeanTopiaConfiguration() { } @@ -40,12 +41,35 @@ public class BeanTopiaConfiguration extends BeanJdbcConfiguration implements Top } @Override - public String getTopiaIdFactoryClassName() { - return topiaIdFactoryClassName; + public TopiaIdFactory getTopiaIdFactory() { + return topiaIdFactory; + } + + public void setTopiaIdFactory(TopiaIdFactory topiaIdFactory) { + this.topiaIdFactory = topiaIdFactory; } public void setTopiaIdFactoryClassName(String topiaIdFactoryClassName) { - this.topiaIdFactoryClassName = topiaIdFactoryClassName; + try { + Class<?> topiaIdFactoryClass = Class.forName(topiaIdFactoryClassName); + if (TopiaIdFactory.class.isAssignableFrom(jdbcDriverClass)) { + setTopiaIdFactoryClass((Class<? extends TopiaIdFactory>) topiaIdFactoryClass); + } else { + throw new IllegalArgumentException(topiaIdFactoryClassName + " seems not to be a TopiaIdFactory: it does not implement " + TopiaIdFactory.class.getName()); + } + } catch (ClassNotFoundException e) { + throw new TopiaMisconfigurationException(topiaIdFactoryClassName + " cannot be found", this); + } + } + + public void setTopiaIdFactoryClass(Class<? extends TopiaIdFactory> topiaIdFactoryClass) { + try { + setTopiaIdFactory(topiaIdFactoryClass.newInstance()); + } catch (InstantiationException e) { + throw new TopiaMisconfigurationException(topiaIdFactoryClass + " is not instantiable", this); + } catch (IllegalAccessException e) { + throw new TopiaMisconfigurationException(topiaIdFactoryClass + " is not instantiable", this); + } } @Override diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfiguration.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfiguration.java index fb1f48a..a61f2f5 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfiguration.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfiguration.java @@ -23,11 +23,9 @@ public interface TopiaConfiguration extends JdbcConfiguration { /** * Configuration directive to change topia Ids generation strategy. * - * Expected value is an FQN to a class which implements {@link org.nuiton.topia.persistence.TopiaIdFactory} - * * @since 3.0 */ - String getTopiaIdFactoryClassName(); + TopiaIdFactory getTopiaIdFactory(); String getSchemaName(); diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java index 97398ed..674b63f 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaConfigurationBuilder.java @@ -224,7 +224,7 @@ public class TopiaConfigurationBuilder { } // others - map.put(CONFIG_PERSISTENCE_TOPIA_ID_FACTORY_CLASS_NAME, topiaConfiguration.getTopiaIdFactoryClassName()); + map.put(CONFIG_PERSISTENCE_TOPIA_ID_FACTORY_CLASS_NAME, topiaConfiguration.getTopiaIdFactory().getClass().getName()); if (topiaConfiguration.getSchemaName() != null) { map.put(CONFIG_DEFAULT_SCHEMA, topiaConfiguration.getSchemaName()); } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactory.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactory.java index f2a95b8..b601a85 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactory.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaIdFactory.java @@ -24,6 +24,8 @@ package org.nuiton.topia.persistence; * #L% */ +import java.io.Serializable; + /** * This contract represents a topiaId generation strategy. * <p/> @@ -35,12 +37,15 @@ package org.nuiton.topia.persistence; * * You can change the implementation used by ToPIA by changing configuration. * - * @see TopiaConfiguration#getTopiaIdFactoryClassName() + * {@link java.io.Serializable} must be implemented because + * {@link org.nuiton.topia.persistence.TopiaConfiguration} may hold some references. + * + * @see org.nuiton.topia.persistence.TopiaConfiguration#getTopiaIdFactory() * @author bleny <leny@codelutin.com/> * @author tchemit <chemit@codelutin.com/> * @since 3.0 */ -public interface TopiaIdFactory { +public interface TopiaIdFactory extends Serializable { /** * Generates a new topiaId for the given entity type and the given entity. diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java index 78d199d..6fcdecc 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java @@ -26,7 +26,6 @@ package org.nuiton.topia.persistence.internal; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; @@ -238,29 +237,7 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence } protected TopiaIdFactory getTopiaIdFactory() { - if (topiaIdFactory == null) { - String topiaIdFactoryClassName = getConfiguration().getTopiaIdFactoryClassName(); - if (StringUtils.isEmpty(topiaIdFactoryClassName)) { - topiaIdFactory = new DefaultTopiaIdFactory(); - } else { - try { - Class topiaIdFactoryClass = Class.forName(topiaIdFactoryClassName); - Preconditions.checkState(TopiaIdFactory.class.isAssignableFrom(topiaIdFactoryClass), - topiaIdFactoryClassName + " is not a valid class name. The class must implements " - + TopiaIdFactory.class.getSimpleName()); - - topiaIdFactory = (TopiaIdFactory) topiaIdFactoryClass.newInstance(); - } catch (ClassNotFoundException e) { - throw new TopiaException("Unable to create user specified TopiaIdFactory", e); - } catch (InstantiationException e) { - throw new TopiaException("Unable to create user specified TopiaIdFactory", e); - } catch (IllegalAccessException e) { - throw new TopiaException("Unable to create user specified TopiaIdFactory", e); - } - } - - } - return topiaIdFactory; + return getConfiguration().getTopiaIdFactory(); } public TopiaHibernateSessionRegistry getSessionRegistry() { diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java index 59ea58e..d4bd955 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java @@ -1,109 +1,11 @@ package org.nuiton.topia.persistence.internal; -/* - * #%L - * ToPIA :: Persistence - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2014 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.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.TopiaIdFactory; - -import java.util.UUID; - -import com.google.common.base.Preconditions; - /** - * Default implementation of {@link TopiaIdFactory}. Generates a FQN followed by a random UUID. - * - * @author Brendan Le Ny <leny@codelutin.com> * @since 3.0 + * @deprecated use {@link org.nuiton.topia.persistence.internal.FullyQualifiedNamePlusUuidTopiaIdFactory} */ -public class DefaultTopiaIdFactory implements TopiaIdFactory { - - private static final Log log = LogFactory.getLog(DefaultTopiaIdFactory.class); - - @Override - public <E extends TopiaEntity> String newTopiaId(Class<E> entityClass, TopiaEntity topiaEntity) { - String randomPart = UUID.randomUUID().toString(); - String result = newTopiaId(entityClass, randomPart); - return result; - } - - @Override - public <E extends TopiaEntity> String newTopiaId(Class<E> entityClass, String randomPart) { - if (!entityClass.isInterface()) { - throw new IllegalArgumentException( - "Only interface is permit to create id: " + entityClass); - } - String className = entityClass.getName(); - Preconditions.checkArgument(!className.contains(getSeparator()), "Your entity class name must not contains the separator"); - String result = className + getSeparator() + randomPart; - return result; - } - - @Override - public <E extends TopiaEntity> Class<E> getClassName(String topiaId) { - String className = StringUtils.substringBefore(topiaId, getSeparator()); - try { - Class<E> entityClass = (Class<E>) Class.forName(className); - return entityClass; - } catch (ClassNotFoundException e) { - throw new TopiaException("can't find class for topiaId = '" + topiaId + "'", e); - } - } - - @Override - public String getSeparator() { - return "_"; - } - - @Override - public String getRandomPart(String topiaId) { - return StringUtils.substringAfter(topiaId, getSeparator()); - } +public class DefaultTopiaIdFactory extends FullyQualifiedNamePlusUuidTopiaIdFactory { - @Override - public boolean isTopiaId(String str) { - boolean isTopiaId = false; - if (str != null) { - String[] split = str.split(getSeparator()); - if (split.length == 2) { - String className = split[0]; - try { - Class.forName(className); - isTopiaId = StringUtils.isNotBlank(split[1]); - } catch (ClassNotFoundException eee) { - // nothing to do, just return false - if (log.isDebugEnabled()) { - log.debug(eee); - } - } - } - } - return isTopiaId; - } + private static final long serialVersionUID = 1; } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/FullyQualifiedNamePlusUuidTopiaIdFactory.java similarity index 93% copy from topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java copy to topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/FullyQualifiedNamePlusUuidTopiaIdFactory.java index 59ea58e..7857efe 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/DefaultTopiaIdFactory.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/FullyQualifiedNamePlusUuidTopiaIdFactory.java @@ -24,6 +24,7 @@ package org.nuiton.topia.persistence.internal; * #L% */ +import com.google.common.base.Preconditions; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -33,17 +34,17 @@ import org.nuiton.topia.persistence.TopiaIdFactory; import java.util.UUID; -import com.google.common.base.Preconditions; - /** * Default implementation of {@link TopiaIdFactory}. Generates a FQN followed by a random UUID. * * @author Brendan Le Ny <leny@codelutin.com> * @since 3.0 */ -public class DefaultTopiaIdFactory implements TopiaIdFactory { +public class FullyQualifiedNamePlusUuidTopiaIdFactory implements TopiaIdFactory { + + private static final long serialVersionUID = 1; - private static final Log log = LogFactory.getLog(DefaultTopiaIdFactory.class); + private static final Log log = LogFactory.getLog(FullyQualifiedNamePlusUuidTopiaIdFactory.class); @Override public <E extends TopiaEntity> String newTopiaId(Class<E> entityClass, TopiaEntity topiaEntity) { diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/LegacyTopiaIdFactory.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/LegacyTopiaIdFactory.java index e831398..b84bd42 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/LegacyTopiaIdFactory.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/LegacyTopiaIdFactory.java @@ -40,6 +40,8 @@ import org.nuiton.topia.persistence.TopiaNotFoundException; */ public class LegacyTopiaIdFactory implements TopiaIdFactory { + private static final long serialVersionUID = 1; + private static final Log log = LogFactory.getLog(LegacyTopiaIdFactory.class); @Override diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/ShortTopiaIdFactory.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/ShortTopiaIdFactory.java index 0f0a607..4748f5a 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/ShortTopiaIdFactory.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/ShortTopiaIdFactory.java @@ -22,10 +22,12 @@ package org.nuiton.topia.persistence.internal; * #L% */ -import java.util.Map; -import java.util.Set; -import java.util.UUID; - +import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.common.io.BaseEncoding; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -33,15 +35,12 @@ import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.TopiaIdFactory; -import com.google.common.base.Preconditions; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.common.io.BaseEncoding; +import java.util.Map; +import java.util.Set; +import java.util.UUID; /** - * Does the same than {@link DefaultTopiaIdFactory} but produces shorter topiaId. The class-name part uses only simple + * Does the same than {@link FullyQualifiedNamePlusUuidTopiaIdFactory} but produces shorter topiaId. The class-name part uses only simple * class names, and the random part is base64 encoded. * <p/> * Note: This TopiaIdFactory requires that you do not have several entities with the same simple class name. @@ -50,6 +49,8 @@ import com.google.common.io.BaseEncoding; */ public class ShortTopiaIdFactory implements TopiaIdFactory { + private static final long serialVersionUID = 1; + private static final Log log = LogFactory.getLog(ShortTopiaIdFactory.class); protected static final Map<String, Class<? extends TopiaEntity>> ENTITY_CLASSES = Maps.newConcurrentMap(); diff --git a/topia-persistence/src/test/java/org/nuiton/topia/persistence/DefaultTopiaIdFactoryTest.java b/topia-persistence/src/test/java/org/nuiton/topia/persistence/FullyQualifiedNamePlusUuidTopiaIdFactoryTest.java similarity index 90% rename from topia-persistence/src/test/java/org/nuiton/topia/persistence/DefaultTopiaIdFactoryTest.java rename to topia-persistence/src/test/java/org/nuiton/topia/persistence/FullyQualifiedNamePlusUuidTopiaIdFactoryTest.java index cd69a35..a27a8eb 100644 --- a/topia-persistence/src/test/java/org/nuiton/topia/persistence/DefaultTopiaIdFactoryTest.java +++ b/topia-persistence/src/test/java/org/nuiton/topia/persistence/FullyQualifiedNamePlusUuidTopiaIdFactoryTest.java @@ -27,12 +27,12 @@ package org.nuiton.topia.persistence; import org.junit.Assert; import org.junit.Test; import org.nuiton.topia.persistence.internal.AbstractTopiaEntity; -import org.nuiton.topia.persistence.internal.DefaultTopiaIdFactory; +import org.nuiton.topia.persistence.internal.FullyQualifiedNamePlusUuidTopiaIdFactory; /** * @author Sylvain Bavencoff <bavencoff@codelutin.com> */ -public class DefaultTopiaIdFactoryTest { +public class FullyQualifiedNamePlusUuidTopiaIdFactoryTest { interface EntityA extends TopiaEntity {} @@ -54,10 +54,10 @@ public class DefaultTopiaIdFactoryTest { } } - protected DefaultTopiaIdFactory topiaFactory; + protected FullyQualifiedNamePlusUuidTopiaIdFactory topiaFactory; - public DefaultTopiaIdFactoryTest() { - topiaFactory = new DefaultTopiaIdFactory(); + public FullyQualifiedNamePlusUuidTopiaIdFactoryTest() { + topiaFactory = new FullyQualifiedNamePlusUuidTopiaIdFactory(); } @Test -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.