/******************************************************************************* * Copyright 2006 - 2014 Vienna University of Technology, * Department of Software Technology and Interactive Systems, IFS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package eu.scape_project.planning.xml; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import org.custommonkey.xmlunit.DetailedDiff; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.Difference; import org.custommonkey.xmlunit.ElementNameAndAttributeQualifier; import org.custommonkey.xmlunit.XMLUnit; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.SAXException; import eu.scape_project.planning.exception.PlanningException; import eu.scape_project.planning.model.Plan; import eu.scape_project.planning.model.PlatoException; /** * Roundtrip tests for parsing a plan from a file and exporting it again. */ public class PlanParserProjectExporterTest { private final Logger log = LoggerFactory.getLogger(PlanParserProjectExporterTest.class); @Test public void importProjectsExportToXmlMinimal() throws PlatoException, ParserConfigurationException, SAXException, DocumentException, PlanningException, IOException { PlanParser parser = new PlanParser(); ProjectExporter exporter = new ProjectExporter(); InputStream in = Thread.currentThread().getContextClassLoader() .getResourceAsStream("plans/PlanParserTest/PlanParserTest-PLAN_VALIDATED-minimal.xml"); List<Plan> plans = parser.importProjects(in); Assert.assertTrue(plans.size() == 1); Plan plan = plans.get(0); // Parse original InputStream importedStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("plans/PlanParserTest/PlanParserTest-PLAN_VALIDATED-minimal.xml"); Document original = parsePlan(importedStream); original.normalize(); Document exported = exporter.exportToXml(plan); exported.normalize(); // Compare XMLUnit.setIgnoreWhitespace(true); try { Diff diff = new Diff(original.asXML(), exported.asXML()); Assert.assertTrue(diff.similar()); } finally { XMLUnit.setIgnoreWhitespace(false); } } @Test public void importProjectsExportToXmlProfileResultsPAP() throws PlatoException, ParserConfigurationException, SAXException, DocumentException, PlanningException, IOException { PlanParser parser = new PlanParser(); ProjectExporter exporter = new ProjectExporter(); InputStream in = Thread.currentThread().getContextClassLoader() .getResourceAsStream("plans/PlanParserTest/PlanParserTest-PLAN_VALIDATED-ProfileSamplesPAP.xml"); List<Plan> plans = parser.importProjects(in); Assert.assertTrue(plans.size() == 1); Plan plan = plans.get(0); // Parse original InputStream importedStream = Thread.currentThread().getContextClassLoader() .getResourceAsStream("plans/PlanParserTest/PlanParserTest-PLAN_VALIDATED-ProfileSamplesPAP.xml"); Document original = parsePlan(importedStream); original.normalize(); Document exported = exporter.createProjectDoc(); exporter.addProject(plan, exported, true); exported.normalize(); // Compare XMLUnit.setIgnoreWhitespace(true); XMLUnit.setNormalizeWhitespace(true); try { Diff diff = new Diff(original.asXML(), exported.asXML()); diff.overrideElementQualifier(new ElementNameAndAttributeQualifier()); DetailedDiff detailedDiff = new DetailedDiff(diff); @SuppressWarnings("unchecked") List<Difference> differences = (List<Difference>) detailedDiff.getAllDifferences(); for (Difference difference : differences) { log.warn(difference.toString()); } Assert.assertTrue(diff.similar()); } finally { XMLUnit.setIgnoreWhitespace(false); XMLUnit.setNormalizeWhitespace(false); } } /** * Parses the plan XML. * * @param in * the plan XML * @return the plan as XML document * @throws ParserConfigurationException * @throws SAXException * @throws DocumentException */ private Document parsePlan(InputStream in) throws ParserConfigurationException, SAXException, DocumentException { ValidatingParserFactory vpf = new ValidatingParserFactory(); SAXParser parser = vpf.getValidatingParser(); parser.setProperty(ValidatingParserFactory.JAXP_SCHEMA_SOURCE, PlanXMLConstants.PLAN_SCHEMAS); SAXReader reader = new SAXReader(parser.getXMLReader()); reader.setValidation(true); reader.setStripWhitespaceText(true); reader.setIgnoreComments(true); SchemaResolver schemaResolver = new SchemaResolver(); schemaResolver.addSchemaLocation(PlanXMLConstants.PLATO_SCHEMA_URI, PlanXMLConstants.PLATO_SCHEMA_LOCATION); schemaResolver.addSchemaLocation(PlanXMLConstants.PAP_SCHEMA_URI, PlanXMLConstants.PAP_SCHEMA_LOCATION); schemaResolver.addSchemaLocation(PlanXMLConstants.TAVERNA_SCHEMA_URI, PlanXMLConstants.TAVERNA_SCHEMA_LOCATION); reader.setEntityResolver(schemaResolver); return reader.read(in); } }