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 14:29:06 UTC

[juneau] branch master updated: DynaBean improvements.

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 6895097  DynaBean improvements.
6895097 is described below

commit 68950970a18e64fb6024e7caa4bffcff7479c49e
Author: JamesBognar <ja...@apache.org>
AuthorDate: Thu Apr 5 10:29:06 2018 -0400

    DynaBean improvements.
---
 .../src/main/java/org/apache/juneau/BeanMeta.java  | 43 ++++++++++++++--------
 .../java/org/apache/juneau/BeanPropertyMeta.java   |  8 +++-
 2 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index 640846c..1d6c4fe 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.internal.ClassUtils.*;
 import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.ReflectionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
+import static org.apache.juneau.BeanMeta.MethodType.*;
 
 import java.beans.*;
 import java.io.*;
@@ -306,7 +307,7 @@ public class BeanMeta<T> {
 						if (! normalProps.containsKey(pn))
 							normalProps.put(pn, new BeanPropertyMeta.Builder(beanMeta, pn));
 						BeanPropertyMeta.Builder bpm = normalProps.get(pn);
-						if (! bm.isSetter) {
+						if (bm.methodType == GETTER) {
 							// Two getters.  Pick the best.
 							if (bpm.getter != null) {
 								
@@ -322,7 +323,7 @@ public class BeanMeta<T> {
 
 					// Now iterate through all the setters.
 					for (BeanMethod bm : bms) {
-						if (bm.isSetter) {
+						if (bm.methodType == SETTER) {
 							BeanPropertyMeta.Builder bpm = normalProps.get(bm.propertyName);
 							if (bm.matchesPropertyType(bpm))
 								bpm.setSetter(bm.method);
@@ -501,20 +502,30 @@ public class BeanMeta<T> {
 		return typeProperty;
 	}
 
+	/**
+	 * Possible property method types.
+	 */
+	static enum MethodType {
+		UNKNOWN, 
+		GETTER, 
+		SETTER, 
+		EXTRAKEYS;
+	}
+	
 	/*
 	 * Temporary getter/setter method struct.
 	 */
 	private static final class BeanMethod {
 		String propertyName;
-		boolean isSetter;
+		MethodType methodType;
 		Method method;
 		Class<?> type;
 
-		BeanMethod(String propertyName, boolean isSetter, Method method) {
+		BeanMethod(String propertyName, MethodType type, Method method) {
 			this.propertyName = propertyName;
-			this.isSetter = isSetter;
+			this.methodType = type;
 			this.method = method;
-			if (isSetter)
+			if (type == MethodType.SETTER)
 				this.type = method.getParameterTypes()[0];
 			else
 				this.type = method.getReturnType();
@@ -593,7 +604,7 @@ public class BeanMeta<T> {
 				
 				Class<?>[] pt = m.getParameterTypes();
 				Class<?> rt = m.getReturnType();
-				boolean isGetter = false, isSetter = false;
+				MethodType methodType = UNKNOWN;
 				String bpName = bpName(bp);
 				
 				if (! (isEmpty(bpName) || filterProps.isEmpty() || filterProps.contains(bpName))) 
@@ -601,13 +612,13 @@ public class BeanMeta<T> {
 				
 				if (pt.length == 0) {
 					if (n.startsWith("get") && (! rt.equals(Void.TYPE))) {
-						isGetter = true;
+						methodType = GETTER;
 						n = n.substring(3);
 					} else if (n.startsWith("is") && (rt.equals(Boolean.TYPE) || rt.equals(Boolean.class))) {
-						isGetter = true;
+						methodType = GETTER;
 						n = n.substring(2);
 					} else if (bpName != null) {
-						isGetter = true;
+						methodType = GETTER;
 						if (bpName.isEmpty()) {
 							if (n.startsWith("get"))
 								n = n.substring(3);
@@ -620,10 +631,10 @@ public class BeanMeta<T> {
 					}
 				} else if (pt.length == 1) {
 					if (n.startsWith("set") && (isParentClass(rt, c) || rt.equals(Void.TYPE))) {
-						isSetter = true;
+						methodType = SETTER;
 						n = n.substring(3);
 					} else if (bpName != null) {
-						isSetter = true;
+						methodType = SETTER;
 						if (bpName.isEmpty()) {
 							if (n.startsWith("set"))
 								n = n.substring(3);
@@ -632,16 +643,16 @@ public class BeanMeta<T> {
 							n = bpName;
 						}
 					} else if (fluentSetters && isParentClass(rt, c)) {
-						isSetter = true;
+						methodType = SETTER;
 					}
 				} else if (pt.length == 2) {
 					if ("*".equals(bpName)) {
-						isSetter = true;
+						methodType = SETTER;
 						n = bpName;
 					}
 				}
 				n = pn.getPropertyName(n);
-				if (isGetter || isSetter) {
+				if (methodType == GETTER || methodType == SETTER) {
 					if (bpName != null && ! bpName.isEmpty()) {
 						n = bpName;
 						if (! fixedBeanProps.isEmpty())
@@ -649,7 +660,7 @@ public class BeanMeta<T> {
 								n = null;  // Could happen if filtered via BEAN_includeProperties/BEAN_excludeProperties
 					}
 					if (n != null)
-						l.add(new BeanMethod(n, isSetter, m));
+						l.add(new BeanMethod(n, methodType, m));
 				}
 			}
 		}
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 1644c7e..4f7c454 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
@@ -88,7 +88,7 @@ public final class BeanPropertyMeta {
 		BeanContext beanContext;
 		String name;
 		Field field;
-		Method getter, setter;
+		Method getter, setter, extraKeys;
 		boolean isConstructorArg, isUri, isDyna;
 		ClassMeta<?> rawTypeMeta, typeMeta;
 		String[] properties;
@@ -325,6 +325,12 @@ public final class BeanPropertyMeta {
 			return this;
 		}
 
+		BeanPropertyMeta.Builder setExtraKeys(Method extraKeys) {
+			setAccessible(extraKeys, false);
+			this.extraKeys = extraKeys;
+			return this;
+		}
+
 		BeanPropertyMeta.Builder setAsConstructorArg() {
 			this.isConstructorArg = true;
 			return this;

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