This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch dev/2.0.0-M2 in repository https://gitbox.apache.org/repos/asf/isis.git
commit 06c07d50ec3ed55ebb44c49da3ef6ac3574907cd Author: Andi Huber <[email protected]> AuthorDate: Mon Feb 19 18:10:12 2018 +0100 ISIS-1756 backporting proper life-cycling from jax-rs-2 branch --- .../core/runtime/system/context/IsisContext.java | 15 +++++ .../DataNucleusApplicationComponents.java | 15 +++++ .../persistence/PersistenceSessionFactory.java | 29 +++------ .../datanucleus/DataNucleusLifeCycleHelper.java | 69 ++-------------------- 4 files changed, 41 insertions(+), 87 deletions(-) diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java index 40929e2..9763ff5 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java @@ -65,6 +65,7 @@ public interface IsisContext { */ public static void clear() { _Context.clear(); + resetLogging(); } // -- DEPRECATIONS @@ -79,5 +80,19 @@ public interface IsisContext { clear(); } + // -- HELPER + + /** + * TODO [andi-huber] not sure if required, initial idea was to force log4j + * re-configuration on an undeploy/deploy cycle + */ + static void resetLogging() { + try { + org.apache.log4j.BasicConfigurator.resetConfiguration(); + org.apache.log4j.Logger.getRootLogger().removeAllAppenders(); + } catch (Exception e) { + // at least we tried + } + } } diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java index 8fafca8..9cd3f7f 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/DataNucleusApplicationComponents.java @@ -32,6 +32,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; import org.apache.isis.core.runtime.system.context.IsisContext; import org.apache.isis.objectstore.jdo.datanucleus.CreateSchemaObjectFromClassMetadata; +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; @@ -109,6 +110,20 @@ public class DataNucleusApplicationComponents implements ApplicationScopedCompon namedQueryByName = catalogNamedQueries(persistableClassNameSet); } + + /** + * Marks the end of DataNucleus' life-cycle. Purges any state associated with DN. + * Subsequent calls have no effect. + * + * @since 2.0.0 + */ + public void shutdown() { + instance = null; + if(persistenceManagerFactory != null) { + DataNucleusLifeCycleHelper.cleanUp(persistenceManagerFactory); + persistenceManagerFactory = null; + } + } private static boolean isSchemaAwareStoreManager(Map<String,String> datanucleusProps) { 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 92f950d..146f16a 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 @@ -53,18 +53,12 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi private static final Logger LOG = LoggerFactory.getLogger(PersistenceSessionFactory.class); - //region > constructor - private final IsisConfigurationDefault configuration; public PersistenceSessionFactory(final IsisConfigurationDefault isisConfiguration) { this.configuration = isisConfiguration; } - //endregion - - //region > init, createDataNucleusApplicationComponents - 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 @@ -159,19 +153,18 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi props.put(key, value); } } - //endregion - //region > shutdown @Programmatic public final void shutdown() { - // no-op + if(!isInitialized()) { + return; + } + if(applicationComponents != null) { + applicationComponents.shutdown(); + applicationComponents = null; + } } - //endregion - - - //region > createPersistenceSession - /** * Called by {@link org.apache.isis.core.runtime.system.session.IsisSessionFactory#openSession(AuthenticationSession)}. */ @@ -190,12 +183,6 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi fixturesInstalledFlag); } - - - //endregion - - //region > FixturesInstalledFlag impl - private Boolean fixturesInstalled; @Programmatic @@ -210,7 +197,5 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi this.fixturesInstalled = fixturesInstalled; } - //endregion - } diff --git a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java index 398c30f..570e18f 100644 --- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java +++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/DataNucleusLifeCycleHelper.java @@ -18,60 +18,29 @@ */ package org.apache.isis.objectstore.jdo.datanucleus; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Field; -import java.util.Map; -import java.util.function.Consumer; - import javax.jdo.PersistenceManagerFactory; -import org.datanucleus.enhancer.EnhancementHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import org.apache.isis.core.runtime.system.context.IsisContext; +import org.datanucleus.enhancer.EnhancementHelper; /** * * Purges any state associated with DataNucleus. + * <br/><br/> + * (requires datanucleus-core >= 5.1.5) * - * @author [email protected] * @since 2.0.0 * */ public class DataNucleusLifeCycleHelper { - private static final Logger LOG = LoggerFactory.getLogger(DataNucleusLifeCycleHelper.class); + //private static final Logger LOG = LoggerFactory.getLogger(DataNucleusLifeCycleHelper.class); public static void cleanUp(PersistenceManagerFactory persistenceManagerFactory) { try { final ClassLoader cl = IsisContext.getClassLoader(); - -// XXX not needed according to https://github.com/datanucleus/datanucleus-core/issues/272 -// -// if(persistenceManagerFactory instanceof JDOPersistenceManagerFactory) { -// -// final JDOPersistenceManagerFactory jdoPMF = -// (JDOPersistenceManagerFactory) persistenceManagerFactory; -// final PersistenceNucleusContext nucleusContext = jdoPMF.getNucleusContext(); -// final AbstractStoreManager storeManager = -// (AbstractStoreManager)nucleusContext.getStoreManager(); -// -// -// persistenceManagerFactory.getManagedClasses() -// .forEach(clazz->{ -// final ClassLoaderResolver clr = nucleusContext.getClassLoaderResolver(cl); -// -// // Un-manage from the store -// storeManager.unmanageClass(clr, clazz.getName(), false); -// -// // Unload the meta-data for this class -// nucleusContext.getMetaDataManager().unloadMetaDataForClass(clazz.getName()); -// }); -// } persistenceManagerFactory.close(); @@ -84,35 +53,5 @@ public class DataNucleusLifeCycleHelper { } } - - - // -- LOW LEVEL REFLECTION - - // TODO remove once DN v5.1.5 is released - private final static MethodHandle getRegisteredClassesMH; - static { - MethodHandle mh; - try { - Field registeredClasses = EnhancementHelper.class.getDeclaredField("registeredClasses"); - registeredClasses.setAccessible(true); - mh = MethodHandles.lookup().unreflectGetter(registeredClasses); - registeredClasses.setAccessible(false); - } catch (Exception e) { - mh = null; - e.printStackTrace(); - } - getRegisteredClassesMH = mh; - } - - // TODO remove once DN v5.1.5 is released - private static void visitDNRegisteredClasses(Consumer<Map<Class<?>, ?>> visitor){ - try { - visitor.accept( (Map<Class<?>, ?>) getRegisteredClassesMH.invoke() ); - } catch (Throwable e) { - LOG.warn("Failed to access DataNucleus' EnhancementHelper via reflection.", e); - } - } - - } -- To stop receiving notification emails like this one, please contact [email protected].
