package com.griddynamics.jagger.reporting;
import com.griddynamics.jagger.dbapi.entity.SessionData;
import com.griddynamics.jagger.engine.e1.reporting.OverallSessionComparisonReporter;
import com.griddynamics.jagger.engine.e1.reporting.SessionStatusReporter;
import com.griddynamics.jagger.engine.e1.sessioncomparation.SessionVerdict;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
/**
* User: nmusienko
* Date: 01.02.13
* Time: 19:14
*/
public class XMLReporter {
private static final String COMPARISON_REPORT_FILE_NAME = "result.xml";
private static final String JAGGER_TAG_NAME = "jagger";
private static final String COMPARISON_TAG_NAME = "comparison";
private static final String DECISION_TAG_NAME = "decision";
private static final String BASELINE_TAG_NAME = "baseline";
private static final String CURRENT_TAG_NAME = "current";
private static final String SESSION_SUMMARY_TAG_NAME = "summary";
private static final String TASKS_EXECUTED_TAG_NAME = "executedTasks";
private static final String TASKS_FAILED_TAG_NAME = "failedTasks";
private static final String SESSION_STATUS_TAG_NAME = "sessionStatus";
private static final String SESSION_SUMMARY = "sessionSummary";
private static final String SESSION_STATUS = "sessionStatus";
private ReportingContext context;
private String sessionId;
private static final Logger log = LoggerFactory.getLogger(XMLReporter.class);
/**
* create SessionStatusXMLMaker with context
* @param context - context
* @return SessionStatusXMLMaker with context
*/
public static XMLReporter create(ReportingContext context, String sessionId) {
XMLReporter maker = new XMLReporter();
maker.setContext(context);
maker.sessionId = sessionId;
return maker;
}
/**
* generate XML report
*/
public void generateReport() {
try {
log.info("BEGIN: Export XML report");
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
doc.appendChild(doc.createElement(JAGGER_TAG_NAME));
fillSessionStatus(doc);
fillSessionSummary(doc);
fillComparisonResult(doc);
Source source = new DOMSource(doc);
Result result = new StreamResult(new File(COMPARISON_REPORT_FILE_NAME));
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(source, result);
log.info("END: Export XML report");
} catch (Exception e) {
log.error("Error during XML report generation", e);
}
}
/**
* creates comparison nodes in document
* @param doc - document
* @throws ParserConfigurationException
*/
private void fillComparisonResult(Document doc) throws ParserConfigurationException {
if (context.getParameters().containsKey(OverallSessionComparisonReporter.JAGGER_VERDICT)) {
Element rootElement=doc.getDocumentElement();
Element report= doc.createElement(COMPARISON_TAG_NAME);
rootElement.appendChild(report);
Element decisionElement = doc.createElement(DECISION_TAG_NAME);
SessionVerdict sessionVerdict = (SessionVerdict) context.getParameters().get(OverallSessionComparisonReporter.JAGGER_VERDICT);
decisionElement.setTextContent(sessionVerdict.getDecision().toString());
report.appendChild(decisionElement);
Element baselineElement = doc.createElement(BASELINE_TAG_NAME);
String baseline = (String) context.getParameters().get(OverallSessionComparisonReporter.JAGGER_SESSION_BASELINE);
baselineElement.setTextContent(baseline);
report.appendChild(baselineElement);
Element currentElement = doc.createElement(CURRENT_TAG_NAME);
String current = (String) context.getParameters().get(OverallSessionComparisonReporter.JAGGER_SESSION_CURRENT);
currentElement.setTextContent(current);
report.appendChild(currentElement);
} else{
log.info("Session comparison is not available. Skipping");
}
}
/**
* creates session summary nodes in document
* @param doc - document
* @throws ParserConfigurationException
*/
private void fillSessionSummary(Document doc) throws ParserConfigurationException {
Element rootElement=doc.getDocumentElement();
if(context.getProvider(SESSION_SUMMARY)!=null){
Element summary;
if(rootElement.getElementsByTagName(SESSION_SUMMARY_TAG_NAME).getLength()>0){
summary=(Element) rootElement.getElementsByTagName(SESSION_SUMMARY_TAG_NAME).item(0);
} else {
summary=doc.createElement(SESSION_SUMMARY_TAG_NAME);
rootElement.appendChild(summary);
}
JRBeanCollectionDataSource source=(JRBeanCollectionDataSource)
context.getProvider(SESSION_SUMMARY).getDataSource(sessionId);
if(source.getData().size()==1){
SessionData data= (SessionData) source.getData().iterator().next();
Element executedElement = doc.createElement(TASKS_EXECUTED_TAG_NAME);
executedElement.setTextContent(data.getTaskExecuted().toString());
summary.appendChild(executedElement);
Element failedElement = doc.createElement(TASKS_FAILED_TAG_NAME);
failedElement.setTextContent(data.getTaskFailed().toString());
summary.appendChild(failedElement);
} else {
log.info("Session summary size is {}, but expected 1. Skipping", source.getData().size());
}
}
}
/**
* creates session status node in document
* @param doc - document
* @throws ParserConfigurationException
*/
private void fillSessionStatus(Document doc) throws ParserConfigurationException {
Element rootElement=doc.getDocumentElement();
if(context.getProvider(SESSION_STATUS)!=null){
JRBeanCollectionDataSource source=(JRBeanCollectionDataSource) context.getProvider(SESSION_STATUS).getDataSource(sessionId);
if(source.getData().size()==1){
Element summary=doc.createElement(SESSION_SUMMARY_TAG_NAME);
rootElement.appendChild(summary);
SessionStatusReporter.SessionStatus data = (SessionStatusReporter.SessionStatus) source.getData().iterator().next();
Element statusElement = doc.createElement(SESSION_STATUS_TAG_NAME);
statusElement.setTextContent(data.getDecision().toString());
summary.appendChild(statusElement);
} else {
log.info("Session status size is {}, but expected 1. Skipping",source.getData().size());
}
} else {
log.info("Session status is not available. Skipping");
}
}
public ReportingContext getContext() {
return context;
}
public void setContext(ReportingContext context) {
this.context = context;
}
public String getSessionId() {
return sessionId;
}
}