package husacct.analyse.task;
import husacct.ServiceProvider;
import husacct.analyse.IAnalyseService;
import husacct.common.OSDetector;
import husacct.common.dto.AnalysisStatisticsDTO;
import husacct.common.dto.ApplicationDTO;
import husacct.common.dto.ProjectDTO;
import husacct.control.task.configuration.ConfigurationManager;
import java.io.File;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class HistoryLogger {
private IAnalyseService service;
private ArrayList<ProjectDTO> projects;
private Document doc;
private Element rootElement;
private String xmlFile = OSDetector.getAppFolder() + ConfigurationManager.getProperty("ApplicationHistoryXMLFilename");
private final Logger logger = Logger.getLogger(HistoryLogger.class);
public void logHistory(ApplicationDTO applicationDTO, String workspaceName) {
try{
this.service = ServiceProvider.getInstance().getAnalyseService();
File file = new File(xmlFile);
if(file.exists()) {
addToExistingXml(applicationDTO, workspaceName);
} else {
if(saveHistory(applicationDTO, workspaceName)) {
createXML(doc, rootElement);
}
}
} catch (Exception e) {
logger.warn("Analysis session not added to applicationanalysishistory.xml; exception: " + e);
}
}
private boolean saveHistory(ApplicationDTO adto, String workspaceName) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
//Husacct root
doc = docBuilder.newDocument();
rootElement = doc.createElement("hussact");
doc.appendChild(rootElement);
rootElement.setAttribute("version", adto.version);
//Workspace
Element workspace = getWorkspace(workspaceName);
rootElement.appendChild(workspace);
//Application
Element application = getApplicationElement(adto);
workspace.appendChild(application);
for(Element project : getProjectElement(adto)) {
application.appendChild(project);
}
} catch (ParserConfigurationException pce) {
pce.printStackTrace();
}
return true;
}
private boolean addToExistingXml(ApplicationDTO adto, String workspaceName) {
try {
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder;
docBuilder = docFactory.newDocumentBuilder();
doc = docBuilder.parse(xmlFile);
Node root = doc.getFirstChild();
NodeList workspaces = root.getChildNodes();
ArrayList<String> workspaceList = new ArrayList<String>();
for(int i = 0; i < workspaces.getLength(); i++) {
workspaceList.add(workspaces.item(i).getAttributes().getNamedItem("name").getNodeValue());
}
if(workspaceList.contains(workspaceName)) {
if(workspaces.item(workspaceList.indexOf(workspaceName)).getAttributes().getNamedItem("name").getNodeValue().equals(workspaceName)) {
Node application = workspaces.item(workspaceList.indexOf(workspaceName)).getFirstChild();
if(application.getAttributes().getNamedItem("name").getNodeValue().equals(adto.name)) {
NodeList projects = application.getChildNodes();
for(int i = 0; i < projects.getLength(); i++) {
Node p = projects.item(i);
if(p.getAttributes().getNamedItem("name").getNodeValue().equals(adto.projects.get(i).name)) {
p.appendChild(getAnalyseElement((Element) p, adto.projects.get(i)));
} else {
for(Element project : getProjectElement(adto)) {
p.appendChild(project);
}
}
}
} else {
Node workspace = workspaces.item(workspaceList.indexOf(workspaceName));
Node tempApplication = getApplicationElement(adto);
for(Element project : getProjectElement(adto)) {
tempApplication.appendChild(project);
}
workspace.appendChild(tempApplication);
}
}
} else {
Node workspace = getWorkspace(workspaceName);
Node tempApplication = getApplicationElement(adto);
for(Element project : getProjectElement(adto)) {
tempApplication.appendChild(project);
}
workspace.appendChild(tempApplication);
root.appendChild(workspace);
}
createXML(doc, (Element)root);
//} catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (SAXException saxe) { saxe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace();
} catch (Exception e) {
logger.warn("Analysis session not added to applicationanalysishistory.xml; exception: " + e);
}
return true;
}
private void createXML(Document doc, Element rootElement) {
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(xmlFile));
// Output to console for testing
//StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
} catch (TransformerException tfe) {
tfe.printStackTrace();
}
}
private Element getWorkspace(String workspaceName) {
Element workspace = doc.createElement("workspace");
workspace.setAttribute("name", workspaceName);
return workspace;
}
private Element getApplicationElement(ApplicationDTO adto) {
Element application = doc.createElement("application");
application.setAttribute("name", adto.name);
return application;
}
private ArrayList<Element> getProjectElement(ApplicationDTO adto) {
projects = adto.projects;
ArrayList <Element> projectList = new ArrayList<Element>();
for(ProjectDTO pdto : projects) {
Element project = null;
project = doc.createElement("project");
project.setAttribute("name", pdto.name);
project.appendChild(getAnalyseElement(project, pdto));
projectList.add(project);
}
return projectList;
}
private Element getAnalyseElement(Element project, ProjectDTO pdto) {
Element analyse = doc.createElement("analyse");
GregorianCalendar cal = new GregorianCalendar();
long millis = cal.getTimeInMillis();
analyse.setAttribute("timestamp", millis + "");
String projectPath = "";
projectPath = pdto.paths.get(0);
Element path = doc.createElement("path");
path.appendChild(doc.createTextNode(projectPath));
analyse.appendChild(path);
AnalysisStatisticsDTO statistics = service.getAnalysisStatistics(null);
//packages
Element packages = doc.createElement("packages");
packages.appendChild(doc.createTextNode(statistics.totalNrOfPackages + ""));
analyse.appendChild(packages);
//classes
Element classes = doc.createElement("classes");
classes.appendChild(doc.createTextNode(statistics.totalNrOfClasses + ""));
analyse.appendChild(classes);
//dependencies
Element dependencies = doc.createElement("dependencies");
dependencies.appendChild(doc.createTextNode(statistics.totalNrOfDependencies + ""));
analyse.appendChild(dependencies);
//violations
Element violations = doc.createElement("violations");
violations.appendChild(doc.createTextNode("0"));
analyse.appendChild(violations);
return analyse;
}
}