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); } }
