/*
* Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved.
*
* 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 net.sf.antcontrib.antserver.server;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Stack;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildListener;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/****************************************************************************
* Place class description here.
*
* @author <a href='mailto:mattinger@yahoo.com'>Matthew Inger</a>
* @author <additional author>
*
* @since
*
****************************************************************************/
public class ConnectionBuildListener
implements BuildListener
{
private Document results;
private Stack elementStack;
private ThreadGroup group;
public ConnectionBuildListener()
throws ParserConfigurationException
{
group = Thread.currentThread().getThreadGroup();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
results = builder.newDocument();
elementStack = new Stack();
Element rootElement = results.createElement("results");
elementStack.push(rootElement);
results.appendChild(rootElement);
}
public Document getDocument()
{
return results;
}
public void buildStarted(BuildEvent event)
{
}
public void buildFinished(BuildEvent event)
{
}
public void targetStarted(BuildEvent event)
{
if (Thread.currentThread().getThreadGroup() != group)
return;
Element parent = (Element)elementStack.peek();
Element myElement = results.createElement("target");
myElement.setAttribute("name", event.getTarget().getName());
parent.appendChild(myElement);
elementStack.push(myElement);
}
public void targetFinished(BuildEvent event)
{
if (Thread.currentThread().getThreadGroup() != group)
return;
Element myElement = (Element)elementStack.peek();
String message = event.getMessage();
if (message != null)
myElement.setAttribute("message", message);
Throwable t = event.getException();
if (t != null)
{
myElement.setAttribute("status", "failure");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
t.printStackTrace(ps);
ps.flush();
String errorMessage = t.getMessage();
String stackTrace = baos.toString();
Element error = results.createElement("error");
Element errorMsgElement = results.createElement("message");
errorMsgElement.appendChild(results.createTextNode(errorMessage));
Element stackElement = results.createElement("stack");
stackElement.appendChild(results.createCDATASection(stackTrace));
error.appendChild(errorMsgElement);
error.appendChild(stackElement);
myElement.appendChild(error);
}
else
{
myElement.setAttribute("status", "success");
}
elementStack.pop();
}
public void taskStarted(BuildEvent event)
{
if (Thread.currentThread().getThreadGroup() != group)
return;
Element parent = (Element)elementStack.peek();
Element myElement = results.createElement("task");
myElement.setAttribute("name", event.getTask().getTaskName());
parent.appendChild(myElement);
elementStack.push(myElement);
}
public void taskFinished(BuildEvent event)
{
if (Thread.currentThread().getThreadGroup() != group)
return;
Element myElement = (Element)elementStack.peek();
Throwable t = event.getException();
if (t != null)
{
myElement.setAttribute("status", "failure");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
t.printStackTrace(ps);
ps.flush();
String errorMessage = t.getMessage();
String stackTrace = baos.toString();
Element error = results.createElement("error");
Element errorMsgElement = results.createElement("message");
errorMsgElement.appendChild(results.createTextNode(errorMessage));
Element stackElement = results.createElement("stack");
stackElement.appendChild(results.createCDATASection(stackTrace));
error.appendChild(errorMsgElement);
error.appendChild(stackElement);
myElement.appendChild(error);
}
else
{
myElement.setAttribute("status", "success");
}
elementStack.pop();
}
public void messageLogged(BuildEvent event)
{
/*
if (Thread.currentThread().getThreadGroup() != group)
return;
Element parentElement = (Element)elementStack.peek();
Element messageElement = results.createElement("message");
messageElement.setAttribute("level", String.valueOf(event.getPriority()));
messageElement.appendChild(results.createCDATASection(event.getMessage()));
parentElement.appendChild(messageElement);
*/
}
}