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 5588401012e NIFI-15957 Avoid resolving Parameter references when 
displaying Parameter Contexts (#11267)
5588401012e is described below

commit 5588401012e3010168bdd4f1876937575bcd251f
Author: Pierre Villard <[email protected]>
AuthorDate: Mon Jun 1 10:39:47 2026 -0700

    NIFI-15957 Avoid resolving Parameter references when displaying Parameter 
Contexts (#11267)
    
    Signed-off-by: David Handermann <[email protected]>
---
 .../StandardVersionedComponentSynchronizer.java    |  4 +-
 .../nifi/parameter/StandardParameterContext.java   |  5 +++
 .../parameter/TestStandardParameterContext.java    | 44 ++++++++++++++++++++++
 .../apache/nifi/parameter/ParameterContext.java    | 14 +++++++
 .../org/apache/nifi/web/api/dto/DtoFactory.java    |  2 +-
 .../system/parameters/ParameterContextIT.java      | 36 ++++++++++++++++++
 6 files changed, 101 insertions(+), 4 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
index 73fed55d269..69db3fb520d 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/flow/synchronization/StandardVersionedComponentSynchronizer.java
@@ -1882,14 +1882,13 @@ public class StandardVersionedComponentSynchronizer 
implements VersionedComponen
     }
 
     private void collectValueAndReferences(final ParameterContext 
parameterContext, final Map<String, ParameterValueAndReferences> valueAndRef) {
-        parameterContext.getEffectiveParameters()
+        parameterContext.getRawEffectiveParameters()
                 .forEach((pd, param) -> valueAndRef.put(pd.getName(), 
getValueAndReferences(param)));
     }
 
     protected Set<String> getUpdatedParameterNames(final ParameterContext 
parameterContext, final VersionedParameterContext proposed) {
         final Map<String, ParameterValueAndReferences> originalValues = new 
HashMap<>();
         collectValueAndReferences(parameterContext, originalValues);
-        parameterContext.getEffectiveParameters().forEach((pd, param) -> 
originalValues.put(pd.getName(), getValueAndReferences(param)));
 
         final Map<String, ParameterValueAndReferences> proposedValues = new 
HashMap<>();
         if (proposed != null) {
@@ -1899,7 +1898,6 @@ public class StandardVersionedComponentSynchronizer 
implements VersionedComponen
                     final ParameterContext inheritedContext = 
getParameterContextByName(name);
                     if (inheritedContext != null) {
                         collectValueAndReferences(inheritedContext, 
proposedValues);
-                        inheritedContext.getEffectiveParameters().forEach((pd, 
param) -> proposedValues.put(pd.getName(), getValueAndReferences(param)));
                     }
                 }
             }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
index 59655ecc510..ad2d6987d77 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/parameter/StandardParameterContext.java
@@ -354,6 +354,11 @@ public class StandardParameterContext implements 
ParameterContext {
         }
     }
 
+    @Override
+    public Map<ParameterDescriptor, Parameter> getRawEffectiveParameters() {
+        return getMergedEffectiveParametersReadLocked();
+    }
+
     @Override
     public Map<String, Parameter> getEffectiveParameterUpdates(final 
Map<String, Parameter> parameterUpdates, final List<ParameterContext> 
inheritedParameterContexts) {
         Objects.requireNonNull(parameterUpdates, "Parameter Updates must be 
specified");
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/parameter/TestStandardParameterContext.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/parameter/TestStandardParameterContext.java
index e350056e64e..992be669bab 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/parameter/TestStandardParameterContext.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/parameter/TestStandardParameterContext.java
@@ -962,6 +962,50 @@ public class TestStandardParameterContext {
         assertEquals("myserver.example.com", effective.get(new 
ParameterDescriptor.Builder().name("db_host").build()).getValue());
     }
 
+    @Test
+    public void testGetRawEffectiveParametersPreservesAliasValue() {
+        final StandardParameterContextManager parameterContextLookup = new 
StandardParameterContextManager();
+
+        final ParameterContext s = createParameterContext("s", 
parameterContextLookup);
+        addProvidedParameter(s, "db_host", "myserver.example.com");
+        addProvidedParameter(s, "db_port", "3306");
+
+        final ParameterContext p = createParameterContext("p", 
parameterContextLookup);
+        addParameter(p, "host", "#{db_host}");
+        addParameter(p, "port", "#{db_port}");
+        addParameter(p, "plain", "literal_value");
+
+        p.setInheritedParameterContexts(List.of(s));
+
+        final Map<ParameterDescriptor, Parameter> raw = 
p.getRawEffectiveParameters();
+        assertEquals("#{db_host}", raw.get(new 
ParameterDescriptor.Builder().name("host").build()).getValue());
+        assertEquals("#{db_port}", raw.get(new 
ParameterDescriptor.Builder().name("port").build()).getValue());
+        assertEquals("literal_value", raw.get(new 
ParameterDescriptor.Builder().name("plain").build()).getValue());
+
+        assertEquals("myserver.example.com", raw.get(new 
ParameterDescriptor.Builder().name("db_host").build()).getValue());
+        assertEquals("3306", raw.get(new 
ParameterDescriptor.Builder().name("db_port").build()).getValue());
+
+        final Map<ParameterDescriptor, Parameter> effective = 
p.getEffectiveParameters();
+        assertEquals("myserver.example.com", effective.get(new 
ParameterDescriptor.Builder().name("host").build()).getValue());
+        assertEquals("3306", effective.get(new 
ParameterDescriptor.Builder().name("port").build()).getValue());
+    }
+
+    @Test
+    public void testGetRawEffectiveParametersWithNoInheritance() {
+        final StandardParameterContextManager parameterContextLookup = new 
StandardParameterContextManager();
+
+        final ParameterContext p = createParameterContext("p", 
parameterContextLookup);
+        addParameter(p, "a", "#{b}");
+        addParameter(p, "b", "concrete");
+
+        final Map<ParameterDescriptor, Parameter> raw = 
p.getRawEffectiveParameters();
+        assertEquals("#{b}", raw.get(new 
ParameterDescriptor.Builder().name("a").build()).getValue());
+        assertEquals("concrete", raw.get(new 
ParameterDescriptor.Builder().name("b").build()).getValue());
+
+        final Map<ParameterDescriptor, Parameter> effective = 
p.getEffectiveParameters();
+        assertEquals("concrete", effective.get(new 
ParameterDescriptor.Builder().name("a").build()).getValue());
+    }
+
     @Test
     public void testParameterValueReferenceResolvesQuotedName() {
         final StandardParameterContextManager parameterContextLookup = new 
StandardParameterContextManager();
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/parameter/ParameterContext.java
 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/parameter/ParameterContext.java
index 7323db1718f..44e02f7d929 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/parameter/ParameterContext.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/parameter/ParameterContext.java
@@ -99,6 +99,20 @@ public interface ParameterContext extends ParameterLookup, 
ComponentAuthorizable
      */
     Map<ParameterDescriptor, Parameter> getEffectiveParameters();
 
+    /**
+     * Returns the merged effective parameter map -- identical in shape to 
{@link #getEffectiveParameters()} --
+     * but WITHOUT resolving one-to-one parameter value references. Local 
aliases retain their literal
+     * <code>#{otherName}</code> values. Use this method for display, 
persistence comparison, or any other
+     * read-side use where the raw, user-authored value matters. Use {@link 
#getEffectiveParameters()}
+     * when components require fully-resolved values for runtime substitution.
+     *
+     * @return a Map that contains all Parameters in the context and all 
nested ParameterContexts, keyed by their
+     *         descriptors, without parameter value reference resolution 
applied
+     */
+    default Map<ParameterDescriptor, Parameter> getRawEffectiveParameters() {
+        return getEffectiveParameters();
+    }
+
     /**
      * Returns a map from parameter name to Parameter, representing all 
parameters that would be effectively
      * updated if the provided configuration was applied.  Only parameters 
that would be effectively updated or added are
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index 3ba5b326601..bfd7083cf18 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -1522,7 +1522,7 @@ public final class DtoFactory {
         dto.setBoundProcessGroups(boundGroups);
 
         final Set<ParameterEntity> parameterEntities = new LinkedHashSet<>();
-        final Map<ParameterDescriptor, Parameter> parameters = 
includeInheritedParameters ? parameterContext.getEffectiveParameters()
+        final Map<ParameterDescriptor, Parameter> parameters = 
includeInheritedParameters ? parameterContext.getRawEffectiveParameters()
                 : parameterContext.getParameters();
         for (final Parameter parameter : parameters.values()) {
             parameterEntities.add(createParameterEntity(parameterContext, 
parameter, revisionManager, parameterContextLookup));
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 987dc7cc00b..f0dc1976e55 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
@@ -1406,6 +1406,42 @@ public class ParameterContextIT extends NiFiSystemIT {
         }
     }
 
+    @Test
+    public void testParameterAliasDisplayedAsRawValue() throws 
NiFiClientException, IOException {
+        final Set<ParameterEntity> sParams = new HashSet<>();
+        sParams.add(createParameterEntity("db_host", null, false, 
"myserver.example.com"));
+        final ParameterContextEntity sContextEntity = 
createParameterContextEntity("S_RawDisplay", "Inherited context",
+                sParams, Collections.emptyList(), null, null);
+        final ParameterContextEntity createdS = 
getNifiClient().getParamContextClient().createParamContext(sContextEntity);
+
+        final Set<ParameterEntity> pParams = new HashSet<>();
+        pParams.add(createParameterEntity("host", null, false, "#{db_host}"));
+        final ParameterContextEntity pContextEntity = 
createParameterContextEntity("P_RawDisplay", "Parent context with alias",
+                pParams, Collections.singletonList(createdS), null, null);
+        final ParameterContextEntity createdP = 
getNifiClient().getParamContextClient().createParamContext(pContextEntity);
+
+        final ParameterContextEntity fetched = 
getNifiClient().getParamContextClient().getParamContext(createdP.getId(), true);
+        final Set<ParameterEntity> parameters = 
fetched.getComponent().getParameters();
+
+        final ParameterDTO hostDto = parameters.stream()
+                .map(ParameterEntity::getParameter)
+                .filter(p -> "host".equals(p.getName()))
+                .findFirst()
+                .orElse(null);
+        assertNotNull(hostDto);
+        assertFalse(hostDto.getInherited() != null && hostDto.getInherited());
+        assertEquals("#{db_host}", hostDto.getValue());
+
+        final ParameterDTO dbHostDto = parameters.stream()
+                .map(ParameterEntity::getParameter)
+                .filter(p -> "db_host".equals(p.getName()))
+                .findFirst()
+                .orElse(null);
+        assertNotNull(dbHostDto);
+        assertTrue(dbHostDto.getInherited());
+        assertEquals("myserver.example.com", dbHostDto.getValue());
+    }
+
     protected void assertAsset(final AssetEntity asset, final String 
expectedName) {
         assertNotNull(asset);
         assertNotNull(asset.getAsset());

Reply via email to