http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPropertyValue.java
----------------------------------------------------------------------
diff --git 
a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPropertyValue.java
 
b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPropertyValue.java
index a5c336a..4044f7a 100644
--- 
a/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPropertyValue.java
+++ 
b/nifi-commons/nifi-expression-language/src/main/java/org/apache/nifi/attribute/expression/language/StandardPropertyValue.java
@@ -26,6 +26,8 @@ import org.apache.nifi.expression.AttributeValueDecorator;
 import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.processor.DataUnit;
 import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.registry.VariableRegistry;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.apache.nifi.util.FormatUtils;
 
 public class StandardPropertyValue implements PropertyValue {
@@ -33,24 +35,27 @@ public class StandardPropertyValue implements PropertyValue 
{
     private final String rawValue;
     private final ControllerServiceLookup serviceLookup;
     private final PreparedQuery preparedQuery;
+    private final VariableRegistry variableRegistry;
 
-    public StandardPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup) {
-        this(rawValue, serviceLookup, Query.prepare(rawValue));
+    public StandardPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final VariableRegistry variableRegistry) 
{
+        this(rawValue, serviceLookup, Query.prepare(rawValue), 
variableRegistry);
     }
 
     /**
      * Constructs a new StandardPropertyValue with the given value & service 
lookup and indicates whether or not the rawValue contains any NiFi Expressions. 
If it is unknown whether or not the value
-     * contains any NiFi Expressions, the {@link 
#StandardPropertyValue(String, ControllerServiceLookup)} constructor should be 
used or <code>true</code> should be passed. However, if it is known that
-     * the value contains no NiFi Expression, that information should be 
provided so that calls to {@link #evaluateAttributeExpressions()} are much more 
efficient
-     *
+     * contains any NiFi Expressions, the {@link 
#StandardPropertyValue(String, ControllerServiceLookup, VariableRegistry)} 
constructor should be used or <code>true</code> should be passed.
+     * However, if it is known that the value contains no NiFi Expression, 
that information should be provided so that calls to {@link 
#evaluateAttributeExpressions()} are much more efficient
      * @param rawValue value
      * @param serviceLookup lookup
      * @param preparedQuery query
+     * @param variableRegistry variableRegistry
      */
-    public StandardPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final PreparedQuery preparedQuery) {
+    public StandardPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final PreparedQuery preparedQuery,
+                                 final VariableRegistry variableRegistry) {
         this.rawValue = rawValue;
         this.serviceLookup = serviceLookup;
         this.preparedQuery = preparedQuery;
+        this.variableRegistry = variableRegistry;
     }
 
     @Override
@@ -133,10 +138,12 @@ public class StandardPropertyValue implements 
PropertyValue {
         if (rawValue == null || preparedQuery == null) {
             return this;
         }
-
-        return new 
StandardPropertyValue(preparedQuery.evaluateExpressions(flowFile, 
additionalAttributes, decorator), serviceLookup, null);
+        VariableRegistry registry = 
VariableRegistryUtils.createFlowVariableRegistry(variableRegistry,flowFile,additionalAttributes);
+        return new 
StandardPropertyValue(preparedQuery.evaluateExpressions(registry,decorator), 
serviceLookup,null,registry);
     }
 
+
+
     @Override
     public String toString() {
         return rawValue;

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
----------------------------------------------------------------------
diff --git 
a/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
 
b/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
index bdd704d..3a5f587 100644
--- 
a/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
+++ 
b/nifi-commons/nifi-expression-language/src/test/groovy/org/apache/nifi/attribute/expression/language/QueryGroovyTest.groovy
@@ -18,6 +18,8 @@ package org.apache.nifi.attribute.expression.language
 
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult
 import org.apache.nifi.expression.AttributeExpression
+import org.apache.nifi.registry.VariableRegistry
+import org.apache.nifi.registry.VariableRegistryFactory
 import org.junit.After
 import org.junit.Before
 import org.junit.BeforeClass
@@ -57,6 +59,7 @@ public class QueryGroovyTest extends GroovyTestCase {
         final Map<String, String> attributes = [
                 single   : ORIGINAL_VALUE,
                 repeating: [ORIGINAL_VALUE].multiply(n).join(" ")]
+        final VariableRegistry variableRegistry = 
VariableRegistryFactory.getInstance(attributes)
         logger.info("Attributes: ${attributes}")
 
         final String REPLACEMENT_VALUE = "Goodbye Planet"
@@ -75,10 +78,10 @@ public class QueryGroovyTest extends GroovyTestCase {
         Query replaceRepeatingQuery = 
Query.compile(REPLACE_REPEATING_EXPRESSION)
 
         // Act
-        QueryResult<?> replaceSingleResult = 
replaceSingleQuery.evaluate(attributes)
+        QueryResult<?> replaceSingleResult = 
replaceSingleQuery.evaluate(variableRegistry)
         logger.info("Replace single result: ${replaceSingleResult.value}")
 
-        QueryResult<?> replaceRepeatingResult = 
replaceRepeatingQuery.evaluate(attributes)
+        QueryResult<?> replaceRepeatingResult = 
replaceRepeatingQuery.evaluate(variableRegistry)
         logger.info("Replace repeating result: 
${replaceRepeatingResult.value}")
 
         // Assert
@@ -97,6 +100,7 @@ public class QueryGroovyTest extends GroovyTestCase {
         final Map<String, String> attributes = [
                 single   : ORIGINAL_VALUE,
                 repeating: [ORIGINAL_VALUE].multiply(n).join(" ")]
+        final VariableRegistry variableRegistry = 
VariableRegistryFactory.getInstance(attributes)
         logger.info("Attributes: ${attributes}")
 
         final String REPLACEMENT_VALUE = "Goodbye Planet"
@@ -115,10 +119,10 @@ public class QueryGroovyTest extends GroovyTestCase {
         Query replaceRepeatingQuery = 
Query.compile(REPLACE_REPEATING_EXPRESSION)
 
         // Act
-        QueryResult<?> replaceSingleResult = 
replaceSingleQuery.evaluate(attributes)
+        QueryResult<?> replaceSingleResult = 
replaceSingleQuery.evaluate(variableRegistry)
         logger.info("Replace single result: ${replaceSingleResult.value}")
 
-        QueryResult<?> replaceRepeatingResult = 
replaceRepeatingQuery.evaluate(attributes)
+        QueryResult<?> replaceRepeatingResult = 
replaceRepeatingQuery.evaluate(variableRegistry)
         logger.info("Replace repeating result: 
${replaceRepeatingResult.value}")
 
         // Assert
@@ -137,6 +141,7 @@ public class QueryGroovyTest extends GroovyTestCase {
         final Map<String, String> attributes = [
                 single   : ORIGINAL_VALUE,
                 repeating: [ORIGINAL_VALUE].multiply(n).join(" ")]
+        final VariableRegistry variableRegistry = 
VariableRegistryFactory.getInstance(attributes)
         logger.info("Attributes: ${attributes}")
 
         final String REPLACEMENT_VALUE = "Goodbye Planet"
@@ -155,10 +160,10 @@ public class QueryGroovyTest extends GroovyTestCase {
         Query replaceRepeatingQuery = 
Query.compile(REPLACE_REPEATING_EXPRESSION)
 
         // Act
-        QueryResult<?> replaceSingleResult = 
replaceSingleQuery.evaluate(attributes)
+        QueryResult<?> replaceSingleResult = 
replaceSingleQuery.evaluate(variableRegistry)
         logger.info("Replace single result: ${replaceSingleResult.value}")
 
-        QueryResult<?> replaceRepeatingResult = 
replaceRepeatingQuery.evaluate(attributes)
+        QueryResult<?> replaceRepeatingResult = 
replaceRepeatingQuery.evaluate(variableRegistry)
         logger.info("Replace repeating result: 
${replaceRepeatingResult.value}")
 
         // Assert

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
----------------------------------------------------------------------
diff --git 
a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
 
b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
index 0ede6cc..2b3b5fe 100644
--- 
a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
+++ 
b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestQuery.java
@@ -35,6 +35,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Properties;
 
 import org.apache.nifi.attribute.expression.language.Query.Range;
 import org.apache.nifi.attribute.expression.language.evaluation.QueryResult;
@@ -43,7 +44,12 @@ import 
org.apache.nifi.attribute.expression.language.exception.AttributeExpressi
 import org.apache.nifi.expression.AttributeExpression.ResultType;
 import org.apache.nifi.flowfile.FlowFile;
 import org.antlr.runtime.tree.Tree;
+
+import org.apache.nifi.registry.VariableRegistry;
+import org.apache.nifi.registry.VariableRegistryFactory;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.junit.Assert;
+
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -51,6 +57,7 @@ import org.mockito.Mockito;
 
 public class TestQuery {
 
+
     @Test
     public void testCompilation() {
         assertInvalid("${attr:uuid()}");
@@ -114,7 +121,7 @@ public class TestQuery {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("x", "x");
         attributes.put("y", "x");
-        final String result = Query.evaluateExpressions(expression, 
attributes, null);
+        final String result = 
Query.evaluateExpressions(expression,VariableRegistryFactory.getInstance(attributes),
 null);
         assertEquals("true", result);
 
         Query.validateExpression(expression, false);
@@ -174,14 +181,14 @@ public class TestQuery {
     public void testWithTicksOutside() {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("attr", "My Value");
-
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
         assertEquals(1, Query.extractExpressionRanges("\"${attr}").size());
         assertEquals(1, Query.extractExpressionRanges("'${attr}").size());
         assertEquals(1, Query.extractExpressionRanges("'${attr}'").size());
         assertEquals(1, Query.extractExpressionRanges("${attr}").size());
 
-        assertEquals("'My Value'", Query.evaluateExpressions("'${attr}'", 
attributes, null));
-        assertEquals("'My Value", Query.evaluateExpressions("'${attr}", 
attributes, null));
+        assertEquals("'My Value'", Query.evaluateExpressions("'${attr}'", 
registry, null));
+        assertEquals("'My Value", Query.evaluateExpressions("'${attr}", 
registry, null));
     }
 
     @Test
@@ -191,7 +198,7 @@ public class TestQuery {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("dateTime", "2013/11/18 10:22:27.678");
 
-        final QueryResult<?> result = query.evaluate(attributes);
+        final QueryResult<?> result = 
query.evaluate(VariableRegistryFactory.getInstance(attributes));
         assertEquals(ResultType.NUMBER, result.getResultType());
         assertEquals(1384788147678L, result.getValue());
     }
@@ -220,7 +227,7 @@ public class TestQuery {
         final Date roundedToNearestSecond = new Date(date.getTime() - millis);
         final String formatted = sdf.format(roundedToNearestSecond);
 
-        final QueryResult<?> result = query.evaluate(attributes);
+        final QueryResult<?> result = 
query.evaluate(VariableRegistryFactory.getInstance(attributes));
         assertEquals(ResultType.STRING, result.getResultType());
         assertEquals(formatted, result.getValue());
     }
@@ -230,14 +237,15 @@ public class TestQuery {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("x", "abc");
         attributes.put("a", "abc");
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
 
         verifyEquals("${x:equals(${a})}", attributes, true);
 
         Query.validateExpression("${x:equals('${a}')}", false);
-        assertEquals("true", Query.evaluateExpressions("${x:equals('${a}')}", 
attributes, null));
+        assertEquals("true", Query.evaluateExpressions("${x:equals('${a}')}", 
registry, null));
 
         Query.validateExpression("${x:equals(\"${a}\")}", false);
-        assertEquals("true", 
Query.evaluateExpressions("${x:equals(\"${a}\")}", attributes, null));
+        assertEquals("true", 
Query.evaluateExpressions("${x:equals(\"${a}\")}", registry, null));
     }
 
     @Test
@@ -269,6 +277,22 @@ public class TestQuery {
     }
 
     @Test
+    public void testEmbeddedExpressionsAndQuotesWithProperties() {
+        final Properties attributes = new Properties();
+        attributes.put("x", "abc");
+        attributes.put("a", "abc");
+        VariableRegistry registry = 
VariableRegistryFactory.getPropertiesInstance(attributes);
+
+        verifyEquals("${x:equals(${a})}",registry,true);
+
+        Query.validateExpression("${x:equals('${a}')}", false);
+        assertEquals("true", Query.evaluateExpressions("${x:equals('${a}')}", 
registry, null));
+
+        Query.validateExpression("${x:equals(\"${a}\")}", false);
+        assertEquals("true", 
Query.evaluateExpressions("${x:equals(\"${a}\")}", registry, null));
+    }
+
+    @Test
     public void testJoin() {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("a.a", "a");
@@ -342,7 +366,9 @@ public class TestQuery {
         
Mockito.when(mockFlowFile.getEntryDate()).thenReturn(System.currentTimeMillis());
         Mockito.when(mockFlowFile.getSize()).thenReturn(1L);
         
Mockito.when(mockFlowFile.getLineageStartDate()).thenReturn(System.currentTimeMillis());
-        return Query.evaluateExpressions(queryString, mockFlowFile);
+
+        final VariableRegistry variableRegistry = 
VariableRegistryUtils.createFlowVariableRegistry(VariableRegistryUtils.createSystemVariableRegistry(),mockFlowFile,null);
+        return Query.evaluateExpressions(queryString,variableRegistry);
     }
 
     @Test
@@ -498,7 +524,7 @@ public class TestQuery {
         verifyEquals("${x:toNumber():gt( ${y:toNumber():plus( ${z:toNumber()} 
)} )}", attributes, true);
 
         attributes.put("y", "88");
-        assertEquals("true", Query.evaluateExpressions("${x:equals( '${y}' 
)}", attributes, null));
+        assertEquals("true", Query.evaluateExpressions("${x:equals( '${y}' 
)}", VariableRegistryFactory.getInstance(attributes), null));
     }
 
     @Test
@@ -546,7 +572,7 @@ public class TestQuery {
         final String format = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
 
         final String query = 
"startDateTime=\"${date:toNumber():toDate():format(\"" + format + "\")}\"";
-        final String result = Query.evaluateExpressions(query, attributes, 
null);
+        final String result = Query.evaluateExpressions(query, 
VariableRegistryFactory.getInstance(attributes), null);
 
         final String expectedTime = new SimpleDateFormat(format, 
Locale.US).format(timestamp);
         assertEquals("startDateTime=\"" + expectedTime + "\"", result);
@@ -615,7 +641,7 @@ public class TestQuery {
         final String query = "${ abc:equals('abc'):or( \n\t${xx:isNull()}\n) 
}";
         assertEquals(ResultType.BOOLEAN, Query.getResultType(query));
         Query.validateExpression(query, false);
-        assertEquals("true", Query.evaluateExpressions(query));
+        assertEquals("true", 
Query.evaluateExpressions(query,VariableRegistryUtils.createSystemVariableRegistry()));
     }
 
     @Test
@@ -631,7 +657,7 @@ public class TestQuery {
     public void testComments() {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("abc", "xyz");
-
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
         final String expression
         = "# hello, world\n"
             + "${# ref attr\n"
@@ -642,12 +668,12 @@ public class TestQuery {
             + "}";
 
         Query query = Query.compile(expression);
-        QueryResult<?> result = query.evaluate(attributes);
+        QueryResult<?> result = query.evaluate(registry);
         assertEquals(ResultType.STRING, result.getResultType());
         assertEquals("xyz", result.getValue());
 
         query = Query.compile("${abc:append('# hello') #good-bye \n}");
-        result = query.evaluate(attributes);
+        result = query.evaluate(registry);
         assertEquals(ResultType.STRING, result.getResultType());
         assertEquals("xyz# hello", result.getValue());
     }
@@ -776,14 +802,15 @@ public class TestQuery {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("entryDate", String.valueOf(now.getTimeInMillis()));
 
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
         verifyEquals("${entryDate:toNumber():toDate():format('yyyy')}", 
attributes, String.valueOf(year));
 
         attributes.clear();
         attributes.put("month", "3");
         attributes.put("day", "4");
         attributes.put("year", "2013");
-        assertEquals("63", 
Query.evaluateExpressions("${year:append('/'):append(${month}):append('/'):append(${day}):toDate('yyyy/MM/dd'):format('D')}",
 attributes, null));
-        assertEquals("63", 
Query.evaluateExpressions("${year:append('/'):append('${month}'):append('/'):append('${day}'):toDate('yyyy/MM/dd'):format('D')}",
 attributes, null));
+        assertEquals("63", 
Query.evaluateExpressions("${year:append('/'):append(${month}):append('/'):append(${day}):toDate('yyyy/MM/dd'):format('D')}",
 registry, null));
+        assertEquals("63", 
Query.evaluateExpressions("${year:append('/'):append('${month}'):append('/'):append('${day}'):toDate('yyyy/MM/dd'):format('D')}",
 registry, null));
 
         
verifyEquals("${year:append('/'):append(${month}):append('/'):append(${day}):toDate('yyyy/MM/dd'):format('D')}",
 attributes, "63");
     }
@@ -791,8 +818,9 @@ public class TestQuery {
     @Test
     public void testSystemProperty() {
         System.setProperty("hello", "good-bye");
-        assertEquals("good-bye", Query.evaluateExpressions("${hello}"));
-        assertEquals("good-bye", 
Query.compile("${hello}").evaluate().getValue());
+        VariableRegistry variableRegistry = 
VariableRegistryUtils.createSystemVariableRegistry();
+        assertEquals("good-bye", 
Query.evaluateExpressions("${hello}",variableRegistry));
+        assertEquals("good-bye", 
Query.compile("${hello}").evaluate(variableRegistry).getValue());
     }
 
     @Test
@@ -832,14 +860,15 @@ public class TestQuery {
         final Map<String, String> attributes = new HashMap<>();
         attributes.put("abc", "a,b,c");
         attributes.put("xyz", "abc");
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
 
         final String query = "${anyDelineatedValue('${abc}', 
','):equals('b')}";
         assertEquals(ResultType.BOOLEAN, Query.getResultType(query));
 
-        assertEquals("true", Query.evaluateExpressions(query, attributes, 
null));
-        assertEquals("true", 
Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('a')}", 
attributes, null));
-        assertEquals("true", 
Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('c')}", 
attributes, null));
-        assertEquals("false", 
Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('d')}", 
attributes, null));
+        assertEquals("true", Query.evaluateExpressions(query, registry, null));
+        assertEquals("true", 
Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('a')}", 
registry, null));
+        assertEquals("true", 
Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('c')}", 
registry, null));
+        assertEquals("false", 
Query.evaluateExpressions("${anyDelineatedValue('${abc}', ','):equals('d')}", 
registry, null));
 
         verifyEquals("${anyDelineatedValue(${abc}, ','):equals('b')}", 
attributes, true);
         verifyEquals("${anyDelineatedValue(${abc}, ','):equals('a')}", 
attributes, true);
@@ -853,13 +882,15 @@ public class TestQuery {
         attributes.put("abc", "a,b,c");
         attributes.put("xyz", "abc");
 
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
+
         final String query = "${allDelineatedValues('${abc}', 
','):matches('[abc]')}";
 
         assertEquals(ResultType.BOOLEAN, Query.getResultType(query));
-        assertEquals("true", Query.evaluateExpressions(query, attributes, 
null));
-        assertEquals("true", Query.evaluateExpressions(query, attributes, 
null));
-        assertEquals("false", 
Query.evaluateExpressions("${allDelineatedValues('${abc}', 
','):matches('[abd]')}", attributes, null));
-        assertEquals("false", 
Query.evaluateExpressions("${allDelineatedValues('${abc}', 
','):equals('a'):not()}", attributes, null));
+        assertEquals("true", Query.evaluateExpressions(query, registry, null));
+        assertEquals("true", Query.evaluateExpressions(query, registry, null));
+        assertEquals("false", 
Query.evaluateExpressions("${allDelineatedValues('${abc}', 
','):matches('[abd]')}",registry, null));
+        assertEquals("false", 
Query.evaluateExpressions("${allDelineatedValues('${abc}', 
','):equals('a'):not()}", registry, null));
 
         verifyEquals("${allDelineatedValues(${abc}, ','):matches('[abc]')}", 
attributes, true);
         verifyEquals("${allDelineatedValues(${abc}, ','):matches('[abd]')}", 
attributes, false);
@@ -925,12 +956,13 @@ public class TestQuery {
         attributes.put("xyz", "4132");
         attributes.put("hello", "world!");
         attributes.put("dotted", "abc.xyz");
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
 
-        final String evaluated = 
Query.evaluateExpressions("${abc:matches('1234${end}4321')}", attributes, null);
+        final String evaluated = 
Query.evaluateExpressions("${abc:matches('1234${end}4321')}", registry, null);
         assertEquals("true", evaluated);
 
         attributes.put("end", "888");
-        final String secondEvaluation = 
Query.evaluateExpressions("${abc:matches('1234${end}4321')}", attributes, null);
+        final String secondEvaluation = 
Query.evaluateExpressions("${abc:matches('1234${end}4321')}", registry, null);
         assertEquals("false", secondEvaluation);
 
         verifyEquals("${dotted:matches('abc\\.xyz')}", attributes, true);
@@ -945,11 +977,13 @@ public class TestQuery {
         attributes.put("hello", "world!");
         attributes.put("dotted", "abc.xyz");
 
-        final String evaluated = 
Query.evaluateExpressions("${abc:find('1234${end}4321')}", attributes, null);
+        final String evaluated = 
Query.evaluateExpressions("${abc:find('1234${end}4321')}", 
VariableRegistryFactory.getInstance(attributes), null);
         assertEquals("true", evaluated);
 
         attributes.put("end", "888");
-        final String secondEvaluation = 
Query.evaluateExpressions("${abc:find('${end}4321')}", attributes, null);
+
+
+        final String secondEvaluation = 
Query.evaluateExpressions("${abc:find('${end}4321')}",VariableRegistryFactory.getInstance(attributes),
 null);
         assertEquals("false", secondEvaluation);
 
         verifyEquals("${dotted:find('\\.')}", attributes, true);
@@ -1130,7 +1164,7 @@ public class TestQuery {
         attributes.put("b", "x");
         attributes.put("abcxcba", "hello");
 
-        final String evaluated = Query.evaluateExpressions("${ 
'abc${b}cba':substring(0, 1) }", attributes, null);
+        final String evaluated = Query.evaluateExpressions("${ 
'abc${b}cba':substring(0, 1) }", 
VariableRegistryFactory.getInstance(attributes), null);
         assertEquals("h", evaluated);
     }
 
@@ -1164,7 +1198,7 @@ public class TestQuery {
         final List<String> expressions = Query.extractExpressions(query);
         assertEquals(1, expressions.size());
         assertEquals("${abc}", expressions.get(0));
-        assertEquals("{ xyz }", Query.evaluateExpressions(query, attributes));
+        assertEquals("{ xyz }", Query.evaluateExpressions(query, 
VariableRegistryFactory.getInstance(attributes)));
     }
 
     @Test
@@ -1188,7 +1222,7 @@ public class TestQuery {
 
     QueryResult<?> getResult(String expr, Map<String, String> attrs) {
         final Query query = Query.compile(expr);
-        final QueryResult<?> result = query.evaluate(attrs);
+        final QueryResult<?> result = 
query.evaluate(VariableRegistryFactory.getInstance(attrs));
         return result;
     }
 
@@ -1297,11 +1331,17 @@ public class TestQuery {
     }
 
     private void verifyEquals(final String expression, final Map<String, 
String> attributes, final Object expectedResult) {
+
+        VariableRegistry registry = 
VariableRegistryFactory.getInstance(attributes);
+        verifyEquals(expression,registry,expectedResult);
+    }
+
+    private void verifyEquals(final String expression, final VariableRegistry 
registry, final Object expectedResult) {
         Query.validateExpression(expression, false);
-        assertEquals(String.valueOf(expectedResult), 
Query.evaluateExpressions(expression, attributes, null));
+        assertEquals(String.valueOf(expectedResult), 
Query.evaluateExpressions(expression, registry, null));
 
         final Query query = Query.compile(expression);
-        final QueryResult<?> result = query.evaluate(attributes);
+        final QueryResult<?> result = query.evaluate(registry);
 
         if (expectedResult instanceof Number) {
             assertEquals(ResultType.NUMBER, result.getResultType());

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
----------------------------------------------------------------------
diff --git 
a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
 
b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
index 5acba8d..dbee665 100644
--- 
a/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
+++ 
b/nifi-commons/nifi-expression-language/src/test/java/org/apache/nifi/attribute/expression/language/TestStandardPreparedQuery.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.nifi.registry.VariableRegistryFactory;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -53,7 +54,7 @@ public class TestStandardPreparedQuery {
         final StandardPreparedQuery prepared = (StandardPreparedQuery) 
Query.prepare("${xx}");
         final long start = System.nanoTime();
         for (int i = 0; i < 10000000; i++) {
-            assertEquals("world", prepared.evaluateExpressions(attrs, null));
+            assertEquals("world", 
prepared.evaluateExpressions(VariableRegistryFactory.getInstance(attrs), null));
         }
         final long nanos = System.nanoTime() - start;
         System.out.println(TimeUnit.NANOSECONDS.toMillis(nanos));
@@ -67,7 +68,7 @@ public class TestStandardPreparedQuery {
 
         final long start = System.nanoTime();
         for (int i = 0; i < 10000000; i++) {
-            assertEquals("world", Query.evaluateExpressions("${xx}", attrs));
+            assertEquals("world", Query.evaluateExpressions("${xx}", 
VariableRegistryFactory.getInstance(attrs)));
         }
         final long nanos = System.nanoTime() - start;
         System.out.println(TimeUnit.NANOSECONDS.toMillis(nanos));
@@ -85,7 +86,7 @@ public class TestStandardPreparedQuery {
     }
 
     private String evaluate(final String query, final Map<String, String> 
attrs) {
-        final String evaluated = ((StandardPreparedQuery) 
Query.prepare(query)).evaluateExpressions(attrs, null);
+        final String evaluated = ((StandardPreparedQuery) 
Query.prepare(query)).evaluateExpressions(VariableRegistryFactory.getInstance(attrs),
 null);
         return evaluated;
     }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
----------------------------------------------------------------------
diff --git 
a/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
 
b/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
index 56e6b03..560d51c 100644
--- 
a/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
+++ 
b/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
@@ -28,6 +28,7 @@ import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -188,6 +189,9 @@ public class NiFiProperties extends Properties {
     public static final String STATE_MANAGEMENT_START_EMBEDDED_ZOOKEEPER = 
"nifi.state.management.embedded.zookeeper.start";
     public static final String STATE_MANAGEMENT_ZOOKEEPER_PROPERTIES = 
"nifi.state.management.embedded.zookeeper.properties";
 
+    // expression language properties
+    public static final String VARIABLE_REGISTRY_PROPERTIES = 
"nifi.variable.registry.properties";
+
     // defaults
     public static final String DEFAULT_TITLE = "NiFi";
     public static final Boolean DEFAULT_AUTO_RESUME_STATE = true;
@@ -963,4 +967,27 @@ public class NiFiProperties extends Properties {
     public String getFlowConfigurationArchiveMaxStorage() {
         return getProperty(FLOW_CONFIGURATION_ARCHIVE_MAX_STORAGE, 
DEFAULT_FLOW_CONFIGURATION_ARCHIVE_MAX_STORAGE);
     }
+
+    public String getVariableRegistryProperties(){
+        return getProperty(VARIABLE_REGISTRY_PROPERTIES);
+    }
+
+    public Path[] getVariableRegistryPropertiesPaths() {
+        final List<Path> vrPropertiesPaths = new ArrayList<>();
+
+        final String vrPropertiesFiles = getVariableRegistryProperties();
+        if(!StringUtils.isEmpty(vrPropertiesFiles)) {
+
+            final List<String> vrPropertiesFileList = 
Arrays.asList(vrPropertiesFiles.split(","));
+
+            for(String propertiesFile : vrPropertiesFileList){
+                vrPropertiesPaths.add(Paths.get(propertiesFile));
+            }
+
+            return vrPropertiesPaths.toArray( new 
Path[vrPropertiesPaths.size()]);
+        } else {
+            return null;
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
 
b/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
index 5082af2..889e7ac 100644
--- 
a/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
+++ 
b/nifi-framework-api/src/main/java/org/apache/nifi/web/NiFiWebConfigurationContext.java
@@ -16,16 +16,17 @@
  */
 package org.apache.nifi.web;
 
-import org.apache.nifi.controller.ControllerService;
-
 import java.util.Collection;
 import java.util.Map;
 
+import org.apache.nifi.controller.ControllerService;
+import org.apache.nifi.registry.VariableRegistryProvider;
+
 /**
  * NiFi web context providing limited access to dataflow configuration for
  * component custom UIs.
  */
-public interface NiFiWebConfigurationContext {
+public interface NiFiWebConfigurationContext extends VariableRegistryProvider {
 
     /**
      * @param serviceIdentifier of the controller service

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/MockConfigurationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/main/java/org/apache/nifi/util/MockConfigurationContext.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/MockConfigurationContext.java
index c90e722..4c3b399 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockConfigurationContext.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockConfigurationContext.java
@@ -25,21 +25,26 @@ import org.apache.nifi.components.PropertyValue;
 import org.apache.nifi.controller.ConfigurationContext;
 import org.apache.nifi.controller.ControllerService;
 import org.apache.nifi.controller.ControllerServiceLookup;
+import org.apache.nifi.registry.VariableRegistry;
 
 public class MockConfigurationContext implements ConfigurationContext {
 
     private final Map<PropertyDescriptor, String> properties;
     private final ControllerServiceLookup serviceLookup;
     private final ControllerService service;
+    private final VariableRegistry variableRegistry;
 
-    public MockConfigurationContext(final Map<PropertyDescriptor, String> 
properties, final ControllerServiceLookup serviceLookup) {
-        this(null, properties, serviceLookup);
+    public MockConfigurationContext(final Map<PropertyDescriptor, String> 
properties, final ControllerServiceLookup serviceLookup,
+                                    final VariableRegistry variableRegistry) {
+        this(null, properties, serviceLookup, variableRegistry);
     }
 
-    public MockConfigurationContext(final ControllerService service, final 
Map<PropertyDescriptor, String> properties, final ControllerServiceLookup 
serviceLookup) {
+    public MockConfigurationContext(final ControllerService service, final 
Map<PropertyDescriptor, String> properties, final ControllerServiceLookup 
serviceLookup,
+                                    final VariableRegistry variableRegistry) {
         this.service = service;
         this.properties = properties;
         this.serviceLookup = serviceLookup;
+        this.variableRegistry = variableRegistry;
     }
 
     @Override
@@ -48,7 +53,7 @@ public class MockConfigurationContext implements 
ConfigurationContext {
         if (value == null) {
             value = getActualDescriptor(property).getDefaultValue();
         }
-        return new MockPropertyValue(value, serviceLookup);
+        return new MockPropertyValue(value, serviceLookup, variableRegistry);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
index d3db1ba..63a5c85 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockProcessContext.java
@@ -40,6 +40,7 @@ import org.apache.nifi.controller.NodeTypeProvider;
 import org.apache.nifi.processor.Processor;
 import org.apache.nifi.processor.Relationship;
 import org.apache.nifi.processor.SchedulingContext;
+import org.apache.nifi.registry.VariableRegistry;
 import org.apache.nifi.state.MockStateManager;
 import org.junit.Assert;
 
@@ -48,6 +49,7 @@ public class MockProcessContext extends 
MockControllerServiceLookup implements S
     private final ConfigurableComponent component;
     private final Map<PropertyDescriptor, String> properties = new HashMap<>();
     private final StateManager stateManager;
+    private final VariableRegistry variableRegistry;
 
     private String annotationData = null;
     private boolean yieldCalled = false;
@@ -63,22 +65,24 @@ public class MockProcessContext extends 
MockControllerServiceLookup implements S
     private volatile boolean isClustered;
     private volatile boolean isPrimaryNode;
 
-    public MockProcessContext(final ConfigurableComponent component) {
-        this(component, new MockStateManager(component));
+    public MockProcessContext(final ConfigurableComponent component, final 
VariableRegistry variableRegistry) {
+        this(component, new MockStateManager(component),variableRegistry);
     }
 
     /**
      * Creates a new MockProcessContext for the given Processor
      *
      * @param component being mocked
+     * @param variableRegistry variableRegistry
      */
-    public MockProcessContext(final ConfigurableComponent component, final 
StateManager stateManager) {
+    public MockProcessContext(final ConfigurableComponent component, final 
StateManager stateManager, final VariableRegistry variableRegistry) {
         this.component = Objects.requireNonNull(component);
         this.stateManager = stateManager;
+        this.variableRegistry = variableRegistry;
     }
 
-    public MockProcessContext(final ControllerService component, final 
MockProcessContext context, final StateManager stateManager) {
-        this(component, stateManager);
+    public MockProcessContext(final ControllerService component, final 
MockProcessContext context, final StateManager stateManager, final 
VariableRegistry variableRegistry) {
+        this(component, stateManager, variableRegistry);
 
         try {
             annotationData = 
context.getControllerServiceAnnotationData(component);
@@ -105,12 +109,13 @@ public class MockProcessContext extends 
MockControllerServiceLookup implements S
 
         final String setPropertyValue = properties.get(descriptor);
         final String propValue = (setPropertyValue == null) ? 
descriptor.getDefaultValue() : setPropertyValue;
-        return new MockPropertyValue(propValue, this, 
(enableExpressionValidation && allowExpressionValidation) ? descriptor : null);
+
+        return new MockPropertyValue(propValue, this, variableRegistry, 
(enableExpressionValidation && allowExpressionValidation) ? descriptor : null);
     }
 
     @Override
     public PropertyValue newPropertyValue(final String rawValue) {
-        return new MockPropertyValue(rawValue, this);
+        return new MockPropertyValue(rawValue, this, variableRegistry);
     }
 
     public ValidationResult setProperty(final String propertyName, final 
String propertyValue) {
@@ -133,7 +138,7 @@ public class MockProcessContext extends 
MockControllerServiceLookup implements S
         requireNonNull(value, "Cannot set property to null value; if the 
intent is to remove the property, call removeProperty instead");
         final PropertyDescriptor fullyPopulatedDescriptor = 
component.getPropertyDescriptor(descriptor.getName());
 
-        final ValidationResult result = 
fullyPopulatedDescriptor.validate(value, new MockValidationContext(this, 
stateManager));
+        final ValidationResult result = 
fullyPopulatedDescriptor.validate(value, new MockValidationContext(this, 
stateManager, variableRegistry));
         String oldValue = properties.put(fullyPopulatedDescriptor, value);
         if (oldValue == null) {
             oldValue = fullyPopulatedDescriptor.getDefaultValue();
@@ -216,7 +221,7 @@ public class MockProcessContext extends 
MockControllerServiceLookup implements S
      * non-null
      */
     public Collection<ValidationResult> validate() {
-        return component.validate(new MockValidationContext(this, 
stateManager));
+        return component.validate(new MockValidationContext(this, 
stateManager, variableRegistry));
     }
 
     public boolean isValid() {

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
index 090a8eb..0fb4f89 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockPropertyValue.java
@@ -28,6 +28,7 @@ import org.apache.nifi.expression.AttributeValueDecorator;
 import org.apache.nifi.flowfile.FlowFile;
 import org.apache.nifi.processor.DataUnit;
 import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.registry.VariableRegistry;
 
 public class MockPropertyValue implements PropertyValue {
     private final String rawValue;
@@ -35,24 +36,27 @@ public class MockPropertyValue implements PropertyValue {
     private final ControllerServiceLookup serviceLookup;
     private final PropertyDescriptor propertyDescriptor;
     private final PropertyValue stdPropValue;
+    private final VariableRegistry variableRegistry;
     private boolean expressionsEvaluated = false;
 
-    public MockPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup) {
-        this(rawValue, serviceLookup, null);
+    public MockPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final VariableRegistry variableRegistry) 
{
+        this(rawValue, serviceLookup, variableRegistry, null);
     }
 
-    public MockPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final PropertyDescriptor 
propertyDescriptor) {
-        this(rawValue, serviceLookup, propertyDescriptor, false);
+    public MockPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, VariableRegistry variableRegistry, final 
PropertyDescriptor propertyDescriptor) {
+        this(rawValue, serviceLookup, propertyDescriptor, false, 
variableRegistry);
     }
 
-    private MockPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final PropertyDescriptor 
propertyDescriptor, final boolean alreadyEvaluated) {
-        this.stdPropValue = new StandardPropertyValue(rawValue, serviceLookup);
+    private MockPropertyValue(final String rawValue, final 
ControllerServiceLookup serviceLookup, final PropertyDescriptor 
propertyDescriptor, final boolean alreadyEvaluated,
+                              final VariableRegistry variableRegistry) {
+        this.stdPropValue = new StandardPropertyValue(rawValue, serviceLookup, 
variableRegistry);
 
         this.rawValue = rawValue;
         this.serviceLookup = serviceLookup;
         this.expectExpressions = propertyDescriptor == null ? null : 
propertyDescriptor.isExpressionLanguageSupported();
         this.propertyDescriptor = propertyDescriptor;
         this.expressionsEvaluated = alreadyEvaluated;
+        this.variableRegistry = variableRegistry;
     }
 
 
@@ -165,7 +169,7 @@ public class MockPropertyValue implements PropertyValue {
         }
 
         final PropertyValue newValue = 
stdPropValue.evaluateAttributeExpressions(flowFile, additionalAttributes, 
decorator);
-        return new MockPropertyValue(newValue.getValue(), serviceLookup, 
propertyDescriptor, true);
+        return new MockPropertyValue(newValue.getValue(), serviceLookup, 
propertyDescriptor, true, variableRegistry);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/MockReportingContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/main/java/org/apache/nifi/util/MockReportingContext.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/MockReportingContext.java
index 33719ec..da43c62 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockReportingContext.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockReportingContext.java
@@ -27,6 +27,7 @@ import org.apache.nifi.components.PropertyValue;
 import org.apache.nifi.components.state.StateManager;
 import org.apache.nifi.controller.ControllerService;
 import org.apache.nifi.controller.ControllerServiceLookup;
+import org.apache.nifi.registry.VariableRegistry;
 import org.apache.nifi.reporting.Bulletin;
 import org.apache.nifi.reporting.BulletinFactory;
 import org.apache.nifi.reporting.BulletinRepository;
@@ -39,12 +40,14 @@ public class MockReportingContext extends 
MockControllerServiceLookup implements
     private final MockEventAccess eventAccess = new MockEventAccess();
     private final Map<PropertyDescriptor, String> properties = new HashMap<>();
     private final StateManager stateManager;
+    private final VariableRegistry variableRegistry;
 
     private final Map<String, List<Bulletin>> componentBulletinsCreated = new 
HashMap<>();
 
-    public MockReportingContext(final Map<String, ControllerService> 
controllerServices, final StateManager stateManager) {
+    public MockReportingContext(final Map<String, ControllerService> 
controllerServices, final StateManager stateManager, final VariableRegistry 
variableRegistry) {
         this.controllerServices = new HashMap<>();
         this.stateManager = stateManager;
+        this.variableRegistry = variableRegistry;
         for (final Map.Entry<String, ControllerService> entry : 
controllerServices.entrySet()) {
             this.controllerServices.put(entry.getKey(), new 
ControllerServiceConfiguration(entry.getValue()));
         }
@@ -58,7 +61,7 @@ public class MockReportingContext extends 
MockControllerServiceLookup implements
     @Override
     public PropertyValue getProperty(final PropertyDescriptor property) {
         final String configuredValue = properties.get(property);
-        return new MockPropertyValue(configuredValue == null ? 
property.getDefaultValue() : configuredValue, this);
+        return new MockPropertyValue(configuredValue == null ? 
property.getDefaultValue() : configuredValue, this, variableRegistry);
     }
 
     public void setProperty(final String propertyName, final String value) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
index f0ff58b..1a78411 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/MockValidationContext.java
@@ -31,16 +31,20 @@ import org.apache.nifi.components.state.StateManager;
 import org.apache.nifi.controller.ControllerService;
 import org.apache.nifi.controller.ControllerServiceLookup;
 import org.apache.nifi.expression.ExpressionLanguageCompiler;
+import org.apache.nifi.registry.VariableRegistry;
+
 
 public class MockValidationContext implements ValidationContext, 
ControllerServiceLookup {
 
     private final MockProcessContext context;
     private final Map<String, Boolean> expressionLanguageSupported;
     private final StateManager stateManager;
+    private final VariableRegistry variableRegistry;
 
-    public MockValidationContext(final MockProcessContext processContext, 
final StateManager stateManager) {
+    public MockValidationContext(final MockProcessContext processContext, 
final StateManager stateManager, final VariableRegistry variableRegistry) {
         this.context = processContext;
         this.stateManager = stateManager;
+        this.variableRegistry = variableRegistry;
 
         final Map<PropertyDescriptor, String> properties = 
processContext.getProperties();
         expressionLanguageSupported = new HashMap<>(properties.size());
@@ -56,18 +60,18 @@ public class MockValidationContext implements 
ValidationContext, ControllerServi
 
     @Override
     public PropertyValue newPropertyValue(final String rawValue) {
-        return new MockPropertyValue(rawValue, this);
+        return new MockPropertyValue(rawValue, this, variableRegistry);
     }
 
     @Override
     public ExpressionLanguageCompiler newExpressionLanguageCompiler() {
-        return new StandardExpressionLanguageCompiler();
+        return new StandardExpressionLanguageCompiler(variableRegistry);
     }
 
     @Override
     public ValidationContext getControllerServiceValidationContext(final 
ControllerService controllerService) {
-        final MockProcessContext serviceProcessContext = new 
MockProcessContext(controllerService, context, stateManager);
-        return new MockValidationContext(serviceProcessContext, stateManager);
+        final MockProcessContext serviceProcessContext = new 
MockProcessContext(controllerService, context, stateManager, variableRegistry);
+        return new MockValidationContext(serviceProcessContext, stateManager, 
variableRegistry);
     }
 
     @Override
@@ -141,4 +145,5 @@ public class MockValidationContext implements 
ValidationContext, ControllerServi
     public String getProcessGroupIdentifier() {
         return "unit test";
     }
+
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
index 81c8568..6607e85 100644
--- 
a/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
+++ 
b/nifi-mock/src/main/java/org/apache/nifi/util/StandardProcessorTestRunner.java
@@ -65,6 +65,7 @@ import org.apache.nifi.processor.ProcessSessionFactory;
 import org.apache.nifi.processor.Processor;
 import org.apache.nifi.processor.Relationship;
 import org.apache.nifi.provenance.ProvenanceEventRecord;
+import org.apache.nifi.registry.VariableRegistry;
 import org.apache.nifi.reporting.InitializationException;
 import org.apache.nifi.state.MockStateManager;
 import org.junit.Assert;
@@ -80,6 +81,7 @@ public class StandardProcessorTestRunner implements 
TestRunner {
     private final boolean triggerSerially;
     private final MockStateManager processorStateManager;
     private final Map<String, MockStateManager> controllerServiceStateManagers 
= new HashMap<>();
+    private final VariableRegistry variableRegistry;
 
     private int numThreads = 1;
     private final AtomicInteger invocations = new AtomicInteger(0);
@@ -87,14 +89,15 @@ public class StandardProcessorTestRunner implements 
TestRunner {
     private final Map<String, MockComponentLog> controllerServiceLoggers = new 
HashMap<>();
     private final MockComponentLog logger;
 
-    StandardProcessorTestRunner(final Processor processor) {
+    StandardProcessorTestRunner(final Processor processor,final 
VariableRegistry variableRegistry) {
         this.processor = processor;
         this.idGenerator = new AtomicLong(0L);
         this.sharedState = new SharedSessionState(processor, idGenerator);
         this.flowFileQueue = sharedState.getFlowFileQueue();
         this.sessionFactory = new MockSessionFactory(sharedState, processor);
         this.processorStateManager = new MockStateManager(processor);
-        this.context = new MockProcessContext(processor, 
processorStateManager);
+        this.variableRegistry = variableRegistry;
+        this.context = new MockProcessContext(processor, 
processorStateManager, variableRegistry);
 
         final MockProcessorInitializationContext mockInitContext = new 
MockProcessorInitializationContext(processor, context);
         processor.initialize(mockInitContext);
@@ -603,7 +606,7 @@ public class StandardProcessorTestRunner implements 
TestRunner {
             throw new IllegalStateException("Controller Service has not been 
added to this TestRunner via the #addControllerService method");
         }
 
-        final ValidationContext validationContext = new 
MockValidationContext(context, 
serviceStateManager).getControllerServiceValidationContext(service);
+        final ValidationContext validationContext = new 
MockValidationContext(context, serviceStateManager, 
variableRegistry).getControllerServiceValidationContext(service);
         final Collection<ValidationResult> results = 
context.getControllerService(service.getIdentifier()).validate(validationContext);
 
         for (final ValidationResult result : results) {
@@ -622,7 +625,7 @@ public class StandardProcessorTestRunner implements 
TestRunner {
             throw new IllegalStateException("Controller Service has not been 
added to this TestRunner via the #addControllerService method");
         }
 
-        final ValidationContext validationContext = new 
MockValidationContext(context, 
serviceStateManager).getControllerServiceValidationContext(service);
+        final ValidationContext validationContext = new 
MockValidationContext(context, serviceStateManager, 
variableRegistry).getControllerServiceValidationContext(service);
         final Collection<ValidationResult> results = 
context.getControllerService(service.getIdentifier()).validate(validationContext);
 
         for (final ValidationResult result : results) {
@@ -665,7 +668,7 @@ public class StandardProcessorTestRunner implements 
TestRunner {
         }
 
         try {
-            final ConfigurationContext configContext = new 
MockConfigurationContext(service, configuration.getProperties(), context);
+            final ConfigurationContext configContext = new 
MockConfigurationContext(service, configuration.getProperties(), 
context,variableRegistry);
             ReflectionUtils.invokeMethodsWithAnnotation(OnEnabled.class, 
service, configContext);
         } catch (final InvocationTargetException ite) {
             ite.getCause().printStackTrace();
@@ -737,7 +740,7 @@ public class StandardProcessorTestRunner implements 
TestRunner {
         final Map<PropertyDescriptor, String> curProps = 
configuration.getProperties();
         final Map<PropertyDescriptor, String> updatedProps = new 
HashMap<>(curProps);
 
-        final ValidationContext validationContext = new 
MockValidationContext(context, 
serviceStateManager).getControllerServiceValidationContext(service);
+        final ValidationContext validationContext = new 
MockValidationContext(context, serviceStateManager, 
variableRegistry).getControllerServiceValidationContext(service);
         final ValidationResult validationResult = property.validate(value, 
validationContext);
 
         updatedProps.put(property, value);

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/main/java/org/apache/nifi/util/TestRunners.java
----------------------------------------------------------------------
diff --git a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunners.java 
b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunners.java
index f2b0b23..b36f102 100644
--- a/nifi-mock/src/main/java/org/apache/nifi/util/TestRunners.java
+++ b/nifi-mock/src/main/java/org/apache/nifi/util/TestRunners.java
@@ -17,11 +17,17 @@
 package org.apache.nifi.util;
 
 import org.apache.nifi.processor.Processor;
+import org.apache.nifi.registry.VariableRegistry;
+import org.apache.nifi.registry.VariableRegistryUtils;
 
 public class TestRunners {
 
     public static TestRunner newTestRunner(final Processor processor) {
-        return new StandardProcessorTestRunner(processor);
+        return 
newTestRunner(processor,VariableRegistryUtils.createSystemVariableRegistry());
+    }
+
+    public static TestRunner newTestRunner(final Processor processor, 
VariableRegistry variableRegistry){
+        return new StandardProcessorTestRunner(processor, variableRegistry);
     }
 
     public static TestRunner newTestRunner(final Class<? extends Processor> 
processorClass) {

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
 
b/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
index 6b403af..83e22ab 100644
--- 
a/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
+++ 
b/nifi-mock/src/test/java/org/apache/nifi/util/CurrentTestStandardProcessorTestRunner.java
@@ -20,6 +20,7 @@ import org.apache.nifi.processor.AbstractProcessor;
 import org.apache.nifi.processor.ProcessContext;
 import org.apache.nifi.processor.ProcessSession;
 import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -31,7 +32,7 @@ public class CurrentTestStandardProcessorTestRunner {
     @Test
     public void testOnScheduledCalledAfterRunFinished() {
         SlowRunProcessor processor = new SlowRunProcessor();
-        StandardProcessorTestRunner runner = new 
StandardProcessorTestRunner(processor);
+        StandardProcessorTestRunner runner = new 
StandardProcessorTestRunner(processor, 
VariableRegistryUtils.createSystemVariableRegistry());
         final int iterations = 5;
         runner.run(iterations);
         // if the counter is not equal to iterations, the the processor must 
have been unscheduled

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java 
b/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
index d48af63..3271d7f 100644
--- a/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
+++ b/nifi-mock/src/test/java/org/apache/nifi/util/TestMockProcessContext.java
@@ -32,6 +32,7 @@ import org.apache.nifi.processor.ProcessContext;
 import org.apache.nifi.processor.ProcessSession;
 import org.apache.nifi.processor.exception.ProcessException;
 import org.apache.nifi.processor.util.StandardValidators;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.junit.Test;
 
 public class TestMockProcessContext {
@@ -39,7 +40,7 @@ public class TestMockProcessContext {
     @Test
     public void testRemoveProperty() {
         final DummyProcessor proc = new DummyProcessor();
-        final MockProcessContext context = new MockProcessContext(proc);
+        final MockProcessContext context = new MockProcessContext(proc, 
VariableRegistryUtils.createSystemVariableRegistry());
         context.setProperty(DummyProcessor.REQUIRED_PROP, "req-value");
         context.setProperty(DummyProcessor.OPTIONAL_PROP, "opt-value");
         context.setProperty(DummyProcessor.DEFAULTED_PROP, "custom-value");

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-nar-bundles/nifi-ambari-bundle/nifi-ambari-reporting-task/src/test/java/org/apache/nifi/reporting/ambari/TestAmbariReportingTask.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-ambari-bundle/nifi-ambari-reporting-task/src/test/java/org/apache/nifi/reporting/ambari/TestAmbariReportingTask.java
 
b/nifi-nar-bundles/nifi-ambari-bundle/nifi-ambari-reporting-task/src/test/java/org/apache/nifi/reporting/ambari/TestAmbariReportingTask.java
index ce5f8a6..dedfb62 100644
--- 
a/nifi-nar-bundles/nifi-ambari-bundle/nifi-ambari-reporting-task/src/test/java/org/apache/nifi/reporting/ambari/TestAmbariReportingTask.java
+++ 
b/nifi-nar-bundles/nifi-ambari-bundle/nifi-ambari-reporting-task/src/test/java/org/apache/nifi/reporting/ambari/TestAmbariReportingTask.java
@@ -20,6 +20,8 @@ import org.apache.nifi.controller.ConfigurationContext;
 import org.apache.nifi.controller.status.ProcessGroupStatus;
 import org.apache.nifi.controller.status.ProcessorStatus;
 import org.apache.nifi.logging.ComponentLog;
+import org.apache.nifi.registry.VariableRegistry;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.apache.nifi.reporting.EventAccess;
 import org.apache.nifi.reporting.InitializationException;
 import org.apache.nifi.reporting.ReportingContext;
@@ -43,6 +45,7 @@ import java.util.UUID;
 public class TestAmbariReportingTask {
 
     private ProcessGroupStatus status;
+    private VariableRegistry variableRegistry;
 
     @Before
     public void setup() {
@@ -73,6 +76,7 @@ public class TestAmbariReportingTask {
         Collection<ProcessGroupStatus> groupStatuses = new ArrayList<>();
         groupStatuses.add(groupStatus);
         status.setProcessGroupStatus(groupStatuses);
+        variableRegistry = 
VariableRegistryUtils.createSystemVariableRegistry();
     }
 
     @Test
@@ -105,11 +109,12 @@ public class TestAmbariReportingTask {
         // mock the ReportingContext for onTrigger(...)
         final ReportingContext context = Mockito.mock(ReportingContext.class);
         
Mockito.when(context.getProperty(AmbariReportingTask.METRICS_COLLECTOR_URL))
-                .thenReturn(new MockPropertyValue(metricsUrl, null));
+                .thenReturn(new MockPropertyValue(metricsUrl, null, 
variableRegistry));
         Mockito.when(context.getProperty(AmbariReportingTask.APPLICATION_ID))
-                .thenReturn(new MockPropertyValue(applicationId, null));
+                .thenReturn(new MockPropertyValue(applicationId, null, 
variableRegistry));
         Mockito.when(context.getProperty(AmbariReportingTask.HOSTNAME))
-                .thenReturn(new MockPropertyValue(hostName, null));
+                .thenReturn(new MockPropertyValue(hostName, null, 
variableRegistry));
+
 
         final EventAccess eventAccess = Mockito.mock(EventAccess.class);
         Mockito.when(context.getEventAccess()).thenReturn(eventAccess);
@@ -121,7 +126,6 @@ public class TestAmbariReportingTask {
         task.setup(configurationContext);
         task.onTrigger(context);
     }
-
     // override the creation of the client to provide a mock
     private class TestableAmbariReportingTask extends AmbariReportingTask {
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestFetchElasticsearch.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestFetchElasticsearch.java
 
b/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestFetchElasticsearch.java
index 9b68f2e..5df3c01 100644
--- 
a/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestFetchElasticsearch.java
+++ 
b/nifi-nar-bundles/nifi-elasticsearch-bundle/nifi-elasticsearch-processors/src/test/java/org/apache/nifi/processors/elasticsearch/TestFetchElasticsearch.java
@@ -18,6 +18,8 @@ package org.apache.nifi.processors.elasticsearch;
 
 import org.apache.nifi.processor.ProcessContext;
 import org.apache.nifi.processor.exception.ProcessException;
+import org.apache.nifi.registry.VariableRegistry;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.apache.nifi.ssl.SSLContextService;
 import org.apache.nifi.util.MockFlowFile;
 import org.apache.nifi.util.MockProcessContext;
@@ -62,11 +64,13 @@ public class TestFetchElasticsearch {
 
     private InputStream docExample;
     private TestRunner runner;
+    private VariableRegistry variableRegistry;
 
     @Before
     public void setUp() throws IOException {
         ClassLoader classloader = 
Thread.currentThread().getContextClassLoader();
         docExample = classloader.getResourceAsStream("DocumentExample.json");
+        variableRegistry = 
VariableRegistryUtils.createSystemVariableRegistry();
 
     }
 
@@ -216,7 +220,7 @@ public class TestFetchElasticsearch {
             }
         };
 
-        MockProcessContext context = new MockProcessContext(processor);
+        MockProcessContext context = new MockProcessContext(processor, 
variableRegistry);
         processor.initialize(new MockProcessorInitializationContext(processor, 
context));
         processor.callCreateElasticsearchClient(context);
     }

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/java/org/apache/nifi/authorization/AuthorizerFactoryBean.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/java/org/apache/nifi/authorization/AuthorizerFactoryBean.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/java/org/apache/nifi/authorization/AuthorizerFactoryBean.java
index 8a4a6de..9cce342 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/java/org/apache/nifi/authorization/AuthorizerFactoryBean.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/java/org/apache/nifi/authorization/AuthorizerFactoryBean.java
@@ -25,6 +25,7 @@ import org.apache.nifi.authorization.generated.Authorizers;
 import org.apache.nifi.authorization.generated.Property;
 import org.apache.nifi.nar.ExtensionManager;
 import org.apache.nifi.nar.NarCloseable;
+import org.apache.nifi.registry.VariableRegistry;
 import org.apache.nifi.util.NiFiProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,8 +73,10 @@ public class AuthorizerFactoryBean implements FactoryBean, 
DisposableBean, Autho
 
     private Authorizer authorizer;
     private NiFiProperties properties;
+    private VariableRegistry variableRegistry;
     private final Map<String, Authorizer> authorizers = new HashMap<>();
 
+
     @Override
     public Authorizer getAuthorizer(String identifier) {
         return authorizers.get(identifier);
@@ -189,8 +192,7 @@ public class AuthorizerFactoryBean implements FactoryBean, 
DisposableBean, Autho
         for (final Property property : authorizer.getProperty()) {
             authorizerProperties.put(property.getName(), property.getValue());
         }
-
-        return new 
StandardAuthorizerConfigurationContext(authorizer.getIdentifier(), 
authorizerProperties);
+        return new 
StandardAuthorizerConfigurationContext(authorizer.getIdentifier(), 
authorizerProperties, variableRegistry);
     }
 
     private void performMethodInjection(final Authorizer instance, final Class 
authorizerClass) throws IllegalAccessException, IllegalArgumentException, 
InvocationTargetException {
@@ -484,4 +486,8 @@ public class AuthorizerFactoryBean implements FactoryBean, 
DisposableBean, Autho
     public void setProperties(NiFiProperties properties) {
         this.properties = properties;
     }
+
+    public void setVariableRegistry(VariableRegistry variableRegistry) {
+        this.variableRegistry = variableRegistry;
+    }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/resources/nifi-authorizer-context.xml
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/resources/nifi-authorizer-context.xml
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/resources/nifi-authorizer-context.xml
index 71bf684..09bdf57 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/resources/nifi-authorizer-context.xml
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-authorizer/src/main/resources/nifi-authorizer-context.xml
@@ -21,6 +21,7 @@
     <!-- user/entity authorizer -->
     <bean id="authorizer" 
class="org.apache.nifi.authorization.AuthorizerFactoryBean">
         <property name="properties" ref="nifiProperties"/>
+        <property name="variableRegistry" ref="variableRegistry"/>
     </bean>
 
 </beans>

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/src/test/java/org/apache/nifi/authorization/FileAuthorizerTest.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/src/test/java/org/apache/nifi/authorization/FileAuthorizerTest.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/src/test/java/org/apache/nifi/authorization/FileAuthorizerTest.java
index 03a62d7..2c1c37a 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/src/test/java/org/apache/nifi/authorization/FileAuthorizerTest.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-file-authorizer/src/test/java/org/apache/nifi/authorization/FileAuthorizerTest.java
@@ -21,6 +21,8 @@ import 
org.apache.nifi.authorization.AuthorizationResult.Result;
 import org.apache.nifi.authorization.exception.AuthorizerCreationException;
 import org.apache.nifi.authorization.resource.ResourceFactory;
 import org.apache.nifi.authorization.resource.ResourceType;
+import org.apache.nifi.registry.VariableRegistry;
+import org.apache.nifi.registry.VariableRegistryUtils;
 import org.apache.nifi.util.NiFiProperties;
 import org.apache.nifi.util.file.FileUtils;
 import org.junit.After;
@@ -143,6 +145,7 @@ public class FileAuthorizerTest {
     private File flow;
     private File flowNoPorts;
     private File flowWithDns;
+    private VariableRegistry variableRegistry;
 
     private AuthorizerConfigurationContext configurationContext;
 
@@ -178,8 +181,8 @@ public class FileAuthorizerTest {
         when(properties.getFlowConfigurationFile()).thenReturn(flow);
 
         configurationContext = mock(AuthorizerConfigurationContext.class);
-        
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_AUTHORIZATIONS_FILE))).thenReturn(new
 StandardPropertyValue(primaryAuthorizations.getPath(), null));
-        
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_TENANTS_FILE))).thenReturn(new
 StandardPropertyValue(primaryTenants.getPath(), null));
+        
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_AUTHORIZATIONS_FILE))).thenReturn(new
 StandardPropertyValue(primaryAuthorizations.getPath(), null,variableRegistry));
+        
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_TENANTS_FILE))).thenReturn(new
 StandardPropertyValue(primaryTenants.getPath(), null,variableRegistry));
 
         authorizer = new FileAuthorizer();
         authorizer.setNiFiProperties(properties);
@@ -197,7 +200,7 @@ public class FileAuthorizerTest {
     @Test
     public void 
testOnConfiguredWhenLegacyUsersFileProvidedWithOverlappingRoles() throws 
Exception {
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_LEGACY_AUTHORIZED_USERS_FILE)))
-                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users-multirole.xml", 
null));
+                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users-multirole.xml", 
null,VariableRegistryUtils.createSystemVariableRegistry()));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -222,7 +225,7 @@ public class FileAuthorizerTest {
         when(properties.getFlowConfigurationFile()).thenReturn(flowNoPorts);
 
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_LEGACY_AUTHORIZED_USERS_FILE)))
-                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users.xml", null));
+                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users.xml", 
null,variableRegistry));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -242,7 +245,7 @@ public class FileAuthorizerTest {
     @Test
     public void testOnConfiguredWhenLegacyUsersFileProvided() throws Exception 
{
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_LEGACY_AUTHORIZED_USERS_FILE)))
-                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users.xml", null));
+                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users.xml", 
null,VariableRegistryUtils.createSystemVariableRegistry()));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -392,7 +395,7 @@ public class FileAuthorizerTest {
         authorizer.setNiFiProperties(properties);
 
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_LEGACY_AUTHORIZED_USERS_FILE)))
-                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users-with-dns.xml", 
null));
+                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users-with-dns.xml", 
null,variableRegistry));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -440,7 +443,7 @@ public class FileAuthorizerTest {
     @Test(expected = AuthorizerCreationException.class)
     public void testOnConfiguredWhenBadLegacyUsersFileProvided() throws 
Exception {
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_LEGACY_AUTHORIZED_USERS_FILE)))
-                .thenReturn(new 
StandardPropertyValue("src/test/resources/does-not-exist.xml", null));
+                .thenReturn(new 
StandardPropertyValue("src/test/resources/does-not-exist.xml", 
null,VariableRegistryUtils.createSystemVariableRegistry()));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -450,12 +453,12 @@ public class FileAuthorizerTest {
     @Test(expected = AuthorizerCreationException.class)
     public void testOnConfiguredWhenInitialAdminAndLegacyUsersProvided() 
throws Exception {
         final String adminIdentity = "admin-user";
-
+        final VariableRegistry variableRegistry = 
VariableRegistryUtils.createSystemVariableRegistry();
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, 
null,variableRegistry));
 
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_LEGACY_AUTHORIZED_USERS_FILE)))
-                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users.xml", null));
+                .thenReturn(new 
StandardPropertyValue("src/test/resources/authorized-users.xml", 
null,variableRegistry));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -480,7 +483,7 @@ public class FileAuthorizerTest {
         final String adminIdentity = "admin-user";
 
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, 
null,VariableRegistryUtils.createSystemVariableRegistry()));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -510,6 +513,7 @@ public class FileAuthorizerTest {
 
     @Test
     public void testOnConfiguredWhenInitialAdminProvidedAndNoFlowExists() 
throws Exception {
+        VariableRegistry variableRegistry = 
VariableRegistryUtils.createSystemVariableRegistry();
         // setup NiFi properties to return a file that does not exist
         properties = mock(NiFiProperties.class);
         
when(properties.getRestoreDirectory()).thenReturn(restoreAuthorizations.getParentFile());
@@ -518,7 +522,7 @@ public class FileAuthorizerTest {
 
         final String adminIdentity = "admin-user";
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, null, 
variableRegistry));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -549,6 +553,7 @@ public class FileAuthorizerTest {
     @Test
     public void testOnConfiguredWhenInitialAdminProvidedAndFlowIsNull() throws 
Exception {
         // setup NiFi properties to return a file that does not exist
+        VariableRegistry variableRegistry = 
VariableRegistryUtils.createSystemVariableRegistry();
         properties = mock(NiFiProperties.class);
         
when(properties.getRestoreDirectory()).thenReturn(restoreAuthorizations.getParentFile());
         when(properties.getFlowConfigurationFile()).thenReturn(null);
@@ -556,7 +561,7 @@ public class FileAuthorizerTest {
 
         final String adminIdentity = "admin-user";
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, null, 
variableRegistry));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -597,7 +602,7 @@ public class FileAuthorizerTest {
 
         final String adminIdentity = "CN=localhost, OU=Apache NiFi, O=Apache, 
L=Santa Monica, ST=CA, C=US";
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, 
null,variableRegistry));
 
         writeFile(primaryAuthorizations, EMPTY_AUTHORIZATIONS_CONCISE);
         writeFile(primaryTenants, EMPTY_TENANTS_CONCISE);
@@ -615,7 +620,7 @@ public class FileAuthorizerTest {
         final String adminIdentity = "admin-user";
 
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, 
null,VariableRegistryUtils.createSystemVariableRegistry()));
 
         final String nodeIdentity1 = "node1";
         final String nodeIdentity2 = "node2";
@@ -664,7 +669,7 @@ public class FileAuthorizerTest {
 
         final String adminIdentity = "CN=user1, OU=Apache NiFi, O=Apache, 
L=Santa Monica, ST=CA, C=US";
         
when(configurationContext.getProperty(Mockito.eq(FileAuthorizer.PROP_INITIAL_ADMIN_IDENTITY)))
-                .thenReturn(new StandardPropertyValue(adminIdentity, null));
+                .thenReturn(new StandardPropertyValue(adminIdentity, 
null,variableRegistry));
 
         final String nodeIdentity1 = "CN=node1, OU=Apache NiFi, O=Apache, 
L=Santa Monica, ST=CA, C=US";
         final String nodeIdentity2 = "CN=node2, OU=Apache NiFi, O=Apache, 
L=Santa Monica, ST=CA, C=US";

http://git-wip-us.apache.org/repos/asf/nifi/blob/8412d266/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/StandardAuthorizerConfigurationContext.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/StandardAuthorizerConfigurationContext.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/StandardAuthorizerConfigurationContext.java
index 3010c92..abe532a 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/StandardAuthorizerConfigurationContext.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-authorization/src/main/java/org/apache/nifi/authorization/StandardAuthorizerConfigurationContext.java
@@ -18,6 +18,7 @@ package org.apache.nifi.authorization;
 
 import org.apache.nifi.attribute.expression.language.StandardPropertyValue;
 import org.apache.nifi.components.PropertyValue;
+import org.apache.nifi.registry.VariableRegistry;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -30,10 +31,12 @@ public class StandardAuthorizerConfigurationContext 
implements AuthorizerConfigu
 
     private final String identifier;
     private final Map<String, String> properties;
+    final VariableRegistry variableRegistry;
 
-    public StandardAuthorizerConfigurationContext(String identifier, 
Map<String, String> properties) {
+    public StandardAuthorizerConfigurationContext(String identifier, 
Map<String, String> properties, VariableRegistry variableRegistry) {
         this.identifier = identifier;
         this.properties = Collections.unmodifiableMap(new HashMap<String, 
String>(properties));
+        this.variableRegistry = variableRegistry;
     }
 
     @Override
@@ -48,7 +51,7 @@ public class StandardAuthorizerConfigurationContext 
implements AuthorizerConfigu
 
     @Override
     public PropertyValue getProperty(String property) {
-        return new StandardPropertyValue(properties.get(property), null);
+        return new StandardPropertyValue(properties.get(property), 
null,variableRegistry);
     }
 
 }

Reply via email to