diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java index 9186ea416621e98d79b0701e80d048f98aceda33..c3b9d486f964f01269234c056927e7b3b982a501 100644 --- a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/parser/CityGmlParser.java @@ -47,6 +47,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.citygml4j.core.ade.ADEException; import org.citygml4j.core.ade.ADERegistry; +import org.citygml4j.core.model.CityGMLVersion; import org.citygml4j.core.model.ade.ADEProperty; import org.citygml4j.core.model.core.AbstractCityObject; import org.citygml4j.core.model.core.AbstractCityObjectProperty; @@ -55,7 +56,6 @@ import org.citygml4j.core.model.core.CityModel; import org.citygml4j.core.util.CityGMLConstants; import org.citygml4j.xml.CityGMLContext; import org.citygml4j.xml.CityGMLContextException; -import org.citygml4j.xml.module.citygml.CityGMLModule; import org.citygml4j.xml.module.citygml.CityGMLModules; import org.citygml4j.xml.reader.ChunkOptions; import org.citygml4j.xml.reader.CityGMLInputFactory; @@ -121,6 +121,7 @@ public class CityGmlParser { private static List<QName> chunkProperties = new ArrayList<>(); static { + System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"); FACTORY = SAXParserFactory.newInstance(); try { FACTORY.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); @@ -311,8 +312,8 @@ public class CityGmlParser { return null; } CityGMLContext gmlContext = CityGmlParser.getContext(); - CityGMLModule module = CityGMLModules.getCityGMLModule(reader.getName().getNamespaceURI()); - CityGMLOutputFactory factory = gmlContext.createCityGMLOutputFactory(module.getCityGMLVersion()); + CityGMLVersion version = CityGMLModules.getCityGMLVersion(reader.getName().getNamespaceURI()); + CityGMLOutputFactory factory = gmlContext.createCityGMLOutputFactory(version); CityGMLChunkWriter writer = factory.createCityGMLChunkWriter(new File(outputFile), StandardCharsets.UTF_8.name()); writer.withPrefix("qual", QualityADEModule.NAMESPACE_URI); @@ -336,8 +337,8 @@ public class CityGmlParser { if (chunk instanceof CityModel cModel) { cModel.setCityObjectMembers(null); mapper.setCityModel(cModel); - CityGMLModule module = CityGMLModules.getCityGMLModule(reader.getName().getNamespaceURI()); - mapper.setCityGMLVersion(module.getCityGMLVersion()); + CityGMLVersion version = CityGMLModules.getCityGMLVersion(reader.getName().getNamespaceURI()); + mapper.setCityGMLVersion(version); } else if (chunk instanceof AbstractCityObject aco) { acos.add(aco); aco.accept(mapper); diff --git a/CityDoctorParent/CityDoctorValidation/pom.xml b/CityDoctorParent/CityDoctorValidation/pom.xml index 1c9f95279aaa37d23996dbeaae93497cc33b1a8a..0782f6d7ade3092fbf89b4a96a61c7c5ac8399ff 100644 --- a/CityDoctorParent/CityDoctorValidation/pom.xml +++ b/CityDoctorParent/CityDoctorValidation/pom.xml @@ -21,10 +21,6 @@ <groupId>de.hft.stuttgart</groupId> <artifactId>CityDoctorCheckResult</artifactId> </dependency> - <dependency> - <groupId>net.sf.saxon</groupId> - <artifactId>Saxon-HE</artifactId> - </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> @@ -38,6 +34,10 @@ <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> </exclusion> + <exclusion> + <groupId>xalan</groupId> + <artifactId>xalan</artifactId> + </exclusion> </exclusions> </dependency> <dependency> @@ -60,6 +60,17 @@ <groupId>de.hft.stuttgart</groupId> <artifactId>citygml4j-quality-ade</artifactId> </dependency> + <dependency> + <groupId>name.dmaus.schxslt</groupId> + <artifactId>schxslt</artifactId> + <version>1.9.5</version> + </dependency> + <dependency> + <groupId>net.sf.saxon</groupId> + <artifactId>Saxon-HE</artifactId> + </dependency> + <!-- + --> </dependencies> <build> diff --git a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java index 81625c4a99cef6dc26ddbd9302efbd598f26b829..99c30d82e0acc13d3e1eeb75e6bd832a99dcd382 100644 --- a/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java +++ b/CityDoctorParent/CityDoctorValidation/src/main/java/de/hft/stuttgart/citydoctor2/check/Checker.java @@ -38,17 +38,19 @@ import java.util.Set; import java.util.stream.Stream; import javax.xml.XMLConstants; -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.TransformerException; +import javax.xml.transform.TransformerFactory; import javax.xml.transform.URIResolver; +import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamSource; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.w3c.dom.Document; import de.hft.stuttgart.citydoctor2.check.error.AttributeInvalidError; import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError; @@ -85,15 +87,6 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty; import de.hft.stuttgart.quality.model.types.Checking; import de.hft.stuttgart.quality.model.types.Parameter; import de.hft.stuttgart.quality.model.types.ValidationPlan; -import net.sf.saxon.lib.ResourceResolverWrappingURIResolver; -import net.sf.saxon.s9api.DOMDestination; -import net.sf.saxon.s9api.Destination; -import net.sf.saxon.s9api.Processor; -import net.sf.saxon.s9api.SAXDestination; -import net.sf.saxon.s9api.SaxonApiException; -import net.sf.saxon.s9api.XsltCompiler; -import net.sf.saxon.s9api.XsltExecutable; -import net.sf.saxon.s9api.XsltTransformer; /** * The main container class for checking. It contains the logic for validation, @@ -446,54 +439,47 @@ public class Checker { if (logger.isInfoEnabled()) { logger.info(Localization.getText("Checker.schematronValidation")); } - Processor processor = new Processor(false); - XsltCompiler xsltCompiler = processor.newXsltCompiler(); - xsltCompiler.setResourceResolver(new ResourceResolverWrappingURIResolver(new URIResolver() { - @Override - public Source resolve(String href, String base) throws TransformerException { - return new StreamSource(Checker.class.getResourceAsStream(href)); - } - - })); try { - XsltExecutable includeExecutable = xsltCompiler - .compile(new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl"))); - XsltTransformer includeTransformer = includeExecutable.load(); - includeTransformer.setSource(new StreamSource(new File(config.getSchematronFilePath()))); - - XsltExecutable expandExecutable = xsltCompiler - .compile(new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl"))); - XsltTransformer expandTransformer = expandExecutable.load(); - includeTransformer.setDestination(expandTransformer); - - XsltExecutable xslt2Executable = xsltCompiler - .compile(new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl"))); - - XsltTransformer xslt2Transformer = xslt2Executable.load(); - expandTransformer.setDestination(xslt2Transformer); - - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); - factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); - factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - Document doc = factory.newDocumentBuilder().newDocument(); - DOMDestination domDestination = new DOMDestination(doc); - xslt2Transformer.setDestination(domDestination); - includeTransformer.transform(); - - XsltExecutable schematronExecutable = xsltCompiler.compile(new DOMSource(doc)); - XsltTransformer schematronTransformer = schematronExecutable.load(); - schematronTransformer.setSource(new StreamSource(in)); + TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", Checker.class.getClassLoader()); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + + transformerFactory.setURIResolver(new URIResolver() { + + @Override + public Source resolve(String href, String base) throws TransformerException { + return new StreamSource(Checker.class.getResourceAsStream(href)); + } + }); + + Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl")); + Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource); + + DOMResult dsdlXslResult = new DOMResult(); + dsdlXslTransformer.transform(new StreamSource(new File(config.getSchematronFilePath())), dsdlXslResult); + + Source abstractExpandXsl = new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl")); + Transformer abstractExpandTransformer = transformerFactory.newTransformer(abstractExpandXsl); + + DOMResult abstractExpandResult = new DOMResult(); + abstractExpandTransformer.transform(new DOMSource(dsdlXslResult.getNode()), abstractExpandResult); + + Source svrlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl")); + Transformer svrlTransformer = transformerFactory.newTransformer(svrlXslSource); + + DOMResult schematronXsltResult = new DOMResult(); + svrlTransformer.transform(new DOMSource(abstractExpandResult.getNode()), schematronXsltResult); + + Transformer schematronTransformer = transformerFactory.newTransformer(new DOMSource(schematronXsltResult.getNode())); + Source cityGmlSource = new StreamSource(in); + SvrlContentHandler handler = new SvrlContentHandler(); - Destination dest = new SAXDestination(handler); - schematronTransformer.setDestination(dest); - schematronTransformer.transform(); - if (logger.isInfoEnabled()) { - logger.info(Localization.getText("Checker.finishedSchematron")); - } + Result finalResult = new SAXResult(handler); + + schematronTransformer.transform(cityGmlSource, finalResult); return handler; - } catch (SaxonApiException | ParserConfigurationException e) { + } catch (TransformerException e) { logger.catching(e); } } diff --git a/CityDoctorParent/pom.xml b/CityDoctorParent/pom.xml index 2c03ffd23a2b862cc71dc4dc8972fb84cd6637b1..33107d363599909807410e256b32f843ffcd7baf 100644 --- a/CityDoctorParent/pom.xml +++ b/CityDoctorParent/pom.xml @@ -98,8 +98,8 @@ <dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> - <version>11.3</version> - </dependency> + <version>12.2</version> + </dependency> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> @@ -109,12 +109,12 @@ <dependency> <groupId>org.citygml4j</groupId> <artifactId>citygml4j-core</artifactId> - <version>3.0.0-rc.4</version> + <version>3.0.0</version> </dependency> <dependency> <groupId>org.citygml4j</groupId> <artifactId>citygml4j-xml</artifactId> - <version>3.0.0-rc.4</version> + <version>3.0.0</version> </dependency> <dependency> <groupId>de.hft.stuttgart</groupId>