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 <ahu...@apache.org>
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 ahu...@apache.org
  * @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
ahu...@apache.org.

Reply via email to