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 2018/08/23 09:48:57 UTC

[isis] 07/07: ISIS-1974: initializes the Isis metamodel and DN in parallel.

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

danhaywood pushed a commit to branch maint-1.16.2
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 6dc52825cfb0de5f91ec621f803c38bcf00ad2d4
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Aug 23 10:47:34 2018 +0100

    ISIS-1974: initializes the Isis metamodel and DN in parallel.
---
 .../core/runtime/threadpool/ThreadPoolSupport.java | 14 +++++
 .../system/session/IsisSessionFactoryBuilder.java  | 70 ++++++++++++++--------
 .../wicket/viewer/IsisWicketApplication.java       |  4 +-
 3 files changed, 62 insertions(+), 26 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
index 0aee0fd..09c9fe7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/runtime/threadpool/ThreadPoolSupport.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.core.runtime.threadpool;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.Callable;
@@ -99,4 +100,17 @@ public final class ThreadPoolSupport {
             throw new RuntimeException(e);
         }
     }
+    public static List<Future<Object>> invokeAll(final Callable<Object>... callables) {
+        return invokeAll(Arrays.asList(callables));
+    }
+    public static List<Future<Object>> invokeSerial(final Callable<Object>... callables) {
+        List<Future<Object>> futures = Lists.newArrayList();
+        for (Callable<Object> callable : callables) {
+            List<Future<Object>> x = invokeAll(callable);
+            join(x);
+            futures.addAll(x);
+        }
+        return futures;
+    }
+
 }
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 3e56fd6..72d8ef2 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;
@@ -51,6 +54,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 {
 
@@ -177,30 +181,48 @@ public class IsisSessionFactoryBuilder {
             // yet inject.
             IsisContext.setSessionFactory(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(configuration);
+
+            final List<Future<Object>> futures = ThreadPoolSupport.invokeAll(
+                    new Callable<Object>() {
+                        @Override
+                        public Object call() {
+
+                            // 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;
+                        }
+                    },
+                    new Callable<Object>() {
+                        @Override public Object call() {
+                            persistenceSessionFactory.init(configuration);
+                            return null;
+                        }
+                    }
+            );
+
+            ThreadPoolSupport.join(futures);
+
 
             persistenceSessionFactory.catalogNamedQueries(specificationLoader);
 
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 03426ac..d6e0874 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -441,7 +441,7 @@ public class IsisWicketApplication
     }
 
     protected List<Future<Object>> startBackgroundInitializationThreads() {
-        return ThreadPoolSupport.invokeAll(Lists.newArrayList(
+        return ThreadPoolSupport.invokeAll(
                 new Callable<Object>() {
                     @Override
                     public Object call() throws Exception {
@@ -481,7 +481,7 @@ public class IsisWicketApplication
                         return null;
                     }
                 }
-        ));
+        );
     }
 
     /**