juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject incubator-juneau git commit: Convert BeanPropertyMeta to use Builder and final fields.
Date Thu, 09 Feb 2017 23:47:56 GMT
Repository: incubator-juneau
Updated Branches:
  refs/heads/master 5818e25b6 -> 58781bee5


Convert BeanPropertyMeta to use Builder and final fields.

Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/58781bee
Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/58781bee
Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/58781bee

Branch: refs/heads/master
Commit: 58781bee5184086063843e5ce5b438e1d28f157c
Parents: 5818e25
Author: JamesBognar <jamesbognar@apache.org>
Authored: Thu Feb 9 18:47:52 2017 -0500
Committer: JamesBognar <jamesbognar@apache.org>
Committed: Thu Feb 9 18:47:52 2017 -0500

----------------------------------------------------------------------
 .../main/java/org/apache/juneau/BeanMeta.java   |  95 ++---
 .../org/apache/juneau/BeanPropertyMeta.java     | 360 +++++++++++--------
 .../apache/juneau/internal/DelegateBeanMap.java |  15 +-
 3 files changed, 257 insertions(+), 213 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/58781bee/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
index 42425ee..40f1346 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanMeta.java
@@ -111,17 +111,17 @@ public class BeanMeta<T> {
 		this.notABeanReason = b.init(this);
 
 		this.beanFilter = beanFilter;
-		this.dictionaryName = (beanFilter == null ? null : beanFilter.getTypeName());
-		this.properties = b.properties;
+		this.dictionaryName = beanFilter == null ? null : beanFilter.getTypeName();
+		this.properties = b.properties == null ? null : Collections.unmodifiableMap(b.properties);
 		this.getterProps = Collections.unmodifiableMap(b.getterProps);
 		this.setterProps = Collections.unmodifiableMap(b.setterProps);
-		this.typeVarImpls = b.typeVarImpls;
+		this.typeVarImpls = b.typeVarImpls == null ? null : Collections.unmodifiableMap(b.typeVarImpls);
 		this.constructor = b.constructor;
 		this.constructorArgs = b.constructorArgs;
 		this.extMeta = b.extMeta;
-		this.subTypeProperty = b.subTypeIdProperty;
+		this.subTypeProperty = b.subTypeIdProperty == null ? null : b.subTypeIdProperty.build();
 		this.beanRegistry = b.beanRegistry;
-		this.typeProperty = new BeanPropertyMeta(this, ctx.getBeanTypePropertyName(), ctx.string(),
beanRegistry);
+		this.typeProperty = new BeanPropertyMeta.Builder(this, ctx.getBeanTypePropertyName(), ctx.string(),
beanRegistry).build();
 	}
 
 	private static final class Builder<T> {
@@ -136,7 +136,7 @@ public class BeanMeta<T> {
 		Constructor<T> constructor;
 		String[] constructorArgs = new String[0];
 		MetadataMap extMeta = new MetadataMap();
-		BeanPropertyMeta subTypeIdProperty;
+		BeanPropertyMeta.Builder subTypeIdProperty;
 		PropertyNamer propertyNamer;
 		BeanRegistry beanRegistry;
 
@@ -175,7 +175,7 @@ public class BeanMeta<T> {
 				if (stopClass == null)
 					stopClass = Object.class;
 
-				Map<String,BeanPropertyMeta> normalProps = new LinkedHashMap<String,BeanPropertyMeta>();
+				Map<String,BeanPropertyMeta.Builder> normalProps = new LinkedHashMap<String,BeanPropertyMeta.Builder>();
 
 				/// See if this class matches one the patterns in the exclude-class list.
 				if (ctx.isNotABean(c))
@@ -238,7 +238,7 @@ public class BeanMeta<T> {
 				// First populate the properties with those specified in the bean annotation to
 				// ensure that ordering first.
 				for (String name : fixedBeanProps)
-					normalProps.put(name, new BeanPropertyMeta(beanMeta, name));
+					normalProps.put(name, new BeanPropertyMeta.Builder(beanMeta, name));
 
 				if (ctx.useJavaBeanIntrospector) {
 					BeanInfo bi = null;
@@ -250,7 +250,7 @@ public class BeanMeta<T> {
 						for (PropertyDescriptor pd : bi.getPropertyDescriptors()) {
 							String name = pd.getName();
 							if (! normalProps.containsKey(name))
-								normalProps.put(name, new BeanPropertyMeta(beanMeta, name));
+								normalProps.put(name, new BeanPropertyMeta.Builder(beanMeta, name));
 							normalProps.get(name).setGetter(pd.getReadMethod()).setSetter(pd.getWriteMethod());
 						}
 					}
@@ -261,7 +261,7 @@ public class BeanMeta<T> {
 						String name = findPropertyName(f, fixedBeanProps);
 						if (name != null) {
 							if (! normalProps.containsKey(name))
-								normalProps.put(name, new BeanPropertyMeta(beanMeta, name));
+								normalProps.put(name, new BeanPropertyMeta.Builder(beanMeta, name));
 							normalProps.get(name).setField(f);
 						}
 					}
@@ -273,8 +273,8 @@ public class BeanMeta<T> {
 						String pn = bm.propertyName;
 						Method m = bm.method;
 						if (! normalProps.containsKey(pn))
-							normalProps.put(pn, new BeanPropertyMeta(beanMeta, pn));
-						BeanPropertyMeta bpm = normalProps.get(pn);
+							normalProps.put(pn, new BeanPropertyMeta.Builder(beanMeta, pn));
+						BeanPropertyMeta.Builder bpm = normalProps.get(pn);
 						if (! bm.isSetter)
 							bpm.setGetter(m);
 					}
@@ -282,7 +282,7 @@ public class BeanMeta<T> {
 					// Now iterate through all the setters.
 					for (BeanMethod bm : bms) {
 						if (bm.isSetter) {
-							BeanPropertyMeta bpm = normalProps.get(bm.propertyName);
+							BeanPropertyMeta.Builder bpm = normalProps.get(bm.propertyName);
 							if (bm.matchesPropertyType(bpm))
 								bpm.setSetter(bm.method);
 						}
@@ -295,16 +295,16 @@ public class BeanMeta<T> {
 					typeVarImpls = null;
 
 				// Eliminate invalid properties, and set the contents of getterProps and setterProps.
-				for (Iterator<BeanPropertyMeta> i = normalProps.values().iterator(); i.hasNext();)
{
-					BeanPropertyMeta p = i.next();
+				for (Iterator<BeanPropertyMeta.Builder> i = normalProps.values().iterator(); i.hasNext();)
{
+					BeanPropertyMeta.Builder p = i.next();
 					try {
 						if (p.validate(ctx, beanRegistry, typeVarImpls)) {
 
-							if (p.getGetter() != null)
-								getterProps.put(p.getGetter(), p.getName());
+							if (p.getter != null)
+								getterProps.put(p.getter, p.name);
 
-							if (p.getSetter() != null)
-								setterProps.put(p.getSetter(), p.getName());
+							if (p.setter != null)
+								setterProps.put(p.setter, p.name);
 
 						} else {
 							i.remove();
@@ -321,7 +321,7 @@ public class BeanMeta<T> {
 
 				// Mark constructor arg properties.
 				for (String fp : constructorArgs) {
-					BeanPropertyMeta m = normalProps.get(fp);
+					BeanPropertyMeta.Builder m = normalProps.get(fp);
 					if (m == null)
 						throw new BeanRuntimeException(c, "The property ''{0}'' was defined on the @BeanConstructor(properties=X)
annotation but was not found on the class definition.", fp);
 					m.setAsConstructorArg();
@@ -337,11 +337,13 @@ public class BeanMeta<T> {
 
 				if (beanFilter != null && beanFilter.getSubTypeProperty() != null) {
 					String subTypeProperty = beanFilter.getSubTypeProperty();
-					this.subTypeIdProperty = new SubTypePropertyMeta(beanMeta, subTypeProperty, beanFilter.getSubTypes(),
normalProps.remove(subTypeProperty), beanRegistry);
-					properties.put(subTypeProperty, this.subTypeIdProperty);
+					BeanPropertyMeta.Builder stp = normalProps.remove(subTypeProperty);
+					this.subTypeIdProperty = new SubTypePropertyMeta.Builder(beanMeta, subTypeProperty,
beanFilter.getSubTypes(), stp == null ? null : stp.build(), beanRegistry);
+					properties.put(subTypeProperty, this.subTypeIdProperty.build());
 				}
 
-				properties.putAll(normalProps);
+				for (Map.Entry<String,BeanPropertyMeta.Builder> e : normalProps.entrySet())
+					properties.put(e.getKey(), e.getValue().build());
 
 				// If a beanFilter is defined, look for inclusion and exclusion lists.
 				if (beanFilter != null) {
@@ -374,9 +376,6 @@ public class BeanMeta<T> {
 					properties = properties2;
 				}
 
-				// We return this through the Bean.keySet() interface, so make sure it's not modifiable.
-				properties = Collections.unmodifiableMap(properties);
-
 			} catch (BeanRuntimeException e) {
 				throw e;
 			} catch (Exception e) {
@@ -480,16 +479,16 @@ public class BeanMeta<T> {
 		 * Returns true if this method matches the class type of the specified property.
 		 * Only meant to be used for setters.
 		 */
-		boolean matchesPropertyType(BeanPropertyMeta b) {
+		boolean matchesPropertyType(BeanPropertyMeta.Builder b) {
 			if (b == null)
 				return false;
 
 			// Get the bean property type from the getter/field.
 			Class<?> pt = null;
-			if (b.getGetter() != null)
-				pt = b.getGetter().getReturnType();
-			else if (b.getField() != null)
-				pt = b.getField().getType();
+			if (b.getter != null)
+				pt = b.getter.getReturnType();
+			else if (b.field != null)
+				pt = b.field.getType();
 
 			// Doesn't match if no getter/field defined.
 			if (pt == null)
@@ -501,10 +500,10 @@ public class BeanMeta<T> {
 
 			// If a setter was previously set, only use this setter if it's a closer
 			// match (e.g. prev type is a superclass of this type).
-			if (b.getSetter() == null)
+			if (b.setter == null)
 				return true;
 
-			Class<?> prevType = b.getSetter().getParameterTypes()[0];
+			Class<?> prevType = b.setter.getParameterTypes()[0];
 			return isParentClass(prevType, type, true);
 		}
 
@@ -745,15 +744,29 @@ public class BeanMeta<T> {
 	@SuppressWarnings({"rawtypes","unchecked"})
 	private static class SubTypePropertyMeta extends BeanPropertyMeta {
 
-		private Map<Class<?>,String> subTypes;
-		private BeanPropertyMeta realProperty;  // Bean property if bean actually has a real subtype
field.
-		private BeanMeta<?> beanMeta;
+		private final Map<Class<?>,String> subTypes;
+		private final BeanPropertyMeta realProperty;  // Bean property if bean actually has a real
subtype field.
+
+		static class Builder extends BeanPropertyMeta.Builder {
+			Map<Class<?>,String> subTypes;
+			BeanPropertyMeta realProperty;
+
+			Builder(BeanMeta beanMeta, String subTypeAttr, Map<Class<?>,String> subTypes,
BeanPropertyMeta realProperty, BeanRegistry beanRegistry) {
+				super(beanMeta, subTypeAttr, beanMeta.ctx.string(), beanRegistry);
+				this.subTypes = subTypes;
+				this.realProperty = realProperty;
+			}
+
+			@Override
+			public SubTypePropertyMeta build() {
+				return new SubTypePropertyMeta(this);
+			}
+		}
 
-		SubTypePropertyMeta(BeanMeta beanMeta, String subTypeAttr, Map<Class<?>,String>
subTypes, BeanPropertyMeta realProperty, BeanRegistry beanRegistry) {
-			super(beanMeta, subTypeAttr, beanMeta.ctx.string(), beanRegistry);
-			this.subTypes = subTypes;
-			this.realProperty = realProperty;
-			this.beanMeta = beanMeta;
+		SubTypePropertyMeta(Builder b) {
+			super(b);
+			this.subTypes = b.subTypes;
+			this.realProperty = b.realProperty;
 		}
 
 		/*

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/58781bee/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 33a163a..516d3d4 100644
--- a/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -42,45 +42,211 @@ import org.apache.juneau.utils.*;
 @SuppressWarnings({ "rawtypes", "unchecked" })
 public class BeanPropertyMeta {
 
-	private Field field;
-	private Method getter, setter;
-	private boolean isConstructorArg, isUri;
+	final BeanMeta<?> beanMeta;                               // The bean that this property
belongs to.
+	private final BeanContext beanContext;                    // The context that created this
meta.
 
-	private final BeanMeta<?> beanMeta;
-	private final BeanContext beanContext;
+	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 boolean isUri;                              // True if this is a URL/URI or
annotated with @URI.
 
-	private String name;
-	private ClassMeta<?>
-		rawTypeMeta,                           // The real class type of the bean property.
-		typeMeta;                              // The transformed class type of the bean property.
-	private String[] properties;
-	private PojoSwap swap;                     // PojoSwap defined only via @BeanProperty annotation.
+	private final ClassMeta<?>
+		rawTypeMeta,                                           // The real class type of the bean
property.
+		typeMeta;                                              // The transformed class type of
the bean property.
 
-	private MetadataMap extMeta = new MetadataMap();  // Extended metadata
-	BeanRegistry beanRegistry;
+	private final String[] properties;                        // The value of the @BeanProperty(properties)
annotation.
+	private final PojoSwap swap;                              // PojoSwap defined only via @BeanProperty
annotation.
+
+	private final MetadataMap extMeta = new MetadataMap();    // Extended metadata
+	private final BeanRegistry beanRegistry;
+
+	private final Object overrideValue;                       // The bean property value (if
it's an overridden delegate).
+	private final BeanPropertyMeta delegateFor;               // The bean property that this
meta is a delegate for.
 
 	/**
-	 * Constructor.
-	 *
-	 * @param beanMeta The metadata of the bean containing this property.
-	 * @param name This property name.
+	 * BeanPropertyMeta builder class.
 	 */
-	protected BeanPropertyMeta(BeanMeta<?> beanMeta, String name) {
-		this.beanMeta = beanMeta;
-		this.beanContext = beanMeta.ctx;
-		this.name = name;
-	}
+	public static class Builder {
+		private BeanMeta<?> beanMeta;
+		private BeanContext beanContext;
+		String name;
+		Field field;
+		Method getter, setter;
+		private boolean isConstructorArg, isUri;
+		private ClassMeta<?> rawTypeMeta, typeMeta;
+		private String[] properties;
+		private PojoSwap swap;
+		private BeanRegistry beanRegistry;
+		private Object overrideValue;
+		private BeanPropertyMeta delegateFor;
+
+		Builder(BeanMeta<?> beanMeta, String name) {
+			this.beanMeta = beanMeta;
+			this.beanContext = beanMeta.ctx;
+			this.name = name;
+		}
+
+		Builder(BeanMeta<?> beanMeta, String name, ClassMeta<?> rawTypeMeta, BeanRegistry
beanRegistry) {
+			this(beanMeta, name);
+			this.rawTypeMeta = rawTypeMeta;
+			if (rawTypeMeta == null)
+				throw new RuntimeException("xxx");
+			this.typeMeta = rawTypeMeta;
+			this.beanRegistry = beanRegistry;
+		}
+
+		/**
+		 * BeanPropertyMeta builder for delegate classes.
+		 *
+		 * @param beanMeta The Bean that this property belongs to.
+		 * @param name The property name.
+		 * @param overrideValue The overridden value of this bean property.
+		 * @param delegateFor The original bean property that this one is overriding.
+		 */
+		public Builder(BeanMeta<?> beanMeta, String name, Object overrideValue, BeanPropertyMeta
delegateFor) {
+			this(beanMeta, name);
+			this.delegateFor = delegateFor;
+			this.overrideValue = overrideValue;
+		}
+
+		boolean validate(BeanContext f, BeanRegistry parentBeanRegistry, Map<Class<?>,Class<?>[]>
typeVarImpls) throws Exception {
+
+			List<Class<?>> bdClasses = new ArrayList<Class<?>>();
+
+			if (field == null && getter == null)
+				return false;
+
+			if (field == null && setter == null && f.beansRequireSettersForGetters
&& ! isConstructorArg)
+				return false;
+
+			if (field != null) {
+				BeanProperty p = field.getAnnotation(BeanProperty.class);
+				rawTypeMeta = f.resolveClassMeta(p, field.getGenericType(), typeVarImpls);
+				isUri |= (rawTypeMeta.isUri() || field.isAnnotationPresent(org.apache.juneau.annotation.URI.class));
+				if (p != null) {
+					swap = getPropertyPojoSwap(p);
+					if (! p.properties().isEmpty())
+						properties = StringUtils.split(p.properties(), ',');
+					bdClasses.addAll(Arrays.asList(p.beanDictionary()));
+				}
+			}
+
+			if (getter != null) {
+				BeanProperty p = getter.getAnnotation(BeanProperty.class);
+				if (rawTypeMeta == null)
+					rawTypeMeta = f.resolveClassMeta(p, getter.getGenericReturnType(), typeVarImpls);
+				isUri |= (rawTypeMeta.isUri() || getter.isAnnotationPresent(org.apache.juneau.annotation.URI.class));
+				if (p != null) {
+					if (swap == null)
+						swap = getPropertyPojoSwap(p);
+					if (properties != null && ! p.properties().isEmpty())
+						properties = StringUtils.split(p.properties(), ',');
+					bdClasses.addAll(Arrays.asList(p.beanDictionary()));
+				}
+			}
+
+			if (setter != null) {
+				BeanProperty p = setter.getAnnotation(BeanProperty.class);
+				if (rawTypeMeta == null)
+					rawTypeMeta = f.resolveClassMeta(p, setter.getGenericParameterTypes()[0], typeVarImpls);
+				isUri |= (rawTypeMeta.isUri() || setter.isAnnotationPresent(org.apache.juneau.annotation.URI.class));
+				if (p != null) {
+				if (swap == null)
+					swap = getPropertyPojoSwap(p);
+					if (properties != null && ! p.properties().isEmpty())
+						properties = StringUtils.split(p.properties(), ',');
+					bdClasses.addAll(Arrays.asList(p.beanDictionary()));
+				}
+			}
+
+			if (rawTypeMeta == null)
+				return false;
+
+			this.beanRegistry = new BeanRegistry(beanContext, parentBeanRegistry, bdClasses.toArray(new
Class<?>[0]));
+
+			// Do some annotation validation.
+			Class<?> c = rawTypeMeta.getInnerClass();
+			if (getter != null && ! isParentClass(getter.getReturnType(), c))
+				return false;
+			if (setter != null && ! isParentClass(setter.getParameterTypes()[0], c))
+				return false;
+			if (field != null && ! isParentClass(field.getType(), c))
+				return false;
+
+			if (typeMeta == null)
+				typeMeta = (swap != null ? swap.getSwapClassMeta(beanContext) : rawTypeMeta == null ?
beanContext.object() : rawTypeMeta.getSerializedClassMeta());
+			if (typeMeta == null)
+				typeMeta = rawTypeMeta;
+
+			return true;
+		}
+
+		/**
+		 * @return A new BeanPropertyMeta object using this builder.
+		 */
+		public BeanPropertyMeta build() {
+			return new BeanPropertyMeta(this);
+		}
+
+		private PojoSwap getPropertyPojoSwap(BeanProperty p) throws Exception {
+			Class<?> c = p.swap();
+			if (c == Null.class)
+				return null;
+			try {
+				if (ClassUtils.isParentClass(PojoSwap.class, c)) {
+					return (PojoSwap)c.newInstance();
+				}
+				throw new RuntimeException("TODO - Surrogate swaps not yet supported.");
+			} catch (Exception e) {
+				throw new BeanRuntimeException(this.beanMeta.c, "Could not instantiate PojoSwap ''{0}''
for bean property ''{1}''", c.getName(), this.name).initCause(e);
+			}
+		}
+
+		BeanPropertyMeta.Builder setGetter(Method getter) {
+			setAccessible(getter);
+			this.getter = getter;
+			return this;
+		}
+
+		BeanPropertyMeta.Builder setSetter(Method setter) {
+			setAccessible(setter);
+			this.setter = setter;
+			return this;
+		}
+
+		BeanPropertyMeta.Builder setField(Field field) {
+			setAccessible(field);
+			this.field = field;
+			return this;
+		}
+
+		BeanPropertyMeta.Builder setAsConstructorArg() {
+			this.isConstructorArg = true;
+			return this;
+		}
 
-	BeanPropertyMeta(BeanMeta<?> beanMeta, String name, ClassMeta<?> rawTypeMeta,
BeanRegistry beanRegistry) {
-		this(beanMeta, name);
-		this.rawTypeMeta = rawTypeMeta;
-		this.beanRegistry = beanRegistry;
 	}
 
-	BeanPropertyMeta(BeanMeta<?> beanMeta, String name, Method getter, Method setter)
{
-		this(beanMeta, name);
-		setGetter(getter);
-		setSetter(setter);
+	/**
+	 * Creates a new BeanPropertyMeta using the contents of the specified builder.
+	 *
+	 * @param b The builder to copy fields from.
+	 */
+	protected BeanPropertyMeta(BeanPropertyMeta.Builder b) {
+		this.field = b.field;
+		this.getter = b.getter;
+		this.setter = b.setter;
+		this.isUri = b.isUri;
+		this.beanMeta = b.beanMeta;
+		this.beanContext = b.beanContext;
+		this.name = b.name;
+		this.rawTypeMeta = b.rawTypeMeta;
+		this.typeMeta = b.typeMeta;
+		this.properties = b.properties;
+		this.swap = b.swap;
+		this.beanRegistry = b.beanRegistry;
+		this.overrideValue = b.overrideValue;
+		this.delegateFor = b.delegateFor;
 	}
 
 	/**
@@ -139,8 +305,6 @@ public class BeanPropertyMeta {
 	 * @return The {@link ClassMeta} of the class of this property.
 	 */
 	public ClassMeta<?> getClassMeta() {
-		if (typeMeta == null)
-			typeMeta = (swap != null ? swap.getSwapClassMeta(beanContext) : rawTypeMeta == null ?
beanContext.object() : rawTypeMeta.getSerializedClassMeta());
 		return typeMeta;
 	}
 
@@ -158,52 +322,6 @@ public class BeanPropertyMeta {
 	}
 
 	/**
-	 * Sets the getter method for this property.
-	 *
-	 * @param getter The getter method to associate with this property.
-	 * @return This object (for method chaining).
-	 */
-	BeanPropertyMeta setGetter(Method getter) {
-		setAccessible(getter);
-		this.getter = getter;
-		return this;
-	}
-
-	/**
-	 * Sets the setter method for this property.
-	 *
-	 * @param setter The setter method to associate with this property.
-	 * @return This object (for method chaining).
-	 */
-	BeanPropertyMeta setSetter(Method setter) {
-		setAccessible(setter);
-		this.setter = setter;
-		return this;
-	}
-
-	/**
-	 * Sets the field for this property.
-	 *
-	 * @param field The field to associate with this property.
-	 * @return This object (for method chaining).
-	 */
-	BeanPropertyMeta setField(Field field) {
-		setAccessible(field);
-		this.field = field;
-		return this;
-	}
-
-	/**
-	 * Marks this property as only settable through a constructor arg.
-	 *
-	 * @return This object (for method chaining).
-	 */
-	BeanPropertyMeta setAsConstructorArg() {
-		this.isConstructorArg = true;
-		return this;
-	}
-
-	/**
 	 * Returns <jk>true</jk> if this bean property is a URI.
 	 * <p>
 	 * A bean property can be considered a URI if any of the following are true:
@@ -236,90 +354,11 @@ public class BeanPropertyMeta {
 	 * @return Extended metadata on this bean property.  Never <jk>null</jk>.
 	 */
 	public <M extends BeanPropertyMetaExtended> M getExtendedMeta(Class<M> c) {
+		if (delegateFor != null)
+			return delegateFor.getExtendedMeta(c);
 		return extMeta.get(c, this);
 	}
 
-	boolean validate(BeanContext f, BeanRegistry parentBeanRegistry, Map<Class<?>,Class<?>[]>
typeVarImpls) throws Exception {
-
-		List<Class<?>> bdClasses = new ArrayList<Class<?>>();
-
-		if (field == null && getter == null)
-			return false;
-
-		if (field == null && setter == null && f.beansRequireSettersForGetters
&& ! isConstructorArg)
-			return false;
-
-		if (field != null) {
-			BeanProperty p = field.getAnnotation(BeanProperty.class);
-			rawTypeMeta = f.resolveClassMeta(p, field.getGenericType(), typeVarImpls);
-			isUri |= (rawTypeMeta.isUri() || field.isAnnotationPresent(org.apache.juneau.annotation.URI.class));
-			if (p != null) {
-				swap = getPropertyPojoSwap(p);
-				if (! p.properties().isEmpty())
-					properties = StringUtils.split(p.properties(), ',');
-				bdClasses.addAll(Arrays.asList(p.beanDictionary()));
-			}
-		}
-
-		if (getter != null) {
-			BeanProperty p = getter.getAnnotation(BeanProperty.class);
-			if (rawTypeMeta == null)
-				rawTypeMeta = f.resolveClassMeta(p, getter.getGenericReturnType(), typeVarImpls);
-			isUri |= (rawTypeMeta.isUri() || getter.isAnnotationPresent(org.apache.juneau.annotation.URI.class));
-			if (p != null) {
-				if (swap == null)
-					swap = getPropertyPojoSwap(p);
-				if (properties != null && ! p.properties().isEmpty())
-					properties = StringUtils.split(p.properties(), ',');
-				bdClasses.addAll(Arrays.asList(p.beanDictionary()));
-			}
-		}
-
-		if (setter != null) {
-			BeanProperty p = setter.getAnnotation(BeanProperty.class);
-			if (rawTypeMeta == null)
-				rawTypeMeta = f.resolveClassMeta(p, setter.getGenericParameterTypes()[0], typeVarImpls);
-			isUri |= (rawTypeMeta.isUri() || setter.isAnnotationPresent(org.apache.juneau.annotation.URI.class));
-			if (p != null) {
-			if (swap == null)
-				swap = getPropertyPojoSwap(p);
-				if (properties != null && ! p.properties().isEmpty())
-					properties = StringUtils.split(p.properties(), ',');
-				bdClasses.addAll(Arrays.asList(p.beanDictionary()));
-			}
-		}
-
-		if (rawTypeMeta == null)
-			return false;
-
-		this.beanRegistry = new BeanRegistry(beanContext, parentBeanRegistry, bdClasses.toArray(new
Class<?>[0]));
-
-		// Do some annotation validation.
-		Class<?> c = rawTypeMeta.getInnerClass();
-		if (getter != null && ! isParentClass(getter.getReturnType(), c))
-			return false;
-		if (setter != null && ! isParentClass(setter.getParameterTypes()[0], c))
-			return false;
-		if (field != null && ! isParentClass(field.getType(), c))
-			return false;
-
-		return true;
-	}
-
-	private PojoSwap getPropertyPojoSwap(BeanProperty p) throws Exception {
-		Class<?> c = p.swap();
-		if (c == Null.class)
-			return null;
-		try {
-			if (ClassUtils.isParentClass(PojoSwap.class, c)) {
-				return (PojoSwap)c.newInstance();
-			}
-			throw new RuntimeException("TODO - Surrogate swaps not yet supported.");
-		} catch (Exception e) {
-			throw new BeanRuntimeException(this.beanMeta.c, "Could not instantiate PojoSwap ''{0}''
for bean property ''{1}''", c.getName(), this.name).initCause(e);
-		}
-	}
-
 	/**
 	 * Equivalent to calling {@link BeanMap#get(Object)}, but is faster since it avoids looking
up the property meta.
 	 *
@@ -328,6 +367,9 @@ public class BeanPropertyMeta {
 	 */
 	public Object get(BeanMap<?> m) {
 		try {
+			if (overrideValue != null)
+				return overrideValue;
+
 			// Read-only beans have their properties stored in a cache until getBean() is called.
 			Object bean = m.bean;
 			if (bean == null)

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/58781bee/juneau-core/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
----------------------------------------------------------------------
diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java b/juneau-core/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
index b5cc352..940eda3 100644
--- a/juneau-core/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
+++ b/juneau-core/src/main/java/org/apache/juneau/internal/DelegateBeanMap.java
@@ -115,19 +115,8 @@ public class DelegateBeanMap<T> extends BeanMap<T> {
 		List<BeanPropertyMeta> l = new ArrayList<BeanPropertyMeta>(keys.size());
 		for (final String key : keys) {
 			BeanPropertyMeta p = this.getPropertyMeta(key);
-			if (overrideValues.containsKey(key)) {
-				final BeanPropertyMeta p2 = p;
-				p = new BeanPropertyMeta(this.meta, key) {
-					@Override /* BeanPropertyMeta */
-					public Object get(BeanMap<?> m) {
-						return overrideValues.get(key);
-					}
-					@Override /* BeanPropertyMeta */
-					public <M extends BeanPropertyMetaExtended> M getExtendedMeta(Class<M> c)
{
-						return p2.getExtendedMeta(c);
-					}
-				};
-			}
+			if (overrideValues.containsKey(key))
+				p = new BeanPropertyMeta.Builder(this.meta, key, overrideValues.get(key), p).build();
 			if (p == null)
 				throw new BeanRuntimeException(super.getClassMeta().getInnerClass(), "Property ''{0}''
not found on class.", key);
 			l.add(p);


Mime
View raw message