Author: bpoussin Date: 2010-12-02 10:42:21 +0100 (Thu, 02 Dec 2010) New Revision: 1962 Url: http://nuiton.org/repositories/revision/nuiton-utils/1962 Log: keep in available object, object created to prevent multiple instanciation Modified: trunk/src/main/java/org/nuiton/util/ObjectUtil.java Modified: trunk/src/main/java/org/nuiton/util/ObjectUtil.java =================================================================== --- trunk/src/main/java/org/nuiton/util/ObjectUtil.java 2010-12-02 01:03:40 UTC (rev 1961) +++ trunk/src/main/java/org/nuiton/util/ObjectUtil.java 2010-12-02 09:42:21 UTC (rev 1962) @@ -54,6 +54,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.LinkedList; import java.util.List; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; @@ -93,12 +94,16 @@ if (constructors.length != 1) { throw new IllegalArgumentException(_("Your class %s has more than one constructor", clazz)); } + + // copy collection into modifiable list to add new object + List container = new LinkedList(args); + Constructor<E> constructor = constructors[0]; Class[] paramTypes = constructor.getParameterTypes(); Object[] params = new Object[paramTypes.length]; for (int i=0; i<paramTypes.length; i++) { - Object o = choiceArgument(paramTypes[i], args, nullIfMissing); + Object o = choiceArgument(paramTypes[i], container, nullIfMissing); params[i] = o; } @@ -122,13 +127,15 @@ * @param nullIfMissing * @return */ - static protected Object choiceArgument(Class clazz, Collection args, boolean nullIfMissing) { + static protected Object choiceArgument(Class clazz, List args, boolean nullIfMissing) { Object result = null; + boolean addResult = false; for (Object o : args) { if (o != null) { if ((o instanceof Class) && clazz.isAssignableFrom((Class) o)) { // cas on l'on trouve une class dans arg qui une fois instancier convient result = newInstance((Class) o, args, nullIfMissing); + addResult = true; } else if (clazz.isInstance(o)) { // cas on l'on retrouve un objet assignable pour ce type result = o; @@ -136,6 +143,13 @@ } } + if (addResult) { + // on ajoute en tete pour qu'il soit retrouve dans les premiers + // et non pas reinstancier une nouvelle fois si on en a besoin + // a nouveau + args.add(0, result); + } + // si on ne retrouve rien, result est reste a null if (result == null && !nullIfMissing) { throw new IllegalArgumentException(_(
participants (1)
-
bpoussin@users.nuiton.org