NIFI-2952 Fixed search value validation in ReplaceText

This closes: #1378

Signed-off-by: Andre F de Miranda <trixpan@users.noreply.github.com>
This commit is contained in:
Pierre Villard 2016-12-30 17:45:14 +01:00 committed by Andre F de Miranda
parent 61c799d88b
commit 02d38b55bf
2 changed files with 58 additions and 1 deletions

View File

@ -24,6 +24,7 @@ import java.io.OutputStream;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -44,6 +45,8 @@ import org.apache.nifi.annotation.documentation.CapabilityDescription;
import org.apache.nifi.annotation.documentation.Tags; import org.apache.nifi.annotation.documentation.Tags;
import org.apache.nifi.components.AllowableValue; import org.apache.nifi.components.AllowableValue;
import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.components.ValidationContext;
import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.components.Validator; import org.apache.nifi.components.Validator;
import org.apache.nifi.expression.AttributeValueDecorator; import org.apache.nifi.expression.AttributeValueDecorator;
import org.apache.nifi.flowfile.FlowFile; import org.apache.nifi.flowfile.FlowFile;
@ -110,7 +113,7 @@ public class ReplaceText extends AbstractProcessor {
.displayName("Search Value") .displayName("Search Value")
.description("The Search Value to search for in the FlowFile content. Only used for 'Literal Replace' and 'Regex Replace' matching strategies") .description("The Search Value to search for in the FlowFile content. Only used for 'Literal Replace' and 'Regex Replace' matching strategies")
.required(true) .required(true)
.addValidator(StandardValidators.createRegexValidator(0, Integer.MAX_VALUE, true)) .addValidator(Validator.VALID)
.expressionLanguageSupported(true) .expressionLanguageSupported(true)
.defaultValue(DEFAULT_REGEX) .defaultValue(DEFAULT_REGEX)
.build(); .build();
@ -201,6 +204,32 @@ public class ReplaceText extends AbstractProcessor {
return relationships; return relationships;
} }
@Override
protected Collection<ValidationResult> customValidate(ValidationContext validationContext) {
final List<ValidationResult> errors = new ArrayList<>(super.customValidate(validationContext));
switch (validationContext.getProperty(REPLACEMENT_STRATEGY).getValue()) {
case literalReplaceValue:
errors.add(StandardValidators.NON_EMPTY_VALIDATOR
.validate(SEARCH_VALUE.getName(), validationContext.getProperty(SEARCH_VALUE).getValue(), validationContext));
break;
case regexReplaceValue:
errors.add(StandardValidators.createRegexValidator(0, Integer.MAX_VALUE, true)
.validate(SEARCH_VALUE.getName(), validationContext.getProperty(SEARCH_VALUE).getValue(), validationContext));
break;
case appendValue:
case prependValue:
case alwaysReplace:
default:
// nothing to check, search value is not used
break;
}
return errors;
}
@Override @Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException { public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
final List<FlowFile> flowFiles = session.get(FlowFileFilters.newSizeBasedFilter(1, DataUnit.MB, 100)); final List<FlowFile> flowFiles = session.get(FlowFileFilters.newSizeBasedFilter(1, DataUnit.MB, 100));

View File

@ -1166,6 +1166,34 @@ public class TestReplaceText {
runner.run(); runner.run();
} }
@Test
public void testProcessorConfigurationRegexNotValid() throws IOException {
final TestRunner runner = TestRunners.newTestRunner(new ReplaceText());
runner.setProperty(ReplaceText.SEARCH_VALUE, "(?<!\\),*");
runner.setProperty(ReplaceText.REPLACEMENT_VALUE, "hello");
runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.REGEX_REPLACE);
runner.setProperty(ReplaceText.EVALUATION_MODE, ReplaceText.ENTIRE_TEXT);
runner.assertNotValid();
runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.LITERAL_REPLACE);
runner.assertValid();
runner.enqueue("(?<!\\),*".getBytes());
runner.run();
runner.assertAllFlowFilesTransferred(ReplaceText.REL_SUCCESS, 1);
final MockFlowFile out = runner.getFlowFilesForRelationship(ReplaceText.REL_SUCCESS).get(0);
out.assertContentEquals("hello");
runner.setProperty(ReplaceText.SEARCH_VALUE, "");
runner.assertNotValid();
runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.APPEND);
runner.assertValid();
runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.PREPEND);
runner.assertValid();
runner.setProperty(ReplaceText.REPLACEMENT_STRATEGY, ReplaceText.ALWAYS_REPLACE);
runner.assertValid();
}
private String translateNewLines(final File file) throws IOException { private String translateNewLines(final File file) throws IOException {
return translateNewLines(file.toPath()); return translateNewLines(file.toPath());
} }