Fields Summary |
---|
private int | msgOutputLevel |
private PrintStream | outStream |
private static DocumentBuilder | builderDocumentBuilder to use when creating the document to start with. |
private static final String | BUILD_TAGXML element name for a build. |
private static final String | TARGET_TAGXML element name for a target. |
private static final String | TASK_TAGXML element name for a task. |
private static final String | MESSAGE_TAGXML element name for a message. |
private static final String | NAME_ATTRXML attribute name for a name. |
private static final String | TIME_ATTRXML attribute name for a time. |
private static final String | PRIORITY_ATTRXML attribute name for a message priority. |
private static final String | LOCATION_ATTRXML attribute name for a file location. |
private static final String | ERROR_ATTRXML attribute name for an error description. |
private static final String | STACKTRACE_TAGXML element name for a stack trace. |
private Document | docThe complete log document for this build. |
private Hashtable | tasksMapping for when tasks started (Task to TimedElement). |
private Hashtable | targetsMapping for when targets started (Task to TimedElement). |
private Hashtable | threadStacksMapping of threads to stacks of elements
(Thread to Stack of TimedElement). |
private TimedElement | buildElementWhen the build started. |
Methods Summary |
---|
public void | buildFinished(BuildEvent event)Fired when the build finishes, this adds the time taken and any
error stacktrace to the build element and writes the document to disk.
long totalTime = System.currentTimeMillis() - buildElement.startTime;
buildElement.element.setAttribute(TIME_ATTR,
DefaultLogger.formatTime(totalTime));
if (event.getException() != null) {
buildElement.element.setAttribute(ERROR_ATTR,
event.getException().toString());
// print the stacktrace in the build file it is always useful...
// better have too much info than not enough.
Throwable t = event.getException();
Text errText = doc.createCDATASection(StringUtils.getStackTrace(t));
Element stacktrace = doc.createElement(STACKTRACE_TAG);
stacktrace.appendChild(errText);
buildElement.element.appendChild(stacktrace);
}
String outFilename = event.getProject().getProperty("XmlLogger.file");
if (outFilename == null) {
outFilename = "log.xml";
}
String xslUri
= event.getProject().getProperty("ant.XmlLogger.stylesheet.uri");
if (xslUri == null) {
xslUri = "log.xsl";
}
Writer out = null;
try {
// specify output in UTF8 otherwise accented characters will blow
// up everything
OutputStream stream = outStream;
if (stream == null) {
stream = new FileOutputStream(outFilename);
}
out = new OutputStreamWriter(stream, "UTF8");
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
if (xslUri.length() > 0) {
out.write("<?xml-stylesheet type=\"text/xsl\" href=\""
+ xslUri + "\"?>\n\n");
}
(new DOMElementWriter()).write(buildElement.element, out, 0, "\t");
out.flush();
} catch (IOException exc) {
throw new BuildException("Unable to write log file", exc);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
// ignore
}
}
}
buildElement = null;
|
public void | buildStarted(BuildEvent event)Fired when the build starts, this builds the top-level element for the
document and remembers the time of the start of the build.
buildElement = new TimedElement();
buildElement.startTime = System.currentTimeMillis();
buildElement.element = doc.createElement(BUILD_TAG);
|
private static javax.xml.parsers.DocumentBuilder | getDocumentBuilder()Returns a default DocumentBuilder instance or throws an
ExceptionInInitializerError if it can't be created.
try {
return DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (Exception exc) {
throw new ExceptionInInitializerError(exc);
}
|
private java.util.Stack | getStack()Returns the stack of timed elements for the current thread.
Stack threadStack = (Stack) threadStacks.get(Thread.currentThread());
if (threadStack == null) {
threadStack = new Stack();
threadStacks.put(Thread.currentThread(), threadStack);
}
/* For debugging purposes uncomment:
org.w3c.dom.Comment s = doc.createComment("stack=" + threadStack);
buildElement.element.appendChild(s);
*/
return threadStack;
|
private org.apache.tools.ant.XmlLogger$TimedElement | getTaskElement(Task task)Get the TimedElement associated with a task.
Where the task is not found directly, search for unknown elements which
may be hiding the real task
TimedElement element = (TimedElement) tasks.get(task);
if (element != null) {
return element;
}
for (Enumeration e = tasks.keys(); e.hasMoreElements();) {
Task key = (Task) e.nextElement();
if (key instanceof UnknownElement) {
if (((UnknownElement) key).getTask() == task) {
return (TimedElement) tasks.get(key);
}
}
}
return null;
|
public void | messageLogged(BuildEvent event)Fired when a message is logged, this adds a message element to the
most appropriate parent element (task, target or build) and records
the priority and text of the message.
int priority = event.getPriority();
if (priority > msgOutputLevel) {
return;
}
Element messageElement = doc.createElement(MESSAGE_TAG);
String name = "debug";
switch (event.getPriority()) {
case Project.MSG_ERR:
name = "error";
break;
case Project.MSG_WARN:
name = "warn";
break;
case Project.MSG_INFO:
name = "info";
break;
default:
name = "debug";
break;
}
messageElement.setAttribute(PRIORITY_ATTR, name);
Throwable ex = event.getException();
if (Project.MSG_DEBUG <= msgOutputLevel && ex != null) {
Text errText = doc.createCDATASection(StringUtils.getStackTrace(ex));
Element stacktrace = doc.createElement(STACKTRACE_TAG);
stacktrace.appendChild(errText);
buildElement.element.appendChild(stacktrace);
}
Text messageText = doc.createCDATASection(event.getMessage());
messageElement.appendChild(messageText);
TimedElement parentElement = null;
Task task = event.getTask();
Target target = event.getTarget();
if (task != null) {
parentElement = getTaskElement(task);
}
if (parentElement == null && target != null) {
parentElement = (TimedElement) targets.get(target);
}
/*
if (parentElement == null) {
Stack threadStack
= (Stack) threadStacks.get(Thread.currentThread());
if (threadStack != null) {
if (!threadStack.empty()) {
parentElement = (TimedElement) threadStack.peek();
}
}
}
*/
if (parentElement != null) {
parentElement.element.appendChild(messageElement);
} else {
buildElement.element.appendChild(messageElement);
}
|
public void | setEmacsMode(boolean emacsMode)Ignore emacs mode, as it has no meaning in XML format
|
public void | setErrorPrintStream(java.io.PrintStream err)Ignore error print stream. All output will be written to
either the XML log file or the PrintStream provided to
setOutputPrintStream
|
public void | setMessageOutputLevel(int level)Set the logging level when using this as a Logger
msgOutputLevel = level;
|
public void | setOutputPrintStream(java.io.PrintStream output)Set the output stream to which logging output is sent when operating
as a logger.
this.outStream = new PrintStream(output, true);
|
public void | targetFinished(BuildEvent event)Fired when a target finishes building, this adds the time taken
and any error stacktrace to the appropriate target element in the log.
Target target = event.getTarget();
TimedElement targetElement = (TimedElement) targets.get(target);
if (targetElement != null) {
long totalTime
= System.currentTimeMillis() - targetElement.startTime;
targetElement.element.setAttribute(TIME_ATTR,
DefaultLogger.formatTime(totalTime));
TimedElement parentElement = null;
Stack threadStack = getStack();
if (!threadStack.empty()) {
TimedElement poppedStack = (TimedElement) threadStack.pop();
if (poppedStack != targetElement) {
throw new RuntimeException("Mismatch - popped element = "
+ poppedStack
+ " finished target element = "
+ targetElement);
}
if (!threadStack.empty()) {
parentElement = (TimedElement) threadStack.peek();
}
}
if (parentElement == null) {
buildElement.element.appendChild(targetElement.element);
} else {
parentElement.element.appendChild(targetElement.element);
}
}
targets.remove(target);
|
public void | targetStarted(BuildEvent event)Fired when a target starts building, this pushes a timed element
for the target onto the stack of elements for the current thread,
remembering the current time and the name of the target.
Target target = event.getTarget();
TimedElement targetElement = new TimedElement();
targetElement.startTime = System.currentTimeMillis();
targetElement.element = doc.createElement(TARGET_TAG);
targetElement.element.setAttribute(NAME_ATTR, target.getName());
targets.put(target, targetElement);
getStack().push(targetElement);
|
public void | taskFinished(BuildEvent event)Fired when a task finishes building, this adds the time taken
and any error stacktrace to the appropriate task element in the log.
Task task = event.getTask();
TimedElement taskElement = (TimedElement) tasks.get(task);
if (taskElement != null) {
long totalTime = System.currentTimeMillis() - taskElement.startTime;
taskElement.element.setAttribute(TIME_ATTR,
DefaultLogger.formatTime(totalTime));
Target target = task.getOwningTarget();
TimedElement targetElement = null;
if (target != null) {
targetElement = (TimedElement) targets.get(target);
}
if (targetElement == null) {
buildElement.element.appendChild(taskElement.element);
} else {
targetElement.element.appendChild(taskElement.element);
}
Stack threadStack = getStack();
if (!threadStack.empty()) {
TimedElement poppedStack = (TimedElement) threadStack.pop();
if (poppedStack != taskElement) {
throw new RuntimeException("Mismatch - popped element = "
+ poppedStack + " finished task element = "
+ taskElement);
}
}
tasks.remove(task);
} else {
throw new RuntimeException("Unknown task " + task + " not in " + tasks);
}
|
public void | taskStarted(BuildEvent event)Fired when a task starts building, this pushes a timed element
for the task onto the stack of elements for the current thread,
remembering the current time and the name of the task.
TimedElement taskElement = new TimedElement();
taskElement.startTime = System.currentTimeMillis();
taskElement.element = doc.createElement(TASK_TAG);
Task task = event.getTask();
String name = event.getTask().getTaskName();
if (name == null) {
name = "";
}
taskElement.element.setAttribute(NAME_ATTR, name);
taskElement.element.setAttribute(LOCATION_ATTR,
event.getTask().getLocation().toString());
tasks.put(task, taskElement);
getStack().push(taskElement);
|