This is an automated email from the ASF dual-hosted git repository.

mcgilman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/master by this push:
     new 4868308  NIFI-6380: Fixed partial updates to parameters
4868308 is described below

commit 4868308fd8e3e630c8dfaa9c418aa64f1f8a74b4
Author: Mark Payne <[email protected]>
AuthorDate: Wed Sep 4 11:48:56 2019 -0400

    NIFI-6380: Fixed partial updates to parameters
    
    This closes #3692
---
 .../nifi/parameter/StandardParameterContext.java   | 46 +++++++++++++++++++++-
 1 file changed, 44 insertions(+), 2 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
index 04cfb8a..ecd8cfa 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
@@ -112,8 +112,10 @@ public class StandardParameterContext implements 
ParameterContext {
                     parameters.remove(parameterDescriptor);
                     changeAffectingComponents = true;
                 } else {
-                    final Parameter oldParameter = 
parameters.put(parameter.getDescriptor(), parameter);
-                    if (oldParameter == null || 
!Objects.equals(oldParameter.getValue(), parameter.getValue())) {
+                    final Parameter updatedParameter = 
createFullyPopulatedParameter(parameter);
+
+                    final Parameter oldParameter = 
parameters.put(updatedParameter.getDescriptor(), updatedParameter);
+                    if (oldParameter == null || 
!Objects.equals(oldParameter.getValue(), updatedParameter.getValue())) {
                         changeAffectingComponents = true;
                     }
                 }
@@ -133,6 +135,46 @@ public class StandardParameterContext implements 
ParameterContext {
         }
     }
 
+    /**
+     * When updating a Parameter, the provided 'updated' Parameter may or may 
not contain a value. This is done because once a Parameter is set,
+     * a user may want to change the description of the Parameter but cannot 
include the value of the Parameter in the request if the Parameter is sensitive 
(because
+     * the value of the Parameter, when retrieved, is masked for sensitive 
Parameters). As a result, a call may be made to {@link #setParameters(Map)} 
that includes
+     * a Parameter whose value is <code>null</code>. If we encounter this, we 
do not want to change the value of the Parameter, so we want to insert into our 
Map
+     * a Parameter object whose value is equal to the current value for that 
Parameter (if any). This method, then, takes a Parameter whose value may or may 
not be
+     * populated and returns a Parameter whose value is populated, if there is 
an appropriate value to populate it with.
+     *
+     * @param proposedParameter the proposed parameter
+     * @return a Parameter whose descriptor is the same as the given proposed 
parameter but whose value has been populated based on the existing value for 
that Parameter (if any)
+     * if the given proposed parameter does not have its value populated
+     */
+    private Parameter createFullyPopulatedParameter(final Parameter 
proposedParameter) {
+        final ParameterDescriptor descriptor = 
getFullyPopulatedDescriptor(proposedParameter);
+        final String value = getFullyPopulatedValue(proposedParameter);
+        return new Parameter(descriptor, value);
+    }
+
+    private String getFullyPopulatedValue(final Parameter proposedParameter) {
+        if (proposedParameter.getValue() != null) {
+            return proposedParameter.getValue();
+        }
+
+        final Parameter oldParameter = 
parameters.get(proposedParameter.getDescriptor());
+        return oldParameter == null ? null : oldParameter.getValue();
+    }
+
+    private ParameterDescriptor getFullyPopulatedDescriptor(final Parameter 
proposedParameter) {
+        final ParameterDescriptor descriptor = 
proposedParameter.getDescriptor();
+        if (descriptor.getDescription() != null) {
+            return descriptor;
+        }
+
+        final Parameter oldParameter = 
parameters.get(proposedParameter.getDescriptor());
+
+        // We know that the Parameters have the same name, since this is what 
the Descriptor's hashCode & equality are based on. The only thing that may be 
different
+        // is the description. And since the proposed Parameter does not have 
a Description, we want to use whatever is currently set.
+        return oldParameter == null ? null : oldParameter.getDescriptor();
+    }
+
     @Override
     public long getVersion() {
         readLock.lock();

Reply via email to