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