You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2018/11/14 12:15:29 UTC

[camel] branch master updated: Schematron component supports class `javax.xml.transform.Source`

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 <vi...@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;
+    }
+
 }