umagesh 2003/04/14 10:21:27
Modified: src/main/org/apache/tools/ant ComponentHelper.java IntrospectionHelper.java Main.java Project.java src/main/org/apache/tools/ant/filters/util ChainReaderHelper.java src/main/org/apache/tools/ant/types Mapper.java src/main/org/apache/tools/ant/types/selectors ExtendSelector.java Log: Call setproject for all created objects. PR: 18312 Submitted by: [EMAIL PROTECTED] (peter reilly) Revision Changes Path 1.4 +3 -4 ant/src/main/org/apache/tools/ant/ComponentHelper.java Index: ComponentHelper.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/ComponentHelper.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- ComponentHelper.java 10 Feb 2003 14:13:30 -0000 1.3 +++ ComponentHelper.java 14 Apr 2003 17:21:25 -0000 1.4 @@ -407,6 +407,7 @@ try { Object o = c.newInstance(); + Project.setProjectOnObject(project, o); Task task = null; if (o instanceof Task) { task = (Task) o; @@ -415,9 +416,9 @@ // and an Adapter TaskAdapter taskA = new TaskAdapter(); taskA.setProxy(o); + Project.setProjectOnObject(project, taskA); task = taskA; } - task.setProject(project); task.setTaskType(taskType); // set default value, can be changed by the user @@ -520,9 +521,7 @@ } else { o = ctor.newInstance(new Object[] {this}); } - if (o instanceof ProjectComponent) { - ((ProjectComponent) o).setProject(project); - } + Project.setProjectOnObject(project, o); String msg = " +DataType: " + typeName; project.log(msg, Project.MSG_DEBUG); return o; 1.54 +3 -9 ant/src/main/org/apache/tools/ant/IntrospectionHelper.java Index: IntrospectionHelper.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/IntrospectionHelper.java,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- IntrospectionHelper.java 14 Apr 2003 14:47:41 -0000 1.53 +++ IntrospectionHelper.java 14 Apr 2003 17:21:25 -0000 1.54 @@ -538,9 +538,7 @@ DynamicConfigurator dc = (DynamicConfigurator) parent; Object nestedElement = dc.createDynamicElement(elementName); if (nestedElement != null) { - if (nestedElement instanceof ProjectComponent) { - ((ProjectComponent) nestedElement).setProject(project); - } + Project.setProjectOnObject(project, nestedElement); return nestedElement; } } @@ -549,9 +547,7 @@ } try { Object nestedElement = nc.create(parent); - if (nestedElement instanceof ProjectComponent) { - ((ProjectComponent) nestedElement).setProject(project); - } + Project.setProjectOnObject(project, nestedElement); return nestedElement; } catch (IllegalAccessException ie) { // impossible as getMethods should only return public methods @@ -842,9 +838,7 @@ throws InvocationTargetException, IllegalAccessException, BuildException { try { Object attribute = c.newInstance(new String[] {value}); - if (attribute instanceof ProjectComponent) { - ((ProjectComponent) attribute).setProject(p); - } + Project.setProjectOnObject(p, attribute); m.invoke(parent, new Object[] {attribute}); } catch (InstantiationException ie) { throw new BuildException(ie); 1.81 +2 -0 ant/src/main/org/apache/tools/ant/Main.java Index: Main.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Main.java,v retrieving revision 1.80 retrieving revision 1.81 diff -u -r1.80 -r1.81 --- Main.java 12 Feb 2003 05:04:31 -0000 1.80 +++ Main.java 14 Apr 2003 17:21:25 -0000 1.81 @@ -649,6 +649,7 @@ try { BuildListener listener = (BuildListener) Class.forName(className).newInstance(); + Project.setProjectOnObject(project, listener); project.addBuildListener(listener); } catch (Throwable exc) { throw new BuildException("Unable to instantiate listener " @@ -671,6 +672,7 @@ try { handler = (InputHandler) (Class.forName(inputHandlerClassname).newInstance()); + Project.setProjectOnObject(project, handler); } catch (ClassCastException e) { String msg = "The specified input handler class " + inputHandlerClassname 1.135 +33 -4 ant/src/main/org/apache/tools/ant/Project.java Index: Project.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Project.java,v retrieving revision 1.134 retrieving revision 1.135 diff -u -r1.134 -r1.135 --- Project.java 14 Apr 2003 11:58:03 -0000 1.134 +++ Project.java 14 Apr 2003 17:21:25 -0000 1.135 @@ -58,6 +58,7 @@ import java.io.IOException; import java.io.EOFException; import java.io.InputStream; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.Enumeration; import java.util.Hashtable; @@ -1133,6 +1134,7 @@ try { Object o = c.newInstance(); + setProjectOnObject(this, o); Task task = null; if (o instanceof Task) { task = (Task) o; @@ -1245,9 +1247,7 @@ } else { o = ctor.newInstance(new Object[] {this}); } - if (o instanceof ProjectComponent) { - ((ProjectComponent) o).setProject(this); - } + setProjectOnObject(this, o); String msg = " +DataType: " + typeName; log (msg, MSG_DEBUG); return o; @@ -2305,4 +2305,33 @@ return get(key) != null; } } + + /** + * set the project on a created object using object.setProject(project). + * Need to set the project before other set/add elements + * are called + * @param project the project object + * @param obj the object to invoke setProject(project) on + */ + public static void setProjectOnObject(Project project, Object obj) { + if (project == null) + return; + if (obj instanceof ProjectComponent) { + ((ProjectComponent) obj).setProject(project); + return; + } + try { + Method method = + obj.getClass().getMethod( + "setProject", new Class[] {Project.class}); + if (method != null) { + method.invoke(obj, new Object[] {project}); + } + } catch (Throwable e) { + // ignore this if the object does not have + // a set project method or the method + // is private/protected. + } + } + } 1.12 +19 -10 ant/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java Index: ChainReaderHelper.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/filters/util/ChainReaderHelper.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- ChainReaderHelper.java 14 Apr 2003 11:58:03 -0000 1.11 +++ ChainReaderHelper.java 14 Apr 2003 17:21:26 -0000 1.12 @@ -196,11 +196,7 @@ final Reader[] rdr = {instream}; instream = (Reader) constructors[j].newInstance(rdr); - if (project != null && - instream instanceof BaseFilterReader) { - ((BaseFilterReader) - instream).setProject(project); - } + setProjectOnObject(instream); if (Parameterizable.class.isAssignableFrom(clazz)) { final Parameter[] params = filter.getParams(); ((Parameterizable) @@ -217,18 +213,31 @@ throw new BuildException(ite); } } - } else if (o instanceof ChainableReader && - o instanceof Reader) { - if (project != null && o instanceof BaseFilterReader) { - ((BaseFilterReader) o).setProject(project); - } + } else if (o instanceof ChainableReader) { + setProjectOnObject(o); instream = ((ChainableReader) o).chain(instream); + setProjectOnObject(instream); } } } return instream; } + /** + * helper method to set the project on an object. + * the reflection setProject does not work for anonymous/protected/private + * classes, even if they have public methods. + */ + private void setProjectOnObject(Object obj) { + if (project == null) + return; + if (obj instanceof BaseFilterReader) { + ((BaseFilterReader) obj).setProject(project); + return; + } + Project.setProjectOnObject(project, obj); + } + /** * Read data from the reader and return the * contents as a string. 1.17 +1 -0 ant/src/main/org/apache/tools/ant/types/Mapper.java Index: Mapper.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/Mapper.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- Mapper.java 7 Mar 2003 11:23:07 -0000 1.16 +++ Mapper.java 14 Apr 2003 17:21:27 -0000 1.17 @@ -204,6 +204,7 @@ } FileNameMapper m = (FileNameMapper) c.newInstance(); + Project.setProjectOnObject(getProject(), m); m.setFrom(from); m.setTo(to); return m; 1.7 +2 -0 ant/src/main/org/apache/tools/ant/types/selectors/ExtendSelector.java Index: ExtendSelector.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/types/selectors/ExtendSelector.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ExtendSelector.java 10 Feb 2003 14:14:35 -0000 1.6 +++ ExtendSelector.java 14 Apr 2003 17:21:27 -0000 1.7 @@ -56,6 +56,7 @@ import java.io.File; import java.util.Vector; +import org.apache.tools.ant.Project; import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.types.Parameter; @@ -106,6 +107,7 @@ AntClassLoader.initializeClass(c); } dynselector = (FileSelector) c.newInstance(); + Project.setProjectOnObject(getProject(), dynselector); } catch (ClassNotFoundException cnfexcept) { setError("Selector " + classname +