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 +
  
  
  

Reply via email to