mbenson     2004/09/24 11:55:16

  Modified:    docs/manual/CoreTypes redirector.html
               src/main/org/apache/tools/ant/taskdefs Redirector.java
               src/main/org/apache/tools/ant/types RedirectorElement.java
               src/testcases/org/apache/tools/ant/taskdefs
                        ExecTaskTest.java
               src/etc/testcases/taskdefs/exec exec.xml
               .        WHATSNEW
  Log:
  Add alwayslog attribute to <redirector>.
  
  Revision  Changes    Path
  1.3       +35 -23    ant/docs/manual/CoreTypes/redirector.html
  
  Index: redirector.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTypes/redirector.html,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- redirector.html   23 Apr 2004 07:33:51 -0000      1.2
  +++ redirector.html   24 Sep 2004 18:55:16 -0000      1.3
  @@ -27,62 +27,66 @@
     </tr>
     <tr>
       <td valign="top">output</td>
  -    <td valign="top">Name of a file to which to write the output. If the 
error stream
  -      is not also redirected to a file or property, it will appear in this 
output.</td>
  +    <td valign="top">Name of a file to which output should be written.
  +      If the error stream is not also redirected to a file or property,
  +      it will appear in this output.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">error</td>
       <td valign="top">The file to which the standard error of the
  -    command should be redirected.</td>
  +      command should be redirected.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">logError</td>
  -    <td valign="top">This attribute is used when you wish to see error 
output in Ant's
  -                     log and you are redirecting output to a file/property. 
The error
  -                     output will not be included in the output 
file/property. If you
  -                     redirect error with the <i>error</i> or 
<i>errorProperty</i>
  -                     attributes, this will have no effect.</td>
  +    <td valign="top">This attribute is used when you wish to see
  +      error output in Ant's log and you are redirecting output to
  +      a file/property. The error output will not be included in
  +      the output file/property. If you redirect error with the
  +      <i>error</i> or <i>errorProperty</i> attributes, this will
  +      have no effect.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">append</td>
  -    <td valign="top">Whether output and error files should be appended to or 
overwritten.
  -    Defaults to <code>false</code>.</td>
  +    <td valign="top">Whether output and error files should be
  +      appended to rather than overwritten. Defaults to
  +      <code>false</code>.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">createemptyfiles</td>
  -    <td valign="top">Whether output and error files should be created even 
when empty.
  -    Defaults to <code>true</code>.</td>
  +    <td valign="top">Whether output and error files should be
  +      created even when empty.  Defaults to <code>true</code>.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">outputproperty</td>
       <td valign="top">The name of a property in which the output of the
  -      command should be stored. Unless the error stream is redirected to a 
separate
  -      file or stream, this property will include the error output.</td>
  +      command should be stored. Unless the error stream is redirected
  +      to a separate file or stream, this property will include the
  +      error output.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">errorproperty</td>
  -    <td valign="top">The name of a property in which the standard error of 
the
  -      command should be stored.</td>
  +    <td valign="top">The name of a property in which the standard error
  +      of the command should be stored.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">input</td>
       <td valign="top">A file from which the executed command's standard input
  -                     is taken. This attribute is mutually exclusive with the
  -                     <i>inputstring</i> attribute.</td>
  +      is taken. This attribute is mutually exclusive with the
  +      <i>inputstring</i> attribute.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
       <td valign="top">inputstring</td>
       <td valign="top">A string which serves as the input stream for the
  -                     executed command. This attribute is mutually exclusive 
with the
  -                     <i>input</i> attribute.</td>
  +      executed command. This attribute is mutually exclusive with the
  +      <i>input</i> attribute.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
  @@ -100,6 +104,14 @@
       <td valign="top">The error encoding.</td>
       <td align="center" valign="top">No</td>
     </tr>
  +  <tr>
  +    <td valign="top">alwayslog</td>
  +    <td valign="top">Always send to the log in addition to
  +        any other destination. Default <code>false</code>.
  +        <i>Since Ant 1.6.3</i>.
  +    </td>
  +    <td align="center" valign="top">No</td>
  +  </tr>
   </table>
   <h3>Parameters specified as nested elements</h3>
   <h4>inputmapper</h4>
  @@ -122,13 +134,13 @@
   A nested &lt;errormapper&gt; is not compatible with the
   <i>error</i> attribute.</p>
   <h4>inputfilterchain</h4>
  -<p>One or more <a href="./filterchain.html">FilterChain</a>s can be
  +<p>A <a href="./filterchain.html">FilterChain</a> can be
   applied to the process input.</p>
   <h4>outputfilterchain</h4>
  -<p>One or more <a href="./filterchain.html">FilterChain</a>s can be
  +<p>A <a href="./filterchain.html">FilterChain</a> can be
   applied to the process output.</p>
   <h4>errorfilterchain</h4>
  -<p>One or more <a href="./filterchain.html">FilterChain</a>s can be
  +<p>A <a href="./filterchain.html">FilterChain</a> can be
   applied to the error output.</p>
   <h3>Usage</h3>
   Tasks known to support I/O redirection:
  
  
  
  1.20      +47 -37    
ant/src/main/org/apache/tools/ant/taskdefs/Redirector.java
  
  Index: Redirector.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Redirector.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- Redirector.java   23 Apr 2004 07:33:51 -0000      1.19
  +++ Redirector.java   24 Sep 2004 18:55:16 -0000      1.20
  @@ -122,6 +122,9 @@
       /** Flag which indicates if error and output files are to be appended. */
       private boolean append = false;
   
  +    /** Flag which indicates that output should be always sent to the log */
  +    private boolean alwaysLog = false;
  +
       /** Flag which indicates whether files should be created even when 
empty. */
       private boolean createEmptyFiles = true;
   
  @@ -334,11 +337,22 @@
       }
   
       /**
  +     * If true, (error and non-error) output will be "teed", redirected
  +     * as specified while being sent to Ant's logging mechanism as if no
  +     * redirection had taken place.  Defaults to false.
  +     * @param alwaysLog <code>boolean</code>
  +     * @since Ant 1.6.3
  +     */
  +    public synchronized void setAlwaysLog(boolean alwaysLog) {
  +        this.alwaysLog = alwaysLog;
  +    }
  +
  +    /**
        * Whether output and error files should be created even when empty.
        * Defaults to true.
        * @param createEmptyFiles <CODE>boolean</CODE>.
        */
  -    public void setCreateEmptyFiles(boolean createEmptyFiles) {
  +    public synchronized void setCreateEmptyFiles(boolean createEmptyFiles) {
           this.createEmptyFiles = createEmptyFiles;
       }
   
  @@ -371,7 +385,7 @@
        *
        * @param outputFilterChains <CODE>Vector</CODE> containing 
<CODE>FilterChain</CODE>.
        */
  -    public void setOutputFilterChains(Vector outputFilterChains) {
  +    public synchronized void setOutputFilterChains(Vector 
outputFilterChains) {
           this.outputFilterChains = outputFilterChains;
       }
   
  @@ -380,7 +394,7 @@
        *
        * @param errorFilterChains <CODE>Vector</CODE> containing 
<CODE>FilterChain</CODE>.
        */
  -    public void setErrorFilterChains(Vector errorFilterChains) {
  +    public synchronized void setErrorFilterChains(Vector errorFilterChains) {
           this.errorFilterChains = errorFilterChains;
       }
   
  @@ -413,35 +427,24 @@
        * configuration options.
        */
       public synchronized void createStreams() {
  -        if ((out == null || out.length == 0) && outputProperty == null) {
  -            outputStream = new LogOutputStream(managingTask, 
Project.MSG_INFO);
  -        } else {
  -            if (out != null && out.length > 0) {
  -                String logHead = new StringBuffer("Output ").append(
  -                    ((append) ? "appended" : "redirected")).append(
  -                    " to ").toString();
  -                outputStream = foldFiles(out, logHead, Project.MSG_VERBOSE);
  -            }
  -
  -            if (outputProperty != null) {
  -                if (baos == null) {
  -                    baos = new PropertyOutputStream(outputProperty);
  -                    managingTask.log("Output redirected to property: "
  -                        + outputProperty, Project.MSG_VERBOSE);
  -                }
  -                //shield it from being closed by a filtering StreamPumper
  -                OutputStream keepAliveOutput = new 
KeepAliveOutputStream(baos);
  -                if (outputStream == null) {
  -                    outputStream = keepAliveOutput;
  -                } else {
  -                    outputStream
  -                        = new TeeOutputStream(outputStream, keepAliveOutput);
  -                }
  -            } else {
  -                baos = null;
  +        if (out != null && out.length > 0) {
  +            String logHead = new StringBuffer("Output ").append(
  +                ((append) ? "appended" : "redirected")).append(
  +                " to ").toString();
  +            outputStream = foldFiles(out, logHead, Project.MSG_VERBOSE);
  +        }
  +        if (outputProperty != null) {
  +            if (baos == null) {
  +                baos = new PropertyOutputStream(outputProperty);
  +                managingTask.log("Output redirected to property: "
  +                    + outputProperty, Project.MSG_VERBOSE);
               }
  -
  -            errorStream = outputStream;
  +            //shield it from being closed by a filtering StreamPumper
  +            OutputStream keepAliveOutput = new KeepAliveOutputStream(baos);
  +            outputStream = (outputStream == null) ? keepAliveOutput
  +                : new TeeOutputStream(outputStream, keepAliveOutput);
  +        } else {
  +            baos = null;
           }
   
           if (error != null && error.length > 0) {
  @@ -449,10 +452,7 @@
                   ((append) ? "appended" : "redirected")).append(
                   " to ").toString();
               errorStream = foldFiles(error, logHead, Project.MSG_VERBOSE);
  -
  -        } else if (logError || errorStream == null) {
  -            errorStream = new LogOutputStream(managingTask, 
Project.MSG_WARN);
  -        } else { //must be errorStream == outputStream
  +        } else if (!(logError || outputStream == null)) {
               long funnelTimeout = 0L;
               OutputStreamFunneler funneler
                   = new OutputStreamFunneler(outputStream, funnelTimeout);
  @@ -464,7 +464,6 @@
                       "error splitting output/error streams", eyeOhEx);
               }
           }
  -
           if (errorProperty != null) {
               if (errorBaos == null) {
                   errorBaos = new PropertyOutputStream(errorProperty);
  @@ -478,7 +477,18 @@
           } else {
               errorBaos = null;
           }
  -
  +        if (alwaysLog || outputStream == null) {
  +            OutputStream outputLog
  +                = new LogOutputStream(managingTask, Project.MSG_INFO);
  +            outputStream = (outputStream == null)
  +                ? outputLog : new TeeOutputStream(outputLog, outputStream);
  +        }
  +        if (alwaysLog || errorStream == null) {
  +            OutputStream errorLog
  +                = new LogOutputStream(managingTask, Project.MSG_WARN);
  +            errorStream = (errorStream == null)
  +                ? errorLog : new TeeOutputStream(errorLog, errorStream);
  +        }
           if ((outputFilterChains != null && outputFilterChains.size() > 0)
               || !(outputEncoding.equalsIgnoreCase(inputEncoding))) {
               try {
  
  
  
  1.3       +21 -0     
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
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- RedirectorElement.java    23 Apr 2004 07:33:51 -0000      1.2
  +++ RedirectorElement.java    24 Sep 2004 18:55:16 -0000      1.3
  @@ -65,6 +65,9 @@
       /** Flag which indicates if error and output files are to be appended. */
       private Boolean append;
   
  +    /** Flag which indicates that output should be always sent to the log */
  +    private Boolean alwaysLog;
  +
       /** Flag which indicates whether files should be created even if empty. 
*/
       private Boolean createEmptyFiles;
   
  @@ -317,6 +320,21 @@
       }
   
       /**
  +     * If true, (error and non-error) output will be "teed", redirected
  +     * as specified while being sent to Ant's logging mechanism as if no
  +     * redirection had taken place.  Defaults to false.
  +     * @param alwaysLog <code>boolean</code>
  +     * @since Ant 1.6.3
  +     */
  +    public void setAlwaysLog(boolean alwaysLog) {
  +        if (isReference()) {
  +            throw tooManyAttributes();
  +        }
  +        //pre JDK 1.4 compatible
  +        this.alwaysLog = ((alwaysLog) ? Boolean.TRUE : Boolean.FALSE);
  +    }
  +
  +    /**
        * Whether output and error files should be created even when empty.
        * Defaults to true.
        * @param createEmptyFiles <CODE>boolean</CODE>.
  @@ -400,6 +418,9 @@
        * @param sourcefile   <CODE>String</CODE>.
        */
       public void configure(Redirector redirector, String sourcefile) {
  +        if (alwaysLog != null) {
  +            redirector.setAlwaysLog(alwaysLog.booleanValue());
  +        }
           if (logError != null) {
               redirector.setLogError(logError.booleanValue());
           }
  
  
  
  1.15      +8 -0      
ant/src/testcases/org/apache/tools/ant/taskdefs/ExecTaskTest.java
  
  Index: ExecTaskTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/ExecTaskTest.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- ExecTaskTest.java 27 Mar 2004 21:22:59 -0000      1.14
  +++ ExecTaskTest.java 24 Sep 2004 18:55:16 -0000      1.15
  @@ -329,6 +329,14 @@
           executeTarget("redirector17");
       }
   
  +    public void testRedirector18() {
  +        if (getProject().getProperty("test.can.run") == null) {
  +            return;
  +        }
  +        expectLog("redirector18", getProject().getProperty("ant.file")
  +            + " out" + getProject().getProperty("ant.file") + " err");
  +    }
  +
       public void testspawn() {
           project.executeTarget("init");
           if (project.getProperty("test.can.run") == null) {
  
  
  
  1.5       +16 -0     ant/src/etc/testcases/taskdefs/exec/exec.xml
  
  Index: exec.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/exec/exec.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- exec.xml  27 Mar 2004 21:22:58 -0000      1.4
  +++ exec.xml  24 Sep 2004 18:55:16 -0000      1.5
  @@ -313,6 +313,22 @@
           <fail if="17fail">Files were created.</fail>
       </target>
   
  +    <target name="redirector18" depends="init" if="test.can.run">
  +        <exec executable="sh">
  +            <arg value="parrot.sh"/>
  +            <arg value="${ant.file}" />
  +            <redirector alwayslog="true" logerror="true"
  +                        outputproperty="redirector.out" />
  +        </exec>
  +        <fail message="property redirector.out has unexpected content">
  +            <condition>
  +                <not>
  +                    <equals arg1="${ant.file} out" arg2="${redirector.out}" 
/>
  +                </not>
  +            </condition>
  +        </fail>
  +    </target>
  +
       <target name="cleanup">
           <delete>
               <fileset file="${logFile}" />
  
  
  
  1.667     +3 -1      ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.666
  retrieving revision 1.667
  diff -u -r1.666 -r1.667
  --- WHATSNEW  24 Sep 2004 15:30:45 -0000      1.666
  +++ WHATSNEW  24 Sep 2004 18:55:16 -0000      1.667
  @@ -77,12 +77,14 @@
   * Enable to choose the regexp implementation without system property.
     Bugzilla Report 15390.
   
  -* Expose objects and  methods in IntrospectionHelper. Bugzilla Report 30794.
  +* Expose objects and methods in IntrospectionHelper. Bugzilla Report 30794.
   
   * Allow file attribute of <move> to rename a directory.
     Bugzilla Report 22863.
   
   * Add xmlcatalog nested element to XmlProperty. Bugzilla report 27053.
  +
  +* New attribute alwayslog for <redirector> type.
   
   Fixed bugs:
   -----------
  
  
  

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

Reply via email to