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() {