NIFI-2752 Correct ReplaceText default pattern and unit tests (0.x) Signed-off-by: Mike Moser <mose...@apache.org>
This closes #1732. Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/2328d1b0 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/2328d1b0 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/2328d1b0 Branch: refs/heads/support/nifi-0.7.x Commit: 2328d1b0f39cff30eadfa97408c6f1d8d995456f Parents: d38a324 Author: Joe Skora <jsk...@apache.org> Authored: Tue May 2 13:14:28 2017 -0400 Committer: Mike Moser <mose...@apache.org> Committed: Tue May 2 18:53:59 2017 +0000 ---------------------------------------------------------------------- .../nifi/processors/standard/ReplaceText.java | 9 +-- .../processors/standard/TestReplaceText.java | 60 +++++++++++++++++++- 2 files changed, 60 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/2328d1b0/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/main/java/org/apache/nifi/processors/standard/ReplaceText.java ---------------------------------------------------------------------- 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 1df7b91..61c5f1f 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 @@ -84,7 +84,7 @@ public class ReplaceText extends AbstractProcessor { public static final String literalReplaceValue = "Literal Replace"; public static final String alwaysReplace = "Always Replace"; private static final Pattern backReferencePattern = Pattern.compile("\\$(\\d+)"); - private static final String DEFAULT_REGEX = "(?s:^.*$)"; + private static final String DEFAULT_REGEX = "(?s)(^.*$)"; private static final String DEFAULT_REPLACEMENT_VALUE = "$1"; // Prepend and Append will just insert the replacement value at the beginning or end @@ -214,13 +214,6 @@ public class ReplaceText extends AbstractProcessor { String unsubstitutedReplacement = context.getProperty(REPLACEMENT_VALUE).getValue(); final String replacementStrategy = context.getProperty(REPLACEMENT_STRATEGY).getValue(); - if (replacementStrategy.equalsIgnoreCase(regexReplaceValue) && unsubstitutedRegex.equals(DEFAULT_REGEX) && unsubstitutedReplacement.equals(DEFAULT_REPLACEMENT_VALUE)) { - // This pattern says replace content with itself. We can highly optimize this process by simply transferring - // all FlowFiles to the 'success' relationship - session.transfer(flowFiles, REL_SUCCESS); - return; - } - final Charset charset = Charset.forName(context.getProperty(CHARACTER_SET).getValue()); final int maxBufferSize = context.getProperty(MAX_BUFFER_SIZE).asDataSize(DataUnit.B).intValue(); http://git-wip-us.apache.org/repos/asf/nifi/blob/2328d1b0/nifi-nar-bundles/nifi-standard-bundle/nifi-standard-processors/src/test/java/org/apache/nifi/processors/standard/TestReplaceText.java ---------------------------------------------------------------------- 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 a6e0971..b65bff1 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 @@ -30,10 +30,15 @@ import org.apache.nifi.util.MockFlowFile; import org.apache.nifi.util.TestRunner; import org.apache.nifi.util.TestRunners; import org.junit.Assert; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; public class TestReplaceText { + @Rule + public ExpectedException exception = ExpectedException.none(); + @Test public void testConfigurationCornerCase() throws IOException { final TestRunner runner = TestRunners.newTestRunner(new ReplaceText()); @@ -64,7 +69,7 @@ public class TestReplaceText { } @Test - public void testWithEscaped$InReplacemenmt() throws IOException { + public void testWithEscaped$InReplacement() throws IOException { final TestRunner runner = TestRunners.newTestRunner(new ReplaceText()); runner.setValidateExpressionUsage(false); runner.setProperty(ReplaceText.SEARCH_VALUE, "(?s:^.*$)"); @@ -1106,7 +1111,60 @@ public class TestReplaceText { out.assertContentEquals("abc.txt\nabc.txt\r\nabc.txt\n"); } + @Test + public void testRegexWithBadCaptureGroup() throws IOException { + // Test the old Default Regex and with a custom Replacement Value that should fail because the + // Perl regex "(?s:^.*$)" must be written "(?s)(^.*$)" in Java for there to be a capture group. + // private static final String DEFAULT_REGEX = "(?s:^.*$)"; + final TestRunner runner = TestRunners.newTestRunner(new ReplaceText()); + runner.setValidateExpressionUsage(false); + runner.setProperty(ReplaceText.SEARCH_VALUE, "(?s:^.*$)"); + runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "${'$1':toUpper()}"); // should uppercase group but there is none + runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.REGEX_REPLACE); + runner.setProperty(ReplaceText.EVALUATION_MODE, ReplaceText.ENTIRE_TEXT); + + runner.enqueue("testing\n123".getBytes()); + runner.run(); + + runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1); + final MockFlowFile out = runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0); + out.assertContentEquals(""); + } + @Test + public void testRegexWithGoodCaptureGroup() throws IOException { + // Test the new Default Regex and with a custom Replacement Values that should succeed. + final TestRunner runner = TestRunners.newTestRunner(new ReplaceText()); + runner.setValidateExpressionUsage(false); + runner.setProperty(ReplaceText.SEARCH_VALUE, "(?s)(^.*$)"); + runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "${'$1':toUpper()}"); // will uppercase group with good Java regex + runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.REGEX_REPLACE); + runner.setProperty(ReplaceText.EVALUATION_MODE, ReplaceText.ENTIRE_TEXT); + + runner.enqueue("testing\n123".getBytes()); + runner.run(); + + runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1); + final MockFlowFile out = runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0); + out.assertContentEquals("TESTING\n123"); + } + + @Test + public void testRegexNoCaptureDefaultReplacement() throws IOException { + // Test the old Default Regex and new Default Regex with the default replacement. This should fail + // because the regex does not create a capture group. + final TestRunner runner = TestRunners.newTestRunner(new ReplaceText()); + runner.setValidateExpressionUsage(false); + runner.setProperty(ReplaceText.SEARCH_VALUE, "(?s:^.*$)"); + runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "$1"); + runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.REGEX_REPLACE); + runner.setProperty(ReplaceText.EVALUATION_MODE, ReplaceText.ENTIRE_TEXT); + + exception.expect(AssertionError.class); + exception.expectMessage("java.lang.IndexOutOfBoundsException: No group 1"); + runner.enqueue("testing\n123".getBytes()); + runner.run(); + } private String translateNewLines(final File file) throws IOException { return translateNewLines(file.toPath());