You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2018/12/13 23:28:07 UTC
[isis] 03/05: ISIS-2050: introduces config property to
enable/disable full introspection of metamodel
This is an automated email from the ASF dual-hosted git repository.
danhaywood pushed a commit to branch ISIS-2050
in repository https://gitbox.apache.org/repos/asf/isis.git
commit 37964d814bdf2ceb05bf2af1a1302f95302e2bff
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Dec 13 07:53:32 2018 +0100
ISIS-2050: introduces config property to enable/disable full introspection of metamodel
If disabled, then metamodel validation is skipped
---
.../isis/core/commons/config/ConfigProperty.java | 5 ++
.../commons/config/ConfigPropertyAbstract.java | 11 ++++
.../core/commons/config/ConfigPropertyBoolean.java | 10 ++++
.../metamodel/specloader/SpecificationLoader.java | 62 ++++++++++++++--------
4 files changed, 66 insertions(+), 22 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigProperty.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigProperty.java
new file mode 100644
index 0000000..bfd44a7
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigProperty.java
@@ -0,0 +1,5 @@
+package org.apache.isis.core.commons.config;
+
+public interface ConfigProperty<T> {
+ T from(final IsisConfiguration configuration);
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigPropertyAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigPropertyAbstract.java
new file mode 100644
index 0000000..40d9487
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigPropertyAbstract.java
@@ -0,0 +1,11 @@
+package org.apache.isis.core.commons.config;
+
+public abstract class ConfigPropertyAbstract<T> implements ConfigProperty<T> {
+ final String key;
+ final boolean defaultValue;
+ public ConfigPropertyAbstract(final String key, final boolean defaultValue) {
+ this.key = key;
+ this.defaultValue = defaultValue;
+ }
+ public abstract T from(final IsisConfiguration configuration);
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigPropertyBoolean.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigPropertyBoolean.java
new file mode 100644
index 0000000..044fa35
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/config/ConfigPropertyBoolean.java
@@ -0,0 +1,10 @@
+package org.apache.isis.core.commons.config;
+
+public class ConfigPropertyBoolean extends ConfigPropertyAbstract<Boolean> {
+ public ConfigPropertyBoolean(final String key, final boolean defaultValue) {
+ super(key, defaultValue);
+ }
+ public Boolean from(final IsisConfiguration configuration) {
+ return configuration.getBoolean(key, defaultValue);
+ }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index 0dc7c06..628370d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@ -36,6 +36,7 @@ import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.core.commons.components.ApplicationScopedComponent;
+import org.apache.isis.core.commons.config.ConfigPropertyBoolean;
import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.commons.ensure.Assert;
import org.apache.isis.core.commons.exceptions.IsisException;
@@ -90,9 +91,12 @@ public class SpecificationLoader implements ApplicationScopedComponent {
private final static Logger LOG = LoggerFactory.getLogger(SpecificationLoader.class);
- public static final String INTROSPECTOR_PARALLELIZE_KEY = "isis.reflector.introspector.parallelize";
- //public static final boolean INTROSPECTOR_PARALLELIZE_DEFAULT = true;
- public static final boolean INTROSPECTOR_PARALLELIZE_DEFAULT = false;
+ public static final ConfigPropertyBoolean CONFIG_PROPERTY_PARALLELIZE =
+ new ConfigPropertyBoolean("isis.reflector.introspector.parallelize", true);
+
+ public static final ConfigPropertyBoolean CONFIG_PROPERTY_FULL_INTROSPECTION =
+ new ConfigPropertyBoolean("isis.reflector.introspector.fullIntrospection", true);
+
//region > constructor, fields
private final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
@@ -201,9 +205,28 @@ public class SpecificationLoader implements ApplicationScopedComponent {
specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
);
+ cache.init();
+
final Collection<ObjectSpecification> cachedSpecifications = allCachedSpecifications();
- // for debugging only
+ logBefore(specificationsFromRegistry, cachedSpecifications);
+
+ introspect(contributingSpecs, IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+ introspect(specificationsFromRegistry, IntrospectionState.TYPE_INTROSPECTED);
+
+ logAfter(cachedSpecifications);
+
+ final boolean validate = CONFIG_PROPERTY_FULL_INTROSPECTION.from(configuration);
+ if(validate) {
+ LOG.info("Meta model being fully introspected (enables subsequent meta model validation)");
+ introspect(cachedSpecifications, IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+ }
+
+ }
+
+ private void logBefore(
+ final List<ObjectSpecification> specificationsFromRegistry,
+ final Collection<ObjectSpecification> cachedSpecifications) {
LOG.info(String.format(
"specificationsFromRegistry.size = %d ; cachedSpecifications.size = %d",
specificationsFromRegistry.size(), cachedSpecifications.size()));
@@ -226,11 +249,9 @@ public class SpecificationLoader implements ApplicationScopedComponent {
LOG.info(String.format(
"registryNotCached.size = %d ; cachedNotRegistry.size = %d",
registryNotCached.size(), cachedNotRegistry.size()));
+ }
- introspect(contributingSpecs, IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
- introspect(specificationsFromRegistry, IntrospectionState.TYPE_INTROSPECTED);
-
- // for debugging only
+ private void logAfter(final Collection<ObjectSpecification> cachedSpecifications) {
final Collection<ObjectSpecification> cachedSpecificationsAfter = cache.allSpecifications();
ImmutableList<ObjectSpecification> cachedAfterNotBefore = FluentIterable.from(cachedSpecificationsAfter)
.filter(new Predicate<ObjectSpecification>() {
@@ -241,16 +262,9 @@ public class SpecificationLoader implements ApplicationScopedComponent {
}).toList();
LOG.info(String.format("cachedSpecificationsAfter.size = %d ; cachedAfterNotBefore.size = %d",
cachedSpecificationsAfter.size(), cachedAfterNotBefore.size()));
-
-
- // only after full introspection has occurred do we cache ObjectSpecifications
- // by their ObjectSpecId.
- // the cache (SpecificationCacheDefault will fail-fast as not initialized
- cache.init();
-
}
- private void introspect(final List<ObjectSpecification> specs, final IntrospectionState upTo) {
+ private void introspect(final Collection<ObjectSpecification> specs, final IntrospectionState upTo) {
final List<Callable<Object>> callables = Lists.newArrayList();
for (final ObjectSpecification specification : specs) {
Callable<Object> callable = new Callable<Object>() {
@@ -270,13 +284,13 @@ public class SpecificationLoader implements ApplicationScopedComponent {
};
callables.add(callable);
}
- invoke(callables);
+ invokeAndWait(callables);
}
- private void invoke(final List<Callable<Object>> callables) {
+ private void invokeAndWait(final List<Callable<Object>> callables) {
final ThreadPoolSupport threadPoolSupport = ThreadPoolSupport.getInstance();
- final boolean parallelize =
- configuration.getBoolean(INTROSPECTOR_PARALLELIZE_KEY, INTROSPECTOR_PARALLELIZE_DEFAULT);
+ final boolean parallelize = CONFIG_PROPERTY_PARALLELIZE.from(configuration);
+
final List<Future<Object>> futures = parallelize
? threadPoolSupport.invokeAll(callables)
: threadPoolSupport.invokeAllSequential(callables);
@@ -362,10 +376,14 @@ public class SpecificationLoader implements ApplicationScopedComponent {
@Programmatic
public void validateAndAssert() {
+ final Boolean validate = CONFIG_PROPERTY_FULL_INTROSPECTION.from(configuration);
+ if(!validate) {
+ LOG.info("Meta model validation skipped (full introspection of metamodel not configured)");
+ return;
+ }
+
ValidationFailures validationFailures = validate();
validationFailures.assertNone();
-
- cache.init();
}
@Programmatic