This is an automated email from the ASF dual-hosted git repository. zregvart pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 8ddfee7 Schematron component supports class `javax.xml.transform.Source` 8ddfee7 is described below commit 8ddfee77ff06ec3efbac10547d764b438f564260 Author: Vilmos Nagy <vilmos.n...@outlook.com> AuthorDate: Wed Nov 14 10:51:09 2018 +0100 Schematron component supports class `javax.xml.transform.Source` --- .../component/schematron/SchematronProducer.java | 27 ++++++++++---- .../schematron/processor/SchematronProcessor.java | 12 +++++-- .../schematron/SchematronProducerTest.java | 41 ++++++++++++++++++++++ 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java index debd27a2..bef9c50 100644 --- a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java +++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/SchematronProducer.java @@ -16,17 +16,19 @@ */ package org.apache.camel.component.schematron; -import java.util.HashMap; -import java.util.Map; - import org.apache.camel.Exchange; import org.apache.camel.component.schematron.constant.Constants; import org.apache.camel.component.schematron.exception.SchematronValidationException; +import org.apache.camel.component.schematron.processor.SchematronProcessor; import org.apache.camel.component.schematron.processor.SchematronProcessorFactory; import org.apache.camel.impl.DefaultProducer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.xml.transform.Source; +import java.util.HashMap; +import java.util.Map; + /** * The Schematron producer. */ @@ -50,9 +52,22 @@ public class SchematronProducer extends DefaultProducer { * @throws Exception */ public void process(Exchange exchange) throws Exception { - String payload = exchange.getIn().getBody(String.class); - logger.debug("Applying schematron validation on payload: {}", payload); - String report = SchematronProcessorFactory.newScehamtronEngine(endpoint.getRules()).validate(payload); + final SchematronProcessor schematronProcessor = SchematronProcessorFactory.newScehamtronEngine(endpoint.getRules()); + final Object payload = exchange.getIn().getBody(); + final String report; + + if (payload instanceof Source) { + logger.debug("Applying schematron validation on payload: {}", payload); + report = schematronProcessor.validate((Source) payload); + } else if (payload instanceof String) { + logger.debug("Applying schematron validation on payload: {}", payload); + report = schematronProcessor.validate((String) payload); + } else { + String stringPayload = exchange.getIn().getBody(String.class); + logger.debug("Applying schematron validation on payload: {}", stringPayload); + report = schematronProcessor.validate(stringPayload); + } + logger.debug("Schematron validation report \n {}", report); String status = getValidationStatus(report); logger.info("Schematron validation status : {}", status); diff --git a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java index 574e26c..af1e7b6 100644 --- a/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java +++ b/components/camel-schematron/src/main/java/org/apache/camel/component/schematron/processor/SchematronProcessor.java @@ -52,7 +52,6 @@ public class SchematronProcessor { * @param templates */ public SchematronProcessor(XMLReader reader, Templates templates) { - this.reader = reader; this.templates = templates; } @@ -64,9 +63,18 @@ public class SchematronProcessor { * @return */ public String validate(final String xml) { + final Source source = new SAXSource(reader, new InputSource(IOUtils.toInputStream(xml))); + return validate(source); + } + /** + * Validates the given XML for given Rules. + * + * @param source + * @return + */ + public String validate(Source source) { try { - final Source source = new SAXSource(reader, new InputSource(IOUtils.toInputStream(xml))); final StringWriter writer = new StringWriter(); templates.newTransformer().transform(source, new StreamResult(writer)); return writer.toString(); diff --git a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java index e78bc00..ebf2594 100644 --- a/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java +++ b/components/camel-schematron/src/test/java/org/apache/camel/component/schematron/SchematronProducerTest.java @@ -15,8 +15,12 @@ * limitations under the License. */ package org.apache.camel.component.schematron; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.Templates; import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXSource; import net.sf.saxon.TransformerFactoryImpl; import org.apache.camel.Exchange; @@ -26,8 +30,12 @@ import org.apache.camel.component.schematron.processor.ClassPathURIResolver; import org.apache.camel.component.schematron.processor.TemplatesFactory; import org.apache.camel.impl.DefaultExchange; import org.apache.camel.test.junit4.CamelTestSupport; +import org.apache.commons.io.IOUtils; import org.junit.BeforeClass; import org.junit.Test; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.XMLReader; /** * Schematron Producer Unit Test. @@ -73,4 +81,37 @@ public class SchematronProducerTest extends CamelTestSupport { } + @Test + public void testProcessValidXMLAsSource() throws Exception { + Exchange exc = new DefaultExchange(context, ExchangePattern.InOut); + exc.getIn().setBody(new SAXSource(getXMLReader(), new InputSource(ClassLoader.getSystemResourceAsStream("xml/article-1.xml")))); + + // process xml payload + producer.process(exc); + + // assert + assertTrue(exc.getOut().getHeader(Constants.VALIDATION_STATUS).equals(Constants.SUCCESS)); + } + + @Test + public void testProcessInValidXMLAsSource() throws Exception { + Exchange exc = new DefaultExchange(context, ExchangePattern.InOut); + exc.getIn().setBody(new SAXSource(getXMLReader(), new InputSource(ClassLoader.getSystemResourceAsStream("xml/article-2.xml")))); + + // process xml payload + producer.process(exc); + + // assert + assertTrue(exc.getOut().getHeader(Constants.VALIDATION_STATUS).equals(Constants.FAILED)); + + } + + private static XMLReader getXMLReader() throws ParserConfigurationException, SAXException { + final SAXParserFactory fac = SAXParserFactory.newInstance(); + fac.setValidating(false); + final SAXParser parser = fac.newSAXParser(); + XMLReader reader = parser.getXMLReader(); + return reader; + } + }