This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 9d99d5f  Improved DynaBeans support.
9d99d5f is described below

commit 9d99d5f688205062b5eb68e08eed84ac2a10f2ea
Author: JamesBognar <jamesbog...@apache.org>
AuthorDate: Thu Apr 5 13:06:48 2018 -0400

    Improved DynaBeans support.
---
 .../apache/juneau/dto/swagger/HeaderInfoTest.java  |  2 -
 .../org/apache/juneau/dto/swagger/ItemsTest.java   |  2 -
 .../java/org/apache/juneau/BeanPropertyMeta.java   | 44 +++++++++++++++++-----
 3 files changed, 35 insertions(+), 13 deletions(-)

diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/HeaderInfoTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/HeaderInfoTest.java
index d8b86ab..f4b18e5 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/HeaderInfoTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/HeaderInfoTest.java
@@ -590,8 +590,6 @@ public class HeaderInfoTest {
                assertType(String.class, t.get("type", Object.class));
                assertType(Boolean.class, t.get("uniqueItems", Object.class));
                assertType(String.class, t.get("$ref", Object.class));
-               
-               JsonSerializer.DEFAULT_LAX.println(t);
        
                t.set("null", null).set(null, "null");
                assertNull(t.get("null", Object.class));
diff --git 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/ItemsTest.java
 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/ItemsTest.java
index 63074a9..eec0380 100644
--- 
a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/ItemsTest.java
+++ 
b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/dto/swagger/ItemsTest.java
@@ -568,8 +568,6 @@ public class ItemsTest {
                assertType(Boolean.class, t.get("uniqueItems", Object.class));
                assertType(String.class, t.get("$ref", Object.class));
                
-               JsonSerializer.DEFAULT_LAX.println(t);
-       
                t.set("null", null).set(null, "null");
                assertNull(t.get("null", Object.class));
                assertNull(t.get(null, Object.class));
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 4f7c454..2872385 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -51,9 +51,9 @@ public final class BeanPropertyMeta {
 
        private final String name;                                // The name 
of the property.
        private final Field field;                                // The bean 
property field (if it has one).
-       private final Method getter, setter;                      // The bean 
property getter and setter.
+       private final Method getter, setter, extraKeys;           // The bean 
property getter and setter.
        private final boolean isUri;                              // True if 
this is a URL/URI or annotated with @URI.
-       private final boolean isDyna;                             // This is a 
dyna property (i.e. name="*")
+       private final boolean isDyna, isDynaGetterMap;            // This is a 
dyna property (i.e. name="*")
 
        private final ClassMeta<?>
                rawTypeMeta,                                           // The 
real class type of the bean property.
@@ -89,7 +89,7 @@ public final class BeanPropertyMeta {
                String name;
                Field field;
                Method getter, setter, extraKeys;
-               boolean isConstructorArg, isUri, isDyna;
+               boolean isConstructorArg, isUri, isDyna, isDynaGetterMap;
                ClassMeta<?> rawTypeMeta, typeMeta;
                String[] properties;
                PojoSwap swap;
@@ -232,9 +232,15 @@ public final class BeanPropertyMeta {
                        // Do some annotation validation.
                        Class<?> c = rawTypeMeta.getInnerClass();
                        if (getter != null) {
+                               Class<?>[] pt = getter.getParameterTypes(); 
                                if (isDyna) {
-                                       if (! isParentClass(Map.class, c))
+                                       if (isParentClass(Map.class, c) && 
pt.length == 0) {
+                                               isDynaGetterMap = true;
+                                       } else if (pt.length == 2 && pt[0] == 
String.class) {
+                                               // OK.
+                                       } else {
                                                return false;
+                                       }
                                } else {
                                        if (! 
isParentClass(getter.getReturnType(), c))
                                                return false;
@@ -242,12 +248,15 @@ public final class BeanPropertyMeta {
                        }
                        if (setter != null) {
                                Class<?>[] pt = setter.getParameterTypes();
-                               if (pt.length != (isDyna ? 2 : 1))
-                                       return false;
                                if (isDyna) {
-                                       if (! pt[0].equals(String.class))
+                                       if (pt.length == 2 && pt[0] == 
String.class) {
+                                               // OK.
+                                       } else {
                                                return false;
+                                       }
                                } else {
+                                       if (pt.length != 1)
+                                               return false;
                                        if (! isParentClass(pt[0], c))
                                                return false;
                                }
@@ -347,6 +356,7 @@ public final class BeanPropertyMeta {
                this.field = b.field;
                this.getter = b.getter;
                this.setter = b.setter;
+               this.extraKeys = b.extraKeys;
                this.isUri = b.isUri;
                this.beanMeta = b.beanMeta;
                this.beanContext = b.beanContext;
@@ -360,6 +370,7 @@ public final class BeanPropertyMeta {
                this.delegateFor = b.delegateFor;
                this.extMeta = b.extMeta;
                this.isDyna = b.isDyna;
+               this.isDynaGetterMap = b.isDynaGetterMap;
                this.canRead = b.canRead;
                this.canWrite = b.canWrite;
        }
@@ -766,8 +777,11 @@ public final class BeanPropertyMeta {
        private Object invokeGetter(Object bean, String pName) throws 
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
                if (isDyna) {
                        Map m = null;
-                       if (getter != null)
+                       if (getter != null) {
+                               if (! isDynaGetterMap)
+                                       return getter.invoke(pName);
                                m = (Map)getter.invoke(bean);
+                       }
                        else if (field != null)
                                m = (Map)field.get(bean);
                        else
@@ -820,7 +834,13 @@ public final class BeanPropertyMeta {
         */
        public Map<String,Object> getDynaMap(Object bean) throws 
IllegalArgumentException, IllegalAccessException, InvocationTargetException {
                if (isDyna) {
-                       if (getter != null)
+                       if (extraKeys != null && getter != null && ! 
isDynaGetterMap) {
+                               Map<String,Object> m = new LinkedHashMap<>();
+                               for (String key : 
(Collection<String>)extraKeys.invoke(bean)) 
+                                       m.put(key, getter.invoke(bean));
+                               return m;
+                       }
+                       if (getter != null && isDynaGetterMap)
                                return (Map)getter.invoke(bean);
                        if (field != null)
                                return (Map)field.get(bean);
@@ -1027,6 +1047,10 @@ public final class BeanPropertyMeta {
                        addIfNotNull(l, getMethodAnnotation(a, setter));
                        appendAnnotations(a, setter.getReturnType(), l);
                }
+               if (extraKeys != null) {
+                       addIfNotNull(l, getMethodAnnotation(a, extraKeys));
+                       appendAnnotations(a, extraKeys.getReturnType(), l);
+               }
 
                appendAnnotations(a, 
this.getBeanMeta().getClassMeta().getInnerClass(), l);
                return l;
@@ -1050,6 +1074,8 @@ public final class BeanPropertyMeta {
                        t = getMethodAnnotation(a, getter);
                if (t == null && setter != null)
                        t = getMethodAnnotation(a, setter);
+               if (t == null && extraKeys != null)
+                       t = getMethodAnnotation(a, extraKeys);
                return t;
        }
 

-- 
To stop receiving notification emails like this one, please contact
jamesbog...@apache.org.

Reply via email to