package com.intuit.tank.util;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.stream.EventFilter;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.XMLEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.intuit.tank.conversation.Transaction;
import com.intuit.tank.vm.exception.ParseExceptionConverter;
import com.intuit.tank.vm.exception.WatsParseException;
/**
* parses xml output from hp perf tool JaxbParseXML
*
* @author dangleton
*
*/
public class WebConversationJaxbParseXML {
public WebConversationJaxbParseXML() {
}
/**
* @{inheritDoc
*/
public List<Transaction> parse(String xml) throws WatsParseException {
return parse(new StringReader(xml));
}
/**
* @{inheritDoc
*/
public List<Transaction> parse(Reader reader) throws WatsParseException {
try {
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLEventReader xmler = xmlif.createXMLEventReader(reader);
return parse(xmlif, xmler);
} catch (Exception e) {
throw ParseExceptionConverter.handleException(e);
}
}
private List<Transaction> parse(XMLInputFactory xmlif, XMLEventReader xmler) throws WatsParseException {
EventFilter filter = new EventFilter() {
public boolean accept(XMLEvent event) {
return event.isStartElement();
}
};
List<Transaction> result = null;
try {
XMLEventReader xmlfer = xmlif.createFilteredReader(xmler, filter);
// Jump to the first element in the document, the enclosing log
xmlfer.nextEvent();
// Parse into typed objects
JAXBContext ctx = JAXBContext.newInstance(Transaction.class.getPackage().getName());
Unmarshaller um = ctx.createUnmarshaller();
result = new ArrayList<Transaction>();
while (xmlfer.peek() != null) {
Object o = um.unmarshal(xmler);
if (o instanceof Transaction) {
result.add((Transaction) o);
}
}
} catch (JAXBException e) {
throw ParseExceptionConverter.handleException(e.getLinkedException());
} catch (Exception e) {
throw ParseExceptionConverter.handleException(e);
}
return result;
}
}