You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/02/19 10:49:11 UTC

[isis] branch master updated: ISIS-1843 refactor class loading within entire core

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


The following commit(s) were added to refs/heads/master by this push:
     new 4c450b3  ISIS-1843 refactor class loading within entire core
4c450b3 is described below

commit 4c450b37fbe9db3f7805aebf42b4dfb6ad138078
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Feb 19 11:49:07 2018 +0100

    ISIS-1843 refactor class loading within entire core
---
 .../isis/applib/internal/context/_Context.java     | 29 +++++++++++-
 .../apache/isis/applib/query/QueryAbstract.java    |  4 +-
 .../applib/services/hsqldb/HsqlDbManagerMenu.java  |  3 +-
 .../apache/isis/schema/utils/CommonDtoUtils.java   | 51 +++++++++-------------
 .../isis/core/commons/encoding/FieldType.java      |  3 +-
 .../isis/core/commons/factory/InstanceUtil.java    |  9 ++--
 .../apache/isis/core/commons/lang/ClassUtil.java   |  6 ++-
 .../isis/core/commons/lang/ResourceUtil.java       | 13 +++++-
 ...ResourceStreamSourceContextLoaderClassPath.java |  3 +-
 .../core/runtime/services/ServiceInstantiator.java |  5 +--
 .../persistence/spi/JdoObjectIdSerializer.java     |  7 ++-
 .../scenarios/ScenarioExecutionScope.java          |  3 +-
 .../ui/components/about/JarManifestModel.java      |  3 +-
 13 files changed, 89 insertions(+), 50 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Context.java b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Context.java
index adb6d01..589805a 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Context.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/internal/context/_Context.java
@@ -24,6 +24,8 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.function.Supplier;
 
+import javax.validation.constraints.NotNull;
+
 import org.apache.isis.applib.internal.base._Casts;
 
 /**
@@ -137,10 +139,35 @@ public final class _Context {
 	 * Will be set by the framework's bootstrapping mechanism if required.
 	 * @return the default class loader
 	 */
-	public static ClassLoader getDefaultClassLoader() {
+	public static @NotNull ClassLoader getDefaultClassLoader() {
 		return getOrElse(ClassLoader.class, FALLBACK_CLASSLOADER);
 	}
+	
+	// -- CLASS LOADING SHORTCUTS
+	
+	/**
+	 * Uses the frameworks default-ClassLoader to load a class by name.
+	 * @param className
+	 * @return class by name
+	 * @throws ClassNotFoundException
+	 */
+	public static Class<?> loadClass(String className) throws ClassNotFoundException{
+		return getDefaultClassLoader().loadClass(className);
+	}
 
+	/**
+	 * Uses the frameworks default-ClassLoader to load and initialize a class by name.<br/>
+	 * <b>Initialize</b> the class, that is, all static initializers will be run. <br/>
+	 * (For details on initialize see Section 12.4 of The Java Language Specification)
+	 * @param className
+	 * @return
+	 * @throws ClassNotFoundException
+	 */
+	public static Class<?> loadClassAndInitialize(String className) throws ClassNotFoundException{
+		return Class.forName(className, true, getDefaultClassLoader());
+	}
+	
+	
 	// -- HELPER
 	
 	private static String toKey(Class<?> type) {
diff --git a/core/applib/src/main/java/org/apache/isis/applib/query/QueryAbstract.java b/core/applib/src/main/java/org/apache/isis/applib/query/QueryAbstract.java
index 7c2497e..d16f908 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/query/QueryAbstract.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/query/QueryAbstract.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.applib.query;
 
+import org.apache.isis.applib.internal.context._Context;
+
 /**
  * Convenience adapter class for {@link Query}.
  * 
@@ -67,7 +69,7 @@ public abstract class QueryAbstract<T> implements Query<T> {
     public Class<T> getResultType() {
         if (resultType == null) {
             try {
-                resultType = (Class<T>) Thread.currentThread().getContextClassLoader().loadClass(resultTypeName);
+                resultType = (Class<T>) _Context.loadClass(resultTypeName);
             } catch (final ClassNotFoundException e) {
                 throw new IllegalStateException(e);
             }
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/hsqldb/HsqlDbManagerMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/hsqldb/HsqlDbManagerMenu.java
index 48843ae..bc0586f 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/hsqldb/HsqlDbManagerMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/hsqldb/HsqlDbManagerMenu.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.internal.context._Context;
 
 @DomainService(
         nature = NatureOfService.VIEW_MENU_ONLY,
@@ -73,7 +74,7 @@ public class HsqlDbManagerMenu {
     public boolean hideHsqlDbManager() {
         try {
             // hsqldb is configured as optional in the applib's pom.xml
-            Thread.currentThread().getContextClassLoader().loadClass(DatabaseManagerSwing.class.getCanonicalName());
+        	_Context.loadClass(DatabaseManagerSwing.class.getCanonicalName());
         } catch (ClassNotFoundException e) {
             return true;
         }
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
index d3f0159..1ba83ab 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/CommonDtoUtils.java
@@ -22,19 +22,8 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Collection;
 
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableMap;
-
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalDateTime;
-import org.joda.time.LocalTime;
 import org.apache.isis.applib.internal.base._Casts;
+import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.applib.internal.exceptions._Exceptions;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
@@ -55,6 +44,18 @@ import org.apache.isis.schema.utils.jaxbadapters.JodaDateTimeXMLGregorianCalenda
 import org.apache.isis.schema.utils.jaxbadapters.JodaLocalDateTimeXMLGregorianCalendarAdapter;
 import org.apache.isis.schema.utils.jaxbadapters.JodaLocalDateXMLGregorianCalendarAdapter;
 import org.apache.isis.schema.utils.jaxbadapters.JodaLocalTimeXMLGregorianCalendarAdapter;
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.joda.time.LocalDateTime;
+import org.joda.time.LocalTime;
+
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.ImmutableMap;
 
 public final class CommonDtoUtils {
 
@@ -374,28 +375,18 @@ public final class CommonDtoUtils {
 
     private static <T> Class<T> loadClassElseThrow(final String className) {
         try {
-            return _Casts.uncheckedCast(loadClass(className));
+            return _Casts.uncheckedCast(_Context.loadClassAndInitialize(className));
         } catch (ClassNotFoundException e) {
-            throw new RuntimeException(e);
+        	
+        	// [ahuber] fallback to pre 2.0.0 behavior, not sure if needed  
+        	try {
+				return _Casts.uncheckedCast(Class.forName(className));
+			} catch (ClassNotFoundException e1) {
+				throw new RuntimeException(e);
+			}
         }
     }
 
-    private static Class<?> loadClass(String className) throws ClassNotFoundException {
-        ClassLoader ccl = Thread.currentThread().getContextClassLoader();
-        if(ccl == null) {
-            return loadClass(className, (ClassLoader)null);
-        } else {
-            try {
-                return loadClass(className, ccl);
-            } catch (ClassNotFoundException var3) {
-                return loadClass(className, (ClassLoader)null);
-            }
-        }
-    }
-
-    private static Class<?> loadClass(String className, ClassLoader classLoader) throws ClassNotFoundException {
-        return classLoader == null?Class.forName(className):Class.forName(className, true, classLoader);
-    }
     //endregion
 
     //region > newValueWithTypeDto
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java
index d834b18..9309746 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/encoding/FieldType.java
@@ -31,6 +31,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.isis.applib.internal.context._Context;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -969,7 +970,7 @@ public abstract class FieldType<T> {
                 Class<?> cls;
                 try {
                     // ...obtain constructor
-                    cls = Thread.currentThread().getContextClassLoader().loadClass(className);
+                    cls = _Context.loadClass(className);
 
                     final Constructor<?> constructor = cls.getConstructor(new Class[] { DataInputExtended.class });
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
index e4f04ae..e581d56 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/factory/InstanceUtil.java
@@ -22,6 +22,7 @@ package org.apache.isis.core.commons.factory;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 
+import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.core.commons.ensure.Assert;
 import org.apache.isis.core.commons.lang.ObjectExtensions;
 
@@ -54,7 +55,7 @@ public final class InstanceUtil {
         Class<? extends T> defaultType = null;
         if (defaultTypeName != null) {
             try {
-                defaultType = ObjectExtensions.asT(Thread.currentThread().getContextClassLoader().loadClass(defaultTypeName));
+                defaultType = ObjectExtensions.asT(_Context.loadClass(defaultTypeName));
                 if (defaultType == null) {
                     throw new InstanceCreationClassException(String.format("Failed to load default type '%s'", defaultTypeName));
                 }
@@ -76,7 +77,7 @@ public final class InstanceUtil {
         if (defaultTypeName != null) {
             defaultType = loadClass(defaultTypeName, requiredType);
             try {
-                defaultType = ObjectExtensions.asT(Thread.currentThread().getContextClassLoader().loadClass(defaultTypeName));
+                defaultType = ObjectExtensions.asT(_Context.loadClass(defaultTypeName));
                 if (defaultType == null) {
                     throw new InstanceCreationClassException(String.format("Failed to load default type '%s'", defaultTypeName));
                 }
@@ -96,7 +97,7 @@ public final class InstanceUtil {
             Object... args) {
         Assert.assertNotNull("Class to instantiate must be specified", className);
         try {
-            final Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(className);
+            final Class<?> cls = _Context.loadClass(className);
             if (cls == null) {
                 throw new InstanceCreationClassException(String.format("Failed to load class '%s'", className));
             }
@@ -149,7 +150,7 @@ public final class InstanceUtil {
     public static Class<?> loadClass(final String className) {
         Assert.assertNotNull("Class to instantiate must be specified", className);
         try {
-            return Thread.currentThread().getContextClassLoader().loadClass(className);
+            return _Context.loadClass(className);
         } catch (final ClassNotFoundException e) {
             throw new UnavailableClassException(String.format("The type '%s' cannot be found", className));
         } catch (final NoClassDefFoundError e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java
index 9bd70b5..1c1f75f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ClassUtil.java
@@ -24,6 +24,8 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.applib.internal.context._Context;
+
 import com.google.common.collect.Maps;
 
 public final class ClassUtil {
@@ -149,7 +151,7 @@ public final class ClassUtil {
             return primitiveCls;
         }
         try {
-            return Thread.currentThread().getContextClassLoader().loadClass(fullName);
+            return _Context.loadClass(fullName);
         } catch (final ClassNotFoundException e) {
             throw new RuntimeException(e);
         }
@@ -160,7 +162,7 @@ public final class ClassUtil {
             return null;
         }
         try {
-            return Thread.currentThread().getContextClassLoader().loadClass(fullName);
+            return _Context.loadClass(fullName);
         } catch (final ClassNotFoundException e) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ResourceUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ResourceUtil.java
index 7e5fc77..276adcf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ResourceUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/lang/ResourceUtil.java
@@ -21,6 +21,8 @@ package org.apache.isis.core.commons.lang;
 
 import java.io.InputStream;
 
+import org.apache.isis.applib.internal.context._Context;
+
 /**
  * Adapted from Ibatis Common, now with some additional guava stuff.
  */
@@ -29,10 +31,17 @@ public class ResourceUtil {
     private ResourceUtil(){}
 
     public static InputStream getResourceAsStream(final String resource) {
+    	
+        // try Isis's classloader
+        ClassLoader classLoader = _Context.getDefaultClassLoader();
+        InputStream is = classLoader.getResourceAsStream(resource);
+        if (is != null) {
+            return is;
+        }
 
         // try thread's classloader
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
-        InputStream is = classLoader.getResourceAsStream(resource);
+        classLoader = Thread.currentThread().getContextClassLoader();
+        is = classLoader.getResourceAsStream(resource);
         if (is != null) {
             return is;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/resource/ResourceStreamSourceContextLoaderClassPath.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/resource/ResourceStreamSourceContextLoaderClassPath.java
index b92a82a..2cad737 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/resource/ResourceStreamSourceContextLoaderClassPath.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/resource/ResourceStreamSourceContextLoaderClassPath.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.commons.resource;
 
 import java.io.InputStream;
 
+import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.core.commons.lang.StringExtensions;
 
 /**
@@ -49,7 +50,7 @@ public class ResourceStreamSourceContextLoaderClassPath extends ResourceStreamSo
 
     @Override
     protected InputStream doReadResource(final String resourcePath) {
-        final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        final ClassLoader classLoader = _Context.getDefaultClassLoader();
         final String path = StringExtensions.combinePath(prefix, resourcePath);
         return classLoader.getResourceAsStream(path);
     }
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 421f17a..02e229e 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
@@ -33,7 +33,7 @@ import com.google.common.collect.Sets;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
+import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.factory.InstanceCreationClassException;
@@ -110,8 +110,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 _Context.loadClassAndInitialize(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/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
index 48d4da9..fcfb0d8 100644
--- a/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
+++ b/core/runtime/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/spi/JdoObjectIdSerializer.java
@@ -25,13 +25,15 @@ import java.math.BigInteger;
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
+
 import javax.jdo.annotations.IdentityType;
 import javax.jdo.identity.ByteIdentity;
 import javax.jdo.identity.IntIdentity;
 import javax.jdo.identity.LongIdentity;
 import javax.jdo.identity.ObjectIdentity;
 import javax.jdo.identity.StringIdentity;
-import org.datanucleus.identity.DatastoreId;
+
+import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -39,6 +41,7 @@ import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
 import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
+import org.datanucleus.identity.DatastoreId;
 
 public final class JdoObjectIdSerializer {
     
@@ -187,7 +190,7 @@ public final class JdoObjectIdSerializer {
 
             final String clsName = distinguisher;
             try {
-                final Class<?> cls = Thread.currentThread().getContextClassLoader().loadClass(clsName);
+                final Class<?> cls = _Context.loadClass(clsName);
                 final Constructor<?> cons = cls.getConstructor(String.class);
                 final Object dnOid = cons.newInstance(keyStr);
                 return dnOid.toString();
diff --git a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecutionScope.java b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecutionScope.java
index 0b28cf4..42a3e54 100644
--- a/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecutionScope.java
+++ b/core/specsupport/src/main/java/org/apache/isis/core/specsupport/scenarios/ScenarioExecutionScope.java
@@ -16,6 +16,7 @@
  */
 package org.apache.isis.core.specsupport.scenarios;
 
+import org.apache.isis.applib.internal.context._Context;
 
 /**
  * The scope at which the specification will run; acts as a factory to create
@@ -39,7 +40,7 @@ public class ScenarioExecutionScope {
     public ScenarioExecutionScope(String scenarioExecutionClassName) {
         try {
             this.scenarioExecutionClass = (Class<? extends ScenarioExecution>) 
-                    Thread.currentThread().getContextClassLoader().loadClass(scenarioExecutionClassName);
+                    _Context.loadClass(scenarioExecutionClassName);
         } catch (ClassNotFoundException e) {
             throw new RuntimeException(e);
         }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/about/JarManifestModel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/about/JarManifestModel.java
index d78a290..c2187d0 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/about/JarManifestModel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/about/JarManifestModel.java
@@ -35,6 +35,7 @@ import com.google.common.base.CharMatcher;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
 
+import org.apache.isis.applib.internal.context._Context;
 import org.apache.isis.core.commons.lang.CloseableExtensions;
 import org.apache.isis.viewer.wicket.model.models.ModelAbstract;
 
@@ -75,7 +76,7 @@ public class JarManifestModel extends ModelAbstract<JarManifestModel> {
         
         Enumeration<?> resEnum;
         try {
-            resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
+            resEnum = _Context.getDefaultClassLoader().getResources(JarFile.MANIFEST_NAME);
         } catch (IOException e) {
             return;
         }

-- 
To stop receiving notification emails like this one, please contact
ahuber@apache.org.