mirror of
https://github.com/apache/nifi.git
synced 2025-02-07 02:28:31 +00:00
NIFI-8666: Allow users to escape parameter names in Expression Language using quotes. (#5133)
This commit is contained in:
parent
b49a62e1b5
commit
96a8b2d090
@ -143,8 +143,8 @@ attributeRefOrFunctionCall : (attributeRef | standaloneFunction | parameterRefer
|
|||||||
referenceOrFunction : DOLLAR LBRACE attributeRefOrFunctionCall (COLON functionCall)* RBRACE ->
|
referenceOrFunction : DOLLAR LBRACE attributeRefOrFunctionCall (COLON functionCall)* RBRACE ->
|
||||||
^(EXPRESSION attributeRefOrFunctionCall functionCall*);
|
^(EXPRESSION attributeRefOrFunctionCall functionCall*);
|
||||||
|
|
||||||
parameterReference : PARAMETER_REFERENCE_START ATTRIBUTE_NAME RBRACE ->
|
parameterReference : PARAMETER_REFERENCE_START singleAttrRef RBRACE ->
|
||||||
^(PARAMETER_REFERENCE ATTRIBUTE_NAME);
|
^(PARAMETER_REFERENCE singleAttrRef);
|
||||||
|
|
||||||
expression : referenceOrFunction;
|
expression : referenceOrFunction;
|
||||||
|
|
||||||
|
@ -344,6 +344,20 @@ public class TestQuery {
|
|||||||
verifyEquals("${#{test}:append(' - '):append(#{test})}", attributes, stateValues, parameters,"unit - unit");
|
verifyEquals("${#{test}:append(' - '):append(#{test})}", attributes, stateValues, parameters,"unit - unit");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testParameterReferenceWithSpace() {
|
||||||
|
final Map<String, String> attributes = Collections.emptyMap();
|
||||||
|
final Map<String, String> stateValues = Collections.emptyMap();
|
||||||
|
final Map<String, String> parameters = new HashMap<>();
|
||||||
|
parameters.put("test param", "unit");
|
||||||
|
|
||||||
|
final Query query = Query.compile("${'#{test param}'}");
|
||||||
|
verifyEquals("${#{'test param'}}", attributes, stateValues, parameters,"unit");
|
||||||
|
verifyEquals("${#{'test param'}:append(' - '):append(#{'test param'})}", attributes, stateValues, parameters,"unit - unit");
|
||||||
|
|
||||||
|
verifyEquals("${#{\"test param\"}}", attributes, stateValues, parameters,"unit");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testJsonPath() throws IOException {
|
public void testJsonPath() throws IOException {
|
||||||
Map<String,String> attributes = verifyJsonPathExpressions(
|
Map<String,String> attributes = verifyJsonPathExpressions(
|
||||||
|
@ -221,12 +221,32 @@ public class StandardParameterContext implements ParameterContext {
|
|||||||
public Optional<Parameter> getParameter(final ParameterDescriptor parameterDescriptor) {
|
public Optional<Parameter> getParameter(final ParameterDescriptor parameterDescriptor) {
|
||||||
readLock.lock();
|
readLock.lock();
|
||||||
try {
|
try {
|
||||||
return Optional.ofNullable(parameters.get(parameterDescriptor));
|
// When Expression Language is used, the Parameter may require being escaped.
|
||||||
|
// This is the case, for instance, if a Parameter name has a space in it.
|
||||||
|
// Because of this, we may have a case where we attempt to get a Parameter by name
|
||||||
|
// and that Parameter name is enclosed within single tick marks, as a way of escaping
|
||||||
|
// the name via the Expression Language. In this case, we want to strip out those
|
||||||
|
// escaping tick marks and use just the raw name for looking up the Parameter.
|
||||||
|
final ParameterDescriptor unescaped = unescape(parameterDescriptor);
|
||||||
|
return Optional.ofNullable(parameters.get(unescaped));
|
||||||
} finally {
|
} finally {
|
||||||
readLock.unlock();
|
readLock.unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ParameterDescriptor unescape(final ParameterDescriptor descriptor) {
|
||||||
|
final String parameterName = descriptor.getName().trim();
|
||||||
|
if ((parameterName.startsWith("'") && parameterName.endsWith("'")) || (parameterName.startsWith("\"") && parameterName.endsWith("\""))) {
|
||||||
|
final String stripped = parameterName.substring(1, parameterName.length() - 1);
|
||||||
|
return new ParameterDescriptor.Builder()
|
||||||
|
.from(descriptor)
|
||||||
|
.name(stripped)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
return descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<ParameterDescriptor, Parameter> getParameters() {
|
public Map<ParameterDescriptor, Parameter> getParameters() {
|
||||||
readLock.lock();
|
readLock.lock();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user