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 5e9111b3526 NIFI-16466 Scoped Jolt Transform UI Expression Evaluation 
to Attributes (#11812)
5e9111b3526 is described below

commit 5e9111b3526b6e87d08be263ef7d3d21107fdf8b
Author: David Handermann <[email protected]>
AuthorDate: Wed Oct 21 06:31:00 2026 -0500

    NIFI-16466 Scoped Jolt Transform UI Expression Evaluation to Attributes 
(#11812)
---
 .../api/transformjson/TransformJSONResource.java   | 48 ++++++++++++++++++++--
 .../transformjson/TestTransformJSONResource.java   | 29 +++++++++++++
 2 files changed, 73 insertions(+), 4 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
 
b/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
index 683ea7ba664..42d3a4d1909 100644
--- 
a/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
+++ 
b/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
@@ -25,11 +25,13 @@ import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.nifi.attribute.expression.language.EvaluationContext;
 import org.apache.nifi.attribute.expression.language.PreparedQuery;
 import org.apache.nifi.attribute.expression.language.Query;
-import org.apache.nifi.attribute.expression.language.StandardEvaluationContext;
+import org.apache.nifi.attribute.expression.language.evaluation.EvaluatorState;
 import org.apache.nifi.jolt.util.TransformFactory;
 import org.apache.nifi.jolt.util.TransformUtils;
+import org.apache.nifi.parameter.Parameter;
 import org.apache.nifi.web.standard.api.AbstractStandardResource;
 import org.apache.nifi.web.standard.api.transformjson.dto.JoltSpecificationDTO;
 import org.apache.nifi.web.standard.api.transformjson.dto.ValidationDTO;
@@ -39,6 +41,7 @@ import org.slf4j.LoggerFactory;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 @Path("/standard/transformjson")
 public class TransformJSONResource extends AbstractStandardResource {
@@ -53,10 +56,10 @@ public class TransformJSONResource extends 
AbstractStandardResource {
             final String specification;
 
             if (evaluateAttributes) {
-                PreparedQuery preparedQuery = 
Query.prepare(specificationDTO.getSpecification());
-                Map<String, String> attributes = 
specificationDTO.getExpressionLanguageAttributes() == null ? 
Collections.unmodifiableMap(new HashMap<>())
+                final PreparedQuery preparedQuery = 
Query.prepare(specificationDTO.getSpecification());
+                final Map<String, String> attributes = 
specificationDTO.getExpressionLanguageAttributes() == null ? 
Collections.unmodifiableMap(new HashMap<>())
                         : specificationDTO.getExpressionLanguageAttributes();
-                specification = preparedQuery.evaluateExpressions(new 
StandardEvaluationContext(attributes), null);
+                specification = preparedQuery.evaluateExpressions(new 
AttributeEvaluationContext(attributes), null);
             } else {
                 specification = 
specificationDTO.getSpecification().replaceAll("\\$\\{", "\\\\\\\\\\$\\{");
             }
@@ -116,4 +119,41 @@ public class TransformJSONResource extends 
AbstractStandardResource {
         Object specJson = getSpecificationJsonObject(specificationDTO, 
evaluateAttributes);
         return TransformFactory.getTransform(getClass().getClassLoader(), 
specificationDTO.getTransform(), specJson);
     }
+
+    /**
+     * Evaluates Expression Language using only the attributes supplied with 
the specification.
+     */
+    private static final class AttributeEvaluationContext implements 
EvaluationContext {
+        private final Map<String, String> attributes;
+        private final EvaluatorState evaluatorState = new EvaluatorState();
+
+        private AttributeEvaluationContext(final Map<String, String> 
attributes) {
+            this.attributes = attributes;
+        }
+
+        @Override
+        public String getExpressionValue(final String name) {
+            return attributes.get(name);
+        }
+
+        @Override
+        public Set<String> getExpressionKeys() {
+            return attributes.keySet();
+        }
+
+        @Override
+        public String getState(final String key) {
+            return null;
+        }
+
+        @Override
+        public Parameter getParameter(final String parameterName) {
+            return null;
+        }
+
+        @Override
+        public EvaluatorState getEvaluatorState() {
+            return evaluatorState;
+        }
+    }
 }
diff --git 
a/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
 
b/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
index a927f3970ac..b7c49afc4e3 100644
--- 
a/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
+++ 
b/nifi-extension-bundles/nifi-jolt-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
@@ -277,6 +277,35 @@ public class TestTransformJSONResource extends JerseyTest {
         assertTrue(diffy.diff(compareJson, transformedJson).isEmpty());
     }
 
+    @Test
+    public void testExecuteExpressionLanguageUsesSuppliedAttributes() {
+        final Diffy diffy = new Diffy();
+
+        final String attributeName = "label";
+        final String attributeValue = "preview";
+        final String specification = """
+                {"label":"${label}","account":"${user.name}"}
+                """;
+        final String expected = """
+                {"label":"preview","account":""}
+                """;
+
+        final JoltSpecificationDTO joltSpecificationDTO = new 
JoltSpecificationDTO("jolt-transform-default", specification);
+        joltSpecificationDTO.setInput("{}");
+        final Map<String, String> attributes = Map.of(attributeName, 
attributeValue);
+        joltSpecificationDTO.setExpressionLanguageAttributes(attributes);
+
+        final String responseString = client().target(getBaseUri())
+                .path("/standard/transformjson/execute")
+                .request()
+                .post(Entity.json(joltSpecificationDTO), String.class);
+
+        final Object transformedJson = JsonUtils.jsonToObject(responseString);
+        final Object expectedJson = JsonUtils.jsonToObject(expected);
+        assertNotNull(transformedJson);
+        assertTrue(diffy.diff(expectedJson, transformedJson).isEmpty());
+    }
+
     public static class MockServletContext implements Factory<ServletContext> {
         @Override
         public ServletContext provide() {

Reply via email to