This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 3c82ea8c4aa9977c2c1450e1591eae0eda4bea18 Author: Alex Heneveld <[email protected]> AuthorDate: Thu Nov 12 13:45:56 2020 +0000 better error messages on bean resolution failure --- .../camp/brooklyn/spi/creation/CampResolver.java | 2 +- .../core/catalog/internal/BasicBrooklynCatalog.java | 18 ++++++++++++------ .../core/typereg/BrooklynTypePlanTransformer.java | 8 +++++--- .../typereg/ReferencedUnresolvedTypeException.java | 2 +- ...edTypePlanException.java => TypePlanException.java} | 13 ++++++------- .../brooklyn/core/typereg/TypePlanTransformers.java | 17 +++++++++++------ .../core/typereg/UnsupportedTypePlanException.java | 3 +-- 7 files changed, 37 insertions(+), 26 deletions(-) diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java index 1a71b92..c9bfaca 100644 --- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java +++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java @@ -126,7 +126,7 @@ class CampResolver { } else if (RegisteredTypes.isAnyTypeSubtypeOf(supers, Entity.class)) { spec = createEntitySpecFromServicesBlock(planYaml, loader, encounteredTypes, false); } else { - throw new IllegalStateException("Cannot detect spec type from " + item.getSuperTypes() + " for " + item + "\n" + planYaml); + throw new IllegalStateException("Not a spec or cannot detect spec type from " + item.getSuperTypes() + " for " + item + "\n" + planYaml); } if (expectedType != null && !expectedType.isAssignableFrom(spec.getType())) { throw new IllegalStateException("Creating spec from " + item + ", got " + spec.getType() + " which is incompatible with expected " + expectedType); diff --git a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java index f3bafb2..a3d7d01 100644 --- a/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/org/apache/brooklyn/core/catalog/internal/BasicBrooklynCatalog.java @@ -1332,10 +1332,12 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { attemptLegacySpecTransformersForType(LOCATIONS_KEY, CatalogItemType.LOCATION); } + boolean suspicionOfABean = false; + private Maybe<Object> attemptPlanTranformer() { Exception errorInBean = null; try { - boolean suspicionOfABean = false; + suspicionOfABean = false; Set<? extends OsgiBundleWithUrl> searchBundles = MutableSet.copyOf(libraryBundles) .putIfNotNull(containingBundle); @@ -1394,7 +1396,7 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { MutableList<Throwable> exceptions = MutableList.<Throwable>of().appendIfNotNull(errorInBean, e); return Maybe.absent( () -> - Exceptions.create("Unable to parse definition of "+ + Exceptions.create("Unable to transform definition of "+ (itemId!=null ? itemId : "plan:\n"+itemYaml+"\n"), exceptions) ); @@ -1407,10 +1409,14 @@ public class BasicBrooklynCatalog implements BrooklynCatalog { * May only be available where the type is known. */ public List<Exception> getErrors() { // errors are useful in this order, at least historically, and in our tests - if (!errors.isEmpty()) return errors; - if (!entityErrors.isEmpty()) return entityErrors; - if (!transformerErrors.isEmpty()) return transformerErrors; - return Collections.emptyList(); + MutableList<Exception> l = MutableList.copyOf(errors); + if (suspicionOfABean && !transformerErrors.isEmpty()) { + // suppress entity errors + } else { + l.appendAll(entityErrors); + } + l.appendAll(transformerErrors); + return l; } public CatalogItemType getCatalogItemType() { diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java index 89e9264..a27e7bc 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BrooklynTypePlanTransformer.java @@ -82,9 +82,11 @@ public interface BrooklynTypePlanTransformer extends ManagementContextInjectable * The framework guarantees this will only be invoked when {@link #scoreForType(RegisteredType, RegisteredTypeLoadingContext)} * has returned a positive value, and the same constraints on the inputs as for that method apply. * <p> - * Implementations should either return null or throw {@link UnsupportedTypePlanException} - * if upon closer inspection following a non-null score, they do not actually support the given {@link RegisteredType#getPlan()}. - * If they should support the plan but the plan contains an error, they should throw the relevant error for feedback to the user. */ + * Implementations should either return null, + * or throw an {@link UnsupportedTypePlanException} if + * if upon closer inspection following a non-null score, they are not actually applicable the given {@link RegisteredType#getPlan()}; + * If they should support the plan but the plan contains an error, they should throw the relevant error for feedback to the user + * which may be a different subclass of {@link TypePlanException}. */ @Nullable Object create(@Nonnull RegisteredType type, @Nonnull RegisteredTypeLoadingContext context); /** @deprecated since 1.1; use {@link org.apache.brooklyn.core.typereg.BrooklynCatalogBundleResolver} for adding to catalog */ diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java b/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java index f5889ce..1ded3bb 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/ReferencedUnresolvedTypeException.java @@ -21,7 +21,7 @@ package org.apache.brooklyn.core.typereg; import org.apache.brooklyn.api.typereg.RegisteredType; /** Indicates a type has requested to resolve another type which is not resolved or not resolvable */ -public class ReferencedUnresolvedTypeException extends UnsupportedTypePlanException { +public class ReferencedUnresolvedTypeException extends TypePlanException { private static final long serialVersionUID = -5590108442839125317L; diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanException.java similarity index 67% copy from core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java copy to core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanException.java index 696a5c2..15f46a8 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanException.java @@ -18,21 +18,20 @@ */ package org.apache.brooklyn.core.typereg; -/** Used by {@link BrooklynTypePlanTransformer} for a transformer to indicate an error resolving a plan. */ -// TODO add another hierarchy RecognizedTypePlanException or a score to indicate priority of errors for reporting? -public class UnsupportedTypePlanException extends RuntimeException { +/** Subclasses used by {@link BrooklynTypePlanTransformer} for a transformer to indicate an error resolving a plan. */ +public class TypePlanException extends RuntimeException { - private static final long serialVersionUID = -5590108442839125317L; + private static final long serialVersionUID = -5590108442839125318L; - public UnsupportedTypePlanException(String message, Throwable cause) { + public TypePlanException(String message, Throwable cause) { super(message, cause); } - public UnsupportedTypePlanException(String message) { + public TypePlanException(String message) { super(message); } - public UnsupportedTypePlanException(Throwable cause) { + public TypePlanException(Throwable cause) { super(cause); } diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java index fe0ee36..1bca187 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/TypePlanTransformers.java @@ -102,7 +102,7 @@ public class TypePlanTransformers { List<BrooklynTypePlanTransformer> transformers = forType(mgmt, type, constraint); Collection<String> transformersWhoDontSupport = new ArrayList<String>(); - Collection<Exception> failuresFromTransformers = new ArrayList<Exception>(); + List<Exception> failuresFromTransformers = new ArrayList<Exception>(); for (BrooklynTypePlanTransformer t: transformers) { try { Object result = t.create(type, constraint); @@ -119,11 +119,16 @@ public class TypePlanTransformers { if (log.isTraceEnabled()) { log.trace("Transformer for "+t.getFormatCode()+" gave an error creating this plan (may retry): "+e, e); } - failuresFromTransformers.add(new PropagatedRuntimeException( - (type.getSymbolicName()!=null ? - t.getFormatCode()+" plan creation error in "+type.getId() : - t.getFormatCode()+" plan creation error") + ": "+ - Exceptions.collapseText(e), e)); + PropagatedRuntimeException e1 = new PropagatedRuntimeException( + (type.getSymbolicName() != null ? + t.getFormatCode() + " plan creation error in " + type.getId() : + t.getFormatCode() + " plan creation error") + ": " + + Exceptions.collapseText(e), e); + if (Exceptions.getFirstThrowableOfType(e, TypePlanException.class)!=null) { + failuresFromTransformers.add(0, e1); + } else { + failuresFromTransformers.add(e1); + } } } diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java b/core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java index 696a5c2..2a0baf1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/UnsupportedTypePlanException.java @@ -19,8 +19,7 @@ package org.apache.brooklyn.core.typereg; /** Used by {@link BrooklynTypePlanTransformer} for a transformer to indicate an error resolving a plan. */ -// TODO add another hierarchy RecognizedTypePlanException or a score to indicate priority of errors for reporting? -public class UnsupportedTypePlanException extends RuntimeException { +public class UnsupportedTypePlanException extends TypePlanException { private static final long serialVersionUID = -5590108442839125317L;
