remm 2005/01/03 08:21:21 Modified: catalina/src/share/org/apache/catalina/ant UndeployTask.java AbstractCatalinaTask.java ValidatorTask.java Added: catalina/src/share/org/apache/catalina/ant BaseRedirectorHelperTask.java Log: - 32800: Feature addition to add Redirector and failOnError support for all Catalina Ant tasks. - Submitted by Gabriele Garuglieri. Revision Changes Path 1.5 +2 -32 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/UndeployTask.java Index: UndeployTask.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/UndeployTask.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- UndeployTask.java 30 Aug 2004 19:52:51 -0000 1.4 +++ UndeployTask.java 3 Jan 2005 16:21:21 -0000 1.5 @@ -33,29 +33,6 @@ // ------------------------------------------------------------- Properties - /** - * Whether to fail (with a BuildException) if - * an error occurs. The default behavior is - * to do so. - */ - protected boolean failOnError = true; - - /** - * Returns the value of the failOnError - * property. - */ - public boolean isFailOnError() { - return failOnError; - } - - /** - * Sets the value of the failOnError property. - * - * @param newFailOnError New attribute value - */ - public void setFailOnError(boolean newFailOnError) { - failOnError = newFailOnError; - } /** * The context path of the web application we are managing. @@ -87,14 +64,7 @@ ("Must specify 'path' attribute"); } - try { - execute("/undeploy?path=" + this.path); - } catch (BuildException e) { - if( isFailOnError() ) { - throw e; - } - } - + execute("/undeploy?path=" + this.path); } 1.4 +26 -14 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/AbstractCatalinaTask.java Index: AbstractCatalinaTask.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/AbstractCatalinaTask.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- AbstractCatalinaTask.java 27 Feb 2004 14:58:40 -0000 1.3 +++ AbstractCatalinaTask.java 3 Jan 2005 16:21:21 -0000 1.4 @@ -27,7 +27,6 @@ import org.apache.catalina.util.Base64; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; -import org.apache.tools.ant.Task; /** @@ -40,7 +39,7 @@ * @since 4.1 */ -public abstract class AbstractCatalinaTask extends Task { +public abstract class AbstractCatalinaTask extends BaseRedirectorHelperTask { // ----------------------------------------------------- Instance Variables @@ -209,35 +208,48 @@ reader = new InputStreamReader(hconn.getInputStream(), CHARSET); StringBuffer buff = new StringBuffer(); String error = null; + int msgPriority = Project.MSG_INFO; boolean first = true; while (true) { int ch = reader.read(); if (ch < 0) { break; } else if ((ch == '\r') || (ch == '\n')) { - String line = buff.toString(); - buff.setLength(0); - log(line, Project.MSG_INFO); - if (first) { - if (!line.startsWith("OK -")) { - error = line; + // in Win \r\n would cause handleOutput() to be called + // twice, the second time with an empty string, + // producing blank lines + if (buff.length() > 0) { + String line = buff.toString(); + buff.setLength(0); + if (first) { + if (!line.startsWith("OK -")) { + error = line; + msgPriority = Project.MSG_ERR; + } + first = false; } - first = false; + handleOutput(line, msgPriority); } } else { buff.append((char) ch); } } if (buff.length() > 0) { - log(buff.toString(), Project.MSG_INFO); + handleOutput(buff.toString(), msgPriority); } - if (error != null) { + if (error != null && isFailOnError()) { + // exception should be thrown only if failOnError == true + // or error line will be logged twice throw new BuildException(error); } - } catch (Throwable t) { - throw new BuildException(t); + if (isFailOnError()) { + throw new BuildException(t); + } else { + handleErrorOutput(t.getMessage()); + } } finally { + closeRedirector(); if (reader != null) { try { reader.close(); 1.9 +9 -5 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/ValidatorTask.java Index: ValidatorTask.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/ValidatorTask.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ValidatorTask.java 26 Jun 2004 17:41:33 -0000 1.8 +++ ValidatorTask.java 3 Jan 2005 16:21:21 -0000 1.9 @@ -27,7 +27,6 @@ import org.apache.catalina.startup.DigesterFactory; import org.apache.tomcat.util.digester.Digester; import org.apache.tools.ant.BuildException; -import org.apache.tools.ant.Task; import org.xml.sax.InputSource; @@ -40,7 +39,7 @@ * @since 5.0 */ -public class ValidatorTask extends Task { +public class ValidatorTask extends BaseRedirectorHelperTask { // ----------------------------------------------------- Instance Variables @@ -97,11 +96,16 @@ InputSource is = new InputSource(file.toURL().toExternalForm()); is.setByteStream(stream); digester.parse(is); - System.out.println("web.xml validated"); + handleOutput("web.xml validated"); } catch (Throwable t) { - throw new BuildException("Validation failure", t); + if (isFailOnError()) { + throw new BuildException("Validation failure", t); + } else { + handleErrorOutput("Validation failure: " + t); + } } finally { Thread.currentThread().setContextClassLoader(oldCL); + closeRedirector(); } } 1.1 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/ant/BaseRedirectorHelperTask.java Index: BaseRedirectorHelperTask.java =================================================================== /* * Copyright 2002,2004 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.ant; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Redirector; import org.apache.tools.ant.types.RedirectorElement; /** * Abstract base class to add output redirection support for Catalina * Ant tasks. These tasks require Ant 1.5 or later. * <br> * <strong>WARNING:</strong> due to depends chain, Ant could call a Task * more than once and this can affect the output redirection when configured. * If you are collecting the output in a property, it will collect the output * of only the first run, since Ant properties are immutable and once created * they cannot be changed. * <br> * If you are collecting output in a file the file will be overwritten with the * output of the last run, unless you set append="true", in which case each run * will append it's output to the file. * * * @author Gabriele Garuglieri * @version $Revision: 1.1 $ $Date: 2005/01/03 16:21:21 $ * @since 5.5 */ public abstract class BaseRedirectorHelperTask extends Task { // ------------------------------------------------------------- Properties /** Redirector helper */ protected Redirector redirector = new Redirector(this); //protected Redirector redirector = null; /** Redirector element for this task */ protected RedirectorElement redirectorElement = null; /** The stream for info output */ protected OutputStream redirectOutStream = null; /** The stream for error output */ protected OutputStream redirectErrStream = null; /** The print stream for info output */ PrintStream redirectOutPrintStream = null; /** The print stream for error output */ PrintStream redirectErrPrintStream = null; /** * Whether to fail (with a BuildException) if * ManagerServlet returns an error. The default behavior is * to do so. * <b> * This flag does not control parameters checking. If the task is called * with wrong or invalid parameters, it will throw BuildException * independently from the setting of this flag. */ protected boolean failOnError = true; /** * <code>true</code> true when output redirection is requested for this task . * Default is to log on Ant log. */ protected boolean redirectOutput = false; /** * will be set to <code>true</code> when the configuration of the Redirector is * complete. */ protected boolean redirectorConfigured = false; /** * Flag which indicates that, if redirected, output should also be * always sent to the log. Default is that otput is sent only to * redirected streams. */ protected boolean alwaysLog = false; /** * Whether to fail (with a BuildException) if * ManagerServlet returns an error. The default behavior is * to do so. */ public void setFailonerror(boolean fail) { failOnError = fail; } /** * Returns the value of the failOnError * property. */ public boolean isFailOnError() { return failOnError; } /** * File the output of the task is redirected to. * * @param out name of the output file */ public void setOutput(File out) { redirector.setOutput(out); redirectOutput = true; } /** * File the error output of the task is redirected to. * * @param error name of the error file * */ public void setError(File error) { redirector.setError(error); redirectOutput = true; } /** * Controls whether error output is logged. This is only useful * when output is being redirected and error output is desired in the * Ant log * * @param logError if true the standard error is sent to the Ant log system * and not sent to output stream. */ public void setLogError(boolean logError) { redirector.setLogError(logError); redirectOutput = true; } /** * Property name whose value should be set to the output of * the task. * * @param outputProperty property name * */ public void setOutputproperty(String outputProperty) { redirector.setOutputProperty(outputProperty); redirectOutput = true; } /** * Property name whose value should be set to the error of * the task.. * * @param errorProperty property name * */ public void setErrorProperty(String errorProperty) { redirector.setErrorProperty(errorProperty); redirectOutput = true; } /** * If true, append output to existing file. * * @param append if true, append output to existing file * */ public void setAppend(boolean append) { redirector.setAppend(append); redirectOutput = true; } /** * If true, (error and non-error) output will be redirected * as specified while being sent to Ant's logging mechanism as if no * redirection had taken place. Defaults to false. * <br> * Actually handled internally, with Ant 1.6.3 it will be handled by * the <code>Redirector</code> itself. * @param alwaysLog <code>boolean</code> */ public void setAlwaysLog(boolean alwaysLog) { this.alwaysLog = alwaysLog; //redirector.setAlwaysLog(alwaysLog); redirectOutput = true; } /** * Whether output and error files should be created even when empty. * Defaults to true. * @param createEmptyFiles <CODE>boolean</CODE>. */ public void setCreateEmptyFiles(boolean createEmptyFiles) { redirector.setCreateEmptyFiles(createEmptyFiles); redirectOutput = true; } /** * Add a <CODE>RedirectorElement</CODE> to this task. * @param redirectorElement <CODE>RedirectorElement</CODE>. */ public void addConfiguredRedirector(RedirectorElement redirectorElement) { if (this.redirectorElement != null) { throw new BuildException("Cannot have > 1 nested <redirector>s"); } else { this.redirectorElement = redirectorElement; } } /** * Set up properties on the Redirector from RedirectorElement if present. */ private void configureRedirector() { if (redirectorElement != null) { redirectorElement.configure(redirector); redirectOutput = true; } /* * Due to depends chain, Ant could call the Task more than once, * this is to prevent that we attempt to configure uselessly * more than once the Redirector. */ redirectorConfigured = true; } /** * Set up properties on the Redirector and create output streams. */ protected void openRedirector() { if (! redirectorConfigured) { configureRedirector(); } if (redirectOutput) { redirector.createStreams(); redirectOutStream = redirector.getOutputStream(); redirectOutPrintStream = new PrintStream(redirectOutStream); redirectErrStream = redirector.getErrorStream(); redirectErrPrintStream = new PrintStream(redirectErrStream); } } /** * Ask redirector to close all the streams. It is necessary to call this method * before leaving the Task to have the Streams flush their contents. If you are * collecting output in a property, it will be created only if this method is * called, otherwise you'll find it unset. */ protected void closeRedirector() { try { if (redirectOutput) { redirector.complete(); } } catch (IOException ioe) { log("Error closing redirector: " + ioe.getMessage(), Project.MSG_ERR); } /* * Due to depends chain, Ant could call the Task more than once, * this is to prevent that we attempt to reuse the previuosly * closed Streams. */ redirectOutStream = null; redirectOutPrintStream = null; redirectErrStream = null; redirectErrPrintStream = null; } /** * Handles output with the INFO priority. * * @param output The output to log. Should not be <code>null</code>. */ protected void handleOutput(String output) { if (redirectOutput) { if (redirectOutPrintStream == null) { openRedirector(); } redirectOutPrintStream.println(output); if (alwaysLog) { log(output, Project.MSG_INFO); } } else { log(output, Project.MSG_INFO); } } /** * Handles output with the INFO priority and flushes the stream. * * @param output The output to log. Should not be <code>null</code>. * */ protected void handleFlush(String output) { handleOutput(output); redirectOutPrintStream.flush(); } /** * Handles error output with the ERR priority. * * @param output The error output to log. Should not be <code>null</code>. */ protected void handleErrorOutput(String output) { if (redirectOutput) { if (redirectErrPrintStream == null) { openRedirector(); } redirectErrPrintStream.println(output); if (alwaysLog) { log(output, Project.MSG_ERR); } } else { log(output, Project.MSG_ERR); } } /** * Handles error output with the ERR priority and flushes the stream. * * @param output The error output to log. Should not be <code>null</code>. * */ protected void handleErrorFlush(String output) { handleErrorOutput(output); redirectErrPrintStream.flush(); } /** * Handles output with ERR priority to error stream and all other * pritorities to output stream. * * @param output The output to log. Should not be <code>null</code>. */ protected void handleOutput(String output, int priority) { if (priority == Project.MSG_ERR) { handleErrorOutput(output); } else { handleOutput(output); } } /** * Handles output with ERR priority to error stream and all other * pritorities to output stream, then flushes the stream. * * @param output The output to log. Should not be <code>null</code>. */ protected void handleFlush(String output, int priority) { if (priority == Project.MSG_ERR) { handleErrorFlush(output); } else { handleFlush(output); } } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]