NIFI-993 added expression language support to GetHTTP for the filename and URL properties

Signed-off-by: Mark Payne <markap14@hotmail.com>
This commit is contained in:
Joseph Percivall 2015-11-09 17:55:28 -05:00 committed by Mark Payne
parent a031fb3dc6
commit d887d8fdf0
2 changed files with 44 additions and 4 deletions

View File

@ -80,6 +80,7 @@ import org.apache.nifi.annotation.lifecycle.OnStopped;
import org.apache.nifi.components.PropertyDescriptor; import org.apache.nifi.components.PropertyDescriptor;
import org.apache.nifi.components.ValidationContext; import org.apache.nifi.components.ValidationContext;
import org.apache.nifi.components.ValidationResult; import org.apache.nifi.components.ValidationResult;
import org.apache.nifi.expression.AttributeExpression;
import org.apache.nifi.flowfile.FlowFile; import org.apache.nifi.flowfile.FlowFile;
import org.apache.nifi.flowfile.attributes.CoreAttributes; import org.apache.nifi.flowfile.attributes.CoreAttributes;
import org.apache.nifi.logging.ProcessorLog; import org.apache.nifi.logging.ProcessorLog;
@ -117,6 +118,7 @@ public class GetHTTP extends AbstractSessionFactoryProcessor {
.name("URL") .name("URL")
.description("The URL to pull from") .description("The URL to pull from")
.required(true) .required(true)
.expressionLanguageSupported(true)
.addValidator(StandardValidators.URL_VALIDATOR) .addValidator(StandardValidators.URL_VALIDATOR)
.addValidator(StandardValidators.createRegexMatchingValidator(Pattern.compile("https?\\://.*"))) .addValidator(StandardValidators.createRegexMatchingValidator(Pattern.compile("https?\\://.*")))
.build(); .build();
@ -149,7 +151,8 @@ public class GetHTTP extends AbstractSessionFactoryProcessor {
public static final PropertyDescriptor FILENAME = new PropertyDescriptor.Builder() public static final PropertyDescriptor FILENAME = new PropertyDescriptor.Builder()
.name("Filename") .name("Filename")
.description("The filename to assign to the file when pulled") .description("The filename to assign to the file when pulled")
.addValidator(StandardValidators.NON_EMPTY_VALIDATOR) .expressionLanguageSupported(true)
.addValidator(StandardValidators.createAttributeExpressionLanguageValidator(AttributeExpression.ResultType.STRING))
.required(true) .required(true)
.build(); .build();
public static final PropertyDescriptor USERNAME = new PropertyDescriptor.Builder() public static final PropertyDescriptor USERNAME = new PropertyDescriptor.Builder()
@ -296,7 +299,7 @@ public class GetHTTP extends AbstractSessionFactoryProcessor {
protected Collection<ValidationResult> customValidate(final ValidationContext context) { protected Collection<ValidationResult> customValidate(final ValidationContext context) {
final Collection<ValidationResult> results = new ArrayList<>(); final Collection<ValidationResult> results = new ArrayList<>();
if (context.getProperty(URL).getValue().startsWith("https") && context.getProperty(SSL_CONTEXT_SERVICE).getValue() == null) { if (context.getProperty(URL).evaluateAttributeExpressions().getValue().startsWith("https") && context.getProperty(SSL_CONTEXT_SERVICE).getValue() == null) {
results.add(new ValidationResult.Builder() results.add(new ValidationResult.Builder()
.explanation("URL is set to HTTPS protocol but no SSLContext has been specified") .explanation("URL is set to HTTPS protocol but no SSLContext has been specified")
.valid(false) .valid(false)
@ -344,7 +347,7 @@ public class GetHTTP extends AbstractSessionFactoryProcessor {
} }
// get the URL // get the URL
final String url = context.getProperty(URL).getValue(); final String url = context.getProperty(URL).evaluateAttributeExpressions().getValue();
final URI uri; final URI uri;
String source = url; String source = url;
try { try {
@ -462,7 +465,7 @@ public class GetHTTP extends AbstractSessionFactoryProcessor {
} }
FlowFile flowFile = session.create(); FlowFile flowFile = session.create();
flowFile = session.putAttribute(flowFile, CoreAttributes.FILENAME.key(), context.getProperty(FILENAME).getValue()); flowFile = session.putAttribute(flowFile, CoreAttributes.FILENAME.key(), context.getProperty(FILENAME).evaluateAttributeExpressions().getValue());
flowFile = session.putAttribute(flowFile, this.getClass().getSimpleName().toLowerCase() + ".remote.source", source); flowFile = session.putAttribute(flowFile, this.getClass().getSimpleName().toLowerCase() + ".remote.source", source);
flowFile = session.importFrom(response.getEntity().getContent(), flowFile); flowFile = session.importFrom(response.getEntity().getContent(), flowFile);

View File

@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Properties; import java.util.Properties;
import org.apache.nifi.flowfile.attributes.CoreAttributes;
import org.apache.nifi.processor.ProcessorInitializationContext; import org.apache.nifi.processor.ProcessorInitializationContext;
import org.apache.nifi.reporting.InitializationException; import org.apache.nifi.reporting.InitializationException;
import org.apache.nifi.ssl.SSLContextService; import org.apache.nifi.ssl.SSLContextService;
@ -280,6 +281,42 @@ public class TestGetHTTP {
} }
} }
@Test
public final void testExpressionLanguage() throws Exception {
// set up web service
ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(UserAgentTestingServlet.class, "/*");
// create the service
TestServer server = new TestServer();
server.addHandler(handler);
try {
server.startServer();
String destination = server.getUrl();
// set up NiFi mock controller
controller = TestRunners.newTestRunner(GetHTTP.class);
controller.setProperty(GetHTTP.CONNECTION_TIMEOUT, "5 secs");
controller.setProperty(GetHTTP.URL, destination+"/test_${literal(1)}.pdf");
controller.setProperty(GetHTTP.FILENAME, "test_${now():format('yyyy/MM/dd_HH:mm:ss')}");
controller.setProperty(GetHTTP.ACCEPT_CONTENT_TYPE, "application/json");
controller.setProperty(GetHTTP.USER_AGENT, "testUserAgent");
controller.run();
controller.assertTransferCount(GetHTTP.REL_SUCCESS, 1);
MockFlowFile response = controller.getFlowFilesForRelationship(GetHTTP.REL_SUCCESS).get(0);
response.assertAttributeEquals("gethttp.remote.source","localhost");
String fileName = response.getAttribute(CoreAttributes.FILENAME.key());
assertTrue(fileName.matches("test_\\d\\d\\d\\d/\\d\\d/\\d\\d_\\d\\d:\\d\\d:\\d\\d"));
// shutdown web service
} finally {
server.shutdownServer();
}
}
private Map<String, String> getSslProperties() { private Map<String, String> getSslProperties() {
Map<String, String> props = new HashMap<String, String>(); Map<String, String> props = new HashMap<String, String>();
props.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks"); props.put(StandardSSLContextService.KEYSTORE.getName(), "src/test/resources/localhost-ks.jks");