Author: bleny Date: 2014-04-30 13:17:38 +0200 (Wed, 30 Apr 2014) New Revision: 3088 Url: http://forge.nuiton.org/projects/topia/repository/revisions/3088 Log: fixes #3181 Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaService.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaServiceImpl.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaService.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaServiceImpl.java trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImplTest.java Removed: trunk/topia-it/src/test/java/org/nuiton/topia/it/legacy/topiatest/service/ Modified: trunk/pom.xml trunk/topia-persistence/pom.xml trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaService.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImpl.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaServiceSupport.java trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationService.java trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationServiceImpl.java trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/AbstractTopiaReplicationServiceTest.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/pom.xml =================================================================== --- trunk/pom.xml 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/pom.xml 2014-04-30 11:17:38 UTC (rev 3088) @@ -248,6 +248,7 @@ <sl4jVersion>1.7.7</sl4jVersion> <h2Version>1.3.176</h2Version> <hamcrestVersion>1.3</hamcrestVersion> + <mockitoVersion>1.9.5</mockitoVersion> </properties> @@ -355,6 +356,13 @@ <scope>test</scope> </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <version>${mockitoVersion}</version> + <scope>test</scope> + </dependency> + </dependencies> </dependencyManagement> Modified: trunk/topia-persistence/pom.xml =================================================================== --- trunk/topia-persistence/pom.xml 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-persistence/pom.xml 2014-04-30 11:17:38 UTC (rev 3088) @@ -114,6 +114,11 @@ </dependency> <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + </dependency> + + <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <scope>test</scope> Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaService.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaService.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/TopiaService.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -24,30 +24,18 @@ * #L% */ -import org.nuiton.topia.persistence.internal.AbstractTopiaApplicationContext; +import java.util.Map; /** - * Used to implement a service for Topia. You have to provide a static property called SERVICE_NAME that identify the - * service: - * <p/> - * <li>public static final String SERVICE_NAME = "monservice"; - * <p/> - * The value of this attribute need to be returned when using {@link #getServiceName()} method. - * <p/> - * Created: 8 oct. 06 17:15:52 + * Used to implement a service for Topia. * - * @author poussin <poussin@codelutin.com> + * A TopiaService is started at the very beginning of the {@link org.nuiton.topia.persistence.TopiaApplicationContext} + * startup and provides user extra operations not available in the topia core such as migrations, + * replication, IO, etc. */ public interface TopiaService { - /** - * Return the name of the service, this name need to match with - * configuration file, for example for index service, we need to have : - * "topia.service.index" and this method will returned "index". - * - * @return the service name - */ - String getServiceName(); + void setConfiguration(Map<String, String> serviceConfiguration); /** * Retrieve entities of this service needed for persistence. @@ -62,7 +50,7 @@ * @param context * @return true if service need to be activated or not */ - boolean preInit(AbstractTopiaApplicationContext context); + void preInit(TopiaApplicationContext context); /** * Initiliaze the service after create the {@code context}. @@ -70,6 +58,6 @@ * @param context * @return true if service need to be activated or not */ - boolean postInit(TopiaApplicationContext context); + void postInit(TopiaApplicationContext context); } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -37,10 +37,11 @@ import org.nuiton.topia.persistence.TopiaApplicationContext; import org.nuiton.topia.persistence.TopiaApplicationContextCache; import org.nuiton.topia.persistence.TopiaConfigurationConstants; +import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.TopiaNotFoundException; +import org.nuiton.topia.persistence.TopiaIdFactory; import org.nuiton.topia.persistence.TopiaPersistenceContext; -import org.nuiton.topia.persistence.internal.support.TopiaServiceSupportImpl; +import org.nuiton.topia.persistence.TopiaService; import org.nuiton.topia.persistence.event.TopiaEntitiesVetoable; import org.nuiton.topia.persistence.event.TopiaEntityListener; import org.nuiton.topia.persistence.event.TopiaEntityVetoable; @@ -48,12 +49,10 @@ import org.nuiton.topia.persistence.event.TopiaTransactionListener; import org.nuiton.topia.persistence.event.TopiaTransactionVetoable; import org.nuiton.topia.persistence.internal.support.TopiaFiresSupport; -import org.nuiton.topia.persistence.TopiaService; +import org.nuiton.topia.persistence.internal.support.TopiaServiceSupportImpl; import org.nuiton.topia.persistence.support.TopiaListenableSupport; import org.nuiton.topia.persistence.support.TopiaServiceSupport; import org.nuiton.topia.persistence.util.TopiaUtil; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaIdFactory; import java.beans.PropertyChangeListener; import java.util.Collections; @@ -262,21 +261,17 @@ } @Override - public <E extends TopiaService> boolean serviceEnabled(Class<E> interfaceService) { - return topiaServiceSupport.serviceEnabled(interfaceService); + public Map<String, TopiaService> getServices() { + return topiaServiceSupport.getServices(); } @Override - public <E extends TopiaService> E getService(Class<E> interfaceService) throws TopiaNotFoundException { - return topiaServiceSupport.getService(interfaceService); + public <T extends TopiaService> Map<String, T> getServices(Class<T> interfaceService) { + // XXX brendan 30/04/14 cast ??? + return (Map<String, T>) topiaServiceSupport.getServices(); } @Override - public Map<String, TopiaService> getServices() { - return topiaServiceSupport.getServices(); - } - - @Override public List<Class<?>> getPersistenceClasses() { return getHibernateProvider().getPersistentClasses(); } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImpl.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImpl.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImpl.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -24,19 +24,22 @@ * #L% */ -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.Map; - +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.TopiaNotFoundException; +import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.TopiaService; - -import com.google.common.collect.ImmutableMap; import org.nuiton.topia.persistence.internal.AbstractTopiaApplicationContext; import org.nuiton.topia.persistence.support.TopiaServiceSupport; +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + /** * FIXME AThimel 11/10/13 All this life-cycle has to be reviewed * @@ -47,133 +50,108 @@ private static final Log log = LogFactory.getLog(TopiaServiceSupportImpl.class); protected ImmutableMap<String, TopiaService> services; - protected AbstractTopiaApplicationContext applicationContext; - public TopiaServiceSupportImpl(AbstractTopiaApplicationContext applicationContext) { - this.applicationContext = applicationContext; - this.services = loadServices(applicationContext.getConfiguration()); + protected AbstractTopiaApplicationContext topiaApplicationContext; + + public TopiaServiceSupportImpl(AbstractTopiaApplicationContext topiaApplicationContext) { + this.topiaApplicationContext = topiaApplicationContext; + this.services = loadServices(topiaApplicationContext.getConfiguration()); } public void init() { preInitServices(this.services); - applicationContext.getHibernateProvider().getHibernateConfiguration(); // force mapping loading + topiaApplicationContext.getHibernateProvider().getHibernateConfiguration(); // force mapping loading postInitServices(this.services); } protected void preInitServices(Map<String, TopiaService> services) { for (TopiaService service : services.values()) { - if (!service.preInit(applicationContext)) { - log.warn(String.format("The service named '%1$s' could not be post-initialized (service not activated)", - service.getServiceName())); - } + service.preInit(topiaApplicationContext); } } protected void postInitServices(Map<String, TopiaService> services) { for (TopiaService service : services.values()) { - if (!service.postInit(applicationContext)) { - log.warn(String.format("The service named '%1$s' could not be pre-initialized (service not activated)", - service.getServiceName())); - } + service.postInit(topiaApplicationContext); } } - /** - * Retrieve service name using SERVICE_NAME static field on service - * interface. - * - * @param interfaceService class of the service - * @param <E> type of the service that extends {@link - * TopiaService} - * @return the service name - * @throws IllegalAccessException if field SERVICE_NAME can't be accessed - * @throws NoSuchFieldException if no field SERVICE_NAME is defined - */ - protected <E extends TopiaService> String getServiceName( - Class<E> interfaceService) - throws IllegalAccessException, NoSuchFieldException { - Field f = interfaceService.getField("SERVICE_NAME"); - String name = (String) f.get(null); - return name; - } - - protected String getProperExceptionMessage(Throwable eee) { - return eee.getClass().getSimpleName() + " : " + eee.getMessage(); - } - protected ImmutableMap<String, TopiaService> loadServices(ImmutableMap<String, String> configuration) { - Map<String, TopiaService> result = new HashMap<String, TopiaService>(); // recherche des services present dans la config - for (String key : configuration.keySet()) { - if (key.matches("^topia\\.service\\.\\w+$")) { - String serviceClass = configuration.get(key); - try { - Class<?> forName = Class.forName(serviceClass); - Object newInstance = forName.getConstructor().newInstance(); - TopiaService service = (TopiaService) newInstance; - if (key.equals("topia.service." + service.getServiceName())) { - result.put(service.getServiceName(), service); - log.info(String.format("Service '%1$s' loaded (implementation %2$s)", - key, serviceClass)); - } else { - log.warn(String.format("The service with key '%1$s' has a different name '%2$s'! (service not activated)", - key, service.getServiceName())); + Map<String, TopiaService> services = new HashMap<String, TopiaService>(); + Map<String, Map<String, String>> servicesConfigurations = new HashMap<String, Map<String, String>>(); + for (Map.Entry<String, String> entry : configuration.entrySet()) { + String prefixedConfigurationKey = entry.getKey(); + String configurationValue = entry.getValue(); + if (prefixedConfigurationKey.startsWith("topia.service.")) { + String configurationKey = StringUtils.removeStart(prefixedConfigurationKey, "topia.service."); + String[] split = StringUtils.split(configurationKey, '.'); + Preconditions.checkState(split.length > 0, "'" + prefixedConfigurationKey + "' is not a valid configuration key"); + String serviceName = split[0]; + if (split.length == 1) { + // service declaration instantiate it + try { + Class<?> forName = Class.forName(configurationValue); + Object newInstance = forName.getConstructor().newInstance(); + TopiaService service = (TopiaService) newInstance; + services.put(serviceName, service); + if (log.isInfoEnabled()) { + log.info("instantiated service " + serviceName + ": " + service); + } + } catch (ClassNotFoundException e) { + throw new TopiaException("unable to find topia service class " + configurationValue, e); + } catch (InstantiationException e) { + throw new TopiaException("unable to instantiate class " + configurationValue, e); + } catch (IllegalAccessException e) { + throw new TopiaException("unable to instantiate class " + configurationValue, e); + } catch (InvocationTargetException e) { + throw new TopiaException("unable to instantiate class " + configurationValue, e); + } catch (NoSuchMethodException e) { + throw new TopiaException("unable to instantiate class " + configurationValue, e); } - } catch (Throwable eee) { - String message = - String.format("The service %1$s of type %2$s was not found.", - key, serviceClass); - if (log.isDebugEnabled()) { - log.debug(message, eee); - } else if (log.isErrorEnabled()) { - log.error(message); + } else { + // service configuration, save it to push it back later + Map<String, String> serviceConfiguration = servicesConfigurations.get(serviceName); + if (serviceConfiguration == null) { + serviceConfiguration = new LinkedHashMap<String, String>(); + servicesConfigurations.put(serviceName, serviceConfiguration); } + String serviceConfigurationKey = StringUtils.removeStart(configurationKey, serviceName + "."); + serviceConfiguration.put(serviceConfigurationKey, configurationValue); } } } - return ImmutableMap.copyOf(result); - } - - - @Override - public <E extends TopiaService> boolean serviceEnabled(Class<E> interfaceService) { - boolean result = false; - try { - String name = getServiceName(interfaceService); - result = getServices().containsKey(name); - } catch (Exception eee) { - String format = "The service named '%1$s' could not be found for following reason: %2$s"; - String message = String.format(format, interfaceService, getProperExceptionMessage(eee)); - if (log.isDebugEnabled()) { - log.debug(message, eee); - } else if (log.isWarnEnabled()) { - log.warn(message); + // configure services + for (Map.Entry<String, TopiaService> entry : services.entrySet()) { + String serviceName = entry.getKey(); + TopiaService service = entry.getValue(); + Map<String, String> serviceConfiguration = servicesConfigurations.get(serviceName); + if (serviceConfiguration == null) { + serviceConfiguration = Collections.emptyMap(); } + if (log.isInfoEnabled()) { + log.info("for service " + serviceName + ", will set configuration " + serviceConfiguration); + } + service.setConfiguration(serviceConfiguration); } - return result; + return ImmutableMap.copyOf(services); } @Override - public <E extends TopiaService> E getService(Class<E> interfaceService) throws TopiaNotFoundException { - E result; - try { - String name = getServiceName(interfaceService); - result = (E) getServices().get(name); - } catch (Exception eee) { - String format = "Could not retreave service %1$s for following reason: %2$s"; - String message = String.format(format, interfaceService, getProperExceptionMessage(eee)); - throw new TopiaNotFoundException(message, eee); - } - if (result == null) { - String message = String.format("The service %1$s was not found.", interfaceService); - throw new TopiaNotFoundException(message); - } - return result; - } - - @Override public Map<String, TopiaService> getServices() { return services; } + @Override + public <T extends TopiaService> Map<String, T> getServices(Class<T> interfaceService) { + Map<String, T> result = new LinkedHashMap<String, T>(); + for (Map.Entry<String, TopiaService> entry : services.entrySet()) { + String serviceName = entry.getKey(); + TopiaService service = entry.getValue(); + if (interfaceService.isAssignableFrom(service.getClass())) { + result.put(serviceName, (T) service); + } + } + return result; + } } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaServiceSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaServiceSupport.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaServiceSupport.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -24,11 +24,10 @@ * #L% */ -import java.util.Map; - -import org.nuiton.topia.persistence.TopiaNotFoundException; import org.nuiton.topia.persistence.TopiaService; +import java.util.Map; + /** * This API provides methods to manipulate services * @@ -38,28 +37,14 @@ public interface TopiaServiceSupport { /** - * Return true if specific service is available. - * - * @param interfaceService fqn of the service - * @return the service + * The list of registered services. The map key is the service name, and the value is the service instance. */ - <E extends TopiaService> boolean serviceEnabled(Class<E> interfaceService); + Map<String, TopiaService> getServices(); /** - * Return the service. This service must be valid with public static final - * SERVICE_NAME property. - * - * @param interfaceService class of the service - * @return the service - * @throws TopiaNotFoundException if service can't be retrieved + * Same as {@link #getServices()} but returns only services that implements + * given contract (or is instance of given class). */ - <E extends TopiaService> E getService(Class<E> interfaceService) throws TopiaNotFoundException; + <T extends TopiaService> Map<String, T> getServices(Class<T> interfaceService); - /** - * The list of registered services. The map key is the service name, and the value is the service instance. - * - * @return a map with {serviceName, serviceInstance} values - */ - Map<String, TopiaService> getServices(); - } Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaService.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaService.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaService.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -0,0 +1,7 @@ +package org.nuiton.topia.persistence.internal.support; + +import org.nuiton.topia.persistence.TopiaService; + +public interface MyFirstTopiaService extends TopiaService { + +} Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaServiceImpl.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaServiceImpl.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MyFirstTopiaServiceImpl.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -0,0 +1,45 @@ +package org.nuiton.topia.persistence.internal.support; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaApplicationContext; + +import java.util.Map; + +public class MyFirstTopiaServiceImpl implements MyFirstTopiaService { + + private static final Log log = LogFactory.getLog(MyFirstTopiaServiceImpl.class); + + protected Map<String, String> serviceConfiguration; + + public Map<String, String> getServiceConfiguration() { + return serviceConfiguration; + } + + @Override + public void setConfiguration(Map<String, String> serviceConfiguration) { + this.serviceConfiguration = serviceConfiguration; + if (log.isDebugEnabled()) { + log.debug("configuration is " + serviceConfiguration); + } + } + + @Override + public Class<?>[] getPersistenceClasses() { + return new Class<?>[0]; + } + + @Override + public void preInit(TopiaApplicationContext context) { + if (log.isDebugEnabled()) { + log.debug(""); + } + } + + @Override + public void postInit(TopiaApplicationContext context) { + if (log.isDebugEnabled()) { + log.debug(""); + } + } +} Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaService.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaService.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaService.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -0,0 +1,7 @@ +package org.nuiton.topia.persistence.internal.support; + +import org.nuiton.topia.persistence.TopiaService; + +public interface MySecondTopiaService extends TopiaService { + +} Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaServiceImpl.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaServiceImpl.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/MySecondTopiaServiceImpl.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -0,0 +1,38 @@ +package org.nuiton.topia.persistence.internal.support; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaApplicationContext; + +import java.util.Map; + +public class MySecondTopiaServiceImpl implements MySecondTopiaService { + + private static final Log log = LogFactory.getLog(MySecondTopiaServiceImpl.class); + + @Override + public void setConfiguration(Map<String, String> serviceConfiguration) { + if (log.isDebugEnabled()) { + log.debug("configuration is " + serviceConfiguration); + } + } + + @Override + public Class<?>[] getPersistenceClasses() { + return new Class<?>[0]; + } + + @Override + public void preInit(TopiaApplicationContext context) { + if (log.isDebugEnabled()) { + log.debug(""); + } + } + + @Override + public void postInit(TopiaApplicationContext context) { + if (log.isDebugEnabled()) { + log.debug(""); + } + } +} Added: trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImplTest.java =================================================================== --- trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImplTest.java (rev 0) +++ trunk/topia-persistence/src/test/java/org/nuiton/topia/persistence/internal/support/TopiaServiceSupportImplTest.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -0,0 +1,57 @@ +package org.nuiton.topia.persistence.internal.support; + +import com.google.common.collect.ImmutableMap; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.nuiton.topia.persistence.TopiaService; +import org.nuiton.topia.persistence.internal.AbstractTopiaApplicationContext; + +import java.util.Map; + +public class TopiaServiceSupportImplTest { + + protected TopiaServiceSupportImpl topiaServiceSupport; + + protected ImmutableMap<String, String> configuration; + @Before + public void setUp() { + String myFistTopiaServiceImplFqn = MyFirstTopiaServiceImpl.class.getName(); + String mySecondTopiaServiceImplFqn = MySecondTopiaServiceImpl.class.getName(); + configuration = ImmutableMap.<String, String>builder() + .put("topia.service.myService1", myFistTopiaServiceImplFqn) + .put("topia.service.myService1.myConfigurationKey1", "myConfigurationValue1") + .put("topia.service.myService2", mySecondTopiaServiceImplFqn) + .build(); + + AbstractTopiaApplicationContext topiaApplicationContextMock = Mockito.mock(AbstractTopiaApplicationContext.class); + Mockito.when(topiaApplicationContextMock.getConfiguration()).thenReturn(configuration); + topiaServiceSupport = new TopiaServiceSupportImpl(topiaApplicationContextMock); + } + + @Test + public void testLoadServices() { + + ImmutableMap<String, TopiaService> services = topiaServiceSupport.loadServices(configuration); + + Assert.assertEquals(2, services.size()); + + TopiaService myService1 = services.get("myService1"); + + Assert.assertTrue(myService1 instanceof MyFirstTopiaServiceImpl); + + Assert.assertEquals("myConfigurationValue1", + ((MyFirstTopiaServiceImpl) myService1).getServiceConfiguration().get("myConfigurationKey1")); + + } + + @Test + public void testGetServices() { + + Map<String, MySecondTopiaService> services = topiaServiceSupport.getServices(MySecondTopiaService.class); + Assert.assertEquals(1, services.size()); + + } + +} Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -53,6 +53,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.SortedSet; import java.util.TreeSet; @@ -105,7 +106,7 @@ protected AbstractTopiaMigrationCallback callback; /** topia root context (initialise en pre-init) */ - protected AbstractTopiaApplicationContext applicationContext; + protected TopiaApplicationContext applicationContext; /** Un drapeau pour savoir si le service a bien ete initialise (i.e a bien fini la methode preInit) */ protected boolean init; @@ -183,32 +184,12 @@ }; } - //-------------------------------------------------------------------------- - //-- TopiaService implementation - //-------------------------------------------------------------------------- - @Override - public Class<?>[] getPersistenceClasses() { - return new Class<?>[]{TMSVersion.class}; - } + public void setConfiguration(Map<String, String> serviceConfiguration) { - @Override - public String getServiceName() { - return SERVICE_NAME; - } - - @Override - public boolean preInit(AbstractTopiaApplicationContext context) { - applicationContext = context; - Properties config = new Properties(); - config.putAll(applicationContext.getConfiguration()); + config.putAll(serviceConfiguration); - String callbackStr = getSafeParameter(config, MIGRATION_CALLBACK); - if (log.isDebugEnabled()) { - log.debug("Use callback - " + callbackStr); - } - migrateOnInit = Boolean.valueOf(config.getProperty(MIGRATION_MIGRATE_ON_INIT, String.valueOf(Boolean.TRUE))); if (log.isDebugEnabled()) { log.debug("Migrate on init - " + migrateOnInit); @@ -223,14 +204,40 @@ if (log.isDebugEnabled()) { log.debug("Show progression - " + showProgression); } + + String callbackStr = getSafeParameter(config, MIGRATION_CALLBACK); + if (log.isDebugEnabled()) { + log.debug("Use callback - " + callbackStr); + } + // enregistrement du callback try { Class<?> clazz = Class.forName(callbackStr); callback = (AbstractTopiaMigrationCallback) clazz.newInstance(); - } catch (Exception e) { - log.error("Could not instantiate CallbackHandler [" + callbackStr + "]", e); + } catch (ClassNotFoundException e) { + throw new TopiaException("unable to find callback class " + callbackStr, e); + } catch (InstantiationException e) { + throw new TopiaException("unable to instantiate callback " + callbackStr, e); + } catch (IllegalAccessException e) { + throw new TopiaException("unable to instantiate callback " + callbackStr, e); } + } + + //-------------------------------------------------------------------------- + //-- TopiaService implementation + //-------------------------------------------------------------------------- + + @Override + public Class<?>[] getPersistenceClasses() { + return new Class<?>[]{TMSVersion.class}; + } + + @Override + public void preInit(TopiaApplicationContext context) { + + applicationContext = context; + // creation de la configuration hibernate ne concernant que l'entite Version // afin de pouvoir creer la table via un schemaExport si necessaire @@ -268,13 +275,11 @@ log.debug("Service [" + this + "] skip migration on init as required"); } } - return true; } @Override - public boolean postInit(TopiaApplicationContext context) { + public void postInit(TopiaApplicationContext context) { // nothing to do in post-init - return true; } public void doMigrateSchema() throws MigrationServiceException { @@ -621,8 +626,9 @@ try { boolean result; // get db real hibernate configuration + // XXX brendan 30/04/14 cast show a design smell HibernateProvider hibernateProvider = - applicationContext.getHibernateProvider(); + ((AbstractTopiaApplicationContext) applicationContext).getHibernateProvider(); result = TopiaUtil.isSchemaEmpty(hibernateProvider.getHibernateConfiguration()); return result; Modified: trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java =================================================================== --- trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationService.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -37,23 +37,18 @@ */ public interface TopiaMigrationService extends TopiaService { - /** Nom du service */ - String SERVICE_NAME = "migration"; - - /** Nom du service topia */ - String TOPIA_SERVICE_NAME = "topia.service.migration"; - /** Pour spécifier dans la configuration le callback a utiliser */ - String MIGRATION_CALLBACK = "topia.service.migration.callback"; + String MIGRATION_CALLBACK = "callback"; - /** Un drapeau pour indiquer si on doit lancer le service au demarrage */ - String MIGRATION_MIGRATE_ON_INIT = "topia.service.migration.no.migrate.on.init"; + // FIXME brendan 30/04/14 poor name, change it to "migrateOnInit" + String MIGRATION_MIGRATE_ON_INIT = "no.migrate.on.init"; /** Pour afficher les requetes sql executees */ - String MIGRATION_SHOW_SQL = "topia.service.migration.showSql"; + String MIGRATION_SHOW_SQL = "showSql"; /** Pour afficher la progression des requetes sql executees */ - String MIGRATION_SHOW_PROGRESSION = "topia.service.migration.showProgression"; + String MIGRATION_SHOW_PROGRESSION = "showProgression"; boolean migrateSchema() throws MigrationServiceException; + } Modified: trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationService.java =================================================================== --- trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationService.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationService.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -50,16 +50,6 @@ public interface TopiaReplicationService extends TopiaService { /** - * Nom du service - */ - String SERVICE_NAME = "replication"; - - /** - * Nom du service topia - */ - String TOPIA_SERVICE_NAME = "topia.service.replication"; - - /** * Obtains the {@code model builder} use to creat the replication's model. * * @return the model builder Modified: trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationServiceImpl.java =================================================================== --- trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationServiceImpl.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-replication/src/main/java/org/nuiton/topia/replication/TopiaReplicationServiceImpl.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -26,18 +26,18 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.topia.persistence.internal.AbstractTopiaApplicationContext; import org.nuiton.topia.persistence.TopiaApplicationContext; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.TopiaPersistenceContext; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaEntityEnum; import org.nuiton.topia.persistence.util.TopiaEntityHelper; import org.nuiton.topia.replication.model.ReplicationModel; import org.nuiton.topia.replication.model.ReplicationNode; import org.nuiton.topia.replication.model.ReplicationOperationDef; import java.util.List; +import java.util.Map; /** * Implantation du service de replication. @@ -66,8 +66,12 @@ //-------------------------------------------------------------------------- @Override - public String getServiceName() { - return SERVICE_NAME; + public void setConfiguration(Map<String, String> serviceConfiguration) { + if ( ! serviceConfiguration.isEmpty()) { + if (log.isWarnEnabled()) { + log.warn("no configuration expected for replication service"); + } + } } @Override @@ -77,13 +81,12 @@ } @Override - public boolean preInit(AbstractTopiaApplicationContext context) { - // nothing to init - return true; + public void preInit(TopiaApplicationContext context) { + // nothing to do } @Override - public boolean postInit(TopiaApplicationContext context) { + public void postInit(TopiaApplicationContext context) { // set the incoming root context from topia this.context = context; //TODO avoir un objet pour lire les contrainte de resolution de cycle @@ -93,7 +96,6 @@ // Cela permet de traiter plus de cas... //Properties prop = context.getConfig(); - return true; } //-------------------------------------------------------------------------- Modified: trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/AbstractTopiaReplicationServiceTest.java =================================================================== --- trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/AbstractTopiaReplicationServiceTest.java 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/AbstractTopiaReplicationServiceTest.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -24,16 +24,17 @@ * #L% */ +import com.google.common.base.Function; import org.apache.commons.logging.Log; import org.junit.Assert; import org.nuiton.topia.it.legacy.TopiaItLegacyTopiaApplicationContext; import org.nuiton.topia.persistence.TopiaApplicationContext; -import org.nuiton.topia.persistence.TopiaDaoSupplier; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.TopiaPersistenceContext; import org.nuiton.topia.persistence.TopiaDao; +import org.nuiton.topia.persistence.TopiaDaoSupplier; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityEnum; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.TopiaPersistenceContext; import org.nuiton.topia.persistence.util.EntityOperator; import org.nuiton.topia.persistence.util.EntityOperatorStore; import org.nuiton.topia.persistence.util.TopiaEntityHelper; @@ -52,8 +53,6 @@ import java.util.Properties; import java.util.Set; -import com.google.common.base.Function; - /** * TopiaReplicationServiceImplTest. * <p/> @@ -111,7 +110,7 @@ sourcePC = sourceContext.newPersistenceContext(); - service = (TopiaReplicationService) sourceContext.getService(TopiaReplicationService.class); + service = sourceContext.getServices(TopiaReplicationService.class).get("replication"); } public void tearDown() throws Exception { 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 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplAllTest.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -285,7 +285,7 @@ // config.setProperty("hibernate.connection.username", "sa"); // config.setProperty("hibernate.connection.password", ""); - config.setProperty(TopiaReplicationServiceImpl.TOPIA_SERVICE_NAME, TopiaReplicationServiceImpl.class.getName()); + config.setProperty("topia.service.replication", TopiaReplicationServiceImpl.class.getName()); return config; } 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 2014-04-27 15:39:03 UTC (rev 3087) +++ trunk/topia-service-replication/src/test/java/org/nuiton/topia/replication/TopiaReplicationServiceImplTest.java 2014-04-30 11:17:38 UTC (rev 3088) @@ -447,7 +447,7 @@ // config.setProperty("hibernate.connection.username", "sa"); // config.setProperty("hibernate.connection.password", ""); - config.setProperty(TopiaReplicationServiceImpl.TOPIA_SERVICE_NAME, TopiaReplicationServiceImpl.class.getName()); + config.setProperty("topia.service.replication", TopiaReplicationServiceImpl.class.getName()); return config; }