diff --git a/WHATSNEW b/WHATSNEW
index 50f0c19c7..9d8f0dc8e 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -256,6 +256,9 @@ Other changes:
*
org.apache.tools.ant.TimestampedLogger
+++ +
ant -listener org.apache.tools.ant.XmlLogger
+ant -logger org.apache.tools.ant.XmlLogger -verbose -logfile build_log.xml
+ Acts like the default logger, except that the final success/failure message also includes + the time that the build completed. For example:
++ BUILD SUCCESSFUL - at 16/08/05 16:24 +
-++
ant -listener org.apache.tools.ant.XmlLogger
-ant -logger org.apache.tools.ant.XmlLogger -verbose -logfile build_log.xml
ant -logger org.apache.tools.ant.listener.TimestampedLogger
See the Build Events section for diff --git a/src/main/org/apache/tools/ant/DefaultLogger.java b/src/main/org/apache/tools/ant/DefaultLogger.java index b42db40f4..4190bf568 100644 --- a/src/main/org/apache/tools/ant/DefaultLogger.java +++ b/src/main/org/apache/tools/ant/DefaultLogger.java @@ -21,6 +21,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.PrintStream; import java.io.StringReader; + import org.apache.tools.ant.util.DateUtils; import org.apache.tools.ant.util.StringUtils; @@ -131,24 +132,19 @@ public class DefaultLogger implements BuildLogger { public void buildFinished(BuildEvent event) { Throwable error = event.getException(); StringBuffer message = new StringBuffer(); - if (error == null) { message.append(StringUtils.LINE_SEP); - message.append("BUILD SUCCESSFUL"); + message.append(getBuildSuccessfulMessage()); } else { message.append(StringUtils.LINE_SEP); - message.append("BUILD FAILED"); + message.append(getBuildFailedMessage()); message.append(StringUtils.LINE_SEP); if (Project.MSG_VERBOSE <= msgOutputLevel || !(error instanceof BuildException)) { message.append(StringUtils.getStackTrace(error)); } else { - if (error instanceof BuildException) { - message.append(error.toString()).append(lSep); - } else { - message.append(error.getMessage()).append(lSep); - } + message.append(error.toString()).append(lSep); } } message.append(StringUtils.LINE_SEP); @@ -164,6 +160,24 @@ public class DefaultLogger implements BuildLogger { log(msg); } + /** + * This is an override point: the message that indicates whether a build failed. + * Subclasses can change/enhance the message. + * @return The classic "BUILD FAILED" + */ + protected String getBuildFailedMessage() { + return "BUILD FAILED"; + } + + /** + * This is an override point: the message that indicates that a build succeeded. + * Subclasses can change/enhance the message. + * @return The classic "BUILD SUCCESSFUL" + */ + protected String getBuildSuccessfulMessage() { + return "BUILD SUCCESSFUL"; + } + /** * Logs a message to say that the target has started if this * logger allows information-level messages. diff --git a/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java b/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java index cc2b7f14c..455dca1c9 100644 --- a/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java +++ b/src/main/org/apache/tools/ant/listener/CommonsLoggingListener.java @@ -57,6 +57,15 @@ public class CommonsLoggingListener implements BuildListener, BuildLogger { private LogFactory logFactory; + /** + * name of the category under which target events are logged + */ + public static final String TARGET_LOG = "org.apache.tools.ant.Target"; + /** + * name of the category under which project events are logged + */ + public static final String PROJECT_LOG = "org.apache.tools.ant.Project"; + /** * Construct the listener and make sure that a LogFactory * can be obtained. @@ -95,7 +104,7 @@ public class CommonsLoggingListener implements BuildListener, BuildLogger { * @see BuildListener#buildStarted */ public void buildStarted(BuildEvent event) { - String categoryString = "org.apache.tools.ant.Project"; + String categoryString = PROJECT_LOG; Log log = getLog(categoryString, null); if (initialized) { @@ -108,7 +117,7 @@ public class CommonsLoggingListener implements BuildListener, BuildLogger { */ public void buildFinished(BuildEvent event) { if (initialized) { - String categoryString = "org.apache.tools.ant.Project"; + String categoryString = PROJECT_LOG; Log log = getLog(categoryString, event.getProject().getName()); if (event.getException() == null) { @@ -125,7 +134,7 @@ public class CommonsLoggingListener implements BuildListener, BuildLogger { */ public void targetStarted(BuildEvent event) { if (initialized) { - Log log = getLog("org.apache.tools.ant.Target", + Log log = getLog(TARGET_LOG, event.getTarget().getName()); // Since task log category includes target, we don't really // need this message @@ -140,7 +149,7 @@ public class CommonsLoggingListener implements BuildListener, BuildLogger { public void targetFinished(BuildEvent event) { if (initialized) { String targetName = event.getTarget().getName(); - Log log = getLog("org.apache.tools.ant.Target", + Log log = getLog(TARGET_LOG, event.getTarget().getName()); if (event.getException() == null) { realLog(log, "Target end: " + targetName, Project.MSG_DEBUG, null); @@ -214,10 +223,10 @@ public class CommonsLoggingListener implements BuildListener, BuildLogger { categoryObject = event.getTarget(); if (categoryObject == null) { categoryObject = event.getProject(); - categoryString = "org.apache.tools.ant.Project"; + categoryString = PROJECT_LOG; categoryDetail = event.getProject().getName(); } else { - categoryString = "org.apache.tools.ant.Target"; + categoryString = TARGET_LOG; categoryDetail = event.getTarget().getName(); } } else { diff --git a/src/main/org/apache/tools/ant/listener/Log4jListener.java b/src/main/org/apache/tools/ant/listener/Log4jListener.java index 4642fe92b..3e041ad75 100644 --- a/src/main/org/apache/tools/ant/listener/Log4jListener.java +++ b/src/main/org/apache/tools/ant/listener/Log4jListener.java @@ -35,12 +35,17 @@ public class Log4jListener implements BuildListener { /** Indicates if the listener was initialized. */ private boolean initialized = false; + /** + * log category we log into + */ + public static final String LOG_ANT = "org.apache.tools.ant"; + /** * Construct the listener and make sure there is a valid appender. */ public Log4jListener() { initialized = false; - Logger log = Logger.getLogger("org.apache.tools.ant"); + Logger log = Logger.getLogger(LOG_ANT); Logger rootLog = Logger.getRootLogger(); if (!(rootLog.getAllAppenders() instanceof NullEnumeration)) { initialized = true; diff --git a/src/main/org/apache/tools/ant/listener/TimestampedLogger.java b/src/main/org/apache/tools/ant/listener/TimestampedLogger.java new file mode 100644 index 000000000..cea584a4c --- /dev/null +++ b/src/main/org/apache/tools/ant/listener/TimestampedLogger.java @@ -0,0 +1,45 @@ +package org.apache.tools.ant.listener; + +import org.apache.tools.ant.DefaultLogger; + +import java.util.Date; +import java.text.DateFormat; + +/** + * Like a normal logger, except with timed outputs + */ +public class TimestampedLogger extends DefaultLogger { + + /** + * what appears between the old message and the new + */ + private static final String SPACER = " - at "; + + + /** + * This is an override point: the message that indicates whether a build failed. + * Subclasses can change/enhance the message. + * + * @return The classic "BUILD FAILED" + */ + protected String getBuildFailedMessage() { + return super.getBuildFailedMessage() + SPACER + getTimestamp(); + } + + /** + * This is an override point: the message that indicates that a build succeeded. + * Subclasses can change/enhance the message. + * + * @return The classic "BUILD SUCCESSFUL" + */ + protected String getBuildSuccessfulMessage() { + return super.getBuildSuccessfulMessage()+SPACER +getTimestamp(); + } + + protected String getTimestamp() { + Date date = new Date(System.currentTimeMillis()); + DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); + String finishTime = formatter.format(date); + return finishTime; + } +}