This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch ISIS-1779-jax-rs-2 in repository https://gitbox.apache.org/repos/asf/isis.git
commit 1c9e21f898fb4bac431da4c6c6ef4f2574e75d9d Author: Andi Huber <ahu...@apache.org> AuthorDate: Mon Feb 19 16:51:41 2018 +0100 ISIS-1779 rebase jax-rs-2 on top of 2.0.0-M2 --- .../isis/applib/internal/context/_Context.java | 29 +++++++++- .../isis/applib/internal/reflection/_Reflect.java | 5 +- .../internal/reflection/_Reflect_Discovery.java | 25 +-------- .../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/pom.xml | 6 +- .../core/runtime/services/ServiceInstantiator.java | 4 +- .../core/runtime/system/context/IsisContext.java | 15 ++--- .../persistence/PersistenceSessionFactory.java | 10 +--- .../IsisComponentProvider.java | 33 +++++------ .../PersistenceCapableTypeFinder.java | 65 ++++++++++++++++++++++ .../datanucleus/DataNucleusLifeCycleHelper.java | 52 ----------------- .../persistence/spi/JdoObjectIdSerializer.java | 7 ++- .../scenarios/ScenarioExecutionScope.java | 3 +- .../wicket/viewer/IsisWicketApplication.java | 5 +- .../wicket/AuthenticatedWebSessionForIsis.java | 62 ++++++++++++++------- .../WicketObjectModule_bindingsStandard.java | 63 +++++++++++++-------- ...thenticatedWebSessionForIsis_Instantiation.java | 2 +- ...ageClassListDefault_RegistrationAndCaching.java | 2 +- .../ui/components/about/JarManifestModel.java | 3 +- 26 files changed, 269 insertions(+), 214 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/internal/reflection/_Reflect.java b/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect.java index e0b213d..20d63e5 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect.java +++ b/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect.java @@ -23,11 +23,10 @@ import java.lang.annotation.Annotation; import java.util.List; import java.util.Set; +import org.apache.isis.applib.internal.context._Context; import org.reflections.scanners.SubTypesScanner; import org.reflections.util.ClasspathHelper; -import org.apache.isis.applib.internal.context._Context; - /** * <h1>- internal use only -</h1> * <p> @@ -56,8 +55,6 @@ public final class _Reflect { //TODO missing java-doc public <T> Set<Class<? extends T>> getSubTypesOf(Class<T> type); - public Set<Class<?>> findPersistenceCapableTypes(); - } //TODO missing java-doc diff --git a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java b/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java index 5db08e5..fe7db50 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java +++ b/core/applib/src/main/java/org/apache/isis/applib/internal/reflection/_Reflect_Discovery.java @@ -8,15 +8,11 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.jdo.annotations.PersistenceCapable; import javax.validation.constraints.NotNull; -import com.google.common.collect.Sets; - -import org.reflections.Reflections; - import org.apache.isis.applib.internal.base._NullSafe; import org.apache.isis.applib.internal.reflection._Reflect.Discovery; +import org.reflections.Reflections; /** * @@ -84,24 +80,5 @@ class _Reflect_Discovery implements _Reflect.Discovery { .filter(_NullSafe::isPresent); } - public Set<Class<?>> findPersistenceCapableTypes() { - - Set<Class<?>> pcSet = Sets.newLinkedHashSet(); - - Set<Class<?>> persistenceCapables = reflections.getTypesAnnotatedWith(PersistenceCapable.class); - persistenceCapables.stream() - .filter(x -> !x.isAnnotation()) - .forEach(pcSet::add); - - Stream<Class<? extends Annotation>> pcMetaAnnotStream = - (Stream)persistenceCapables.stream().filter(x -> x.isAnnotation()); - pcMetaAnnotStream.map(metaAnnot -> reflections.getTypesAnnotatedWith(metaAnnot).stream()) - .flatMap(x -> x) - .filter(x -> !x.isAnnotation()) - .forEach(pcSet::add); - - return pcSet; - } - } 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/pom.xml b/core/pom.xml index ab17458..56215ae 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -90,10 +90,10 @@ <!-- Datanucleus Objectstore --> <jdo-api.version>3.2.0-m7</jdo-api.version> - <datanucleus-core.version>5.1.5</datanucleus-core.version> + <datanucleus-core.version>5.1.6</datanucleus-core.version> <datanucleus-api-jdo.version>5.1.4</datanucleus-api-jdo.version> - <datanucleus-jdo-query.version>5.0.2</datanucleus-jdo-query.version> - <datanucleus-rdbms.version>5.1.5</datanucleus-rdbms.version> + <datanucleus-jdo-query.version>5.0.4</datanucleus-jdo-query.version> + <datanucleus-rdbms.version>5.1.6</datanucleus-rdbms.version> <datanucleus-jodatime.version>5.1.0-release</datanucleus-jodatime.version> <!-- ISIS-1288: seen integration tests to fail; 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 f48bdcf..e002a81 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; @@ -111,7 +111,7 @@ public final class ServiceInstantiator { private Class<?> loadClass(final String className) { try { LOG.debug("loading class for service: {}", className); - return IsisContext.getClassLoader().loadClass(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/core/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/context/IsisContext.java index 546dcc4..a213323 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 @@ -59,10 +59,6 @@ public interface IsisContext { public static ClassLoader getClassLoader() { return _Context.getDefaultClassLoader(); } - public static void setClassLoader(ClassLoader classLoader) { - _Context.putSingleton(ClassLoader.class, classLoader); - } - // -- LIFE-CYCLING @@ -72,6 +68,7 @@ public interface IsisContext { */ public static void clear() { _Context.clear(); + resetLogging(); } // -- DEPRECATIONS @@ -90,11 +87,15 @@ public interface IsisContext { /** * TODO [andi-huber] not sure if required, initial idea was to force log4j - * re-configuration on an undeploy/deploy cycle + * to re-configure on an undeploy/deploy cycle */ static void resetLogging() { - org.apache.log4j.Logger.getRootLogger().removeAllAppenders(); - BasicConfigurator.resetConfiguration(); + try { + 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/PersistenceSessionFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionFactory.java index e9565f8..b3026da 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 @@ -168,15 +168,7 @@ public class PersistenceSessionFactory implements ApplicationScopedComponent, Fi */ @Programmatic public final void shutdown() { - if(!isInitialized()) { - return; - } - - //XXX ISIS-1756 purge any DataNucleus State - if(applicationComponents != null) { - // applicationComponents.shutdown(); - applicationComponents = null; - } + applicationComponents = null; } /** 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 7d9322b..9b2936a 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 @@ -23,17 +23,9 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import javax.annotation.Nullable; -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - import org.apache.isis.applib.AppManifest; import org.apache.isis.applib.annotation.DomainObject; import org.apache.isis.applib.annotation.DomainService; @@ -64,6 +56,13 @@ import org.apache.isis.objectstore.jdo.service.RegisterEntities; import org.apache.isis.progmodels.dflt.JavaReflectorHelper; import org.apache.isis.progmodels.dflt.ProgrammingModelFacetsJava5; +import com.google.common.base.Function; +import com.google.common.base.Joiner; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + /** * */ @@ -137,23 +136,19 @@ public abstract class IsisComponentProvider { final Discovery discovery = _Reflect.discover(moduleAndFrameworkPackages); final Set<Class<?>> domainServiceTypes = discovery.getTypesAnnotatedWith(DomainService.class); - final Set<Class<?>> persistenceCapableTypes = discovery.findPersistenceCapableTypes(); + final Set<Class<?>> persistenceCapableTypes = PersistenceCapableTypeFinder.find(discovery); final Set<Class<? extends FixtureScript>> fixtureScriptTypes = discovery.getSubTypesOf(FixtureScript.class); final Set<Class<?>> mixinTypes = Sets.newHashSet(); mixinTypes.addAll(discovery.getTypesAnnotatedWith(Mixin.class)); final Set<Class<?>> domainObjectTypes = discovery.getTypesAnnotatedWith(DomainObject.class); - mixinTypes.addAll( - domainObjectTypes.stream().filter(input -> { - if (input == null) { - return false; - } - final DomainObject annotation = input.getAnnotation(DomainObject.class); - return annotation.nature() == Nature.MIXIN; - }).collect(Collectors.toList()) - ); - + domainObjectTypes.stream() + .filter(input -> { + final DomainObject annotation = input.getAnnotation(DomainObject.class); + return annotation.nature() == Nature.MIXIN; + }) + .forEach(mixinTypes::add); // add in any explicitly registered services... domainServiceTypes.addAll(appManifest.getAdditionalServices()); diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java new file mode 100644 index 0000000..1fbf533 --- /dev/null +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/PersistenceCapableTypeFinder.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.isis.core.runtime.systemusinginstallers; + +import java.lang.annotation.Annotation; +import java.util.LinkedHashSet; +import java.util.Set; + +import javax.jdo.annotations.PersistenceCapable; + +import org.apache.isis.applib.internal.reflection._Reflect.Discovery; + +/** + * + * Package private helper class. Finds PersistenceCapable types. + * + */ +class PersistenceCapableTypeFinder { + + @SuppressWarnings("unchecked") + static Set<Class<?>> find(Discovery discovery) { + + final Set<Class<?>> types = new LinkedHashSet<>(); + + discovery.getTypesAnnotatedWith(PersistenceCapable.class).stream() + .forEach(type->{ + + if(type.isAnnotation()) { + + // We have an annotation, that is annotated with @PersistenceCapable, + // this requires special treatment: + // Search for any classes annotated with this (meta-)annotation. + + discovery.getTypesAnnotatedWith((Class<? extends Annotation>) type).stream() + .filter(x->!x.isAnnotation()) + .forEach(types::add); + + } else { + + types.add(type); + + } + }); + + return types; + } + +} 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..4547a49 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 @@ -49,29 +49,6 @@ public class DataNucleusLifeCycleHelper { 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 +61,6 @@ 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); - } - } - } 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 ebb4d40..e185908 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 { @@ -164,7 +167,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-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java index 9114767..ecf8d4c 100644 --- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java +++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java @@ -30,6 +30,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.Future; +import org.apache.isis.applib.internal.context._Context; import org.apache.isis.core.commons.authentication.AuthenticationSession; import org.apache.isis.core.commons.config.IsisConfiguration; import org.apache.isis.core.commons.config.IsisConfigurationDefault; @@ -334,7 +335,7 @@ public class IsisWicketApplication try { super.init(); - IsisContext.setClassLoader(this.getClass().getClassLoader()); + _Context.putSingleton(ClassLoader.class, this.getClass().getClassLoader()); futures = startBackgroundInitializationThreads(); @@ -864,7 +865,7 @@ public class IsisWicketApplication } getServletContext().setAttribute(WebAppConstants.ISIS_SESSION_FACTORY, null); super.onDestroy(); - IsisContext.destroy(); + IsisContext.clear(); } catch(final RuntimeException ex) { // symmetry with #init() LOG.error("Failed to destroy", ex); diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/AuthenticatedWebSessionForIsis.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/AuthenticatedWebSessionForIsis.java index d3470db..7c1fd0c 100644 --- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/AuthenticatedWebSessionForIsis.java +++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/AuthenticatedWebSessionForIsis.java @@ -22,11 +22,7 @@ package org.apache.isis.viewer.wicket.viewer.integration.wicket; import java.util.Arrays; import java.util.List; -import org.apache.wicket.Session; -import org.apache.wicket.authroles.authentication.AuthenticatedWebSession; -import org.apache.wicket.authroles.authorization.strategies.role.Roles; -import org.apache.wicket.request.Request; -import org.apache.wicket.request.cycle.RequestCycle; +import javax.validation.constraints.NotNull; import org.apache.isis.applib.clock.Clock; import org.apache.isis.applib.services.session.SessionLoggingService; @@ -40,6 +36,11 @@ import org.apache.isis.viewer.wicket.model.models.BookmarkedPagesModel; import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel; import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModelProvider; import org.apache.isis.viewer.wicket.ui.pages.BookmarkedPagesModelProvider; +import org.apache.wicket.Session; +import org.apache.wicket.authroles.authentication.AuthenticatedWebSession; +import org.apache.wicket.authroles.authorization.strategies.role.Roles; +import org.apache.wicket.request.Request; +import org.apache.wicket.request.cycle.RequestCycle; /** * Viewer-specific implementation of {@link AuthenticatedWebSession}, which @@ -169,21 +170,35 @@ public class AuthenticatedWebSessionForIsis extends AuthenticatedWebSession impl final SessionLoggingService.Type type, final String username, final SessionLoggingService.CausedBy causedBy) { + + + final IsisSessionFactory isisSessionFactory = getIsisSessionFactoryIfAny(); final SessionLoggingService sessionLoggingService = getSessionLoggingService(); - if (sessionLoggingService != null) { - getIsisSessionFactory().doInSession(new Runnable() { - @Override - public void run() { - // use hashcode as session identifier, to avoid re-binding http sessions if using Session#getId() - int sessionHashCode = System.identityHashCode(AuthenticatedWebSessionForIsis.this); - sessionLoggingService.log(type, username, Clock.getTimeAsDateTime().toDate(), causedBy, Integer.toString(sessionHashCode)); - } - }); - } + + final Runnable loggingTask = ()->{ + // use hashcode as session identifier, to avoid re-binding http sessions if using Session#getId() + int sessionHashCode = System.identityHashCode(AuthenticatedWebSessionForIsis.this); + sessionLoggingService.log(type, username, Clock.getTimeAsDateTime().toDate(), causedBy, Integer.toString(sessionHashCode)); + }; + + if(isisSessionFactory!=null) { + isisSessionFactory.doInSession(loggingTask); + } else { + loggingTask.run(); + } + } - protected SessionLoggingService getSessionLoggingService() { - return getIsisSessionFactory().getServicesInjector().lookupService(SessionLoggingService.class); + protected @NotNull SessionLoggingService getSessionLoggingService() { + try { + final SessionLoggingService service = getIsisSessionFactory().getServicesInjector() + .lookupService(SessionLoggingService.class); + return (service!=null) ? service : new SessionLoggingService.Stderr(); + } catch (Exception e) { + // fallback to System.err + return new SessionLoggingService.Stderr(); + } + } @Override @@ -191,11 +206,20 @@ public class AuthenticatedWebSessionForIsis extends AuthenticatedWebSession impl // do nothing here because this will lead to problems with Shiro // see https://issues.apache.org/jira/browse/ISIS-1018 } + + // -- HELPER - - IsisSessionFactory getIsisSessionFactory() { + private IsisSessionFactory getIsisSessionFactory() { return IsisContext.getSessionFactory(); } + + private IsisSessionFactory getIsisSessionFactoryIfAny() { + try { + return getIsisSessionFactory(); + } catch (Exception e) { + return null; + } + } } diff --git a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java index 6121101..d9cb9e3 100644 --- a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java +++ b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/WicketObjectModule_bindingsStandard.java @@ -26,6 +26,7 @@ import static org.junit.Assert.assertThat; import java.util.Arrays; import java.util.Collection; +import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; @@ -34,7 +35,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; - +import org.apache.isis.core.commons.config.IsisConfiguration; +import org.apache.isis.core.commons.config.IsisConfigurationDefault; import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistrar; import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry; import org.apache.isis.viewer.wicket.ui.pages.PageClassList; @@ -47,32 +49,45 @@ import org.apache.isis.viewer.wicket.viewer.registries.pages.PageClassRegistryDe @RunWith(Parameterized.class) public class WicketObjectModule_bindingsStandard { - private IsisWicketModule wicketObjectsModule; - private Injector injector; - private final Class<?> from; - private final Class<?> to; + private IsisWicketModule wicketObjectsModule; + private Injector injector; + private final Class<?> from; + private final Class<?> to; + + @Parameters + public static Collection<Object[]> params() { + return Arrays.asList(new Object[][] { + { ComponentFactoryRegistrar.class, ComponentFactoryRegistrarDefault.class }, + { ComponentFactoryRegistry.class, ComponentFactoryRegistryDefault.class }, + { PageClassList.class, PageClassListDefault.class }, + { PageClassRegistry.class, PageClassRegistryDefault.class }, + }); + } + + public WicketObjectModule_bindingsStandard(final Class<?> from, final Class<?> to) { + this.from = from; + this.to = to; + } - @Parameters - public static Collection<Object[]> params() { - return Arrays.asList(new Object[][] { { ComponentFactoryRegistrar.class, ComponentFactoryRegistrarDefault.class }, { ComponentFactoryRegistry.class, ComponentFactoryRegistryDefault.class }, { PageClassList.class, PageClassListDefault.class }, - { PageClassRegistry.class, PageClassRegistryDefault.class }, }); - } + @Before + public void setUp() throws Exception { + wicketObjectsModule = new IsisWicketModule(); + injector = Guice.createInjector(wicketObjectsModule, new ConfigModule()); + } - public WicketObjectModule_bindingsStandard(final Class<?> from, final Class<?> to) { - this.from = from; - this.to = to; - } + @Test + public void binding() { + final Object instance = injector.getInstance(from); + assertThat(instance, is(instanceOf(to))); + } - @Before - public void setUp() throws Exception { - wicketObjectsModule = new IsisWicketModule(); - injector = Guice.createInjector(wicketObjectsModule); - } + // -- CONFIGURATION BINDING - @Test - public void binding() { - final Object instance = injector.getInstance(from); - assertThat(instance, is(instanceOf(to))); - } + private static class ConfigModule extends AbstractModule { + @Override + protected void configure() { + bind(IsisConfiguration.class).to(IsisConfigurationDefault.class); + } + } } diff --git a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/app/wicket/AuthenticatedWebSessionForIsis_Instantiation.java b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/app/wicket/AuthenticatedWebSessionForIsis_Instantiation.java index 4f5c860..0c5efde 100644 --- a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/app/wicket/AuthenticatedWebSessionForIsis_Instantiation.java +++ b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/app/wicket/AuthenticatedWebSessionForIsis_Instantiation.java @@ -55,7 +55,7 @@ public class AuthenticatedWebSessionForIsis_Instantiation { new AuthenticatedWebSessionForIsis(stubRequest); } - @Test(expected = IllegalArgumentException.class) + @Test(expected = Exception.class) public void requestMustBeProvided() { new AuthenticatedWebSessionForIsis(null); } diff --git a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/pages/PageClassListDefault_RegistrationAndCaching.java b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/pages/PageClassListDefault_RegistrationAndCaching.java index b482435..1898edd 100644 --- a/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/pages/PageClassListDefault_RegistrationAndCaching.java +++ b/core/viewer-wicket-impl/src/test/java/org/apache/isis/viewer/wicket/viewer/pages/PageClassListDefault_RegistrationAndCaching.java @@ -62,7 +62,7 @@ public class PageClassListDefault_RegistrationAndCaching { registryImpl.registerPage(PageType.ACTION_PROMPT, TestingActionPage.class); final Class<? extends Page> pageClass = registryImpl.getPageClass(PageType.ACTION_PROMPT); - assertThat(pageClass, is(instanceOf(TestingActionPage.class))); + assertThat(pageClass, is(org.hamcrest.Matchers.equalTo(TestingActionPage.class))); } } 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.