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 2020/01/09 18:25:47 UTC

[isis] 08/11: ISIS-2250: debugs and fixes spec loader blocking issue.

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 27c56a586ab98d01779ba895be09a8420fb8e538
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jan 9 17:01:01 2020 +0000

    ISIS-2250: debugs and fixes spec loader blocking issue.
---
 .../org/apache/isis/config/IsisConfiguration.java  |  7 +-
 .../MethodPrefixBasedFacetFactoryAbstract.java     | 94 +++++++++++++---------
 .../specloader/SpecificationLoaderDefault.java     | 23 +++++-
 .../specimpl/ObjectSpecificationAbstract.java      |  2 -
 .../validator/MetaModelValidatorAbstract.java      |  7 +-
 .../validator/MetaModelValidatorVisiting.java      | 16 ++--
 6 files changed, 93 insertions(+), 56 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
index f677e81..36be8c3 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
@@ -503,7 +503,7 @@ public class IsisConfiguration {
         @Data
         public static class Introspector {
             /**
-             * Whether to perform introspection and metamodel validation in parallel.
+             * Whether to perform introspection in parallel.
              */
             private boolean parallelize = true;
             /**
@@ -554,6 +554,11 @@ public class IsisConfiguration {
         @Data
         public static class Validator {
 
+            /**
+             * Whether to perform metamodel validation in parallel.
+             */
+            private boolean parallelize = true;
+
             private boolean allowDeprecated = true;
             private boolean ensureUniqueObjectTypes = true;
             private boolean checkModuleExtent = true;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
index 26a2bf9..72d87ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodPrefixBasedFacetFactoryAbstract.java
@@ -19,11 +19,16 @@
 package org.apache.isis.metamodel.facets;
 
 import java.util.EnumSet;
+import java.util.function.Consumer;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.progmodel.ProgrammingModel;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.Contributed;
+import org.apache.isis.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.metamodel.specloader.validator.MetaModelValidator;
+import org.apache.isis.metamodel.specloader.validator.MetaModelValidatorVisiting;
 
 import lombok.Getter;
 import lombok.NonNull;
@@ -63,47 +68,56 @@ implements MethodPrefixBasedFacetFactory {
         
         val noParamsOnly = getConfiguration().getReflector().getValidator().isNoParamsOnly();
 
-        programmingModel.addValidator((objectSpec, metaModelValidator) -> {
-            
-            // ensure accepted actions do not have any of the reserved prefixes
-            objectSpec.streamObjectActions(Contributed.EXCLUDED)
-            .forEach(objectAction->{
-                
-                val actionId = objectAction.getId();
-                
-                for (val prefix : prefixes) {
-                    
-                    if (isPrefixed(actionId, prefix)) {
-
-                        val explanation =
-                                objectAction.getParameterCount() > 0 
-                                && noParamsOnly 
-                                && (MethodLiteralConstants.HIDE_PREFIX.equals(prefix) 
-                                        || MethodLiteralConstants.DISABLE_PREFIX.equals(prefix))
-                                ? " (such methods must have no parameters, '"
-                                    + "isis.reflector.validator.no-params-only"
-                                    + "' config property)"
-                                        : "";
-
-                        val message = "%s#%s: has prefix %s, is probably intended as a supporting method "
-                                + "for a property, collection or action%s.  If the method is intended to "
-                                + "be an action, then rename and use @ActionLayout(named=\"...\") or ignore "
-                                + "completely using @Programmatic";
-                        
-                        metaModelValidator.onFailure(
-                                objectSpec,
-                                objectSpec.getIdentifier(),
-                                message,
-                                objectSpec.getIdentifier().getClassName(),
-                                actionId,
-                                prefix,
-                                explanation);
-                    }
-                }
-            });
-
-            return true;
+        programmingModel.addValidator(new MetaModelValidatorVisiting.Visitor() {
 
+            @Override
+            public String toString() {
+                return "MetaModelValidatorVisiting.Visitor : MethodPrefixBasedFacetFactoryAbstract : " + prefixes.toList().toString();
+            }
+
+            @Override
+            public boolean visit(ObjectSpecification objectSpec, MetaModelValidator metaModelValidator) {
+
+                // ensure accepted actions do not have any of the reserved prefixes
+                objectSpec.streamObjectActions(Contributed.EXCLUDED)
+                        .forEach(objectAction -> {
+
+                            val actionId = objectAction.getId();
+
+                            for (val prefix : prefixes) {
+
+                                if (isPrefixed(actionId, prefix)) {
+
+                                    val explanation =
+                                            objectAction.getParameterCount() > 0
+                                                    && noParamsOnly
+                                                    && (MethodLiteralConstants.HIDE_PREFIX.equals(prefix)
+                                                    || MethodLiteralConstants.DISABLE_PREFIX.equals(prefix))
+                                                    ? " (such methods must have no parameters, '"
+                                                    + "isis.reflector.validator.no-params-only"
+                                                    + "' config property)"
+                                                    : "";
+
+                                    val message = "%s#%s: has prefix %s, is probably intended as a supporting method "
+                                            + "for a property, collection or action%s.  If the method is intended to "
+                                            + "be an action, then rename and use @ActionLayout(named=\"...\") or ignore "
+                                            + "completely using @Programmatic";
+
+                                    metaModelValidator.onFailure(
+                                            objectSpec,
+                                            objectSpec.getIdentifier(),
+                                            message,
+                                            objectSpec.getIdentifier().getClassName(),
+                                            actionId,
+                                            prefix,
+                                            explanation);
+                                }
+                            }
+                        });
+
+                return true;
+
+            }
         });
     }
 
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 d45eb44..9559a1d 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
@@ -73,6 +73,7 @@ import org.apache.isis.metamodel.valuetypes.ValueTypeRegistry;
 import static org.apache.isis.commons.internal.base._With.requires;
 
 import lombok.Getter;
+import lombok.Setter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -118,7 +119,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     /**
      * We only ever mark the metamodel as fully introspected if in {@link #isFullIntrospect() full} introspection mode.
      */
-    @Getter
+    @Getter @Setter
     private boolean metamodelFullyIntrospected = false;
 
     @Inject
@@ -275,7 +276,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         log.info("Metamodel created in " + (long)stopWatch.getMillis() + " ms.");
 
         if(isFullIntrospect()) {
-            metamodelFullyIntrospected = true;
+            setMetamodelFullyIntrospected(true);
         }
     }
     
@@ -291,7 +292,18 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         val failures = new ValidationFailures();
         programmingModel.streamValidators()
         .map(MetaModelValidatorAbstract.class::cast)
-        .forEach(validator->validator.collectFailuresInto(failures));
+        .forEach(validator -> {
+            log.debug("Running validator: {}", validator);
+            try {
+                validator.collectFailuresInto(failures);
+            } catch (Throwable t) {
+                log.error(t);
+                throw t;
+            } finally {
+                log.debug("Done validator: {}", validator);
+            }
+        });
+        log.debug("Done");
         return failures;
     }
 
@@ -370,6 +382,9 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     }
 
     public void revalidateIfNecessary() {
+        if(!isMetamodelFullyIntrospected()) {
+            return;
+        }
         if(!this.isisConfiguration.getReflector().getIntrospector().isValidateIncrementally()) {
             return;
         }
@@ -393,7 +408,7 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     
     @Override
     public void forEach(Consumer<ObjectSpecification> onSpec) {
-        val shouldRunConcurrent = isisConfiguration.getReflector().getIntrospector().isParallelize();
+        val shouldRunConcurrent = isisConfiguration.getReflector().getValidator().isParallelize();
         val vList = cache.getVList(); // vList is thread-safe
         if(shouldRunConcurrent) {
             vList.forEachParallel(onSpec);    
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index bad3057..122cde4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -326,11 +326,9 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         return this.introspectionState.compareTo(upTo) < 0;
     }
     
-    
     protected abstract void introspectTypeHierarchy();
     protected abstract void introspectMembers();
 
-
     protected void loadSpecOfSuperclass(final Class<?> superclass) {
         if (superclass == null) {
             return;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java
index f796b74..4605212 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java
@@ -60,5 +60,10 @@ implements MetaModelValidator, MetaModelContextAware {
     protected IsisConfiguration getConfiguration() {
         return metaModelContext.getConfiguration();
     }
-    
+
+    @Override
+    public String toString() {
+        return getClass().getName();
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
index 2494719..082441a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
@@ -29,6 +29,13 @@ import lombok.val;
 
 public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
 
+    @Override
+    public String toString() {
+        return "MetaModelValidatorVisiting{" +
+                "visitor=" + visitor +
+                '}';
+    }
+
     // -- INTERFACES
     
     @FunctionalInterface
@@ -87,18 +94,11 @@ public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
         val specLoader = (SpecificationLoaderDefault)super.getMetaModelContext().getSpecificationLoader();
         
         specLoader.forEach(spec->{
-
             if(! includeIf.test(spec)) {
                 return;
             }
-            
-            visitor.visit(spec, this);            
+            visitor.visit(spec, this);
         });
-        
-    }
-
-    private static boolean filter(ObjectSpecification spec) {
-        return spec.isManagedBean() || spec.getBeanSort().isUnknown();
     }
 
     private void summarize() {