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

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


The following commit(s) were added to refs/heads/main by this push:
     new 94624872a4 NIFI-14599 Use Parameter Context Revision when updating 
multiple Groups from Parameter Provider (#10145)
94624872a4 is described below

commit 94624872a4e7a2a86d7f4c72c86e68b3fb23c6d9
Author: Pierre Villard <[email protected]>
AuthorDate: Sat Aug 2 03:03:25 2025 +0200

    NIFI-14599 Use Parameter Context Revision when updating multiple Groups 
from Parameter Provider (#10145)
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../nifi/web/util/ParameterUpdateManager.java      |  7 ++-
 .../tests/system/PropertiesParameterProvider.java  | 37 +++++++++++--
 .../system/parameters/ParameterContextIT.java      | 63 ++++++++++++++++++++++
 3 files changed, 101 insertions(+), 6 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
index 80b9d15362..b60f643537 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/util/ParameterUpdateManager.java
@@ -169,7 +169,12 @@ public class ParameterUpdateManager {
             for (final ParameterContextEntity updatedContextEntity : 
updatedContextEntities) {
                 logger.info("Updating Parameter Context with ID {}", 
updatedContextEntity.getId());
 
-                
updatedEntities.add(performParameterContextUpdate(asyncRequest, uri, 
replicateRequest, revision, updatedContextEntity));
+                final Revision contextRevision = new Revision(
+                        updatedContextEntity.getRevision().getVersion(),
+                        updatedContextEntity.getRevision().getClientId(),
+                        updatedContextEntity.getId());
+
+                
updatedEntities.add(performParameterContextUpdate(asyncRequest, uri, 
replicateRequest, contextRevision, updatedContextEntity));
                 logger.info("Successfully updated Parameter Context with ID 
{}", updatedContextEntity.getId());
             }
             asyncRequest.markStepComplete();
diff --git 
a/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
 
b/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
index ae3b23b4a2..0a176314ad 100644
--- 
a/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
+++ 
b/nifi-system-tests/nifi-system-test-extensions-bundle/nifi-system-test-extensions/src/main/java/org/apache/nifi/parameter/tests/system/PropertiesParameterProvider.java
@@ -16,8 +16,10 @@
  */
 package org.apache.nifi.parameter.tests.system;
 
+import org.apache.nifi.annotation.behavior.DynamicProperty;
 import org.apache.nifi.components.PropertyDescriptor;
 import org.apache.nifi.controller.ConfigurationContext;
+import org.apache.nifi.expression.ExpressionLanguageScope;
 import org.apache.nifi.parameter.AbstractParameterProvider;
 import org.apache.nifi.parameter.Parameter;
 import org.apache.nifi.parameter.ParameterGroup;
@@ -27,15 +29,19 @@ import org.apache.nifi.processor.util.StandardValidators;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
 /**
  * Parameters are provided by properties-style configuration.
  */
+@DynamicProperty(name = "Parameter Group Name", value = "Parameters for the 
group",
+        expressionLanguageScope = ExpressionLanguageScope.NONE,
+        description = "Specifies parameters in a properties file format for 
the group")
 public class PropertiesParameterProvider extends AbstractParameterProvider 
implements ParameterProvider {
 
     private PropertyDescriptor PARAMETERS = new PropertyDescriptor.Builder()
@@ -51,13 +57,34 @@ public class PropertiesParameterProvider extends 
AbstractParameterProvider imple
         return Collections.singletonList(PARAMETERS);
     }
 
+    @Override
+    protected PropertyDescriptor getSupportedDynamicPropertyDescriptor(final 
String propertyDescriptorName) {
+        return new PropertyDescriptor.Builder()
+                .name(propertyDescriptorName)
+                .addValidator(StandardValidators.NON_EMPTY_VALIDATOR)
+                .dynamic(true)
+                .required(false)
+                .build();
+    }
+
     @Override
     public List<ParameterGroup> fetchParameters(final ConfigurationContext 
context) {
+        final List<ParameterGroup> groups = new ArrayList<>();
+
+        if (context.getProperty(PARAMETERS).isSet()) {
+            final List<Parameter> parameters = 
fetchParametersFromProperties(context.getProperty(PARAMETERS).getValue());
+            groups.add(new ParameterGroup("Parameters", parameters));
+        }
+
+        for (final Map.Entry<PropertyDescriptor, String> entry : 
context.getProperties().entrySet()) {
+            if (entry.getKey().isDynamic()) {
+                final String groupName = entry.getKey().getName();
+                final List<Parameter> parameters = 
fetchParametersFromProperties(entry.getValue());
+                groups.add(new ParameterGroup(groupName, parameters));
+            }
+        }
 
-        final List<Parameter> parameters = 
context.getProperty(PARAMETERS).isSet()
-                ? 
fetchParametersFromProperties(context.getProperty(PARAMETERS).getValue())
-                : Collections.emptyList();
-        return Arrays.asList(new ParameterGroup("Parameters", parameters));
+        return groups;
     }
 
     private List<Parameter> fetchParametersFromProperties(final String 
parametersPropertiesValue) {
diff --git 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
index 7b84ee6695..d9a84ac088 100644
--- 
a/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
+++ 
b/nifi-system-tests/nifi-system-test-suite/src/test/java/org/apache/nifi/tests/system/parameters/ParameterContextIT.java
@@ -278,6 +278,69 @@ public class ParameterContextIT extends NiFiSystemIT {
         assertThrows(NiFiClientException.class, () -> 
updateParameterContext(createdContextEntity, "non.sensitive", "value"));
     }
 
+    @Test
+    public void testParameterProviderUpdateMultipleGroups() throws 
NiFiClientException, IOException, InterruptedException {
+        ParameterProviderEntity parameterProvider = 
createParameterProvider("PropertiesParameterProvider");
+
+        final Map<String, String> initialProperties = new HashMap<>();
+        initialProperties.put("group1", "A1=1\nA2=1");
+        initialProperties.put("group2", "B1=2\nB2=2");
+        parameterProvider = 
updateParameterProviderProperties(parameterProvider, initialProperties);
+
+        final String parameterGroupName1 = "group1";
+        final String parameterContextName1 = "PC-group-1";
+        final ParameterContextEntity contextEntity1 = 
createParameterContextEntity(parameterContextName1, null, 
Collections.emptySet(),
+                Collections.emptyList(), parameterProvider, 
parameterGroupName1);
+        final ParameterContextEntity createdContextEntity1 = 
getNifiClient().getParamContextClient().createParamContext(contextEntity1);
+
+        final String parameterGroupName2 = "group2";
+        final String parameterContextName2 = "PC-group-2";
+        final ParameterContextEntity contextEntity2 = 
createParameterContextEntity(parameterContextName2, null, 
Collections.emptySet(),
+                Collections.emptyList(), parameterProvider, 
parameterGroupName2);
+        final ParameterContextEntity createdContextEntity2 = 
getNifiClient().getParamContextClient().createParamContext(contextEntity2);
+
+        final Map<String, ParameterSensitivity> sensitivities = new 
HashMap<>();
+        sensitivities.put("A1", ParameterSensitivity.NON_SENSITIVE);
+        sensitivities.put("A2", ParameterSensitivity.NON_SENSITIVE);
+        sensitivities.put("B1", ParameterSensitivity.NON_SENSITIVE);
+        sensitivities.put("B2", ParameterSensitivity.NON_SENSITIVE);
+        sensitivities.put("C", ParameterSensitivity.NON_SENSITIVE);
+        sensitivities.put("D", ParameterSensitivity.NON_SENSITIVE);
+
+        final ParameterGroupConfigurationEntity config1 = new 
ParameterGroupConfigurationEntity();
+        config1.setSynchronized(true);
+        config1.setGroupName("group1");
+        config1.setParameterContextName(parameterContextName1);
+        config1.setParameterSensitivities(sensitivities);
+
+        final ParameterGroupConfigurationEntity config2 = new 
ParameterGroupConfigurationEntity();
+        config2.setSynchronized(true);
+        config2.setGroupName("group2");
+        config2.setParameterContextName(parameterContextName2);
+        config2.setParameterSensitivities(sensitivities);
+
+        fetchAndWaitForAppliedParameters(parameterProvider, 
Arrays.asList(config1, config2));
+
+        ParameterContextEntity fetchedContext1 = 
getNifiClient().getParamContextClient().getParamContext(createdContextEntity1.getId(),
 false);
+        ParameterContextEntity fetchedContext2 = 
getNifiClient().getParamContextClient().getParamContext(createdContextEntity2.getId(),
 false);
+
+        assertEquals(Set.of("A1", "A2"), getParameterNames(fetchedContext1));
+        assertEquals(Set.of("B1", "B2"), getParameterNames(fetchedContext2));
+
+        final Map<String, String> updatedProperties = new HashMap<>();
+        updatedProperties.put("group1", "A2=1\nC=3");
+        updatedProperties.put("group2", "B1=2\nD=4");
+        parameterProvider = 
updateParameterProviderProperties(parameterProvider, updatedProperties);
+
+        fetchAndWaitForAppliedParameters(parameterProvider, 
Arrays.asList(config1, config2));
+
+        fetchedContext1 = 
getNifiClient().getParamContextClient().getParamContext(createdContextEntity1.getId(),
 false);
+        fetchedContext2 = 
getNifiClient().getParamContextClient().getParamContext(createdContextEntity2.getId(),
 false);
+
+        assertEquals(Set.of("A2", "C"), getParameterNames(fetchedContext1));
+        assertEquals(Set.of("B1", "D"), getParameterNames(fetchedContext2));
+    }
+
     @Test
     public void testParameterRemovalThroughProvider() throws 
NiFiClientException, IOException, InterruptedException {
         final ParameterProviderEntity parameterProvider = 
createParameterProvider("PropertiesParameterProvider");

Reply via email to