/*- * Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart * * This file is part of CityDoctor2. * * CityDoctor2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * CityDoctor2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with CityDoctor2. If not, see . */ package de.hft.stuttgart.citydoctor2.checkresult; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.xml.sax.InputSource; import de.hft.stuttgart.citydoctor2.checkresult.utility.CheckReportParseException; import de.hft.stuttgart.citydoctor2.checkresult.utility.CheckReportWriteException; import de.hft.stuttgart.citydoctor2.checkresult.utility.IndentationXmlStreamWriter; @XmlRootElement(name = "error_report") @XmlAccessorType(XmlAccessType.FIELD) public class CheckReport { private static JAXBContext context; private static final Object lock = new Object(); @XmlElement(name = "header", required = true) private Header header; @XmlElement(name = "global_statistics", required = true) private GlobalStatistics globalStatistics; @XmlElement(name = "validation_plan", required = true) private ValidationPlan validationPlan; @XmlElement(name = "validation_results", required = true) private ValidationResults validationResults; private Map featureReports; public static CheckReport load(String file) throws CheckReportParseException { try (BufferedReader reader = new BufferedReader(new FileReader(file))) { CheckReport report = (CheckReport) getContext().createUnmarshaller().unmarshal(new InputSource(reader)); enrichReportStructure(report); return report; } catch (JAXBException | IOException e) { throw new CheckReportParseException(e); } } private static JAXBContext getContext() throws JAXBException { synchronized (lock) { if (context == null) { context = JAXBContext.newInstance(CheckReport.class); } } return context; } public void saveAs(OutputStream output) throws CheckReportWriteException { try { Marshaller marshaller = getContext().createMarshaller(); XMLOutputFactory factory = XMLOutputFactory.newInstance(); XMLStreamWriter writer = factory.createXMLStreamWriter(output, "UTF-8"); writer = new IndentationXmlStreamWriter(writer); marshaller.marshal(this, writer); } catch (JAXBException | XMLStreamException e) { throw new CheckReportWriteException(e); } } private static void enrichReportStructure(CheckReport report) { report.featureReports = new HashMap<>(); ValidationResults valResults = report.getValidationResults(); if (valResults != null) { addFeatureReports(report, valResults.getBridgeReports()); addFeatureReports(report, valResults.getBuildingReports()); addFeatureReports(report, valResults.getLandReports()); addFeatureReports(report, valResults.getTransportationReports()); addFeatureReports(report, valResults.getVegetationReports()); addFeatureReports(report, valResults.getWaterReports()); } } private static void addFeatureReports(CheckReport report, List reportList) { if (reportList == null) { return; } for (FeatureReport fr : reportList) { if (fr.getGmlId() != null) { report.featureReports.put(fr.getGmlId(), fr); } } } public FeatureReport getFeatureReportForId(String gmlId) { return featureReports.get(gmlId); } public Header getHeader() { return header; } public void setHeader(Header header) { this.header = header; } public GlobalStatistics getGlobalStatistics() { return globalStatistics; } public void setGlobalStatistics(GlobalStatistics globalStatistics) { this.globalStatistics = globalStatistics; } public ValidationPlan getValidationPlan() { return validationPlan; } public void setValidationPlan(ValidationPlan validationPlan) { this.validationPlan = validationPlan; } public ValidationResults getValidationResults() { return validationResults; } public void setValidationResults(ValidationResults validationResults) { this.validationResults = validationResults; } }