diff --git a/WHATSNEW b/WHATSNEW index 8de48bc79..591ae4196 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -77,13 +77,15 @@ Other changes: * 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 to rename a directory. Bugzilla Report 22863. * Add xmlcatalog nested element to XmlProperty. Bugzilla report 27053. +* New attribute alwayslog for type. + Fixed bugs: ----------- diff --git a/docs/manual/CoreTypes/redirector.html b/docs/manual/CoreTypes/redirector.html index 20fd23a02..ccf667e53 100644 --- a/docs/manual/CoreTypes/redirector.html +++ b/docs/manual/CoreTypes/redirector.html @@ -27,62 +27,66 @@ source (input) and destination (output/error) files. Since Ant 1.6.2 output - 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. + 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. No error The file to which the standard error of the - command should be redirected. + command should be redirected. No logError - 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 error or errorProperty - attributes, this will have no effect. + 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 + error or errorProperty attributes, this will + have no effect. No append - Whether output and error files should be appended to or overwritten. - Defaults to false. + Whether output and error files should be + appended to rather than overwritten. Defaults to + false. No createemptyfiles - Whether output and error files should be created even when empty. - Defaults to true. + Whether output and error files should be + created even when empty. Defaults to true. No outputproperty 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. + command should be stored. Unless the error stream is redirected + to a separate file or stream, this property will include the + error output. No errorproperty - The name of a property in which the standard error of the - command should be stored. + The name of a property in which the standard error + of the command should be stored. No input A file from which the executed command's standard input - is taken. This attribute is mutually exclusive with the - inputstring attribute. + is taken. This attribute is mutually exclusive with the + inputstring attribute. No inputstring A string which serves as the input stream for the - executed command. This attribute is mutually exclusive with the - input attribute. + executed command. This attribute is mutually exclusive with the + input attribute. No @@ -100,6 +104,14 @@ source (input) and destination (output/error) files. Since Ant 1.6.2 The error encoding. No + + alwayslog + Always send to the log in addition to + any other destination. Default false. + Since Ant 1.6.3. + + No +

Parameters specified as nested elements

inputmapper

@@ -122,13 +134,13 @@ consult the documentation of the individual task for more details. A nested <errormapper> is not compatible with the error attribute.

inputfilterchain

-

One or more FilterChains can be +

A FilterChain can be applied to the process input.

outputfilterchain

-

One or more FilterChains can be +

A FilterChain can be applied to the process output.

errorfilterchain

-

One or more FilterChains can be +

A FilterChain can be applied to the error output.

Usage

Tasks known to support I/O redirection: diff --git a/src/etc/testcases/taskdefs/exec/exec.xml b/src/etc/testcases/taskdefs/exec/exec.xml index 059c338a0..6aaef2a86 100644 --- a/src/etc/testcases/taskdefs/exec/exec.xml +++ b/src/etc/testcases/taskdefs/exec/exec.xml @@ -313,6 +313,22 @@ Files were created. + + + + + + + + + + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Redirector.java b/src/main/org/apache/tools/ant/taskdefs/Redirector.java index 917a43fcf..0d64dcc15 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Redirector.java +++ b/src/main/org/apache/tools/ant/taskdefs/Redirector.java @@ -122,6 +122,9 @@ public class Redirector { /** 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; @@ -333,12 +336,23 @@ public class Redirector { this.append = append; } + /** + * 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 boolean + * @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 boolean. */ - public void setCreateEmptyFiles(boolean createEmptyFiles) { + public synchronized void setCreateEmptyFiles(boolean createEmptyFiles) { this.createEmptyFiles = createEmptyFiles; } @@ -371,7 +385,7 @@ public class Redirector { * * @param outputFilterChains Vector containing FilterChain. */ - public void setOutputFilterChains(Vector outputFilterChains) { + public synchronized void setOutputFilterChains(Vector outputFilterChains) { this.outputFilterChains = outputFilterChains; } @@ -380,7 +394,7 @@ public class Redirector { * * @param errorFilterChains Vector containing FilterChain. */ - public void setErrorFilterChains(Vector errorFilterChains) { + public synchronized void setErrorFilterChains(Vector errorFilterChains) { this.errorFilterChains = errorFilterChains; } @@ -413,35 +427,24 @@ public class Redirector { * 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 @@ public class Redirector { ((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 @@ public class Redirector { "error splitting output/error streams", eyeOhEx); } } - if (errorProperty != null) { if (errorBaos == null) { errorBaos = new PropertyOutputStream(errorProperty); @@ -478,7 +477,18 @@ public class Redirector { } 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 { diff --git a/src/main/org/apache/tools/ant/types/RedirectorElement.java b/src/main/org/apache/tools/ant/types/RedirectorElement.java index 245b25ce9..f37b05fd2 100755 --- a/src/main/org/apache/tools/ant/types/RedirectorElement.java +++ b/src/main/org/apache/tools/ant/types/RedirectorElement.java @@ -65,6 +65,9 @@ public class RedirectorElement extends DataType { /** 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; @@ -316,6 +319,21 @@ public class RedirectorElement extends DataType { this.append = ((append) ? Boolean.TRUE : Boolean.FALSE); } + /** + * 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 boolean + * @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. @@ -400,6 +418,9 @@ public class RedirectorElement extends DataType { * @param sourcefile String. */ public void configure(Redirector redirector, String sourcefile) { + if (alwaysLog != null) { + redirector.setAlwaysLog(alwaysLog.booleanValue()); + } if (logError != null) { redirector.setLogError(logError.booleanValue()); } diff --git a/src/testcases/org/apache/tools/ant/taskdefs/ExecTaskTest.java b/src/testcases/org/apache/tools/ant/taskdefs/ExecTaskTest.java index 19d865bda..ed7db9b57 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/ExecTaskTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/ExecTaskTest.java @@ -329,6 +329,14 @@ public class ExecTaskTest extends BuildFileTest { 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) {