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

kdoran 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 937601ffa8f NIFI-15748 Skip inherited parameters when validating asset 
references (#11042)
937601ffa8f is described below

commit 937601ffa8fd5c6149b5342eb4f99fc5cf5cf916
Author: Bryan Bende <[email protected]>
AuthorDate: Thu Mar 26 00:14:42 2026 -0400

    NIFI-15748 Skip inherited parameters when validating asset references 
(#11042)
---
 .../apache/nifi/web/api/dto/AssetReferenceDTO.java |  5 ++
 .../nifi/web/api/ParameterContextResource.java     |  4 ++
 .../system/parameters/ParameterContextIT.java      | 53 ++++++++++++++++++++++
 3 files changed, 62 insertions(+)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/AssetReferenceDTO.java
 
b/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/AssetReferenceDTO.java
index 8db542277c9..dae300e9951 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/AssetReferenceDTO.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/AssetReferenceDTO.java
@@ -74,4 +74,9 @@ public class AssetReferenceDTO {
     public int hashCode() {
         return Objects.hashCode(id);
     }
+
+    @Override
+    public String toString() {
+        return "AssetReferenceDTO[id=%s, name=%s]".formatted(id, name);
+    }
 }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
index f8d7b3f2906..640bcf9defe 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterContextResource.java
@@ -800,6 +800,10 @@ public class ParameterContextResource extends 
AbstractParameterResource {
     private void validateAssetReferences(final ParameterContextDTO 
parameterContextDto) {
         if (parameterContextDto.getParameters() != null) {
             for (final ParameterEntity entity : 
parameterContextDto.getParameters()) {
+                if (Boolean.TRUE.equals(entity.getParameter().getInherited())) 
{
+                    continue;
+                }
+
                 final List<AssetReferenceDTO> referencedAssets = 
entity.getParameter().getReferencedAssets();
                 if (referencedAssets == null) {
                     continue;
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 6e2658fb539..40a609bd79b 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
@@ -1056,6 +1056,59 @@ public class ParameterContextIT extends NiFiSystemIT {
         waitForStoppedProcessor(ingest.getId());
     }
 
+    @Test
+    public void testRemoveInheritedContextWithAssetReference() throws 
NiFiClientException, IOException, InterruptedException {
+        // Create two child parameter contexts
+        final ParameterContextEntity childContext1 = 
getClientUtil().createParameterContext("childContext1", Map.of("fileToIngest", 
""));
+        final ParameterContextEntity childContext2 = 
getClientUtil().createParameterContext("childContext2", Map.of("otherParam", 
"otherValue"));
+
+        // Create an asset in child context 1 and update its parameter to 
reference the asset
+        final File assetFile = new 
File("src/test/resources/sample-assets/helloworld.txt");
+        final AssetEntity asset = createAsset(childContext1.getId(), 
assetFile);
+
+        final ParameterContextUpdateRequestEntity referenceAssetUpdateRequest 
= getClientUtil().updateParameterAssetReferences(
+                childContext1, Map.of("fileToIngest", 
List.of(asset.getAsset().getId())));
+        
getClientUtil().waitForParameterContextRequestToComplete(childContext1.getId(), 
referenceAssetUpdateRequest.getRequest().getRequestId());
+
+        // Create a parent context that inherits both child contexts
+        final ParameterContextEntity parentContext = 
getClientUtil().createParameterContext("parentContext",
+                Collections.emptyMap(), List.of(childContext1.getId(), 
childContext2.getId()), null);
+
+        // Fetch the parent with inherited parameters included, simulating 
what the UI does when
+        // loading the parameter context for editing. The response includes 
inherited parameters
+        // (with inherited=true and referencedAssets populated) from both 
child contexts.
+        final ParameterContextEntity fetchedParent = 
getNifiClient().getParamContextClient().getParamContext(parentContext.getId(), 
true);
+
+        // Verify the fetched parent includes the inherited parameter that 
references the asset
+        final Set<ParameterEntity> fetchedParams = 
fetchedParent.getComponent().getParameters();
+        final ParameterEntity inheritedAssetParam = fetchedParams.stream()
+                .filter(p -> "fileToIngest".equals(p.getParameter().getName()))
+                .findFirst()
+                .orElse(null);
+        assertNotNull(inheritedAssetParam);
+        assertTrue(inheritedAssetParam.getParameter().getInherited());
+        
assertNotNull(inheritedAssetParam.getParameter().getReferencedAssets());
+        
assertFalse(inheritedAssetParam.getParameter().getReferencedAssets().isEmpty());
+
+        // Modify only the inherited contexts list to remove childContext1, 
keeping all the
+        // parameters from the fetched response intact. This reproduces what 
the UI sends when
+        // a user removes an inherited context: the full parameter list 
(including inherited
+        // parameters with asset references from the now-removed context) is 
still present.
+        fetchedParent.getComponent().setInheritedParameterContexts(
+                
fetchedParent.getComponent().getInheritedParameterContexts().stream()
+                        .filter(ref -> 
ref.getId().equals(childContext2.getId()))
+                        .collect(Collectors.toList()));
+
+        final ParameterContextUpdateRequestEntity removeInheritanceRequest =
+                
getNifiClient().getParamContextClient().updateParamContext(fetchedParent);
+        
getClientUtil().waitForParameterContextRequestToComplete(parentContext.getId(), 
removeInheritanceRequest.getRequest().getRequestId());
+
+        // Verify only childContext2 remains as inherited
+        final ParameterContextEntity updatedParent = 
getNifiClient().getParamContextClient().getParamContext(parentContext.getId(), 
false);
+        assertEquals(1, 
updatedParent.getComponent().getInheritedParameterContexts().size());
+        assertEquals(childContext2.getId(), 
updatedParent.getComponent().getInheritedParameterContexts().get(0).getId());
+    }
+
     @Test
     public void testAssetReferenceAfterRestart() throws NiFiClientException, 
IOException, InterruptedException {
         // Create Parameter Context

Reply via email to