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