pvillard31 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_r391184601
 
 

 ##########
 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:
   You're right... I looked at it too quickly and assumed that the line below 
was containing the parameters of the log statement. Doh.

----------------------------------------------------------------
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:
us...@infra.apache.org


With regards,
Apache Git Services

Reply via email to