Repository: nifi Updated Branches: refs/heads/master 504152eaa -> 71cf3fd46
NIFI-5268: Fix JostTransformJSON spec validation with EL Signed-off-by: Pierre Villard <[email protected]> This closes #2762. Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/71cf3fd4 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/71cf3fd4 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/71cf3fd4 Branch: refs/heads/master Commit: 71cf3fd46dfabe867ceb4d59451e855a0c968711 Parents: 504152e Author: Koji Kawamura <[email protected]> Authored: Tue Jun 5 10:21:17 2018 +0900 Committer: Pierre Villard <[email protected]> Committed: Wed Jun 6 09:37:02 2018 +0200 ---------------------------------------------------------------------- .../processors/standard/JoltTransformJSON.java | 14 ++++++---- .../standard/TestJoltTransformJSON.java | 29 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/71cf3fd4/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java index 69ebad2..872535d 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java @@ -209,13 +209,15 @@ public class JoltTransformJSON extends AbstractProcessor { } final String specValue = validationContext.getProperty(JOLT_SPEC).getValue(); - final String invalidExpressionMsg = validationContext.newExpressionLanguageCompiler().validateExpression(specValue,true); - if (validationContext.isExpressionLanguagePresent(specValue) && invalidExpressionMsg != null) { - final String customMessage = "The expression language used withing this specification is invalid"; - results.add(new ValidationResult.Builder().valid(false) - .explanation(customMessage) - .build()); + if (validationContext.isExpressionLanguagePresent(specValue)) { + final String invalidExpressionMsg = validationContext.newExpressionLanguageCompiler().validateExpression(specValue,true); + if (!StringUtils.isEmpty(invalidExpressionMsg)) { + results.add(new ValidationResult.Builder().valid(false) + .subject(JOLT_SPEC.getDisplayName()) + .explanation("Invalid Expression Language: " + invalidExpressionMsg) + .build()); + } } else { //for validation we want to be able to ensure the spec is syntactically correct and not try to resolve variables since they may not exist yet Object specJson = SORTR.getValue().equals(transform) ? null : JsonUtils.jsonToObject(specValue.replaceAll("\\$\\{","\\\\\\\\\\$\\{"), DEFAULT_CHARSET); http://git-wip-us.apache.org/repos/asf/nifi/blob/71cf3fd4/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestJoltTransformJSON.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestJoltTransformJSON.java b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestJoltTransformJSON.java index 14a2531..c548662 100644 --- a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestJoltTransformJSON.java +++ b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestJoltTransformJSON.java @@ -23,6 +23,8 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collections; +import java.util.Map; import java.util.Set; import org.apache.nifi.flowfile.attributes.CoreAttributes; @@ -417,5 +419,32 @@ public class TestJoltTransformJSON { assertTrue(DIFFY.diff(compareJson, transformedJson).isEmpty()); } + @Test + public void testJoltSpecEL() throws IOException { + final TestRunner runner = TestRunners.newTestRunner(new JoltTransformJSON()); + final String spec = "${joltSpec}"; + runner.setProperty(JoltTransformJSON.JOLT_SPEC, spec); + runner.setProperty(JoltTransformJSON.JOLT_TRANSFORM,JoltTransformJSON.DEFAULTR); + final Map<String, String> attributes = Collections.singletonMap("joltSpec", + "{\"RatingRange\":5,\"rating\":{\"*\":{\"MaxLabel\":\"High\",\"MinLabel\":\"Low\",\"DisplayType\":\"NORMAL\"}}}"); + runner.enqueue(JSON_INPUT, attributes); + runner.run(); + runner.assertAllFlowFilesTransferred(JoltTransformJSON.REL_SUCCESS); + final MockFlowFile transformed = runner.getFlowFilesForRelationship(JoltTransformJSON.REL_SUCCESS).get(0); + transformed.assertAttributeExists(CoreAttributes.MIME_TYPE.key()); + transformed.assertAttributeEquals(CoreAttributes.MIME_TYPE.key(),"application/json"); + Object transformedJson = JsonUtils.jsonToObject(new ByteArrayInputStream(transformed.toByteArray())); + Object compareJson = JsonUtils.jsonToObject(Files.newInputStream(Paths.get("src/test/resources/TestJoltTransformJson/defaultrOutput.json"))); + assertTrue(DIFFY.diff(compareJson, transformedJson).isEmpty()); + } + + @Test + public void testJoltSpecInvalidEL() throws IOException { + final TestRunner runner = TestRunners.newTestRunner(new JoltTransformJSON()); + final String spec = "${joltSpec:nonExistingFunction()}"; + runner.setProperty(JoltTransformJSON.JOLT_SPEC, spec); + runner.enqueue(JSON_INPUT); + runner.assertNotValid(); + } }
