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 2021/01/08 20:31:24 UTC

[juneau] branch master updated: Replace ResourceResolver with BeanFactory.

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 fc66353  Replace ResourceResolver with BeanFactory.
fc66353 is described below

commit fc6635394a89167599acb5ecc7e5caf003192d6a
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Fri Jan 8 15:31:07 2021 -0500

    Replace ResourceResolver with BeanFactory.
---
 .../org/apache/juneau/BasicResourceResolver.java   |   1 +
 .../src/main/java/org/apache/juneau/Context.java   |  33 ++++++
 .../org/apache/juneau/FuzzyResourceResolver.java   |   1 +
 .../main/java/org/apache/juneau/PropertyStore.java | 121 ++++++++++++++++++++-
 .../java/org/apache/juneau/ResourceResolver.java   |   1 +
 5 files changed, 155 insertions(+), 2 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BasicResourceResolver.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BasicResourceResolver.java
index fa7bc38..65be819 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BasicResourceResolver.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BasicResourceResolver.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.internal.ClassUtils.*;
 /**
  * Basic implementation of a resource resolver.
  */
+@Deprecated
 public class BasicResourceResolver implements ResourceResolver {
 
 	@Override /* ResourceResolver */
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index ea10788..f363e0e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -17,6 +17,7 @@ import java.util.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
+import org.apache.juneau.cp.*;
 import org.apache.juneau.http.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
@@ -722,6 +723,7 @@ public abstract class Context {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T getInstanceProperty(String key, Class<T> type, Object def, ResourceResolver resolver, Object...args) {
 		return propertyStore.getInstanceProperty(key, type, def, resolver, args);
 	}
@@ -742,11 +744,27 @@ public abstract class Context {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T getInstanceProperty(String key, Object outer, Class<T> type, Object def, ResourceResolver resolver, Object...args) {
 		return propertyStore.getInstanceProperty(key, outer, type, def, resolver, args);
 	}
 
 	/**
+	 * Returns an instance of the specified class, string, or object property.
+	 *
+	 * @param key The property name.
+	 * @param type The class type of the property.
+	 * @param def
+	 * 	The default value if the property doesn't exist.
+	 * 	<br>Can either be an instance of <c>T</c>, or a <code>Class&lt;? <jk>extends</jk> T&gt;</code>.
+	 * @param beanFactory The bean factory to use to instantiate beans.
+	 * @return A new property instance.
+	 */
+	public <T> T getInstanceProperty(String key, Class<T> type, Object def, BeanFactory beanFactory) {
+		return propertyStore.getInstanceProperty(key, type, def, beanFactory);
+	}
+
+	/**
 	 * Returns the specified property as an array of instantiated objects.
 	 *
 	 * @param key The property name.
@@ -783,6 +801,7 @@ public abstract class Context {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T[] getInstanceArrayProperty(String key, Class<T> type, T[] def, ResourceResolver resolver, Object...args) {
 		return propertyStore.getInstanceArrayProperty(key, type, def, resolver, args);
 	}
@@ -801,11 +820,25 @@ public abstract class Context {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T[] getInstanceArrayProperty(String key, Object outer, Class<T> type, T[] def, ResourceResolver resolver, Object...args) {
 		return propertyStore.getInstanceArrayProperty(key, outer, type, def, resolver, args);
 	}
 
 	/**
+	 * Returns the specified property as an array of instantiated objects.
+	 *
+	 * @param key The property name.
+	 * @param type The class type of the property.
+	 * @param def The default object to return if the property doesn't exist.
+	 * @param beanFactory The bean factory to use for instantiating beans.
+	 * @return A new property instance.
+	 */
+	public <T> T[] getInstanceArrayProperty(String key, Class<T> type, T[] def, BeanFactory beanFactory) {
+		return propertyStore.getInstanceArrayProperty(key, type, def, beanFactory);
+	}
+
+	/**
 	 * Returns the keys found in the specified property group.
 	 *
 	 * <p>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/FuzzyResourceResolver.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/FuzzyResourceResolver.java
index cda1770..74907ba 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/FuzzyResourceResolver.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/FuzzyResourceResolver.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.internal.ClassUtils.*;
 /**
  * Basic implementation of a resource resolver.
  */
+@Deprecated
 public class FuzzyResourceResolver implements ResourceResolver {
 
 	@Override /* ResourceResolver */
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java
index 70add25..b4e7d54 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/PropertyStore.java
@@ -22,6 +22,7 @@ import java.util.*;
 import org.apache.juneau.PropertyStoreBuilder.*;
 import org.apache.juneau.assertions.*;
 import org.apache.juneau.collections.*;
+import org.apache.juneau.cp.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.marshall.*;
@@ -518,7 +519,7 @@ public final class PropertyStore {
 	 * @return A new property instance.
 	 */
 	public <T> T getInstanceProperty(String key, Class<T> type, Object def) {
-		return getInstanceProperty(key, type, def, ResourceResolver.BASIC);
+		return getInstanceProperty(key, type, def, new BeanFactory());
 	}
 
 	/**
@@ -536,6 +537,7 @@ public final class PropertyStore {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T getInstanceProperty(String key, Class<T> type, Object def, ResourceResolver resolver, Object...args) {
 		return getInstanceProperty(key, null, type, def, resolver, args);
 	}
@@ -556,6 +558,7 @@ public final class PropertyStore {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T getInstanceProperty(String key, Object outer, Class<T> type, Object def, ResourceResolver resolver, Object...args) {
 		Assertions.assertArgNotNull("type", type);
 		Property p = findProperty(key);
@@ -571,6 +574,36 @@ public final class PropertyStore {
 	}
 
 	/**
+	 * Returns an instance of the specified class, string, or object property.
+	 *
+	 * @param key The property name.
+	 * @param type The class type of the property.
+	 * @param def
+	 * 	The default value if the property doesn't exist.
+	 * 	<br>Can either be an instance of <c>T</c>, or a <code>Class&lt;? <jk>extends</jk> T&gt;</code>.
+	 * @param beanFactory The bean factory to use for instantiating the bean.
+	 * @return A new property instance.
+	 */
+	public <T> T getInstanceProperty(String key, Class<T> type, Object def, BeanFactory beanFactory) {
+		Assertions.assertArgNotNull("type", type);
+		Property p = findProperty(key);
+		if (p != null)
+			return p.asInstance(type, beanFactory);
+		if (def == null)
+			return null;
+		if (def instanceof Class) {
+			try {
+				return beanFactory.createBean((Class<T>)def);
+			} catch (ExecutableException e) {
+				throw new ConfigException(e, "Could not instantiate property ''{0}'' as type ''{1}'' with default value ''{2}''", key, type, def);
+			}
+		}
+		if (type.isInstance(def))
+			return (T)def;
+		throw new ConfigException("Could not instantiate property ''{0}'' as type ''{1}'' with default value ''{2}''", key, type, def);
+	}
+
+	/**
 	 * Returns the specified property as an array of instantiated objects.
 	 *
 	 * @param key The property name.
@@ -579,7 +612,7 @@ public final class PropertyStore {
 	 * @return A new property instance.
 	 */
 	public <T> T[] getInstanceArrayProperty(String key, Class<T> type, T[] def) {
-		return getInstanceArrayProperty(key, type, def, ResourceResolver.BASIC);
+		return getInstanceArrayProperty(key, type, def, new BeanFactory());
 	}
 
 	/**
@@ -595,6 +628,7 @@ public final class PropertyStore {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T[] getInstanceArrayProperty(String key, Class<T> type, T[] def, ResourceResolver resolver, Object...args) {
 		return getInstanceArrayProperty(key, null, type, def, resolver, args);
 	}
@@ -613,12 +647,27 @@ public final class PropertyStore {
 	 * 	Constructors matching the arguments are always used before no-arg constructors.
 	 * @return A new property instance.
 	 */
+	@Deprecated
 	public <T> T[] getInstanceArrayProperty(String key, Object outer, Class<T> type, T[] def, ResourceResolver resolver, Object...args) {
 		Property p = findProperty(key);
 		return p == null ? def : p.asInstanceArray(outer, type, resolver, args);
 	}
 
 	/**
+	 * Returns the specified property as an array of instantiated objects.
+	 *
+	 * @param key The property name.
+	 * @param type The class type of the property.
+	 * @param def The default object to return if the property doesn't exist.
+	 * @param beanFactory The bean factory to use for instantiating beans.
+	 * @return A new property instance.
+	 */
+	public <T> T[] getInstanceArrayProperty(String key, Class<T> type, T[] def, BeanFactory beanFactory) {
+		Property p = findProperty(key);
+		return p == null ? def : p.asInstanceArray(type, beanFactory);
+	}
+
+	/**
 	 * Returns the keys found in the specified property group.
 	 *
 	 * <p>
@@ -948,6 +997,7 @@ public final class PropertyStore {
 		 * @return The instantiated object.
 		 * @throws ConfigException If value could not be instantiated.
 		 */
+		@Deprecated
 		public <T> T asInstance(Object outer, Class<T> iType, ResourceResolver resolver, Object...args) {
 			if (value == null)
 				return null;
@@ -962,6 +1012,28 @@ public final class PropertyStore {
 		}
 
 		/**
+		 * Converts this property to the specified instance type.
+		 *
+		 * @param iType The type to instantiate.
+		 * @param beanFactory The bean factory to use for instantiating beans.
+		 * @param <T> The type to instantiate.
+		 * @return The instantiated object.
+		 * @throws ConfigException If value could not be instantiated.
+		 */
+		public <T> T asInstance(Class<T> iType, BeanFactory beanFactory) {
+			if (value == null)
+				return null;
+			if (type == STRING)
+				return fromString(iType, value.toString());
+			else if (type == OBJECT || type == CLASS) {
+				T t = instantiate(beanFactory, iType, value);
+				if (t != null)
+					return t;
+			}
+			throw new ConfigException("Invalid property instantiation ''{0}'' to ''{1}'' on property ''{2}''", type, iType, name);
+		}
+
+		/**
 		 * Converts this property to an array of specified instance type.
 		 *
 		 * @param outer The outer class if this is a member type.
@@ -972,6 +1044,7 @@ public final class PropertyStore {
 		 * @return The instantiated object.
 		 * @throws ConfigException If value could not be instantiated.
 		 */
+		@Deprecated
 		public <T> T[] asInstanceArray(Object outer, Class<T> eType, ResourceResolver resolver, Object...args) {
 			if (value instanceof Collection) {
 				Collection<?> l = (Collection<?>)value;
@@ -994,6 +1067,37 @@ public final class PropertyStore {
 			throw new ConfigException("Invalid property conversion ''{0}'' to ''{1}[]'' on property ''{2}''", type, eType, name);
 		}
 
+		/**
+		 * Converts this property to an array of specified instance type.
+		 *
+		 * @param eType The entry type to instantiate.
+		 * @param beanFactory The bean factory to use to instantiate beans.
+		 * @param <T> The type to instantiate.
+		 * @return The instantiated object.
+		 * @throws ConfigException If value could not be instantiated.
+		 */
+		public <T> T[] asInstanceArray(Class<T> eType, BeanFactory beanFactory) {
+			if (value instanceof Collection) {
+				Collection<?> l = (Collection<?>)value;
+				Object t = Array.newInstance(eType, l.size());
+				int i = 0;
+				for (Object o : l) {
+					Object o2 = null;
+					if (eType.isInstance(o))
+						o2 = o;
+					else if (type == SET_STRING || type == LIST_STRING)
+						o2 = fromString(eType, o.toString());
+					else if (type == SET_CLASS || type == LIST_CLASS || type == LIST_OBJECT)
+						o2 = instantiate(beanFactory, eType, o);
+					if (o2 == null)
+						throw new ConfigException("Invalid property conversion ''{0}'' to ''{1}[]'' on property ''{2}''", type, eType, name);
+					Array.set(t, i++, o2);
+				}
+				return (T[])t;
+			}
+			throw new ConfigException("Invalid property conversion ''{0}'' to ''{1}[]'' on property ''{2}''", type, eType, name);
+		}
+
 		@Override /* Object */
 		public int hashCode() {
 			return hashCode;
@@ -1018,6 +1122,7 @@ public final class PropertyStore {
 	// Utility methods
 	//-------------------------------------------------------------------------------------------------------------------
 
+	@Deprecated
 	static <T> T instantiate(ResourceResolver resolver, Object outer, Class<T> c, Object value, Object...args) {
 		if (ClassInfo.of(c).isParentOf(value.getClass()))
 			return (T)value;
@@ -1026,6 +1131,18 @@ public final class PropertyStore {
 		return null;
 	}
 
+	static <T> T instantiate(BeanFactory beanFactory, Class<T> c, Object value) {
+		if (ClassInfo.of(c).isParentOf(value.getClass()))
+			return (T)value;
+		try {
+			if (ClassInfo.of(value.getClass()).isChildOf(Class.class))
+				return beanFactory.createBean((Class<T>)value);
+		} catch (ExecutableException e) {
+			throw new ConfigException(e, "Could not create bean of type ''{0}''.", value);
+		}
+		return null;
+	}
+
 	private static String group(String key) {
 		if (key == null || key.indexOf('.') == -1 || key.charAt(key.length()-1) == '.')
 			throw new ConfigException("Invalid property name specified: ''{0}''", key);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ResourceResolver.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ResourceResolver.java
index 9374a5b..3ef3ba3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ResourceResolver.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ResourceResolver.java
@@ -15,6 +15,7 @@ package org.apache.juneau;
 /**
  * Class used to resolve {@link Class} objects to instances.
  */
+@Deprecated
 public interface ResourceResolver {
 
 	/**