package de.uniba.dsg.bpmnspector.common.util; import api.ValidationResult; import api.Violation; import api.Warning; import org.jdom2.*; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Path; /** * This class is used for writing xml files via jaxb * * @author Philipp Neugebauer * @author Matthias Geiger * @version 1.0 * */ public class XmlWriterApi { private static final Logger LOGGER = LoggerFactory.getLogger(XmlWriterApi.class .getSimpleName()); private final JDOMFactory factory = new DefaultJDOMFactory(); private final Namespace nsp = Namespace.getNamespace(ConstantHelper.PINAMESPACE); public static Path createXmlReport(ValidationResult result) { try { String fileName = result.getFoundFiles().get(0).getFileName().toString(); Path reportPath = FileUtils.createResourcesForReports(); Path reportFile = FileUtils.createFileForReport(reportPath, fileName, "xml"); XmlWriterApi xmlWriter = new XmlWriterApi(); xmlWriter.writeResult(result, reportFile); return reportFile; } catch ( IOException ioe) { LOGGER.error("Creation of XML Report files failed.", ioe); return null; } } /** * writes the result to the given file * * @param result * the validation result, which should be written to a file * @param file * the file, where the validation result should be written to * @throws java.io.IOException * if an error occurs during xml writing process */ private void writeResult(ValidationResult result, Path file) throws IOException { Document doc = createDocFromValidationResult(result); XMLOutputter outputter = new XMLOutputter(); outputter.setFormat(Format.getPrettyFormat()); outputter.output(doc, new FileOutputStream(file.toFile())); LOGGER.info("Report for Resource {} successfully written to {}", result.getResources().get(0).getResourceName(), file.toString()); } private Document createDocFromValidationResult(ValidationResult result) { Element root = factory.element("validationResult", nsp); root.addContent(createTextElement("valid", String.valueOf(result.isValid()))); Element checkedResources = factory.element("checkedResources", nsp); result.getFoundFiles().forEach(x -> checkedResources.addContent(createTextElement("resource", x.toString()))); root.addContent(checkedResources); if(!result.isValid()) { Element resourcesWithViolations = factory.element("resourcesWithViolations", nsp); result.getResourcesWithViolations().forEach(x -> resourcesWithViolations.addContent(createTextElement("resource", x.toString()))); root.addContent(resourcesWithViolations); Element violations = factory.element("violations", nsp); result.getViolations().forEach(x -> violations.addContent(createViolationElement(x))); root.addContent(violations); } if(result.getWarnings()!=null && !result.getWarnings().isEmpty()) { Element warnings = factory.element("warnings", nsp); result.getWarnings().forEach(x -> warnings.addContent(createWarningElement(x))); root.addContent(warnings); } return factory.document(root); } private Element createViolationElement(Violation violation) { Element vElem = factory.element("violation", nsp); vElem.setAttribute("constraint", violation.getConstraint()); vElem.setAttribute("fileName", violation.getLocation().getResource().getResourceName()); if(violation.getLocation().getLocation().getRow()!=-1) { vElem.setAttribute("line", String.valueOf(violation.getLocation().getLocation().getRow())); } if(violation.getLocation().getLocation().getColumn()!=-1) { vElem.setAttribute("column", String.valueOf(violation.getLocation().getLocation().getColumn())); } if(violation.getLocation().getXpath().isPresent()) { vElem.addContent(createTextElement("xPath", violation.getLocation().getXpath().get())); } vElem.addContent(createTextElement("message", violation.getMessage())); return vElem; } private Element createWarningElement(Warning warning) { Element wElem = factory.element("warning", nsp); wElem.setAttribute("fileName", warning.getLocation().getResource().getResourceName()); if(warning.getLocation().getLocation().getRow()!=-1) { wElem.setAttribute("line", String.valueOf(warning.getLocation().getLocation().getRow())); } if(warning.getLocation().getLocation().getColumn()!=-1) { wElem.setAttribute("column", String.valueOf(warning.getLocation().getLocation().getColumn())); } if(warning.getLocation().getXpath().isPresent()) { wElem.addContent(createTextElement("xPath", warning.getLocation().getXpath().get())); } wElem.addContent(createTextElement("message", warning.getMessage())); return wElem; } private Element createTextElement(String name, String text) { Element element = factory.element(name, nsp); element.setText(text); return element; } }