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

Reply via email to