Repository: incubator-nifi
Updated Branches:
  refs/heads/develop 220ec94c0 -> a7b826ae2


NIFI-430: Added isExpressionLanguageSupported and isExpressionLanguagePresent 
methods to ValidationContext


Project: http://git-wip-us.apache.org/repos/asf/incubator-nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-nifi/commit/2429e054
Tree: http://git-wip-us.apache.org/repos/asf/incubator-nifi/tree/2429e054
Diff: http://git-wip-us.apache.org/repos/asf/incubator-nifi/diff/2429e054

Branch: refs/heads/develop
Commit: 2429e0540fcce90bfd2ced450d4cd124cff3a6b4
Parents: 220ec94
Author: Mark Payne <[email protected]>
Authored: Mon Mar 23 15:02:03 2015 -0400
Committer: Mark Payne <[email protected]>
Committed: Mon Mar 23 15:02:03 2015 -0400

----------------------------------------------------------------------
 .../AbstractConfigurableComponent.java          |  5 +-
 .../nifi/components/ValidationContext.java      | 19 +++++
 .../nifi/processor/util/StandardValidators.java | 86 +++++++++++++++++++-
 .../processor/util/TestStandardValidators.java  | 34 ++++----
 .../apache/nifi/util/MockValidationContext.java | 27 ++++++
 .../processor/StandardValidationContext.java    | 25 +++++-
 6 files changed, 175 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2429e054/nifi/nifi-api/src/main/java/org/apache/nifi/components/AbstractConfigurableComponent.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-api/src/main/java/org/apache/nifi/components/AbstractConfigurableComponent.java
 
b/nifi/nifi-api/src/main/java/org/apache/nifi/components/AbstractConfigurableComponent.java
index f4bea5e..6736788 100644
--- 
a/nifi/nifi-api/src/main/java/org/apache/nifi/components/AbstractConfigurableComponent.java
+++ 
b/nifi/nifi-api/src/main/java/org/apache/nifi/components/AbstractConfigurableComponent.java
@@ -187,9 +187,8 @@ public abstract class AbstractConfigurableComponent 
implements ConfigurableCompo
     }
 
     public final List<PropertyDescriptor> getPropertyDescriptors() {
-        final List<PropertyDescriptor> descriptors = new ArrayList<>();
-        descriptors.addAll(getSupportedPropertyDescriptors());
-        return descriptors;
+        final List<PropertyDescriptor> supported = 
getSupportedPropertyDescriptors();
+        return supported == null ? Collections.<PropertyDescriptor>emptyList() 
:new ArrayList<>(supported);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2429e054/nifi/nifi-api/src/main/java/org/apache/nifi/components/ValidationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-api/src/main/java/org/apache/nifi/components/ValidationContext.java 
b/nifi/nifi-api/src/main/java/org/apache/nifi/components/ValidationContext.java
index e50f002..b7b72c5 100644
--- 
a/nifi/nifi-api/src/main/java/org/apache/nifi/components/ValidationContext.java
+++ 
b/nifi/nifi-api/src/main/java/org/apache/nifi/components/ValidationContext.java
@@ -79,4 +79,23 @@ public interface ValidationContext {
      * @return
      */
     String getAnnotationData();
+    
+    /**
+     * Returns <code>true</code> if the given value contains a NiFi Expression 
Language expression,
+     * <code>false</code> if it does not
+     * 
+     * @param value
+     * @return
+     */
+    boolean isExpressionLanguagePresent(String value);
+    
+    /**
+     * Returns <code>true</code> if the property with the given name supports 
the NiFi Expression Language,
+     * <code>false</code> if the property does not support the Expression 
Language or is not a valid property
+     * name
+     * 
+     * @param propertyName
+     * @return
+     */
+    boolean isExpressionLanguageSupported(String propertyName);
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2429e054/nifi/nifi-commons/nifi-processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
 
b/nifi/nifi-commons/nifi-processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
index c9ae609..62fecf2 100644
--- 
a/nifi/nifi-commons/nifi-processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
+++ 
b/nifi/nifi-commons/nifi-processor-utilities/src/main/java/org/apache/nifi/processor/util/StandardValidators.java
@@ -46,7 +46,10 @@ public class StandardValidators {
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
             final ValidationResult.Builder builder = new 
ValidationResult.Builder();
             builder.subject(subject).input(input);
-
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return builder.valid(true).explanation("Contains Expression 
Language").build();
+            }
+            
             try {
                 FlowFile.KeyValidator.validateKey(input);
                 builder.valid(true);
@@ -63,7 +66,10 @@ public class StandardValidators {
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
             final ValidationResult.Builder builder = new 
ValidationResult.Builder();
             builder.subject("Property Name").input(subject);
-
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return builder.valid(true).explanation("Contains Expression 
Language").build();
+            }
+            
             try {
                 FlowFile.KeyValidator.validateKey(subject);
                 builder.valid(true);
@@ -78,6 +84,10 @@ public class StandardValidators {
     public static final Validator POSITIVE_INTEGER_VALIDATOR = new Validator() 
{
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+            
             String reason = null;
             try {
                 final int intVal = Integer.parseInt(value);
@@ -96,6 +106,10 @@ public class StandardValidators {
     public static final Validator POSITIVE_LONG_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             String reason = null;
             try {
                 final long longVal = Long.parseLong(value);
@@ -123,6 +137,10 @@ public class StandardValidators {
     public static final Validator BOOLEAN_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             final boolean valid = "true".equalsIgnoreCase(value) || 
"false".equalsIgnoreCase(value);
             final String explanation = valid ? null : "Value must be 'true' or 
'false'";
             return new 
ValidationResult.Builder().subject(subject).input(value).valid(valid).explanation(explanation).build();
@@ -132,6 +150,10 @@ public class StandardValidators {
     public static final Validator INTEGER_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             String reason = null;
             try {
                 Integer.parseInt(value);
@@ -146,6 +168,10 @@ public class StandardValidators {
     public static final Validator LONG_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             String reason = null;
             try {
                 Long.parseLong(value);
@@ -160,6 +186,10 @@ public class StandardValidators {
     public static final Validator NON_NEGATIVE_INTEGER_VALIDATOR = new 
Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             String reason = null;
             try {
                 final int intVal = Integer.parseInt(value);
@@ -178,6 +208,10 @@ public class StandardValidators {
     public static final Validator CHARACTER_SET_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             String reason = null;
             try {
                 if (!Charset.isSupported(value)) {
@@ -201,6 +235,10 @@ public class StandardValidators {
     public static final Validator URI_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+            }
+
             try {
                 new URI(input);
                 return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Valid 
URI").valid(true).build();
@@ -215,6 +253,10 @@ public class StandardValidators {
     public static final Validator ATTRIBUTE_EXPRESSION_LANGUAGE_VALIDATOR = 
new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+            }
+
             try {
                 context.newExpressionLanguageCompiler().compile(input);
                 return new 
ValidationResult.Builder().subject(subject).input(input).valid(true).build();
@@ -228,6 +270,10 @@ public class StandardValidators {
     public static final Validator TIME_PERIOD_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+            }
+
             if (input == null) {
                 return new 
ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Time
 Period cannot be null").build();
             }
@@ -242,6 +288,10 @@ public class StandardValidators {
     public static final Validator DATA_SIZE_VALIDATOR = new Validator() {
         @Override
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+            }
+
             if (input == null) {
                 return new 
ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Data
 Size cannot be null").build();
             }
@@ -268,6 +318,10 @@ public class StandardValidators {
         return new Validator() {
             @Override
             public ValidationResult validate(final String subject, final 
String input, final ValidationContext context) {
+                if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                    return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+                }
+
                 try {
                     final String evaluatedInput = 
context.newPropertyValue(input).evaluateAttributeExpressions().getValue();
                     new URL(evaluatedInput);
@@ -292,6 +346,10 @@ public class StandardValidators {
 
             @Override
             public ValidationResult validate(final String subject, final 
String input, final ValidationContext context) {
+                if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                    return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+                }
+
                 final ValidationResult vr = 
DATA_SIZE_VALIDATOR.validate(subject, input, context);
                 if(!vr.isValid()){
                     return vr;
@@ -313,6 +371,10 @@ public class StandardValidators {
         return new Validator() {
             @Override
             public ValidationResult validate(final String subject, final 
String input, final ValidationContext context) {
+                if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                    return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+                }
+
                 final boolean matches = pattern.matcher(input).matches();
                 return new ValidationResult.Builder()
                         .input(input)
@@ -394,6 +456,10 @@ public class StandardValidators {
         return new Validator() {
             @Override
             public ValidationResult validate(final String subject, final 
String input, final ValidationContext context) {
+                if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                    return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+                }
+
                 String reason = null;
                 try {
                     final long longVal = Long.parseLong(input);
@@ -436,6 +502,10 @@ public class StandardValidators {
 
         @Override
         public ValidationResult validate(final String subject, final String 
input, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+            }
+
             if (input == null) {
                 return new 
ValidationResult.Builder().subject(subject).input(input).valid(false).explanation("Time
 Period cannot be null").build();
             }
@@ -469,6 +539,10 @@ public class StandardValidators {
 
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             final String substituted;
             if (allowEL) {
                 try {
@@ -500,6 +574,10 @@ public class StandardValidators {
 
         @Override
         public ValidationResult validate(final String subject, final String 
value, final ValidationContext context) {
+            if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(value) ) {
+                return new 
ValidationResult.Builder().subject(subject).input(value).explanation("Expression
 Language Present").valid(true).build();
+            }
+
             final String substituted;
             if (allowEL) {
                 try {
@@ -541,6 +619,10 @@ public class StandardValidators {
         return new Validator() {
             @Override
             public ValidationResult validate(final String subject, final 
String input, final ValidationContext context) {
+                if ( context.isExpressionLanguageSupported(subject) && 
context.isExpressionLanguagePresent(input) ) {
+                    return new 
ValidationResult.Builder().subject(subject).input(input).explanation("Expression
 Language Present").build();
+                }
+
                 final ControllerService svc = 
context.getControllerServiceLookup().getControllerService(input);
 
                 if (svc == null) {

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2429e054/nifi/nifi-commons/nifi-processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-commons/nifi-processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java
 
b/nifi/nifi-commons/nifi-processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java
index 70b8d21..a8f4bae 100644
--- 
a/nifi/nifi-commons/nifi-processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java
+++ 
b/nifi/nifi-commons/nifi-processor-utilities/src/test/java/org/apache/nifi/processor/util/TestStandardValidators.java
@@ -21,10 +21,11 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.concurrent.TimeUnit;
 
+import org.apache.nifi.components.ValidationContext;
 import org.apache.nifi.components.ValidationResult;
 import org.apache.nifi.components.Validator;
-
 import org.junit.Test;
+import org.mockito.Mockito;
 
 public class TestStandardValidators {
 
@@ -33,22 +34,24 @@ public class TestStandardValidators {
         Validator val = StandardValidators.createTimePeriodValidator(1L, 
TimeUnit.SECONDS, Long.MAX_VALUE, TimeUnit.NANOSECONDS);
         ValidationResult vr;
 
-        vr = val.validate("TimePeriodTest", "0 sense made", null);
+        final ValidationContext validationContext = 
Mockito.mock(ValidationContext.class);
+        
+        vr = val.validate("TimePeriodTest", "0 sense made", validationContext);
         assertFalse(vr.isValid());
 
-        vr = val.validate("TimePeriodTest", null, null);
+        vr = val.validate("TimePeriodTest", null, validationContext);
         assertFalse(vr.isValid());
 
-        vr = val.validate("TimePeriodTest", "0 secs", null);
+        vr = val.validate("TimePeriodTest", "0 secs", validationContext);
         assertFalse(vr.isValid());
 
-        vr = val.validate("TimePeriodTest", "999 millis", null);
+        vr = val.validate("TimePeriodTest", "999 millis", validationContext);
         assertFalse(vr.isValid());
 
-        vr = val.validate("TimePeriodTest", "999999999 nanos", null);
+        vr = val.validate("TimePeriodTest", "999999999 nanos", 
validationContext);
         assertFalse(vr.isValid());
 
-        vr = val.validate("TimePeriodTest", "1 sec", null);
+        vr = val.validate("TimePeriodTest", "1 sec", validationContext);
         assertTrue(vr.isValid());
     }
     
@@ -57,28 +60,29 @@ public class TestStandardValidators {
         Validator val = StandardValidators.createDataSizeBoundsValidator(100, 
1000);
         ValidationResult vr; 
         
-        vr = val.validate("DataSizeBounds", "5 GB", null);
+        final ValidationContext validationContext = 
Mockito.mock(ValidationContext.class);
+        vr = val.validate("DataSizeBounds", "5 GB", validationContext);
         assertFalse(vr.isValid());
         
-        vr = val.validate("DataSizeBounds", "0 B", null);
+        vr = val.validate("DataSizeBounds", "0 B", validationContext);
         assertFalse(vr.isValid());
 
-        vr = val.validate("DataSizeBounds", "99 B", null);
+        vr = val.validate("DataSizeBounds", "99 B", validationContext);
         assertFalse(vr.isValid());
         
-        vr = val.validate("DataSizeBounds", "100 B", null);
+        vr = val.validate("DataSizeBounds", "100 B", validationContext);
         assertTrue(vr.isValid());
 
-        vr = val.validate("DataSizeBounds", "999 B", null);
+        vr = val.validate("DataSizeBounds", "999 B", validationContext);
         assertTrue(vr.isValid());
 
-        vr = val.validate("DataSizeBounds", "1000 B", null);
+        vr = val.validate("DataSizeBounds", "1000 B", validationContext);
         assertTrue(vr.isValid());
         
-        vr = val.validate("DataSizeBounds", "1001 B", null);
+        vr = val.validate("DataSizeBounds", "1001 B", validationContext);
         assertFalse(vr.isValid());
         
-        vr = val.validate("DataSizeBounds", "water", null);
+        vr = val.validate("DataSizeBounds", "water", validationContext);
         assertFalse(vr.isValid());
         
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2429e054/nifi/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java 
b/nifi/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
index fd0b6cd..c00386e 100644
--- 
a/nifi/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
+++ 
b/nifi/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
@@ -16,9 +16,13 @@
  */
 package org.apache.nifi.util;
 
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.nifi.attribute.expression.language.Query;
+import org.apache.nifi.attribute.expression.language.Query.Range;
 import 
org.apache.nifi.attribute.expression.language.StandardExpressionLanguageCompiler;
 import org.apache.nifi.components.PropertyDescriptor;
 import org.apache.nifi.components.PropertyValue;
@@ -30,9 +34,16 @@ import org.apache.nifi.expression.ExpressionLanguageCompiler;
 public class MockValidationContext implements ValidationContext, 
ControllerServiceLookup {
 
     private final MockProcessContext context;
+    private final Map<String, Boolean> expressionLanguageSupported;
 
     public MockValidationContext(final MockProcessContext processContext) {
         this.context = processContext;
+        
+        final Map<PropertyDescriptor, String> properties = 
processContext.getProperties();
+        expressionLanguageSupported = new HashMap<>(properties.size());
+        for ( final PropertyDescriptor descriptor : properties.keySet() ) {
+            expressionLanguageSupported.put(descriptor.getName(), 
descriptor.isExpressionLanguageSupported());
+        }
     }
 
     @Override
@@ -90,4 +101,20 @@ public class MockValidationContext implements 
ValidationContext, ControllerServi
     public boolean isControllerServiceEnabled(final ControllerService service) 
{
         return context.isControllerServiceEnabled(service);
     }
+    
+    @Override
+    public boolean isExpressionLanguagePresent(final String value) {
+        if ( value == null ) {
+            return false;
+        }
+        
+        final List<Range> elRanges = Query.extractExpressionRanges(value);
+        return (elRanges != null && !elRanges.isEmpty());
+    }
+    
+    @Override
+    public boolean isExpressionLanguageSupported(final String propertyName) {
+        final Boolean supported = 
expressionLanguageSupported.get(propertyName);
+        return Boolean.TRUE.equals(supported);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2429e054/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/StandardValidationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/StandardValidationContext.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/StandardValidationContext.java
index b216572..99322be 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/StandardValidationContext.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/processor/StandardValidationContext.java
@@ -18,10 +18,12 @@ package org.apache.nifi.processor;
 
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.nifi.attribute.expression.language.PreparedQuery;
 import org.apache.nifi.attribute.expression.language.Query;
+import org.apache.nifi.attribute.expression.language.Query.Range;
 import 
org.apache.nifi.attribute.expression.language.StandardExpressionLanguageCompiler;
 import org.apache.nifi.components.PropertyDescriptor;
 import org.apache.nifi.components.PropertyValue;
@@ -37,6 +39,7 @@ public class StandardValidationContext implements 
ValidationContext {
     private final ControllerServiceProvider controllerServiceProvider;
     private final Map<PropertyDescriptor, String> properties;
     private final Map<PropertyDescriptor, PreparedQuery> preparedQueries;
+    private final Map<String, Boolean> expressionLanguageSupported;
     private final String annotationData;
 
     public StandardValidationContext(final ControllerServiceProvider 
controllerServiceProvider, final Map<PropertyDescriptor, String> properties, 
final String annotationData) {
@@ -44,7 +47,7 @@ public class StandardValidationContext implements 
ValidationContext {
         this.properties = new HashMap<>(properties);
         this.annotationData = annotationData;
 
-        preparedQueries = new HashMap<>();
+        preparedQueries = new HashMap<>(properties.size());
         for (final Map.Entry<PropertyDescriptor, String> entry : 
properties.entrySet()) {
             final PropertyDescriptor desc = entry.getKey();
             String value = entry.getValue();
@@ -56,6 +59,10 @@ public class StandardValidationContext implements 
ValidationContext {
             preparedQueries.put(desc, pq);
         }
 
+        expressionLanguageSupported = new HashMap<>(properties.size());
+        for ( final PropertyDescriptor descriptor : properties.keySet() ) {
+            expressionLanguageSupported.put(descriptor.getName(), 
descriptor.isExpressionLanguageSupported());
+        }
     }
 
     @Override
@@ -94,4 +101,20 @@ public class StandardValidationContext implements 
ValidationContext {
     public ControllerServiceLookup getControllerServiceLookup() {
         return controllerServiceProvider;
     }
+    
+    @Override
+    public boolean isExpressionLanguagePresent(final String value) {
+        if ( value == null ) {
+            return false;
+        }
+        
+        final List<Range> elRanges = Query.extractExpressionRanges(value);
+        return (elRanges != null && !elRanges.isEmpty());
+    }
+    
+    @Override
+    public boolean isExpressionLanguageSupported(final String propertyName) {
+        final Boolean supported = 
expressionLanguageSupported.get(propertyName);
+        return Boolean.TRUE.equals(supported);
+    }
 }

Reply via email to