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


The following commit(s) were added to refs/heads/master by this push:
     new 685a2bc  minor deserialization/coercion fixes
685a2bc is described below

commit 685a2bc56d957abe4e52e279dfcaca6008b84d82
Author: Alex Heneveld <[email protected]>
AuthorDate: Fri May 7 10:41:17 2021 +0100

    minor deserialization/coercion fixes
    
    fix deserialization of type property in bean and treat lists supplied for 
sets as a collection to skip coercion
---
 .../brooklyn/core/config/internal/AbstractConfigMapImpl.java | 12 +++++++++++-
 .../brooklyn/core/resolve/jackson/AsPropertyIfAmbiguous.java |  9 +++++++--
 2 files changed, 18 insertions(+), 3 deletions(-)

diff --git 
a/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
 
b/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
index 2f4623f..f9e8536 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/config/internal/AbstractConfigMapImpl.java
@@ -285,7 +285,7 @@ public abstract class AbstractConfigMapImpl<TContainer 
extends BrooklynObject> i
         } else if (key instanceof StructuredConfigKey) {
             // no coercion for these structures (they decide what to do)
             return v;
-        } else if ((v instanceof Map || v instanceof Iterable) && 
key.getType().isInstance(v)) {
+        } else if ((v instanceof Map || v instanceof Iterable) && 
isStructurallyCompatible(key, v)) {
             // don't do coercion on put for these, if the key type is 
compatible, 
             // because that will force resolution deeply
             return v;
@@ -303,6 +303,16 @@ public abstract class AbstractConfigMapImpl<TContainer 
extends BrooklynObject> i
         }
     }
 
+    private <T> boolean isStructurallyCompatible(ConfigKey<T> key, Object v) {
+        if (key.getType().isInstance(v)) return true;
+        if (Collection.class.isAssignableFrom(key.getType())) {
+            if (v instanceof Iterable) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     @Override
     public Map<String,Object> asMapWithStringKeys() {
         return mapViewWithStringKeys;
diff --git 
a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/AsPropertyIfAmbiguous.java
 
b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/AsPropertyIfAmbiguous.java
index 26fc860..ecf1ab3 100644
--- 
a/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/AsPropertyIfAmbiguous.java
+++ 
b/core/src/main/java/org/apache/brooklyn/core/resolve/jackson/AsPropertyIfAmbiguous.java
@@ -33,6 +33,7 @@ import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
 import com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeDeserializer;
 import com.fasterxml.jackson.databind.jsontype.impl.AsPropertyTypeSerializer;
 import com.fasterxml.jackson.databind.util.TokenBuffer;
+import java.lang.reflect.Method;
 import java.util.function.Supplier;
 import 
org.apache.brooklyn.core.resolve.jackson.AsPropertyIfAmbiguous.HasBaseType;
 import org.apache.brooklyn.util.exceptions.Exceptions;
@@ -42,6 +43,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import org.apache.brooklyn.util.text.Strings;
 
 public class AsPropertyIfAmbiguous {
     public interface HasBaseType {
@@ -122,12 +124,15 @@ public class AsPropertyIfAmbiguous {
         @Override
         public Object deserializeTypedFromObject(JsonParser p, 
DeserializationContext ctxt) throws IOException {
             if (_idResolver instanceof HasBaseType) {
-                if 
(Reflections.findFieldMaybe(((HasBaseType)_idResolver).getBaseType().getRawClass(),
 _typePropertyName).isPresent()) {
+                if (// object has field with same name as the type property - 
don't treat the type property supplied here as the type
+                        
Reflections.findFieldMaybe(((HasBaseType)_idResolver).getBaseType().getRawClass(),
 _typePropertyName).isPresent()
+                        || // or object has getter with same name as the type 
property
+                        
Reflections.findMethodMaybe(((HasBaseType)_idResolver).getBaseType().getRawClass(),
 "get"+ Strings.toInitialCapOnly(_typePropertyName)).isPresent()
+                ) {
                     // don't read type id, just deserialize
                     JsonDeserializer<Object> deser = 
ctxt.findContextualValueDeserializer(((HasBaseType)_idResolver).getBaseType(), 
_property);
                     return deser.deserialize(p, ctxt);
                 }
-
                 // TODO MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL should do 
this
                 if (!Objects.equals(_defaultImpl, ((HasBaseType) 
_idResolver).getBaseType())) {
                     AsPropertyButNotIfFieldConflictTypeDeserializer delegate = 
new AsPropertyButNotIfFieldConflictTypeDeserializer(_baseType, _idResolver, 
_typePropertyName, _typeIdVisible, ((HasBaseType) _idResolver).getBaseType(), 
_inclusion);

Reply via email to