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 a9da6c4749f NIFI-11295 Expanded Mapping File property to also take the 
mapping file content (#11081)
a9da6c4749f is described below

commit a9da6c4749f8b67333bd242788c78f9cd6c084ea
Author: dan-s1 <[email protected]>
AuthorDate: Tue Jul 7 16:01:33 2026 -0400

    NIFI-11295 Expanded Mapping File property to also take the mapping file 
content (#11081)
---
 .../standard/ReplaceTextWithMapping.java           | 110 ++++++-----
 .../standard/TestReplaceTextWithMapping.java       | 210 +++++++++++----------
 2 files changed, 170 insertions(+), 150 deletions(-)

diff --git 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
index 85dba965e28..9552fefd278 100644
--- 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
+++ 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceTextWithMapping.java
@@ -23,10 +23,12 @@ import org.apache.nifi.annotation.behavior.SideEffectFree;
 import org.apache.nifi.annotation.behavior.SupportsBatching;
 import org.apache.nifi.annotation.documentation.CapabilityDescription;
 import org.apache.nifi.annotation.documentation.Tags;
+import org.apache.nifi.annotation.lifecycle.OnScheduled;
 import org.apache.nifi.components.PropertyDescriptor;
 import org.apache.nifi.components.ValidationContext;
 import org.apache.nifi.components.ValidationResult;
 import org.apache.nifi.components.resource.ResourceCardinality;
+import org.apache.nifi.components.resource.ResourceReference;
 import org.apache.nifi.components.resource.ResourceType;
 import org.apache.nifi.expression.AttributeValueDecorator;
 import org.apache.nifi.expression.ExpressionLanguageScope;
@@ -45,7 +47,6 @@ import org.apache.nifi.util.StopWatch;
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -68,8 +69,9 @@ import java.util.regex.Pattern;
 @SupportsBatching
 @InputRequirement(Requirement.INPUT_REQUIRED)
 @Tags({"Text", "Regular Expression", "Update", "Change", "Replace", "Modify", 
"Regex", "Mapping"})
-@CapabilityDescription("Updates the content of a FlowFile by evaluating a 
Regular Expression against it and replacing the section of the content that "
-        + "matches the Regular Expression with some alternate value provided 
in a mapping file.")
+@CapabilityDescription("""
+        Updates the content of a FlowFile by evaluating a Regular Expression 
against it and replacing the section of the content that
+        matches the Regular Expression with some alternate value provided in a 
mapping file.""")
 public class ReplaceTextWithMapping extends AbstractProcessor {
 
     public static final PropertyDescriptor REGEX = new 
PropertyDescriptor.Builder()
@@ -90,13 +92,13 @@ public class ReplaceTextWithMapping extends 
AbstractProcessor {
             .build();
     public static final PropertyDescriptor MAPPING_FILE = new 
PropertyDescriptor.Builder()
             .name("Mapping File")
-            .description("The name of the file (including the full path) 
containing the Mappings.")
-            .identifiesExternalResource(ResourceCardinality.SINGLE, 
ResourceType.FILE)
+            .description("The name of the file (including the full path) 
containing the Mappings or the actual mapping contents.")
+            .identifiesExternalResource(ResourceCardinality.SINGLE, 
ResourceType.FILE, ResourceType.TEXT)
             .required(true)
             .build();
     public static final PropertyDescriptor MAPPING_FILE_REFRESH_INTERVAL = new 
PropertyDescriptor.Builder()
             .name("Mapping File Refresh Interval")
-            .description("The polling interval to check for updates to the 
mapping file. The default is 60s.")
+            .description("The polling interval to check for updates to the 
mapping file only if the mapping file is a file on the filesystem. The default 
is 60s.")
             .addValidator(StandardValidators.TIME_PERIOD_VALIDATOR)
             .required(true)
             .defaultValue("60s")
@@ -176,6 +178,19 @@ public class ReplaceTextWithMapping extends 
AbstractProcessor {
         return RELATIONSHIPS;
     }
 
+    @OnScheduled
+    public void onScheduled(final ProcessContext context) {
+        final ResourceReference resourceReference = 
context.getProperty(MAPPING_FILE).asResource();
+        if (resourceReference.getResourceType() == ResourceType.TEXT) {
+            getLogger().info("Loading mapping content");
+            try (final InputStream inputStream = resourceReference.read()) {
+                setConfigurationState(inputStream);
+            } catch (IOException ioe) {
+                getLogger().error("Error reading mapping content", ioe);
+            }
+        }
+    }
+
     @Override
     public void onTrigger(final ProcessContext context, final ProcessSession 
session) throws ProcessException {
         updateMapping(context);
@@ -214,7 +229,7 @@ public class ReplaceTextWithMapping extends 
AbstractProcessor {
                 final StringBuilder sb = new 
StringBuilder(replacement.length() + 1);
                 final int groupStart = backRefMatcher.start(1) + 
replacementCount++;
 
-                sb.append(replacement.substring(0, groupStart - 1));
+                sb.append(replacement, 0, groupStart - 1);
                 sb.append("\\");
                 sb.append(replacement.substring(groupStart - 1));
                 replacement = sb.toString();
@@ -227,49 +242,56 @@ public class ReplaceTextWithMapping extends 
AbstractProcessor {
     }
 
     private void updateMapping(final ProcessContext context) {
-        if (processorLock.tryLock()) {
-            final ComponentLog logger = getLogger();
-            try {
-                // if not queried mapping file lastUpdate time in
-                // mapppingRefreshPeriodSecs, do so.
-                long currentTimeSecs = System.currentTimeMillis() / 1000;
-                long mappingRefreshPeriodSecs = 
context.getProperty(MAPPING_FILE_REFRESH_INTERVAL).asTimePeriod(TimeUnit.SECONDS);
-
-                boolean retry = (currentTimeSecs > (mappingTestTime.get() + 
mappingRefreshPeriodSecs));
-                if (retry) {
-                    mappingTestTime.set(System.currentTimeMillis() / 1000);
-                    // see if the mapping file needs to be reloaded
-                    final String fileName = 
context.getProperty(MAPPING_FILE).getValue();
-                    final File file = new File(fileName);
-                    if (file.exists() && file.isFile() && file.canRead()) {
-                        if (file.lastModified() > lastModified.get()) {
-                            lastModified.getAndSet(file.lastModified());
-                            try (FileInputStream is = new 
FileInputStream(file)) {
-                                logger.info("Reloading mapping file: {}", 
fileName);
-
-                                final Map<String, String> mapping = 
loadMappingFile(is);
-                                final ConfigurationState newState = new 
ConfigurationState(mapping);
-                                configurationStateRef.set(newState);
-                            } catch (IOException e) {
-                                logger.error("Error reading mapping file", e);
+        final ResourceReference resourceReference = 
context.getProperty(MAPPING_FILE).asResource();
+
+        if (resourceReference.getResourceType() == ResourceType.FILE) {
+            if (processorLock.tryLock()) {
+                final ComponentLog logger = getLogger();
+                try {
+                    // if not queried mapping file lastUpdate time in
+                    // mappingRefreshPeriodSecs, do so.
+                    final long currentTimeSecs = System.currentTimeMillis() / 
1000;
+                    final long mappingRefreshPeriodSecs = 
context.getProperty(MAPPING_FILE_REFRESH_INTERVAL).asTimePeriod(TimeUnit.SECONDS);
+
+                    final boolean retry = (currentTimeSecs > 
(mappingTestTime.get() + mappingRefreshPeriodSecs));
+                    if (retry) {
+                        mappingTestTime.set(System.currentTimeMillis() / 1000);
+                        // see if the mapping file needs to be reloaded
+                        final File file = resourceReference.asFile();
+                        final String fileName = file.getName();
+                        if (file.exists() && file.isFile() && file.canRead()) {
+                            if (file.lastModified() > lastModified.get()) {
+                                lastModified.getAndSet(file.lastModified());
+                                try (InputStream is = 
resourceReference.read()) {
+                                    logger.info("Reloading mapping file: {}", 
fileName);
+                                    setConfigurationState(is);
+                                } catch (IOException e) {
+                                    logger.error("Error reading mapping file", 
e);
+                                }
                             }
+                        } else {
+                            logger.error("Mapping file does not exist or is 
not readable: {}", fileName);
                         }
-                    } else {
-                        logger.error("Mapping file does not exist or is not 
readable: {}", fileName);
                     }
+                } catch (Exception e) {
+                    logger.error("Error loading mapping file", e);
+                } finally {
+                    processorLock.unlock();
                 }
-            } catch (Exception e) {
-                logger.error("Error loading mapping file", e);
-            } finally {
-                processorLock.unlock();
             }
         }
     }
 
+    private void setConfigurationState(InputStream inputStream) throws 
IOException {
+        final Map<String, String> mapping = loadMappingFile(inputStream);
+        final ConfigurationState newState = new ConfigurationState(mapping);
+        configurationStateRef.set(newState);
+    }
+
     protected Map<String, String> loadMappingFile(InputStream is) throws 
IOException {
         Map<String, String> mapping = new HashMap<>();
         BufferedReader reader = new BufferedReader(new InputStreamReader(is));
-        String line = null;
+        String line;
         while ((line = reader.readLine()) != null) {
             final String[] splits = StringUtils.split(line, "\t ", 2);
             if (splits.length == 1) {
@@ -311,14 +333,8 @@ public class ReplaceTextWithMapping extends 
AbstractProcessor {
         private final int numCapturingGroups;
         private final int groupToMatch;
 
-        private final AttributeValueDecorator quotedAttributeDecorator = new 
AttributeValueDecorator() {
-            @Override
-            public String decorate(final String attributeValue) {
-                return Pattern.quote(attributeValue);
-            }
-        };
-
         private ReplaceTextCallback(ProcessContext context, FlowFile flowFile, 
int maxBufferSize) {
+            AttributeValueDecorator quotedAttributeDecorator = Pattern::quote;
             this.regex = 
context.getProperty(REGEX).evaluateAttributeExpressions(flowFile, 
quotedAttributeDecorator).getValue();
             this.flowFile = flowFile;
 
@@ -348,7 +364,7 @@ public class ReplaceTextWithMapping extends 
AbstractProcessor {
             matcher.reset();
             boolean result = matcher.find();
             if (result) {
-                StringBuffer sb = new StringBuffer();
+                StringBuilder sb = new StringBuilder();
                 do {
                     String matched = matcher.group(groupToMatch);
                     String rv = mapping.get(matched);
diff --git 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceTextWithMapping.java
 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceTextWithMapping.java
index cd53cda477b..de17c4611da 100644
--- 
a/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceTextWithMapping.java
+++ 
b/nifi-extension-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceTextWithMapping.java
@@ -19,7 +19,11 @@ package org.apache.nifi.processors.standard;
 import org.apache.nifi.util.MockFlowFile;
 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.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 import java.io.IOException;
 import java.nio.file.Files;
@@ -27,14 +31,17 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.stream.Stream;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class TestReplaceTextWithMapping {
+    private TestRunner runner;
 
-    public TestRunner getRunner() {
-        TestRunner runner = 
TestRunners.newTestRunner(ReplaceTextWithMapping.class);
+    @BeforeEach
+    public void setUp() {
+        runner = TestRunners.newTestRunner(ReplaceTextWithMapping.class);
 
         /*
          * we have to disable validation of expression language because the 
processor will
@@ -42,32 +49,37 @@ public class TestReplaceTextWithMapping {
          * the test will throw an error about the evaluation scope
          */
         runner.setValidateExpressionUsage(false);
-
-        return runner;
     }
 
-    @Test
-    public void testSimple() throws IOException {
-        final TestRunner runner = getRunner();
-        final String mappingFile = 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt").toFile().getAbsolutePath();
+    @ParameterizedTest
+    @MethodSource("simpleTestArgs")
+    public void testSimple(String mappingFile) throws IOException {
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, mappingFile);
 
         
runner.enqueue(Paths.get("src/test/resources/TestReplaceTextWithMapping/colors-without-dashes.txt"));
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are apple\n"
-                + "violets are blueberry\n"
-                + "something else is grape\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                roses are apple
+                violets are blueberry
+                something else is grape
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
+    private static Stream<Arguments> simpleTestArgs() throws IOException {
+        final Path mappingFile = 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt");
+        return Stream.of(
+                Arguments.argumentSet("File path", 
mappingFile.toFile().getAbsolutePath()),
+                Arguments.argumentSet("File contents", 
Files.readString(mappingFile))
+        );
+    }
+
     @Test
-    public void testExpressionLanguageInText() throws IOException {
-        final TestRunner runner = getRunner();
+    public void testExpressionLanguageInText() {
         final String mappingFile = 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt").toFile().getAbsolutePath();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, mappingFile);
 
@@ -77,15 +89,14 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "${foo} apple ${baz}";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = "${foo} apple ${baz}";
         assertEquals(expected, outputString);
     }
 
     @Test
-    public void testExpressionLanguageInText2() throws IOException {
-        final TestRunner runner = getRunner();
+    public void testExpressionLanguageInText2() {
         final String mappingFile = 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt").toFile().getAbsolutePath();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, mappingFile);
         runner.setProperty(ReplaceTextWithMapping.REGEX, "\\|(.*?)\\|");
@@ -97,15 +108,14 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "${foo}|apple|${baz}";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = "${foo}|apple|${baz}";
         assertEquals(expected, outputString);
     }
 
     @Test
-    public void testExpressionLanguageInText3() throws IOException {
-        final TestRunner runner = getRunner();
+    public void testExpressionLanguageInText3() {
         final String mappingFile = 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt").toFile().getAbsolutePath();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, mappingFile);
         runner.setProperty(ReplaceTextWithMapping.REGEX, ".*\\|(.*?)\\|.*");
@@ -117,15 +127,14 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "${foo}|apple|${baz}";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = "${foo}|apple|${baz}";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testWithMatchingGroupAndContext() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "-(.*?)-");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "1");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt").toFile().getAbsolutePath());
@@ -134,18 +143,18 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "-roses- are -apple-\n"
-                + "violets are -blueberry-\n"
-                + "something else is -grape-\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                -roses- are -apple-
+                violets are -blueberry-
+                something else is -grape-
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testBackReference() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "(\\S+)");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "1");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-backreference-mapping.txt").toFile().getAbsolutePath());
@@ -154,25 +163,25 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are red apple\n"
-                + "violets are blue blueberry\n"
-                + "something else is green grape\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                roses are red apple
+                violets are blue blueberry
+                something else is green grape
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testRoutesToFailureIfTooLarge() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "[123]");
         runner.setProperty(ReplaceTextWithMapping.MAX_BUFFER_SIZE, "1 b");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-mapping.txt").toFile().getAbsolutePath());
 
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("abc", "Good");
-        
runner.enqueue(Paths.get("src/test/resources/TestReplaceTextWithMapping/colors.txt"));
+        
runner.enqueue(Paths.get("src/test/resources/TestReplaceTextWithMapping/colors.txt"),
 attributes);
 
         runner.run();
 
@@ -181,7 +190,6 @@ public class TestReplaceTextWithMapping {
 
     @Test
     public void testBackReferenceWithTooLargeOfIndexIsEscaped() throws 
IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "-(.*?)-");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "1");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-excessive-backreference-mapping.txt").toFile().getAbsolutePath());
@@ -190,18 +198,18 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "-roses- are -red$2 apple-\n"
-                + "violets are -blue$2 blueberry-\n"
-                + "something else is -green$2 grape-\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                -roses- are -red$2 apple-
+                violets are -blue$2 blueberry-
+                something else is -green$2 grape-
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testBackReferenceWithTooLargeOfIndexIsEscapedSimple() throws 
IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE,
                 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-excessive-backreference-mapping-simple.txt").toFile().getAbsolutePath());
 
@@ -209,18 +217,18 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are red$1 apple\n"
-                + "violets are blue$1 blueberry\n"
-                + "something else is green$1 grape\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                roses are red$1 apple
+                violets are blue$1 blueberry
+                something else is green$1 grape
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testBackReferenceWithInvalidReferenceIsEscaped() throws 
IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "(\\S+)");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "1");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-invalid-backreference-mapping.txt").toFile().getAbsolutePath());
@@ -229,18 +237,18 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are red$d apple\n"
-                + "violets are blue$d blueberry\n"
-                + "something else is green$d grape\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                roses are red$d apple
+                violets are blue$d blueberry
+                something else is green$d grape
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testEscapingDollarSign() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "-(.*?)-");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "1");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-escaped-dollar-mapping.txt").toFile().getAbsolutePath());
@@ -249,72 +257,72 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "-roses- are -$1 apple-\n"
-                + "violets are -$1 blueberry-\n"
-                + "something else is -$1 grape-\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                -roses- are -$1 apple-
+                violets are -$1 blueberry-
+                something else is -$1 grape-
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testEscapingDollarSignSimple() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-escaped-dollar-mapping.txt").toFile().getAbsolutePath());
 
         
runner.enqueue(Paths.get("src/test/resources/TestReplaceTextWithMapping/colors-without-dashes.txt"));
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are $1 apple\n"
-                + "violets are $1 blueberry\n"
-                + "something else is $1 grape\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                roses are $1 apple
+                violets are $1 blueberry
+                something else is $1 grape
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testReplaceWithEmptyString() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-blank-mapping.txt").toFile().getAbsolutePath());
 
         
runner.enqueue(Paths.get("src/test/resources/TestReplaceTextWithMapping/colors-without-dashes.txt"));
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are \n"
-                + "violets are \n"
-                + "something else is \n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = """
+                roses are\s
+                violets are\s
+                something else is\s
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testReplaceWithSpaceInString() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-space-mapping.txt").toFile().getAbsolutePath());
 
         
runner.enqueue(Paths.get("src/test/resources/TestReplaceTextWithMapping/colors-without-dashes.txt"));
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = "roses are really red\n"
-                + "violets are super blue\n"
-                + "something else is ultra green\n"
-                + "I'm not good at writing poems";
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        String expected = """
+                roses are really red
+                violets are super blue
+                something else is ultra green
+                I'm not good at writing poems""";
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testWithNoMatch() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "-(.*?)-");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "1");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-fruit-no-match-mapping.txt").toFile().getAbsolutePath());
@@ -324,24 +332,20 @@ public class TestReplaceTextWithMapping {
         runner.run();
 
         
runner.assertAllFlowFilesTransferred(ReplaceTextWithMapping.REL_SUCCESS, 1);
-        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).get(0);
-        String outputString = new String(out.toByteArray());
-        String expected = new String(Files.readAllBytes(path));
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceTextWithMapping.REL_SUCCESS).getFirst();
+        final String outputString = out.getContent();
+        final String expected = Files.readString(path);
         assertEquals(expected, outputString);
     }
 
     @Test
     public void testMatchingGroupForLookupKeyTooLarge() throws IOException {
-        final TestRunner runner = getRunner();
         runner.setProperty(ReplaceTextWithMapping.REGEX, "-(.*?)-");
         
runner.setProperty(ReplaceTextWithMapping.MATCHING_GROUP_FOR_LOOKUP_KEY, "2");
         runner.setProperty(ReplaceTextWithMapping.MAPPING_FILE, 
Paths.get("src/test/resources/TestReplaceTextWithMapping/color-mapping.txt").toFile().getAbsolutePath());
 
         final Path path = 
Paths.get("src/test/resources/TestReplaceTextWithMapping/colors.txt");
         runner.enqueue(path);
-        assertThrows(AssertionError.class, () -> {
-            runner.run();
-        });
+        assertThrows(AssertionError.class, runner::run);
     }
-
 }


Reply via email to