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 70b08ce04b059492142b173bfaf80572e9b83035 Author: Alex Heneveld <[email protected]> AuthorDate: Fri May 26 12:10:39 2023 +0100 return all errors from type coercion as we have a lot of coercers now available, it's useful to know which one(s) failed, and to have their source sometimes --- .../javalang/coerce/TypeCoercerExtensible.java | 34 +++++++++------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java index 03926871be..c9c03b1910 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java @@ -26,8 +26,11 @@ import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import com.google.common.collect.*; import org.apache.brooklyn.core.validation.BrooklynValidation; +import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.guava.AnyExceptionSupplier; import org.apache.brooklyn.util.guava.Maybe; @@ -43,12 +46,6 @@ import org.slf4j.LoggerFactory; import com.google.common.annotations.Beta; import com.google.common.base.Function; import com.google.common.base.Objects; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.common.collect.Table; import com.google.common.reflect.TypeToken; /** @@ -131,7 +128,7 @@ public class TypeCoercerExtensible implements TypeCoercer { protected <T> Maybe<T> tryCoerceInternal2(Object value, TypeToken<T> targetTypeToken, Class<T> targetType) { if (value==null) return Maybe.of((T)null); Maybe<T> result = null; - Maybe<T> firstError = null; + List<Maybe<T>> errors = MutableList.of(); //recursive coercion of parameterized collections and map entries targetType = TypeTokens.getRawType(targetTypeToken, targetType); @@ -178,8 +175,7 @@ public class TypeCoercerExtensible implements TypeCoercer { } } - // remember any error if we were first - if (result!=null && firstError==null) firstError = result; + if (result!=null) errors.add(result); } //ENHANCEMENT could look in type hierarchy of both types for a conversion method... @@ -217,7 +213,7 @@ public class TypeCoercerExtensible implements TypeCoercer { if (resultM.isPresent()) return resultM; // if couldn't coerce parameterized types then back out of this coercer // but remember the error if we were first - if (firstError==null) firstError = resultM; + errors.add(resultM); } } else { return Maybe.of(resultT); @@ -226,15 +222,13 @@ public class TypeCoercerExtensible implements TypeCoercer { Exceptions.propagateIfFatal(e); if (log.isDebugEnabled()) { log.debug("When coercing, registry adapter "+entry+" gave error on "+value+" -> "+targetType+" " - + (firstError==null ? "(rethrowing)" : "(suppressing as there is already an error)") + + (errors.isEmpty() ? "(rethrowing)" : "(adding as secondary error as there is already another)") + ": "+e, e); } - if (firstError==null) { - if (e instanceof ClassCoercionException) { - firstError = Maybe.absent(e); - } else { - firstError = Maybe.absent(new ClassCoercionException("Cannot coerce type "+value.getClass().getCanonicalName()+" to "+targetTypeToken+" ("+value+"): registered coercer failed", e)); - } + if (e instanceof ClassCoercionException) { + errors.add(Maybe.absent(e)); + } else { + errors.add(Maybe.absent(new ClassCoercionException("Cannot coerce type "+value.getClass().getCanonicalName()+" to "+targetTypeToken+" ("+value+"): registered coercer failed", e))); } continue; } @@ -243,9 +237,9 @@ public class TypeCoercerExtensible implements TypeCoercer { } // not found - if (firstError!=null) { - // it might be nice to have more than just the first error but for now that's all we remember - return firstError; + if (!errors.isEmpty()) { + if (errors.size()==1) return Iterables.getOnlyElement(errors); + return Maybe.absent(Exceptions.create(errors.stream().map(Maybe.Absent::getException).collect(Collectors.toList()))); } if (value instanceof Map) { if (((Map)value).containsKey("type")) {
