This is an automated email from the ASF dual-hosted git repository.

pvillard31 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new fe04cb18438 NIFI-15975 Fixed single line comment bug, multiple let 
statements bug and improved the invalid read JSLT transform message. (#11338)
fe04cb18438 is described below

commit fe04cb18438efbbb9632f0ea3b9cd04b3f2ca3d2
Author: dan-s1 <[email protected]>
AuthorDate: Mon Jun 22 05:00:20 2026 -0400

    NIFI-15975 Fixed single line comment bug, multiple let statements bug and 
improved the invalid read JSLT transform message. (#11338)
---
 .../nifi/processors/jslt/JSLTTransformJSON.java    |  7 +-
 .../processors/jslt/TestJSLTTransformJSON.java     | 90 +++++++++++++++++++++-
 2 files changed, 92 insertions(+), 5 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/main/java/org/apache/nifi/processors/jslt/JSLTTransformJSON.java
 
b/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/main/java/org/apache/nifi/processors/jslt/JSLTTransformJSON.java
index 191a465b44f..e7f152fcc4d 100644
--- 
a/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/main/java/org/apache/nifi/processors/jslt/JSLTTransformJSON.java
+++ 
b/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/main/java/org/apache/nifi/processors/jslt/JSLTTransformJSON.java
@@ -272,8 +272,7 @@ public class JSLTTransformJSON extends AbstractProcessor {
             getJstlExpression(transform, null);
             builder.valid(true);
         } catch (final RuntimeException e) {
-            final String explanation = String.format("%s not valid: %s", 
property.getDisplayName(), e.getMessage());
-            builder.valid(false).explanation(explanation);
+            builder.valid(false).explanation(e.getMessage());
         }
         return builder.build();
     }
@@ -430,9 +429,9 @@ public class JSLTTransformJSON extends AbstractProcessor {
             return propertyValue.getValue();
         }
         try (final BufferedReader reader = new BufferedReader(new 
InputStreamReader(resourceReference.read()))) {
-            return reader.lines().collect(Collectors.joining());
+            return 
reader.lines().collect(Collectors.joining(System.lineSeparator()));
         } catch (final IOException e) {
-            throw new UncheckedIOException("Read JSLT Transform failed", e);
+            throw new UncheckedIOException(String.format("Read JSLT Transform 
failed, reason: %s", e.getMessage()), e);
         }
     }
 
diff --git 
a/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/test/java/org/apache/nifi/processors/jslt/TestJSLTTransformJSON.java
 
b/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/test/java/org/apache/nifi/processors/jslt/TestJSLTTransformJSON.java
index d7adf7f2df8..4e7561a08d0 100644
--- 
a/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/test/java/org/apache/nifi/processors/jslt/TestJSLTTransformJSON.java
+++ 
b/nifi-extension-bundles/nifi-jslt-bundle/nifi-jslt-processors/src/test/java/org/apache/nifi/processors/jslt/TestJSLTTransformJSON.java
@@ -23,9 +23,11 @@ import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
+import org.opentest4j.AssertionFailedError;
 
 import java.io.IOException;
 import java.io.UncheckedIOException;
@@ -41,13 +43,19 @@ import java.util.stream.Stream;
 
 import static 
org.apache.nifi.processors.jslt.JSLTTransformJSON.TransformationStrategy.ENTIRE_FLOWFILE;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class TestJSLTTransformJSON {
 
-    private TestRunner runner = TestRunners.newTestRunner(new 
JSLTTransformJSON());
     private static final Path RESOURCE_DIR = Paths.get("src/test/resources");
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
+    @TempDir
+    private static Path tempDir;
+
+    private TestRunner runner;
+
     @BeforeEach
     public void setup() {
         runner = TestRunners.newTestRunner(JSLTTransformJSON.class);
@@ -74,6 +82,86 @@ public class TestJSLTTransformJSON {
         runner.assertNotValid();
     }
 
+    @Test
+    public void testMultipleLetStatementsOnDifferentLinesDoNotCollide() {
+        final String transformWithMultilines = """
+                let id = .value.id
+                let client_name = replace(.value.client_name, "-[^-]+$", ""){
+                "id": $id,
+                "name": $client_name
+                }
+                """;
+
+        runner.setProperty(JSLTTransformJSON.JSLT_TRANSFORM, 
transformWithMultilines);
+        runner.setProperty(JSLTTransformJSON.TRANSFORMATION_STRATEGY, 
ENTIRE_FLOWFILE.getValue());
+        final String json = """
+                {
+                    "value" : {
+                        "id" : "jdoe",
+                        "client_name": "John"
+                    }
+                }
+                """;
+        runner.enqueue(json);
+
+        runner.run();
+        runner.assertTransferCount(JSLTTransformJSON.REL_SUCCESS, 1);
+    }
+
+    @Test
+    public void testImprovedInvalidTransformReadMessage() {
+        final Path nonExistentTransformFile = 
tempDir.resolve("transform.json");
+        runner.setProperty(JSLTTransformJSON.JSLT_TRANSFORM, 
nonExistentTransformFile.toString());
+        runner.setProperty(JSLTTransformJSON.TRANSFORMATION_STRATEGY, 
ENTIRE_FLOWFILE.getValue());
+
+        final String json = """
+                {
+                    "userId" : "jdoe",
+                    "firstName": "John"
+                }
+                """;
+        runner.enqueue(json);
+
+        final AssertionFailedError assertionFailedError = 
assertThrows(AssertionFailedError.class, () -> runner.run());
+        assertTrue(assertionFailedError.getMessage().contains("'JSLT 
Transformation' is invalid because Read JSLT Transform failed, reason:"));
+    }
+
+    @ParameterizedTest
+    @MethodSource("singleLineCommentArgs")
+    public void testJSLTTransformWithSingleLineComment(String transform) {
+        runner.setProperty(JSLTTransformJSON.JSLT_TRANSFORM, transform);
+        runner.setProperty(JSLTTransformJSON.TRANSFORMATION_STRATEGY, 
ENTIRE_FLOWFILE.getValue());
+
+        final String json = """
+                {
+                    "userId" : "jdoe",
+                    "firstName": "John"
+                }
+                """;
+        runner.enqueue(json);
+
+        runner.run();
+        runner.assertTransferCount(JSLTTransformJSON.REL_SUCCESS, 1);
+    }
+
+    private static Stream<Arguments> singleLineCommentArgs() throws 
IOException {
+        final String transformWithSingleLineComment = """
+                // This is a single line comment in JSLT
+                {
+                "id": .userId,
+                "name": .firstName
+                }
+                """;
+
+        final Path transformFile = 
tempDir.resolve("transformWithComment.json");
+        Files.writeString(transformFile, transformWithSingleLineComment);
+
+        return Stream.of(
+                Arguments.argumentSet("File", transformFile.toString()),
+                Arguments.argumentSet("Text", transformWithSingleLineComment)
+        );
+    }
+
     @Test
     public void testTransformFilePath() {
         final URL transformUrl = 
Objects.requireNonNull(getClass().getResource("/simpleTransform.json"));

Reply via email to