bodewig     2003/07/23 08:14:22

  Modified:    src/etc/testcases/taskdefs property.xml
               src/main/org/apache/tools/ant/taskdefs Property.java
               src/testcases/org/apache/tools/ant/taskdefs
                        PropertyTest.java
  Added:       src/etc/testcases/taskdefs property4.properties
  Log:
  resolveAllProperties would be caught in an endless loop when trying to
  expand b -> ${a} -> ${a}.  It would keep replacing ${a} for ${a} as it
  only detected a circular reference if the expansion pointed back to b.
  
  PR: 21825
  
  Revision  Changes    Path
  1.7       +5 -0      ant/src/etc/testcases/taskdefs/property.xml
  
  Index: property.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/property.xml,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- property.xml      18 Jun 2003 08:10:21 -0000      1.6
  +++ property.xml      23 Jul 2003 15:14:18 -0000      1.7
  @@ -36,4 +36,9 @@
       <property name="someprop" value="value" prefix="prefix"/>
     </target>
   
  +  <!-- caused an endless loop, PR 21825 -->
  +  <target name="testCircularReference">
  +    <property file="property4.properties"/>
  +  </target>
  +
   </project>
  
  
  
  1.1                  ant/src/etc/testcases/taskdefs/property4.properties
  
  Index: property4.properties
  ===================================================================
  a=${a}
  b=${a}/b
  
  
  
  1.65      +4 -1      ant/src/main/org/apache/tools/ant/taskdefs/Property.java
  
  Index: Property.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Property.java,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -u -r1.64 -r1.65
  --- Property.java     19 Jul 2003 11:20:13 -0000      1.64
  +++ Property.java     23 Jul 2003 15:14:19 -0000      1.65
  @@ -573,6 +573,8 @@
               String value = props.getProperty(name);
   
               boolean resolved = false;
  +            Vector expandedReferences = new Vector();
  +            expandedReferences.addElement(name);
               while (!resolved) {
                   Vector fragments = new Vector();
                   Vector propertyRefs = new Vector();
  @@ -588,11 +590,12 @@
                           String fragment = (String) i.nextElement();
                           if (fragment == null) {
                               String propertyName = (String) j.nextElement();
  -                            if (propertyName.equals(name)) {
  +                            if (expandedReferences.contains(propertyName)) {
                                   throw new BuildException("Property " + name
                                                            + " was circularly "
                                                            + "defined.");
                               }
  +                            expandedReferences.addElement(propertyName);
                               fragment = 
getProject().getProperty(propertyName);
                               if (fragment == null) {
                                   if (props.containsKey(propertyName)) {
  
  
  
  1.11      +12 -0     
ant/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java
  
  Index: PropertyTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/PropertyTest.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- PropertyTest.java 23 Jun 2003 09:07:30 -0000      1.10
  +++ PropertyTest.java 23 Jul 2003 15:14:19 -0000      1.11
  @@ -116,4 +116,16 @@
           fail("Did not throw exception on invalid use of prefix");
       }
   
  +    public void testCircularReference() {
  +        try {
  +            executeTarget("testCircularReference");
  +        } catch (BuildException e) {
  +            assertEquals("Circular definition not detected - ", true,
  +                         e.getMessage().indexOf("was circularly defined") 
  +                         != -1);
  +            return;
  +        }
  +        fail("Did not throw exception on circular exception");
  +    }
  +
   }
  
  
  

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

Reply via email to