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

pvillard pushed a commit to branch support/nifi-1.x
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/support/nifi-1.x by this push:
     new 31850d10fa NIFI-12117 Allow configuring Jackson's  max string length 
in JoltTransformJSON
31850d10fa is described below

commit 31850d10fafbd016c23c704d897b50a120bf79c9
Author: Bryan Bende <[email protected]>
AuthorDate: Mon Sep 25 11:44:33 2023 -0400

    NIFI-12117 Allow configuring Jackson's  max string length in 
JoltTransformJSON
    
    Signed-off-by: Pierre Villard <[email protected]>
    
    This closes #7788.
---
 .../processors/standard/JoltTransformJSON.java     | 30 +++++++++++++++++++---
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java
index 2b66f8937f..bfeb2556db 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/JoltTransformJSON.java
@@ -17,15 +17,18 @@
 package org.apache.nifi.processors.standard;
 
 import com.bazaarvoice.jolt.JoltTransform;
+import com.bazaarvoice.jolt.JsonUtil;
 import com.bazaarvoice.jolt.JsonUtils;
+import com.fasterxml.jackson.core.StreamReadConstraints;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import org.apache.nifi.annotation.behavior.EventDriven;
+import org.apache.nifi.annotation.behavior.InputRequirement;
+import org.apache.nifi.annotation.behavior.RequiresInstanceClassLoading;
 import org.apache.nifi.annotation.behavior.SideEffectFree;
 import org.apache.nifi.annotation.behavior.SupportsBatching;
-import org.apache.nifi.annotation.behavior.InputRequirement;
 import org.apache.nifi.annotation.behavior.WritesAttribute;
-import org.apache.nifi.annotation.behavior.RequiresInstanceClassLoading;
 import org.apache.nifi.annotation.documentation.CapabilityDescription;
 import org.apache.nifi.annotation.documentation.Tags;
 import org.apache.nifi.annotation.lifecycle.OnScheduled;
@@ -42,6 +45,7 @@ import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.flowfile.attributes.CoreAttributes;
 import org.apache.nifi.logging.ComponentLog;
 import org.apache.nifi.processor.AbstractProcessor;
+import org.apache.nifi.processor.DataUnit;
 import org.apache.nifi.processor.ProcessContext;
 import org.apache.nifi.processor.ProcessSession;
 import org.apache.nifi.processor.Relationship;
@@ -153,6 +157,15 @@ public class JoltTransformJSON extends AbstractProcessor {
             .defaultValue("false")
             .build();
 
+    public static final PropertyDescriptor MAX_STRING_LENGTH = new 
PropertyDescriptor.Builder()
+            .name("max-string-length")
+            .displayName("Max String Length")
+            .description("The maximum allowed length of a string value when 
parsing the JSON document")
+            .required(true)
+            .defaultValue("20 MB")
+            .addValidator(StandardValidators.DATA_SIZE_VALIDATOR)
+            .build();
+
     public static final Relationship REL_SUCCESS = new Relationship.Builder()
             .name("success")
             .description("The FlowFile with transformed content will be routed 
to this relationship")
@@ -165,6 +178,7 @@ public class JoltTransformJSON extends AbstractProcessor {
     private final static List<PropertyDescriptor> properties;
     private final static Set<Relationship> relationships;
     private volatile ClassLoader customClassLoader;
+    private volatile JsonUtil jsonUtil;
     private final static String DEFAULT_CHARSET = "UTF-8";
 
     /**
@@ -182,6 +196,7 @@ public class JoltTransformJSON extends AbstractProcessor {
         _properties.add(JOLT_SPEC);
         _properties.add(TRANSFORM_CACHE_SIZE);
         _properties.add(PRETTY_PRINT);
+        _properties.add(MAX_STRING_LENGTH);
         properties = Collections.unmodifiableList(_properties);
 
         final Set<Relationship> _relationships = new HashSet<>();
@@ -287,7 +302,7 @@ public class JoltTransformJSON extends AbstractProcessor {
 
         final Object inputJson;
         try (final InputStream in = session.read(original)) {
-            inputJson = JsonUtils.jsonToObject(in);
+            inputJson = jsonUtil.jsonToObject(in);
         } catch (final Exception e) {
             logger.error("JSON parsing failed for {}", original, e);
             session.transfer(original, REL_FAILURE);
@@ -303,7 +318,7 @@ public class JoltTransformJSON extends AbstractProcessor {
             }
 
             final Object transformedJson = TransformUtils.transform(transform, 
inputJson);
-            jsonString = context.getProperty(PRETTY_PRINT).asBoolean() ? 
JsonUtils.toPrettyJsonString(transformedJson) : 
JsonUtils.toJsonString(transformedJson);
+            jsonString = context.getProperty(PRETTY_PRINT).asBoolean() ? 
jsonUtil.toPrettyJsonString(transformedJson) : 
jsonUtil.toJsonString(transformedJson);
         } catch (final Exception e) {
             logger.error("Transform failed for {}", original, e);
             session.transfer(original, REL_FAILURE);
@@ -350,6 +365,13 @@ public class JoltTransformJSON extends AbstractProcessor {
                 .maximumSize(maxTransformsToCache)
                 .build();
 
+        final int maxStringLength = 
context.getProperty(MAX_STRING_LENGTH).asDataSize(DataUnit.B).intValue();
+        final StreamReadConstraints streamReadConstraints = 
StreamReadConstraints.builder().maxStringLength(maxStringLength).build();
+
+        final ObjectMapper objectMapper = new ObjectMapper();
+        
objectMapper.getFactory().setStreamReadConstraints(streamReadConstraints);
+        jsonUtil = JsonUtils.customJsonUtil(objectMapper);
+
         try {
             if (context.getProperty(MODULES).isSet()) {
                 customClassLoader = ClassLoaderUtils.getCustomClassLoader(

Reply via email to