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 2013/11/21 13:22:57 UTC

[2/5] git commit: ISIS-597: use ServicesInjectorDefault to wire services prior to postconstruct

ISIS-597: use ServicesInjectorDefault to wire services prior to postconstruct

In addition, currently the DomainObjectContainer is built lazily, much later on,
by the PersistenceMechanism.  There doesn't really seem to be any good
reason for this.  So, moving this responsibility earlier.

In addition, since IsisSessionFactoryDefault did nothing other than delegate to
its superclass, IsisSessionFactoryAbstract, have collapsed this hierarchy.


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

Branch: refs/heads/master
Commit: e188eb81529298814d46efe26f7b7d11d1510617
Parents: c2f4d8c
Author: Dan Haywood <da...@apache.org>
Authored: Thu Nov 21 09:41:08 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Nov 21 09:41:08 2013 +0000

----------------------------------------------------------------------
 ...ataNucleusPersistenceMechanismInstaller.java |   4 +-
 .../internal/UserProfileDataHandlerTest.java    |  13 +-
 .../text/MultilineTextFieldContentTest.java     |   9 +-
 .../dnd/view/text/TextFieldContentTest.java     |  21 +-
 .../viewer/basic/ActionFieldBuilderTest.java    |   7 +-
 .../dnd/viewer/basic/ScrollBorderTest.java      |  44 ++-
 .../integtestsupport/IsisSystemDefault.java     |   1 +
 .../container/DomainObjectContainerDefault.java |   1 -
 .../metamodel/spec/SpecificationLoaderSpi.java  |  10 +-
 .../specloader/ObjectReflectorDefault.java      |  27 +-
 .../specloader/ServiceInitializer.java          |  21 +-
 .../isis/core/progmodel/app/IsisMetaModel.java  |   5 +-
 .../adapter/oid/OidMarshallerTest_marshal.java  |   4 +-
 .../specloader/ServiceInitializerTest.java      |  17 +-
 .../progmodel/app/IsisMetaModelTest_init.java   |   8 +-
 .../app/IsisMetaModelTest_shutdown.java         | 142 ---------
 .../progmodel/facets/ProgrammableReflector.java |   7 +
 .../ObjectReflectorDefaultTestAbstract.java     |  15 +-
 .../PersistenceMechanismInstallerAbstract.java  |  17 --
 .../PersistenceSessionFactoryDelegate.java      |   3 -
 .../PersistenceSessionFactoryDelegating.java    |  32 +-
 .../system/IsisSystemFixturesHookAbstract.java  |  24 +-
 .../session/IsisSessionFactoryAbstract.java     | 293 -------------------
 .../session/IsisSessionFactoryDefault.java      | 277 +++++++++++++++++-
 .../IsisSystemAbstract.java                     |   6 +-
 .../IsisSystemUsingInstallers.java              |  10 +-
 .../core/runtime/context/IsisContextTest.java   |   8 +-
 ...onFactoryAbstractTest_init_and_shutdown.java |  28 +-
 28 files changed, 481 insertions(+), 573 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
index ab83a5e..8b68d9b 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusPersistenceMechanismInstaller.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
@@ -233,7 +234,4 @@ public class DataNucleusPersistenceMechanismInstaller extends PersistenceMechani
         return IsisContext.getSpecificationLoader();
     }
 
-
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/component/profilestore/xml/src/test/java/org/apache/isis/profilestore/xml/internal/UserProfileDataHandlerTest.java
----------------------------------------------------------------------
diff --git a/component/profilestore/xml/src/test/java/org/apache/isis/profilestore/xml/internal/UserProfileDataHandlerTest.java b/component/profilestore/xml/src/test/java/org/apache/isis/profilestore/xml/internal/UserProfileDataHandlerTest.java
index 3091bae..12903a9 100644
--- a/component/profilestore/xml/src/test/java/org/apache/isis/profilestore/xml/internal/UserProfileDataHandlerTest.java
+++ b/component/profilestore/xml/src/test/java/org/apache/isis/profilestore/xml/internal/UserProfileDataHandlerTest.java
@@ -27,10 +27,6 @@ import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.List;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
@@ -39,6 +35,7 @@ import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.XMLReaderFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -73,7 +70,9 @@ public class UserProfileDataHandlerTest {
     private UserProfileLoader mockUserProfileLoader;
     @Mock
     private PersistenceSessionFactory mockPersistenceSessionFactory;
-
+    @Mock
+    private DomainObjectContainer mockContainer;
+    
     private TestServiceObject1 service;
     private UserProfile profile;
 
@@ -82,8 +81,8 @@ public class UserProfileDataHandlerTest {
     public void setup() throws Exception {
         org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
         service = new TestServiceObject1();
-        final IsisSessionFactory executionContextFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, new IsisConfigurationDefault(), mockTemplateImageLoader, mockSpecificationLoader, mockAuthenticationManager,
-                mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, Arrays.<Object>asList(service), new OidMarshaller());
+        final IsisSessionFactory executionContextFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, new IsisConfigurationDefault(), mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager,
+                mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, Arrays.<Object>asList(service), new OidMarshaller());
 
         IsisContextStatic.createRelaxedInstance(executionContextFactory);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/MultilineTextFieldContentTest.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/MultilineTextFieldContentTest.java b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/MultilineTextFieldContentTest.java
index 3429f2e..626b2ef 100644
--- a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/MultilineTextFieldContentTest.java
+++ b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/MultilineTextFieldContentTest.java
@@ -27,6 +27,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -60,15 +61,17 @@ public class MultilineTextFieldContentTest {
     protected AuthenticationManager mockAuthenticationManager;
     @Mock
     protected AuthorizationManager mockAuthorizationManager;
+    @Mock
+    protected DomainObjectContainer mockContainer;
 
     @Before
     public void setUp() throws Exception {
         org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
 
-        context.ignoring(mockTemplateImageLoader, mockSpecificationLoader, mockPersistenceSessionFactory, mockUserProfileLoader, mockAuthenticationManager, mockAuthorizationManager);
+        context.ignoring(mockTemplateImageLoader, mockSpecificationLoader, mockPersistenceSessionFactory, mockUserProfileLoader, mockAuthenticationManager, mockAuthorizationManager, mockContainer);
 
-        final IsisSessionFactoryDefault sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, new IsisConfigurationDefault(), mockTemplateImageLoader, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader,
-                mockPersistenceSessionFactory, Collections.emptyList(), new OidMarshaller());
+        final IsisSessionFactoryDefault sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, new IsisConfigurationDefault(), mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader,
+                mockPersistenceSessionFactory, mockContainer, Collections.emptyList(), new OidMarshaller());
         IsisContextStatic.createRelaxedInstance(sessionFactory);
         sessionFactory.init();
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/TextFieldContentTest.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/TextFieldContentTest.java b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/TextFieldContentTest.java
index 6d6fd73..789c744 100644
--- a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/TextFieldContentTest.java
+++ b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/view/text/TextFieldContentTest.java
@@ -23,12 +23,12 @@ import static org.junit.Assert.assertEquals;
 
 import java.util.Collections;
 
-import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -67,24 +67,17 @@ public class TextFieldContentTest {
     protected AuthenticationManager mockAuthenticationManager;
     @Mock
     protected AuthorizationManager mockAuthorizationManager;
+    @Mock
+    protected DomainObjectContainer mockContainer;
 
     @Before
     public void setUp() throws Exception {
         org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
 
-        context.checking(new Expectations() {
-            {
-                ignoring(mockTemplateImageLoader);
-                ignoring(mockSpecificationLoader);
-                ignoring(mockUserProfileLoader);
-                ignoring(mockPersistenceSessionFactory);
-                ignoring(mockAuthenticationManager);
-                ignoring(mockAuthorizationManager);
-            }
-        });
-
-        final IsisSessionFactory sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, new IsisConfigurationDefault(), mockTemplateImageLoader, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory,
-        		Collections.emptyList(), new OidMarshaller());
+        context.ignoring(mockTemplateImageLoader, mockSpecificationLoader, mockUserProfileLoader, mockPersistenceSessionFactory, mockAuthenticationManager, mockAuthorizationManager, mockContainer);
+
+        final IsisSessionFactory sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, new IsisConfigurationDefault(), mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory,
+        		mockContainer, Collections.emptyList(), new OidMarshaller());
         sessionFactory.init();
         IsisContextStatic.createRelaxedInstance(sessionFactory);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ActionFieldBuilderTest.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ActionFieldBuilderTest.java b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ActionFieldBuilderTest.java
index 3a8846b..487e522 100644
--- a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ActionFieldBuilderTest.java
+++ b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ActionFieldBuilderTest.java
@@ -30,6 +30,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
@@ -73,6 +74,8 @@ public class ActionFieldBuilderTest {
     @Mock
     protected AuthorizationManager mockAuthorizationManager;
 
+    @Mock
+    protected DomainObjectContainer mockContainer;
 
     private IsisConfiguration configuration;
     private List<Object> servicesList;
@@ -100,6 +103,8 @@ public class ActionFieldBuilderTest {
                 ignoring(mockTemplateImageLoader);
                 ignoring(mockAuthenticationManager);
                 ignoring(mockAuthorizationManager);
+                
+                ignoring(mockContainer);
             }
         });
 
@@ -110,7 +115,7 @@ public class ActionFieldBuilderTest {
             }
         };
 
-        final IsisSessionFactoryDefault sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, configuration, mockTemplateImageLoader, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, servicesList, oidMarshaller);
+        final IsisSessionFactoryDefault sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, servicesList, oidMarshaller);
 
         IsisContext.setConfiguration(sessionFactory.getConfiguration());
         IsisContextStatic.createRelaxedInstance(sessionFactory);

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ScrollBorderTest.java
----------------------------------------------------------------------
diff --git a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ScrollBorderTest.java b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ScrollBorderTest.java
index 96637fb..bfca571 100644
--- a/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ScrollBorderTest.java
+++ b/component/viewer/dnd/impl/src/test/java/org/apache/isis/viewer/dnd/viewer/basic/ScrollBorderTest.java
@@ -21,15 +21,13 @@ package org.apache.isis.viewer.dnd.viewer.basic;
 
 import java.util.Collections;
 
-import org.jmock.Expectations;
-import org.jmock.Mockery;
-import org.jmock.integration.junit4.JMock;
-import org.jmock.integration.junit4.JUnit4Mockery;
+import org.jmock.auto.Mock;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.junit.runner.RunWith;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -42,6 +40,8 @@ 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;
 import org.apache.isis.core.runtime.userprofile.UserProfileLoader;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.viewer.dnd.DummyView;
 import org.apache.isis.viewer.dnd.TestToolkit;
 import org.apache.isis.viewer.dnd.drawing.Location;
@@ -50,46 +50,36 @@ import org.apache.isis.viewer.dnd.view.View;
 import org.apache.isis.viewer.dnd.view.ViewAreaType;
 import org.apache.isis.viewer.dnd.view.border.ScrollBorder;
 
-@RunWith(JMock.class)
 public class ScrollBorderTest {
 
-    private final Mockery mockery = new JUnit4Mockery();
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
+    @Mock
     protected TemplateImageLoader mockTemplateImageLoader;
+    @Mock
     protected SpecificationLoaderSpi mockSpecificationLoader;
+    @Mock
     protected PersistenceSessionFactory mockPersistenceSessionFactory;
+    @Mock
     private UserProfileLoader mockUserProfileLoader;
+    @Mock
     protected AuthenticationManager mockAuthenticationManager;
+    @Mock
     protected AuthorizationManager mockAuthorizationManager;
+    @Mock
+    protected DomainObjectContainer mockContainer;
 
     @Before
     public void setUp() throws Exception {
         org.apache.log4j.LogManager.getRootLogger().setLevel(org.apache.log4j.Level.OFF);
 
-        
-
-        mockTemplateImageLoader = mockery.mock(TemplateImageLoader.class);
-        mockSpecificationLoader = mockery.mock(SpecificationLoaderSpi.class);
-        mockUserProfileLoader = mockery.mock(UserProfileLoader.class);
-        mockPersistenceSessionFactory = mockery.mock(PersistenceSessionFactory.class);
-        mockAuthenticationManager = mockery.mock(AuthenticationManager.class);
-        mockAuthorizationManager = mockery.mock(AuthorizationManager.class);
-
-        mockery.checking(new Expectations() {
-            {
-                ignoring(mockTemplateImageLoader);
-                ignoring(mockSpecificationLoader);
-                ignoring(mockUserProfileLoader);
-                ignoring(mockPersistenceSessionFactory);
-                ignoring(mockAuthenticationManager);
-                ignoring(mockAuthorizationManager);
-            }
-        });
+        context.ignoring(mockTemplateImageLoader, mockSpecificationLoader, mockUserProfileLoader, mockPersistenceSessionFactory, mockAuthenticationManager, mockAuthorizationManager, mockContainer);
 
         TestToolkit.createInstance();
 
         final IsisConfigurationDefault configuration = new IsisConfigurationDefault();
-        final IsisSessionFactory sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, configuration, mockTemplateImageLoader, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, Collections.emptyList(), new OidMarshaller());
+        final IsisSessionFactory sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, Collections.emptyList(), new OidMarshaller());
         sessionFactory.init();
         IsisContextStatic.createRelaxedInstance(sessionFactory);
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 222908a..b8a1beb 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
@@ -26,6 +26,7 @@ import java.util.Set;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.commons.resource.ResourceStreamSourceContextLoaderClassPath;

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
index 9cf7636..14ebbd6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/container/DomainObjectContainerDefault.java
@@ -78,7 +78,6 @@ public class  DomainObjectContainerDefault implements DomainObjectContainer, Que
     private LocalizationProvider localizationProvider;
 
     public DomainObjectContainerDefault() {
-
     }
 
     // //////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 f1dc0d0..8b79589 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
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.spec;
 
 import java.util.List;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
@@ -28,9 +29,16 @@ import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures;
 
 public interface SpecificationLoaderSpi extends ApplicationScopedComponent, DebuggableWithTitle, SpecificationLoader {
 
-
+    /**
+     * Specify the {@link DomainObjectContainer} as part of initializing the services.
+     * 
+     * @see #setServices(List)
+     */
+    void setContainer(DomainObjectContainer container);
     /**
      * Specify the services to pro-actively prime the cache, and to initialize them also.
+     * 
+     * @see #setContainer(DomainObjectContainer)
      */
     void setServices(List<Object> services);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 cd5b944..03d15db 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
@@ -41,6 +41,7 @@ import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
@@ -176,9 +177,13 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     private final SpecificationTraverser specificationTraverser;
 
     /**
-     * Priming cache, optionally {@link #setServices(List) injected}.
+     * @see #setContainer(DomainObjectContainer)
      */
-    private List<Object> services = Lists.newArrayList();
+    private DomainObjectContainer container;
+    /**
+     * @see #setServices(List)
+     */
+    private List<Object> services;
 
     private final MetaModelValidator metaModelValidator;
     private final SpecificationCacheDefault cache = new SpecificationCacheDefault();
@@ -190,9 +195,13 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     // /////////////////////////////////////////////////////////////
 
     public ObjectReflectorDefault(
-            final IsisConfiguration configuration, final ClassSubstitutor classSubstitutor, 
-            final CollectionTypeRegistry collectionTypeRegistry, final SpecificationTraverser specificationTraverser,
-            final ProgrammingModel programmingModel, final Set<FacetDecorator> facetDecorators, final MetaModelValidator metaModelValidator) {
+            final IsisConfiguration configuration, 
+            final ClassSubstitutor classSubstitutor, 
+            final CollectionTypeRegistry collectionTypeRegistry, 
+            final SpecificationTraverser specificationTraverser,
+            final ProgrammingModel programmingModel, 
+            final Set<FacetDecorator> facetDecorators, 
+            final MetaModelValidator metaModelValidator) {
 
         ensureThatArg(configuration, is(notNullValue()));
         ensureThatArg(classSubstitutor, is(notNullValue()));
@@ -366,8 +375,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
 
     protected void initServices(IsisConfiguration configuration) {
         final List<Object> services = getServices();
-        
-        serviceInitializer.init(configuration, services);
+        serviceInitializer.init(configuration, container, services);
         serviceInitializer.postConstruct();
     }
 
@@ -678,6 +686,11 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     }
     
     @Override
+    public void setContainer(final DomainObjectContainer container) {
+        this.container = container;
+    }
+    
+    @Override
     public void setServices(final List<Object> services) {
         this.services = services;
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
index 628f2f8..b65d490 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ServiceInitializer.java
@@ -19,19 +19,19 @@ package org.apache.isis.core.metamodel.specloader;
 import java.lang.reflect.Method;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 
-import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.lang.MethodExtensions;
+import org.apache.isis.core.metamodel.services.ServicesInjectorDefault;
 
 class ServiceInitializer {
 
@@ -50,8 +50,23 @@ class ServiceInitializer {
 
     // //////////////////////////////////////
 
+    ServiceInitializer() {
+    }
+    
+    public void init(final IsisConfiguration configuration, DomainObjectContainer container, final List<Object> services) {
+        
+        // all a bit hacky... :-(
+        // (a) newing up a new ServicesInjector
+        // (b) the guard, because of insufficient mock expectations in unit tests :-(
+        if (container == null || services == null) {
+            return;
+        } 
+        final ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault();
+        servicesInjector.setContainer(container);
+        servicesInjector.setServices(services);
+        servicesInjector.init();
 
-    public void init(final IsisConfiguration configuration, final List<Object> services) {
+        
         this.props = configuration.asMap();
         
         for (final Object service : services) {

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
index ee2f369..8df142c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/app/IsisMetaModel.java
@@ -145,7 +145,7 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         setMetaModelValidator(new MetaModelValidatorDefault());
     }
 
-    private void setContainer(DomainObjectContainer container) {
+    private void setContainer(final DomainObjectContainer container) {
         this.container = container;
     }
 
@@ -171,6 +171,9 @@ public class IsisMetaModel implements ApplicationScopedComponent {
         ensureNotInitialized();
         reflector = new ObjectReflectorDefault(configuration, classSubstitutor, collectionTypeRegistry, specificationTraverser, programmingModel, facetDecorators, metaModelValidator);
 
+        reflector.setContainer(container);
+        reflector.setServices(services);
+        
         runtimeContext.injectInto(container);
         runtimeContext.setContainer(container);
         runtimeContext.injectInto(reflector);

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
index 2e8b4ee..aab5945 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/adapter/oid/OidMarshallerTest_marshal.java
@@ -61,7 +61,9 @@ public class OidMarshallerTest_marshal {
 
     @Test
     public void rootOid_versionSequenceAndUserThatHasAnAtSymbol() {
-        final String marshal = oidMarshaller.marshal(RootOidDefault.create(ObjectSpecId.of("CUS"),  "123", 90807L, "joebloggs@foo.bar"));
+        final ObjectSpecId objectSpecId = ObjectSpecId.of("CUS");
+        final RootOidDefault oid = RootOidDefault.create(objectSpecId,  "123", 90807L, "joebloggs@foo.bar");
+        final String marshal = oidMarshaller.marshal(oid);
         assertThat(marshal, equalTo("CUS:123^90807:joebloggs%40foo.bar:"));
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
index de7a0f2..df2b1a3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ServiceInitializerTest.java
@@ -38,6 +38,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -49,6 +50,8 @@ public class ServiceInitializerTest {
     
     private Map<String,String> props;
     @Mock
+    private DomainObjectContainer container;
+    @Mock
     private IsisConfiguration configuration;
     private ServiceInitializer serviceInitializer;
 
@@ -99,7 +102,7 @@ public class ServiceInitializerTest {
     public void postConstruct() {
         final DomainServiceWithPostConstruct d1 = new DomainServiceWithPostConstruct();
         final DomainServiceWithPostConstructWithProperties d2 = new DomainServiceWithPostConstructWithProperties();
-        serviceInitializer.init(configuration, listOf(d1, d2));
+        serviceInitializer.init(configuration, container, listOf(d1, d2));
         serviceInitializer.postConstruct();
         assertThat(d1.called, is(true));
         assertThat(d2.called, is(true));
@@ -119,7 +122,7 @@ public class ServiceInitializerTest {
     public void preDestroy() {
         final DomainServiceWithPreDestroy d1 = new DomainServiceWithPreDestroy();
         final DomainServiceWithPreDestroy d2 = new DomainServiceWithPreDestroy();
-        serviceInitializer.init(configuration, listOf(d1, d2));
+        serviceInitializer.init(configuration, container, listOf(d1, d2));
         serviceInitializer.preDestroy();
         assertThat(d1.called, is(true));
         assertThat(d2.called, is(true));
@@ -143,7 +146,7 @@ public class ServiceInitializerTest {
         expectedException.expectMessage(
                 containsString(
                 "Found more than one @PostConstruct method; service is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithMultiplePostConstruct, found"));
-        serviceInitializer.init(configuration, listOf(d1));
+        serviceInitializer.init(configuration, container, listOf(d1));
     }
 
     public static class DomainServiceWithMultiplePreDestroy {
@@ -164,7 +167,7 @@ public class ServiceInitializerTest {
         expectedException.expectMessage(
                 containsString(
                 "Found more than one @PreDestroy method; service is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithMultiplePreDestroy, found"));
-        serviceInitializer.init(configuration, listOf(d1));
+        serviceInitializer.init(configuration, container, listOf(d1));
     }
 
     public static class DomainServiceWithPostConstructOneArgWrongType {
@@ -180,7 +183,7 @@ public class ServiceInitializerTest {
         final DomainServiceWithPostConstructOneArgWrongType d1 = new DomainServiceWithPostConstructOneArgWrongType();
         expectedException.expectMessage(
                 "@PostConstruct method must be no-arg or 1-arg accepting java.util.Map; method is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithPostConstructOneArgWrongType#y");
-        serviceInitializer.init(configuration, listOf(d1));
+        serviceInitializer.init(configuration, container, listOf(d1));
     }
 
     public static class DomainServiceWithPostConstructTwoArgs {
@@ -196,7 +199,7 @@ public class ServiceInitializerTest {
         final DomainServiceWithPostConstructTwoArgs d1 = new DomainServiceWithPostConstructTwoArgs();
         expectedException.expectMessage(
                 "@PostConstruct method must be no-arg or 1-arg accepting java.util.Map; method is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithPostConstructTwoArgs#y");
-        serviceInitializer.init(configuration, listOf(d1));
+        serviceInitializer.init(configuration, container, listOf(d1));
     }
 
     public static class DomainServiceWithPreDestroyOneArgs {
@@ -213,7 +216,7 @@ public class ServiceInitializerTest {
         final DomainServiceWithPreDestroyOneArgs d1 = new DomainServiceWithPreDestroyOneArgs();
         expectedException.expectMessage(
                 "@PreDestroy method must be no-arg; method is: org.apache.isis.core.metamodel.specloader.ServiceInitializerTest$DomainServiceWithPreDestroyOneArgs#y");
-        serviceInitializer.init(configuration, listOf(d1));
+        serviceInitializer.init(configuration, container, listOf(d1));
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_init.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_init.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_init.java
index 6c7b704..b1b37b1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_init.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_init.java
@@ -74,17 +74,17 @@ public class IsisMetaModelTest_init {
                 allowing(mockRuntimeContext).injectInto(with(any(Object.class)));
                 will(IsisActions.injectInto());
                 
-                one(mockRuntimeContext).setContainer(with(any(DomainObjectContainer.class)));
+                oneOf(mockRuntimeContext).setContainer(with(any(DomainObjectContainer.class)));
                 inSequence(initSequence);
                 
-                one(mockProgrammingModelFacets).init();
+                oneOf(mockProgrammingModelFacets).init();
                 inSequence(initSequence);
                 
-                one(mockProgrammingModelFacets).getList();
+                oneOf(mockProgrammingModelFacets).getList();
                 inSequence(initSequence);
                 will(returnValue(Lists.newArrayList()));
                 
-                one(mockRuntimeContext).init();
+                oneOf(mockRuntimeContext).init();
                 inSequence(initSequence);
             }
         });

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_shutdown.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_shutdown.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_shutdown.java
deleted file mode 100644
index 3db4262..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/app/IsisMetaModelTest_shutdown.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.progmodel.app;
-
-import java.util.TreeSet;
-
-import com.google.common.collect.Lists;
-
-import org.jmock.Expectations;
-import org.jmock.Sequence;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
-import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
-import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
-import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor;
-import org.apache.isis.core.metamodel.specloader.collectiontyperegistry.CollectionTypeRegistry;
-import org.apache.isis.core.unittestsupport.jmocking.IsisActions;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-public class IsisMetaModelTest_shutdown {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    
-    @Mock
-    private IsisConfiguration mockConfiguration;
-    @Mock
-    private ProgrammingModel mockProgrammingModel;
-    @Mock
-    private FacetDecorator mockFacetDecorator;
-    @Mock
-    private ClassSubstitutor mockClassSubstitutor;
-    @Mock
-    private CollectionTypeRegistry mockCollectionTypeRegistry;
-    @Mock
-    private RuntimeContext mockRuntimeContext;
-
-    private IsisMetaModel metaModel;
-
-    @Before
-    public void setUp() {
-        expectingMetaModelToBeInitialized();
-        metaModel = new IsisMetaModel(mockRuntimeContext, mockProgrammingModel);
-    }
-
-    private void expectingMetaModelToBeInitialized() {
-        final Sequence initSequence = context.sequence("init");
-        context.checking(new Expectations() {
-            {
-                allowing(mockRuntimeContext).injectInto(with(any(Object.class)));
-                will(IsisActions.injectInto());
-                
-                one(mockRuntimeContext).setContainer(with(any(DomainObjectContainer.class)));
-                inSequence(initSequence);
-                
-                one(mockProgrammingModel).init();
-                inSequence(initSequence);
-                
-                one(mockProgrammingModel).getList();
-                inSequence(initSequence);
-                will(returnValue(Lists.newArrayList()));
-                
-                one(mockRuntimeContext).init();
-                inSequence(initSequence);
-            }
-        });
-    }
-
-    @Test
-    public void shouldSucceedWithoutThrowingAnyExceptions() {
-        metaModel.init();
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeConfiguration() {
-        metaModel.init();
-        metaModel.setConfiguration(mockConfiguration);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeProgrammingModelFacets() {
-        metaModel.init();
-        metaModel.setProgrammingModelFacets(mockProgrammingModel);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeCollectionTypeRegistry() {
-        metaModel.init();
-        metaModel.setCollectionTypeRegistry(mockCollectionTypeRegistry);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeClassSubstitutor() {
-        metaModel.init();
-        metaModel.setClassSubstitutor(mockClassSubstitutor);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeFacetDecorators() {
-        metaModel.init();
-        metaModel.setFacetDecorators(new TreeSet<FacetDecorator>());
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void shouldNotBeAbleToAddToFacetDecorators() {
-        metaModel.init();
-        metaModel.getFacetDecorators().add(mockFacetDecorator);
-    }
-
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToInitializeAgain() {
-        metaModel.init();
-        //
-        metaModel.init();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
index df91a36..fc9f61b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/progmodel/facets/ProgrammableReflector.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.progmodel.facets;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.exceptions.NotYetImplementedException;
@@ -128,6 +129,11 @@ public class ProgrammableReflector implements SpecificationLoaderSpi, Applicatio
     }
 
     @Override
+    public void setContainer(DomainObjectContainer container) {
+        throw new NotYetImplementedException();
+    }
+
+    @Override
     public void setServices(final List<Object> services) {
         throw new NotYetImplementedException();
     }
@@ -152,4 +158,5 @@ public class ProgrammableReflector implements SpecificationLoaderSpi, Applicatio
     }
 
 
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/metamodel/src/test/java/org/apache/isis/progmodels/dflt/ObjectReflectorDefaultTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/progmodels/dflt/ObjectReflectorDefaultTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/progmodels/dflt/ObjectReflectorDefaultTestAbstract.java
index f516600..fe70828 100644
--- a/core/metamodel/src/test/java/org/apache/isis/progmodels/dflt/ObjectReflectorDefaultTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/progmodels/dflt/ObjectReflectorDefaultTestAbstract.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.progmodels.dflt;
 
+import java.util.Collections;
 import java.util.HashSet;
 
 import org.jmock.Expectations;
@@ -38,6 +39,7 @@ import org.apache.isis.core.metamodel.facets.object.plural.PluralFacet;
 import org.apache.isis.core.metamodel.facets.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
+import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.ObjectReflectorDefault;
 import org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutorAbstract;
@@ -75,9 +77,18 @@ public abstract class ObjectReflectorDefaultTestAbstract {
         });
 
         runtimeContext = new RuntimeContextNoRuntime();
-        final ObjectReflectorDefault reflector = new ObjectReflectorDefault(mockConfiguration, new ClassSubstitutorAbstract() {}, new CollectionTypeRegistryDefault(), new SpecificationTraverserDefault(), new ProgrammingModelFacetsJava5(), new HashSet<FacetDecorator>(),
-                new MetaModelValidatorDefault());
+        final ObjectReflectorDefault reflector = 
+                new ObjectReflectorDefault(
+                        mockConfiguration, 
+                        new ClassSubstitutorAbstract() {}, 
+                        new CollectionTypeRegistryDefault(), 
+                        new SpecificationTraverserDefault(), 
+                        new ProgrammingModelFacetsJava5(), 
+                        new HashSet<FacetDecorator>(),
+                        new MetaModelValidatorDefault());
         reflector.setRuntimeContext(runtimeContext);
+        reflector.setContainer(new DomainObjectContainerDefault());
+        reflector.setServices(Collections.emptyList());
         reflector.init();
         
         specification = loadSpecification(reflector);

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
index 48386dd..9432a54 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstallerAbstract.java
@@ -282,23 +282,6 @@ public abstract class PersistenceMechanismInstallerAbstract extends InstallerAbs
         return new PojoRecreatorDefault();
     }
 
-    /**
-     * Hook method to return a {@link DomainObjectContainer}.
-     * 
-     * <p>
-    * By default, looks up implementation from provided
-    * {@link IsisConfiguration} using
-    * {@link PersistenceConstants#DOMAIN_OBJECT_CONTAINER_CLASS_NAME}. If no
-    * implementation is specified, then defaults to
-    * {@value PersistenceConstants#DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT}.
-     */
-    public DomainObjectContainer createContainer(final IsisConfiguration configuration) {
-        final String configuredClassName = configuration.getString(PersistenceConstants.DOMAIN_OBJECT_CONTAINER_CLASS_NAME, PersistenceConstants.DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT);
-        return InstanceUtil.createInstance(configuredClassName, PersistenceConstants.DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT, DomainObjectContainer.class);
-    }
-
-
-
     // ///////////////////////////////////////////
     // Non overridable.
     // ///////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
index 944f472..20742cf 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegate.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.runtime.persistence;
 
-import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderAware;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
@@ -54,8 +53,6 @@ public interface PersistenceSessionFactoryDelegate extends IsisConfigurationBuil
 
     ServicesInjectorSpi createServicesInjector(IsisConfiguration configuration);
 
-    DomainObjectContainer createContainer(IsisConfiguration configuration);
-
     RuntimeContext createRuntimeContext(IsisConfiguration configuration);
 
     

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
index cf3680d..8117f03 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/PersistenceSessionFactoryDelegating.java
@@ -55,9 +55,15 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     private final DeploymentType deploymentType;
     private final IsisConfiguration configuration;
     private final PersistenceSessionFactoryDelegate persistenceSessionFactoryDelegate;
-    
-    private List<Object> serviceList;
 
+    /**
+     * @see #setContainer(DomainObjectContainer)
+     */
+    private DomainObjectContainer container;
+    /**
+     * @see #setServices(List)
+     */
+    private List<Object> serviceList;
 
     private Boolean fixturesInstalled;
     
@@ -66,10 +72,12 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     private ObjectFactory objectFactory;
     private IdentifierGenerator identifierGenerator;
     private ServicesInjectorSpi servicesInjector;
-    private DomainObjectContainer container;
     private RuntimeContext runtimeContext;
 
-    public PersistenceSessionFactoryDelegating(final DeploymentType deploymentType, final IsisConfiguration isisConfiguration, final PersistenceSessionFactoryDelegate persistenceSessionFactoryDelegate) {
+    public PersistenceSessionFactoryDelegating(
+            final DeploymentType deploymentType, 
+            final IsisConfiguration isisConfiguration, 
+            final PersistenceSessionFactoryDelegate persistenceSessionFactoryDelegate) {
         this.deploymentType = deploymentType;
         this.configuration = isisConfiguration;
         this.persistenceSessionFactoryDelegate = persistenceSessionFactoryDelegate;
@@ -93,9 +101,9 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     public final void init() {
 
         // check prereq dependencies injected
+        ensureThatState(container, is(not(nullValue())));
         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
@@ -118,10 +126,8 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
         ensureThatState(identifierGenerator, is(not(nullValue())));
 
         servicesInjector = persistenceSessionFactoryDelegate.createServicesInjector(getConfiguration());
-        container = persistenceSessionFactoryDelegate.createContainer(getConfiguration());
 
         ensureThatState(servicesInjector, is(not(nullValue())));
-        ensureThatState(container, is(not(nullValue())));
 
         runtimeContext = persistenceSessionFactoryDelegate.createRuntimeContext(getConfiguration());
         ensureThatState(runtimeContext, is(not(nullValue())));
@@ -183,13 +189,13 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
         return servicesInjector;
     }
     
-    public List<Object> getServiceList() {
-        return serviceList;
-    }
-
     public DomainObjectContainer getContainer() {
         return container;
     }
+    
+    public List<Object> getServiceList() {
+        return serviceList;
+    }
 
     // //////////////////////////////////////////////////////
     // MetaModelAdjuster impl
@@ -237,6 +243,10 @@ public class PersistenceSessionFactoryDelegating implements PersistenceSessionFa
     // Dependencies (injected via setters)
     // //////////////////////////////////////////////////////
 
+    public void setContainer(DomainObjectContainer container) {
+        this.container = container;
+    }
+    
     @Override
     public List<Object> getServices() {
         return serviceList;

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 815dd8c..4f0d687 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
@@ -26,10 +26,12 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.debug.DebuggableWithTitle;
+import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
@@ -41,6 +43,7 @@ import org.apache.isis.core.runtime.authorization.AuthorizationManager;
 import org.apache.isis.core.runtime.imageloader.TemplateImageLoader;
 import org.apache.isis.core.runtime.imageloader.awt.TemplateImageLoaderAwt;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
+import org.apache.isis.core.runtime.persistence.PersistenceConstants;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.internal.IsisLocaleInitializer;
 import org.apache.isis.core.runtime.system.internal.IsisTimeZoneInitializer;
@@ -273,9 +276,28 @@ public abstract class IsisSystemFixturesHookAbstract implements IsisSystem {
     protected abstract UserProfileStore obtainUserProfileStore();
 
     // ///////////////////////////////////////////
-    // Services
+    // Container & Services
     // ///////////////////////////////////////////
 
+    /**
+     * Returns a {@link DomainObjectContainer} as {@link #getConfiguration() configured}.
+     * 
+     * <p>
+    * By default, looks up implementation from provided
+    * {@link IsisConfiguration} using
+    * {@link PersistenceConstants#DOMAIN_OBJECT_CONTAINER_CLASS_NAME}. If no
+    * implementation is specified, then defaults to
+    * {@value PersistenceConstants#DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT}.
+     */
+    protected DomainObjectContainer obtainContainer() {
+        return createContainer(getConfiguration());
+    }
+
+    private DomainObjectContainer createContainer(final IsisConfiguration configuration) {
+        final String configuredClassName = configuration.getString(PersistenceConstants.DOMAIN_OBJECT_CONTAINER_CLASS_NAME, PersistenceConstants.DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT);
+        return InstanceUtil.createInstance(configuredClassName, PersistenceConstants.DOMAIN_OBJECT_CONTAINER_NAME_DEFAULT, DomainObjectContainer.class);
+    }
+
     protected abstract List<Object> obtainServices();
 
     // ///////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstract.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstract.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstract.java
deleted file mode 100644
index ffd680a..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryAbstract.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.runtime.system.session;
-
-import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ListMultimap;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
-import org.apache.isis.core.metamodel.services.ServiceUtil;
-import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
-import org.apache.isis.core.runtime.authentication.AuthenticationManager;
-import org.apache.isis.core.runtime.authorization.AuthorizationManager;
-import org.apache.isis.core.runtime.imageloader.TemplateImageLoader;
-import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
-import org.apache.isis.core.runtime.system.DeploymentType;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
-import org.apache.isis.core.runtime.userprofile.UserProfile;
-import org.apache.isis.core.runtime.userprofile.UserProfileLoader;
-
-/**
- * Creates an implementation of
- * {@link IsisSessionFactory#openSession(AuthenticationSession)} to create an
- * {@link IsisSession}, but delegates to subclasses to actually obtain the
- * components that make up that {@link IsisSession}.
- * 
- * <p>
- * The idea is that one subclass can use the {@link InstallerLookup} design to
- * lookup installers for components (and hence create the components
- * themselves), whereas another subclass might simply use Spring (or another DI
- * container) to inject in the components according to some Spring-configured
- * application context.
- */
-public abstract class IsisSessionFactoryAbstract implements IsisSessionFactory {
-
-    private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactoryAbstract.class);
-    
-    private final DeploymentType deploymentType;
-    private final IsisConfiguration configuration;
-    private final TemplateImageLoader templateImageLoader;
-    private final SpecificationLoaderSpi specificationLoaderSpi;
-    private final AuthenticationManager authenticationManager;
-    private final AuthorizationManager authorizationManager;
-    private final PersistenceSessionFactory persistenceSessionFactory;
-    private final UserProfileLoader userProfileLoader;
-    private final List<Object> serviceList;
-    private final OidMarshaller oidMarshaller;
-
-    public IsisSessionFactoryAbstract(final DeploymentType deploymentType, final IsisConfiguration configuration, final SpecificationLoaderSpi specificationLoader, final TemplateImageLoader templateImageLoader, final AuthenticationManager authenticationManager,
-            final AuthorizationManager authorizationManager, final UserProfileLoader userProfileLoader, final PersistenceSessionFactory persistenceSessionFactory, final List<Object> serviceList, OidMarshaller oidMarshaller) {
-
-        ensureThatArg(deploymentType, is(not(nullValue())));
-        ensureThatArg(configuration, is(not(nullValue())));
-        ensureThatArg(specificationLoader, is(not(nullValue())));
-        ensureThatArg(templateImageLoader, is(not(nullValue())));
-        ensureThatArg(authenticationManager, is(not(nullValue())));
-        ensureThatArg(authorizationManager, is(not(nullValue())));
-        ensureThatArg(userProfileLoader, is(not(nullValue())));
-        ensureThatArg(persistenceSessionFactory, is(not(nullValue())));
-        ensureThatArg(serviceList, is(not(nullValue())));
-
-        this.deploymentType = deploymentType;
-        this.configuration = configuration;
-        this.templateImageLoader = templateImageLoader;
-        this.specificationLoaderSpi = specificationLoader;
-        this.authenticationManager = authenticationManager;
-        this.authorizationManager = authorizationManager;
-        this.userProfileLoader = userProfileLoader;
-        this.persistenceSessionFactory = persistenceSessionFactory;
-        this.serviceList = serviceList;
-        this.oidMarshaller = oidMarshaller;
-        
-        validateServices(serviceList);
-    }
-
-    /**
-     * Validate domain services lifecycle events.
-     * 
-     * <p>
-     * Specifically:
-     * <ul>
-     * <li>All {@link PostConstruct} methods must either take no arguments or take a {@link Properties} object.</li>
-     * <li>All {@link PreDestroy} methods must take no arguments.</li>
-     * </ul>
-     * 
-     * <p>
-     * If this isn't the case, then we fail fast.
-     */
-    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"); 
-    }
-
-
-    // ///////////////////////////////////////////
-    // init, shutdown
-    // ///////////////////////////////////////////
-
-    /**
-     * Wires components as necessary, and then
-     * {@link ApplicationScopedComponent#init() init}ializes all.
-     */
-    @Override
-    public void init() {
-        templateImageLoader.init();
-
-        specificationLoaderSpi.setServices(serviceList);
-        specificationLoaderSpi.init();
-
-        // must come after init of spec loader.
-        specificationLoaderSpi.injectInto(persistenceSessionFactory);
-        persistenceSessionFactory.setServices(serviceList);
-        userProfileLoader.setServices(serviceList);
-
-        authenticationManager.init();
-        authorizationManager.init();
-        persistenceSessionFactory.init();
-        
-    }
-
-    
-    @Override
-    public void shutdown() {
-        
-        persistenceSessionFactory.shutdown();
-        authenticationManager.shutdown();
-        specificationLoaderSpi.shutdown();
-        templateImageLoader.shutdown();
-        userProfileLoader.shutdown();
-    }
-
-
-    @Override
-    public IsisSession openSession(final AuthenticationSession authenticationSession) {
-        final PersistenceSession persistenceSession = persistenceSessionFactory.createPersistenceSession();
-        ensureThatArg(persistenceSession, is(not(nullValue())));
-
-        final UserProfile userProfile = userProfileLoader.getProfile(authenticationSession);
-        ensureThatArg(userProfile, is(not(nullValue())));
-
-        // inject into persistenceSession any/all application-scoped components
-        // that it requires
-        getSpecificationLoader().injectInto(persistenceSession);
-
-        final IsisSessionDefault isisSessionDefault = new IsisSessionDefault(this, authenticationSession, persistenceSession, userProfile);
-
-        return isisSessionDefault;
-    }
-
-    @Override
-    public IsisConfiguration getConfiguration() {
-        return configuration;
-    }
-
-    @Override
-    public DeploymentType getDeploymentType() {
-        return deploymentType;
-    }
-
-    @Override
-    public SpecificationLoaderSpi getSpecificationLoader() {
-        return specificationLoaderSpi;
-    }
-
-    @Override
-    public TemplateImageLoader getTemplateImageLoader() {
-        return templateImageLoader;
-    }
-
-    @Override
-    public AuthenticationManager getAuthenticationManager() {
-        return authenticationManager;
-    }
-
-    @Override
-    public AuthorizationManager getAuthorizationManager() {
-        return authorizationManager;
-    }
-
-    @Override
-    public PersistenceSessionFactory getPersistenceSessionFactory() {
-        return persistenceSessionFactory;
-    }
-
-    @Override
-    public UserProfileLoader getUserProfileLoader() {
-        return userProfileLoader;
-    }
-
-    @Override
-    public List<Object> getServices() {
-        return serviceList;
-    }
-    
-    @Override
-    public OidMarshaller getOidMarshaller() {
-    	return oidMarshaller;
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 2f7ce6d..6bc8d9f 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
@@ -19,27 +19,292 @@
 
 package org.apache.isis.core.runtime.system.session;
 
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ListMultimap;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
+import org.apache.isis.core.metamodel.services.ServiceUtil;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.runtime.authentication.AuthenticationManager;
 import org.apache.isis.core.runtime.authorization.AuthorizationManager;
 import org.apache.isis.core.runtime.imageloader.TemplateImageLoader;
+import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
+import org.apache.isis.core.runtime.persistence.PersistenceConstants;
 import org.apache.isis.core.runtime.system.DeploymentType;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
+import org.apache.isis.core.runtime.userprofile.UserProfile;
 import org.apache.isis.core.runtime.userprofile.UserProfileLoader;
 
 /**
- * As its superclass, but provides a default for some of more basic components
- * (that is, where the core framework offers only a single implementation).
+ * Creates an implementation of
+ * {@link IsisSessionFactory#openSession(AuthenticationSession)} to create an
+ * {@link IsisSession}, but delegates to subclasses to actually obtain the
+ * components that make up that {@link IsisSession}.
+ * 
+ * <p>
+ * The idea is that one subclass can use the {@link InstallerLookup} design to
+ * lookup installers for components (and hence create the components
+ * themselves), whereas another subclass might simply use Spring (or another DI
+ * container) to inject in the components according to some Spring-configured
+ * application context.
  */
-public class IsisSessionFactoryDefault extends IsisSessionFactoryAbstract {
+public class IsisSessionFactoryDefault implements IsisSessionFactory {
+
+    private final static Logger LOG = LoggerFactory.getLogger(IsisSessionFactoryDefault.class);
+    
+    private final DeploymentType deploymentType;
+    private final IsisConfiguration configuration;
+    private final TemplateImageLoader templateImageLoader;
+    private final SpecificationLoaderSpi specificationLoaderSpi;
+    private final AuthenticationManager authenticationManager;
+    private final AuthorizationManager authorizationManager;
+    private final PersistenceSessionFactory persistenceSessionFactory;
+    private final UserProfileLoader userProfileLoader;
+    private final DomainObjectContainer container;
+    private final List<Object> serviceList;
+    private final OidMarshaller oidMarshaller;
+
+    public IsisSessionFactoryDefault(
+            final DeploymentType deploymentType, 
+            final IsisConfiguration configuration, 
+            final SpecificationLoaderSpi specificationLoader, 
+            final TemplateImageLoader templateImageLoader, 
+            final AuthenticationManager authenticationManager,
+            final AuthorizationManager authorizationManager, 
+            final UserProfileLoader userProfileLoader, 
+            final PersistenceSessionFactory persistenceSessionFactory, 
+            final DomainObjectContainer container, 
+            final List<Object> serviceList, 
+            final OidMarshaller oidMarshaller) {
+
+        ensureThatArg(deploymentType, is(not(nullValue())));
+        ensureThatArg(configuration, is(not(nullValue())));
+        ensureThatArg(specificationLoader, is(not(nullValue())));
+        ensureThatArg(templateImageLoader, is(not(nullValue())));
+        ensureThatArg(authenticationManager, is(not(nullValue())));
+        ensureThatArg(authorizationManager, is(not(nullValue())));
+        ensureThatArg(userProfileLoader, is(not(nullValue())));
+        ensureThatArg(persistenceSessionFactory, is(not(nullValue())));
+        ensureThatArg(serviceList, is(not(nullValue())));
+
+        this.deploymentType = deploymentType;
+        this.configuration = configuration;
+        this.templateImageLoader = templateImageLoader;
+        this.specificationLoaderSpi = specificationLoader;
+        this.authenticationManager = authenticationManager;
+        this.authorizationManager = authorizationManager;
+        this.userProfileLoader = userProfileLoader;
+        this.persistenceSessionFactory = persistenceSessionFactory;
+        this.container = container;
+        this.serviceList = serviceList;
+        this.oidMarshaller = oidMarshaller;
+        
+        validateServices(serviceList);
+    }
+
+    /**
+     * Validate domain services lifecycle events.
+     * 
+     * <p>
+     * Specifically:
+     * <ul>
+     * <li>All {@link PostConstruct} methods must either take no arguments or take a {@link Properties} object.</li>
+     * <li>All {@link PreDestroy} methods must take no arguments.</li>
+     * </ul>
+     * 
+     * <p>
+     * If this isn't the case, then we fail fast.
+     */
+    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"); 
+    }
+
+
+    // ///////////////////////////////////////////
+    // init, shutdown
+    // ///////////////////////////////////////////
+
+    /**
+     * Wires components as necessary, and then
+     * {@link ApplicationScopedComponent#init() init}ializes all.
+     */
+    @Override
+    public void init() {
+        templateImageLoader.init();
+
+        specificationLoaderSpi.setContainer(container);
+        specificationLoaderSpi.setServices(serviceList);
+        specificationLoaderSpi.init();
+
+        // must come after init of spec loader.
+        specificationLoaderSpi.injectInto(persistenceSessionFactory);
+        persistenceSessionFactory.setServices(serviceList);
+        userProfileLoader.setServices(serviceList);
+
+        authenticationManager.init();
+        authorizationManager.init();
+        persistenceSessionFactory.init();
+        
+    }
+
 
-    public IsisSessionFactoryDefault(final DeploymentType deploymentType, final IsisConfiguration configuration, final TemplateImageLoader templateImageLoader, final SpecificationLoaderSpi specificationLoader, final AuthenticationManager authenticationManager,
-            final AuthorizationManager authorizationManager, final UserProfileLoader userProfileLoader, final PersistenceSessionFactory persistenceSessionFactory, final List<Object> servicesList, OidMarshaller oidMarshaller) {
-        super(deploymentType, configuration, specificationLoader, templateImageLoader, authenticationManager, authorizationManager, userProfileLoader, persistenceSessionFactory, servicesList, oidMarshaller);
+    
+    @Override
+    public void shutdown() {
+        
+        persistenceSessionFactory.shutdown();
+        authenticationManager.shutdown();
+        specificationLoaderSpi.shutdown();
+        templateImageLoader.shutdown();
+        userProfileLoader.shutdown();
     }
 
+
+    @Override
+    public IsisSession openSession(final AuthenticationSession authenticationSession) {
+        final PersistenceSession persistenceSession = persistenceSessionFactory.createPersistenceSession();
+        ensureThatArg(persistenceSession, is(not(nullValue())));
+
+        final UserProfile userProfile = userProfileLoader.getProfile(authenticationSession);
+        ensureThatArg(userProfile, is(not(nullValue())));
+
+        // inject into persistenceSession any/all application-scoped components
+        // that it requires
+        getSpecificationLoader().injectInto(persistenceSession);
+
+        final IsisSessionDefault isisSessionDefault = new IsisSessionDefault(this, authenticationSession, persistenceSession, userProfile);
+
+        return isisSessionDefault;
+    }
+
+    @Override
+    public IsisConfiguration getConfiguration() {
+        return configuration;
+    }
+
+    @Override
+    public DeploymentType getDeploymentType() {
+        return deploymentType;
+    }
+
+    @Override
+    public SpecificationLoaderSpi getSpecificationLoader() {
+        return specificationLoaderSpi;
+    }
+
+    @Override
+    public TemplateImageLoader getTemplateImageLoader() {
+        return templateImageLoader;
+    }
+
+    @Override
+    public AuthenticationManager getAuthenticationManager() {
+        return authenticationManager;
+    }
+
+    @Override
+    public AuthorizationManager getAuthorizationManager() {
+        return authorizationManager;
+    }
+
+    @Override
+    public PersistenceSessionFactory getPersistenceSessionFactory() {
+        return persistenceSessionFactory;
+    }
+
+    @Override
+    public UserProfileLoader getUserProfileLoader() {
+        return userProfileLoader;
+    }
+
+    @Override
+    public List<Object> getServices() {
+        return serviceList;
+    }
+    
+    @Override
+    public OidMarshaller getOidMarshaller() {
+    	return oidMarshaller;
+    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 224760b..0f70fb8 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
@@ -26,6 +26,7 @@ import java.util.List;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.fixtures.LogonFixture;
 import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.components.Noop;
@@ -180,13 +181,14 @@ public abstract class IsisSystemAbstract extends IsisSystemFixturesHookAbstract
         final Collection<MetaModelRefiner> metaModelRefiners = refiners(authenticationManager, authorizationManager, templateImageLoader, persistenceSessionFactory);
         final SpecificationLoaderSpi reflector = obtainSpecificationLoaderSpi(deploymentType, persistenceSessionFactory, metaModelRefiners);
 
-        final List<Object> servicesList = obtainServices();
+        final DomainObjectContainer container = obtainContainer();
+        final List<Object> services = obtainServices();
 
         // bind metamodel to the (runtime) framework
         RuntimeContextFromSession runtimeContext = new RuntimeContextFromSession();
         runtimeContext.injectInto(reflector);
 
-        return new IsisSessionFactoryDefault(deploymentType, configuration, templateImageLoader, reflector, authenticationManager, authorizationManager, userProfileLoader, persistenceSessionFactory, servicesList, oidMarshaller);
+        return new IsisSessionFactoryDefault(deploymentType, configuration, reflector, templateImageLoader, authenticationManager, authorizationManager, userProfileLoader, persistenceSessionFactory, container, services, oidMarshaller);
     }