markap14 commented on a change in pull request #4134: NIFI-7242: When a
Parameter is changed, any property referencing that…
URL: https://github.com/apache/nifi/pull/4134#discussion_r391181945
##########
File path:
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/AbstractComponentNode.java
##########
@@ -815,12 +818,110 @@ public PropertyDescriptor getPropertyDescriptor(final
String name) {
}
- private void onPropertyModified(final PropertyDescriptor descriptor, final
String oldValue, final String newValue) {
+ protected void onPropertyModified(final PropertyDescriptor descriptor,
final String oldValue, final String newValue) {
try (final NarCloseable narCloseable =
NarCloseable.withComponentNarLoader(extensionManager,
getComponent().getClass(), getComponent().getIdentifier())) {
getComponent().onPropertyModified(descriptor, oldValue, newValue);
}
}
+ @Override
+ public void onParametersModified(final Map<String, ParameterUpdate>
updatedParameters) {
+ // If the component doesn't reference any parameters, then there's
nothing to be done.
+ if (!isReferencingParameter()) {
+ return;
+ }
+
+ final ParameterLookup previousParameterLookup =
createParameterLookupForPreviousValues(updatedParameters);
+
+ // For any Property that references an updated Parameter, we need to
call onPropertyModified().
+ // Additionally, we need to trigger validation to run if this
component is affected by the parameter update.
+ boolean componentAffected = false;
+ for (final Map.Entry<PropertyDescriptor, PropertyConfiguration> entry
: properties.entrySet()) {
+ final PropertyDescriptor propertyDescriptor = entry.getKey();
+ final PropertyConfiguration configuration = entry.getValue();
+
+ // Determine if this property is affected by the Parameter Update
+ boolean propertyAffected = false;
+ final List<ParameterReference> parameterReferences =
configuration.getParameterReferences();
+ for (final ParameterReference reference : parameterReferences) {
+ final String referencedParamName =
reference.getParameterName();
+ if (updatedParameters.containsKey(referencedParamName)) {
+ propertyAffected = true;
+ componentAffected = true;
+ break;
+ }
+ }
+
+ if (propertyAffected) {
+ final String previousValue =
configuration.getEffectiveValue(previousParameterLookup);
+ final String updatedValue =
configuration.getEffectiveValue(getParameterContext());
+
+ // Check if the value of the property is truly affected. It's
possible that we could have a property configured as something like "#{a}#{b}"
+ // Where parameter a = "abc-" and b = "cba". The update could
change a to "abc" and b to "-cba". As a result, the property value previously
was "abc-cba" and still is.
+ // In such a case, we should not call onPropertyModified.
+ final boolean propertyUpdated = !Objects.equals(previousValue,
updatedValue);
+ if (propertyUpdated) {
+ try {
+ logger.debug("Parameter Context updated, resulting in
property {} of {} changing. Calling onPropertyModified().", propertyDescriptor,
this);
Review comment:
This is fine to log if it's sensitive. We're not logging the value, just the
descriptor.
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
With regards,
Apache Git Services