You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2018/04/05 17:06:49 UTC

[juneau] branch master updated: Improved DynaBeans support.

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 <ja...@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
jamesbognar@apache.org.