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"));