peterreilly    2003/07/21 03:10:07

  Modified:    src/main/org/apache/tools/ant ComponentHelper.java
               src/etc/testcases/taskdefs typedef.xml
               src/testcases/org/apache/tools/ant/taskdefs TypedefTest.java
  Log:
  Fix for NPE reported by Nick Chalko.
  When overriding a definition the code did not
  check if the old (or new) definitions classes existed
  
  Revision  Changes    Path
  1.19      +28 -2     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.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- ComponentHelper.java      6 Jul 2003 09:57:34 -0000       1.18
  +++ ComponentHelper.java      21 Jul 2003 10:10:06 -0000      1.19
  @@ -587,9 +587,33 @@
       }
   
   
  -    /** return true if the two definitions are the same */
  +    /**
  +     * check if definition is a valid definition - it
  +     * may be a definition of an optional task that
  +     * does not exist
  +     * @param def the definition to test
  +     * @return true if exposed type of definition is present
  +     */
  +    private boolean validDefinition(AntTypeDefinition def) {
  +        if (def.getTypeClass(project) == null
  +            || def.getExposedClass(project) == null) {
  +            return false;
  +        }
  +        return true;
  +    }
  +
  +    /**
  +     * check if two definitions are the same
  +     * @param def  the new definition
  +     * @param old the old definition
  +     * @return true if the two definitions are the same
  +     */
       private boolean sameDefinition(
           AntTypeDefinition def, AntTypeDefinition old) {
  +        if (!validDefinition(def) || !validDefinition(old)) {
  +            return validDefinition(def) == validDefinition(old);
  +        }
  +
           if (!(old.getTypeClass(project).equals(def.getTypeClass(project)))) {
               return false;
           }
  @@ -600,9 +624,11 @@
           return true;
       }
   
  +
       /**
        * update the component definition table with a new or
        * modified definition.
  +     * @param def the definition to update or insert
        */
       private void updateDataTypeDefinition(AntTypeDefinition def) {
           String name = def.getName();
  @@ -615,7 +641,7 @@
                       return;
                   }
                   Class oldClass = antTypeTable.getExposedClass(name);
  -                if (Task.class.isAssignableFrom(oldClass)) {
  +                if (oldClass != null && 
Task.class.isAssignableFrom(oldClass)) {
                       int logLevel = Project.MSG_WARN;
                       if (def.getClassName().equals(old.getClassName())
                           && def.getClassLoader() == old.getClassLoader()) {
  
  
  
  1.2       +7 -0      ant/src/etc/testcases/taskdefs/typedef.xml
  
  Index: typedef.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/typedef.xml,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- typedef.xml       9 Nov 2001 15:48:11 -0000       1.1
  +++ typedef.xml       21 Jul 2003 10:10:06 -0000      1.2
  @@ -46,4 +46,11 @@
       <local id="local" />
     </target>
   
  +  <target name="double-notpresent">
  +    <typedef name="mytask" classname="notpresent" onerror="ignore"/>
  +    <typedef name="mytask" classname="notpresent" onerror="ignore"/>
  +    <typedef name="mytask" classname="org.apache.tools.ant.taskdefs.Echo"
  +             onerror="ignore"/>
  +    <mytask>hi</mytask>
  +  </target>
   </project>
  
  
  
  1.6       +8 -1      
ant/src/testcases/org/apache/tools/ant/taskdefs/TypedefTest.java
  
  Index: TypedefTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/TypedefTest.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TypedefTest.java  7 Mar 2003 11:23:11 -0000       1.5
  +++ TypedefTest.java  21 Jul 2003 10:10:07 -0000      1.6
  @@ -104,4 +104,11 @@
                        ref.getClass().getName());
       }
   
  +    /**
  +     * test to make sure that one can define a not present
  +     * optional type twice and then have a valid definition.
  +     */
  +    public void testDoubleNotPresent() {
  +        expectLogContaining("double-notpresent", "hi");
  +    }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to