You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/10/24 08:51:33 UTC

[isis] 02/06: ISIS-2158: refactoring Oid factories into 'metamodel'

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit e55cf7f97ccb4a4044cb97b9642b6738ffed0614
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Oct 23 23:07:42 2019 +0200

    ISIS-2158: refactoring Oid factories into 'metamodel'
    
    - also for entity objects, makes object identifier fetching the
    responsibility of the EntityFacet
---
 .../org/apache/isis/config}/SystemConstants.java   |  35 +----
 .../metamodel/adapter/oid/factory}/OidFactory.java |  30 +++--
 .../adapter/oid/factory}/OidFactory_Builder.java   |  29 ++---
 .../oid/factory/OidFactory_OidProviders.java       | 134 ++++++++++++++++++++
 .../facets/object/entity/EntityFacet.java          |   5 +-
 .../facets/object/entity/EntityFacetSimple.java    |  35 -----
 .../apache/isis/metamodel/spec/ManagedObject.java  |  11 +-
 .../JdoPersistenceCapableFacetAbstract.java        |   5 +-
 .../JdoPersistenceCapableFacetImpl.java            |  70 ++++++++++
 .../homepage/HomePageResolverServiceDefault.java   |  12 +-
 .../memento/ObjectAdapterMementoDefault.java       |   8 +-
 .../ObjectAdapterMementoSupport_usingDefault.java  |   2 +-
 .../isis/runtime/system/MessageRegistry.java       |   2 +
 .../system/internal/IsisLocaleInitializer.java     |   2 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |  18 +--
 .../ObjectAdapterContext_OidProviders.java         | 141 ---------------------
 .../apache/isis/security/shiro/WebModuleShiro.java |  46 ++++++-
 .../IsisRestfulObjectsSessionFilter.java           |   2 +-
 .../resources/MenuBarsResourceServerside.java      |   2 +-
 .../server/resources/UserResourceServerside.java   |   2 +-
 core/viewer-wicket/ui/pom.xml                      |   8 +-
 .../serviceactions/ServiceActionUtil.java          |   2 +-
 .../isis/viewer/wicket/ui/panels/PanelUtil.java    |   2 +-
 .../isis/testdomain/shiro/AbstractShiroTest.java   |  25 ++--
 .../apache/isis/applib/DomainObjectContainer.java  |   7 +-
 extensions/viewer-wicket-excel/pom.xml             |  15 ++-
 26 files changed, 355 insertions(+), 295 deletions(-)

diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/SystemConstants.java b/core/config/src/main/java/org/apache/isis/config/SystemConstants.java
similarity index 72%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/SystemConstants.java
rename to core/config/src/main/java/org/apache/isis/config/SystemConstants.java
index 0c0fca3..047e914 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/SystemConstants.java
+++ b/core/config/src/main/java/org/apache/isis/config/SystemConstants.java
@@ -17,11 +17,12 @@
  *  under the License.
  */
 
-package org.apache.isis.runtime.system;
+package org.apache.isis.config;
 
-import org.apache.isis.config.ConfigurationConstants;
-import org.apache.isis.config.IsisConfigurationLegacy;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class SystemConstants {
 
     public static final String MSG_ARE_YOU_SURE = "Are you sure?";
@@ -51,31 +52,9 @@ public final class SystemConstants {
      */
     public static final String ISIS_SESSION_FILTER_QUERY_STRING_FORCE_LOGOUT = "__isis_force_logout";
 
-    // -- SERVICE SUPPORT
-
-    public static final String SERVICE_IDENTIFIER = "1";
-
-    /**
-     * Key by which requested user (eg via command line) is made available in
-     * {@link IsisConfigurationLegacy} .
-     *
-     * @deprecated
-     */
-    @Deprecated
-    public final static String USER_KEY = ConfigurationConstants.ROOT + "user";
-
-    /**
-     * Key by which requested password (eg via command line) is made available
-     * in {@link IsisConfigurationLegacy}.
-     *
-     * @deprecated
-     */
-    @Deprecated
-    public final static String PASSWORD_KEY = ConfigurationConstants.ROOT + "password";
-
     public static final String LOCALE_KEY = ConfigurationConstants.ROOT + "locale";
 
-    private SystemConstants() {
-    }
-
+    // -- SERVICE SUPPORT
+    public static final String SERVICE_IDENTIFIER = "1";
+    
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/factories/OidFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory.java
similarity index 54%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/factories/OidFactory.java
rename to core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory.java
index 9b97abc..27d41fd 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/factories/OidFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory.java
@@ -17,23 +17,23 @@
  *  under the License.
  */
 
-package org.apache.isis.runtime.system.persistence.adaptermanager.factories;
-
-import java.util.function.Function;
+package org.apache.isis.metamodel.adapter.oid.factory;
 
 import org.apache.isis.metamodel.adapter.oid.RootOid;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.spec.ManagedObject;
+
+import lombok.val;
 
 /**
  * @since 2.0
  */
 public interface OidFactory {
 
-    RootOid oidFor(Object pojo);
+    RootOid oidFor(ManagedObject managedObject);
 
     public interface OidProvider {
-        boolean isHandling(Object pojo, ObjectSpecification spec);
-        RootOid oidFor(Object pojo, ObjectSpecification spec);
+        boolean isHandling(ManagedObject managedObject);
+        RootOid oidFor(ManagedObject managedObject);
     }
 
     public interface OidFactoryBuilder {
@@ -41,8 +41,20 @@ public interface OidFactory {
         OidFactory build();
     }
 
-    public static OidFactoryBuilder builder(Function<Object, ObjectSpecification> specProvider) {
-        return new OidFactory_Builder(specProvider);
+    public static OidFactoryBuilder builder() {
+        return new OidFactory_Builder();
     }
 
+    public static OidFactory buildDefault() {
+        val oidFactory = OidFactory.builder()
+                .add(new OidFactory_OidProviders.GuardAgainstRootOid())
+                .add(new OidFactory_OidProviders.OidForServices())
+                .add(new OidFactory_OidProviders.OidForValues())
+                .add(new OidFactory_OidProviders.OidForViewModels())
+                .add(new OidFactory_OidProviders.OidForEntities())
+                .add(new OidFactory_OidProviders.OidForOthers())
+                .build();
+        return oidFactory;
+    }
+    
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/factories/OidFactory_Builder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory_Builder.java
similarity index 57%
rename from core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/factories/OidFactory_Builder.java
rename to core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory_Builder.java
index 836fd21..6a862a3 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/factories/OidFactory_Builder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory_Builder.java
@@ -17,26 +17,20 @@
  *  under the License.
  */
 
-package org.apache.isis.runtime.system.persistence.adaptermanager.factories;
+package org.apache.isis.metamodel.adapter.oid.factory;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.function.Function;
 
-import org.apache.isis.metamodel.adapter.oid.RootOid;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.runtime.system.persistence.adaptermanager.factories.OidFactory.OidFactoryBuilder;
-import org.apache.isis.runtime.system.persistence.adaptermanager.factories.OidFactory.OidProvider;
+import org.apache.isis.metamodel.adapter.oid.factory.OidFactory.OidFactoryBuilder;
+import org.apache.isis.metamodel.adapter.oid.factory.OidFactory.OidProvider;
+
+import lombok.val;
 
 class OidFactory_Builder implements OidFactoryBuilder {
 
     private final List<OidProvider> handler = new ArrayList<>();
-    private final Function<Object, ObjectSpecification> specProvider;
-
-    public OidFactory_Builder(Function<Object, ObjectSpecification> specProvider) {
-        this.specProvider = specProvider;
-    }
 
     @Override
     public OidFactoryBuilder add(OidProvider oidProvider) {
@@ -46,17 +40,16 @@ class OidFactory_Builder implements OidFactoryBuilder {
 
     @Override
     public OidFactory build() {
-        return pojo -> {
-
-            final ObjectSpecification spec = specProvider.apply(pojo);
+        return managedObject -> {
 
-            final RootOid rootOid = handler.stream()
-                    .filter(h->h.isHandling(pojo, spec))
+            val rootOid = handler.stream()
+                    .filter(h->h.isHandling(managedObject))
                     .findFirst()
-                    .map(h->h.oidFor(pojo, spec))
+                    .map(h->h.oidFor(managedObject))
                     .orElse(null);
 
-            Objects.requireNonNull(rootOid, () -> "Could not create an Oid for pojo: "+pojo);
+            Objects.requireNonNull(rootOid, 
+                    () -> "Could not create an Oid for managedObject: " + managedObject);
 
             return rootOid;
         };
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory_OidProviders.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory_OidProviders.java
new file mode 100644
index 0000000..1110a5b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/oid/factory/OidFactory_OidProviders.java
@@ -0,0 +1,134 @@
+/*
+ *  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.metamodel.adapter.oid.factory;
+
+import java.util.UUID;
+
+import org.apache.isis.config.SystemConstants;
+import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.adapter.oid.RootOid;
+import org.apache.isis.metamodel.adapter.oid.factory.OidFactory.OidProvider;
+import org.apache.isis.metamodel.facets.object.entity.EntityFacet;
+import org.apache.isis.metamodel.facets.object.value.ValueFacet;
+import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
+import org.apache.isis.metamodel.spec.ManagedObject;
+
+import lombok.val;
+
+class OidFactory_OidProviders {
+
+
+    static class GuardAgainstRootOid implements OidProvider {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            return managedObject.getPojo() instanceof RootOid;
+        }
+
+        @Override
+        public RootOid oidFor(ManagedObject managedObject) {
+            throw new IllegalArgumentException("Cannot create a RootOid for pojo, "
+                    + "when pojo is instance of RootOid. You might want to ask "
+                    + "ObjectAdapterByIdProvider for an ObjectAdapter instead.");
+        }
+
+    }
+
+    static class OidForServices implements OidProvider {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            return managedObject.getSpecification().isManagedBean();
+        }
+
+        @Override
+        public RootOid oidFor(ManagedObject managedObject) {
+            final String identifier = SystemConstants.SERVICE_IDENTIFIER;
+            return Oid.Factory.persistentOf(managedObject.getSpecification().getSpecId(), identifier);
+        }
+
+    }
+
+    static class OidForEntities implements OidProvider {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            return managedObject.getSpecification().isEntity();
+        }
+
+        @Override
+        public RootOid oidFor(ManagedObject managedObject) {
+            val spec = managedObject.getSpecification();
+            val pojo = managedObject.getPojo();
+            val entityFacet = spec.getFacet(EntityFacet.class);
+            val identifier = entityFacet.identifierFor(pojo);
+            return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
+        }
+
+    }
+
+    static class OidForValues implements OidProvider {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            return managedObject.getSpecification().containsFacet(ValueFacet.class);
+        }
+
+        @Override
+        public RootOid oidFor(ManagedObject managedObject) {
+            return Oid.Factory.value();
+        }
+
+    }
+
+    static class OidForViewModels implements OidProvider {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            return managedObject.getSpecification().containsFacet(ViewModelFacet.class);
+        }
+
+        @Override
+        public RootOid oidFor(ManagedObject managedObject) {
+            val spec = managedObject.getSpecification();
+            val recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
+            val identifier = recreatableObjectFacet.memento(managedObject.getPojo());
+            return Oid.Factory.viewmodelOf(spec.getSpecId(), identifier);
+        }
+
+    }
+
+    static class OidForOthers implements OidProvider {
+
+        @Override
+        public boolean isHandling(ManagedObject managedObject) {
+            return true; // try to handle anything
+        }
+
+        @Override
+        public RootOid oidFor(ManagedObject managedObject) {
+            val spec = managedObject.getSpecification();
+            val identifier = UUID.randomUUID().toString();
+            return Oid.Factory.transientOf(spec.getSpecId(), identifier);
+        }
+
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
index fc58480..830e945 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacet.java
@@ -20,7 +20,6 @@
 package org.apache.isis.metamodel.facets.object.entity;
 
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
 
 /**
  * Indicates that this class is managed by a persistence context.
@@ -28,8 +27,6 @@ import org.apache.isis.metamodel.facetapi.FacetHolder;
  */
 public interface EntityFacet extends Facet {
 
-    static EntityFacet create(FacetHolder facetHolder) {
-        return new EntityFacetSimple(facetHolder);
-    }
+    String identifierFor(Object pojo);
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacetSimple.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacetSimple.java
deleted file mode 100644
index 2fc47a7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/entity/EntityFacetSimple.java
+++ /dev/null
@@ -1,35 +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.metamodel.facets.object.entity;
-
-import org.apache.isis.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
-
-/**
- * Package private impl. of EntityFacet  
- * @since 2.0
- */
-class EntityFacetSimple extends FacetAbstract implements EntityFacet {
-
-    public EntityFacetSimple(FacetHolder holder) {
-        super(EntityFacet.class, holder, Derivation.NOT_DERIVED);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index 0c5d0b2..d723825 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -29,6 +29,7 @@ import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
+import org.apache.isis.metamodel.adapter.oid.factory.OidFactory;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 
 import static org.apache.isis.commons.internal.base._With.requires;
@@ -307,9 +308,15 @@ public interface ManagedObject {
         return true;
     }
 
-    @Deprecated
     static Oid _oid(ManagedObject adapter) {
-        return promote(adapter).getOid();
+        if(adapter instanceof ObjectAdapter) {
+            return promote(adapter).getOid();
+        }
+        
+        val oidFactory = OidFactory.buildDefault();
+        
+        return oidFactory.oidFor(adapter);
+         
     }
 
 
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java
index 3412933..d70553a 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetAbstract.java
@@ -27,8 +27,9 @@ import org.apache.isis.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 
 
-public abstract class JdoPersistenceCapableFacetAbstract extends FacetAbstract implements
-JdoPersistenceCapableFacet {
+public abstract class JdoPersistenceCapableFacetAbstract 
+extends FacetAbstract 
+implements JdoPersistenceCapableFacet {
 
     public static Class<? extends Facet> type() {
         return JdoPersistenceCapableFacet.class;
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
index aaa3cc2..3a156b7 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/persistencecapable/JdoPersistenceCapableFacetImpl.java
@@ -18,10 +18,16 @@
  */
 package org.apache.isis.jdo.metamodel.facets.object.persistencecapable;
 
+import java.util.UUID;
+
 import javax.jdo.annotations.IdentityType;
 
+import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
+import org.apache.isis.runtime.system.context.IsisContext;
 
+import lombok.val;
 
 public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAbstract {
 
@@ -33,4 +39,68 @@ public class JdoPersistenceCapableFacetImpl extends JdoPersistenceCapableFacetAb
         super(schemaName, tableOrTypeName, identityType, holder);
     }
 
+    @Override
+    public String identifierFor(Object pojo) {
+        
+        if(pojo==null || !isPersistableType(pojo.getClass())) {
+            return "?";
+        }
+        
+        val persistenceSession = IsisContext.getPersistenceSession().get();
+        val isRecognized = persistenceSession.isRecognized(pojo);
+        if(isRecognized) {
+            final String identifier = persistenceSession.identifierFor(pojo);
+            return identifier;
+        } else {
+            final String identifier = UUID.randomUUID().toString();
+            return identifier;    
+        }
+    }
+
+    // -- HELPER
+    
+    private final static _Lazy<Class<?>> persistable_type = _Lazy.threadSafe(()->{
+        try {
+            return _Context.loadClass("org.datanucleus.enhancement.Persistable");
+        } catch (ClassNotFoundException e) {
+            e.printStackTrace();
+        }
+        return null;
+    });
+
+    
+    private static boolean isPersistableType(Class<?> type) {
+        return persistable_type.get().isAssignableFrom(type);
+    }
+    
+//  static class OidForPersistent implements OidProvider {
+//
+//      private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
+//
+//      @Override
+//      public boolean isHandling(ManagedObject managedObject) {
+//          // equivalent to 'isInstanceOfPersistable = pojo instanceof Persistable'
+//          final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin
+//                  .isPersistenceEnhanced(managedObject.getPojo().getClass());
+//          return isInstanceOfPersistable;
+//      }
+//
+//      @Override
+//      public RootOid oidFor(ManagedObject managedObject) {
+//          val spec = managedObject.getSpecification();
+//          val pojo = managedObject.getPojo();
+//          
+//          val persistenceSession = IsisContext.getPersistenceSession().get();
+//          final boolean isRecognized = persistenceSession.isRecognized(pojo);
+//          if(isRecognized) {
+//              final String identifier = persistenceSession.identifierFor(pojo);
+//              return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
+//          } else {
+//              final String identifier = UUID.randomUUID().toString();
+//              return Oid.Factory.transientOf(spec.getSpecId(), identifier);    
+//          }
+//      }
+//
+//  }
+
 }
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
index 8d4b6c4..1f65281 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/homepage/HomePageResolverServiceDefault.java
@@ -83,7 +83,7 @@ public class HomePageResolverServiceDefault implements HomePageResolverService {
         homePageAction = 
                 serviceRegistry.streamRegisteredBeans()
                 .map(bean->bean.getBeanClass())
-                .map(managedBeanType->specLoader.loadSpecification(managedBeanType))
+                .map(specLoader::loadSpecification)
                 .filter(_NullSafe::isPresent)
                 .peek(spec->specRef[0]=spec)
                 .flatMap(spec->spec.streamObjectActions(Contributed.EXCLUDED))
@@ -92,10 +92,14 @@ public class HomePageResolverServiceDefault implements HomePageResolverService {
                 .findAny()
                 .orElse(null);
 
+        if(homePageAction!=null) {
+            return homePageAction;
+        }
+        
         // -- 3) lookup view-models that have actions annotated with @HomePage
 
         homePageAction = viewModelTypes.stream()
-                .map(viewModelType->specLoader.loadSpecification(viewModelType))
+                .map(specLoader::loadSpecification)
                 .filter(_NullSafe::isPresent)
                 .peek(spec->specRef[0]=spec)
                 .flatMap(spec->spec.streamObjectActions(Contributed.EXCLUDED))
@@ -104,10 +108,6 @@ public class HomePageResolverServiceDefault implements HomePageResolverService {
                 .findAny()
                 .orElse(null);
 
-        if(homePageAction!=null) {
-            return homePageAction;
-        }
-
         return homePageAction;
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
index 1f2cf68..585bb6c 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
@@ -467,15 +467,15 @@ public class ObjectAdapterMementoDefault implements Serializable {
             return;
         }
 
-        final RootOid oid = (RootOid) ManagedObject._oid(adapter);
-        if (oid.isTransient()) {
+        val rootOid = (RootOid) ManagedObject._oid(adapter);
+        if (rootOid.isTransient()) {
             transientMemento = new Memento(adapter);
             recreateStrategy = RecreateStrategy.TRANSIENT;
             return;
         }
 
-        persistentOidStr = oid.enString();
-        bookmark = oid.asBookmark();
+        persistentOidStr = rootOid.enString();
+        bookmark = rootOid.asBookmark();
         if(adapter.getPojo() instanceof HintStore.HintIdProvider) {
             HintStore.HintIdProvider provider = (HintStore.HintIdProvider) adapter.getPojo();
             this.hintId = provider.hintId();
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
index 4a14a9d..aa7947a 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
@@ -83,7 +83,7 @@ implements ObjectAdapterMementoSupport {
         private static final long serialVersionUID = 1L;
 
         private final ObjectAdapterMementoDefault delegate;
-        private final SpecificationLoader specificationLoader;
+        private final transient SpecificationLoader specificationLoader;
 
         @Override
         public UUID getStoreKey() {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/MessageRegistry.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/MessageRegistry.java
index 643d322..82424d0 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/MessageRegistry.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/MessageRegistry.java
@@ -22,6 +22,8 @@ package org.apache.isis.runtime.system;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.isis.config.SystemConstants;
+
 public class MessageRegistry {
 
     public MessageRegistry(){}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/internal/IsisLocaleInitializer.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/internal/IsisLocaleInitializer.java
index 9a2d584..c44fcbc 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/internal/IsisLocaleInitializer.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/internal/IsisLocaleInitializer.java
@@ -22,7 +22,7 @@ package org.apache.isis.runtime.system.internal;
 import java.util.Locale;
 
 import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.runtime.system.SystemConstants;
+import org.apache.isis.config.SystemConstants;
 
 import lombok.extern.log4j.Log4j2;
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index 9e346a7..a40f996 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -29,6 +29,7 @@ import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
+import org.apache.isis.metamodel.adapter.oid.factory.OidFactory;
 import org.apache.isis.metamodel.services.ServiceUtil;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
@@ -37,10 +38,11 @@ import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.persistence.adapter.ObjectAdapterForBean;
 import org.apache.isis.runtime.system.context.session.RuntimeContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.runtime.system.persistence.adaptermanager.factories.OidFactory;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
+import lombok.val;
+
 /**
  * package private mixin for ObjectAdapterContext
  * <p>
@@ -63,15 +65,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
         this.objectAdapterContext = objectAdapterContext;
         this.runtimeContext = runtimeContext;
         this.specificationLoader = runtimeContext.getSpecificationLoader();
-
-        this.oidFactory = OidFactory.builder(pojo->specificationLoader.loadSpecification(pojo.getClass()))
-                .add(new ObjectAdapterContext_OidProviders.GuardAgainstRootOid())
-                .add(new ObjectAdapterContext_OidProviders.OidForServices())
-                .add(new ObjectAdapterContext_OidProviders.OidForValues())
-                .add(new ObjectAdapterContext_OidProviders.OidForViewModels())
-                .add(new ObjectAdapterContext_OidProviders.OidForPersistent())
-                .add(new ObjectAdapterContext_OidProviders.OidForOthers())
-                .build();
+        this.oidFactory = OidFactory.buildDefault();
     }
 
     @Override
@@ -81,8 +75,8 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
             return null;
         }
 
-        final RootOid rootOid = oidFactory.oidFor(pojo);
-        final ObjectAdapter newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
+        val rootOid = oidFactory.oidFor(ManagedObject.of(specificationLoader::loadSpecification, pojo));
+        val newAdapter = objectAdapterContext.getFactories().createRootAdapter(pojo, rootOid);
         return objectAdapterContext.injectServices(newAdapter);
     }
 
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
deleted file mode 100644
index 5347323..0000000
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/adaptermanager/ObjectAdapterContext_OidProviders.java
+++ /dev/null
@@ -1,141 +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.runtime.system.persistence.adaptermanager;
-
-import java.util.UUID;
-
-import org.apache.isis.metamodel.IsisJdoMetamodelPlugin;
-import org.apache.isis.metamodel.adapter.oid.Oid;
-import org.apache.isis.metamodel.adapter.oid.RootOid;
-import org.apache.isis.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.runtime.system.SystemConstants;
-import org.apache.isis.runtime.system.context.IsisContext;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.runtime.system.persistence.adaptermanager.factories.OidFactory.OidProvider;
-
-class ObjectAdapterContext_OidProviders {
-
-
-    static class GuardAgainstRootOid implements OidProvider {
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return pojo instanceof RootOid;
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            throw new IllegalArgumentException("Cannot create a RootOid for pojo, "
-                    + "when pojo is instance of RootOid. You might want to ask "
-                    + "ObjectAdapterByIdProvider for an ObjectAdapter instead.");
-        }
-
-    }
-
-
-    static class OidForServices implements OidProvider {
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return spec.isManagedBean();
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            final String identifier = SystemConstants.SERVICE_IDENTIFIER;
-            return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
-        }
-
-    }
-
-    static class OidForPersistent implements OidProvider {
-
-        private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            // equivalent to 'isInstanceOfPersistable = pojo instanceof Persistable'
-            final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin.isPersistenceEnhanced(pojo.getClass());
-            return isInstanceOfPersistable;
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
-            final boolean isRecognized = persistenceSession.isRecognized(pojo);
-            if(isRecognized) {
-                final String identifier = persistenceSession.identifierFor(pojo);
-                return Oid.Factory.persistentOf(spec.getSpecId(), identifier);
-            } else {
-                final String identifier = UUID.randomUUID().toString();
-                return Oid.Factory.transientOf(spec.getSpecId(), identifier);    
-            }
-        }
-
-    }
-
-    static class OidForValues implements OidProvider {
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return spec.containsFacet(ValueFacet.class);
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            return Oid.Factory.value();
-        }
-
-    }
-
-    static class OidForViewModels implements OidProvider {
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return spec.containsFacet(ViewModelFacet.class);
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
-            final String identifier = recreatableObjectFacet.memento(pojo);
-            return Oid.Factory.viewmodelOf(spec.getSpecId(), identifier);
-        }
-
-    }
-
-    static class OidForOthers implements OidProvider {
-
-        @Override
-        public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            return true; // try to handle anything
-        }
-
-        @Override
-        public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            final String identifier = UUID.randomUUID().toString();
-            return Oid.Factory.transientOf(spec.getSpecId(), identifier);
-        }
-
-    }
-
-
-}
diff --git a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java
index 1bca2d1..6024f52 100644
--- a/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java
+++ b/core/security/shiro/src/main/java/org/apache/isis/security/shiro/WebModuleShiro.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.security.shiro;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -27,14 +28,20 @@ import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 
 import org.apache.shiro.config.Ini;
+import org.apache.shiro.realm.Realm;
+import org.apache.shiro.web.env.EnvironmentLoaderListener;
 import org.apache.shiro.web.env.IniWebEnvironment;
 import org.apache.shiro.web.env.WebEnvironment;
 import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver;
 import org.springframework.core.Ordered;
 import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ReflectionUtils;
 
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.webapp.IsisWebAppUtils;
 import org.apache.isis.webapp.modules.WebModule;
 import org.apache.isis.webapp.modules.WebModuleContext;
 
@@ -42,6 +49,7 @@ import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
 import static org.apache.isis.commons.internal.context._Context.getDefaultClassLoader;
 import static org.apache.isis.commons.internal.exceptions._Exceptions.unexpectedCodeReach;
 
+import lombok.SneakyThrows;
 import lombok.val;
 
 /**
@@ -52,9 +60,10 @@ import lombok.val;
  */
 @Service @Order(Ordered.HIGHEST_PRECEDENCE)
 public final class WebModuleShiro implements WebModule  {
-
+    
     private final static String SHIRO_LISTENER_CLASS_NAME = 
-            "org.apache.shiro.web.env.EnvironmentLoaderListener";
+            //"org.apache.shiro.web.env.EnvironmentLoaderListener";
+            EnvironmentLoaderListenerForIsis.class.getName();
 
     private final static String SHIRO_FILTER_CLASS_NAME = 
             "org.apache.shiro.web.servlet.ShiroFilter";
@@ -100,6 +109,39 @@ public final class WebModuleShiro implements WebModule  {
         System.setProperty("shiroIniResource", resourcePath);
         setShiroEnvironmentClass(IniWebEnvironmentUsingSystemProperty.class);
     }
+    
+    /**
+     * Adds support for dependency injection into security realms
+     * @since 2.0
+     */
+    public static class EnvironmentLoaderListenerForIsis extends EnvironmentLoaderListener {
+        
+        @Override 
+        protected WebEnvironment createEnvironment(ServletContext servletContext) {
+            val shiroEnvironment = super.createEnvironment(servletContext);
+            val securityManager = shiroEnvironment.getSecurityManager();
+            val serviceInjector = IsisWebAppUtils.getManagedBean(ServiceInjector.class, servletContext);
+            
+            injectServicesIntoReamls(serviceInjector, securityManager);
+            
+            return shiroEnvironment;
+        }
+        
+        @SuppressWarnings("unchecked")
+        @SneakyThrows
+        public static void injectServicesIntoReamls(
+                ServiceInjector serviceInjector, 
+                org.apache.shiro.mgt.SecurityManager securityManager) {
+
+            // reflective access to SecurityManager.getRealms()
+            val realms = (Collection<Realm>) ReflectionUtils
+                    .findMethod(securityManager.getClass(), "getRealms")
+                    .invoke(securityManager, _Constants.emptyObjects);
+
+            realms.stream().forEach(serviceInjector::injectServicesInto);
+        }
+        
+    }
 
     // -- 
 
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/IsisRestfulObjectsSessionFilter.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/IsisRestfulObjectsSessionFilter.java
index e47b7d1..f5d6190 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/IsisRestfulObjectsSessionFilter.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/IsisRestfulObjectsSessionFilter.java
@@ -42,8 +42,8 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.factory.InstanceUtil;
+import org.apache.isis.config.SystemConstants;
 import org.apache.isis.metamodel.commons.StringExtensions;
-import org.apache.isis.runtime.system.SystemConstants;
 import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.webapp.IsisWebAppUtils;
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java
index b2e5e38..a71afeb 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/MenuBarsResourceServerside.java
@@ -27,7 +27,7 @@ import org.apache.isis.applib.layout.component.ServiceActionLayoutData;
 import org.apache.isis.applib.layout.links.Link;
 import org.apache.isis.applib.layout.menubars.MenuBars;
 import org.apache.isis.applib.services.menu.MenuBarsService;
-import org.apache.isis.runtime.system.SystemConstants;
+import org.apache.isis.config.SystemConstants;
 import org.apache.isis.viewer.restfulobjects.applib.Rel;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulHttpMethod;
diff --git a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
index b92e194..3b18256 100644
--- a/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
+++ b/core/viewer-restfulobjects/server/src/main/java/org/apache/isis/viewer/restfulobjects/server/resources/UserResourceServerside.java
@@ -26,7 +26,7 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.runtime.system.SystemConstants;
+import org.apache.isis.config.SystemConstants;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
 import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.RestfulMediaType;
diff --git a/core/viewer-wicket/ui/pom.xml b/core/viewer-wicket/ui/pom.xml
index 29363a0..cca5ed4 100644
--- a/core/viewer-wicket/ui/pom.xml
+++ b/core/viewer-wicket/ui/pom.xml
@@ -149,10 +149,10 @@
             		<groupId>org.slf4j</groupId>
             		<artifactId>slf4j-api</artifactId>
             	</exclusion>
-            	<exclusion>
-            		<groupId>com.google.guava</groupId>
-            		<artifactId>guava</artifactId>
-            	</exclusion>
+<!--             	<exclusion> -->
+<!--             		<groupId>com.google.guava</groupId> -->
+<!--             		<artifactId>guava</artifactId> -->
+<!--             	</exclusion> -->
             </exclusions>
         </dependency>
 
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
index 798c79a..7b951f4 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/serviceactions/ServiceActionUtil.java
@@ -37,8 +37,8 @@ import org.apache.isis.applib.layout.menubars.bootstrap3.BS3MenuBar;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.config.SystemConstants;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.runtime.system.SystemConstants;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ServiceActionsModel;
 import org.apache.isis.viewer.wicket.ui.components.actionmenu.CssClassFaBehavior;
diff --git a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
index 55de900..3b38017 100644
--- a/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
+++ b/core/viewer-wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelUtil.java
@@ -29,7 +29,7 @@ import org.apache.wicket.request.resource.CssResourceReference;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.runtime.system.SystemConstants;
+import org.apache.isis.config.SystemConstants;
 
 import de.agilecoders.wicket.core.markup.html.bootstrap.components.TooltipConfig;
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.confirmation.ConfirmationBehavior;
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/shiro/AbstractShiroTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/shiro/AbstractShiroTest.java
index d5ec603..16ac96b 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/shiro/AbstractShiroTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/shiro/AbstractShiroTest.java
@@ -18,24 +18,20 @@
  */
 package org.apache.isis.testdomain.shiro;
 
-import java.util.Collection;
-
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.UnavailableSecurityManagerException;
 import org.apache.shiro.config.Ini;
 import org.apache.shiro.config.IniSecurityManagerFactory;
 import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.realm.Realm;
 import org.apache.shiro.subject.Subject;
 import org.apache.shiro.subject.support.SubjectThreadState;
 import org.apache.shiro.util.LifecycleUtils;
 import org.apache.shiro.util.ThreadContext;
 import org.apache.shiro.util.ThreadState;
-import org.springframework.util.ReflectionUtils;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.assertions._Assert;
+import org.apache.isis.security.shiro.WebModuleShiro.EnvironmentLoaderListenerForIsis;
 
 import lombok.SneakyThrows;
 import lombok.val;
@@ -103,18 +99,15 @@ class AbstractShiroTest {
         val factory = new IniSecurityManagerFactory(ini);
         val securityManager = factory.getInstance();
         
-        // reflective access to SecurityManager.getRealms()
-        Collection<Realm> realms = (Collection<Realm>) ReflectionUtils
-                .findMethod(securityManager.getClass(), "getRealms")
-                .invoke(securityManager, _Constants.emptyClasses);
-        
-        ini.getSections().forEach(section->{
-            section.entrySet().forEach(es->{
-                System.out.println("" + es.getKey() + "=" +es.getValue());
-            });
-        });
+        EnvironmentLoaderListenerForIsis.injectServicesIntoReamls(serviceInjector, securityManager);
         
-        realms.stream().forEach(serviceInjector::injectServicesInto);
+//debug        
+//        ini.getSections().forEach(section->{
+//            section.entrySet().forEach(es->{
+//                System.out.println("" + es.getKey() + "=" +es.getValue());
+//            });
+//        });
+       
         setSecurityManager(securityManager);
     }
     
diff --git a/extensions/legacy/src/main/java/org/apache/isis/applib/DomainObjectContainer.java b/extensions/legacy/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
index 49b84c7..2fd02d0 100644
--- a/extensions/legacy/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
+++ b/extensions/legacy/src/main/java/org/apache/isis/applib/DomainObjectContainer.java
@@ -44,7 +44,6 @@ import org.apache.isis.applib.services.title.TitleService;
 import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.runtime.system.context.IsisContext;
 
 import static org.apache.isis.commons.internal.collections._Lists.lastElementIfAny;
 
@@ -420,7 +419,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public String getProperty(String name) {
-    	return IsisContext.getConfigurationLegacy().getString(name);
+    	return serviceRegistry.lookupServiceElseFail(IsisConfigurationLegacy.class).getString(name);
     }
 
     /**
@@ -429,7 +428,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public String getProperty(String name, String defaultValue) {
-    	return IsisContext.getConfigurationLegacy().getString(name, defaultValue);
+    	return serviceRegistry.lookupServiceElseFail(IsisConfigurationLegacy.class).getString(name, defaultValue);
     }
 
     /**
@@ -438,7 +437,7 @@ public class DomainObjectContainer {
     @Deprecated
     @Programmatic
     public List<String> getPropertyNames() {
-        return new ArrayList<>(IsisContext.getConfigurationLegacy().copyToMap().keySet());
+        return new ArrayList<>(serviceRegistry.lookupServiceElseFail(IsisConfigurationLegacy.class).copyToMap().keySet());
     }
 
     /**
diff --git a/extensions/viewer-wicket-excel/pom.xml b/extensions/viewer-wicket-excel/pom.xml
index 9817cea..fdd9069 100644
--- a/extensions/viewer-wicket-excel/pom.xml
+++ b/extensions/viewer-wicket-excel/pom.xml
@@ -42,12 +42,25 @@
             <groupId>org.apache.isis.core</groupId>
             <artifactId>isis-viewer-wicket-ui</artifactId>
             <scope>provided</scope>
+            <exclusions>
+            	<exclusion>
+            		<groupId>org.apache.commons</groupId>
+            		<artifactId>commons-collections4</artifactId>
+            	</exclusion>
+            </exclusions>
         </dependency>
         
         <dependency>
 			<groupId>org.apache.poi</groupId>
 			<artifactId>poi-ooxml</artifactId>
-		</dependency>
+			<exclusions>
+				<exclusion>
+					<!-- version clash with org.apache.wicket:wicket-util:8.6.1 -->
+					<groupId>org.apache.commons</groupId>
+					<artifactId>commons-collections4</artifactId>
+				</exclusion>
+			</exclusions>
+        </dependency>
 		
 		<dependency>
 			<groupId>org.apache.poi</groupId>