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:56 UTC

[1/5] ISIS-597: use ServicesInjectorDefault to wire services prior to postconstruct

Updated Branches:
  refs/heads/master c2f4d8cb5 -> ff4f466c2


http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 2daf733..ef088e0 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
@@ -31,7 +31,9 @@ import java.util.List;
 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.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
@@ -45,6 +47,7 @@ import org.apache.isis.core.runtime.imageloader.TemplateImageLoader;
 import org.apache.isis.core.runtime.imageloader.TemplateImageLoaderInstaller;
 import org.apache.isis.core.runtime.installerregistry.InstallerLookup;
 import org.apache.isis.core.runtime.installerregistry.installerapi.PersistenceMechanismInstaller;
+import org.apache.isis.core.runtime.persistence.PersistenceConstants;
 import org.apache.isis.core.runtime.services.ServicesInstaller;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.IsisSystemException;
@@ -218,7 +221,7 @@ public class IsisSystemUsingInstallers extends IsisSystemAbstract {
     }
 
     // ///////////////////////////////////////////
-    // Services
+    // Container and Services
     // ///////////////////////////////////////////
 
     public void setServicesInstaller(final ServicesInstaller servicesInstaller) {
@@ -235,12 +238,13 @@ public class IsisSystemUsingInstallers extends IsisSystemAbstract {
         return servicesInstaller.getServices(getDeploymentType());
     }
 
-    // ///////////////////////////////////////////
+
+// ///////////////////////////////////////////
     // User Profile Loader/Store
     // ///////////////////////////////////////////
 
     public void lookupAndSetUserProfileFactoryInstaller() {
-        final IsisConfiguration configuration = installerLookup.getConfiguration();
+        final IsisConfiguration configuration = getConfiguration();
         final String persistor = configuration.getString(SystemConstants.PROFILE_PERSISTOR_INSTALLER_KEY);
 
         final UserProfileStoreInstaller userProfilePersistenceMechanismInstaller = installerLookup.userProfilePersistenceMechanismInstaller(persistor, getDeploymentType());

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 dd37c9f..7dd1d38 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
@@ -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;
@@ -75,6 +76,9 @@ public class IsisContextTest {
     @Mock
     protected AuthorizationManager mockAuthorizationManager;
 
+    @Mock
+    protected DomainObjectContainer mockContainer;
+    
     protected OidMarshaller oidMarshaller;
 
     private List<Object> servicesList;
@@ -107,10 +111,12 @@ public class IsisContextTest {
                 ignoring(mockAuthenticationManager);
                 ignoring(mockAuthorizationManager);
                 ignoring(mockTemplateImageLoader);
+                
+                ignoring(mockContainer);
             }
         });
 
-        sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, configuration, mockTemplateImageLoader, mockSpecificationLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, servicesList, oidMarshaller);
+        sessionFactory = new IsisSessionFactoryDefault(DeploymentType.EXPLORATION, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, servicesList, oidMarshaller);
         authSession = new SimpleSession("tester", Collections.<String>emptyList());
         
         IsisContext.setConfiguration(configuration);

http://git-wip-us.apache.org/repos/asf/isis/blob/e188eb81/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 76848c0..406a4b5 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
@@ -37,6 +37,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;
@@ -119,26 +120,29 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
     @Mock
-    private DeploymentType deploymentType;
+    private DeploymentType mockDeploymentType;
     @Mock
-    private SpecificationLoaderSpi specificationLoader;
+    private SpecificationLoaderSpi mockSpecificationLoader;
     @Mock
-    private TemplateImageLoader templateImageLoader;
+    private TemplateImageLoader mockTemplateImageLoader;
     @Mock
-    private AuthenticationManager authenticationManager;
+    private AuthenticationManager mockAuthenticationManager;
     @Mock
-    private AuthorizationManager authorizationManager;
+    private AuthorizationManager mockAuthorizationManager;
     @Mock
-    private UserProfileLoader userProfileLoader;
+    private UserProfileLoader mockUserProfileLoader;
     @Mock
-    private PersistenceSessionFactory persistenceSessionFactory;
+    private PersistenceSessionFactory mockPersistenceSessionFactory;
     @Mock
-    private OidMarshaller oidMarshaller;
+    private OidMarshaller mockOidMarshaller;
+    
+    @Mock
+    private DomainObjectContainer mockContainer;
     
     private IsisConfigurationDefault configuration;
     private List<Object> serviceList;
 
-    private IsisSessionFactoryAbstract isfa;
+    private IsisSessionFactoryDefault isfa;
 
     
     @Before
@@ -147,7 +151,7 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
         configuration.add("foo", "bar");
         
         serviceList = Lists.newArrayList();
-        context.ignoring(deploymentType, specificationLoader, templateImageLoader, authenticationManager, authorizationManager, userProfileLoader, persistenceSessionFactory, oidMarshaller);
+        context.ignoring(mockDeploymentType, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockContainer, mockPersistenceSessionFactory, mockOidMarshaller);
     }
     
     @Test
@@ -232,8 +236,8 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
     }
 
 
-    private IsisSessionFactoryAbstract createIsisSessionFactoryAbstract(List<Object> serviceList) {
-        return new IsisSessionFactoryAbstract(deploymentType, configuration, specificationLoader, templateImageLoader, authenticationManager, authorizationManager, userProfileLoader, persistenceSessionFactory, serviceList, oidMarshaller) {
+    private IsisSessionFactoryDefault createIsisSessionFactoryAbstract(List<Object> serviceList) {
+        return new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, serviceList, mockOidMarshaller) {
         };
     }
 }


[3/5] git commit: ISIS-597: minor tidy up in unit test

Posted by da...@apache.org.
ISIS-597: minor tidy up in unit test


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

Branch: refs/heads/master
Commit: 9d964039442100c844660d972f24feac186d96ec
Parents: e188eb8
Author: Dan Haywood <da...@apache.org>
Authored: Thu Nov 21 10:06:31 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Nov 21 10:06:31 2013 +0000

----------------------------------------------------------------------
 ...onFactoryAbstractTest_init_and_shutdown.java | 46 ++++++++++----------
 1 file changed, 23 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/9d964039/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 406a4b5..575c2c9 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
@@ -142,7 +142,7 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
     private IsisConfigurationDefault configuration;
     private List<Object> serviceList;
 
-    private IsisSessionFactoryDefault isfa;
+    private IsisSessionFactoryDefault isf;
 
     
     @Before
@@ -156,88 +156,88 @@ public class IsisSessionFactoryAbstractTest_init_and_shutdown {
     
     @Test
     public void emptyListOfServices() {
-        isfa = createIsisSessionFactoryAbstract(serviceList);
+        isf = createIsisSessionFactory(mockContainer, serviceList);
     }
 
     @Test
     public void preConstruct_DomainServiceWithNoPostConstructOrPreDestroy() {
         serviceList.add(new DomainServiceWithNoPostConstructOrPreDestroy());
-        isfa = createIsisSessionFactoryAbstract(serviceList);
+        isf = createIsisSessionFactory(mockContainer, serviceList);
         
-        isfa.init();
-        isfa.shutdown();
+        isf.init();
+        isf.shutdown();
     }
 
     @Test
     public void preConstruct_DomainServiceWithValidPostConstructNoParams() {
         DomainServiceWithValidPostConstructNoParams domainService = new DomainServiceWithValidPostConstructNoParams();
         serviceList.add(domainService);
-        isfa = createIsisSessionFactoryAbstract(serviceList);
-        isfa.init();
+        isf = createIsisSessionFactory(mockContainer, serviceList);
+        isf.init();
         assertThat(domainService.called,is(true));
-        isfa.shutdown();
+        isf.shutdown();
     }
 
     @Test
     public void preConstruct_DomainServiceWithValidPostConstructPropertiesParam() {
         DomainServiceWithValidPostConstructPropertiesParam domainService = new DomainServiceWithValidPostConstructPropertiesParam();
         serviceList.add(domainService);
-        isfa = createIsisSessionFactoryAbstract(serviceList);
-        isfa.init();
+        isf = createIsisSessionFactory(mockContainer, serviceList);
+        isf.init();
         assertThat(domainService.called,is(true));
         assertThat(domainService.props.get("foo"), is("bar"));
-        isfa.shutdown();
+        isf.shutdown();
     }
 
     @Test
     public void preConstruct_DomainServiceWithValidPostConstructSubtypeOfPropertiesParam() {
         DomainServiceWithValidPostConstructSubtypeOfPropertiesParam domainService = new DomainServiceWithValidPostConstructSubtypeOfPropertiesParam();
         serviceList.add(domainService);
-        isfa = createIsisSessionFactoryAbstract(serviceList);
-        isfa.init();
+        isf = createIsisSessionFactory(mockContainer, serviceList);
+        isf.init();
         assertThat(domainService.called,is(true));
         assertThat(domainService.props, is(not(nullValue())));
-        isfa.shutdown();
+        isf.shutdown();
     }
 
     @Test(expected=IllegalStateException.class)
     public void preConstruct_DomainServiceWithInvalidPostConstructWrongNumberParams() {
         serviceList.add(new DomainServiceWithInvalidPostConstructWrongNumberParams());
-        isfa = createIsisSessionFactoryAbstract(serviceList);
+        isf = createIsisSessionFactory(mockContainer, serviceList);
     }
 
     @Test(expected=IllegalStateException.class)
     public void preConstruct_DomainServiceWithInvalidPostConstructWrongTypeOfParam() {
         serviceList.add(new DomainServiceWithInvalidPostConstructWrongTypeOfParam());
-        isfa = createIsisSessionFactoryAbstract(serviceList);
+        isf = createIsisSessionFactory(mockContainer, serviceList);
     }
 
     @Test
     public void preConstruct_DomainServiceWithValidPreDestroyNoParams() {
         DomainServiceWithValidPreDestroyNoParams domainService = new DomainServiceWithValidPreDestroyNoParams();
         serviceList.add(domainService);
-        isfa = createIsisSessionFactoryAbstract(serviceList);
-        isfa.init();
+        isf = createIsisSessionFactory(mockContainer, serviceList);
+        isf.init();
         assertThat(domainService.called,is(true));
-        isfa.shutdown();
+        isf.shutdown();
     }
 
     @Test(expected=IllegalStateException.class)
     public void preConstruct_DomainServiceWithInvalidPreDestroyWrongNumberParams() {
         serviceList.add(new DomainServiceWithInvalidPreDestroyWrongNumberParams());
-        isfa = createIsisSessionFactoryAbstract(serviceList);
+        isf = createIsisSessionFactory(mockContainer, serviceList);
     }
 
     @Test(expected=IllegalStateException.class)
     public void validate_DomainServicesWithDuplicateIds() {
         serviceList.add(new DomainServiceWithSomeId());
         serviceList.add(new DomainServiceWithDuplicateId());
-        isfa = createIsisSessionFactoryAbstract(serviceList);
+        isf = createIsisSessionFactory(mockContainer, serviceList);
     }
 
 
-    private IsisSessionFactoryDefault createIsisSessionFactoryAbstract(List<Object> serviceList) {
-        return new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, mockContainer, serviceList, mockOidMarshaller) {
+    private IsisSessionFactoryDefault createIsisSessionFactory(DomainObjectContainer container, List<Object> serviceList) {
+        return new IsisSessionFactoryDefault(mockDeploymentType, configuration, mockSpecificationLoader, mockTemplateImageLoader, mockAuthenticationManager, mockAuthorizationManager, mockUserProfileLoader, mockPersistenceSessionFactory, container, serviceList, mockOidMarshaller) {
         };
     }
 }


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

Posted by da...@apache.org.
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);
     }
 
 


[4/5] git commit: ISIS-597: now runs ok

Posted by da...@apache.org.
ISIS-597: now runs ok

with services injected prior to @PostConstruct


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

Branch: refs/heads/master
Commit: 96b4b517749312a6d68f8b6e46963f6203cab28a
Parents: 9d96403
Author: Dan Haywood <da...@apache.org>
Authored: Thu Nov 21 10:31:43 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Nov 21 10:31:43 2013 +0000

----------------------------------------------------------------------
 .../RestfulObjectsSpecEventSerializer.java      | 29 ++++++++++++++++++--
 .../persistence/PersistenceSessionFactory.java  |  4 ++-
 .../session/IsisSessionFactoryDefault.java      |  1 +
 3 files changed, 31 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/96b4b517/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
index 2fa7a2b..81edb1a 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
@@ -18,25 +18,33 @@
  */
 package org.apache.isis.viewer.restfulobjects.rendering.eventserializer;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+
 import java.io.IOException;
 import java.util.Map;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.map.JsonMappingException;
+
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.applib.services.publish.EventMetadata;
 import org.apache.isis.applib.services.publish.EventPayload;
 import org.apache.isis.applib.services.publish.EventSerializer;
+import org.apache.isis.core.commons.ensure.Ensure;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.util.JsonMapper;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 import org.apache.isis.viewer.restfulobjects.rendering.domainobjects.DomainObjectReprRenderer;
-import org.codehaus.jackson.JsonGenerationException;
-import org.codehaus.jackson.map.JsonMappingException;
 
 @Hidden
 public class RestfulObjectsSpecEventSerializer implements EventSerializer {
@@ -50,6 +58,10 @@ public class RestfulObjectsSpecEventSerializer implements EventSerializer {
 
     @PostConstruct
     public void init(Map<String,String> props) {
+        // neither of these are used, but 'demonstrates' that container and services are injected prior to init.
+        Ensure.ensureThatState(container, is(not(nullValue())));
+        Ensure.ensureThatState(bookmarkService, is(not(nullValue())));
+        
         final String baseUrlFromConfig = props.get(BASE_URL_KEY);
         baseUrl = baseUrlFromConfig != null? baseUrlFromConfig: BASE_URL_DEFAULT;
     }
@@ -106,5 +118,18 @@ public class RestfulObjectsSpecEventSerializer implements EventSerializer {
         return jsonMapper;
     }
 
+    // //////////////////////////////////////
+
+    @SuppressWarnings("unused")
+    private DomainObjectContainer container;
+    public void setContainer(DomainObjectContainer container) {
+        this.container = container;
+    }
+    
+    @SuppressWarnings("unused")
+    private BookmarkService bookmarkService;
+    public void injectBookmarkService(BookmarkService bookmarkService) {
+        this.bookmarkService = bookmarkService;
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/96b4b517/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 4af5091..54791fd 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,6 +21,7 @@ package org.apache.isis.core.runtime.system.persistence;
 
 import java.util.List;
 
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterFactory;
 import org.apache.isis.core.metamodel.facetapi.ClassSubstitutorFactory;
@@ -61,9 +62,10 @@ public interface PersistenceSessionFactory extends ClassSubstitutorFactory, Meta
     PersistenceSession createPersistenceSession();
 
     // //////////////////////////////////////////////////////
-    // Services
+    // Container & Services
     // //////////////////////////////////////////////////////
 
+    public void setContainer(DomainObjectContainer container);
     public void setServices(List<Object> servicesList);
 
     public List<Object> getServices();

http://git-wip-us.apache.org/repos/asf/isis/blob/96b4b517/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 6bc8d9f..3eef909 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
@@ -219,6 +219,7 @@ public class IsisSessionFactoryDefault implements IsisSessionFactory {
 
         // must come after init of spec loader.
         specificationLoaderSpi.injectInto(persistenceSessionFactory);
+        persistenceSessionFactory.setContainer(container);
         persistenceSessionFactory.setServices(serviceList);
         userProfileLoader.setServices(serviceList);
 


[5/5] git commit: ISIS-598: can now use @Inject on field...

Posted by da...@apache.org.
ISIS-598: can now use @Inject on field...

... for dependency injection


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

Branch: refs/heads/master
Commit: ff4f466c2294f5dc2db5b5d3ff74111e3e9808ed
Parents: 96b4b51
Author: Dan Haywood <da...@apache.org>
Authored: Thu Nov 21 12:19:43 2013 +0000
Committer: Dan Haywood <da...@apache.org>
Committed: Thu Nov 21 12:19:43 2013 +0000

----------------------------------------------------------------------
 .../RestfulObjectsSpecEventSerializer.java      |  15 ++-
 core/applib/pom.xml                             |   4 +
 .../isis/applib/fixtures/AbstractFixture.java   |   3 +-
 .../services/ServicesInjectorDefault.java       |  80 ++++++++++---
 .../services/ServicesInjectorAbstractTest.java  |  97 ----------------
 .../services/ServicesInjectorDefaultTest.java   |  97 ++++++++++++++++
 ...ServicesInjectorDefaultTest_usingFields.java | 112 +++++++++++++++++++
 core/pom.xml                                    |   7 +-
 .../dom/src/main/java/app/ToDoAppDashboard.java |   6 +-
 .../main/java/app/ToDoAppDashboardService.java  |  13 ++-
 .../dom/src/main/java/app/ToDoItemAnalysis.java |  16 ++-
 .../java/app/ToDoItemAnalysisContributions.java |  13 +--
 .../java/app/ToDoItemsByCategoryViewModel.java  |   9 +-
 .../java/app/ToDoItemsByDateRangeViewModel.java |  10 +-
 .../dom/src/main/java/dom/todo/ToDoItem.java    |  19 +---
 .../java/dom/todo/ToDoItemContributions.java    |   8 +-
 .../dom/src/main/java/dom/todo/ToDoItems.java   |  11 +-
 .../main/java/fixture/LogonAsSvenFixture.java   |  30 -----
 .../java/fixture/todo/ToDoItemsFixture.java     |  15 +--
 .../src/main/java/dom/simple/SimpleObject.java  |   5 +-
 .../src/main/java/dom/simple/SimpleObjects.java |  19 +++-
 .../dom/simple/SimpleObjectsTest_create.java    |   2 +-
 .../dom/simple/SimpleObjectsTest_listAll.java   |  12 +-
 .../main/java/fixture/LogonAsSvenFixture.java   |  30 -----
 .../fixture/simple/SimpleObjectsFixture.java    |  13 +--
 25 files changed, 368 insertions(+), 278 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
----------------------------------------------------------------------
diff --git a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
index 81edb1a..6bfcde8 100644
--- a/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
+++ b/component/viewer/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/eventserializer/RestfulObjectsSpecEventSerializer.java
@@ -27,6 +27,7 @@ import java.util.Map;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.inject.Inject;
 
 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
@@ -120,16 +121,18 @@ public class RestfulObjectsSpecEventSerializer implements EventSerializer {
 
     // //////////////////////////////////////
 
+    @Inject
     @SuppressWarnings("unused")
     private DomainObjectContainer container;
-    public void setContainer(DomainObjectContainer container) {
-        this.container = container;
-    }
+//    public void setContainer(DomainObjectContainer container) {
+//        this.container = container;
+//    }
     
+    @Inject
     @SuppressWarnings("unused")
     private BookmarkService bookmarkService;
-    public void injectBookmarkService(BookmarkService bookmarkService) {
-        this.bookmarkService = bookmarkService;
-    }
+//    public void injectBookmarkService(BookmarkService bookmarkService) {
+//        this.bookmarkService = bookmarkService;
+//    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/applib/pom.xml
----------------------------------------------------------------------
diff --git a/core/applib/pom.xml b/core/applib/pom.xml
index 2a6ce8e..4850dd0 100644
--- a/core/applib/pom.xml
+++ b/core/applib/pom.xml
@@ -87,6 +87,10 @@
 			<groupId>joda-time</groupId>
 			<artifactId>joda-time</artifactId>
 		</dependency>
+        <dependency>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-atinject_1.0_spec</artifactId>
+        </dependency>
 
         <dependency>
             <groupId>org.apache.isis.core</groupId>

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
----------------------------------------------------------------------
diff --git a/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java b/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
index 9b49d6d..4db715b 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/fixtures/AbstractFixture.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
 
 import org.apache.isis.applib.annotation.Programmatic;
 
@@ -53,7 +54,7 @@ import org.apache.isis.applib.annotation.Programmatic;
  */
 public abstract class AbstractFixture extends BaseFixture implements CompositeFixture {
 
-    private final List<Object> fixtures = new ArrayList<Object>();
+    private final List<Object> fixtures = Lists.newArrayList();
 
     // ///////////////////////////////////////////////////////////////
     // Constructor

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/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 ffe0564..d5c9730 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
@@ -24,6 +24,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.nullValue;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
@@ -31,6 +32,8 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import javax.inject.Inject;
+
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -59,10 +62,8 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
      */
     private final Map<Class<?>, List<Object>> servicesByType = Maps.newHashMap();
 
-    private final List<Object> services = Lists.newArrayList();
-    
     private DomainObjectContainer container;
-
+    private final List<Object> services = Lists.newArrayList();
 
     
     // /////////////////////////////////////////////////////////
@@ -169,27 +170,67 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
 
     private static void injectServices(final Object object, final List<Object> services) {
         final Class<?> cls = object.getClass();
+
+        autowireViaFields(object, services, cls);
+        autowireViaPrefixedMethods(object, services, cls, "set");
+        autowireViaPrefixedMethods(object, services, cls, "inject");
+    }
+
+    private static void autowireViaFields(final Object object, final List<Object> services, final Class<?> cls) {
+        final List<Field> fields = Arrays.asList(cls.getDeclaredFields());
+        final Iterable<Field> injectFields = Iterables.filter(fields, new Predicate<Field>() {
+            @Override
+            public boolean apply(Field input) {
+                final Inject annotation = input.getAnnotation(javax.inject.Inject.class);
+                return annotation != null;
+            }
+        });
+
+        for (final Field field : injectFields) {
+            for (final Object service : services) {
+                final Class<?> serviceClass = service.getClass();
+                boolean isInjectorField = isInjectorFieldFor(field, serviceClass);
+                if(isInjectorField) {
+                    field.setAccessible(true);
+                    invokeInjectorField(field, object, service);
+                }
+            }
+        }
         
+        // recurse up the hierarchy
+        final Class<?> superclass = cls.getSuperclass();
+        if(superclass != null) {
+            autowireViaFields(object, services, superclass);
+        }
+    }
+    
+    private static void autowireViaPrefixedMethods(final Object object, final List<Object> services, final Class<?> cls, final String prefix) {
         final List<Method> methods = Arrays.asList(cls.getMethods());
-        final Iterable<Method> setterAndInjectorMethods = Iterables.filter(methods, new Predicate<Method>(){
+        final Iterable<Method> prefixedMethods = Iterables.filter(methods, new Predicate<Method>(){
             public boolean apply(Method method) {
                 final String methodName = method.getName();
-                return methodName.startsWith("set") || methodName.startsWith("inject");
+                return methodName.startsWith(prefix);
             }
         });
         
-        for (final Method method : setterAndInjectorMethods) {
+        for (final Method prefixedMethod : prefixedMethods) {
             for (final Object service : services) {
                 final Class<?> serviceClass = service.getClass();
-                boolean isInjectorMethod = isInjectorMethodFor(method, serviceClass);
+                boolean isInjectorMethod = isInjectorMethodFor(prefixedMethod, serviceClass);
                 if(isInjectorMethod) {
-                    method.setAccessible(true);
-                    invokeSetMethod(method, object, service);
+                    prefixedMethod.setAccessible(true);
+                    invokeInjectorMethod(prefixedMethod, object, service);
                 }
             }
         }
     }
 
+    private static boolean isInjectorFieldFor(final Field field, final Class<?> serviceClass) {
+        final Class<?> type = field.getType();
+        // don't think that type can ever be null, but Javadoc for java.lang.reflect.Field doesn't say
+        return type != null && type.isAssignableFrom(serviceClass);
+    }
+
     public static boolean isInjectorMethodFor(Method method, final Class<?> serviceClass) {
         final String methodName = method.getName();
         if (methodName.startsWith("set") || methodName.startsWith("inject")) {
@@ -200,7 +241,7 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
         }
         return false;
     }
-
+    
     private static void invokeMethod(final Method method, final Object target, final Object[] parameters) {
         try {
             method.invoke(target, parameters);
@@ -220,14 +261,27 @@ public class ServicesInjectorDefault implements ServicesInjectorSpi {
         }
     }
 
-    private static void invokeSetMethod(final Method set, final Object target, final Object parameter) {
-        final Object[] parameters = new Object[] { parameter };
-        invokeMethod(set, target, parameters);
+    private static void invokeInjectorField(final Field field, final Object target, final Object parameter) {
+        try {
+            field.set(target, parameter);
+        } catch (IllegalArgumentException e) {
+            throw new MetaModelException(e);
+        } catch (IllegalAccessException e) {
+            throw new MetaModelException(String.format("Cannot access the %s field in %s", field.getName(), target.getClass().getName()));
+        }
         if (LOG.isDebugEnabled()) {
             LOG.debug("injected " + parameter + " into " + new ToString(target));
         }
     }
 
+    private static void invokeInjectorMethod(final Method method, final Object target, final Object parameter) {
+        final Object[] parameters = new Object[] { parameter };
+        invokeMethod(method, target, parameters);
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("injected " + parameter + " into " + new ToString(target));
+        }
+    }
+    
     private void autowireServicesAndContainer() {
         injectServicesInto(this.services);
         injectServicesInto(this.container);

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java
deleted file mode 100644
index 360f530..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorAbstractTest.java
+++ /dev/null
@@ -1,97 +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.metamodel.services;
-
-import java.util.Arrays;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
-import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
-
-public class ServicesInjectorAbstractTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    @Mock
-    private DomainObjectContainerExtended mockContainer;
-    @Mock
-    private Service1 mockService1;
-    @Mock
-    private Service2 mockService2;
-    @Mock
-    private SomeDomainObject mockDomainObject;
-    
-    private ServicesInjectorSpi injector;
-
-    static interface Service1 {
-    }
-
-    static interface Service2 {
-    }
-
-    static interface Mixin {
-    }
-
-    static interface DomainObjectContainerExtended extends DomainObjectContainer, Mixin {
-    }
-
-    static interface SomeDomainObject {
-        public void setContainer(DomainObjectContainer container);
-        public void setMixin(Mixin mixin);
-        public void setService1(Service1 service);
-        public void setService2(Service2 service);
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        injector = new ServicesInjectorDefault();
-    }
-
-    @After
-    public void tearDown() throws Exception {
-    }
-
-    @Test
-    public void shouldInjectContainer() {
-        injector.setContainer(mockContainer);
-        final Object[] services = { mockService1, mockService2 };
-        injector.setServices(Arrays.asList(services));
-
-        context.checking(new Expectations() {
-            {
-                one(mockDomainObject).setContainer(mockContainer);
-                one(mockDomainObject).setMixin(mockContainer);
-                one(mockDomainObject).setService1(mockService1);
-                one(mockDomainObject).setService2(mockService2);
-            }
-        });
-
-        injector.injectServicesInto(mockDomainObject);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/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
new file mode 100644
index 0000000..e3e2bcc
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest.java
@@ -0,0 +1,97 @@
+/*
+ *  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.metamodel.services;
+
+import java.util.Arrays;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+public class ServicesInjectorDefaultTest {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+    @Mock
+    private DomainObjectContainerExtended mockContainer;
+    @Mock
+    private Service1 mockService1;
+    @Mock
+    private Service2 mockService2;
+    @Mock
+    private SomeDomainObject mockDomainObject;
+    
+    private ServicesInjectorSpi injector;
+
+    static interface Service1 {
+    }
+
+    static interface Service2 {
+    }
+
+    static interface Mixin {
+    }
+
+    static interface DomainObjectContainerExtended extends DomainObjectContainer, Mixin {
+    }
+
+    static interface SomeDomainObject {
+        public void setContainer(DomainObjectContainer container);
+        public void setMixin(Mixin mixin);
+        public void setService1(Service1 service);
+        public void setService2(Service2 service);
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        injector = new ServicesInjectorDefault();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void shouldInjectContainer() {
+        injector.setContainer(mockContainer);
+        final Object[] services = { mockService1, mockService2 };
+        injector.setServices(Arrays.asList(services));
+
+        context.checking(new Expectations() {
+            {
+                one(mockDomainObject).setContainer(mockContainer);
+                one(mockDomainObject).setMixin(mockContainer);
+                one(mockDomainObject).setService1(mockService1);
+                one(mockDomainObject).setService2(mockService2);
+            }
+        });
+
+        injector.injectServicesInto(mockDomainObject);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/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
new file mode 100644
index 0000000..1657249
--- /dev/null
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/services/ServicesInjectorDefaultTest_usingFields.java
@@ -0,0 +1,112 @@
+/*
+ *  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.metamodel.services;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+
+import javax.inject.Inject;
+
+import org.jmock.Expectations;
+import org.jmock.auto.Mock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import org.apache.isis.applib.DomainObjectContainer;
+import org.apache.isis.core.metamodel.services.container.DomainObjectContainerDefault;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
+import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
+
+public class ServicesInjectorDefaultTest_usingFields {
+
+    @Rule
+    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
+
+    private DomainObjectContainer container;
+    
+    private SomeDomainService1 service1;
+    private SomeDomainService2 service2;
+    private SomeDomainService3 service3;
+    
+    private ServicesInjectorSpi injector;
+
+
+    static class SomeDomainService3 { }
+
+    static class SomeDomainService1 {
+        @Inject
+        private DomainObjectContainer container;
+        DomainObjectContainer getContainer() {
+            return container;
+        }
+        @Inject
+        private SomeDomainService2Abstract someDomainService2;
+        SomeDomainService2Abstract getSomeDomainService2() {
+            return someDomainService2;
+        }
+    }
+    static abstract class SomeDomainService2Abstract {
+        @Inject
+        private SomeDomainService1 someDomainService1;
+        SomeDomainService1 getSomeDomainService1() {
+            return someDomainService1;
+        }
+    }
+    static class SomeDomainService2 extends SomeDomainService2Abstract {
+        @Inject
+        private SomeDomainService3 someDomainService3;
+        SomeDomainService3 getSomeDomainService3() {
+            return someDomainService3;
+        }
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        container = new DomainObjectContainerDefault();
+        service1 = new SomeDomainService1();
+        service3 = new SomeDomainService3();
+        service2 = new SomeDomainService2();
+        injector = new ServicesInjectorDefault();
+    }
+
+    @Test
+    public void shouldInjectContainer() {
+        injector.setContainer(container);
+        injector.setServices(Arrays.asList(service1, service3, service2));
+
+        injector.injectServicesInto(container);
+        injector.injectServicesInto(service1);
+        injector.injectServicesInto(service2);
+        injector.injectServicesInto(service3);
+        
+        assertThat(service1.getContainer(), is(container));
+        assertThat(service1.getSomeDomainService2(), is((SomeDomainService2Abstract)service2));
+        
+        assertThat(service2.getSomeDomainService1(), is(service1));
+        
+        assertThat(service2.getSomeDomainService1(), is(service1));
+        assertThat(service2.getSomeDomainService3(), is(service3));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 4c049fb..14523b1 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -1477,7 +1477,12 @@ ${license.additional-notes}
                 <artifactId>geronimo-javamail_1.4_spec</artifactId>
                 <version>1.7.1</version>
             </dependency>
-        
+            <dependency>
+                <groupId>org.apache.geronimo.specs</groupId>
+                <artifactId>geronimo-atinject_1.0_spec</artifactId>
+                <version>1.0</version>
+            </dependency>
+
            <dependency>
                <groupId>org.picocontainer</groupId>
                <artifactId>picocontainer</artifactId>

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
index 4fea1b5..61141e5 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboard.java
@@ -80,11 +80,7 @@ public class ToDoAppDashboard extends AbstractViewModel {
     // injected services
     // //////////////////////////////////////
     
+    @javax.inject.Inject
     private ToDoItemAnalysis toDoItemAnalysis;
-    
-    public void injectToDoItemAnalysis(ToDoItemAnalysis toDoItemAnalysis) {
-        this.toDoItemAnalysis = toDoItemAnalysis;
-    }
-
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
index 4b8e2772..95534dd 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoAppDashboardService.java
@@ -18,14 +18,14 @@
  */
 package app;
 
-import org.apache.isis.applib.AbstractService;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Hidden;
 import org.apache.isis.applib.annotation.HomePage;
 
 @Hidden
-public class ToDoAppDashboardService extends AbstractService {
+public class ToDoAppDashboardService  {
 
     private static final String ID = "dashboard";
 
@@ -42,8 +42,15 @@ public class ToDoAppDashboardService extends AbstractService {
     @ActionSemantics(Of.SAFE)
     @HomePage
     public ToDoAppDashboard lookup() {
-        return newViewModelInstance(ToDoAppDashboard.class, ID);
+        return container.newViewModelInstance(ToDoAppDashboard.class, ID);
     }
 
+    
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
+
+    @javax.inject.Inject
+    private DomainObjectContainer container;
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
index 44475b4..a102c48 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysis.java
@@ -27,7 +27,7 @@ import com.google.common.collect.Lists;
 
 import dom.todo.ToDoItem.Category;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
@@ -36,13 +36,12 @@ import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Programmatic;
 
 @Named("Analysis")
-public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
+public class ToDoItemAnalysis {
 
     // //////////////////////////////////////
     // Identification in the UI
     // //////////////////////////////////////
 
-    @Override
     public String getId() {
         return "analysis";
     }
@@ -69,7 +68,7 @@ public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
              @Override
              public ToDoItemsByCategoryViewModel apply(final Category category) {
                  final ToDoItemsByCategoryViewModel byCategory = 
-                     getContainer().newViewModelInstance(ToDoItemsByCategoryViewModel.class, category.name());
+                     container.newViewModelInstance(ToDoItemsByCategoryViewModel.class, category.name());
                  byCategory.setCategory(category);
                  return byCategory;
              }
@@ -103,7 +102,7 @@ public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
              @Override
              public ToDoItemsByDateRangeViewModel apply(final DateRange dateRange) {
                  final ToDoItemsByDateRangeViewModel byDateRange = 
-                     getContainer().newViewModelInstance(ToDoItemsByDateRangeViewModel.class, dateRange.name());
+                     container.newViewModelInstance(ToDoItemsByDateRangeViewModel.class, dateRange.name());
                  byDateRange.setDateRange(dateRange);
                  return byDateRange;
              }
@@ -121,4 +120,11 @@ public class ToDoItemAnalysis extends AbstractFactoryAndRepository {
     }
     
 
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
+
+    @javax.inject.Inject
+    private DomainObjectContainer container;
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
index 158f113..c9b40a0 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemAnalysisContributions.java
@@ -20,16 +20,15 @@ package app;
 
 import dom.todo.ToDoItem;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
 import org.apache.isis.applib.annotation.ActionSemantics;
-import org.apache.isis.applib.annotation.NotContributed;
-import org.apache.isis.applib.annotation.NotInServiceMenu;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
-import org.apache.isis.applib.annotation.NotContributed.As;
 import org.apache.isis.applib.annotation.Hidden;
+import org.apache.isis.applib.annotation.NotContributed;
+import org.apache.isis.applib.annotation.NotContributed.As;
+import org.apache.isis.applib.annotation.NotInServiceMenu;
 
 @Hidden
-public class ToDoItemAnalysisContributions extends AbstractFactoryAndRepository {
+public class ToDoItemAnalysisContributions {
 
 
     // //////////////////////////////////////
@@ -48,8 +47,6 @@ public class ToDoItemAnalysisContributions extends AbstractFactoryAndRepository
     // injected services
     // //////////////////////////////////////
 
+    @javax.inject.Inject
     private ToDoItemAnalysis toDoAppAnalysis;
-    public void injectToDoAppAnalysis(ToDoItemAnalysis toDoAppAnalysis) {
-        this.toDoAppAnalysis = toDoAppAnalysis;
-    }
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
index efc826d..a4c5f90 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByCategoryViewModel.java
@@ -32,10 +32,7 @@ import dom.todo.ToDoItem.Subcategory;
 import dom.todo.ToDoItems;
 
 import org.apache.isis.applib.AbstractViewModel;
-import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Bookmarkable;
-import org.apache.isis.applib.annotation.Bounded;
-import org.apache.isis.applib.annotation.Disabled;
 import org.apache.isis.applib.annotation.MultiLine;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Render;
@@ -178,11 +175,7 @@ public class ToDoItemsByCategoryViewModel
     // injected services
     // //////////////////////////////////////
     
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void injectedToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
-
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
index bf62ffc..947315e 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/app/ToDoItemsByDateRangeViewModel.java
@@ -33,6 +33,7 @@ import dom.todo.ToDoItems;
 import org.joda.time.DateTime;
 
 import org.apache.isis.applib.AbstractViewModel;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Render;
@@ -149,15 +150,10 @@ public class ToDoItemsByDateRangeViewModel
     // injected services
     // //////////////////////////////////////
     
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void injectedToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
+    @javax.inject.Inject
     private ClockService clockService;
-    public void injectClockService(ClockService clockService) {
-        this.clockService = clockService;
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
index 89e024a..7b96700 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItem.java
@@ -39,12 +39,10 @@ import com.google.common.collect.Ordering;
 import org.joda.time.LocalDate;
 
 import org.apache.isis.applib.DomainObjectContainer;
-import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.Audited;
 import org.apache.isis.applib.annotation.AutoComplete;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.Bulk;
-import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bulk.InteractionContext;
 import org.apache.isis.applib.annotation.CssClass;
 import org.apache.isis.applib.annotation.Disabled;
@@ -64,7 +62,6 @@ import org.apache.isis.applib.annotation.SortedBy;
 import org.apache.isis.applib.annotation.TypicalLength;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.clock.Clock;
-import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.TitleBuffer;
 import org.apache.isis.applib.value.Blob;
@@ -704,22 +701,15 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
     // Injected Services
     // //////////////////////////////////////
 
+    @javax.inject.Inject
     private DomainObjectContainer container;
 
-    public void injectDomainObjectContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void injectToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
+    @javax.inject.Inject
+    @SuppressWarnings("unused")
     private ClockService clockService;
-    public void injectClockService(ClockService clockService) {
-        this.clockService = clockService;
-    }
     
     // //////////////////////////////////////
     // Extensions
@@ -739,6 +729,5 @@ public class ToDoItem implements Comparable<ToDoItem> /*, Locatable*/ { // GMAP3
 //    public void setLocation(Location location) {
 //        this.location = location;
 //    }
-
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
index ed7eced..6f8152c 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItemContributions.java
@@ -206,10 +206,12 @@ public class ToDoItemContributions extends AbstractFactoryAndRepository {
         return getContainer().getUser().getName();
     }
 
+
+    // //////////////////////////////////////
+    // Injected services
     // //////////////////////////////////////
 
+    @javax.inject.Inject
     private ToDoItems toDoItems;
-    public void injectToDoItems(ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
index 57e7dfc..4643f12 100644
--- a/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
+++ b/example/application/quickstart_wicket_restful_jdo/dom/src/main/java/dom/todo/ToDoItems.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.annotation.Named;
 import org.apache.isis.applib.annotation.Optional;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.RegEx;
-import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.query.QueryDefault;
 
 import services.ClockService;
@@ -242,17 +241,11 @@ public class ToDoItems {
     // Injected Services
     // //////////////////////////////////////
 
-    
+    @javax.inject.Inject
     private DomainObjectContainer container;
 
-    public void injectDomainObjectContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
-
+    @javax.inject.Inject
     private ClockService clockService;
-    public void injectClockService(ClockService clockService) {
-        this.clockService = clockService;
-    }
 
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
deleted file mode 100644
index 5bdc6fe..0000000
--- a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
+++ /dev/null
@@ -1,30 +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 fixture;
-
-import org.apache.isis.applib.fixtures.LogonFixture;
-
-public class LogonAsSvenFixture extends LogonFixture {
-
-    public LogonAsSvenFixture() {
-        super("sven");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
index 0ca9e02..10f12f3 100644
--- a/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
+++ b/example/application/quickstart_wicket_restful_jdo/fixture/src/main/java/fixture/todo/ToDoItemsFixture.java
@@ -88,20 +88,15 @@ public class ToDoItemsFixture extends AbstractFixture {
         return date.plusDays(i);
     }
 
-    
-    // //////////////////////////////////////
 
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
 
+    @javax.inject.Inject
     private ToDoItems toDoItems;
 
-    public void setToDoItems(final ToDoItems toDoItems) {
-        this.toDoItems = toDoItems;
-    }
-
-    
+    @javax.inject.Inject
     private IsisJdoSupport isisJdoSupport;
-    public void injectIsisJdoSupport(IsisJdoSupport isisJdoSupport) {
-        this.isisJdoSupport = isisJdoSupport;
-    }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
index 0597341..b48b45d 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObject.java
@@ -69,10 +69,9 @@ public class SimpleObject implements Comparable<SimpleObject> {
     // Injected
     // //////////////////////////////////////
 
+
+    @javax.inject.Inject
     @SuppressWarnings("unused")
     private DomainObjectContainer container;
-    public void injectDomainObjectContainer(final DomainObjectContainer container) {
-        this.container = container;
-    }
     
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
index 5bca784..13cd192 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/main/java/dom/simple/SimpleObjects.java
@@ -20,20 +20,19 @@ package dom.simple;
 
 import java.util.List;
 
-import org.apache.isis.applib.AbstractFactoryAndRepository;
+import org.apache.isis.applib.DomainObjectContainer;
 import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.applib.annotation.ActionSemantics.Of;
 import org.apache.isis.applib.annotation.Bookmarkable;
 import org.apache.isis.applib.annotation.MemberOrder;
 import org.apache.isis.applib.annotation.Named;
 
-public class SimpleObjects extends AbstractFactoryAndRepository {
+public class SimpleObjects {
 
     // //////////////////////////////////////
     // Identification in the UI
     // //////////////////////////////////////
 
-    @Override
     public String getId() {
         return "simple";
     }
@@ -50,7 +49,7 @@ public class SimpleObjects extends AbstractFactoryAndRepository {
     @ActionSemantics(Of.SAFE)
     @MemberOrder(sequence = "1")
     public List<SimpleObject> listAll() {
-        return allInstances(SimpleObject.class);
+        return container.allInstances(SimpleObject.class);
     }
 
 
@@ -61,10 +60,18 @@ public class SimpleObjects extends AbstractFactoryAndRepository {
     @MemberOrder(sequence = "2")
     public SimpleObject create(
             final @Named("Name") String name) {
-        final SimpleObject obj = newTransientInstance(SimpleObject.class);
+        final SimpleObject obj = container.newTransientInstance(SimpleObject.class);
         obj.setName(name);
-        persistIfNotAlready(obj);
+        container.persistIfNotAlready(obj);
         return obj;
     }
 
+    
+    // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
+
+    @javax.inject.Inject 
+    DomainObjectContainer container;
+
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
index d9b2031..f4ad5d3 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_create.java
@@ -44,7 +44,7 @@ public class SimpleObjectsTest_create {
     @Before
     public void setUp() throws Exception {
         simpleObjects = new SimpleObjects();
-        simpleObjects.setContainer(mockContainer);
+        simpleObjects.container = mockContainer;
     }
     
     @Test

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
index a32515b..d970432 100644
--- a/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
+++ b/example/application/simple_wicket_restful_jdo/dom/src/test/java/dom/simple/SimpleObjectsTest_listAll.java
@@ -16,17 +16,14 @@
  */
 package dom.simple;
 
-import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
 import java.util.List;
 
 import com.google.common.collect.Lists;
 
-import dom.simple.SimpleObject;
-
 import org.jmock.Expectations;
-import org.jmock.Sequence;
 import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
@@ -49,15 +46,14 @@ public class SimpleObjectsTest_listAll {
     @Before
     public void setUp() throws Exception {
         simpleObjects = new SimpleObjects();
-        simpleObjects.setContainer(mockContainer);
+        simpleObjects.container = mockContainer;
     }
     
     @Test
     public void happyCase() throws Exception {
         
-        
         // given
-        final List all = Lists.newArrayList();
+        final List<SimpleObject> all = Lists.newArrayList();
         
         context.checking(new Expectations() {
             {
@@ -67,7 +63,7 @@ public class SimpleObjectsTest_listAll {
         });
         
         // when
-        final List list = simpleObjects.listAll();
+        final List<SimpleObject> list = simpleObjects.listAll();
         
         // then
         assertThat(list, is(all));

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java b/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
deleted file mode 100644
index 5bdc6fe..0000000
--- a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/LogonAsSvenFixture.java
+++ /dev/null
@@ -1,30 +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 fixture;
-
-import org.apache.isis.applib.fixtures.LogonFixture;
-
-public class LogonAsSvenFixture extends LogonFixture {
-
-    public LogonAsSvenFixture() {
-        super("sven");
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/ff4f466c/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
----------------------------------------------------------------------
diff --git a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java b/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
index 07317ea..148fc42 100644
--- a/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
+++ b/example/application/simple_wicket_restful_jdo/fixture/src/main/java/fixture/simple/SimpleObjectsFixture.java
@@ -54,18 +54,13 @@ public class SimpleObjectsFixture extends AbstractFixture {
 
 
     // //////////////////////////////////////
+    // Injected services
+    // //////////////////////////////////////
 
-
+    @javax.inject.Inject
     private SimpleObjects simpleObjects;
 
-    public void injectSimpleObjects(final SimpleObjects simpleObjects) {
-        this.simpleObjects = simpleObjects;
-    }
-
-    
+    @javax.inject.Inject
     private IsisJdoSupport isisJdoSupport;
-    public void injectIsisJdoSupport(IsisJdoSupport isisJdoSupport) {
-        this.isisJdoSupport = isisJdoSupport;
-    }
 
 }