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

mthomsen 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 29ea872  NIFI-8042: Fixed bug that was escaping Expression Language 
references for use in a Regular Expression (i.e., Pattern.quote) even though it 
wasn't being used in a Regular Expression
29ea872 is described below

commit 29ea872f2cd06a61db36785caba027eb9699e744
Author: Mark Payne <[email protected]>
AuthorDate: Tue Nov 24 14:46:49 2020 -0500

    NIFI-8042: Fixed bug that was escaping Expression Language references for 
use in a Regular Expression (i.e., Pattern.quote) even though it wasn't being 
used in a Regular Expression
    
    This closes #4685
    
    Signed-off-by: Mike Thomsen <[email protected]>
---
 .../nifi/processors/standard/ReplaceText.java      |  3 +-
 .../nifi/processors/standard/TestReplaceText.java  | 61 ++++++++++++++++++++++
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceText.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceText.java
index 58f4f59..c3d87f1 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceText.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceText.java
@@ -602,8 +602,7 @@ public class ReplaceText extends AbstractProcessor {
         @Override
         public FlowFile replace(FlowFile flowFile, final ProcessSession 
session, final ProcessContext context, final String evaluateMode, final Charset 
charset, final int maxBufferSize) {
             final String replacementValue = 
context.getProperty(REPLACEMENT_VALUE).evaluateAttributeExpressions(flowFile).getValue();
-            final AttributeValueDecorator quotedAttributeDecorator = 
Pattern::quote;
-            final String searchValue = 
context.getProperty(SEARCH_VALUE).evaluateAttributeExpressions(flowFile, 
quotedAttributeDecorator).getValue();
+            final String searchValue = 
context.getProperty(SEARCH_VALUE).evaluateAttributeExpressions(flowFile).getValue();
 
             if (evaluateMode.equalsIgnoreCase(ENTIRE_TEXT)) {
                 final int flowFileSize = (int) flowFile.getSize();
diff --git 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceText.java
 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceText.java
index b3200a8..9dac00f 100644
--- 
a/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceText.java
+++ 
b/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceText.java
@@ -31,6 +31,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.regex.Pattern;
@@ -54,6 +55,66 @@ public class TestReplaceText {
     }
 
     @Test
+    public void testLiteralReplaceWithExpressionLanguageInSearchEntireText() {
+        final TestRunner runner = getRunner();
+        runner.enqueue("Me, you, and the other", 
Collections.singletonMap("search.value", "you, and"));
+        runner.setProperty(ReplaceText.SEARCH_VALUE, "Me, ${search.value}");
+        runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "\"Replacement\"");
+        runner.setProperty(ReplaceText.EVALUATION_MODE, 
ReplaceText.ENTIRE_TEXT);
+        runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, 
ReplaceText.LITERAL_REPLACE.getValue());
+        runner.run();
+
+        runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1);
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0);
+        out.assertContentEquals("\"Replacement\" the other");
+    }
+
+    @Test
+    public void 
testLiteralReplaceWithExpressionLanguageInReplacementEntireText() {
+        final TestRunner runner = getRunner();
+        runner.enqueue("Me, you, and the other", 
Collections.singletonMap("replacement.value", "us"));
+        runner.setProperty(ReplaceText.SEARCH_VALUE, "Me, you,");
+        runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "With 
${replacement.value}");
+        runner.setProperty(ReplaceText.EVALUATION_MODE, 
ReplaceText.ENTIRE_TEXT);
+        runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, 
ReplaceText.LITERAL_REPLACE.getValue());
+        runner.run();
+
+        runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1);
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0);
+        out.assertContentEquals("With us and the other");
+    }
+
+    @Test
+    public void testLiteralReplaceWithExpressionLanguageInSearchLineByLine() {
+        final TestRunner runner = getRunner();
+        runner.enqueue("Me, you, and the other", 
Collections.singletonMap("search.value", "you, and"));
+        runner.setProperty(ReplaceText.SEARCH_VALUE, "Me, ${search.value}");
+        runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "\"Replacement\"");
+        runner.setProperty(ReplaceText.EVALUATION_MODE, 
ReplaceText.LINE_BY_LINE);
+        runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, 
ReplaceText.LITERAL_REPLACE.getValue());
+        runner.run();
+
+        runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1);
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0);
+        out.assertContentEquals("\"Replacement\" the other");
+    }
+
+    @Test
+    public void 
testLiteralReplaceWithExpressionLanguageInReplacementLineByLine() {
+        final TestRunner runner = getRunner();
+        runner.enqueue("Me, you, and the other", 
Collections.singletonMap("replacement.value", "us"));
+        runner.setProperty(ReplaceText.SEARCH_VALUE, "Me, you,");
+        runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "With 
${replacement.value}");
+        runner.setProperty(ReplaceText.EVALUATION_MODE, 
ReplaceText.LINE_BY_LINE);
+        runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, 
ReplaceText.LITERAL_REPLACE.getValue());
+        runner.run();
+
+        runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1);
+        final MockFlowFile out = 
runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0);
+        out.assertContentEquals("With us and the other");
+    }
+
+    @Test
     public void testConfigurationCornerCase() throws IOException {
         final TestRunner runner = getRunner();
         runner.run();

Reply via email to