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

[3/4] isis git commit: ISIS-1194: simplfying the bootstrap and wiring of components, in particular around PersistenceSessionFactory

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/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 9d76879..04ff7c9 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
@@ -19,7 +19,6 @@
 
 package org.apache.isis.core.metamodel.specloader;
 
-import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -57,7 +56,6 @@ import org.apache.isis.core.metamodel.runtimecontext.ServicesInjectorAware;
 import org.apache.isis.core.metamodel.runtimecontext.noruntime.RuntimeContextNoRuntime;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.metamodel.spec.FreeStandingList;
-import org.apache.isis.core.metamodel.spec.InjectorMethodEvaluator;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.ObjectSpecificationDependencies;
@@ -118,23 +116,12 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
 
     private final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
 
-    /**
-     * Injected in the constructor.
-     */
+    private final DeploymentCategory deploymentCategory;
     private final IsisConfiguration configuration;
-    /**
-     * Injected in the constructor.
-     */
     private final ProgrammingModel programmingModel;
-
-    /**
-     * Defaulted in the constructor.
-     */
     private final FacetProcessor facetProcessor;
 
     /**
-     * Initialized in the constructor.
-     * 
      * <p>
      * {@link FacetDecorator}s must be added prior to {@link #init()
      * initialization.}
@@ -146,9 +133,8 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
      * {@link RuntimeContextNoRuntime}) otherwise.
      * 
      * <p>
-     * Should be injected when used by framework, but will default to a no-op
-     * implementation if the metamodel is being used standalone (eg for a
-     * code-generator).
+     * Should be injected when used by framework, but will default to a no-op implementation if the metamodel is
+     * being used standalone (eg for a code-generator).
      */
     private RuntimeContext runtimeContext;
 
@@ -163,19 +149,21 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
      * Populated in {@link SpecificationLoaderSpi#setServiceInjector(org.apache.isis.core.metamodel.services.ServicesInjectorSpi)}.
      */
     private ServicesInjectorSpi servicesInjector;
-
+    private ValidationFailures validationFailures;
 
     // /////////////////////////////////////////////////////////////
     // Constructor
     // /////////////////////////////////////////////////////////////
 
     public ObjectReflectorDefault(
+            final DeploymentCategory deploymentCategory,
             final IsisConfiguration configuration,
             final ProgrammingModel programmingModel,
             final Set<FacetDecorator> facetDecorators,
             final MetaModelValidator metaModelValidator,
             final List<LayoutMetadataReader> layoutMetadataReaders) {
 
+        ensureThatArg(deploymentCategory, is(notNullValue()));
         ensureThatArg(configuration, is(notNullValue()));
         ensureThatArg(programmingModel, is(notNullValue()));
         ensureThatArg(facetDecorators, is(notNullValue()));
@@ -183,6 +171,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         ensureThatArg(layoutMetadataReaders, is(notNullValue()));
         ensureThatArg(layoutMetadataReaders, is(not(emptyCollectionOf(LayoutMetadataReader.class))));
 
+        this.deploymentCategory = deploymentCategory;
         this.configuration = configuration;
         this.programmingModel = programmingModel;
 
@@ -227,8 +216,10 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     }
 
     public ValidationFailures validate() {
-        ValidationFailures validationFailures = new ValidationFailures();
-        metaModelValidator.validate(validationFailures);
+        if(validationFailures == null) {
+            validationFailures = new ValidationFailures();
+            metaModelValidator.validate(validationFailures);
+        }
         return validationFailures;
     }
 
@@ -239,10 +230,9 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
 
         // default subcomponents
         if (runtimeContext == null) {
-            runtimeContext = new RuntimeContextNoRuntime(servicesInjector);
+            runtimeContext = new RuntimeContextNoRuntime(servicesInjector, this);
         }
-        injectInto(runtimeContext);
-        injectInto(specificationTraverser);
+
         injectInto(metaModelValidator);
 
         // wire subcomponents into each other
@@ -323,13 +313,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         }
     }
 
-    //region > isInjectorMethodFor
-    private final InjectorMethodEvaluator injectorMethodEvaluator = new InjectorMethodEvaluatorDefault();
-
-    public boolean isInjectorMethodFor(Method method, final Class<?> serviceClass) {
-        return injectorMethodEvaluator.isInjectorMethodFor(method, serviceClass);
-    }
-    //endregion
 
     private void recache(final ObjectSpecification newSpec) {
         getCache().recache(newSpec);
@@ -443,17 +426,13 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
     private ObjectSpecification createSpecification(final Class<?> cls) {
 
         final ServicesInjector servicesInjector = getRuntimeContext().getServicesInjector();
-        final PersistenceSessionService persistenceSessionService =
-                getRuntimeContext().getPersistenceSessionService();
+        final PersistenceSessionService persistenceSessionService = getRuntimeContext().getPersistenceSessionService();
 
         final ObjectSpecificationDependencies specContext =
-                new ObjectSpecificationDependencies(
-                        getDeploymentCategory(), servicesInjector, this, facetProcessor);
+                new ObjectSpecificationDependencies(deploymentCategory, servicesInjector, this, facetProcessor);
 
         final ObjectMemberDependencies objectMemberDependencies =
-                new ObjectMemberDependencies(
-                this, servicesInjector,
-                        persistenceSessionService);
+                new ObjectMemberDependencies(this, servicesInjector, persistenceSessionService);
 
         // ... and create the specs
         if (FreeStandingList.class.isAssignableFrom(cls)) {
@@ -467,10 +446,6 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
         }
     }
 
-    private DeploymentCategory getDeploymentCategory() {
-        return runtimeContext.getDeploymentCategoryProvider().getDeploymentCategory();
-    }
-
     private Class<?> loadBuiltIn(final String className) throws ClassNotFoundException {
         final Class<?> builtIn = ClassUtil.getBuiltIn(className);
         if (builtIn != null) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
index c3b42c9..b132603 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorInstaller.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.specloader;
 
 import java.util.Collection;
 import org.apache.isis.core.commons.components.Installer;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 
@@ -31,7 +32,9 @@ public interface ObjectReflectorInstaller extends Installer {
 
     static String TYPE = "reflector";
 
-    SpecificationLoaderSpi createReflector(Collection<MetaModelRefiner> metaModelRefiners);
+    SpecificationLoaderSpi createReflector(
+            final DeploymentCategory deploymentCategory,
+            final Collection<MetaModelRefiner> metaModelRefiners);
 
     void addFacetDecoratorInstaller(final FacetDecoratorInstaller decoratorInstaller);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/core/metamodel/transactions/TransactionStateProvider.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/transactions/TransactionStateProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/transactions/TransactionStateProvider.java
index 26349d0..18a2ed5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/transactions/TransactionStateProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/transactions/TransactionStateProvider.java
@@ -19,8 +19,9 @@
 
 package org.apache.isis.core.metamodel.transactions;
 
-import org.apache.isis.core.commons.components.Injectable;
+public interface TransactionStateProvider {
+
+    void injectInto(final Object candidate);
 
-public interface TransactionStateProvider extends Injectable {
     public TransactionState getTransactionState();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
index d7c623b..61dae20 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorHelper.java
@@ -25,6 +25,7 @@ import java.util.Set;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.layoutmetadata.LayoutMetadataReader;
@@ -42,12 +43,13 @@ public final class JavaReflectorHelper  {
     private JavaReflectorHelper(){}
     
     public static SpecificationLoaderSpi createObjectReflector(
+            final DeploymentCategory deploymentCategory,
+            final IsisConfiguration configuration,
             final ProgrammingModel programmingModel,
             final Collection<MetaModelRefiner> metaModelRefiners,
             final Set<FacetDecorator> facetDecorators,
             final List<LayoutMetadataReader> layoutMetadataReaders,
-            final MetaModelValidator mmv,
-            final IsisConfiguration configuration) {
+            final MetaModelValidator mmv) {
 
         MetaModelValidatorComposite metaModelValidator = MetaModelValidatorComposite.asComposite(mmv);
         for (MetaModelRefiner metaModelRefiner : metaModelRefiners) {
@@ -60,7 +62,9 @@ public final class JavaReflectorHelper  {
             programmingModel.refineMetaModelValidator(metaModelValidator, configuration);
         }
 
-        return new ObjectReflectorDefault(configuration, programmingModel, facetDecorators, metaModelValidator, layoutMetadataReaders);
+        return new ObjectReflectorDefault(
+                deploymentCategory, configuration,
+                programmingModel, facetDecorators, metaModelValidator, layoutMetadataReaders);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
index ba36810..f287ec0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
+++ b/core/metamodel/src/main/java/org/apache/isis/progmodels/dflt/JavaReflectorInstallerNoDecorators.java
@@ -32,6 +32,7 @@ import org.apache.isis.core.commons.config.ConfigurationConstants;
 import org.apache.isis.core.commons.config.InstallerAbstract;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
@@ -73,14 +74,16 @@ public class JavaReflectorInstallerNoDecorators extends InstallerAbstract implem
     // /////////////////////////////////////////////////////
 
     @Override
-    public SpecificationLoaderSpi createReflector(final Collection<MetaModelRefiner> metaModelRefiners) {
+    public SpecificationLoaderSpi createReflector(
+            final DeploymentCategory deploymentCategory,
+            final Collection<MetaModelRefiner> metaModelRefiners) {
 
         final ProgrammingModel programmingModel = createProgrammingModel(getConfiguration());
         final Set<FacetDecorator> facetDecorators = createFacetDecorators(getConfiguration());
         final MetaModelValidator mmv = createMetaModelValidator(getConfiguration());
         final List<LayoutMetadataReader> layoutMetadataReaders = createLayoutMetadataReaders(getConfiguration());
 
-        return JavaReflectorHelper.createObjectReflector(programmingModel, metaModelRefiners, facetDecorators, layoutMetadataReaders, mmv, getConfiguration());
+        return JavaReflectorHelper.createObjectReflector(deploymentCategory, getConfiguration(), programmingModel, metaModelRefiners, facetDecorators, layoutMetadataReaders, mmv);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelBaseTest_constructDefaults.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelBaseTest_constructDefaults.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelBaseTest_constructDefaults.java
index 75ee989..3dd2ad2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelBaseTest_constructDefaults.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelBaseTest_constructDefaults.java
@@ -23,15 +23,12 @@ import org.jmock.auto.Mock;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContext;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
-
 public class IsisMetaModelBaseTest_constructDefaults {
 
     @Rule
@@ -48,28 +45,9 @@ public class IsisMetaModelBaseTest_constructDefaults {
     @Before
     public void setUp() {
         context.ignoring(mockProgrammingModel);
-        metaModel = new IsisMetaModel(mockContext, mockProgrammingModel);
+        metaModel = new IsisMetaModel(mockProgrammingModel);
     }
 
-    @Test
-    public void shouldDefaultConfiguration() {
-        assertThat(metaModel.getConfiguration(), is(notNullValue()));
-    }
-
-    @Test
-    public void shouldDefaultProgrammingModelFacets() {
-        assertThat(metaModel.getProgrammingModelFacets(), is(notNullValue()));
-    }
-
-    @Test
-    public void shouldDefaultFacetDecorators() {
-        assertThat(metaModel.getFacetDecorators(), is(notNullValue()));
-    }
-
-    @Test
-    public void shouldHaveNoFacetDecorators() {
-        assertThat(metaModel.getFacetDecorators().size(), is(0));
-    }
 
     @Test(expected = IllegalStateException.class)
     public void shouldNotBeAbleToShutdown() {

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_constructWithServices.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_constructWithServices.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_constructWithServices.java
index 6269785..8573067 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_constructWithServices.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_constructWithServices.java
@@ -62,13 +62,13 @@ public class IsisMetaModelTest_constructWithServices {
 
     @Test
     public void shouldSucceedWithoutThrowingAnyExceptions() {
-        metaModel = new IsisMetaModel(mockContext, mockProgrammingModel);
+        metaModel = new IsisMetaModel(mockProgrammingModel);
     }
 
     @Test
     public void shouldBeAbleToRegisterServices() {
-        metaModel = new IsisMetaModel(mockContext, mockProgrammingModel, mockService1, mockService2);
-        final List<Object> services = metaModel.getServices();
+        metaModel = new IsisMetaModel(mockProgrammingModel, mockService1, mockService2);
+        final List<Object> services = metaModel.getServicesInjector().getRegisteredServices();
         assertThat(services.size(), is(3));
         assertThat(services, IsisMatchers.containsObjectOfType(SomeRepo.class));
         assertThat(services, IsisMatchers.containsObjectOfType(SomeOtherRepo.class));

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
index c525047..929fcca 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_getDomainObjectContainer.java
@@ -45,7 +45,7 @@ public class IsisMetaModelTest_getDomainObjectContainer {
 
     @Before
     public void setUp() {
-        metaModel = new IsisMetaModel(mockContext, mockProgrammingModel);
+        metaModel = new IsisMetaModel(mockProgrammingModel);
         expectingMetaModelToBeInitialized();
         metaModel.init();
     }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
deleted file mode 100644
index ff17185..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/app/IsisMetaModelTest_init.java
+++ /dev/null
@@ -1,171 +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.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.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
-import org.apache.isis.core.commons.config.IsisConfiguration;
-import org.apache.isis.core.metamodel.runtimecontext.MessageBrokerService;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
-import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProviderAbstract;
-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.runtimecontext.ServicesInjector;
-import org.apache.isis.core.metamodel.spec.SpecificationLoader;
-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_init {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
-
-    @Mock
-    private IsisConfiguration mockConfiguration;
-    @Mock
-    private ProgrammingModel mockProgrammingModelFacets;
-    @Mock
-    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
-    @Mock
-    private SpecificationLoader mockSpecificationLoader;
-    @Mock
-    private AdapterManager mockAdapterManager;
-    @Mock
-    private MessageBrokerService mockMessageBrokerService;
-    @Mock
-    private ServicesInjector mockDependencyInjector;
-    @Mock
-    private FacetDecorator mockFacetDecorator;
-    @Mock
-    private RuntimeContext mockRuntimeContext;
-
-    private IsisMetaModel metaModel;
-
-    @Before
-    public void setUp() {
-        expectingMetaModelToBeInitialized();
-        metaModel = new IsisMetaModel(mockRuntimeContext, mockProgrammingModelFacets);
-    }
-
-    private void expectingMetaModelToBeInitialized() {
-        final Sequence initSequence = context.sequence("init");
-        context.checking(new Expectations() {
-            {
-                allowing(mockRuntimeContext).injectInto(with(any(Object.class)));
-                will(IsisActions.injectInto());
-                
-                allowing(mockRuntimeContext).getAuthenticationSessionProvider();
-                will(returnValue(mockAuthenticationSessionProvider));
-
-                allowing(mockRuntimeContext).getSpecificationLoader();
-                will(returnValue(mockSpecificationLoader));
-
-                allowing(mockRuntimeContext).getMessageBrokerService();
-                will(returnValue(mockMessageBrokerService));
-
-                allowing(mockRuntimeContext).getServicesInjector();
-                will(returnValue(mockDependencyInjector));
-
-                allowing(mockRuntimeContext).getDeploymentCategoryProvider();
-                will(returnValue(new DeploymentCategoryProviderAbstract() {
-                    @Override
-                    public DeploymentCategory getDeploymentCategory() {
-                        return DeploymentCategory.PRODUCTION;
-                    }
-                }));
-
-                oneOf(mockProgrammingModelFacets).init();
-                inSequence(initSequence);
-                
-                oneOf(mockProgrammingModelFacets).getList();
-                inSequence(initSequence);
-                will(returnValue(Lists.newArrayList()));
-                
-                oneOf(mockRuntimeContext).init();
-                inSequence(initSequence);
-            }
-        });
-        context.ignoring(mockProgrammingModelFacets);
-    }
-
-    @Ignore // too much effort, not used
-    @Test
-    public void shouldSucceedWithoutThrowingAnyExceptions() {
-        metaModel.init();
-    }
-
-    @Ignore // too much effort, not used
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeConfiguration() {
-        metaModel.init();
-        metaModel.setConfiguration(mockConfiguration);
-    }
-
-    @Ignore // too much effort, not used
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeProgrammingModelFacets() {
-        metaModel.init();
-        metaModel.setProgrammingModelFacets(mockProgrammingModelFacets);
-    }
-
-    @Ignore // too much effort, not used
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToChangeFacetDecorators() {
-        metaModel.init();
-        metaModel.setFacetDecorators(new TreeSet<FacetDecorator>());
-    }
-
-    @Ignore // too much effort, not used
-    @Test(expected = UnsupportedOperationException.class)
-    public void shouldNotBeAbleToAddToFacetDecorators() {
-        metaModel.init();
-        metaModel.getFacetDecorators().add(mockFacetDecorator);
-    }
-
-    @Ignore // too much effort, not used
-    @Test(expected = IllegalStateException.class)
-    public void shouldNotBeAbleToInitializeAgain() {
-        metaModel.init();
-        //
-        metaModel.init();
-    }
-
-    @Ignore // too much effort, not used
-    @Test
-    public void shouldPrime() {
-        metaModel.init();
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
index 4de3725..9f15094 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ProgrammableReflector.java
@@ -80,14 +80,6 @@ public class ProgrammableReflector extends SpecificationLoaderAbstract implement
     public void injectInto(final Object candidate) {
     }
 
-    //region > isInjectorMethodFor
-
-    private final Map<Method, Map<Class<?>, Boolean>> isInjectorMethod = Maps.newConcurrentMap();
-
-    public boolean isInjectorMethodFor(Method method, final Class<?> serviceClass) {
-        return false;
-    }
-    //endregion
 
     @Override
     public void setRuntimeContext(final RuntimeContext runtimeContext) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
index 0d6279e..914dcd2 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTestAbstract.java
@@ -30,6 +30,7 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetdecorator.FacetDecorator;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -79,14 +80,16 @@ public abstract class ObjectReflectorDefaultTestAbstract {
             }
         });
 
-        runtimeContext = new RuntimeContextNoRuntime(new ServicesInjectorDefault(Collections.emptyList()));
-        final ObjectReflectorDefault reflector = 
-                new ObjectReflectorDefault(
+        final ObjectReflectorDefault reflector =
+                new ObjectReflectorDefault(DeploymentCategory.PRODUCTION,
                         mockConfiguration,
                         new ProgrammingModelFacetsJava5(),
                         new HashSet<FacetDecorator>(),
                         new MetaModelValidatorDefault(),
                         Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson()));
+        runtimeContext =
+                new RuntimeContextNoRuntime(
+                        new ServicesInjectorDefault(Collections.emptyList()), reflector);
         reflector.setRuntimeContext(runtimeContext);
         reflector.setServiceInjector(new ServicesInjectorDefault(Collections.<Object>singletonList(new DomainObjectContainerDefault())));
         reflector.init();
@@ -101,13 +104,12 @@ public abstract class ObjectReflectorDefaultTestAbstract {
         expectedException.expect(IllegalArgumentException.class);
         expectedException.expectMessage("illegal argument, expected: is not an empty collection");
 
-        new ObjectReflectorDefault(
-            mockConfiguration,
-            new ProgrammingModelFacetsJava5(),
-            new HashSet<FacetDecorator>(),
-            new MetaModelValidatorDefault(),
-            Lists.<LayoutMetadataReader>newArrayList()
-        );
+        new ObjectReflectorDefault(DeploymentCategory.PRODUCTION ,
+                mockConfiguration,
+                new ProgrammingModelFacetsJava5(),
+                new HashSet<FacetDecorator>(),
+                new MetaModelValidatorDefault(),
+                Lists.<LayoutMetadataReader>newArrayList());
     }
 
     @Test
@@ -115,13 +117,12 @@ public abstract class ObjectReflectorDefaultTestAbstract {
         expectedException.expect(IllegalArgumentException.class);
         expectedException.expectMessage("illegal argument, expected: is not null");
 
-        new ObjectReflectorDefault(
-            mockConfiguration,
-            new ProgrammingModelFacetsJava5(),
-            new HashSet<FacetDecorator>(),
-            new MetaModelValidatorDefault(),
-            null
-        );
+        new ObjectReflectorDefault(DeploymentCategory.PRODUCTION,
+                mockConfiguration,
+                new ProgrammingModelFacetsJava5(),
+                new HashSet<FacetDecorator>(),
+                new MetaModelValidatorDefault(),
+                null);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
index a3f061f..a56a549 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/testspec/ObjectSpecificationStub.java
@@ -72,7 +72,8 @@ public class ObjectSpecificationStub extends FacetHolderImpl implements ObjectSp
 
     public ObjectSpecificationStub(final Class<?> type) {
         this(type.getName());
-        runtimeContext = new RuntimeContextNoRuntime(new ServicesInjectorDefault(Collections.emptyList()));
+        runtimeContext = new RuntimeContextNoRuntime(
+                new ServicesInjectorDefault(Collections.emptyList()), null);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/InstallerLookup.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/InstallerLookup.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/InstallerLookup.java
index e08788d..2124c1f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/InstallerLookup.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/InstallerLookup.java
@@ -33,7 +33,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
-import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilder;
@@ -91,7 +90,7 @@ import static org.hamcrest.CoreMatchers.nullValue;
  * even if it has not been registered in <tt>installer-registry.properties</tt>
  * : just specify the {@link Installer}'s fully qualified class name.
  */
-public class InstallerLookup implements InstallerRepository, ApplicationScopedComponent, IsisConfigurationBuilderAware, Injectable, SystemDependencyInjector {
+public class InstallerLookup implements InstallerRepository, ApplicationScopedComponent, IsisConfigurationBuilderAware, SystemDependencyInjector {
 
     private static final Logger LOG = LoggerFactory.getLogger(InstallerLookup.class);
 
@@ -323,7 +322,6 @@ public class InstallerLookup implements InstallerRepository, ApplicationScopedCo
         return candidate;
     }
 
-    @Override
     public void injectInto(final Object candidate) {
         if (SystemDependencyInjectorAware.class.isAssignableFrom(candidate.getClass())) {
             final SystemDependencyInjectorAware cast = SystemDependencyInjectorAware.class.cast(candidate);
@@ -347,10 +345,6 @@ public class InstallerLookup implements InstallerRepository, ApplicationScopedCo
      */
     private IsisConfigurationBuilder isisConfigurationBuilder;
 
-    public IsisConfigurationBuilder getConfigurationBuilder() {
-        return isisConfigurationBuilder;
-    }
-
     @Override
     @Inject
     public void setConfigurationBuilder(final IsisConfigurationBuilder configurationLoader) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
index 5733718..0cec1f8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/installerregistry/installerapi/PersistenceMechanismInstaller.java
@@ -23,7 +23,6 @@ import org.apache.isis.core.commons.components.Installer;
 import org.apache.isis.core.commons.config.IsisConfigurationBuilderAware;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
-import org.apache.isis.core.runtime.persistence.internal.RuntimeContextFromSession;
 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;
@@ -37,8 +36,7 @@ public interface PersistenceMechanismInstaller extends Installer, IsisConfigurat
 
     PersistenceSessionFactory createPersistenceSessionFactory(
             final DeploymentType deploymentType,
-            final ServicesInjectorSpi servicesInjector,
             final IsisConfigurationDefault configuration,
-            final RuntimeContextFromSession runtimeContext);
+            final ServicesInjectorSpi servicesInjector);
 
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index 51d2204..85dbd3e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -428,7 +428,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
      *
      * <p>
      *     Specifically, if an action which has been annotated (is copied by {@link org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet action invocation facet}), and for a parented collection
-     *     (is copied by the {@link org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault adapter manager} when {@link org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault#adapterFor(Object, ObjectAdapter, OneToManyAssociation) creating} an adapter for a collection.
+     *     (is copied by the {@link PersistenceSession} when {@link PersistenceSession#adapterFor(Object, ObjectAdapter, OneToManyAssociation) creating} an adapter for a collection.
      * </p>
      */
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
deleted file mode 100644
index 6e13b6a..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
+++ /dev/null
@@ -1,136 +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.persistence.adaptermanager;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.components.SessionScopedComponent;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
-/**
- * Responsible for managing the {@link ObjectAdapter adapter}s and {@link Oid
- * identities} for each and every POJO that is being used by the framework.
- *
- * <p>
- * It provides a consistent set of adapters in memory, providing an
- * {@link ObjectAdapter adapter} for the POJOs that are in use ensuring that the
- * same object is not loaded twice into memory.
- *
- * <p>
- * Each POJO is given an {@link ObjectAdapter adapter} so that the framework can
- * work with the POJOs even though it does not understand their types. Each POJO
- * maps to an {@link ObjectAdapter adapter} and these are reused.
- */
-public class AdapterManagerDefault implements AdapterManager,
-        SessionScopedComponent {
-
-    private static final Logger LOG = LoggerFactory.getLogger(AdapterManagerDefault.class);
-
-    //region > constructor and fields
-
-    private final PersistenceSession persistenceSession;
-
-    /**
-     * For object store implementations (eg JDO) that do not provide any mechanism
-     * to allow transient objects to be reattached.
-     * 
-     * @see <a href="http://www.datanucleus.org/servlet/forum/viewthread_thread,7238_lastpage,yes#35976">this thread</a>
-     */
-    public AdapterManagerDefault(
-            final PersistenceSession persistenceSession) {
-        this.persistenceSession = persistenceSession;
-
-    }
-    //endregion
-
-    //region > open, close
-    public void open() {
-    }
-
-    public void close() {
-    }
-    //endregion
-
-    //region > getAdapterFor
-    @Override
-    public ObjectAdapter getAdapterFor(final Object pojo) {
-        return persistenceSession.getAdapterFor(pojo);
-    }
-
-    @Override
-    public ObjectAdapter getAdapterFor(final Oid oid) {
-        return persistenceSession.getAdapterFor(oid);
-    }
-    //endregion
-
-    //region > adapterFor
-
-    @Override
-    public ObjectAdapter adapterFor(final Object pojo) {
-        return persistenceSession.adapterFor(pojo);
-    }
-
-    @Override
-    public ObjectAdapter adapterFor(
-            final Object pojo, final ObjectAdapter parentAdapter, final OneToManyAssociation collection) {
-        return persistenceSession.adapterFor(pojo, parentAdapter, collection);
-    }
-
-    //endregion
-
-
-    //region > mapRecreatedPojo
-
-    @Override
-    public ObjectAdapter mapRecreatedPojo(final Oid oid, final Object recreatedPojo) {
-        return persistenceSession.mapRecreatedPojo(oid, recreatedPojo);
-    }
-
-    //endregion
-
-    //region > removeAdapter
-    @Override
-    public void removeAdapter(final ObjectAdapter adapter) {
-        persistenceSession.removeAdapter(adapter);
-    }
-
-    //endregion
-
-
-    //region > Injectable
-
-    @Override
-    public void injectInto(final Object candidate) {
-        if (AdapterManagerAware.class.isAssignableFrom(candidate.getClass())) {
-            final AdapterManagerAware cast = AdapterManagerAware.class.cast(candidate);
-            cast.setAdapterManager(this);
-        }
-    }
-    //endregion
-
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/OidAdapterHashMap.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/OidAdapterHashMap.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/OidAdapterHashMap.java
deleted file mode 100644
index 8403b95..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/OidAdapterHashMap.java
+++ /dev/null
@@ -1,135 +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.persistence.adaptermanager;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import com.google.common.collect.Maps;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.components.SessionScopedComponent;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.debug.DebuggableWithTitle;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-
-/**
- * A map of the objects' identities and the adapters' of the objects.
- */
-public class OidAdapterHashMap implements DebuggableWithTitle, Iterable<Oid>, SessionScopedComponent {
-
-    private static final Logger LOG = LoggerFactory.getLogger(OidAdapterHashMap.class);
-    public static final int DEFAULT_OID_ADAPTER_MAP_SIZE = 100;
-
-    private final Map<Oid, ObjectAdapter> adapterByOidMap = Maps.newHashMapWithExpectedSize(DEFAULT_OID_ADAPTER_MAP_SIZE);
-
-
-    // ///////////////////////////////////////////////////////
-    // open, close
-    // ///////////////////////////////////////////////////////
-
-    public void open() {
-        // nothing to do
-    }
-
-    public void close() {
-        LOG.debug("close");
-        adapterByOidMap.clear();
-    }
-
-
-    // ///////////////////////////////////////////////////////
-    // add, remove
-    // ///////////////////////////////////////////////////////
-
-    /**
-     * Add an adapter for a given oid
-     */
-    public void add(final Oid oid, final ObjectAdapter adapter) {
-
-        adapterByOidMap.put(oid, adapter);
-        // log at end so that if toString needs adapters they're in maps.
-        if (LOG.isDebugEnabled()) {
-            // do not call toString() on adapter because would call hashCode on
-            // the pojo,
-            // which for Hibernate PersistentCollections would trigger a
-            // resolve.
-            LOG.debug("add oid: " + oid + " ; oid.hashCode: + #" + Long.toHexString(oid.hashCode()) + " ; adapter.hashCode(): #" + Long.toHexString(adapter.hashCode()));
-        }
-    }
-
-    /**
-     * Remove the adapter for the given oid
-     * 
-     * @return <tt>true</tt> if an adapter was removed.
-     */
-    public boolean remove(final Oid oid) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("remove oid: " + oid);
-        }
-        return adapterByOidMap.remove(oid) != null;
-    }
-
-
-    /**
-     * Get the adapter identified by the specified OID.
-     */
-    public ObjectAdapter getAdapter(final Oid oid) {
-        return adapterByOidMap.get(oid);
-    }
-
-    // ///////////////////////////////////////////////////////
-    // iterator
-    // ///////////////////////////////////////////////////////
-
-    @Override
-    public Iterator<Oid> iterator() {
-        return adapterByOidMap.keySet().iterator();
-    }
-
-    // ///////////////////////////////////////////////////////
-    // debugging
-    // ///////////////////////////////////////////////////////
-
-    @Override
-    public String debugTitle() {
-        return "Identity adapter map";
-    }
-
-    @Override
-    public void debugData(final DebugBuilder debug) {
-        int count = 1;
-        final Map<Oid, ObjectAdapter> copyForDebug = Maps.newHashMap(adapterByOidMap);
-        for (final Map.Entry<Oid, ObjectAdapter> entry : copyForDebug.entrySet()) {
-            Oid oid = entry.getKey();
-            final ObjectAdapter adapter = entry.getValue();
-            debug.append(count++, 5);
-            debug.append(" '");
-            debug.append(oid.toString(), 15);
-            debug.append("'    ");
-            debug.appendln(adapter != null ? adapter.toString() : "(MISSING OBJECT ?!)");
-        }
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/PojoAdapterHashMap.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/PojoAdapterHashMap.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/PojoAdapterHashMap.java
deleted file mode 100644
index 601dc89..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/PojoAdapterHashMap.java
+++ /dev/null
@@ -1,160 +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.persistence.adaptermanager;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import com.google.common.collect.Maps;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.isis.core.commons.components.SessionScopedComponent;
-import org.apache.isis.core.commons.debug.DebugBuilder;
-import org.apache.isis.core.commons.debug.DebuggableWithTitle;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-
-public class PojoAdapterHashMap implements DebuggableWithTitle, Iterable<ObjectAdapter>, SessionScopedComponent {
-
-    private static class IdentityHashKey {
-        private final Object pojo;
-
-        public IdentityHashKey(final Object pojo) {
-            this.pojo = pojo;
-        }
-
-        @Override
-        public int hashCode() {
-            return System.identityHashCode(pojo);
-        }
-
-        @Override
-        public boolean equals(final Object obj) {
-            return obj == this || (obj instanceof IdentityHashKey && ((IdentityHashKey) obj).pojo == pojo);
-        }
-    }
-
-    private static final Logger LOG = LoggerFactory.getLogger(PojoAdapterHashMap.class);
-    public static final int DEFAULT_POJO_ADAPTER_MAP_SIZE = OidAdapterHashMap.DEFAULT_OID_ADAPTER_MAP_SIZE;
-
-    protected final Map<Object, ObjectAdapter> adapterByPojoMap;
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // Constructors, finalize
-    // ///////////////////////////////////////////////////////////////////////////
-
-    public PojoAdapterHashMap() {
-        this(DEFAULT_POJO_ADAPTER_MAP_SIZE);
-    }
-
-    public PojoAdapterHashMap(final int capacity) {
-        adapterByPojoMap = Maps.newHashMapWithExpectedSize(capacity);
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        super.finalize();
-        LOG.debug("finalizing hash of pojos");
-    }
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // open, close
-    // ///////////////////////////////////////////////////////////////////////////
-
-    public void open() {
-        // nothing to do
-    }
-
-    public void close() {
-        LOG.debug("close");
-        adapterByPojoMap.clear();
-    }
-
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // add, remove
-    // ///////////////////////////////////////////////////////////////////////////
-
-    public void add(final Object pojo, final ObjectAdapter adapter) {
-        adapterByPojoMap.put(key(pojo), adapter);
-
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("add adapter: #" + key(pojo) + " -> #" + Long.toHexString(adapter.hashCode()));
-
-        }
-    }
-
-    public void remove(final ObjectAdapter object) {
-        if(LOG.isDebugEnabled()) {
-            LOG.debug("remove adapter: " + object);
-        }
-        adapterByPojoMap.remove(key(object.getObject()));
-    }
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // get, contains
-    // ///////////////////////////////////////////////////////////////////////////
-
-    public boolean containsPojo(final Object pojo) {
-        return adapterByPojoMap.containsKey(key(pojo));
-    }
-
-    public ObjectAdapter getAdapter(final Object pojo) {
-        return adapterByPojoMap.get(key(pojo));
-    }
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // elements
-    // ///////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public Iterator<ObjectAdapter> iterator() {
-        return adapterByPojoMap.values().iterator();
-    }
-
-    private Object key(final Object pojo) {
-        return new IdentityHashKey(pojo);
-    }
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // Debugging
-    // ///////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void debugData(final DebugBuilder debug) {
-        int count = 0;
-        final Map<Object, ObjectAdapter> copyForDebug = Maps.newHashMap(adapterByPojoMap);
-        for (final Map.Entry<Object, ObjectAdapter> entry : copyForDebug.entrySet()) {
-            Object pojo = entry.getKey();
-            final ObjectAdapter object = entry.getValue();
-            debug.append(count++ + 1, 5);
-            debug.append(" '");
-            debug.append(pojo.toString(), 50);
-            debug.append("'    ");
-            debug.appendln(object.toString());
-        }
-    }
-
-    @Override
-    public String debugTitle() {
-        return "POJO Adapter Hashtable";
-    }
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java
deleted file mode 100644
index 3589dda..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/RootAndCollectionAdapters.java
+++ /dev/null
@@ -1,121 +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.persistence.adaptermanager;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import com.google.common.collect.Maps;
-
-import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
-import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.spec.feature.Contributed;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
-
-/**
- * A root {@link ObjectAdapter adapter} along with aggregated {@link ObjectAdapter adapters}
- * for any of its {@link OneToManyAssociation collection}s that are currently present in
- * the {@link AdapterManager map}s.
- * 
- * <p>
- * Used for &quot;impact analysis&quot; when persisting transient root objects; all aggregated adapters
- * must also be persisted.
- */
-public class RootAndCollectionAdapters implements Iterable<ObjectAdapter> {
-
-    private final ObjectAdapter parentAdapter;
-    private final RootOid rootAdapterOid;
-    
-    private final Map<OneToManyAssociation, ObjectAdapter> collectionAdapters = Maps.newLinkedHashMap();
-
-    public RootAndCollectionAdapters(
-            final ObjectAdapter parentAdapter,
-            final AdapterManager adapterManager) {
-        Assert.assertNotNull(parentAdapter);
-        this.rootAdapterOid = (RootOid) parentAdapter.getOid();
-        this.parentAdapter = parentAdapter;
-        addCollectionAdapters(adapterManager);
-    }
-
-    public ObjectAdapter getRootAdapter() {
-        return parentAdapter;
-    }
-
-    /**
-     * Iterate over the
-     * {@link #addCollectionAdapter(OneToManyAssociation, ObjectAdapter)
-     * collection adapter}s (does not include the {@link #getRootAdapter() root
-     * adapter}.
-     */
-    @Override
-    public Iterator<ObjectAdapter> iterator() {
-        return getCollectionAdapters().values().iterator();
-    }
-
-    /**
-     * Which collections are present?
-     * @return
-     */
-    public Set<OneToManyAssociation> getCollections() {
-        return getCollectionAdapters().keySet();
-    }
-
-    /**
-     * Corresponding adapter for each collection (values).
-     * 
-     * @see #getCollections()
-     */
-    public ObjectAdapter getCollectionAdapter(final OneToManyAssociation otma) {
-        return collectionAdapters.get(otma);
-    }
-
-    
-    ////////////////////////////////////////////////////////////////////////
-    // Helpers
-    ////////////////////////////////////////////////////////////////////////
-
-    private void addCollectionAdapters(AdapterManager objectAdapterLookup) {
-        for (final OneToManyAssociation otma : parentAdapter.getSpecification().getCollections(Contributed.EXCLUDED)) {
-            final ParentedCollectionOid collectionOid = new ParentedCollectionOid((RootOid) rootAdapterOid, otma);
-            final ObjectAdapter collectionAdapter = objectAdapterLookup.getAdapterFor(collectionOid);
-            if (collectionAdapter != null) {
-                // collection adapters are lazily created and so there may not be one.
-                addCollectionAdapter(otma, collectionAdapter);
-            }
-        }
-    }
-
-    private void addCollectionAdapter(final OneToManyAssociation otma, final ObjectAdapter collectionAdapter) {
-        Assert.assertNotNull(otma);
-        Assert.assertNotNull(collectionAdapter);
-        collectionAdapters.put(otma, collectionAdapter);
-    }
-
-    private Map<OneToManyAssociation, ObjectAdapter> getCollectionAdapters() {
-        return Collections.unmodifiableMap(collectionAdapters);
-    }
-
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
index 7c10f11..f2cb9bc 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
@@ -31,7 +31,6 @@ import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider
 import org.apache.isis.core.commons.authentication.MessageBroker;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -44,6 +43,7 @@ import org.apache.isis.core.metamodel.runtimecontext.PersistenceSessionServiceAw
 import org.apache.isis.core.metamodel.runtimecontext.RuntimeContextAbstract;
 import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoaderSpi;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.transactions.TransactionState;
 import org.apache.isis.core.metamodel.transactions.TransactionStateProvider;
@@ -73,8 +73,9 @@ public class RuntimeContextFromSession extends RuntimeContextAbstract {
     public RuntimeContextFromSession(
             final DeploymentCategory deploymentCategory,
             final IsisConfigurationDefault configuration,
-            final ServicesInjector servicesInjector) {
-        super(deploymentCategory, configuration, servicesInjector);
+            final ServicesInjector servicesInjector,
+            final SpecificationLoaderSpi specificationLoader) {
+        super(deploymentCategory, configuration, servicesInjector, specificationLoader);
 
         this.authenticationSessionProvider = new AuthenticationSessionProviderAbstract() {
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
index 64be243..bb9695b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/runner/IsisInjectModule.java
@@ -48,12 +48,12 @@ public class IsisInjectModule extends AbstractModule {
         return new InstallerLookup();
     }
 
-    private static IsisConfigurationBuilderDefault defaultConfigurationBuider() {
+    private static IsisConfigurationBuilderDefault defaultConfigurationBuilder() {
         return new IsisConfigurationBuilderDefault();
     }
 
     public IsisInjectModule(final DeploymentType deploymentType) {
-        this(deploymentType, defaultConfigurationBuider(), defaultInstallerLookup());
+        this(deploymentType, defaultConfigurationBuilder(), defaultInstallerLookup());
     }
 
     public IsisInjectModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder) {
@@ -61,7 +61,7 @@ public class IsisInjectModule extends AbstractModule {
     }
 
     public IsisInjectModule(final DeploymentType deploymentType, final InstallerLookup installerLookup) {
-        this(deploymentType, defaultConfigurationBuider(), installerLookup);
+        this(deploymentType, defaultConfigurationBuilder(), installerLookup);
     }
 
     public IsisInjectModule(final DeploymentType deploymentType, final IsisConfigurationBuilder isisConfigurationBuilder, final InstallerLookup installerLookup) {

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
index 3176c93..794c093 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/IsisSystem.java
@@ -54,6 +54,7 @@ import org.apache.isis.core.runtime.system.internal.IsisLocaleInitializer;
 import org.apache.isis.core.runtime.system.internal.IsisTimeZoneInitializer;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactoryMetamodelRefiner;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManagerException;
@@ -137,7 +138,8 @@ public class IsisSystem implements DebugSelection, ApplicationScopedComponent {
             final SpecificationLoaderSpi specificationLoader = sessionFactory.getSpecificationLoader();
             specificationLoader.validateAndAssert();
 
-            serviceInitializer = initializeServices();
+            // store simply so can do postConstruct when shutdown
+            this.serviceInitializer = initializeServices();
 
             installFixturesIfRequired();
 
@@ -152,35 +154,52 @@ public class IsisSystem implements DebugSelection, ApplicationScopedComponent {
 
     private IsisSessionFactory createSessionFactory(final DeploymentType deploymentType) throws IsisSystemException {
 
+        // configuration
         final IsisConfigurationDefault configuration = isisComponentProvider.getConfiguration();
-        final List<Object> services = isisComponentProvider.provideServices();
-
-        ServicesInjectorSpi servicesInjectorSpi = new ServicesInjectorDefault(services);
-        servicesInjectorSpi.addFallbackIfRequired(FixtureScripts.class, new FixtureScriptsDefault());
-        servicesInjectorSpi.validateServices();
-
-        final RuntimeContextFromSession runtimeContext = new RuntimeContextFromSession(deploymentType.getDeploymentCategory(), configuration, servicesInjectorSpi);
 
-        final PersistenceSessionFactory persistenceSessionFactory =
-                isisComponentProvider.providePersistenceSessionFactory(deploymentType, servicesInjectorSpi, runtimeContext);
+        // services
+        final List<Object> services = isisComponentProvider.provideServices();
+        ServicesInjectorDefault servicesInjector = new ServicesInjectorDefault(services);
+        servicesInjector.addFallbackIfRequired(FixtureScripts.class, new FixtureScriptsDefault());
+        servicesInjector.validateServices();
 
+        // authentication, authorization
         final AuthenticationManager authenticationManager =
                 isisComponentProvider.provideAuthenticationManager(deploymentType);
         final AuthorizationManager authorizationManager =
                 isisComponentProvider.provideAuthorizationManager(deploymentType);
 
+        // specificationLoader
         final Collection<MetaModelRefiner> metaModelRefiners =
-                refiners(authenticationManager, authorizationManager, persistenceSessionFactory);
+                refiners(authenticationManager, authorizationManager,
+                        new PersistenceSessionFactoryMetamodelRefiner());
         final SpecificationLoaderSpi specificationLoader =
-                isisComponentProvider.provideSpecificationLoaderSpi(metaModelRefiners);
+                isisComponentProvider.provideSpecificationLoaderSpi(deploymentType, metaModelRefiners);
+
+        specificationLoader.setServiceInjector(servicesInjector);
 
-        // bind metamodel to the (runtime) framework
+        // persistenceSessionFactory
+        final PersistenceSessionFactory persistenceSessionFactory =
+                isisComponentProvider.providePersistenceSessionFactory(
+                        deploymentType, servicesInjector, specificationLoader);
+
+        // runtimeContext
+        final RuntimeContextFromSession runtimeContext =
+                new RuntimeContextFromSession(
+                        deploymentType.getDeploymentCategory(), configuration,
+                        servicesInjector, specificationLoader);
+
+        // wire up components and components into services...
         runtimeContext.injectInto(specificationLoader);
 
+        for (Object service : servicesInjector.getRegisteredServices()) {
+            runtimeContext.injectInto(service);
+        }
+
+        // finally instantiate
         return new IsisSessionFactory (
-                deploymentType, configuration, specificationLoader,
-                authenticationManager, authorizationManager,
-                persistenceSessionFactory);
+                deploymentType, configuration, servicesInjector, specificationLoader,
+                authenticationManager, authorizationManager, persistenceSessionFactory);
     }
 
     private static Collection<MetaModelRefiner> refiners(Object... possibleRefiners ) {
@@ -307,20 +326,24 @@ public class IsisSystem implements DebugSelection, ApplicationScopedComponent {
     private void shutdownServices(final ServiceInitializer serviceInitializer) {
 
         // call @PostDestroy (in a session)
-        IsisContext.openSession(new InitialisationSession());
-        try {
-            getTransactionManager().startTransaction();
+        if(serviceInitializer != null) {
+            IsisContext.openSession(new InitialisationSession());
             try {
-                serviceInitializer.preDestroy();
+                getTransactionManager().startTransaction();
+                try {
 
-            } catch(RuntimeException ex) {
-                getTransactionManager().getTransaction().setAbortCause(new IsisTransactionManagerException(ex));
+                    serviceInitializer.preDestroy();
+
+                } catch (RuntimeException ex) {
+                    getTransactionManager().getTransaction().setAbortCause(
+                            new IsisTransactionManagerException(ex));
+                } finally {
+                    // will commit or abort
+                    getTransactionManager().endTransaction();
+                }
             } finally {
-                // will commit or abort
-                getTransactionManager().endTransaction();
+                IsisContext.closeSession();
             }
-        } finally {
-            IsisContext.closeSession();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContextThreadLocal.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContextThreadLocal.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContextThreadLocal.java
index e99e485..1e25e5e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContextThreadLocal.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContextThreadLocal.java
@@ -117,6 +117,11 @@ public class IsisContextThreadLocal extends IsisContext {
         }
     }
 
+
+    // /////////////////////////////////////////////////////////
+    // open, close
+    // /////////////////////////////////////////////////////////
+
     @Override
     protected IsisSession getSessionInstance(final String executionContextId) {
         for (final IsisSession data : sessionsByThread.values()) {
@@ -127,10 +132,6 @@ public class IsisContextThreadLocal extends IsisContext {
         return null;
     }
 
-    // /////////////////////////////////////////////////////////
-    // open, close
-    // /////////////////////////////////////////////////////////
-
     /**
      * Is only intended to be called through
      * {@link IsisContext#openSession(AuthenticationSession)}.
@@ -154,15 +155,6 @@ public class IsisContextThreadLocal extends IsisContext {
         }
     }
 
-    protected IsisSession createAndOpenSession(final Thread thread, final AuthenticationSession authenticationSession) {
-        final IsisSession session = getSessionFactoryInstance().openSession(authenticationSession);
-        session.open();
-        if (LOG.isInfoEnabled()) {
-            LOG.info("  opening session " + session + " (count " + sessionsByThread.size() + ") for " + authenticationSession.getUserName());
-        }
-        return session;
-    }
-
     private IsisSession saveSession(final Thread thread, final IsisSession session) {
         synchronized (sessionsByThread) {
             sessionsByThread.put(thread, session);

http://git-wip-us.apache.org/repos/asf/isis/blob/a129fd2d/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index 5cff237..4327cf4 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -28,6 +28,7 @@ import java.util.UUID;
 import javax.jdo.FetchGroup;
 import javax.jdo.FetchPlan;
 import javax.jdo.PersistenceManager;
+import javax.jdo.PersistenceManagerFactory;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -43,7 +44,6 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
 import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer2;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
-import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
@@ -101,9 +101,6 @@ import org.apache.isis.core.runtime.persistence.PojoRecreationException;
 import org.apache.isis.core.runtime.persistence.PojoRefreshException;
 import org.apache.isis.core.runtime.persistence.UnsupportedFindException;
 import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter;
-import org.apache.isis.core.runtime.persistence.adaptermanager.OidAdapterHashMap;
-import org.apache.isis.core.runtime.persistence.adaptermanager.PojoAdapterHashMap;
-import org.apache.isis.core.runtime.persistence.adaptermanager.RootAndCollectionAdapters;
 import org.apache.isis.core.runtime.persistence.container.DomainObjectContainerResolve;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
@@ -113,6 +110,9 @@ import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllIns
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.OidAdapterHashMap;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.PojoAdapterHashMap;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.RootAndCollectionAdapters;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
@@ -132,6 +132,11 @@ import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
 
+/**
+ * A wrapper around the JDO {@link PersistenceManager}, which also manages concurrency
+ * and maintains an identity map of {@link ObjectAdapter adapter}s and {@link Oid
+ * identities} for each and every POJO that is being used by the framework.
+ */
 public class PersistenceSession implements TransactionalResource, SessionScopedComponent, DebuggableWithTitle, AdapterManager,
         MessageBrokerService, PersistenceSessionService, ConfigurationService {
 
@@ -153,7 +158,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
 
     //region > constructor, fields, finalize()
 
-    private final PersistenceSessionFactory persistenceSessionFactory;
+    private final FixturesInstalledFlag fixturesInstalledFlag;
 
     private final PersistenceQueryFactory persistenceQueryFactory;
     private final IsisConfigurationDefault configuration;
@@ -161,11 +166,15 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     private final AuthenticationSession authenticationSession;
 
     private final ServicesInjectorSpi servicesInjector;
+    /**
+     * Used to create the {@link #persistenceManager} when {@link #open()}ed.
+     */
+    private final PersistenceManagerFactory jdoPersistenceManagerFactory;
 
     // not final only for testing purposes
     private IsisTransactionManager transactionManager;
 
-    private final OidMarshaller oidMarshaller;
+    private final OidMarshaller oidMarshaller = new OidMarshaller();
 
     /**
      * populated only when {@link #open()}ed.
@@ -178,7 +187,6 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     private final Map<Class<?>, PersistenceQueryProcessor<?>> persistenceQueryProcessorByClass = Maps.newHashMap();
 
     private final Map<ObjectSpecId, RootOid> registeredServices = Maps.newHashMap();
-    private final DataNucleusApplicationComponents applicationComponents;
 
     private final boolean concurrencyCheckingGloballyEnabled;
 
@@ -187,38 +195,32 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * persisted objects and persist changes to the object that are saved.
      */
     public PersistenceSession(
-            final PersistenceSessionFactory persistenceSessionFactory,
             final IsisConfigurationDefault configuration,
+            final ServicesInjectorSpi servicesInjector,
             final SpecificationLoaderSpi specificationLoader,
-            final AuthenticationSession authenticationSession) {
+            final AuthenticationSession authenticationSession,
+            final PersistenceManagerFactory jdoPersistenceManagerFactory,
+            final FixturesInstalledFlag fixturesInstalledFlag) {
 
-        ensureThatArg(persistenceSessionFactory, is(not(nullValue())), "persistence session factory required");
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("creating " + this);
+        }
 
         // injected
         this.configuration = configuration;
         this.specificationLoader = specificationLoader;
         this.authenticationSession = authenticationSession;
-        this.persistenceSessionFactory = persistenceSessionFactory;
+        this.fixturesInstalledFlag = fixturesInstalledFlag;
 
-        this.servicesInjector = persistenceSessionFactory.getServicesInjector();
-        this.applicationComponents = persistenceSessionFactory.getApplicationComponents();
+        this.servicesInjector = servicesInjector;
+        this.jdoPersistenceManagerFactory = jdoPersistenceManagerFactory;
 
         // sub-components
-
-        this.oidMarshaller = new OidMarshaller();
-
-
-        this.persistenceQueryFactory = new PersistenceQueryFactory(this, getSpecificationLoader());
-        this.transactionManager = new IsisTransactionManager(this, servicesInjector);
+        this.persistenceQueryFactory = new PersistenceQueryFactory(this, this.specificationLoader);
+        this.transactionManager = new IsisTransactionManager(this, this.servicesInjector);
 
         setState(State.NOT_INITIALIZED);
 
-        // to implement DomainObjectServices
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("creating " + this);
-        }
-
         final boolean concurrencyCheckingGloballyDisabled =
                 configuration.getBoolean("isis.persistor.disableConcurrencyChecking", false);
         this.concurrencyCheckingGloballyEnabled = !concurrencyCheckingGloballyDisabled;
@@ -235,12 +237,15 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
 
     //region > open
 
+    /**
+     * Only populated once {@link #open()}'d
+     */
     public PersistenceManager getPersistenceManager() {
         return persistenceManager;
     }
 
     /**
-     * Injects components, calls  {@link org.apache.isis.core.commons.components.SessionScopedComponent#open()} on subcomponents, and then creates service
+     * Injects components, calls open on subcomponents, and then creates service
      * adapters.
      */
     public void open() {
@@ -253,10 +258,10 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         oidAdapterMap.open();
         pojoAdapterMap.open();
 
-        persistenceManager = applicationComponents.getPersistenceManagerFactory().getPersistenceManager();
+        persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
         final IsisLifecycleListener2 isisLifecycleListener = new IsisLifecycleListener2(this);
-        persistenceManager.addInstanceLifecycleListener(isisLifecycleListener, (Class[])null);
+        persistenceManager.addInstanceLifecycleListener(isisLifecycleListener, (Class[]) null);
 
         persistenceQueryProcessorByClass.put(
                 PersistenceQueryFindAllInstances.class,
@@ -308,8 +313,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     //region > close
 
     /**
-     * Calls {@link org.apache.isis.core.commons.components.SessionScopedComponent#close()}
-     * on the subcomponents.
+     * Closes the subcomponents.
      *
      * <p>
      * Automatically {@link IsisTransactionManager#endTransaction() ends
@@ -347,6 +351,8 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
             LOG.error(
                 "close: failed to close JDO persistenceManager; continuing to avoid memory leakage");
         }
+        // TODO: REVIEW ... ??? this is a guess: don't set to null, because we need for -> transactionManager -> transaction -> messageBroker
+        // persistenceManager = null;
 
         try {
             oidAdapterMap.close();
@@ -657,8 +663,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * up objects.
      * 
      * <p>
-     * This method is called only once after the
-     * {@link ApplicationScopedComponent#init()} has been called. If this flag
+     * This method is called only once after the init has been called. If this flag
      * returns <code>false</code> the framework will run the fixtures to
      * initialise the persistor.
      * 
@@ -674,10 +679,10 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * @see FixturesInstalledFlag
      */
     public boolean isFixturesInstalled() {
-        if (persistenceSessionFactory.isFixturesInstalled() == null) {
-            persistenceSessionFactory.setFixturesInstalled(objectStoreIsFixturesInstalled());
+        if (fixturesInstalledFlag.isFixturesInstalled() == null) {
+            fixturesInstalledFlag.setFixturesInstalled(objectStoreIsFixturesInstalled());
         }
-        return persistenceSessionFactory.isFixturesInstalled();
+        return fixturesInstalledFlag.isFixturesInstalled();
     }
 
 
@@ -900,7 +905,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * Makes an {@link ObjectAdapter} persistent. The specified object should be
      * stored away via this object store's persistence mechanism, and have a
      * new and unique OID assigned to it. The object, should also be added to
-     * the {@link org.apache.isis.core.runtime.persistence.adaptermanager.AdapterManagerDefault} as the object is implicitly 'in use'.
+     * the {@link PersistenceSession} as the object is implicitly 'in use'.
      *
      * <p>
      * If the object has any associations then each of these, where they aren't
@@ -1166,7 +1171,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         debug.appendln();
 
         debug.appendTitle("Services");
-        for (final Object servicePojo : persistenceSessionFactory.getServicesInjector().getRegisteredServices()) {
+        for (final Object servicePojo : servicesInjector.getRegisteredServices()) {
             final String id = ServiceUtil.id(servicePojo);
             final Class<? extends Object> serviceClass = servicePojo.getClass();
             final ObjectSpecification serviceSpecification = getSpecificationLoader().loadSpecification(serviceClass);
@@ -1210,7 +1215,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * The configured {@link ServicesInjectorSpi}.
      */
     public ServicesInjectorSpi getServicesInjector() {
-        return persistenceSessionFactory.getServicesInjector();
+        return servicesInjector;
     }