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

ahuber pushed a commit to branch dev/2.0.0/ISIS-1767-jee-7
in repository https://gitbox.apache.org/repos/asf/isis.git

commit ab2b0697c7b1104610cb25c22062ba8b6d8c29f2
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Mon Oct 30 17:29:14 2017 +0100

    ISIS-1754 context aware class-loading for Isis
---
 .../core/runtime/services/ServiceInstantiator.java |   4 +-
 .../core/runtime/system/context/IsisContext.java   | 149 ++++++++++++---------
 .../IsisComponentProvider.java                     |  26 ++--
 3 files changed, 107 insertions(+), 72 deletions(-)

diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
index 3303118..38ee52f 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/services/ServiceInstantiator.java
@@ -42,6 +42,7 @@ import org.apache.isis.core.commons.lang.ArrayExtensions;
 import org.apache.isis.core.commons.lang.MethodExtensions;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import 
org.apache.isis.core.metamodel.specloader.classsubstitutor.JavassistEnhanced;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 
 import javassist.util.proxy.MethodFilter;
 import javassist.util.proxy.MethodHandler;
@@ -110,8 +111,7 @@ public final class ServiceInstantiator {
     private Class<?> loadClass(final String className) {
         try {
             LOG.debug("loading class for service: " + className);
-            //return 
Thread.currentThread().getContextClassLoader().loadClass(className);
-            return Class.forName(className);
+            return IsisContext.getClassLoader().loadClass(className);
         } catch (final ClassNotFoundException ex) {
             throw new InitialisationException(String.format("Cannot find class 
'%s' for service", className));
         }
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 dd63f0f..f26b6d9 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
@@ -25,74 +25,103 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactoryBuilder;
+import org.apache.log4j.BasicConfigurator;
 import org.apache.isis.core.runtime.system.session.IsisSession;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 
 /**
- * Simply a static field holding the {@link IsisSessionFactory} singleton, and 
conveneince methods to obtain the
+ * Simply a static field holding the {@link IsisSessionFactory} singleton, and 
convenience methods to obtain the
  * current {@link IsisSession}, along with application-scoped components and 
also any transaction-scoped components.
  */
 public final class IsisContext {
 
-    private static final Logger LOG = 
LoggerFactory.getLogger(IsisContext.class);
-
-    private IsisContext(){
-        throw new IllegalStateException("Never instantiated");
-    }
-
-    //region > metaModelInvalidExceptionIfAny (static)
-    /**
-     * Populated only if the metamodel was found to be invalid
-     */
-    private static MetaModelInvalidException metamodelInvalidException;
-
-    public static MetaModelInvalidException 
getMetaModelInvalidExceptionIfAny() {
-        return IsisContext.metamodelInvalidException;
-    }
-    public static void setMetaModelInvalidException(final 
MetaModelInvalidException metaModelInvalid) {
-        IsisContext.metamodelInvalidException = metaModelInvalid;
-    }
-    //endregion
-
-    //region > sessionFactory (static)
-
-    private static IsisSessionFactory sessionFactory;
-
-    public static IsisSessionFactory getSessionFactory() {
-        return sessionFactory;
-    }
-
-
-    /**
-     * Intended to be called only by {@link IsisSessionFactoryBuilder}.
-     */
-    public static void setSessionFactory(final IsisSessionFactory 
sessionFactory) {
-        if (IsisContext.sessionFactory != null) {
-            throw new IsisException("SessionFactory already set up");
-        }
-        IsisContext.sessionFactory = sessionFactory;
-    }
-    
-    /**
-     * Resets
-     * @deprecated replaced by {@link #destroy()}
-     * 
-     */
-    @Deprecated
-    public static void testReset() {
-       destroy();
-    }
-    
-    /**
-     * Destroys this context and clears any state associated with it. 
-     * It marks the end of IsisContext's lifecycle. Subsequent calls have no 
effect. 
-     */
-    public static void destroy() {
-        sessionFactory = null;
-        metamodelInvalidException = null;
-    }
-
-    //endregion
+       private static final Logger log = 
LoggerFactory.getLogger(IsisContext.class);
+
+       // -- CONSTRUCTOR
+
+       private IsisContext(){
+               throw new IllegalStateException("Never instantiated");
+       }
+
+       // -- META MODEL VALIDATION
+
+       /**
+        * Populated only if the metamodel was found to be invalid
+        */
+       private static MetaModelInvalidException metamodelInvalidException;
+
+       public static MetaModelInvalidException 
getMetaModelInvalidExceptionIfAny() {
+               return IsisContext.metamodelInvalidException;
+       }
+       public static void setMetaModelInvalidException(final 
MetaModelInvalidException metaModelInvalid) {
+               IsisContext.metamodelInvalidException = metaModelInvalid;
+       }
+
+       // -- SESSION FACTORY
+
+       private static IsisSessionFactory sessionFactory;
+
+       public static IsisSessionFactory getSessionFactory() {
+               return sessionFactory;
+       }
+
+       /**
+        * Intended to be called only by {@link IsisSessionFactoryBuilder}.
+        */
+       public static void setSessionFactory(final IsisSessionFactory 
sessionFactory) {
+               if (IsisContext.sessionFactory != null) {
+                       throw new IsisException("SessionFactory already set 
up");
+               }
+               IsisContext.sessionFactory = sessionFactory;
+       }
+
+       // -- LIFE CYCLING
+
+       /**
+        * Resets
+        * @deprecated replaced by {@link #destroy()}
+        * 
+        */
+       @Deprecated
+       public static void testReset() {
+               destroy();
+       }
+
+       /**
+        * life-cycle exit point
+        * <p>
+        * Destroys this context and clears any state associated with it. 
+        * It marks the end of IsisContext's life-cycle. Subsequent calls have 
no effect.
+        * </p> 
+        */
+       public static void destroy() {
+               sessionFactory = null;
+               metamodelInvalidException = null;
+               log.info("destroyed");
+               resetLogging();
+       }
+
+       // -- CLASS LOADING
+
+       /**
+        * 
+        * @return the framework's default class-loader
+        */
+       public static ClassLoader getClassLoader() {
+               //TODO requires skinny-war testing on glassfish, payara, 
wildfly, tomee, ...
+               return Thread.currentThread().getContextClassLoader();
+       }
+
+       // -- HELPER
+
+       /**
+        * TODO [andi-huber] not sure if required, initial idea was to force 
log4j
+        * re-configuration on a undeply/deploy cycle
+        */
+       private static void resetLogging() {
+               org.apache.log4j.Logger.getRootLogger().removeAllAppenders();
+               BasicConfigurator.resetConfiguration();
+       }
 
 
 }
diff --git 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
index 2557cb2..83d854e 100644
--- 
a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
+++ 
b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProvider.java
@@ -30,15 +30,6 @@ import java.util.stream.Stream;
 import javax.annotation.Nullable;
 import javax.jdo.annotations.PersistenceCapable;
 
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-import org.reflections.Reflections;
-import org.reflections.vfs.Vfs;
-
 import org.apache.isis.applib.AppManifest;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.DomainService;
@@ -64,9 +55,20 @@ import 
org.apache.isis.core.runtime.services.ServicesInstallerFromConfiguration;
 import 
org.apache.isis.core.runtime.services.ServicesInstallerFromConfigurationAndAnnotation;
 import org.apache.isis.core.runtime.system.IsisSystemException;
 import org.apache.isis.core.runtime.system.SystemConstants;
+import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.objectstore.jdo.service.RegisterEntities;
 import org.apache.isis.progmodels.dflt.JavaReflectorHelper;
 import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5;
+import org.reflections.Configuration;
+import org.reflections.Reflections;
+import org.reflections.util.ConfigurationBuilder;
+import org.reflections.vfs.Vfs;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 /**
  * 
@@ -140,7 +142,11 @@ public abstract class IsisComponentProvider {
 
         
Vfs.setDefaultURLTypes(ClassDiscoveryServiceUsingReflections.getUrlTypes());
 
-        final Reflections reflections = new Reflections(packages);
+        final Configuration reflectionsConfig = new ConfigurationBuilder()
+                       .addClassLoader(IsisContext.getClassLoader())
+                       .forPackages(packages.toArray(new String[] {})); 
+        final Reflections reflections = new Reflections(reflectionsConfig);
+
         final Set<Class<?>> domainServiceTypes = 
reflections.getTypesAnnotatedWith(DomainService.class);
         final Set<Class<?>> persistenceCapableTypes = 
findPersistenceCapableTypes(reflections);
         final Set<Class<? extends FixtureScript>> fixtureScriptTypes = 
reflections.getSubTypesOf(FixtureScript.class);

-- 
To stop receiving notification emails like this one, please contact
"commits@isis.apache.org" <commits@isis.apache.org>.

Reply via email to