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;
+ }
+
}