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() {