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 2019/10/13 08:06:15 UTC
[isis] branch v2 updated: ISIS-2158: intermediate commit,
breaks some smoketests
This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/v2 by this push:
new ed7445c ISIS-2158: intermediate commit, breaks some smoketests
ed7445c is described below
commit ed7445c9e7706237d40cded423b72aaf64890c1f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Oct 13 10:05:58 2019 +0200
ISIS-2158: intermediate commit, breaks some smoketests
- simplifies interaction between spec-loader and type-registry
- speed up 'isManagedBean' check, by no longer using reflection, when we
already can ask a fully populated hash-map
- converts DefaultedFacet to use new 'IsisConfiguration'
---
.../services/confview/ConfigurationMenu.java | 1 -
.../environment/IsisSystemEnvironment.java | 19 ++++
.../org/apache/isis/config/IsisConfigModule.java | 17 +---
.../IsisBeanFactoryPostProcessorForSpring.java | 7 +-
.../isis/config/registry/IsisBeanTypeRegistry.java | 101 ++++++++++++---------
.../metamodel/MetaModelContext_forTesting.java | 15 ++-
.../object/defaults/DefaultsProviderUtil.java | 46 +++++++---
.../annotcfg/DefaultedFacetAnnotation.java | 14 ++-
...tedFacetAnnotationElseConfigurationFactory.java | 16 ++--
.../services/registry/ServiceRegistryDefault.java | 17 ++--
.../specloader/SpecificationLoaderDefault.java | 24 ++---
.../metamodel/facets/AbstractFacetFactoryTest.java | 1 +
.../ServiceInjectorDefaultTest_usingFields.java | 8 +-
...InjectorDefaultTest_validateServices_happy.java | 6 +-
.../services/ServiceInjectorLegacyTest.java | 8 +-
.../SpecificationLoaderTestAbstract.java | 10 ++
.../isis/runtime/system/context/IsisContext.java | 10 --
.../wicket/viewer/IsisWicketApplication.java | 8 +-
.../bootstrapping/AutoConfigurationTest.java | 15 +--
.../domainmodel/SpecloaderPerformanceTest.java | 3 +-
.../bootstrapping/builtin-singleton.list | 2 +-
21 files changed, 208 insertions(+), 140 deletions(-)
diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
index a3a6ae7..6fefb67 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/confview/ConfigurationMenu.java
@@ -56,7 +56,6 @@ public class ConfigurationMenu {
)
@MemberOrder(sequence = "500.900.1")
public Set<ConfigurationProperty> configuration(){
- System.out.println("############## CALL");
return configurationService.allProperties();
}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
index d5aa65f..9de0d2c 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
@@ -19,13 +19,17 @@
package org.apache.isis.commons.internal.environment;
import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
import javax.inject.Singleton;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.apache.isis.commons.internal.context._Context;
+import org.apache.isis.commons.internal.ioc.spring._Spring;
import lombok.val;
import lombok.extern.log4j.Log4j2;
@@ -38,6 +42,9 @@ import lombok.extern.log4j.Log4j2;
*/
@Service @Singleton @Log4j2
public class IsisSystemEnvironment {
+
+ @Autowired
+ private ApplicationContext springContext;
/**
* @deprecated - this is provided only as a stepping stone for code that currently uses static method calls
@@ -52,6 +59,10 @@ public class IsisSystemEnvironment {
@PostConstruct
public void postConstruct() {
+
+
+ _Spring.reinit(springContext);
+
// when NOT bootstrapped with Spring, postConstruct() never gets called
// when bootstrapped with Spring, postConstruct() must happen before any call to get() above,
@@ -64,6 +75,14 @@ public class IsisSystemEnvironment {
this.setUnitTesting(primed.isUnitTesting());
}
_Context.putSingleton(IsisSystemEnvironment.class, this);
+
+ System.err.println("####### IsisSystemEnvironment postconst " + this.hashCode());
+
+ }
+
+ @PreDestroy
+ public void preDestroy() {
+ System.err.println("####### IsisSystemEnvironment destroy " + this.hashCode());
}
@EventListener(ContextClosedEvent.class)
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java b/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
index 34cf4b3..a577d4a 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
@@ -21,17 +21,14 @@ package org.apache.isis.config;
import javax.inject.Singleton;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.env.ConfigurableEnvironment;
-import org.apache.isis.commons.internal.context._Context;
import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
import org.apache.isis.commons.internal.ioc.spring._Spring;
import org.apache.isis.config.internal._Config;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
import lombok.val;
import lombok.extern.log4j.Log4j2;
@@ -50,28 +47,16 @@ public class IsisConfigModule {
/** @deprecated this is just a historical workaround */
@Bean @Singleton
public IsisConfigurationLegacy getConfigurationLegacy(
- ApplicationContext springContext,
ConfigurableEnvironment configurableEnvironment,
IsisSystemEnvironment isisSystemEnvironment) {
- // ensures a well defined precondition
- {
- val beanTypeRegistry = _Context.getIfAny(IsisBeanTypeRegistry.class);
- _Context.clear(); // special code in IsisBeanTypeRegistry.close() prevents auto-closing
- if(beanTypeRegistry!=null) {
- _Context.putSingleton(IsisBeanTypeRegistry.class, beanTypeRegistry);
- }
- }
-
- _Context.putSingleton(ApplicationContext.class, springContext);
+ _Config.clear();
val rawKeyValueMap = _Spring.copySpringEnvironmentToMap(configurableEnvironment);
_Config.putAll(rawKeyValueMap);
log.info("Spring's context was passed over to Isis");
-
-
// dump config to log
if(log.isInfoEnabled() && !isisSystemEnvironment.isUnitTesting()) {
log.info("\n" + _Config.getConfiguration().toStringFormatted());
diff --git a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
index bd18d1e..549391c 100644
--- a/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
+++ b/core/config/src/main/java/org/apache/isis/config/beans/IsisBeanFactoryPostProcessorForSpring.java
@@ -59,7 +59,7 @@ public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostPro
for (String beanDefinitionName : registry.getBeanDefinitionNames()) {
- log.debug(()->"processing: " + beanDefinitionName);
+ log.debug("processing bean definition {}", beanDefinitionName);
val beanDefinition = registry.containsBeanDefinition(beanDefinitionName)
? registry.getBeanDefinition(beanDefinitionName)
@@ -79,12 +79,13 @@ public class IsisBeanFactoryPostProcessorForSpring implements BeanFactoryPostPro
if(beanNameOverride!=null) {
registry.removeBeanDefinition(beanDefinitionName);
registry.registerBeanDefinition(beanNameOverride, beanDefinition);
+ log.debug("renaming bean {} -> {}", beanDefinitionName, beanNameOverride);
}
- log.debug(()->String.format("renaming %s -> %s", beanDefinitionName, beanNameOverride));
+
} else {
registry.removeBeanDefinition(beanDefinitionName);
- log.debug(()->"removing: " + beanDefinitionName);
+ log.debug("vetoing bean {}", beanDefinitionName);
}
}
diff --git a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
index fef6507..e68bcf9 100644
--- a/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
+++ b/core/config/src/main/java/org/apache/isis/config/registry/IsisBeanTypeRegistry.java
@@ -26,7 +26,6 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
-import java.util.stream.Stream;
import javax.enterprise.inject.Vetoed;
@@ -38,12 +37,12 @@ import org.apache.isis.applib.annotation.Mixin;
import org.apache.isis.applib.annotation.ViewModel;
import org.apache.isis.commons.internal.base._Strings;
import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Sets;
import org.apache.isis.commons.internal.components.ApplicationScopedComponent;
import org.apache.isis.commons.internal.components.SessionScopedComponent;
import org.apache.isis.commons.internal.components.TransactionScopedComponent;
import org.apache.isis.commons.internal.context._Context;
import org.apache.isis.commons.internal.ioc.BeanSort;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
import org.apache.isis.commons.internal.reflection._Reflect;
import org.apache.isis.config.beans.IsisComponentScanInterceptor;
@@ -68,65 +67,88 @@ public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor,
}
/**
- * inbox for introspection, as used by the spec loader
+ * Inbox for introspection, as used by the SpecificationLoader
*/
- private final Map<Class<?>, BeanSort> inbox = new HashMap<>();
+ private final Map<Class<?>, BeanSort> introspectableTypes = new HashMap<>();
- @Getter private final Set<Class<?>> beanTypes = new HashSet<>();
+ // -- DISTINCT CATEGORIES OF BEAN SORTS
+
+ @Getter private final Set<Class<?>> managedBeanTypes = new HashSet<>();
@Getter private final Set<Class<?>> entityTypes = new HashSet<>();
@Getter private final Set<Class<?>> mixinTypes = new HashSet<>();
@Getter private final Set<Class<?>> viewModelTypes = new HashSet<>();
+ @Getter private final Set<Class<?>> vetoedTypes = _Sets.newConcurrentHashSet();
- private final List<Set<? extends Class<? extends Object>>> allTypeSets = _Lists.of(
- beanTypes,
+ private final List<Set<? extends Class<? extends Object>>> allCategorySets = _Lists.of(
+ managedBeanTypes,
entityTypes,
mixinTypes,
- viewModelTypes
+ viewModelTypes,
+ vetoedTypes
);
@Override
public void close() {
- if(!_Spring.isContextAvailable()) {
- // this instance needs to survive a _Context.clear() call when Spring's context
- // gets passed over to Isis
- return;
- }
+// if(!_Spring.isContextAvailable()) {
+// // this instance needs to survive a _Context.clear() call when Spring's context
+// // gets passed over to Isis
+// return;
+// }
- inbox.clear();
- allTypeSets.forEach(Set::clear);
+ introspectableTypes.clear();
+ allCategorySets.forEach(Set::clear);
}
// -- INBOX
- public void addToInbox(BeanSort sort, Class<?> type) {
- synchronized (inbox) {
- inbox.put(type, sort);
+ public void addIntrospectableType(BeanSort sort, Class<?> type) {
+ synchronized (introspectableTypes) {
+ introspectableTypes.put(type, sort);
+
+ switch (sort) {
+ case MANAGED_BEAN:
+ managedBeanTypes.add(type);
+ return;
+ case MIXIN:
+ mixinTypes.add(type);
+ return;
+ case ENTITY:
+ entityTypes.add(type); //TODO redundant
+ return;
+ case VIEW_MODEL:
+ viewModelTypes.add(type);
+ return;
+
+ //XXX skip introspection for these
+ case COLLECTION:
+ case VALUE:
+ case UNKNOWN:
+ break;
+ }
+
}
}
- public static boolean repeatedTesting = false;
-
- /**
- * Implemented as a one-shot, that clears the inbox afterwards.
- * @return
- */
- public Stream<Map.Entry<Class<?>, BeanSort>> streamAndClearInbox() {
+ public Map<Class<?>, BeanSort> snapshotIntrospectableTypes() {
final Map<Class<?>, BeanSort> defensiveCopy;
- synchronized (inbox) {
- defensiveCopy = new HashMap<>(inbox);
- if(!repeatedTesting) inbox.clear();
+ synchronized (introspectableTypes) {
+ defensiveCopy = new HashMap<>(introspectableTypes);
}
if(log.isDebugEnabled()) {
defensiveCopy.forEach((k, v)->{
- log.debug("to be specloaded: {} [{}]", k.getName(), v.name());
+ log.debug("to be introspected: {} [{}]", k.getName(), v.name());
});
}
- return defensiveCopy.entrySet().stream();
+ return defensiveCopy;
+ }
+
+ public void veto(Class<?> type) {
+ vetoedTypes.add(type);
}
// -- FILTER
@@ -164,30 +186,23 @@ public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor,
@Override
public boolean isManagedBean(Class<?> type) {
- val beanSort = quickClassify(type);
- return beanSort.isManagedBean();
+ if(vetoedTypes.contains(type)) { // vetos are coming from the spec-loader during init
+ return false;
+ }
+ return managedBeanTypes.contains(type);
}
// -- HELPER
- // don't categorize this early, instead push candidate classes onto a queue for
- // later processing when the SpecLoader initializes.
private void intercept(Class<?> type) {
val beanSort = quickClassify(type);
- if(beanSort.isEntity()) {
- // event though passed to the inbox for introspection we populate this
- // for the persistence layer not having to wait on the spec -loader for
- // processing of the inbox
- entityTypes.add(type);
- }
-
val isToBeRegistered = beanSort.isManagedBean();
val isToBeInspected = !beanSort.isUnknown();
if(isToBeInspected) {
- addToInbox(beanSort, type);
+ addIntrospectableType(beanSort, type);
}
if(log.isDebugEnabled()) {
@@ -297,4 +312,6 @@ public final class IsisBeanTypeRegistry implements IsisComponentScanInterceptor,
}
+
+
}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
index 3851d03..32ed533 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
@@ -22,6 +22,8 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
+import org.springframework.core.env.AbstractEnvironment;
+
import org.apache.isis.applib.services.i18n.TranslationService;
import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.applib.services.registry.ServiceRegistry;
@@ -67,7 +69,7 @@ final class MetaModelContext_forTesting implements MetaModelContext {
.build();
@Builder.Default
- private IsisConfiguration configuration = new IsisConfiguration(); // just config defaults
+ private IsisConfiguration configuration = newIsisConfiguration(); // just config defaults
private SpecificationLoader specificationLoader;
@@ -146,5 +148,16 @@ final class MetaModelContext_forTesting implements MetaModelContext {
return Stream.concat(fields.stream(), getSingletons().stream())
.filter(_NullSafe::isPresent);
}
+
+ private static IsisConfiguration newIsisConfiguration() {
+ val config = new IsisConfiguration();
+ config.setEnvironment(new AbstractEnvironment() {
+ @Override
+ public String getProperty(String key) {
+ return _Config.getConfiguration().getString(key);
+ }
+ });
+ return config;
+ }
}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java
index 4f63145..19dbc10 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/DefaultsProviderUtil.java
@@ -21,11 +21,12 @@ package org.apache.isis.metamodel.facets.object.defaults;
import org.apache.isis.applib.adapters.DefaultsProvider;
import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.config.internal._Config;
+import org.apache.isis.config.IsisConfiguration;
import org.apache.isis.metamodel.commons.ClassUtil;
import org.apache.isis.metamodel.facetapi.FacetHolder;
+import lombok.val;
+
public final class DefaultsProviderUtil {
private DefaultsProviderUtil() {
@@ -34,18 +35,41 @@ public final class DefaultsProviderUtil {
public static final String DEFAULTS_PROVIDER_NAME_KEY_PREFIX = "isis.reflector.java.facets.defaulted.";
public static final String DEFAULTS_PROVIDER_NAME_KEY_SUFFIX = ".providerName";
- public static String defaultsProviderNameFromConfiguration(final Class<?> type) {
-
- final IsisConfigurationLegacy configuration = _Config.getConfiguration();
+ public static String defaultsProviderNameFromConfiguration(
+ final IsisConfiguration configuration,
+ final Class<?> type) {
- final String key = DEFAULTS_PROVIDER_NAME_KEY_PREFIX + type.getCanonicalName() + DEFAULTS_PROVIDER_NAME_KEY_SUFFIX;
- final String defaultsProviderName = configuration.getString(key);
- return !_Strings.isNullOrEmpty(defaultsProviderName) ? defaultsProviderName : null;
+ val key = DEFAULTS_PROVIDER_NAME_KEY_PREFIX +
+ type.getCanonicalName() +
+ DEFAULTS_PROVIDER_NAME_KEY_SUFFIX;
+
+ val defaultsProviderName = configuration
+ .getEnvironment()
+ .getProperty(key);
+
+ return !_Strings.isNullOrEmpty(defaultsProviderName)
+ ? defaultsProviderName
+ : null;
}
- public static Class<?> defaultsProviderOrNull(final Class<?> candidateClass, final String classCandidateName) {
- final Class<?> type = candidateClass != null ? ClassUtil.implementingClassOrNull(candidateClass.getName(), DefaultsProvider.class, FacetHolder.class) : null;
- return type != null ? type : ClassUtil.implementingClassOrNull(classCandidateName, DefaultsProvider.class, FacetHolder.class);
+ public static Class<?> defaultsProviderOrNull(
+ final Class<?> candidateClass,
+ final String classCandidateName) {
+
+ val type = candidateClass != null
+ ? ClassUtil.implementingClassOrNull(
+ candidateClass.getName(),
+ DefaultsProvider.class,
+ FacetHolder.class)
+
+ : null;
+
+ return type != null
+ ? type
+ : ClassUtil.implementingClassOrNull(
+ classCandidateName,
+ DefaultsProvider.class,
+ FacetHolder.class);
}
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
index 88e1f7e..e99f755 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotation.java
@@ -21,19 +21,21 @@ package org.apache.isis.metamodel.facets.object.defaults.annotcfg;
import org.apache.isis.applib.annotation.Defaulted;
import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.config.IsisConfiguration;
import org.apache.isis.metamodel.facetapi.FacetHolder;
import org.apache.isis.metamodel.facets.object.defaults.DefaultedFacetAbstract;
import org.apache.isis.metamodel.facets.object.defaults.DefaultsProviderUtil;
public class DefaultedFacetAnnotation extends DefaultedFacetAbstract {
- private static String providerName(final Class<?> annotatedClass) {
+ private static String providerName(final IsisConfiguration config, final Class<?> annotatedClass) {
+
final Defaulted annotation = annotatedClass.getAnnotation(Defaulted.class);
final String providerName = annotation.defaultsProviderName();
if (!_Strings.isNullOrEmpty(providerName)) {
return providerName;
}
- return DefaultsProviderUtil.defaultsProviderNameFromConfiguration(annotatedClass);
+ return DefaultsProviderUtil.defaultsProviderNameFromConfiguration(config, annotatedClass);
}
private static Class<?> providerClass(final Class<?> annotatedClass) {
@@ -41,8 +43,12 @@ public class DefaultedFacetAnnotation extends DefaultedFacetAbstract {
return annotation.defaultsProviderClass();
}
- public DefaultedFacetAnnotation(final Class<?> annotatedClass, final FacetHolder holder) {
- this(providerName(annotatedClass), providerClass(annotatedClass), holder);
+ public DefaultedFacetAnnotation(
+ final IsisConfiguration config,
+ final Class<?> annotatedClass,
+ final FacetHolder holder) {
+
+ this(providerName(config, annotatedClass), providerClass(annotatedClass), holder);
}
private DefaultedFacetAnnotation(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
index fb9c96f..1e26690 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
@@ -29,6 +29,8 @@ import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
import org.apache.isis.metamodel.facets.object.defaults.DefaultedFacetAbstract;
import org.apache.isis.metamodel.facets.object.defaults.DefaultsProviderUtil;
+import lombok.val;
+
public class DefaultedFacetAnnotationElseConfigurationFactory extends FacetFactoryAbstract {
@@ -42,18 +44,20 @@ public class DefaultedFacetAnnotationElseConfigurationFactory extends FacetFacto
}
private DefaultedFacetAbstract create(final Class<?> cls, final FacetHolder holder) {
- final Defaulted annotation = Annotations.getAnnotation(cls, Defaulted.class);
+ val defaultedAnnot = Annotations.getAnnotation(cls, Defaulted.class);
+ val config = super.getConfiguration();
+
// create from annotation, if present
- if (annotation != null) {
- final DefaultedFacetAbstract facet = new DefaultedFacetAnnotation(cls, holder);
- if (facet.isValid()) {
- return facet;
+ if (defaultedAnnot != null) {
+ val defaultedFacet = new DefaultedFacetAnnotation(config, cls, holder);
+ if (defaultedFacet.isValid()) {
+ return defaultedFacet;
}
}
// otherwise, try to create from configuration, if present
- final String providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(cls);
+ val providerName = DefaultsProviderUtil.defaultsProviderNameFromConfiguration(config, cls);
if (!_Strings.isNullOrEmpty(providerName)) {
final DefaultedFacetFromConfiguration facet = new DefaultedFacetFromConfiguration(providerName, holder);
if (facet.isValid()) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
index 1586955..e2ebe73 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
@@ -31,9 +31,10 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
import org.apache.isis.commons.internal.base._Lazy;
import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.commons.internal.debug._Probe;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
import org.apache.isis.commons.internal.ioc.spring._Spring;
-import org.apache.isis.config.IsisConfigurationLegacy;
import org.apache.isis.config.registry.IsisBeanTypeRegistry;
import lombok.val;
@@ -45,8 +46,8 @@ import lombok.val;
public final class ServiceRegistryDefault implements ServiceRegistry {
//XXX to enforce provisioning order, this is a depends-on relationship!
- // keep as long as IsisConfigurationLegacy is used
- @Inject private IsisConfigurationLegacy isisConfigurationLegacy;
+ @SuppressWarnings("unused")
+ @Inject private IsisSystemEnvironment isisSystemEnvironment;
@Override
public Optional<ManagedBeanAdapter> lookupRegisteredBeanById(String id) {
@@ -64,20 +65,24 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
private final _Lazy<Map<String, ManagedBeanAdapter>> managedBeansById =
_Lazy.threadSafe(this::enumerateManagedBeans);
+ private final static _Probe probe = _Probe.maxCallsThenIgnore(5).label("service reg");
+
private Map<String, ManagedBeanAdapter> enumerateManagedBeans() {
+ probe.println("#### enumerate");
+
val filter = IsisBeanTypeRegistry.current();
- val map = _Maps.<String, ManagedBeanAdapter>newHashMap();
+ val managedBeanAdapterByName = _Maps.<String, ManagedBeanAdapter>newHashMap();
_Spring.streamAllBeans()
.filter(_NullSafe::isPresent)
.filter(bean->filter.isManagedBean(bean.getBeanClass())) // do not register unknown sort
.forEach(bean->{
val id = bean.getId();
- map.put(id, bean);
+ managedBeanAdapterByName.put(id, bean);
});
- return map;
+ return managedBeanAdapterByName;
}
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index 6907435..35544c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -32,6 +32,7 @@ import org.apache.isis.commons.internal.base._Blackhole;
import org.apache.isis.commons.internal.base._Lazy;
import org.apache.isis.commons.internal.base._Timing;
import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.debug._Probe;
import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
import org.apache.isis.config.IsisConfiguration;
import org.apache.isis.config.registry.IsisBeanTypeRegistry;
@@ -142,29 +143,26 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
log.info(" - categorizing types from class-path scan");
- typeRegistry.streamAndClearInbox().forEach(entry->{
+ typeRegistry.snapshotIntrospectableTypes().entrySet()
+ .forEach(entry->{
val type = entry.getKey();
val sort = entry.getValue();
val spec = loadSpecification(type, IntrospectionState.NOT_INTROSPECTED);
- if(spec!=null) scannedSpecs.add(spec);
+ if(spec!=null) {
+ scannedSpecs.add(spec);
+ } else {
+ typeRegistry.veto(type);
+ }
switch (sort) {
case MANAGED_BEAN:
- typeRegistry.getBeanTypes().add(type);
domainServiceSpecs.add(spec);
return;
case MIXIN:
- typeRegistry.getMixinTypes().add(type);
- domainObjectSpecs.add(spec);
- return;
case ENTITY:
- typeRegistry.getEntityTypes().add(type);
- domainObjectSpecs.add(spec);
- return;
case VIEW_MODEL:
- typeRegistry.getViewModelTypes().add(type);
domainObjectSpecs.add(spec);
return;
@@ -317,6 +315,8 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
}
// -- HELPER
+
+ private final static _Probe probe = _Probe.maxCallsThenIgnore(5).label("specloader");
/**
* Creates the appropriate type of {@link ObjectSpecification}.
@@ -331,10 +331,12 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
} else {
- final FacetedMethodsBuilderContext facetedMethodsBuilderContext =
+ val facetedMethodsBuilderContext =
new FacetedMethodsBuilderContext(
this, facetProcessor);
+ probe.println("#### check is managed");
+
val isManagedBean = IsisBeanTypeRegistry.current().isManagedBean(cls);
objectSpec = new ObjectSpecificationDefault(
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
index ae64349..f715811 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
@@ -27,6 +27,7 @@ import org.junit.Rule;
import org.apache.isis.applib.Identifier;
import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.config.IsisConfiguration;
import org.apache.isis.metamodel.MetaModelContext;
import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
import org.apache.isis.metamodel.facetapi.FacetHolder;
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java
index 0409437..a128b77 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_usingFields.java
@@ -28,11 +28,14 @@ import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ActiveProfiles;
import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.applib.services.repository.RepositoryService;
import org.apache.isis.config.IsisConfigModule;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
import org.apache.isis.metamodel.services.registry.ServiceRegistryDefault;
import static org.hamcrest.Matchers.any;
@@ -42,6 +45,7 @@ import lombok.Getter;
@ActiveProfiles("test")
@SpringBootTest(classes = {
+ IsisBeanFactoryPostProcessorForSpring.class,
IsisConfigModule.class,
ServiceInjectorDefault.class,
ServiceRegistryDefault.class,
@@ -50,8 +54,8 @@ import lombok.Getter;
},
properties = {
"isis.services.injector.setPrefix=true"
-}
- )
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
class ServiceInjectorDefaultTest_usingFields {
@Configuration
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
index 33c3bad..4f497d5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices_happy.java
@@ -26,6 +26,8 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ActiveProfiles;
import org.apache.isis.applib.annotation.DomainService;
@@ -46,8 +48,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
},
properties = {
"isis.services.injector.setPrefix=true"
-}
- )
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
class ServiceInjectorDefaultTest_validateServices_happy {
// -- SCENARIO
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java
index 9151916..6f48e79 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorLegacyTest.java
@@ -29,14 +29,16 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ActiveProfiles;
import org.apache.isis.applib.services.inject.ServiceInjector;
import org.apache.isis.applib.services.registry.ServiceRegistry;
import org.apache.isis.applib.services.repository.RepositoryService;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
import org.apache.isis.config.IsisConfigModule;
import org.apache.isis.config.IsisConfiguration;
+import org.apache.isis.config.beans.IsisBeanFactoryPostProcessorForSpring;
import org.apache.isis.metamodel.services.registry.ServiceRegistryDefault;
import org.apache.isis.metamodel.spec.InjectorMethodEvaluator;
import org.apache.isis.metamodel.specloader.InjectorMethodEvaluatorDefault;
@@ -49,6 +51,7 @@ import lombok.val;
@ActiveProfiles("test")
@SpringBootTest(classes = {
+ IsisBeanFactoryPostProcessorForSpring.class,
IsisConfigModule.class,
ServiceInjectorLegacy.class,
ServiceRegistryDefault.class,
@@ -57,6 +60,7 @@ import lombok.val;
properties = {
"isis.services.injector.setPrefix=true"
})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
class ServiceInjectorLegacyTest {
// -- SPRING SETUP
@@ -128,7 +132,7 @@ class ServiceInjectorLegacyTest {
@BeforeEach
void setup() {
- _Spring.reinit(applicationContext);
+ //_Spring.reinit(applicationContext);
}
@Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 683c7ba..c8c85de0 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
+import org.springframework.core.env.ConfigurableEnvironment;
import org.apache.isis.applib.services.grid.GridService;
import org.apache.isis.applib.services.i18n.TranslationService;
@@ -55,10 +56,19 @@ import lombok.val;
abstract class SpecificationLoaderTestAbstract {
static class Producers {
+
+ //@Produces
+ ConfigurableEnvironment newConfigurableEnvironment() {
+ val mock = Mockito.mock(ConfigurableEnvironment.class);
+ when(mock.getProperty("")).thenReturn("nop");
+ return mock;
+ }
+
//@Produces
IsisConfiguration newConfiguration() {
val config = new IsisConfiguration(); // uses defaults!
+ config.setEnvironment(newConfigurableEnvironment());
return config;
}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java
index 422566d..44cf5c1 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/context/IsisContext.java
@@ -90,16 +90,6 @@ public interface IsisContext {
return CompletableFuture.supplyAsync(computation);
}
- // -- LIFE-CYCLING
-
- /**
- * Destroys this context and clears any state associated with it.
- * It marks the end of IsisContext's life-cycle. Subsequent calls have no effect.
- */
- public static void clear() {
- _Context.clear();
- }
-
// -- CONVENIENT SHORTCUTS
/**
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 c90890e..8a6a0b9 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
@@ -26,10 +26,6 @@ import java.util.Set;
import java.util.UUID;
import java.util.function.Function;
-import javax.inject.Inject;
-
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-
import org.apache.wicket.Application;
import org.apache.wicket.ConverterLocator;
import org.apache.wicket.IConverterLocator;
@@ -62,9 +58,9 @@ import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
import org.apache.wicket.util.time.Duration;
import org.wicketstuff.select2.ApplicationSettings;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
import org.apache.isis.commons.internal.concurrent._ConcurrentContext;
import org.apache.isis.commons.internal.concurrent._ConcurrentTaskList;
-import org.apache.isis.commons.internal.context._Context;
import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
import org.apache.isis.commons.internal.resources._Resources;
import org.apache.isis.config.IsisConfiguration;
@@ -579,7 +575,6 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
// isisSessionFactory.destroyServicesAndShutdown();
// }
super.onDestroy();
- IsisContext.clear();
} catch(final RuntimeException ex) {
// symmetry with #init()
log.error("Failed to destroy", ex);
@@ -589,6 +584,7 @@ implements ComponentFactoryRegistryAccessor, PageClassRegistryAccessor, WicketVi
// //////////////////////////////////////
+ @SuppressWarnings("deprecation")
@Override //[ahuber] final on purpose! to switch DeploymentType, do this consistent with IsisContext.
public final RuntimeConfigurationType getConfigurationType() {
return IsisSystemEnvironment.get().isPrototyping()
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
index 28ca3da..8003f57 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/bootstrapping/AutoConfigurationTest.java
@@ -18,10 +18,6 @@
*/
package org.apache.isis.testdomain.bootstrapping;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
import javax.inject.Inject;
import org.junit.jupiter.api.BeforeEach;
@@ -98,22 +94,13 @@ class AutoConfigurationTest {
@Test
void domainObjects_shouldBeDiscovered() {
- //TODO bad test, relying on implementation details
- // clearly IsisBeanTypeRegistry needs refactoring!
val registry = IsisBeanTypeRegistry.current();
-
- val discoveredTypes = registry.streamAndClearInbox()
- .map(Map.Entry::getKey)
- .collect(Collectors.toSet());
- discoveredTypes.addAll((Set)registry.getEntityTypes());
- discoveredTypes.addAll((Set)registry.getBeanTypes());
+ val discoveredTypes = registry.snapshotIntrospectableTypes().keySet();
for(val cls : nonManaged()) {
assertTrue(discoveredTypes.contains(cls));
}
- //TODO @DomainObject with NATURE_NOT_SPECIFIED is getting ignored, is this correct behavior?
-
}
@Test
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
index d427ebd..53fc52e 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/SpecloaderPerformanceTest.java
@@ -29,7 +29,6 @@ import org.apache.isis.commons.internal.base._Timing;
import org.apache.isis.commons.internal.reflection._Annotations;
import org.apache.isis.config.IsisConfiguration;
import org.apache.isis.config.IsisPresets;
-import org.apache.isis.config.registry.IsisBeanTypeRegistry;
import org.apache.isis.metamodel.specloader.SpecificationLoader;
import org.apache.isis.testdomain.Incubating;
import org.apache.isis.testdomain.Smoketest;
@@ -62,7 +61,7 @@ class SpecloaderPerformanceTest {
@BeforeAll
static void setup() {
- IsisBeanTypeRegistry.repeatedTesting = true;
+
}
static long ITERATIONS = 100; /* should typically run in ~10s */
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
index c524705..9a27420 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
@@ -83,7 +83,7 @@ org.apache.isis.runtime.system.session.IsisSessionFactoryDefault
org.apache.isis.runtime.system.transaction.AuditingServiceInternal
org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal
org.apache.isis.runtime.system.transaction.PersistenceSessionServiceInternalDefault
-org.apache.isis.security.authentication.bypass.AuthenticatorBypass
+#org.apache.isis.security.authentication.bypass.AuthenticatorBypass
org.apache.isis.security.authentication.manager.AuthorizationManagerStandard
org.apache.isis.security.authentication.standard.AuthenticationManagerStandard
#org.apache.isis.security.authorization.bypass.AuthorizorBypass