You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2015/07/31 12:59:53 UTC

[4/9] isis git commit: ISIS-1182: refactoring ownership of list of services [ABORTIVE: the simpleapp runs up, but todoapp seems to hang?]

ISIS-1182: refactoring ownership of list of services [ABORTIVE: the simpleapp runs up, but todoapp seems to hang?]

- make ServicesInjectorDefault hold the list of services, passed into PersistenceSessionFactory via
  - IsisSystemUsingInstallers#obtainPersistenceSessionFactory
  - PersistenceMechanismInstaller#createPersistenceSessionFactory
  - IsisSystemAbstract#doCreateSessionFactory
    - should call obtainServices and pass them to #createSessionFactory
 move call to validate the services (@PostConstruct and @PreDestroy stuff):
  - relocate to ServicesInjectorSpi
  - moved from IsisSessionFactoryDefault (the validateServices method, can be made static quite easily), and don't call at end of its constructor
  - call from IsisSystemAbstract (after adding the fallback FixtureScriptsDefault service)
- in IsisSystemAbstract, inline newIsisSessionFactory, no need to be separate
- ObjectReflectorDefault, split out initAndValidate so that validation is called not in the ObjectReflector's init, but instead by:
  - IsisSystemFixturesHookAbstract, after calling sessionFactory#init()


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/97013cb3
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/97013cb3
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/97013cb3

Branch: refs/heads/master
Commit: 97013cb3e23e1173260c1aed61164ab40c807766
Parents: f6244c1
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Fri Jul 31 07:06:09 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Fri Jul 31 07:06:09 2015 +0100

----------------------------------------------------------------------
 .../integtestsupport/IsisSystemDefault.java     |   4 +-
 .../isis/core/metamodel/app/IsisMetaModel.java  |   7 +-
 .../services/ServicesInjectorDefault.java       | 129 ++++++++++++++++---
 .../metamodel/services/ServicesInjectorSpi.java |  12 +-
 .../metamodel/MetaModelServiceDefault.java      |  26 +++-
 .../metamodel/spec/SpecificationLoaderSpi.java  |   3 +-
 .../specloader/ObjectReflectorDefault.java      |  28 ++--
 .../metamodel/facets/ProgrammableReflector.java |   5 +
 .../services/ServicesInjectorDefaultTest.java   |   6 +-
 ...ServicesInjectorDefaultTest_usingFields.java |   3 +-
 .../ObjectReflectorDefaultTestAbstract.java     |   2 +-
 .../PersistenceMechanismInstaller.java          |   4 +-
 .../system/IsisSystemFixturesHookAbstract.java  |   7 +-
 .../system/persistence/PersistenceSession.java  |  29 ++---
 .../persistence/PersistenceSessionFactory.java  |  37 +++---
 .../session/IsisSessionFactoryDefault.java      |  78 +----------
 .../IsisSystemAbstract.java                     |  56 +++-----
 .../IsisSystemUsingInstallers.java              |   4 +-
 ...ataNucleusPersistenceMechanismInstaller.java |  17 +--
 .../jdo/service/RegisterEntities.java           |  70 +++++-----
 .../core/runtime/context/IsisContextTest.java   |   2 +-
 ...reTransactionManager_EndTransactionTest.java |   2 +-
 ...oreTransactionManager_InstantiationTest.java |   4 +-
 ...TransactionManager_StartTransactionTest.java |   4 +-
 .../persistence/PersistenceSessionTest.java     |   7 +-
 ...onFactoryAbstractTest_init_and_shutdown.java |   2 +-
 26 files changed, 279 insertions(+), 269 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
index 1e05f65..7a1bae9 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemDefault.java
@@ -195,14 +195,14 @@ public class IsisSystemDefault extends IsisSystemAbstract {
      * The in-memory object store (unless overridden by {@link #obtainPersistenceMechanismInstaller(IsisConfiguration)}).
      */
     @Override
-    protected PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType) throws IsisSystemException {
+    protected PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType, final List<Object> services) throws IsisSystemException {
         PersistenceMechanismInstaller installer = obtainPersistenceMechanismInstaller(getConfiguration());
         if(installer == null) {
             final DataNucleusPersistenceMechanismInstaller persistenceMechanismInstaller = new DataNucleusPersistenceMechanismInstaller();
             persistenceMechanismInstaller.setConfiguration(getConfiguration());
             installer = persistenceMechanismInstaller;
         }
-        return installer.createPersistenceSessionFactory(deploymentType);
+        return installer.createPersistenceSessionFactory(deploymentType, services);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
index 6c881e8..9a19e72 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/app/IsisMetaModel.java
@@ -117,14 +117,15 @@ public class IsisMetaModel implements ApplicationScopedComponent {
 
         reflector = new ObjectReflectorDefault(configuration, programmingModel, facetDecorators, metaModelValidator, layoutMetadataReaders);
 
-        final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault();
-        servicesInjector.setServices(services);
+        final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault(services);
         reflector.setServiceInjector(servicesInjector);
         
         runtimeContext.injectInto(reflector);
         reflector.injectInto(runtimeContext);
 
-        validationFailures = reflector.initAndValidate();
+        reflector.initialize();
+
+        validationFailures = reflector.validate();
         runtimeContext.init();
 
         for (final Object service : services) {

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
index 1fa3dcf..c7b84b9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefault.java
@@ -23,14 +23,19 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -46,6 +51,7 @@ import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
 import org.apache.isis.core.metamodel.spec.SpecificationLoader;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
 import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
+import org.apache.isis.core.metamodel.specloader.ServiceInitializer;
 
 /**
  * Must be a thread-safe.
@@ -54,6 +60,9 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
 
     private static final Logger LOG = LoggerFactory.getLogger(ServicesInjectorDefault.class);
 
+    /**
+     * This is mutable internally, but only ever exposed (in {@link #getRegisteredServices()}) as immutable.
+     */
     private final List<Object> services = Lists.newArrayList();
 
     /**
@@ -64,8 +73,8 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
 
     private final Map<Class<?>, Object> serviceByConcreteType = Maps.newHashMap();
 
-    public ServicesInjectorDefault() {
-        this(null);
+    public ServicesInjectorDefault(final List<Object> services) {
+        this(services, null);
     }
 
     /**
@@ -77,8 +86,11 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
      * </p>
      * @param injectorMethodEvaluator
      */
-    public ServicesInjectorDefault(final InjectorMethodEvaluator injectorMethodEvaluator) {
+    public ServicesInjectorDefault(final List<Object> services, final InjectorMethodEvaluator injectorMethodEvaluator) {
+        this.services.addAll(services);
         this.injectorMethodEvaluator = injectorMethodEvaluator != null ? injectorMethodEvaluator : new InjectorMethodEvaluatorDefault();
+
+        autowireServicesAndContainer();
     }
 
 //region > init, shutdown
@@ -94,19 +106,7 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
 
     //endregion
 
-    //region > setServices, replaceServices
-
-    @Override
-    public void setServices(final List<Object> services) {
-        this.services.clear();
-        addServices(services);
-        autowireServicesAndContainer();
-    }
-
-    public ServicesInjectorDefault withServices(final List<Object> services) {
-        setServices(services);
-        return this;
-    }
+    //region > replaceServices
 
     @Override
     public <T> void replaceService(final T existingService, final T replacementService) {
@@ -137,6 +137,103 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi, Specificati
     }
 
     @Override
+    public <T> void addFallbackIfRequired(final Class<T> serviceClass, final T serviceInstance) {
+        if(!contains(services, serviceClass)) {
+            // add to beginning;
+            // (when first introduced, this feature has been used for the
+            // FixtureScriptsDefault so that appears it top of prototyping menu; not
+            // more flexible than this currently just because of YAGNI).
+            services.add(0, serviceInstance);
+        }
+    }
+
+    /**
+     * Validate domain service Ids are unique, and that the {@link PostConstruct} method, if present, must either
+     * take no arguments or take a {@link Map} object), and that the {@link PreDestroy} method, if present, must take
+     * no arguments.
+     *
+     * <p>
+     * TODO: there seems to be some duplication/overlap with {@link ServiceInitializer}.
+     */
+    @Override
+    public void validateServices() {
+        validate(getRegisteredServices());
+    }
+
+    private static void validate(List<Object> serviceList) {
+        for (Object service : serviceList) {
+            final Method[] methods = service.getClass().getMethods();
+            for (Method method : methods) {
+                validatePostConstructMethods(service, method);
+                validatePreDestroyMethods(service, method);
+            }
+        }
+        ListMultimap<String, Object> servicesById = ArrayListMultimap.create();
+        for (Object service : serviceList) {
+            String id = ServiceUtil.id(service);
+            servicesById.put(id, service);
+        }
+        for (Map.Entry<String, Collection<Object>> servicesForId : servicesById.asMap().entrySet()) {
+            String serviceId = servicesForId.getKey();
+            Collection<Object> services = servicesForId.getValue();
+            if(services.size() > 1) {
+                throw new IllegalStateException(
+                        String.format("Service ids must be unique; serviceId '%s' is declared by domain services %s",
+                                serviceId, classNamesFor(services)));
+            }
+        }
+    }
+
+    private static String classNamesFor(Collection<Object> services) {
+        StringBuilder buf = new StringBuilder();
+        for (Object service : services) {
+            if(buf.length() > 0) {
+                buf.append(", ");
+            }
+            buf.append(service.getClass().getName());
+        }
+        return buf.toString();
+    }
+
+    private static void validatePostConstructMethods(Object service, Method method) {
+        final PostConstruct postConstruct = method.getAnnotation(PostConstruct.class);
+        if(postConstruct == null) {
+            return;
+        }
+        final int numParams = method.getParameterTypes().length;
+        if(numParams == 0) {
+            return;
+        }
+        if(numParams == 1 && method.getParameterTypes()[0].isAssignableFrom(Map.class)) {
+            return;
+        }
+        throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PostConstruct method " + method.getName() + "; such methods must take either no argument or 1 argument of type Map<String,String>");
+    }
+
+    private static void validatePreDestroyMethods(Object service, Method method) {
+        final PreDestroy preDestroy = method.getAnnotation(PreDestroy.class);
+        if(preDestroy == null) {
+            return;
+        }
+        final int numParams = method.getParameterTypes().length;
+        if(numParams == 0) {
+            return;
+        }
+        throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PreDestroy method " + method.getName() + "; such methods must take no arguments");
+    }
+
+
+    static boolean contains(final List<Object> services, final Class<?> serviceClass) {
+        for (Object service : services) {
+            if(serviceClass.isAssignableFrom(service.getClass())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    @Override
     public List<Object> getRegisteredServices() {
         return Collections.unmodifiableList(services);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
index dd351cd..a029d1f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/ServicesInjectorSpi.java
@@ -19,8 +19,6 @@
 
 package org.apache.isis.core.metamodel.services;
 
-import java.util.List;
-
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
@@ -35,12 +33,6 @@ public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injecta
 
 
     /**
-     * Services to be injected.
-     */
-    void setServices(List<Object> services);
-
-
-    /**
      * Update an individual service.
      *
      * <p>
@@ -53,4 +45,8 @@ public interface ServicesInjectorSpi extends ApplicationScopedComponent, Injecta
     <T> void replaceService(T originalService, T replacementService);
 
     boolean isRegisteredService(Class<?> cls);
+
+    <T> void addFallbackIfRequired(Class<T> serviceClass, T serviceInstance);
+
+    void validateServices();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 7952d9e..c1118b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@ -18,6 +18,17 @@
  */
 package org.apache.isis.core.metamodel.services.metamodel;
 
+import java.util.Collections;
+import java.util.List;
+
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.Programmatic;
@@ -33,8 +44,12 @@ import org.apache.isis.core.metamodel.spec.SpecificationLoaderAware;
 )
 public class MetaModelServiceDefault implements MetaModelService, SpecificationLoaderAware {
 
-    private SpecificationLoader specificationLookup;
+    @SuppressWarnings("unused")
+    private final static Logger LOG = LoggerFactory.getLogger(MetaModelServiceDefault.class);
+
 
+
+    //region > fromObjectType, toObjectType
     @Programmatic
     public Class<?> fromObjectType(final String objectType) {
         if(objectType == null) {
@@ -45,7 +60,8 @@ public class MetaModelServiceDefault implements MetaModelService, SpecificationL
         return objectSpecification != null? objectSpecification.getCorrespondingClass(): null;
     }
 
-    @Override public String toObjectType(final Class<?> domainType) {
+    @Override
+    public String toObjectType(final Class<?> domainType) {
         if(domainType == null) {
             return null;
         }
@@ -54,9 +70,15 @@ public class MetaModelServiceDefault implements MetaModelService, SpecificationL
         final ObjectSpecId objectSpecId = objectSpecIdFacet.value();
         return objectSpecId.asString();
     }
+    //endregion
+
+    //region > injected dependencies
+    private SpecificationLoader specificationLookup;
 
     @Override
     public void setSpecificationLookup(final SpecificationLoader specificationLookup) {
         this.specificationLookup = specificationLookup;
     }
+    //endregion
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
index 0b53830..af0aabc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/SpecificationLoaderSpi.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.spec;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
 public interface SpecificationLoaderSpi extends ApplicationScopedComponent, DebuggableWithTitle, SpecificationLoader {
 
@@ -37,4 +36,6 @@ public interface SpecificationLoaderSpi extends ApplicationScopedComponent, Debu
     void invalidateCache(Class<?> domainClass);
     
     boolean isInitialized();
+
+    void validateAndAssert();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index 9cb6f24..22ffd82 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -202,19 +202,27 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     @Override
     public void init() {
 
-        ValidationFailures validationFailures = initAndValidate();
-        
-        validationFailures.assertNone();
-        
+        initialize();
+
         cacheBySpecId();
         
         initialized = true;
     }
 
-    /**
-     * not API; <code>public</code> visibility for benefit of <tt>IsisMetaModel</tt>.
-     */
-    public ValidationFailures initAndValidate() {
+    public void validateAndAssert() {
+        ValidationFailures validationFailures = validate();
+        validationFailures.assertNone();
+
+        cacheBySpecId();
+    }
+
+    public ValidationFailures validate() {
+        ValidationFailures validationFailures = new ValidationFailures();
+        metaModelValidator.validate(validationFailures);
+        return validationFailures;
+    }
+
+    public void initialize() {
         if (LOG.isDebugEnabled()) {
             LOG.debug("initialising " + this);
         }
@@ -237,10 +245,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         metaModelValidator.init();
 
         loadSpecificationsForServices();
-
-        ValidationFailures validationFailures = new ValidationFailures();
-        metaModelValidator.validate(validationFailures);
-        return validationFailures;
     }
 
     private void loadSpecificationsForServices() {

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
index e638f14..da01275 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
@@ -152,4 +152,9 @@ public class ProgrammableReflector extends SpecificationLoaderAbstract implement
         return false;
     }
 
+    @Override
+    public void validateAndAssert() {
+
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
index 361474b..2958892 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
@@ -68,7 +68,9 @@ public class ServicesInjectorDefaultTest {
 
     @Before
     public void setUp() throws Exception {
-        injector = new ServicesInjectorDefault(new InjectorMethodEvaluatorDefault());
+        final Object[] services = { mockContainer, mockService1, mockService2 };
+
+        injector = new ServicesInjectorDefault(Arrays.asList(services), new InjectorMethodEvaluatorDefault());
     }
 
     @After
@@ -77,8 +79,6 @@ public class ServicesInjectorDefaultTest {
 
     @Test
     public void shouldInjectContainer() {
-        final Object[] services = { mockContainer, mockService1, mockService2 };
-        injector.setServices(Arrays.asList(services));
 
         context.checking(new Expectations() {
             {

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
index af6ca86..754bf32 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
@@ -81,12 +81,11 @@ public class ServicesInjectorDefaultTest_usingFields {
         service1 = new SomeDomainService1();
         service3 = new SomeDomainService3();
         service2 = new SomeDomainService2();
-        injector = new ServicesInjectorDefault();
+        injector = new ServicesInjectorDefault(Arrays.asList(container, service1, service3, service2));
     }
 
     @Test
     public void shouldInjectContainer() {
-        injector.setServices(Arrays.asList(container, service1, service3, service2));
 
         injector.injectServicesInto(service1);
         injector.injectServicesInto(service2);

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
index 8f0c611..e7edc32 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
@@ -88,7 +88,7 @@ public abstract class ObjectReflectorDefaultTestAbstract {
                         new MetaModelValidatorDefault(),
                         Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson()));
         reflector.setRuntimeContext(runtimeContext);
-        reflector.setServiceInjector(new ServicesInjectorDefault().withServices(Collections.<Object>singletonList(new DomainObjectContainerDefault())));
+        reflector.setServiceInjector(new ServicesInjectorDefault(Collections.<Object>singletonList(new DomainObjectContainerDefault())));
         reflector.init();
         
         specification = loadSpecification(reflector);

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
index f7594cc..d18f351 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.runtime.installerregistry.installerapi;
 
+import java.util.List;
+
 import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.runtime.persistence.ObjectStoreFactory;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
@@ -32,6 +34,6 @@ public interface PersistenceMechanismInstaller extends Installer, ObjectStoreFac
 
     static String TYPE = "persistor";
 
-    PersistenceSessionFactory createPersistenceSessionFactory(DeploymentType deploymentType);
+    PersistenceSessionFactory createPersistenceSessionFactory(DeploymentType deploymentType, final List<Object> services);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
index 14b32a2..799bc96 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystemFixturesHookAbstract.java
@@ -123,6 +123,10 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
             initContext(sessionFactory);
             sessionFactory.init();
 
+            // validate here after all entities have been registered in the persistence session factory
+            final SpecificationLoaderSpi specificationLoader = sessionFactory.getSpecificationLoader();
+            specificationLoader.validateAndAssert();
+
             serviceInitializer = initializeServices();
 
             installFixturesIfRequired();
@@ -260,6 +264,7 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
      */
     protected abstract IsisSessionFactory doCreateSessionFactory(final DeploymentType deploymentType) throws IsisSystemException;
 
+
     // ///////////////////////////////////////////
     // Configuration
     // ///////////////////////////////////////////
@@ -302,7 +307,7 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
     // PersistenceSessionFactory
     // ///////////////////////////////////////////
 
-    protected abstract PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType) throws IsisSystemException;
+    protected abstract PersistenceSessionFactory obtainPersistenceSessionFactory(DeploymentType deploymentType, final List<Object> services) throws IsisSystemException;
 
     // ///////////////////////////////////////////
     // Fixtures (hooks)

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index d5e01ec..0403b44 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -73,7 +73,6 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
 
     private final PersistenceSessionFactory persistenceSessionFactory;
     private final ObjectAdapterFactory objectAdapterFactory;
-    private final ServicesInjectorSpi servicesInjector;
     private final OidGenerator oidGenerator;
     private final AdapterManagerDefault adapterManager;
 
@@ -87,8 +86,6 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
 
     private boolean dirtiableSupport = true;
 
-
-
     private static enum State {
         NOT_INITIALIZED, OPEN, CLOSED
     }
@@ -101,20 +98,15 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
      */
     public PersistenceSession(
             final PersistenceSessionFactory persistenceSessionFactory,
-            final ServicesInjectorSpi servicesInjector,
             final ObjectStore objectStore,
             final IsisConfiguration configuration) {
 
+
         ensureThatArg(persistenceSessionFactory, is(not(nullValue())), "persistence session factory required");
-        ensureThatArg(servicesInjector, is(not(nullValue())), "services injector required");
         ensureThatArg(objectStore, is(not(nullValue())), "object store required");
 
-        // owning, application scope
         this.persistenceSessionFactory = persistenceSessionFactory;
 
-        // session scope
-        this.servicesInjector = servicesInjector;
-
         this.objectAdapterFactory = new PojoAdapterFactory();
         this.oidGenerator = new OidGenerator(new IdentifierGeneratorUnified(configuration));
         this.adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(configuration));
@@ -122,7 +114,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
         this.objectStore = objectStore;
 
         this.persistenceQueryFactory = new PersistenceQueryFactory(getSpecificationLoader(), adapterManager);
-        this.transactionManager = new IsisTransactionManager(this, objectStore, servicesInjector);
+        this.transactionManager = new IsisTransactionManager(this, objectStore, persistenceSessionFactory.getServicesInjector());
 
         setState(State.NOT_INITIALIZED);
 
@@ -164,9 +156,8 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
         ensureThatState(transactionManager, is(not(nullValue())), "TransactionManager missing");
 
         // inject any required dependencies into object factory
+        final ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
         servicesInjector.injectInto(objectFactory);
-
-        // wire dependencies into adapterManager
         servicesInjector.injectInto(adapterManager);
 
         adapterManager.open();
@@ -188,9 +179,8 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
 
     
     private void initServices() {
-
-        final List<Object> registeredServices = servicesInjector.getRegisteredServices();
-        
+        final List<Object> registeredServices =
+                persistenceSessionFactory.getServicesInjector().getRegisteredServices();
         createServiceAdapters(registeredServices);
     }
 
@@ -224,7 +214,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
      * @return - the service, or <tt>null</tt> if no service registered of specified type.
      */
     public <T> T getServiceOrNull(final Class<T> serviceType) {
-        return servicesInjector.lookupService(serviceType);
+        return persistenceSessionFactory.getServicesInjector().lookupService(serviceType);
     }
 
     // ///////////////////////////////////////////////////////////////////////////
@@ -516,7 +506,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
 
     // REVIEW why does this get called multiple times when starting up
     public List<ObjectAdapter> getServices() {
-        final List<Object> services = servicesInjector.getRegisteredServices();
+        final List<Object> services = persistenceSessionFactory.getServicesInjector().getRegisteredServices();
         final List<ObjectAdapter> serviceAdapters = Lists.newArrayList();
         for (final Object servicePojo : services) {
             serviceAdapters.add(getService(servicePojo));
@@ -913,7 +903,6 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
     @Override
     public void debugData(final DebugBuilder debug) {
         debug.appendTitle(getClass().getName());
-        debug.appendln("container", servicesInjector);
         debug.appendln();
 
         adapterManager.debugData(debug);
@@ -926,7 +915,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
         debug.appendln();
 
         debug.appendTitle("Services");
-        for (final Object servicePojo : servicesInjector.getRegisteredServices()) {
+        for (final Object servicePojo : persistenceSessionFactory.getServicesInjector().getRegisteredServices()) {
             final String id = ServiceUtil.id(servicePojo);
             final Class<? extends Object> serviceClass = servicePojo.getClass();
             final ObjectSpecification serviceSpecification = getSpecificationLoader().loadSpecification(serviceClass);
@@ -1030,7 +1019,7 @@ public class PersistenceSession implements SessionScopedComponent, DebuggableWit
      * The configured {@link ServicesInjectorSpi}.
      */
     public ServicesInjectorSpi getServicesInjector() {
-        return servicesInjector;
+        return persistenceSessionFactory.getServicesInjector();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
index 2b203a2..fe989cb 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
@@ -21,8 +21,10 @@ package org.apache.isis.core.runtime.system.persistence;
 
 import java.util.List;
 import java.util.Properties;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
@@ -42,7 +44,10 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
 
 /**
  * Implementation that just delegates to a supplied
@@ -56,23 +61,23 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
     private final IsisConfiguration configuration;
     private final ObjectStoreFactory objectStoreFactory;
 
-    /**
-     * @see #setServices(List)
-     */
-    private List<Object> serviceList;
-
     private Boolean fixturesInstalled;
 
-    private final ServicesInjectorSpi servicesInjector = new ServicesInjectorDefault();
+    private final ServicesInjectorSpi servicesInjector;
     private RuntimeContext runtimeContext;
 
     public PersistenceSessionFactory(
             final DeploymentType deploymentType,
+            final List<Object> serviceList,
             final IsisConfiguration isisConfiguration,
             final ObjectStoreFactory objectStoreFactory) {
+
+        ensureThatState(serviceList, is(notNullValue()));
+
         this.deploymentType = deploymentType;
         this.configuration = isisConfiguration;
         this.objectStoreFactory = objectStoreFactory;
+        servicesInjector = new ServicesInjectorDefault(serviceList);
     }
 
     public DeploymentType getDeploymentType() {
@@ -92,20 +97,13 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
         ServicesInjectorSpi servicesInjector = getServicesInjector();
 
         final ObjectStore objectStore = objectStoreFactory.createObjectStore(getConfiguration());
-
         ensureThatArg(objectStore, is(not(nullValue())));
 
-        final PersistenceSession persistenceSession = new PersistenceSession(this, servicesInjector, objectStore, getConfiguration());
-
-
-        return persistenceSession;
+        return new PersistenceSession(this, objectStore, getConfiguration());
     }
 
     public final void init() {
 
-        // check prereq dependencies injected
-        ensureThatState(serviceList, is(notNullValue()));
-
         // a bit of a workaround, but required if anything in the metamodel (for
         // example, a
         // ValueSemanticsProvider for a date value type) needs to use the Clock
@@ -124,13 +122,12 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
         runtimeContext.injectInto(servicesInjector);
         
         // wire up components
-
         getSpecificationLoader().injectInto(runtimeContext);
-        for (Object service : serviceList) {
+
+        for (Object service : servicesInjector.getRegisteredServices()) {
             runtimeContext.injectInto(service);
         }
 
-        servicesInjector.setServices(serviceList);
         servicesInjector.init();
     }
 
@@ -211,10 +208,6 @@ public class PersistenceSessionFactory implements MetaModelRefiner, ApplicationS
     // Dependencies (injected via setters)
     // //////////////////////////////////////////////////////
 
-    public void setServices(final List<Object> serviceList) {
-        this.serviceList = serviceList;
-    }
-
     // //////////////////////////////////////////////////////
     // Dependencies (from context)
     // //////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
index d575c6f..1d38172 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryDefault.java
@@ -72,7 +72,6 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
     private final AuthenticationManager authenticationManager;
     private final AuthorizationManager authorizationManager;
     private final PersistenceSessionFactory persistenceSessionFactory;
-    private final List<Object> serviceList;
     private final OidMarshaller oidMarshaller;
 
     public IsisSessionFactoryDefault(
@@ -82,7 +81,6 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
             final AuthenticationManager authenticationManager,
             final AuthorizationManager authorizationManager,
             final PersistenceSessionFactory persistenceSessionFactory,
-            final List<Object> serviceList,
             final OidMarshaller oidMarshaller) {
 
         ensureThatArg(deploymentType, is(not(nullValue())));
@@ -91,7 +89,6 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
         ensureThatArg(authenticationManager, is(not(nullValue())));
         ensureThatArg(authorizationManager, is(not(nullValue())));
         ensureThatArg(persistenceSessionFactory, is(not(nullValue())));
-        ensureThatArg(serviceList, is(not(nullValue())));
 
         this.deploymentType = deploymentType;
         this.configuration = configuration;
@@ -99,80 +96,9 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
         this.authenticationManager = authenticationManager;
         this.authorizationManager = authorizationManager;
         this.persistenceSessionFactory = persistenceSessionFactory;
-        this.serviceList = serviceList;
         this.oidMarshaller = oidMarshaller;
-        
-        validateServices(serviceList);
-    }
-
-    /**
-     * Validate domain service Ids are unique, and that the {@link PostConstruct} method, if present, must either 
-     * take no arguments or take a {@link Map} object), and that the {@link PreDestroy} method, if present, must take 
-     * no arguments.
-     * 
-     * <p>
-     * TODO: there seems to be some duplication/overlap with {@link ServiceInitializer}.
-     */
-    private void validateServices(List<Object> serviceList) {
-        for (Object service : serviceList) {
-            final Method[] methods = service.getClass().getMethods();
-            for (Method method : methods) {
-                validatePostConstructMethods(service, method);
-                validatePreDestroyMethods(service, method);
-            }
-        }
-        
-        ListMultimap<String, Object> servicesById = ArrayListMultimap.create();
-        for (Object service : serviceList) {
-            String id = ServiceUtil.id(service);
-            servicesById.put(id, service);
-        }
-        for (Entry<String, Collection<Object>> servicesForId : servicesById.asMap().entrySet()) {
-            String serviceId = servicesForId.getKey();
-            Collection<Object> services = servicesForId.getValue();
-            if(services.size() > 1) {
-                throw new IllegalStateException("Service ids must be unique; serviceId '" + serviceId + "' is declared by domain services " + classNamesFor(services)); 
-            }
-        }
     }
 
-    private static String classNamesFor(Collection<Object> services) {
-        StringBuilder buf = new StringBuilder();
-        for (Object service : services) {
-            if(buf.length() > 0) {
-                buf.append(", ");
-            }
-            buf.append(service.getClass().getName());
-        }
-        return buf.toString();
-    }
-
-    private void validatePostConstructMethods(Object service, Method method) {
-        final PostConstruct postConstruct = method.getAnnotation(PostConstruct.class);
-        if(postConstruct == null) {
-            return;
-        }
-        final int numParams = method.getParameterTypes().length;
-        if(numParams == 0) {
-            return;
-        }
-        if(numParams == 1 && method.getParameterTypes()[0].isAssignableFrom(Map.class)) {
-            return;
-        }
-        throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PostConstruct method " + method.getName() + "; such methods must take either no argument or 1 argument of type Map<String,String>"); 
-    }
-
-    private void validatePreDestroyMethods(Object service, Method method) {
-        final PreDestroy preDestroy = method.getAnnotation(PreDestroy.class);
-        if(preDestroy == null) {
-            return;
-        }
-        final int numParams = method.getParameterTypes().length;
-        if(numParams == 0) {
-            return;
-        }
-        throw new IllegalStateException("Domain service " + service.getClass().getName() + " has @PreDestroy method " + method.getName() + "; such methods must take no arguments"); 
-    }
 
 
     // ///////////////////////////////////////////
@@ -186,14 +112,12 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
     @Override
     public void init() {
         final ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
-        servicesInjector.setServices(serviceList);
         specificationLoaderSpi.setServiceInjector(servicesInjector);
 
         specificationLoaderSpi.init();
 
         // must come after init of spec loader.
         specificationLoaderSpi.injectInto(persistenceSessionFactory);
-        persistenceSessionFactory.setServices(serviceList);
 
         authenticationManager.init();
         authorizationManager.init();
@@ -263,7 +187,7 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
 
     @Override
     public List<Object> getServices() {
-        return serviceList;
+        return getPersistenceSessionFactory().getServicesInjector().getRegisteredServices();
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
index 53981a7..9341c50 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemAbstract.java
@@ -22,8 +22,10 @@ package org.apache.isis.core.runtime.systemusinginstallers;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.applib.fixturescripts.FixtureScripts;
 import org.apache.isis.applib.services.fixturespec.FixtureScriptsDefault;
@@ -34,13 +36,13 @@ import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.lang.ListExtensions;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
+import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authentication.exploration.ExplorationSession;
 import org.apache.isis.core.runtime.authorization.AuthorizationManager;
 import org.apache.isis.core.runtime.fixtures.FixturesInstaller;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.IsisSystemException;
@@ -49,6 +51,7 @@ import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.internal.InitialisationSession;
 import org.apache.isis.core.runtime.system.internal.IsisLocaleInitializer;
 import org.apache.isis.core.runtime.system.internal.IsisTimeZoneInitializer;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactoryDefault;
 
@@ -152,14 +155,15 @@ public abstract class IsisSystemAbstract extends IsisSystemFixturesHookAbstract
 
     @Override
     public IsisSessionFactory doCreateSessionFactory(final DeploymentType deploymentType) throws IsisSystemException {
-        final PersistenceSessionFactory persistenceSessionFactory = obtainPersistenceSessionFactory(deploymentType);
+        final List<Object> services = obtainServices();
+        final PersistenceSessionFactory persistenceSessionFactory = obtainPersistenceSessionFactory(deploymentType, services);
         return createSessionFactory(deploymentType, persistenceSessionFactory);
     }
 
     /**
      * Overloaded version designed to be called by subclasses that need to
      * explicitly specify different persistence mechanisms.
-     * 
+     *
      * <p>
      * This is <i>not</i> a hook method, rather it is designed to be called
      * <i>from</i> the {@link #doCreateSessionFactory(DeploymentType) hook
@@ -167,61 +171,35 @@ public abstract class IsisSystemAbstract extends IsisSystemFixturesHookAbstract
      */
     protected final IsisSessionFactory createSessionFactory(
             final DeploymentType deploymentType,
-            final PersistenceSessionFactory persistenceSessionFactory) throws IsisSystemException {
+    final PersistenceSessionFactory persistenceSessionFactory) throws IsisSystemException {
 
         final IsisConfiguration configuration = getConfiguration();
         final AuthenticationManager authenticationManager = obtainAuthenticationManager(deploymentType);
         final AuthorizationManager authorizationManager = obtainAuthorizationManager(deploymentType);
         final OidMarshaller oidMarshaller = obtainOidMarshaller();
-        
-        final Collection<MetaModelRefiner> metaModelRefiners = refiners(authenticationManager, authorizationManager, persistenceSessionFactory);
+
+        final Collection<MetaModelRefiner> metaModelRefiners =
+                refiners(authenticationManager, authorizationManager, persistenceSessionFactory);
         final SpecificationLoaderSpi reflector = obtainSpecificationLoaderSpi(deploymentType, metaModelRefiners);
 
-        final List<Object> services = obtainServices();
-        if(!contains(services, FixtureScripts.class)) {
-            // add to beginning so that appears at top of prototyping menu.
-            services.add(0, new FixtureScriptsDefault());
-        }
+        ServicesInjectorSpi servicesInjector = persistenceSessionFactory.getServicesInjector();
+        servicesInjector.addFallbackIfRequired(FixtureScripts.class, new FixtureScriptsDefault());
+        servicesInjector.validateServices();
 
         // bind metamodel to the (runtime) framework
         final RuntimeContextFromSession runtimeContext = obtainRuntimeContextFromSession();
         runtimeContext.injectInto(reflector);
 
-        return newIsisSessionFactory(
-                deploymentType,
-                persistenceSessionFactory,
-                configuration,
+        return new IsisSessionFactoryDefault(
+                deploymentType, configuration, reflector,
                 authenticationManager, authorizationManager,
-                oidMarshaller,
-                reflector,
-                services);
+                persistenceSessionFactory, oidMarshaller);
     }
 
-    static boolean contains(final List<Object> services, final Class<?> serviceClass) {
-        for (Object service : services) {
-            if(serviceClass.isAssignableFrom(service.getClass())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-
     protected RuntimeContextFromSession obtainRuntimeContextFromSession() {
         return new RuntimeContextFromSession();
     }
 
-    protected IsisSessionFactoryDefault newIsisSessionFactory(
-            final DeploymentType deploymentType,
-            final PersistenceSessionFactory persistenceSessionFactory,
-            final IsisConfiguration configuration,
-            final AuthenticationManager authenticationManager, final AuthorizationManager authorizationManager,
-            final OidMarshaller oidMarshaller,
-            final SpecificationLoaderSpi reflector,
-            final List<Object> services) {
-        return new IsisSessionFactoryDefault(deploymentType, configuration, reflector, authenticationManager, authorizationManager, persistenceSessionFactory, services, oidMarshaller);
-    }
-
     private static Collection<MetaModelRefiner> refiners(Object... possibleRefiners ) {
         return ListExtensions.filtered(Arrays.asList(possibleRefiners), MetaModelRefiner.class);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
index a14f917..46a046e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisSystemUsingInstallers.java
@@ -216,7 +216,7 @@ public class IsisSystemUsingInstallers extends IsisSystemAbstract {
     }
 
     @Override
-    protected PersistenceSessionFactory obtainPersistenceSessionFactory(final DeploymentType deploymentType) throws IsisSystemException {
+    protected PersistenceSessionFactory obtainPersistenceSessionFactory(final DeploymentType deploymentType, final List<Object> services) throws IsisSystemException {
 
         // look for a object store persistor
         if (persistenceMechanismInstaller == null) {
@@ -225,6 +225,6 @@ public class IsisSystemUsingInstallers extends IsisSystemAbstract {
         }
 
         ensureThatState(persistenceMechanismInstaller, is(not(nullValue())), "persistor installer has not been injected and could not be looked up");
-        return persistenceMechanismInstaller.createPersistenceSessionFactory(deploymentType);
+        return persistenceMechanismInstaller.createPersistenceSessionFactory(deploymentType, services);
     }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index 50ce240..7aeb633 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -89,8 +89,9 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
 
     //region > createPersistenceSessionFactory
     @Override
-    public PersistenceSessionFactory createPersistenceSessionFactory(final DeploymentType deploymentType) {
-        return new PersistenceSessionFactory(deploymentType, getConfiguration(), this);
+    public PersistenceSessionFactory createPersistenceSessionFactory(
+            final DeploymentType deploymentType, final List<Object> services) {
+        return new PersistenceSessionFactory(deploymentType, services, getConfiguration(), this);
     }
     //endregion
 
@@ -108,7 +109,8 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
     
     private DataNucleusApplicationComponents applicationComponents = null;
 
-    private DataNucleusApplicationComponents createDataNucleusApplicationComponentsIfRequired(IsisConfiguration configuration) {
+    private DataNucleusApplicationComponents createDataNucleusApplicationComponentsIfRequired(
+            final IsisConfiguration configuration) {
 
         if (applicationComponents == null || applicationComponents.isStale()) {
 
@@ -118,7 +120,8 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
             final Map<String, String> datanucleusProps = dataNucleusConfig.asMap();
             addDataNucleusPropertiesIfRequired(datanucleusProps);
 
-            final Set<String> classesToBePersisted = catalogClassesToBePersisted(configuration);
+            final RegisterEntities registerEntities = new RegisterEntities(configuration.asMap());
+            final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
 
             applicationComponents = new DataNucleusApplicationComponents(jdoObjectstoreConfig, datanucleusProps, classesToBePersisted);
         }
@@ -126,12 +129,6 @@ public class DataNucleusPersistenceMechanismInstaller extends InstallerAbstract
         return applicationComponents;
     }
 
-    private static Set<String> catalogClassesToBePersisted(
-            final IsisConfiguration configuration) {
-        return new RegisterEntities(configuration.asMap()).getEntityTypes();
-    }
-
-
     private static void addDataNucleusPropertiesIfRequired(
             final Map<String, String> props) {
         

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
index 1e02568..1892594 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.objectstore.jdo.service;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -25,80 +26,73 @@ import java.util.Set;
 import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.util.ScanUtils;
 
 public class RegisterEntities {
 
-    @SuppressWarnings("unused")
-    private final static Logger LOG = LoggerFactory.getLogger(RegisterEntities.class);
-    
     public final static String PACKAGE_PREFIX_KEY = "isis.persistor.datanucleus.RegisterEntities.packagePrefix";
 
-    private String packagePrefixes;
+    //region > init
 
     public RegisterEntities(final Map<String, String> configuration) {
-        packagePrefixes = configuration.get(PACKAGE_PREFIX_KEY);
+        String packagePrefixes = configuration.get(PACKAGE_PREFIX_KEY);
         if(Strings.isNullOrEmpty(packagePrefixes)) {
             throw new IllegalStateException("Could not locate '" + PACKAGE_PREFIX_KEY + "' key in property files - aborting");
         }
-        
-        discoverAllPersistenceCapables();
+
+        domPackages = parseDomPackages(packagePrefixes);
+        this.entityTypes = scanForEntityTypesIn(this.domPackages);
     }
 
-    private void discoverAllPersistenceCapables() {
+    //endregion
 
-        final List<String> packagePrefixList = Lists.newArrayList(Iterables.transform(Splitter.on(",").split(packagePrefixes), trim()));
-        for (final String packagePrefix : packagePrefixList) {
+    //region > domPackages
+    private List<String> domPackages;
 
-            final Iterable<String> entityTypes = ScanUtils.scanForNamesOfClassesWithAnnotation(packagePrefixList, PersistenceCapable.class);
-            if(notEmpty(entityTypes)) {
-                throw new IllegalStateException("Could not locate any @PersistenceCapable entities in package " + packagePrefix);
-            }
-            this.entityTypes = Sets.newLinkedHashSet(entityTypes);
-        }
+    public List<String> getDomPackages() {
+        return domPackages;
     }
+    //endregion
 
+    //region > entityTypes
     private Set<String> entityTypes;
 
-    @Programmatic
     public Set<String> getEntityTypes() {
         return entityTypes;
     }
-
-    private static Function<String,String> trim() {
-        return new Function<String,String>(){
-            @Override
-            public String apply(String input) {
-                return input.trim();
+    //endregion
+
+    //region > helpers
+    private static Set<String> scanForEntityTypesIn(final List<String> domPackages) {
+        Set<String> entityTypes = Sets.newLinkedHashSet();
+        for (final String packagePrefix : domPackages) {
+            final Iterable<String> entityTypes1 = ScanUtils.scanForNamesOfClassesWithAnnotation(domPackages, PersistenceCapable.class);
+            if(Iterables.isEmpty(entityTypes1)) {
+                throw new IllegalStateException("Could not locate any @PersistenceCapable entities in package " + packagePrefix);
             }
-        };
+            Iterables.addAll(entityTypes, entityTypes1);
+        }
+        return entityTypes;
     }
 
-    /**
-     * legacy from using <tt>org.reflections.Reflections</tt> that seems to return a set with 1 null element if none can be found.
-     */
-    private static <T> boolean notEmpty(Iterable<T> set) {
-        return Iterables.filter(set, isNull()).iterator().hasNext();
+    private static List<String> parseDomPackages(String packagePrefixes) {
+        return Collections.unmodifiableList(Lists.newArrayList(Iterables.transform(Splitter.on(",").split(packagePrefixes), trim())));
     }
 
-    private static <T> Predicate<T> isNull() {
-        return new Predicate<T>() {
+    private static Function<String,String> trim() {
+        return new Function<String,String>(){
             @Override
-            public boolean apply(T input) {
-                return input == null;
+            public String apply(String input) {
+                return input.trim();
             }
         };
     }
+    //endregion
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
index 73cf1be..5838ace 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/context/IsisContextTest.java
@@ -102,7 +102,7 @@ public class IsisContextTest {
             }
         });
 
-        sessionFactory = new IsisSessionFactoryDefault(DeploymentType.UNIT_TESTING, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, servicesList, oidMarshaller);
+        sessionFactory = new IsisSessionFactoryDefault(DeploymentType.UNIT_TESTING, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, oidMarshaller);
         authSession = new SimpleSession("tester", Collections.<String>emptyList());
         
         IsisContext.setConfiguration(configuration);

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
index f9cc749..ef9d3b7 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_EndTransactionTest.java
@@ -68,7 +68,7 @@ public class ObjectStoreTransactionManager_EndTransactionTest {
             will(returnValue(mockMessageBroker));
         }});
 
-        transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault()) {
+        transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault(Collections.emptyList())) {
             @Override
             public AuthenticationSession getAuthenticationSession() {
                 return mockAuthenticationSession;

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
index d064e5d..e917802 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_InstantiationTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.runtime.persistence.objectstore.transaction;
 
+import java.util.Collections;
+
 import org.jmock.auto.Mock;
 import org.junit.Rule;
 import org.junit.Test;
@@ -44,7 +46,7 @@ public class ObjectStoreTransactionManager_InstantiationTest {
 
     @Test
     public void canInstantiate() throws Exception {
-        transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault());
+        transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault(Collections.emptyList()));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
index 14f67e9..cb8fe52 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/ObjectStoreTransactionManager_StartTransactionTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.runtime.persistence.objectstore.transaction;
 
+import java.util.Collections;
+
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.Before;
@@ -56,7 +58,7 @@ public class ObjectStoreTransactionManager_StartTransactionTest {
 
     @Before
     public void setUpTransactionManager() throws Exception {
-        transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault()) {
+        transactionManager = new IsisTransactionManager(mockPersistenceSession, mockObjectStore, new ServicesInjectorDefault(Collections.emptyList())) {
             @Override
             protected AuthenticationSession getAuthenticationSession() {
                 return mockAuthenticationSession;

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
index 3cf5d3a..87408d4 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionTest.java
@@ -147,11 +147,12 @@ public class PersistenceSessionTest {
 
         runtimeContext.injectInto(container);
 
-        servicesInjector = new ServicesInjectorDefault(new InjectorMethodEvaluatorDefault());
+        servicesInjector = new ServicesInjectorDefault(
+                Collections.<Object>singletonList(container),new InjectorMethodEvaluatorDefault());
 
         adapterManager = new AdapterManagerDefault(new PojoRecreatorUnified(mockConfiguration));
         adapterFactory = new PojoAdapterFactory();
-        persistenceSession = new PersistenceSession(mockPersistenceSessionFactory, servicesInjector, mockObjectStore, mockConfiguration) {
+        persistenceSession = new PersistenceSession(mockPersistenceSessionFactory, mockObjectStore, mockConfiguration) {
             @Override
             protected SpecificationLoaderSpi getSpecificationLoader() {
                 return isisMetaModel.getSpecificationLoader();
@@ -159,8 +160,6 @@ public class PersistenceSessionTest {
             
         };
         
-        servicesInjector.setServices(Collections.<Object>singletonList(container));
-        
         context.checking(new Expectations(){{
             allowing(mockAuthenticationSession).getUserName();
             will(returnValue("sven"));

http://git-wip-us.apache.org/repos/asf/isis/blob/97013cb3/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
index 2ba697e..77af285 100644
--- a/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
+++ b/core/runtime/src/test/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstractTest_init_and_shutdown.java
@@ -84,7 +84,7 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
     public void validate_DomainServicesWithDuplicateIds() {
         serviceList.add(new DomainServiceWithSomeId());
         serviceList.add(new DomainServiceWithDuplicateId());
-        isf = new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, serviceList, mockOidMarshaller) {
+        isf = new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockPersistenceSessionFactory, mockOidMarshaller) {
         };
     }
 }