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;

Reply via email to