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 <ahu...@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; - } - }