@@ -120,7 +120,7 @@ public class IntrospectionHelper implements BuildListener {
nestedTypes = new Hashtable();
nestedCreators = new Hashtable();
nestedStorers = new Hashtable();
this.bean = bean;
Method[] methods = bean.getMethods();
@@ -131,7 +131,7 @@ public class IntrospectionHelper implements BuildListener {
Class[] args = m.getParameterTypes();
// not really user settable properties on tasks
if (org.apache.tools.ant.Task.class.isAssignableFrom(bean)
if (org.apache.tools.ant.Task.class.isAssignableFrom(bean)
&& args.length == 1 &&
(
(
@@ -142,14 +142,14 @@ public class IntrospectionHelper implements BuildListener {
)) {
continue;
}
// hide addTask for TaskContainers
if (org.apache.tools.ant.TaskContainer.class.isAssignableFrom(bean)
&& args.length == 1 && "addTask".equals(name)
if (org.apache.tools.ant.TaskContainer.class.isAssignableFrom(bean)
&& args.length == 1 && "addTask".equals(name)
&& org.apache.tools.ant.Task.class.equals(args[0])) {
continue;
}
if ("addText".equals(name)
&& java.lang.Void.TYPE.equals(returnType)
@@ -164,6 +164,27 @@ public class IntrospectionHelper implements BuildListener {
&& !args[0].isArray()) {
String propName = getPropertyName(name, "set");
if (attributeSetters.get(propName) != null) {
if (java.lang.String.class.equals(args[0])) {
/*
Ignore method m, as there is an overloaded
form of this method that takes in a
non-string argument, which gains higher
priority.
*/
continue;
}
/*
If the argument is not a String, and if there
is an overloaded form of this method already defined,
we just override that with the new one.
This mechanism does not guarantee any specific order
in which the methods will be selected: so any code
that depends on the order in which "set" methods have
been defined, is not guaranteed to be selected in any
particular order.
*/
}
AttributeSetter as = createAttributeSetter(m, args[0]);
if (as != null) {
attributeTypes.put(propName, args[0]);
@@ -179,32 +200,32 @@ public class IntrospectionHelper implements BuildListener {
nestedTypes.put(propName, returnType);
nestedCreators.put(propName, new NestedCreator() {
public Object create(Object parent)
throws InvocationTargetException,
public Object create(Object parent)
throws InvocationTargetException,
IllegalAccessException {
return m.invoke(parent, new Object[] {});
}
});
} else if (name.startsWith("addConfigured")
&& java.lang.Void.TYPE.equals(returnType)
&& args.length == 1
&& !java.lang.String.class.equals(args[0])
&& !args[0].isArray()
&& !args[0].isPrimitive()) {
try {
final Constructor c =
final Constructor c =
args[0].getConstructor(new Class[] {});
String propName = getPropertyName(name, "addConfigured");
nestedTypes.put(propName, args[0]);
nestedCreators.put(propName, new NestedCreator() {
public Object create(Object parent)
public Object create(Object parent)
throws InvocationTargetException, IllegalAccessException, InstantiationException {
Object o = c.newInstance(new Object[] {});
return o;
}
@@ -212,9 +233,9 @@ public class IntrospectionHelper implements BuildListener {
});
nestedStorers.put(propName, new NestedStorer() {
public void store(Object parent, Object child)
public void store(Object parent, Object child)
throws InvocationTargetException, IllegalAccessException, InstantiationException {
m.invoke(parent, new Object[] {child});
}
@@ -227,17 +248,17 @@ public class IntrospectionHelper implements BuildListener {
&& !java.lang.String.class.equals(args[0])
&& !args[0].isArray()
&& !args[0].isPrimitive()) {
try {
final Constructor c =
final Constructor c =
args[0].getConstructor(new Class[] {});
String propName = getPropertyName(name, "add");
nestedTypes.put(propName, args[0]);
nestedCreators.put(propName, new NestedCreator() {
public Object create(Object parent)
public Object create(Object parent)
throws InvocationTargetException, IllegalAccessException, InstantiationException {
Object o = c.newInstance(new Object[] {});
m.invoke(parent, new Object[] {o});
return o;
@@ -249,7 +270,7 @@ public class IntrospectionHelper implements BuildListener {
}
}
}
/**
* Factory method for helper objects.
*/
@@ -265,7 +286,7 @@ public class IntrospectionHelper implements BuildListener {
/**
* Sets the named attribute.
*/
public void setAttribute(Project p, Object element, String attributeName,
public void setAttribute(Project p, Object element, String attributeName,
String value)
throws BuildException {
AttributeSetter as = (AttributeSetter) attributeSetters.get(attributeName);
@@ -316,7 +337,7 @@ public class IntrospectionHelper implements BuildListener {
/**
* Creates a named nested element.
*/
public Object createElement(Project project, Object element, String elementName)
public Object createElement(Project project, Object element, String elementName)
throws BuildException {
NestedCreator nc = (NestedCreator) nestedCreators.get(elementName);
if (nc == null) {
@@ -348,7 +369,7 @@ public class IntrospectionHelper implements BuildListener {
/**
* Creates a named nested element.
*/
public void storeElement(Project project, Object element, Object child, String elementName)
public void storeElement(Project project, Object element, Object child, String elementName)
throws BuildException {
if (elementName == null) {
return;
@@ -377,7 +398,7 @@ public class IntrospectionHelper implements BuildListener {
/**
* returns the type of a named nested element.
*/
public Class getElementType(String elementName)
public Class getElementType(String elementName)
throws BuildException {
Class nt = (Class) nestedTypes.get(elementName);
if (nt == null) {
@@ -391,7 +412,7 @@ public class IntrospectionHelper implements BuildListener {
/**
* returns the type of a named attribute.
*/
public Class getAttributeType(String attributeName)
public Class getAttributeType(String attributeName)
throws BuildException {
Class at = (Class) attributeTypes.get(attributeName);
if (at == null) {
@@ -425,7 +446,7 @@ public class IntrospectionHelper implements BuildListener {
/**
* Create a proper implementation of AttributeSetter for the given
* attribute type.
* attribute type.
*/
private AttributeSetter createAttributeSetter(final Method m,
final Class arg) {
@@ -433,7 +454,7 @@ public class IntrospectionHelper implements BuildListener {
// simplest case - setAttribute expects String
if (java.lang.String.class.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new String[] {value});
}
@@ -443,7 +464,7 @@ public class IntrospectionHelper implements BuildListener {
} else if (java.lang.Character.class.equals(arg)
|| java.lang.Character.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Character[] {new Character(value.charAt(0))});
}
@@ -451,7 +472,7 @@ public class IntrospectionHelper implements BuildListener {
};
} else if (java.lang.Byte.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Byte[] {new Byte(value)});
}
@@ -459,7 +480,7 @@ public class IntrospectionHelper implements BuildListener {
};
} else if (java.lang.Short.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Short[] {new Short(value)});
}
@@ -467,7 +488,7 @@ public class IntrospectionHelper implements BuildListener {
};
} else if (java.lang.Integer.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Integer[] {new Integer(value)});
}
@@ -475,7 +496,7 @@ public class IntrospectionHelper implements BuildListener {
};
} else if (java.lang.Long.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Long[] {new Long(value)});
}
@@ -483,7 +504,7 @@ public class IntrospectionHelper implements BuildListener {
};
} else if (java.lang.Float.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Float[] {new Float(value)});
}
@@ -491,21 +512,21 @@ public class IntrospectionHelper implements BuildListener {
};
} else if (java.lang.Double.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Double[] {new Double(value)});
}
};
// boolean gets an extra treatment, because we have a nice method
// boolean gets an extra treatment, because we have a nice method
// in Project
} else if (java.lang.Boolean.class.equals(arg)
} else if (java.lang.Boolean.class.equals(arg)
|| java.lang.Boolean.TYPE.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent,
m.invoke(parent,
new Boolean[] {new Boolean(Project.toBoolean(value))});
}
@@ -514,7 +535,7 @@ public class IntrospectionHelper implements BuildListener {
// Class doesn't have a String constructor but a decent factory method
} else if (java.lang.Class.class.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException, BuildException {
try {
m.invoke(parent, new Class[] {Class.forName(value)});
@@ -527,7 +548,7 @@ public class IntrospectionHelper implements BuildListener {
// resolve relative paths through Project
} else if (java.io.File.class.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new File[] {p.resolveFile(value)});
}
@@ -537,7 +558,7 @@ public class IntrospectionHelper implements BuildListener {
// resolve relative paths through Project
} else if (org.apache.tools.ant.types.Path.class.equals(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException {
m.invoke(parent, new Path[] {new Path(p, value)});
}
@@ -547,7 +568,7 @@ public class IntrospectionHelper implements BuildListener {
// EnumeratedAttributes have their own helper class
} else if (org.apache.tools.ant.types.EnumeratedAttribute.class.isAssignableFrom(arg)) {
return new AttributeSetter() {
public void set(Project p, Object parent, String value)
public void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException, BuildException {
try {
org.apache.tools.ant.types.EnumeratedAttribute ea = (org.apache.tools.ant.types.EnumeratedAttribute)arg.newInstance();
@@ -558,18 +579,18 @@ public class IntrospectionHelper implements BuildListener {
}
}
};
// worst case. look for a public String constructor and use it
} else {
try {
final Constructor c =
final Constructor c =
arg.getConstructor(new Class[] {java.lang.String.class});
return new AttributeSetter() {
public void set(Project p, Object parent,
String value)
public void set(Project p, Object parent,
String value)
throws InvocationTargetException, IllegalAccessException, BuildException {
try {
Object attribute = c.newInstance(new String[] {value});
@@ -582,11 +603,11 @@ public class IntrospectionHelper implements BuildListener {
}
}
};
} catch (NoSuchMethodException nme) {
}
}
return null;
}
@@ -617,13 +638,13 @@ public class IntrospectionHelper implements BuildListener {
}
}
}
return "Class " + element.getClass().getName();
}
/**
* extract the name of a property from a method name - subtracting
* a given prefix.
* a given prefix.
*/
private String getPropertyName(String methodName, String prefix) {
int start = prefix.length();
@@ -631,18 +652,18 @@ public class IntrospectionHelper implements BuildListener {
}
private interface NestedCreator {
Object create(Object parent)
Object create(Object parent)
throws InvocationTargetException, IllegalAccessException, InstantiationException;
}
private interface NestedStorer {
void store(Object parent, Object child)
void store(Object parent, Object child)
throws InvocationTargetException, IllegalAccessException, InstantiationException;
}
private interface AttributeSetter {
void set(Project p, Object parent, String value)
throws InvocationTargetException, IllegalAccessException,
throws InvocationTargetException, IllegalAccessException,
BuildException;
}