mbenson     2005/04/15 13:52:53

  Modified:    .        Tag: ANT_16_BRANCH WHATSNEW
               src/etc/testcases/types Tag: ANT_16_BRANCH redirector.xml
               src/testcases/org/apache/tools/ant/types Tag: ANT_16_BRANCH
                        RedirectorElementTest.java
               src/main/org/apache/tools/ant/types Tag: ANT_16_BRANCH
                        RedirectorElement.java
  Log:
  Merge <redirector refid="" /> fix.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.503.2.215 +2 -0      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.503.2.214
  retrieving revision 1.503.2.215
  diff -u -r1.503.2.214 -r1.503.2.215
  --- WHATSNEW  11 Apr 2005 09:31:15 -0000      1.503.2.214
  +++ WHATSNEW  15 Apr 2005 20:52:52 -0000      1.503.2.215
  @@ -310,6 +310,8 @@
   * forkmode="perBatch" or "once" would ignore extension attributes that
     had been specified for <formatter>s.  Bugzilla Report 32973.
   
  +* The refid attribute of the I/O redirector was not functional.
  +
   Changes from Ant 1.6.1 to Ant 1.6.2
   ===================================
   
  
  
  
  No                   revision
  No                   revision
  1.1.2.2   +50 -20    ant/src/etc/testcases/types/redirector.xml
  
  Index: redirector.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/types/redirector.xml,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- redirector.xml    23 Jun 2004 19:30:14 -0000      1.1.2.1
  +++ redirector.xml    15 Apr 2005 20:52:53 -0000      1.1.2.2
  @@ -1,24 +1,54 @@
  -<!-- Copyright 2004 The Apache Software Foundation. -->
  +<!-- Copyright 2004-2005 The Apache Software Foundation. -->
   <project name="redirector" basedir=".">
   
  -     <target name="test1" description="create ref">
  -             <redirector id="test1" output="out" />
  -     </target>
  -
  -     <target name="test2" depends="test1" description="fail">
  -             <redirector refid="test1" output="out" />
  -     </target>
  -
  -     <target name="test3" depends="test1" description="fail">
  -             <redirector refid="test1">
  -                     <outputmapper type="flatten" />
  -             </redirector>
  -     </target>
  -
  -     <target name="test4" depends="test1" description="pass">
  -             <redirector>
  -                     <outputmapper type="flatten" />
  -             </redirector>
  -     </target>
  +  <target name="test1" description="create ref">
  +    <redirector id="test1" output="out" />
  +  </target>
  +
  +  <target name="test2" depends="test1" description="fail">
  +    <redirector refid="test1" output="out" />
  +  </target>
  +
  +  <target name="test3" depends="test1" description="fail">
  +    <redirector refid="test1">
  +      <outputmapper type="flatten" />
  +    </redirector>
  +  </target>
  +
  +  <target name="test4" depends="test1" description="pass">
  +    <redirector>
  +      <outputmapper type="flatten" />
  +    </redirector>
  +  </target>
  +
  +  <target name="testRefid" depends="cat-check" if="can-cat">
  +    <fail message="Property testRefid.out is already set!">
  +      <condition>
  +        <isset property="testRefid.out" />
  +      </condition>
  +    </fail>
  +    <redirector id="r" outputproperty="testRefid.out" inputstring="foo" />
  +    <exec executable="cat">
  +      <redirector refid="r" />
  +    </exec>
  +    <fail>
  +      <condition>
  +        <not>
  +          <equals arg1="${testRefid.out}" arg2="foo" />
  +        </not>
  +      </condition>
  +    </fail>
  +  </target>
  +
  +  <target name="cat-check">
  +    <property environment="env" />
  +    <condition property="can-cat">
  +      <or>
  +        <available file="cat" filepath="${env.PATH}" property="can-cat" />
  +        <available file="cat.exe" filepath="${env.PATH}" property="can-cat" 
/>
  +        <available file="cat.exe" filepath="${env.Path}" property="can-cat" 
/>
  +      </or>
  +    </condition>
  +  </target>
   
   </project>
  
  
  
  No                   revision
  No                   revision
  1.1.2.2   +7 -2      
ant/src/testcases/org/apache/tools/ant/types/RedirectorElementTest.java
  
  Index: RedirectorElementTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/types/RedirectorElementTest.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- RedirectorElementTest.java        23 Jun 2004 19:30:14 -0000      1.1.2.1
  +++ RedirectorElementTest.java        15 Apr 2005 20:52:53 -0000      1.1.2.2
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 2004 The Apache Software Foundation.
  + * Copyright 2004-2005 The Apache Software Foundation.
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -16,6 +16,7 @@
    */
   package org.apache.tools.ant.types;
   
  +import org.apache.tools.ant.Project;
   import org.apache.tools.ant.BuildFileTest;
   
   public class RedirectorElementTest extends BuildFileTest {
  @@ -25,7 +26,7 @@
       }
   
       public void setUp() {
  -        configureProject("src/etc/testcases/types/redirector.xml");
  +        configureProject("src/etc/testcases/types/redirector.xml", 
Project.MSG_VERBOSE);
       }
   
       public void test1() {
  @@ -48,4 +49,8 @@
           executeTarget("test4");
       }
   
  +    public void testRefid() {
  +        executeTarget("testRefid");
  +    }
  +
   }
  
  
  
  No                   revision
  No                   revision
  1.2.2.3   +79 -11    
ant/src/main/org/apache/tools/ant/types/RedirectorElement.java
  
  Index: RedirectorElement.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/types/RedirectorElement.java,v
  retrieving revision 1.2.2.2
  retrieving revision 1.2.2.3
  diff -u -r1.2.2.2 -r1.2.2.3
  --- RedirectorElement.java    24 Sep 2004 22:29:09 -0000      1.2.2.2
  +++ RedirectorElement.java    15 Apr 2005 20:52:53 -0000      1.2.2.3
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 2004 The Apache Software Foundation.
  + * Copyright 2004-2005 The Apache Software Foundation.
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -17,14 +17,14 @@
   package org.apache.tools.ant.types;
   
   import java.io.File;
  +import java.util.Stack;
   import java.util.Vector;
  +import java.util.Iterator;
   import java.util.ArrayList;
   
  -import org.apache.tools.ant.Task;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.taskdefs.Redirector;
  -import org.apache.tools.ant.types.DataType;
   
   /**
    * Element representation of a <CODE>Redirector</CODE>.
  @@ -108,7 +108,7 @@
           }
           if (this.inputMapper != null) {
               if (usingInput) {
  -                throw new BuildException("attribute \"input\"" 
  +                throw new BuildException("attribute \"input\""
                       + " cannot coexist with a nested <inputmapper>");
               } else {
                   throw new BuildException("Cannot have > 1 <inputmapper>");
  @@ -146,7 +146,7 @@
           }
           if (this.errorMapper != null) {
               if (usingError) {
  -                throw new BuildException("attribute \"error\"" 
  +                throw new BuildException("attribute \"error\""
                       + " cannot coexist with a nested <errormapper>");
               } else {
                   throw new BuildException("Cannot have > 1 <errormapper>");
  @@ -160,6 +160,8 @@
        *
        * <p>You must not set another attribute or nest elements inside
        * this element if you make it a reference.</p>
  +     * @param r the reference to use
  +     * @throws BuildException on error
        */
       public void setRefid(Reference r) throws BuildException {
           if (usingInput
  @@ -210,7 +212,6 @@
           this.inputString = inputString;
       }
   
  -
       /**
        * File the output of the process is redirected to. If error is not
        * redirected, it too will appear in the output
  @@ -273,7 +274,6 @@
           if (isReference()) {
               throw tooManyAttributes();
           }
  -        //pre JDK 1.4 compatible
           this.logError = ((logError) ? Boolean.TRUE : Boolean.FALSE);
       }
   
  @@ -315,7 +315,6 @@
           if (isReference()) {
               throw tooManyAttributes();
           }
  -        //pre JDK 1.4 compatible
           this.append = ((append) ? Boolean.TRUE : Boolean.FALSE);
       }
   
  @@ -330,7 +329,6 @@
           if (isReference()) {
               throw tooManyAttributes();
           }
  -        //pre JDK 1.4 compatible
           this.alwaysLog = ((alwaysLog) ? Boolean.TRUE : Boolean.FALSE);
       }
   
  @@ -343,7 +341,6 @@
           if (isReference()) {
               throw tooManyAttributes();
           }
  -        //pre JDK 1.4 compatible
           this.createEmptyFiles = ((createEmptyFiles)
               ? Boolean.TRUE : Boolean.FALSE);
       }
  @@ -418,6 +415,10 @@
        * @param sourcefile   <CODE>String</CODE>.
        */
       public void configure(Redirector redirector, String sourcefile) {
  +        if (isReference()) {
  +            getRef().configure(redirector, sourcefile);
  +            return;
  +        }
           if (alwaysLog != null) {
               redirector.setAlwaysLog(alwaysLog.booleanValue());
           }
  @@ -530,7 +531,74 @@
                   list.add(getProject().resolveFile(name[i]));
               }
           }
  -        return (File[])(list.toArray(new File[list.size()]));
  +        return (File[]) (list.toArray(new File[list.size()]));
  +    }
  +
  +    /**
  +     * Convenience method.
  +     * @throws BuildException on error.
  +     */
  +    protected void dieOnCircularReference() throws BuildException {
  +        if (isChecked()) {
  +            return;
  +        }
  +        Stack s = new Stack();
  +        s.push(this);
  +        dieOnCircularReference(s, getProject());
  +    }
  +
  +    /**
  +     * Overrides the version of DataType to recurse on all DataType
  +     * child elements that may have been added.
  +     * @param stk the stack of data types to use (recursively).
  +     * @param p   the project to use to dereference the references.
  +     * @throws BuildException on error.
  +     */
  +    protected void dieOnCircularReference(Stack stk, Project p)
  +        throws BuildException {
  +        if (isChecked()) {
  +            return;
  +        }
  +        if (isReference()) {
  +            super.dieOnCircularReference(stk, p);
  +        } else {
  +            Mapper[] m = new Mapper[] {inputMapper, outputMapper, 
errorMapper};
  +            for (int i = 0; i < m.length; i++) {
  +                if (m[i] != null) {
  +                    stk.push(m[i]);
  +                    m[i].dieOnCircularReference(stk, p);
  +                    stk.pop();
  +                }
  +            }
  +            Vector[] v = new Vector[]
  +                {inputFilterChains, outputFilterChains, errorFilterChains};
  +            for (int i = 0; i < v.length; i++) {
  +                if (v[i] != null) {
  +                    for (Iterator fci = v[i].iterator(); fci.hasNext();) {
  +                        FilterChain fc = (FilterChain) fci.next();
  +                        stk.push(fc);
  +                        fc.dieOnCircularReference(stk, p);
  +                        stk.pop();
  +                    }
  +                }
  +            }
  +            setChecked(true);
  +        }
  +    }
  +
  +    /**
  +     * Perform the check for circular references, returning the
  +     * referenced RedirectorElement
  +     * @return the referenced RedirectorElement.
  +     */
  +    private RedirectorElement getRef() {
  +        dieOnCircularReference();
  +        Object o = getRefid().getReferencedObject(getProject());
  +        if (!(o instanceof RedirectorElement)) {
  +            throw new BuildException(getRefid().getRefId()
  +                + " doesn\'t denote a RedirectorElement");
  +        }
  +        return (RedirectorElement) o;
       }
   
   }
  
  
  

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

Reply via email to