This is an automated email from the ASF dual-hosted git repository.
mcgilman 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 168b3e205a NIFI-12311 Removed Custom Module Support from Jolt UI
(#7973)
168b3e205a is described below
commit 168b3e205a6d3a3bacbcd4902a730342f5f29eb8
Author: exceptionfactory <[email protected]>
AuthorDate: Fri Nov 3 07:24:19 2023 -0500
NIFI-12311 Removed Custom Module Support from Jolt UI (#7973)
- Removed custom ClassLoader creation support from the JoltTransformJSON
Advanced user interface to avoid issues with loading external classes
This closes #7973
---
.../api/transformjson/TransformJSONResource.java | 81 ++++++++-------------
.../transformjson/TestTransformJSONResource.java | 29 +-------
.../TestCustomJoltTransform.jar | Bin 1025 -> 0 bytes
3 files changed, 35 insertions(+), 75 deletions(-)
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
index af34dc1438..9afa5a7809 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/main/java/org/apache/nifi/web/standard/api/transformjson/TransformJSONResource.java
@@ -25,7 +25,6 @@ import org.apache.nifi.attribute.expression.language.Query;
import org.apache.nifi.attribute.expression.language.StandardEvaluationContext;
import org.apache.nifi.processors.standard.util.jolt.TransformFactory;
import org.apache.nifi.processors.standard.util.jolt.TransformUtils;
-import org.apache.nifi.util.file.classloader.ClassLoaderUtils;
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;
@@ -37,8 +36,6 @@ import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import java.io.File;
-import java.io.FilenameFilter;
import java.util.Collections;
import java.util.Map;
@@ -48,22 +45,22 @@ public class TransformJSONResource extends
AbstractStandardResource {
private static final Logger logger =
LoggerFactory.getLogger(TransformJSONResource.class);
private final static String DEFAULT_CHARSET = "UTF-8";
- protected Object getSpecificationJsonObject(JoltSpecificationDTO
specificationDTO, boolean evaluateAttributes){
-
- if (!StringUtils.isEmpty(specificationDTO.getSpecification()) ){
+ private static final String CUSTOM_TRANSFORM_NAME =
"jolt-transform-custom";
+ protected Object getSpecificationJsonObject(JoltSpecificationDTO
specificationDTO, boolean evaluateAttributes) {
+ if (!StringUtils.isEmpty(specificationDTO.getSpecification())) {
final String specification;
- if(evaluateAttributes) {
+ if (evaluateAttributes) {
PreparedQuery preparedQuery =
Query.prepare(specificationDTO.getSpecification());
Map<String, String> attributes =
specificationDTO.getExpressionLanguageAttributes() == null ?
Collections.emptyMap() : specificationDTO.getExpressionLanguageAttributes();
specification = preparedQuery.evaluateExpressions(new
StandardEvaluationContext(attributes), null);
- }else{
+ } else {
specification =
specificationDTO.getSpecification().replaceAll("\\$\\{","\\\\\\\\\\$\\{");
}
return JsonUtils.jsonToObject(specification, DEFAULT_CHARSET);
- }else{
+ } else {
return null;
}
}
@@ -72,65 +69,49 @@ public class TransformJSONResource extends
AbstractStandardResource {
@Produces({MediaType.APPLICATION_JSON})
@Path("/validate")
public Response validateSpec(JoltSpecificationDTO specificationDTO) {
+ ValidationDTO validation;
try {
- getTransformation(specificationDTO,false);
- }catch(final Exception e){
- logger.error("Validation Failed - " + e.toString());
- return Response.ok(new ValidationDTO(false,"Validation Failed -
Please verify the provided specification.")).build();
+ getTransformation(specificationDTO, false);
+ validation = new ValidationDTO(true, null);
+ } catch (final Exception e) {
+ logger.warn("Jolt Transform Validation Failed", e);
+
+ final String message;
+ if (CUSTOM_TRANSFORM_NAME.equals(specificationDTO.getTransform()))
{
+ message = "Custom Transform not supported for advanced
validation";
+ } else {
+ message = "Validation Failed: Please review the Jolt
Specification formatting";
+ }
+
+ validation = new ValidationDTO(false, message);
}
- return Response.ok(new ValidationDTO(true,null)).build();
+ return Response.ok(validation).build();
}
@POST
@Produces({MediaType.APPLICATION_JSON})
@Path("/execute")
public Response executeSpec(JoltSpecificationDTO specificationDTO) {
-
try {
- JoltTransform transform = getTransformation(specificationDTO,true);
+ JoltTransform transform = getTransformation(specificationDTO,
true);
Object inputJson =
JsonUtils.jsonToObject(specificationDTO.getInput());
- return
Response.ok(JsonUtils.toJsonString(TransformUtils.transform(transform,inputJson))).build();
-
- }catch(final Exception e){
- logger.error("Execute Specification Failed - " + e.toString());
+ return
Response.ok(JsonUtils.toJsonString(TransformUtils.transform(transform,
inputJson))).build();
+ } catch (final Exception e) {
+ logger.warn("Jolt Transform Execute Failed", e);
return
Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
-
}
- protected JoltTransform getTransformation(JoltSpecificationDTO
specificationDTO, boolean evaluateAttributes) throws Exception {
-
- Object specJson =
getSpecificationJsonObject(specificationDTO,evaluateAttributes);
- String transformName = specificationDTO.getTransform();
- String modules = specificationDTO.getModules();
+ private JoltTransform getTransformation(JoltSpecificationDTO
specificationDTO, boolean evaluateAttributes) throws Exception {
+ final String transformName = specificationDTO.getTransform();
- ClassLoader classLoader = null;
- JoltTransform transform ;
-
- if(modules != null && !modules.isEmpty()){
- classLoader =
ClassLoaderUtils.getCustomClassLoader(specificationDTO.getModules(),this.getClass().getClassLoader(),
getJarFilenameFilter());
- } else{
- classLoader = this.getClass().getClassLoader();
- }
-
- if(transformName.equals("jolt-transform-custom")) {
- transform =
TransformFactory.getCustomTransform(classLoader,specificationDTO.getCustomClass(),
specJson);
- }else{
- transform =
TransformFactory.getTransform(classLoader,specificationDTO.getTransform(),
specJson);
+ if (CUSTOM_TRANSFORM_NAME.equals(transformName)) {
+ throw new IllegalArgumentException("Custom Transform Classes not
supported for dynamic evaluation");
}
- return transform;
+ Object specJson = getSpecificationJsonObject(specificationDTO,
evaluateAttributes);
+ return TransformFactory.getTransform(getClass().getClassLoader(),
specificationDTO.getTransform(), specJson);
}
-
- protected FilenameFilter getJarFilenameFilter(){
- return new FilenameFilter() {
- @Override
- public boolean accept(File dir, String name) {
- return (name != null && name.endsWith(".jar"));
- }
- };
- }
-
}
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
index 60e2f5cabf..1f4bde33f1 100644
---
a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
+++
b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/java/org/apache/nifi/web/standard/api/transformjson/TestTransformJSONResource.java
@@ -139,7 +139,7 @@ public class TestTransformJSONResource extends JerseyTest {
.post(Entity.json(joltSpecificationDTO), ValidationDTO.class);
assertNotNull(validation);
- assertTrue(!validation.isValid());
+ assertFalse(validation.isValid());
}
@Test
@@ -166,14 +166,13 @@ public class TestTransformJSONResource extends JerseyTest
{
JoltSpecificationDTO joltSpecificationDTO = new
JoltSpecificationDTO("jolt-transform-custom","[{ \"operation\": \"default\",
\"spec\":{ \"custom-id\" :4 }}]");
joltSpecificationDTO.setCustomClass("TestCustomJoltTransform");
-
joltSpecificationDTO.setModules("src/test/resources/TestTransformJSONResource/TestCustomJoltTransform.jar");
ValidationDTO validate = client().target(getBaseUri())
.path("/standard/transformjson/validate")
.request()
.post(Entity.json(joltSpecificationDTO), ValidationDTO.class);
assertNotNull(validate);
- assertTrue(validate.isValid());
+ assertFalse(validate.isValid());
}
@Test
@@ -208,33 +207,13 @@ public class TestTransformJSONResource extends JerseyTest
{
JoltSpecificationDTO joltSpecificationDTO = new
JoltSpecificationDTO("jolt-transform-custom","{ \"operation\": \"default\",
\"spec\":{ \"custom-id\" :4 }}");
joltSpecificationDTO.setCustomClass("TestCustomJoltTransform");
-
joltSpecificationDTO.setModules("src/test/resources/TestTransformJSONResource/TestCustomJoltTransform.jar");
ValidationDTO validate = client().target(getBaseUri())
.path("/standard/transformjson/validate")
.request()
.post(Entity.json(joltSpecificationDTO), ValidationDTO.class);
assertNotNull(validate);
- assertTrue(!validate.isValid());
- }
-
- @Test
- public void testExecuteWithValidCustomSpec() {
- final Diffy diffy = new Diffy();
- JoltSpecificationDTO joltSpecificationDTO = new
JoltSpecificationDTO("jolt-transform-custom","[{ \"operation\": \"default\",
\"spec\":{ \"custom-id\" :4 }}]");
- String inputJson = "{\"rating\":{\"quality\":2,\"count\":1}}";
- joltSpecificationDTO.setInput(inputJson);
- joltSpecificationDTO.setCustomClass("TestCustomJoltTransform");
-
joltSpecificationDTO.setModules("src/test/resources/TestTransformJSONResource/TestCustomJoltTransform.jar");
- String responseString = client().target(getBaseUri())
- .path("/standard/transformjson/execute")
- .request()
- .post(Entity.json(joltSpecificationDTO), String.class);
-
- Object transformedJson = JsonUtils.jsonToObject(responseString);
- Object compareJson =
JsonUtils.jsonToObject("{\"rating\":{\"quality\":2,\"count\":1}, \"custom-id\":
4}");
- assertNotNull(transformedJson);
- assertTrue(diffy.diff(compareJson, transformedJson).isEmpty());
+ assertFalse(validate.isValid());
}
@Test
@@ -285,7 +264,7 @@ public class TestTransformJSONResource extends JerseyTest {
JoltSpecificationDTO joltSpecificationDTO = new
JoltSpecificationDTO("jolt-transform-shift","{ \"rating\" : {\"quality\":
\"${qual_var}\"} }");
String inputJson = "{\"rating\":{\"quality\":2,\"count\":1}}";
joltSpecificationDTO.setInput(inputJson);
- Map<String,String> attributes = new HashMap<String,String>();
+ Map<String,String> attributes = new HashMap<>();
attributes.put("qual_var","qa");
joltSpecificationDTO.setExpressionLanguageAttributes(attributes);
String responseString = client().target(getBaseUri())
diff --git
a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/resources/TestTransformJSONResource/TestCustomJoltTransform.jar
b/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/resources/TestTransformJSONResource/TestCustomJoltTransform.jar
deleted file mode 100644
index b738658f1c..0000000000
Binary files
a/nifi-nar-bundles/nifi-standard-bundle/nifi-jolt-transform-json-ui/src/test/resources/TestTransformJSONResource/TestCustomJoltTransform.jar
and /dev/null differ