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 2018/08/31 07:16:28 UTC

[isis] 03/03: ISIS-1974: (porting from maint-1.16.2)

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

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

commit f8f3b56140205cccc75d2a574f23935d31f48c6f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Aug 31 09:16:17 2018 +0200

    ISIS-1974: (porting from maint-1.16.2)
    
    working towards removing SpecificationLoader
    initializes the Isis metamodel and DN in parallel
---
 .../plugins/jdo/dn4/IsisJdoSupportPlugin4.java     |  5 +-
 .../DataNucleusApplicationComponents4.java         | 38 +++++-------
 .../persistence/PersistenceSessionFactory4.java    | 47 ++++++++------
 .../plugins/jdo/dn5/IsisJdoSupportPlugin5.java     |  5 +-
 .../DataNucleusApplicationComponents5.java         | 15 +----
 .../persistence/PersistenceSessionFactory5.java    | 47 ++++++++------
 .../isis/core/metamodel/IsisJdoRuntimePlugin.java  |  3 +-
 .../persistence/PersistenceSessionFactory.java     |  9 ++-
 .../system/session/IsisSessionFactoryBuilder.java  | 71 +++++++++++++---------
 .../objectstore/jdo/service/RegisterEntities.java  | 27 ++++----
 10 files changed, 133 insertions(+), 134 deletions(-)

diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java
index 8470ee7..c1026c8 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apacha/isis/plugins/jdo/dn4/IsisJdoSupportPlugin4.java
@@ -22,7 +22,6 @@ import javax.annotation.Nullable;
 
 import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
 import org.apache.isis.core.metamodel.IsisJdoRuntimePlugin;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory4;
 
@@ -42,8 +41,8 @@ public class IsisJdoSupportPlugin4 implements IsisJdoMetamodelPlugin, IsisJdoRun
     }
 
     @Override
-    public PersistenceSessionFactory getPersistenceSessionFactory(ConfigurationServiceInternal isisConfiguration) {
-        return new PersistenceSessionFactory4(isisConfiguration);
+    public PersistenceSessionFactory getPersistenceSessionFactory(/*ConfigurationServiceInternal isisConfiguration*/) {
+        return new PersistenceSessionFactory4(/*isisConfiguration*/);
     }
 
 }
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java
index 8f08291..fbe6318 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents4.java
@@ -25,6 +25,17 @@ import java.util.Set;
 import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManagerFactory;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
+
+import org.datanucleus.PersistenceNucleusContext;
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.datanucleus.metadata.MetaDataListener;
+import org.datanucleus.metadata.MetaDataManager;
+import org.datanucleus.store.StoreManager;
+import org.datanucleus.store.schema.SchemaAwareStoreManager;
+
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.factory.InstanceUtil;
@@ -36,16 +47,6 @@ import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusLifeCycleHelper;
 import org.apache.isis.objectstore.jdo.datanucleus.DataNucleusPropertiesAware;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoNamedQuery;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.query.JdoQueryFacet;
-import org.datanucleus.PersistenceNucleusContext;
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.datanucleus.metadata.MetaDataListener;
-import org.datanucleus.metadata.MetaDataManager;
-import org.datanucleus.store.StoreManager;
-import org.datanucleus.store.schema.SchemaAwareStoreManager;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
 
 public class DataNucleusApplicationComponents4 implements ApplicationScopedComponent {
 
@@ -82,35 +83,25 @@ public class DataNucleusApplicationComponents4 implements ApplicationScopedCompo
 
     private final Set<String> persistableClassNameSet;
     private final IsisConfiguration jdoObjectstoreConfig;
-    private final SpecificationLoader specificationLoader;
     private final Map<String, String> datanucleusProps;
 
-    private Map<String, JdoNamedQuery> namedQueryByName;
     private PersistenceManagerFactory persistenceManagerFactory;
 
     public DataNucleusApplicationComponents4(
             final IsisConfiguration configuration,
-            final SpecificationLoader specificationLoader,
             final Map<String, String> datanucleusProps,
             final Set<String> persistableClassNameSet) {
-        this.specificationLoader = specificationLoader;
 
         this.datanucleusProps = datanucleusProps;
         this.persistableClassNameSet = persistableClassNameSet;
         this.jdoObjectstoreConfig = configuration;
 
-        initialize();
+        persistenceManagerFactory = createPmfAndSchemaIfRequired(this.persistableClassNameSet, this.datanucleusProps);
 
         // for JRebel plugin
         instance = this;
     }
 
-    private void initialize() {
-        persistenceManagerFactory = createPmfAndSchemaIfRequired(persistableClassNameSet, datanucleusProps);
-
-        namedQueryByName = catalogNamedQueries(persistableClassNameSet);
-    }
-
     /**
      * Marks the end of DataNucleus' life-cycle. Purges any state associated with DN.
      * Subsequent calls have no effect.
@@ -251,8 +242,9 @@ public class DataNucleusApplicationComponents4 implements ApplicationScopedCompo
         properties.putAll(props);
         return properties;
     }
-
-    private Map<String, JdoNamedQuery> catalogNamedQueries(Set<String> persistableClassNames) {
+    
+    static Map<String, JdoNamedQuery> catalogNamedQueries(
+            Set<String> persistableClassNames, final SpecificationLoader specificationLoader) {
         final Map<String, JdoNamedQuery> namedQueryByName = Maps.newHashMap();
         for (final String persistableClassName: persistableClassNames) {
             final ObjectSpecification spec = specificationLoader.loadSpecification(persistableClassName);
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java
index 3e4941a..9c547ae 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory4.java
@@ -24,20 +24,20 @@ import java.util.Set;
 
 import javax.jdo.PersistenceManagerFactory;
 
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis;
 import org.apache.isis.objectstore.jdo.service.RegisterEntities;
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  *
@@ -53,11 +53,11 @@ PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledFlag {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory4.class);
 
-    private final ConfigurationServiceInternal configuration;
-
-    public PersistenceSessionFactory4(final ConfigurationServiceInternal isisConfiguration) {
-        this.configuration = isisConfiguration;
-    }
+//    private final ConfigurationServiceInternal configuration;
+//
+//    public PersistenceSessionFactory4(final ConfigurationServiceInternal isisConfiguration) {
+//        this.configuration = isisConfiguration;
+//    }
 
     public static final String JDO_OBJECTSTORE_CONFIG_PREFIX = "isis.persistor.datanucleus";  // specific to the JDO objectstore
     public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; // reserved for datanucleus' own config props
@@ -67,8 +67,8 @@ PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledFlag {
 
     @Programmatic
     @Override
-    public void init(final SpecificationLoader specificationLoader) {
-        this.applicationComponents = createDataNucleusApplicationComponents(configuration, specificationLoader);
+    public void init(final IsisConfigurationDefault configuration) {
+        this.applicationComponents = createDataNucleusApplicationComponents(configuration);
     }
 
     @Programmatic
@@ -78,9 +78,12 @@ PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledFlag {
     }
 
     private DataNucleusApplicationComponents4 createDataNucleusApplicationComponents(
-            final IsisConfiguration configuration, final SpecificationLoader specificationLoader) {
+            final IsisConfiguration configuration) {
 
-        if (applicationComponents == null || applicationComponents.isStale()) {
+        final RegisterEntities registerEntities = new RegisterEntities(/*configuration.asMap()*/);
+        final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
+        
+        if (shouldCreate(this.applicationComponents)) {
 
             final IsisConfiguration jdoObjectstoreConfig = configuration.createSubset(
                     JDO_OBJECTSTORE_CONFIG_PREFIX);
@@ -89,15 +92,19 @@ PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstalledFlag {
             final Map<String, String> datanucleusProps = dataNucleusConfig.asMap();
             addDataNucleusPropertiesIfRequired(datanucleusProps);
 
-            final RegisterEntities registerEntities = new RegisterEntities(specificationLoader);
-            final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
-
-            applicationComponents = new DataNucleusApplicationComponents4(jdoObjectstoreConfig, specificationLoader,
-                    datanucleusProps, classesToBePersisted);
+            DataNucleusApplicationComponents4 applicationComponents1 = 
+                    new DataNucleusApplicationComponents4(jdoObjectstoreConfig,
+                            datanucleusProps, classesToBePersisted);
+            
+            this.applicationComponents = applicationComponents1;
         }
 
         return applicationComponents;
     }
+    
+    private boolean shouldCreate(final DataNucleusApplicationComponents4 applicationComponents) {
+        return applicationComponents == null || applicationComponents.isStale();
+    }
 
     private static void addDataNucleusPropertiesIfRequired(
             final Map<String, String> props) {
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java
index 94164d0..0db3fee 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apacha/isis/plugins/jdo/dn5/IsisJdoSupportPlugin5.java
@@ -22,7 +22,6 @@ import javax.annotation.Nullable;
 
 import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
 import org.apache.isis.core.metamodel.IsisJdoRuntimePlugin;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory5;
 
@@ -42,8 +41,8 @@ public class IsisJdoSupportPlugin5 implements IsisJdoMetamodelPlugin, IsisJdoRun
     }
 
     @Override
-    public PersistenceSessionFactory getPersistenceSessionFactory(ConfigurationServiceInternal isisConfiguration) {
-        return new PersistenceSessionFactory5(isisConfiguration);
+    public PersistenceSessionFactory getPersistenceSessionFactory(/*ConfigurationServiceInternal isisConfiguration*/) {
+        return new PersistenceSessionFactory5(/*isisConfiguration*/);
     }
 
 }
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java
index 7b0f1ad..56265dd 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents5.java
@@ -82,35 +82,25 @@ public class DataNucleusApplicationComponents5 implements ApplicationScopedCompo
 
     private final Set<String> persistableClassNameSet;
     private final IsisConfiguration jdoObjectstoreConfig;
-    private final SpecificationLoader specificationLoader;
     private final Map<String, String> datanucleusProps;
 
-    private Map<String, JdoNamedQuery> namedQueryByName;
     private PersistenceManagerFactory persistenceManagerFactory;
 
     public DataNucleusApplicationComponents5(
             final IsisConfiguration configuration,
-            final SpecificationLoader specificationLoader,
             final Map<String, String> datanucleusProps,
             final Set<String> persistableClassNameSet) {
-        this.specificationLoader = specificationLoader;
 
         this.datanucleusProps = datanucleusProps;
         this.persistableClassNameSet = persistableClassNameSet;
         this.jdoObjectstoreConfig = configuration;
 
-        initialize();
+        persistenceManagerFactory = createPmfAndSchemaIfRequired(this.persistableClassNameSet, this.datanucleusProps);
 
         // for JRebel plugin
         instance = this;
     }
 
-    private void initialize() {
-        persistenceManagerFactory = createPmfAndSchemaIfRequired(persistableClassNameSet, datanucleusProps);
-
-        namedQueryByName = catalogNamedQueries(persistableClassNameSet);
-    }
-
     /**
      * Marks the end of DataNucleus' life-cycle. Purges any state associated with DN.
      * Subsequent calls have no effect.
@@ -252,7 +242,8 @@ public class DataNucleusApplicationComponents5 implements ApplicationScopedCompo
         return properties;
     }
 
-    private Map<String, JdoNamedQuery> catalogNamedQueries(Set<String> persistableClassNames) {
+    static Map<String, JdoNamedQuery> catalogNamedQueries(
+            Set<String> persistableClassNames, final SpecificationLoader specificationLoader) {
         final Map<String, JdoNamedQuery> namedQueryByName = Maps.newHashMap();
         for (final String persistableClassName: persistableClassNames) {
             final ObjectSpecification spec = specificationLoader.loadSpecification(persistableClassName);
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java
index 2678d50..457632d 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory5.java
@@ -24,20 +24,20 @@ import java.util.Set;
 
 import javax.jdo.PersistenceManagerFactory;
 
+import org.datanucleus.PropertyNames;
+import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.components.ApplicationScopedComponent;
 import org.apache.isis.core.commons.config.IsisConfiguration;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
 import org.apache.isis.objectstore.jdo.datanucleus.JDOStateManagerForIsis;
 import org.apache.isis.objectstore.jdo.service.RegisterEntities;
-import org.datanucleus.PropertyNames;
-import org.datanucleus.api.jdo.JDOPersistenceManagerFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  *
@@ -53,11 +53,11 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory5.class);
 
-    private final ConfigurationServiceInternal configuration;
-
-    public PersistenceSessionFactory5(final ConfigurationServiceInternal isisConfiguration) {
-        this.configuration = isisConfiguration;
-    }
+//    private final ConfigurationServiceInternal configuration;
+//
+//    public PersistenceSessionFactory5(final ConfigurationServiceInternal isisConfiguration) {
+//        this.configuration = isisConfiguration;
+//    }
 
     public static final String JDO_OBJECTSTORE_CONFIG_PREFIX = "isis.persistor.datanucleus";  // specific to the JDO objectstore
     public static final String DATANUCLEUS_CONFIG_PREFIX = "isis.persistor.datanucleus.impl"; // reserved for datanucleus' own config props
@@ -67,8 +67,8 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
 
     @Programmatic
     @Override
-    public void init(final SpecificationLoader specificationLoader) {
-        this.applicationComponents = createDataNucleusApplicationComponents(configuration, specificationLoader);
+    public void init(final IsisConfigurationDefault configuration) {
+        this.applicationComponents = createDataNucleusApplicationComponents(configuration);
     }
 
     @Programmatic
@@ -78,9 +78,12 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
     }
 
     private DataNucleusApplicationComponents5 createDataNucleusApplicationComponents(
-            final IsisConfiguration configuration, final SpecificationLoader specificationLoader) {
+            final IsisConfiguration configuration) {
 
-        if (applicationComponents == null || applicationComponents.isStale()) {
+        final RegisterEntities registerEntities = new RegisterEntities();
+        final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
+        
+        if (shouldCreate(this.applicationComponents)) {
 
             final IsisConfiguration jdoObjectstoreConfig = configuration.createSubset(
                     JDO_OBJECTSTORE_CONFIG_PREFIX);
@@ -89,15 +92,19 @@ implements PersistenceSessionFactory, ApplicationScopedComponent, FixturesInstal
             final Map<String, String> datanucleusProps = dataNucleusConfig.asMap();
             addDataNucleusPropertiesIfRequired(datanucleusProps);
 
-            final RegisterEntities registerEntities = new RegisterEntities(specificationLoader);
-            final Set<String> classesToBePersisted = registerEntities.getEntityTypes();
-
-            applicationComponents = new DataNucleusApplicationComponents5(jdoObjectstoreConfig, specificationLoader,
-                    datanucleusProps, classesToBePersisted);
+            DataNucleusApplicationComponents5 applicationComponents1 = 
+                    new DataNucleusApplicationComponents5(jdoObjectstoreConfig,
+                            datanucleusProps, classesToBePersisted);
+            
+            this.applicationComponents = applicationComponents1;
         }
 
         return applicationComponents;
     }
+    
+    private boolean shouldCreate(final DataNucleusApplicationComponents5 applicationComponents) {
+        return applicationComponents == null || applicationComponents.isStale();
+    }
 
     private static void addDataNucleusPropertiesIfRequired(
             final Map<String, String> props) {
diff --git a/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java b/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
index 1d33cc7..d60491f 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/metamodel/IsisJdoRuntimePlugin.java
@@ -17,14 +17,13 @@
 package org.apache.isis.core.metamodel;
 
 import org.apache.isis.commons.internal.context._Plugin;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory;
 
 public interface IsisJdoRuntimePlugin {
 
     // -- INTERFACE
 
-    public PersistenceSessionFactory getPersistenceSessionFactory(ConfigurationServiceInternal configuration);
+    public PersistenceSessionFactory getPersistenceSessionFactory(/*ConfigurationServiceInternal configuration*/);
 
     // -- LOOKUP
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
index d72c10c..4ec2de2 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java
@@ -17,10 +17,9 @@
 package org.apache.isis.core.runtime.system.persistence;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
+import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.metamodel.IsisJdoRuntimePlugin;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
-import org.apache.isis.core.metamodel.services.configinternal.ConfigurationServiceInternal;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public interface PersistenceSessionFactory {
 
@@ -29,7 +28,7 @@ public interface PersistenceSessionFactory {
     PersistenceSession createPersistenceSession(ServicesInjector servicesInjector,
             AuthenticationSession authenticationSession);
 
-    void init(SpecificationLoader specificationLoader);
+    void init(IsisConfigurationDefault configuration);
 
     boolean isInitialized();
 
@@ -37,8 +36,8 @@ public interface PersistenceSessionFactory {
 
     // -- FACTORY
 
-    static PersistenceSessionFactory of(ConfigurationServiceInternal configuration) {
-        return IsisJdoRuntimePlugin.get().getPersistenceSessionFactory(configuration);
+    static PersistenceSessionFactory of(/*ConfigurationServiceInternal configuration*/) {
+        return IsisJdoRuntimePlugin.get().getPersistenceSessionFactory(/*configuration*/);
     }
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
index fb0ba74..6b95018 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/session/IsisSessionFactoryBuilder.java
@@ -22,6 +22,9 @@ package org.apache.isis.core.runtime.system.session;
 import java.io.File;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -31,6 +34,7 @@ import org.apache.isis.applib.clock.Clock;
 import org.apache.isis.applib.fixtures.FixtureClock;
 import org.apache.isis.applib.fixturescripts.FixtureScripts;
 import org.apache.isis.applib.services.fixturespec.FixtureScriptsDefault;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.core.commons.config.IsisConfigurationDefault;
 import org.apache.isis.core.commons.lang.ListExtensions;
@@ -52,6 +56,7 @@ import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactory
 import org.apache.isis.core.runtime.system.persistence.PersistenceSessionFactoryMetamodelRefiner;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProvider;
 import org.apache.isis.core.runtime.systemusinginstallers.IsisComponentProviderDefault2;
+import org.apache.isis.core.runtime.threadpool.ThreadPoolSupport;
 
 public class IsisSessionFactoryBuilder {
 
@@ -155,7 +160,7 @@ public class IsisSessionFactoryBuilder {
             servicesInjector.addFallbackIfRequired(SpecificationLoader.class, specificationLoader);
 
             // persistenceSessionFactory
-            final PersistenceSessionFactory persistenceSessionFactory = PersistenceSessionFactory.of(configuration);
+            final PersistenceSessionFactory persistenceSessionFactory = PersistenceSessionFactory.of(/*configuration*/);
             servicesInjector.addFallbackIfRequired(PersistenceSessionFactory.class, persistenceSessionFactory);
 
 
@@ -178,33 +183,43 @@ public class IsisSessionFactoryBuilder {
             // yet inject.
             _Context.putSingleton(IsisSessionFactory.class, isisSessionFactory);
 
-            // time to initialize...
-            specificationLoader.init();
-
-            // we need to do this before checking if the metamodel is valid.
-            //
-            // eg ActionChoicesForCollectionParameterFacetFactory metamodel validator requires a runtime...
-            // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.getServiceAdapter(ObjectActionContributee.java:287)
-            // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.determineParameters(ObjectActionContributee.java:138)
-            // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionDefault.getParameters(ObjectActionDefault.java:182)
-            // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.validate(ActionChoicesForCollectionParameterFacetFactory.java:85)
-            // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.visit(ActionChoicesForCollectionParameterFacetFactory.java:76)
-            // at o.a.i.core.metamodel.specloader.validator.MetaModelValidatorVisiting.validate(MetaModelValidatorVisiting.java:47)
-            //
-            // also, required so that can still call isisSessionFactory#doInSession
-            //
-            // eg todoapp has a custom UserSettingsThemeProvider that is called when rendering any page
-            // (including the metamodel invalid page)
-            // at o.a.i.core.runtime.system.session.IsisSessionFactory.doInSession(IsisSessionFactory.java:327)
-            // at todoapp.webapp.UserSettingsThemeProvider.getActiveTheme(UserSettingsThemeProvider.java:36)
-
-            authenticationManager.init(deploymentCategory);
-            authorizationManager.init(deploymentCategory);
-
-            persistenceSessionFactory.init(specificationLoader);
+            final List<Callable<Object>> tasks = _Lists.<Callable<Object>>of(
+                    ()->{
+                        // time to initialize...
+                        specificationLoader.init();
+                        // we need to do this before checking if the metamodel is valid.
+                        //
+                        // eg ActionChoicesForCollectionParameterFacetFactory metamodel validator requires a runtime...
+                        // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.getServiceAdapter(ObjectActionContributee.java:287)
+                        // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionContributee.determineParameters(ObjectActionContributee.java:138)
+                        // at o.a.i.core.metamodel.specloader.specimpl.ObjectActionDefault.getParameters(ObjectActionDefault.java:182)
+                        // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.validate(ActionChoicesForCollectionParameterFacetFactory.java:85)
+                        // at o.a.i.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory$1.visit(ActionChoicesForCollectionParameterFacetFactory.java:76)
+                        // at o.a.i.core.metamodel.specloader.validator.MetaModelValidatorVisiting.validate(MetaModelValidatorVisiting.java:47)
+                        //
+                        // also, required so that can still call isisSessionFactory#doInSession
+                        //
+                        // eg todoapp has a custom UserSettingsThemeProvider that is called when rendering any page
+                        // (including the metamodel invalid page)
+                        // at o.a.i.core.runtime.system.session.IsisSessionFactory.doInSession(IsisSessionFactory.java:327)
+                        // at todoapp.webapp.UserSettingsThemeProvider.getActiveTheme(UserSettingsThemeProvider.java:36)
+                        authenticationManager.init(deploymentCategory);
+                        authorizationManager.init(deploymentCategory);
+                        return null;
+                    },
+                    ()->{
+                        persistenceSessionFactory.init(configuration);
+                        return null;
+                    }
+                ); 
 
-            isisSessionFactory.constructServices();
+            // execute tasks using a threadpool
+            final List<Future<Object>> futures = ThreadPoolSupport.getInstance().invokeAll(tasks);
+            
+            // wait on this thread for tasks to complete
+            ThreadPoolSupport.join(futures); 
 
+            isisSessionFactory.constructServices();
 
             isisSessionFactory.doInSession(
                     () -> {
@@ -236,13 +251,9 @@ public class IsisSessionFactoryBuilder {
         return ListExtensions.filtered(Arrays.asList(possibleRefiners), MetaModelRefiner.class);
     }
 
-
-
     // region > metaModel validity
     public boolean isMetaModelValid() {
         return IsisContext.getMetaModelInvalidExceptionIfAny() == null;
     }
 
-
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
index 3587b75..97c191f 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/service/RegisterEntities.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.objectstore.jdo.service;
 
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -25,14 +26,13 @@ import javax.jdo.annotations.PersistenceCapable;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.isis.applib.AppManifest;
+import org.apache.isis.commons.internal.base._LazyThreadSafe;
 import org.apache.isis.core.metamodel.JdoMetamodelUtil;
-import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 
 public class RegisterEntities {
 
@@ -45,20 +45,17 @@ public class RegisterEntities {
     @Deprecated
     public final static String PACKAGE_PREFIX_KEY = "isis.persistor.datanucleus.RegisterEntities.packagePrefix";
 
-    // //////////////////////////////////////
-
-
-    // -- entityTypes
-    private final Set<String> entityTypes = Sets.newLinkedHashSet();
-    private final SpecificationLoader specificationLoader;
+    private final _LazyThreadSafe<Set<String>> entityTypes = _LazyThreadSafe.of(this::findEntityTypes);
 
     public Set<String> getEntityTypes() {
-        return entityTypes;
+        return entityTypes.get();
     }
 
+    // -- HELPER
 
-    public RegisterEntities(final SpecificationLoader specificationLoader) {
-        this.specificationLoader = specificationLoader;
+    private Set<String> findEntityTypes() {
+        
+        Set<String> entityTypes = new LinkedHashSet<String>();
 
         Set<Class<?>> persistenceCapableTypes = AppManifest.Registry.instance().getPersistenceCapableTypes();
 
@@ -74,13 +71,15 @@ public class RegisterEntities {
             if(!JdoMetamodelUtil.isPersistenceEnhanced(persistenceCapableType)) {
                 classNamesNotEnhanced.add(persistenceCapableType.getCanonicalName());
             }
-            this.entityTypes.add(persistenceCapableType.getCanonicalName());
+            entityTypes.add(persistenceCapableType.getCanonicalName());
         }
 
         if(!classNamesNotEnhanced.isEmpty()) {
             final String classNamesNotEnhancedStr = Joiner.on("\n* ").join(classNamesNotEnhanced);
             throw new IllegalStateException("Non-enhanced @PersistenceCapable classes found, will abort.  The classes in error are:\n\n* " + classNamesNotEnhancedStr + "\n\nDid the DataNucleus enhancer run correctly?\n");
         }
+        
+        return entityTypes;
     }
 
 
@@ -98,8 +97,4 @@ public class RegisterEntities {
     }
 
 
-    SpecificationLoader getSpecificationLoader() {
-        return specificationLoader;
-    }
-
 }