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 14123455fb9627635aa9e9b02ae3caf9dc7e76da Author: Alex Heneveld <[email protected]> AuthorDate: Mon Jun 26 11:01:26 2023 +0100 allow some coercers to return maybe-wrapped nulls --- .../brooklyn/util/core/flags/TypeCoercions.java | 2 +- .../brooklyn/util/javalang/coerce/TryCoercer.java | 2 ++ .../javalang/coerce/TypeCoercerExtensible.java | 26 +++++++++++++--------- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java b/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java index 815363e270..b93ac1b986 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/flags/TypeCoercions.java @@ -320,7 +320,7 @@ public class TypeCoercions { } public void registerWrappedValueAdapters() { - registerAdapter("10-unwrap-wrapped-value", new TryCoercer() { + registerAdapter("10-unwrap-wrapped-value", new TryCoercer.TryCoercerReturningNull() { @Override public <T> Maybe<T> tryCoerce(Object input, TypeToken<T> type) { if (!(input instanceof WrappedValue)) { diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TryCoercer.java b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TryCoercer.java index 27243a40d6..0e3ff7170e 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TryCoercer.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TryCoercer.java @@ -41,4 +41,6 @@ public interface TryCoercer { * </ul> */ <T> Maybe<T> tryCoerce(Object input, TypeToken<T> type); + + interface TryCoercerReturningNull extends TryCoercer {} } 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 c1274810f7..630b697d52 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 @@ -20,12 +20,7 @@ package org.apache.brooklyn.util.javalang.coerce; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import com.google.common.collect.*; @@ -178,10 +173,14 @@ public class TypeCoercerExtensible implements TypeCoercer { if (result!=null) { if (result.isAbsent()) errors.add(result); else { - log.warn("Coercer " + coercer + " returned wrapped null when coercing " + value); - errors.add(Maybe.absent("coercion returned null")); - // arguably it should return null here -// return null; + if (coercer instanceof TryCoercer.TryCoercerReturningNull) { + return result; + } else { + String c = getCoercerName(coercer); + log.warn("Coercer " + c + " returned wrapped null when coercing " + value); + errors.add(Maybe.absent("coercion returned null ("+c+")")); + // coercers the return null should implement 'TryCoercerReturningNull' + } } } } @@ -258,6 +257,13 @@ public class TypeCoercerExtensible implements TypeCoercer { return Maybe.absent(new ClassCoercionException("Cannot coerce type "+value.getClass().getCanonicalName()+" to "+targetTypeToken+" ("+value+"): no adapter known")); } + protected String getCoercerName(TryCoercer coercer) { + Optional<Map.Entry<String, TryCoercer>> bn = genericCoercersByName.entrySet().stream().filter(es -> Objects.equal(coercer, es.getValue())).findAny(); + if (bn.isPresent()) return bn.get().getKey(); + int index = genericCoercers.indexOf(coercer); + return coercer.toString() + (index>=0 ? " (index "+index+")" : ""); + } + @SuppressWarnings("unchecked") protected <T> Maybe<T> tryCoerceMap(Object value, TypeToken<T> targetTypeToken) { if (!(value instanceof Map) || !(TypeTokens.isAssignableFromRaw(Map.class, targetTypeToken))) return null;
