Submitted by: Jay Glanville <dickon@nortelnetworks.com> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268914 13f79535-47bb-0310-9956-ffa450edef68master
@@ -13,7 +13,7 @@ Changes that could break older environments: | |||||
Other changes: | Other changes: | ||||
-------------- | -------------- | ||||
* New tasks: ear, p4counter | |||||
* New tasks: ear, p4counter, recorder | |||||
* Ant now uses JAXP 1.1 | * Ant now uses JAXP 1.1 | ||||
@@ -0,0 +1,158 @@ | |||||
<html> | |||||
<head> | |||||
<meta http-equiv="Content-Language" content="en-us"> | |||||
<title>Ant User Manual</title> | |||||
</head> | |||||
<body> | |||||
<h2><a name="log">Recorder</a></h2> | |||||
<h3>Description</h3> | |||||
<p>A recorder is a listener to the current build process that records the | |||||
output to a file. | |||||
<p>Several recorders can exist at the same time. Each recorder is | |||||
associated with a file. The filename is used as a unique identifier for | |||||
the recorders. The first call to the recorder task with an unused filename | |||||
will create a recorder (using the parameters provided) and add it to the | |||||
listeners of the build. All subsiquent calls to the recorder task using | |||||
this filename will modify that recorders state (recording or not) or other | |||||
properties (like logging level). | |||||
<p>Some technical issues: the file's print stream is flushed for "finished" | |||||
events (buildFinished, targetFinished and taskFinished), and is closed on | |||||
a buildFinished event. | |||||
<h3>Parameters</h3> | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">name</td> | |||||
<td valign="top">The name of the file this logger is associated with.</td> | |||||
<td align="center" valign="middle">yes</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">action</td> | |||||
<td valign="top">This tells the logger what to do: should it start | |||||
recording or stop? The first time that the recorder task is called for | |||||
this logfile, and if this attribute is not provided, then the default | |||||
for this attribute is "start". If this attribute is not provided on | |||||
subsiquest calls, then the state remains as previous. | |||||
[Values = {start|stop}, Default = no state change]</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">append</td> | |||||
<td valign="top">Should the recorder append to a file, or create a new | |||||
one? This is only applicable the first time this task is called for | |||||
this file. [Vaules = {yes|no}, Default=yes]</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">loglevel</td> | |||||
<td valign="top">At what logging level should this recorder instance | |||||
record to? This is not a once only parameter (like <code>append</code> | |||||
is) -- you can increase or decrease the logging level as the build process | |||||
continues. [Vaules= {error|warn|info|verbose|debug}, Default = no change] | |||||
</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
</table> | |||||
<h3>Examples</h3> | |||||
<p>The following build.xml snippit is an example of how to use the recorder | |||||
to record just the <code><javac></code> task: | |||||
<pre> | |||||
... | |||||
<compile > | |||||
<recorder name="log.txt" action="start" /> | |||||
<javac ... | |||||
<recorder name="log.txt" action="stop" /> | |||||
<compile/> | |||||
... | |||||
</pre> | |||||
<p>The following two calls to <code><recorder></code> set up two | |||||
recorders: one to file "records-simple.log" at logging level <code>info</code> | |||||
(the default) and one to file "ISO.log" using logging level of | |||||
<code>verbose</code>. | |||||
<pre> | |||||
... | |||||
<recorder name="records-simple.log" /> | |||||
<recorder name="ISO.log" loglevel="verbose" /> | |||||
... | |||||
</pre> | |||||
<h3>Notes</h3> | |||||
<p>There is some funtionality that I would like to be able to add in the | |||||
future. They include things like the following: | |||||
<table border="1" cellpadding="2" cellspacing="0"> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | |||||
<td valign="top"><b>Description</b></td> | |||||
<td align="center" valign="top"><b>Required</b></td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">messageprefix</td> | |||||
<td valign="top">Whether or not to include the message prefixes (things | |||||
like the name of the tasks or targets, etc). This has the same effect as | |||||
the <code>-emacs</code> command line parameter does to the screen output. | |||||
[yes|no]</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">listener</td> | |||||
<td valign="top">A classname of a build listener to use from this point | |||||
on instead of the default listener.</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">includetarget</td> | |||||
<td valign="top" rowspan=2>A comma-separated list of targets to automaticly | |||||
record. If this value is "all", then all targets are recorded. | |||||
[Default = all]</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">excludetarget</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">includetask</td> | |||||
<td valign="top" rowspan=2>A comma-separated list of task to automaticly | |||||
record or not. This could be difficult as it could conflict with the | |||||
<code>includetarget/excludetarget</code>. (e.g.: | |||||
<code>includetarget="compile" exlcudetask="javac"</code>, what should | |||||
happen?)</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">excludetask</td> | |||||
<td align="center" valign="middle">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">action</td> | |||||
<td valign="top">add greater flexability to the action attribute. Things | |||||
like <code>close</code> to close the print stream.</td> | |||||
<td align="center" valign="top">no</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top"></td> | |||||
<td valign="top"></td> | |||||
<td align="center" valign="top"></td> | |||||
</tr> | |||||
</table> | |||||
<hr><p align="center">Copyright © 2000,2001 Apache Software Foundation. All rights | |||||
Reserved.</p> | |||||
</body> | |||||
</html> | |||||
@@ -49,6 +49,7 @@ | |||||
<a href="CoreTasks/move.html">Move</a><br> | <a href="CoreTasks/move.html">Move</a><br> | ||||
<a href="CoreTasks/patch.html">Patch</a><br> | <a href="CoreTasks/patch.html">Patch</a><br> | ||||
<a href="CoreTasks/property.html">Property</a><br> | <a href="CoreTasks/property.html">Property</a><br> | ||||
<a href="CoreTasks/recorder.html">Recorder</a><br> | |||||
<a href="CoreTasks/rename.html"><i>Rename</i></a><br> | <a href="CoreTasks/rename.html"><i>Rename</i></a><br> | ||||
<a href="CoreTasks/replace.html">Replace</a><br> | <a href="CoreTasks/replace.html">Replace</a><br> | ||||
<a href="CoreTasks/rmic.html">Rmic</a><br> | <a href="CoreTasks/rmic.html">Rmic</a><br> | ||||
@@ -0,0 +1,230 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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", "Ant", 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 | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.DirectoryScanner; | |||||
import org.apache.tools.ant.Project; | |||||
import org.apache.tools.ant.types.*; | |||||
import org.apache.tools.ant.util.*; | |||||
import org.apache.tools.ant.taskdefs.compilers.*; | |||||
import org.apache.tools.ant.Task; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
/** | |||||
* This task is the manager for RecorderEntry's. It is this class | |||||
* that holds all entries, modifies them every time the <recorder> | |||||
* task is called, and addes them to the build listener process. | |||||
* @see RecorderEntry | |||||
* @author <a href="mailto:jayglanville@home.com">J D Glanville</a> | |||||
* @version 0.5 | |||||
* | |||||
*/ | |||||
public class Recorder extends Task { | |||||
////////////////////////////////////////////////////////////////////// | |||||
// ATTRIBUTES | |||||
/** The name of the file to record to. */ | |||||
private String filename = null; | |||||
/** Whether or not to append. Need Boolean to record an unset | |||||
* state (null). | |||||
*/ | |||||
private Boolean append = null; | |||||
/** Whether to start or stop recording. Need Boolean to record an | |||||
* unset state (null). | |||||
*/ | |||||
private Boolean start = null; | |||||
/** What level to log? -1 means not initialized yet. */ | |||||
private int loglevel = -1; | |||||
/** The list of recorder entries. */ | |||||
private static HashMap recorderEntries = new HashMap(); | |||||
////////////////////////////////////////////////////////////////////// | |||||
// CONSTRUCTORS / INITIALIZERS | |||||
////////////////////////////////////////////////////////////////////// | |||||
// ACCESSOR METHODS | |||||
/** | |||||
* Sets the name of the file to log to, and the name of the recorder entry. | |||||
* @param fname File name of logfile. | |||||
*/ | |||||
public void setName( String fname ) { | |||||
filename = fname; | |||||
} | |||||
/** | |||||
* Sets the action for the associated recorder entry. | |||||
* @param action The action for the entry to take: start or stop. | |||||
*/ | |||||
public void setAction( ActionChoices action ) { | |||||
if ( action.getValue().equalsIgnoreCase( "start" ) ) { | |||||
start = Boolean.TRUE; | |||||
} else { | |||||
start = Boolean.FALSE; | |||||
} | |||||
} | |||||
/** | |||||
* Whether or not the logger should append to a previous file. | |||||
*/ | |||||
public void setAppend( boolean append ) { | |||||
this.append = new Boolean(append); | |||||
} | |||||
/** | |||||
* Sets the level to which this recorder entry should log to. | |||||
* @see VerbosityLevelChoices | |||||
*/ | |||||
public void setLoglevel( VerbosityLevelChoices level ){ | |||||
//I hate cascading if/elseif clauses !!! | |||||
String lev = level.getValue(); | |||||
if ( lev.equalsIgnoreCase("error") ) { | |||||
loglevel = Project.MSG_ERR; | |||||
} else if ( lev.equalsIgnoreCase("warn") ){ | |||||
loglevel = Project.MSG_WARN; | |||||
} else if ( lev.equalsIgnoreCase("info") ){ | |||||
loglevel = Project.MSG_INFO; | |||||
} else if ( lev.equalsIgnoreCase("verbose") ){ | |||||
loglevel = Project.MSG_VERBOSE; | |||||
} else if ( lev.equalsIgnoreCase("debug") ){ | |||||
loglevel = Project.MSG_DEBUG; | |||||
} | |||||
} | |||||
////////////////////////////////////////////////////////////////////// | |||||
// CORE / MAIN BODY | |||||
/** | |||||
* The main execution. | |||||
*/ | |||||
public void execute() throws BuildException { | |||||
if ( filename == null ) | |||||
throw new BuildException( "No filename specified" ); | |||||
getProject().log( "setting a recorder for name " + filename, | |||||
Project.MSG_DEBUG ); | |||||
// get the recorder entry | |||||
RecorderEntry recorder = getRecorder( filename, getProject() ); | |||||
// set the values on the recorder | |||||
recorder.setMessageOutputLevel( loglevel ); | |||||
recorder.setRecordState( start ); | |||||
} | |||||
////////////////////////////////////////////////////////////////////// | |||||
// INNER CLASSES | |||||
/** | |||||
* A list of possible values for the <code>setAction()</code> method. | |||||
* Possible values include: start and stop. | |||||
*/ | |||||
public static class ActionChoices extends EnumeratedAttribute { | |||||
private static final String[] values = {"start", "stop"}; | |||||
public String[] getValues() { | |||||
return values; | |||||
} | |||||
} | |||||
/** | |||||
* A list of possible values for the <code>setLoglevel()</code> method. | |||||
* Possible values include: error, warn, info, verbose, debug. | |||||
*/ | |||||
public static class VerbosityLevelChoices extends EnumeratedAttribute { | |||||
private static final String[] values = { "error", "warn", "info", | |||||
"verbose", "debug"}; | |||||
public String[] getValues() { | |||||
return values; | |||||
} | |||||
} | |||||
/** | |||||
* Gets the recorder that's associated with the passed in name. | |||||
* If the recorder doesn't exist, then a new one is created. | |||||
*/ | |||||
protected RecorderEntry getRecorder( String name, Project proj ) throws BuildException { | |||||
Object o = recorderEntries.get(name); | |||||
RecorderEntry entry; | |||||
if ( o == null ) { | |||||
// create a recorder entry | |||||
try { | |||||
entry = new RecorderEntry( name ); | |||||
PrintStream out = null; | |||||
if ( append == null ) { | |||||
out = new PrintStream( | |||||
new FileOutputStream(name)); | |||||
} else { | |||||
out = new PrintStream( | |||||
new FileOutputStream(name, append.booleanValue())); | |||||
} | |||||
entry.setErrorPrintStream(out); | |||||
entry.setOutputPrintStream(out); | |||||
} catch ( IOException ioe ) { | |||||
throw new BuildException( "Problems creating a recorder entry", | |||||
ioe ); | |||||
} | |||||
proj.addBuildListener(entry); | |||||
recorderEntries.put(name, entry); | |||||
} else { | |||||
entry = (RecorderEntry) o; | |||||
} | |||||
return entry; | |||||
} | |||||
} |
@@ -0,0 +1,230 @@ | |||||
/* | |||||
* The Apache Software License, Version 1.1 | |||||
* | |||||
* Copyright (c) 2001 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", "Ant", 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 | |||||
* <http://www.apache.org/>. | |||||
*/ | |||||
package org.apache.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.*; | |||||
import java.io.*; | |||||
import java.util.*; | |||||
/** | |||||
* This is a class that represents a recorder. This is the listener | |||||
* to the build process. | |||||
* @author <a href="mailto:jayglanville@home.com">J D Glanville</a> | |||||
* @version 0.5 | |||||
* | |||||
*/ | |||||
public class RecorderEntry implements BuildLogger { | |||||
////////////////////////////////////////////////////////////////////// | |||||
// ATTRIBUTES | |||||
/** | |||||
* The name of the file associated with this recorder entry. | |||||
*/ | |||||
private String filename = null; | |||||
/** | |||||
* The state of the recorder (recorder on or off). | |||||
*/ | |||||
private boolean record = true; | |||||
/** | |||||
* The current verbosity level to record at. | |||||
*/ | |||||
private int loglevel = Project.MSG_INFO; | |||||
/** | |||||
* The output PrintStream to record to. | |||||
*/ | |||||
private PrintStream out = null; | |||||
/** | |||||
* The start time of the last know target. | |||||
*/ | |||||
private long targetStartTime = 0l; | |||||
/** | |||||
* Line separator. | |||||
*/ | |||||
private static String lSep = System.getProperty("line.separator"); | |||||
////////////////////////////////////////////////////////////////////// | |||||
// CONSTRUCTORS / INITIALIZERS | |||||
/** | |||||
* @param name The name of this recorder (used as the filename). | |||||
* | |||||
*/ | |||||
protected RecorderEntry( String name ) { | |||||
filename = name; | |||||
} | |||||
////////////////////////////////////////////////////////////////////// | |||||
// ACCESSOR METHODS | |||||
/** | |||||
* @return the name of the file the output is sent to. | |||||
*/ | |||||
public String getFilename() { | |||||
return filename; | |||||
} | |||||
/** | |||||
* Turns off or on this recorder. | |||||
* @param state true for on, false for off, null for no change. | |||||
*/ | |||||
public void setRecordState( Boolean state ) { | |||||
if ( state != null ) | |||||
record = state.booleanValue(); | |||||
} | |||||
public void buildStarted(BuildEvent event) { | |||||
log( "> BUILD STARTED", Project.MSG_DEBUG ); | |||||
} | |||||
public void buildFinished(BuildEvent event) { | |||||
log( "< BUILD FINISHED", Project.MSG_DEBUG ); | |||||
Throwable error = event.getException(); | |||||
if (error == null) { | |||||
out.println(lSep + "BUILD SUCCESSFUL"); | |||||
} else { | |||||
out.println(lSep + "BUILD FAILED" + lSep); | |||||
error.printStackTrace(out); | |||||
} | |||||
out.flush(); | |||||
out.close(); | |||||
} | |||||
public void targetStarted(BuildEvent event) { | |||||
log( ">> TARGET STARTED -- " + event.getTarget(), Project.MSG_DEBUG ); | |||||
log( lSep + event.getTarget().getName() + ":", Project.MSG_INFO ); | |||||
targetStartTime = System.currentTimeMillis(); | |||||
} | |||||
public void targetFinished(BuildEvent event) { | |||||
log( "<< TARGET FINISHED -- " + event.getTarget(), Project.MSG_DEBUG ); | |||||
String time = formatTime( System.currentTimeMillis() - targetStartTime ); | |||||
log( event.getTarget() + ": duration " + time, Project.MSG_VERBOSE ); | |||||
out.flush(); | |||||
} | |||||
public void taskStarted(BuildEvent event) { | |||||
log( ">>> TAST STARTED -- " + event.getTask(), Project.MSG_DEBUG ); | |||||
} | |||||
public void taskFinished(BuildEvent event) { | |||||
log( "<<< TASK FINISHED -- " + event.getTask(), Project.MSG_DEBUG ); | |||||
out.flush(); | |||||
} | |||||
public void messageLogged(BuildEvent event) { | |||||
log( "--- MESSAGE LOGGED", Project.MSG_DEBUG ); | |||||
StringBuffer buf = new StringBuffer(); | |||||
if ( event.getTask() != null ) { | |||||
String name = "[" + event.getTask().getTaskName() + "]"; | |||||
/** @todo replace 12 with DefaultLogger.LEFT_COLUMN_SIZE */ | |||||
for ( int i = 0; i < (12 - name.length()); i++ ) { | |||||
buf.append( " " ); | |||||
} // for | |||||
buf.append( name ); | |||||
} // if | |||||
buf.append( event.getMessage() ); | |||||
log( buf.toString(), event.getPriority() ); | |||||
} | |||||
/** | |||||
* The thing that actually sends the information to the output. | |||||
* @param mesg The message to log. | |||||
* @param level The verbosity level of the message. | |||||
*/ | |||||
private void log( String mesg, int level ) { | |||||
if ( record && (level <= loglevel) ) { | |||||
out.println(mesg); | |||||
} | |||||
} | |||||
public void setMessageOutputLevel(int level) { | |||||
if ( level >= Project.MSG_ERR && level <= Project.MSG_DEBUG ) | |||||
loglevel = level; | |||||
} | |||||
public void setOutputPrintStream(PrintStream output) { | |||||
out = output; | |||||
} | |||||
public void setEmacsMode(boolean emacsMode) { | |||||
throw new java.lang.UnsupportedOperationException("Method setEmacsMode() not yet implemented."); | |||||
} | |||||
public void setErrorPrintStream(PrintStream err) { | |||||
out = err; | |||||
} | |||||
private static String formatTime(long millis) { | |||||
long seconds = millis / 1000; | |||||
long minutes = seconds / 60; | |||||
if (minutes > 0) { | |||||
return Long.toString(minutes) + " minute" | |||||
+ (minutes == 1 ? " " : "s ") | |||||
+ Long.toString(seconds%60) + " second" | |||||
+ (seconds%60 == 1 ? "" : "s"); | |||||
} | |||||
else { | |||||
return Long.toString(seconds) + " second" | |||||
+ (seconds%60 == 1 ? "" : "s"); | |||||
} | |||||
} | |||||
} |
@@ -43,6 +43,7 @@ fail=org.apache.tools.ant.taskdefs.Exit | |||||
war=org.apache.tools.ant.taskdefs.War | war=org.apache.tools.ant.taskdefs.War | ||||
uptodate=org.apache.tools.ant.taskdefs.UpToDate | uptodate=org.apache.tools.ant.taskdefs.UpToDate | ||||
apply=org.apache.tools.ant.taskdefs.Transform | apply=org.apache.tools.ant.taskdefs.Transform | ||||
recorder=org.apache.tools.ant.taskdefs.Recorder | |||||
# optional tasks | # optional tasks | ||||
script=org.apache.tools.ant.taskdefs.optional.Script | script=org.apache.tools.ant.taskdefs.optional.Script | ||||