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;
 

Reply via email to