Commit 75c0e581 authored by Matthias Betz's avatar Matthias Betz
Browse files

fixing incompatibility with citygml4j 3 regarding xslt transformers

parent 358dfea5
Pipeline #7497 passed with stage
in 1 minute and 10 seconds
...@@ -47,6 +47,7 @@ import org.apache.logging.log4j.LogManager; ...@@ -47,6 +47,7 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.citygml4j.core.ade.ADEException; import org.citygml4j.core.ade.ADEException;
import org.citygml4j.core.ade.ADERegistry; import org.citygml4j.core.ade.ADERegistry;
import org.citygml4j.core.model.CityGMLVersion;
import org.citygml4j.core.model.ade.ADEProperty; import org.citygml4j.core.model.ade.ADEProperty;
import org.citygml4j.core.model.core.AbstractCityObject; import org.citygml4j.core.model.core.AbstractCityObject;
import org.citygml4j.core.model.core.AbstractCityObjectProperty; import org.citygml4j.core.model.core.AbstractCityObjectProperty;
...@@ -55,7 +56,6 @@ import org.citygml4j.core.model.core.CityModel; ...@@ -55,7 +56,6 @@ import org.citygml4j.core.model.core.CityModel;
import org.citygml4j.core.util.CityGMLConstants; import org.citygml4j.core.util.CityGMLConstants;
import org.citygml4j.xml.CityGMLContext; import org.citygml4j.xml.CityGMLContext;
import org.citygml4j.xml.CityGMLContextException; import org.citygml4j.xml.CityGMLContextException;
import org.citygml4j.xml.module.citygml.CityGMLModule;
import org.citygml4j.xml.module.citygml.CityGMLModules; import org.citygml4j.xml.module.citygml.CityGMLModules;
import org.citygml4j.xml.reader.ChunkOptions; import org.citygml4j.xml.reader.ChunkOptions;
import org.citygml4j.xml.reader.CityGMLInputFactory; import org.citygml4j.xml.reader.CityGMLInputFactory;
...@@ -121,6 +121,7 @@ public class CityGmlParser { ...@@ -121,6 +121,7 @@ public class CityGmlParser {
private static List<QName> chunkProperties = new ArrayList<>(); private static List<QName> chunkProperties = new ArrayList<>();
static { static {
System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
FACTORY = SAXParserFactory.newInstance(); FACTORY = SAXParserFactory.newInstance();
try { try {
FACTORY.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); FACTORY.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
...@@ -311,8 +312,8 @@ public class CityGmlParser { ...@@ -311,8 +312,8 @@ public class CityGmlParser {
return null; return null;
} }
CityGMLContext gmlContext = CityGmlParser.getContext(); CityGMLContext gmlContext = CityGmlParser.getContext();
CityGMLModule module = CityGMLModules.getCityGMLModule(reader.getName().getNamespaceURI()); CityGMLVersion version = CityGMLModules.getCityGMLVersion(reader.getName().getNamespaceURI());
CityGMLOutputFactory factory = gmlContext.createCityGMLOutputFactory(module.getCityGMLVersion()); CityGMLOutputFactory factory = gmlContext.createCityGMLOutputFactory(version);
CityGMLChunkWriter writer = factory.createCityGMLChunkWriter(new File(outputFile), CityGMLChunkWriter writer = factory.createCityGMLChunkWriter(new File(outputFile),
StandardCharsets.UTF_8.name()); StandardCharsets.UTF_8.name());
writer.withPrefix("qual", QualityADEModule.NAMESPACE_URI); writer.withPrefix("qual", QualityADEModule.NAMESPACE_URI);
...@@ -336,8 +337,8 @@ public class CityGmlParser { ...@@ -336,8 +337,8 @@ public class CityGmlParser {
if (chunk instanceof CityModel cModel) { if (chunk instanceof CityModel cModel) {
cModel.setCityObjectMembers(null); cModel.setCityObjectMembers(null);
mapper.setCityModel(cModel); mapper.setCityModel(cModel);
CityGMLModule module = CityGMLModules.getCityGMLModule(reader.getName().getNamespaceURI()); CityGMLVersion version = CityGMLModules.getCityGMLVersion(reader.getName().getNamespaceURI());
mapper.setCityGMLVersion(module.getCityGMLVersion()); mapper.setCityGMLVersion(version);
} else if (chunk instanceof AbstractCityObject aco) { } else if (chunk instanceof AbstractCityObject aco) {
acos.add(aco); acos.add(aco);
aco.accept(mapper); aco.accept(mapper);
......
...@@ -21,10 +21,6 @@ ...@@ -21,10 +21,6 @@
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>CityDoctorCheckResult</artifactId> <artifactId>CityDoctorCheckResult</artifactId>
</dependency> </dependency>
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
...@@ -38,6 +34,10 @@ ...@@ -38,6 +34,10 @@
<groupId>xml-apis</groupId> <groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId> <artifactId>xml-apis</artifactId>
</exclusion> </exclusion>
<exclusion>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
<dependency> <dependency>
...@@ -60,6 +60,17 @@ ...@@ -60,6 +60,17 @@
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
<artifactId>citygml4j-quality-ade</artifactId> <artifactId>citygml4j-quality-ade</artifactId>
</dependency> </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> </dependencies>
<build> <build>
......
...@@ -38,17 +38,19 @@ import java.util.Set; ...@@ -38,17 +38,19 @@ import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.xml.XMLConstants; import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Result;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source; import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.URIResolver; import javax.xml.transform.URIResolver;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.dom.DOMSource; import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXResult;
import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamSource;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; 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.AttributeInvalidError;
import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError; import de.hft.stuttgart.citydoctor2.check.error.AttributeMissingError;
...@@ -85,15 +87,6 @@ import de.hft.stuttgart.quality.model.properties.RequirementProperty; ...@@ -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.Checking;
import de.hft.stuttgart.quality.model.types.Parameter; import de.hft.stuttgart.quality.model.types.Parameter;
import de.hft.stuttgart.quality.model.types.ValidationPlan; 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, * The main container class for checking. It contains the logic for validation,
...@@ -446,54 +439,47 @@ public class Checker { ...@@ -446,54 +439,47 @@ public class Checker {
if (logger.isInfoEnabled()) { if (logger.isInfoEnabled()) {
logger.info(Localization.getText("Checker.schematronValidation")); 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 { try {
XsltExecutable includeExecutable = xsltCompiler TransformerFactory transformerFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", Checker.class.getClassLoader());
.compile(new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl"))); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
XsltTransformer includeTransformer = includeExecutable.load(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
includeTransformer.setSource(new StreamSource(new File(config.getSchematronFilePath())));
transformerFactory.setURIResolver(new URIResolver() {
XsltExecutable expandExecutable = xsltCompiler
.compile(new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl"))); @Override
XsltTransformer expandTransformer = expandExecutable.load(); public Source resolve(String href, String base) throws TransformerException {
includeTransformer.setDestination(expandTransformer); return new StreamSource(Checker.class.getResourceAsStream(href));
}
XsltExecutable xslt2Executable = xsltCompiler });
.compile(new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl")));
Source dsdlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_dsdl_include.xsl"));
XsltTransformer xslt2Transformer = xslt2Executable.load(); Transformer dsdlXslTransformer = transformerFactory.newTransformer(dsdlXslSource);
expandTransformer.setDestination(xslt2Transformer);
DOMResult dsdlXslResult = new DOMResult();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); dsdlXslTransformer.transform(new StreamSource(new File(config.getSchematronFilePath())), dsdlXslResult);
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); Source abstractExpandXsl = new StreamSource(Checker.class.getResourceAsStream("iso_abstract_expand.xsl"));
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer abstractExpandTransformer = transformerFactory.newTransformer(abstractExpandXsl);
Document doc = factory.newDocumentBuilder().newDocument();
DOMDestination domDestination = new DOMDestination(doc); DOMResult abstractExpandResult = new DOMResult();
xslt2Transformer.setDestination(domDestination); abstractExpandTransformer.transform(new DOMSource(dsdlXslResult.getNode()), abstractExpandResult);
includeTransformer.transform();
Source svrlXslSource = new StreamSource(Checker.class.getResourceAsStream("iso_svrl_for_xslt2.xsl"));
XsltExecutable schematronExecutable = xsltCompiler.compile(new DOMSource(doc)); Transformer svrlTransformer = transformerFactory.newTransformer(svrlXslSource);
XsltTransformer schematronTransformer = schematronExecutable.load();
schematronTransformer.setSource(new StreamSource(in)); 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(); SvrlContentHandler handler = new SvrlContentHandler();
Destination dest = new SAXDestination(handler); Result finalResult = new SAXResult(handler);
schematronTransformer.setDestination(dest);
schematronTransformer.transform(); schematronTransformer.transform(cityGmlSource, finalResult);
if (logger.isInfoEnabled()) {
logger.info(Localization.getText("Checker.finishedSchematron"));
}
return handler; return handler;
} catch (SaxonApiException | ParserConfigurationException e) { } catch (TransformerException e) {
logger.catching(e); logger.catching(e);
} }
} }
......
...@@ -98,8 +98,8 @@ ...@@ -98,8 +98,8 @@
<dependency> <dependency>
<groupId>net.sf.saxon</groupId> <groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId> <artifactId>Saxon-HE</artifactId>
<version>11.3</version> <version>12.2</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
...@@ -109,12 +109,12 @@ ...@@ -109,12 +109,12 @@
<dependency> <dependency>
<groupId>org.citygml4j</groupId> <groupId>org.citygml4j</groupId>
<artifactId>citygml4j-core</artifactId> <artifactId>citygml4j-core</artifactId>
<version>3.0.0-rc.4</version> <version>3.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.citygml4j</groupId> <groupId>org.citygml4j</groupId>
<artifactId>citygml4j-xml</artifactId> <artifactId>citygml4j-xml</artifactId>
<version>3.0.0-rc.4</version> <version>3.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>de.hft.stuttgart</groupId> <groupId>de.hft.stuttgart</groupId>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment