diff --git a/src/main/org/apache/tools/ant/BuildLogger.java b/src/main/org/apache/tools/ant/BuildLogger.java new file mode 100644 index 000000000..0ac485b76 --- /dev/null +++ b/src/main/org/apache/tools/ant/BuildLogger.java @@ -0,0 +1,92 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant; + +import java.io.*; + +/** + * Interface used by Ant to log the build output. + * + * A build logger is a build listener which has the 'right' to send output to the + * ant log, which is usually System.out unles redirected by the -logfile option. + * + * @author Conor MacNeill + */ +public interface BuildLogger extends BuildListener { + /** + * Set the msgOutputLevel this logger is to respond to. + * + * Only messages with a message level lower than or equal to the given level are + * output to the log. + * + * @param level the logging level for the logger. + */ + public void setMessageOutputLevel(int level); + + /** + * Set the output stream to which this logger is to send its output. + * + * @param output the output stream for the logger. + */ + public void setOutputPrintStream(PrintStream output); + + /** + * Set this logger to produce emacs (and other editor) friendly output. + * + * @param emacsMode true if output is to be unadorned so that emacs and other + * editors can parse files names, etc. + */ + public void setEmacsMode(boolean emacsMode); +} \ No newline at end of file diff --git a/src/main/org/apache/tools/ant/DefaultLogger.java b/src/main/org/apache/tools/ant/DefaultLogger.java index 5bee54f74..c5e5242af 100644 --- a/src/main/org/apache/tools/ant/DefaultLogger.java +++ b/src/main/org/apache/tools/ant/DefaultLogger.java @@ -61,24 +61,48 @@ import java.io.*; * only writes which targets are being executed, and * any messages that get logged. */ -public class DefaultLogger implements BuildListener { +public class DefaultLogger implements BuildLogger { private static int LEFT_COLUMN_SIZE = 12; private PrintStream out; private int msgOutputLevel; private long startTime = System.currentTimeMillis(); + private boolean emacsMode = false; /** - * Constructs a new logger which will write to the specified - * PrintStream. Messages with a priority lower (higher?) than - * msgOutputLevel will be ignored. + * Set the msgOutputLevel this logger is to respond to. + * + * Only messages with a message level lower than or equal to the given level are + * output to the log. + * + * @param level the logging level for the logger. */ - public DefaultLogger(PrintStream out, int msgOutputLevel) { - this.out = out; - this.msgOutputLevel = msgOutputLevel; + public void setMessageOutputLevel(int level) { + this.msgOutputLevel = level; } + + /** + * Set the output stream to which this logger is to send its output. + * + * @param output the output stream for the logger. + */ + public void setOutputPrintStream(PrintStream output) { + this.out = output; + } + + /** + * Set this logger to produce emacs (and other editor) friendly output. + * + * @param emacsMode true if output is to be unadorned so that emacs and other + * editors can parse files names, etc. + */ + public void setEmacsMode(boolean emacsMode) { + this.emacsMode = emacsMode; + } + + public void buildStarted(BuildEvent event) { startTime = System.currentTimeMillis(); } @@ -133,11 +157,13 @@ public class DefaultLogger implements BuildListener { if (event.getTask() != null) { String name = event.getTask().getTaskName(); - String msg = "[" + name + "] "; - for (int i = 0; i < (LEFT_COLUMN_SIZE - msg.length()); i++) { - out.print(" "); + if (!emacsMode) { + String msg = "[" + name + "] "; + for (int i = 0; i < (LEFT_COLUMN_SIZE - msg.length()); i++) { + out.print(" "); + } + out.print(msg); } - out.print(msg); } // Print the message diff --git a/src/main/org/apache/tools/ant/Main.java b/src/main/org/apache/tools/ant/Main.java index 1ef075351..15799c53f 100644 --- a/src/main/org/apache/tools/ant/Main.java +++ b/src/main/org/apache/tools/ant/Main.java @@ -90,6 +90,18 @@ public class Main { /** Names of classes to add as listeners to project */ private Vector listeners = new Vector(5); + /** + * The Ant logger class. There may be only one logger. It will have the + * right to use the 'out' PrintStream. The class must implements the BuildLogger + * interface + */ + private String loggerClassname = null; + + /** + * Indicates whether output to the log is to be unadorned. + */ + private boolean emacsMode = false; + /** * Indicates if this ant should be run. */ @@ -190,6 +202,14 @@ public class Main { value = args[++i]; definedProps.put(name, value); + } else if (arg.equals("-logger")) { + if (loggerClassname != null) { + System.out.println("Only one logger class may be specified."); + return; + } + loggerClassname = args[++i]; + } else if (arg.equals("-emacs")) { + emacsMode = true; } else if (arg.startsWith("-")) { // we don't have any more args to recognize! String msg = "Unknown arg: " + arg; @@ -224,7 +244,6 @@ public class Main { /** * Executes the build. */ - private void runBuild() throws BuildException { if (!readyToRun) { @@ -294,7 +313,7 @@ public class Main { protected void addBuildListeners(Project project) { // Add the default listener - project.addBuildListener(createDefaultBuildListener()); + project.addBuildListener(createLogger()); for (int i = 0; i < listeners.size(); i++) { String className = (String) listeners.elementAt(i); @@ -310,10 +329,34 @@ public class Main { } /** - * Creates the default build listener for displaying output to the screen. + * Creates the default build logger for sending build events to the ant log. */ - private BuildListener createDefaultBuildListener() { - return new DefaultLogger(out, msgOutputLevel); + private BuildLogger createLogger() { + BuildLogger logger = null; + if (loggerClassname != null) { + try { + logger = (BuildLogger)(Class.forName(loggerClassname).newInstance()); + } + catch (ClassCastException e) { + System.err.println("The specified logger class " + loggerClassname + + " does not implement the BuildLogger interface"); + throw new RuntimeException(); + } + catch (Exception e) { + System.err.println("Unable to instantiate specified logger class " + + loggerClassname + " : " + e.getClass().getName()); + throw new RuntimeException(); + } + } + else { + logger = new DefaultLogger(); + } + + logger.setMessageOutputLevel(msgOutputLevel); + logger.setOutputPrintStream(out); + logger.setEmacsMode(emacsMode); + + return logger; } /** @@ -328,7 +371,9 @@ public class Main { msg.append(" -version print the version information and exit" + lSep); msg.append(" -quiet be extra quiet" + lSep); msg.append(" -verbose be extra verbose" + lSep); + msg.append(" -emacs produce logging information without adornments" + lSep); msg.append(" -logfile use given file for log" + lSep); + msg.append(" -logger the class which is to perform logging" + lSep); msg.append(" -listener add an instance of class as a project listener" + lSep); msg.append(" -buildfile use given buildfile" + lSep); msg.append(" -D= use value for given property" + lSep); diff --git a/src/main/org/apache/tools/ant/taskdefs/Ant.java b/src/main/org/apache/tools/ant/taskdefs/Ant.java index 4ab44064e..7072c4c58 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Ant.java +++ b/src/main/org/apache/tools/ant/taskdefs/Ant.java @@ -120,7 +120,10 @@ public class Ant extends Task { if (output != null) { try { PrintStream out = new PrintStream(new FileOutputStream(output)); - p1.addBuildListener(new DefaultLogger(out, Project.MSG_INFO)); + DefaultLogger logger = new DefaultLogger(); + logger.setMessageOutputLevel(Project.MSG_INFO); + logger.setOutputPrintStream(out); + p1.addBuildListener(logger); } catch( IOException ex ) { log( "Ant: Can't set output to " + output );