From 235463af7b24914271fc6e2d0263f23d3ea15843 Mon Sep 17 00:00:00 2001 From: Bartlomiej Tartanus Date: Mon, 14 May 2018 16:24:52 +0200 Subject: [PATCH] allow expression language in Schema File property Update ValidateXml.java Update ValidateXml.java NIFI-5192: Added evaluateAttributeExpressions call, error handling, and unit tests --- .../nifi/processors/standard/ValidateXml.java | 9 ++++++- .../processors/standard/TestValidateXml.java | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ValidateXml.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ValidateXml.java index 1c38dfd400..279d9f2099 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ValidateXml.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ValidateXml.java @@ -17,6 +17,7 @@ package org.apache.nifi.processors.standard; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -44,6 +45,7 @@ import org.apache.nifi.annotation.documentation.Tags; import org.apache.nifi.annotation.lifecycle.OnScheduled; import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.flowfile.FlowFile; +import org.apache.nifi.expression.ExpressionLanguageScope; import org.apache.nifi.logging.ComponentLog; import org.apache.nifi.processor.AbstractProcessor; import org.apache.nifi.processor.ProcessContext; @@ -72,6 +74,7 @@ public class ValidateXml extends AbstractProcessor { .name("Schema File") .description("The path to the Schema file that is to be used for validation") .required(true) + .expressionLanguageSupported(ExpressionLanguageScope.VARIABLE_REGISTRY) .addValidator(StandardValidators.FILE_EXISTS_VALIDATOR) .build(); @@ -115,7 +118,11 @@ public class ValidateXml extends AbstractProcessor { @OnScheduled public void parseSchema(final ProcessContext context) throws IOException, SAXException { try { - final File file = new File(context.getProperty(SCHEMA_FILE).getValue()); + final File file = new File(context.getProperty(SCHEMA_FILE).evaluateAttributeExpressions().getValue()); + // Ensure the file exists + if (!file.exists()) { + throw new FileNotFoundException("Schema file not found at specified location: " + file.getAbsolutePath()); + } final SchemaFactory schemaFactory = SchemaFactory.newInstance(SCHEMA_LANGUAGE); final Schema schema = schemaFactory.newSchema(file); this.schemaRef.set(schema); diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateXml.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateXml.java index d7b2e39e36..b41f86982e 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateXml.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestValidateXml.java @@ -49,4 +49,28 @@ public class TestValidateXml { runner.assertAllFlowFilesContainAttribute(ValidateXml.REL_INVALID, ValidateXml.ERROR_ATTRIBUTE_KEY); } + @Test + public void testValidEL() throws IOException, SAXException { + final TestRunner runner = TestRunners.newTestRunner(new ValidateXml()); + runner.setProperty(ValidateXml.SCHEMA_FILE, "${my.schema}"); + runner.setVariable("my.schema", "src/test/resources/TestXml/XmlBundle.xsd"); + + runner.enqueue(Paths.get("src/test/resources/TestXml/xml-snippet.xml")); + runner.run(); + + runner.assertAllFlowFilesTransferred(ValidateXml.REL_VALID, 1); + } + + @Test(expected = AssertionError.class) + public void testInvalidEL() throws IOException, SAXException { + final TestRunner runner = TestRunners.newTestRunner(new ValidateXml()); + runner.setProperty(ValidateXml.SCHEMA_FILE, "${my.schema}"); + + runner.enqueue("is an invalid"); + runner.run(); + + runner.assertAllFlowFilesTransferred(ValidateXml.REL_INVALID, 1); + runner.assertAllFlowFilesContainAttribute(ValidateXml.REL_INVALID, ValidateXml.ERROR_ATTRIBUTE_KEY); + } + }