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

mcgilman 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 ece83709f4 NIFI-10473: Removing referencing components check on param 
provider f… (#6388)
ece83709f4 is described below

commit ece83709f4769fe4b0950c1aa4b32a559599385f
Author: Joe Gresock <[email protected]>
AuthorDate: Fri Sep 23 13:44:52 2022 -0400

    NIFI-10473: Removing referencing components check on param provider f… 
(#6388)
    
    * NIFI-10473: Removing referencing components check on param provider fetch
    
    * NIFI-10473: Adding parameter status DTO to ParameterProviderDTO
    
    * Allowing parameterStatus to be populated even when no parameters were 
updated
    
    * Adding ParameterStatus enum for parameter fetching
    
    * Adding MISSING_BUT_REFERENCED ParameterStatus
    
    This closes #6388
---
 .../nifi/web/api/dto/ParameterProviderDTO.java     | 10 +++
 .../apache/nifi/web/api/dto/ParameterStatus.java   | 25 ++++++
 .../nifi/web/api/dto/ParameterStatusDTO.java       | 46 +++++++++++
 .../apache/nifi/web/StandardNiFiServiceFacade.java |  5 ++
 .../nifi/web/api/ParameterProviderResource.java    | 88 +++++++++++++++++++++-
 5 files changed, 170 insertions(+), 4 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterProviderDTO.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterProviderDTO.java
index b0365765dc..b9ca1a699b 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterProviderDTO.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterProviderDTO.java
@@ -49,6 +49,7 @@ public class ParameterProviderDTO extends ComponentDTO {
     private Map<String, PropertyDescriptorDTO> descriptors;
     private Collection<ParameterGroupConfigurationEntity> 
parameterGroupConfigurations;
     private Set<AffectedComponentEntity> affectedComponents;
+    private Set<ParameterStatusDTO> parameterStatus;
     private Set<ParameterProviderReferencingComponentEntity> 
referencingParameterContexts;
 
     private String customUiUrl;
@@ -84,6 +85,15 @@ public class ParameterProviderDTO extends ComponentDTO {
         this.referencingParameterContexts = referencingParameterContexts;
     }
 
+    @ApiModelProperty("The status of all provided parameters for this 
parameter provider")
+    public Set<ParameterStatusDTO> getParameterStatus() {
+        return parameterStatus;
+    }
+
+    public void setParameterStatus(Set<ParameterStatusDTO> parameterStatus) {
+        this.parameterStatus = parameterStatus;
+    }
+
     @ApiModelProperty(value = "The Parameter Contexts that reference this 
Parameter Provider", accessMode = ApiModelProperty.AccessMode.READ_ONLY)
     public Set<ParameterProviderReferencingComponentEntity> 
getReferencingParameterContexts() {
         return referencingParameterContexts;
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterStatus.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterStatus.java
new file mode 100644
index 0000000000..b728396291
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterStatus.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.web.api.dto;
+
+public enum ParameterStatus {
+    NEW,
+    CHANGED,
+    REMOVED, // The parameter was removed,
+    MISSING_BUT_REFERENCED, // The parameter would have been removed, but is 
currently referenced by a component, so it is preserved
+    UNCHANGED
+}
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterStatusDTO.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterStatusDTO.java
new file mode 100644
index 0000000000..12193f9288
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ParameterStatusDTO.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.web.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.nifi.web.api.entity.ParameterEntity;
+
+import javax.xml.bind.annotation.XmlType;
+
+@XmlType(name = "parameterStatus")
+public class ParameterStatusDTO {
+    private ParameterEntity parameter;
+    private ParameterStatus status;
+
+    @ApiModelProperty("The name of the Parameter")
+    public ParameterEntity getParameter() {
+        return parameter;
+    }
+
+    public void setParameter(final ParameterEntity parameter) {
+        this.parameter = parameter;
+    }
+
+    @ApiModelProperty("Indicates the status of the parameter, compared to the 
existing parameter context")
+    public ParameterStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ParameterStatus status) {
+        this.status = status;
+    }
+}
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index 89566968ea..8f6cf6e3d8 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -3476,6 +3476,11 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                             }
                         } else {
                             parameterEntity = 
dtoFactory.createParameterEntity(parameterContext, parameter, revisionManager, 
parameterContextDAO);
+                            // Need to unmask in order to actually apply the 
value
+                            if (parameterEntity.getParameter() != null && 
parameterEntity.getParameter().getSensitive() != null
+                                     && 
parameterEntity.getParameter().getSensitive()) {
+                                
parameterEntity.getParameter().setValue(parameter.getValue());
+                            }
                             updatedParameterEntities.add(parameterEntity);
                         }
                     }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
index e3d7c6f13c..7f8f47a738 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ParameterProviderResource.java
@@ -16,6 +16,7 @@
  */
 package org.apache.nifi.web.api;
 
+import com.google.common.base.Functions;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -60,6 +61,8 @@ import 
org.apache.nifi.web.api.dto.ParameterProviderApplyParametersRequestDTO;
 import 
org.apache.nifi.web.api.dto.ParameterProviderApplyParametersUpdateStepDTO;
 import org.apache.nifi.web.api.dto.ParameterProviderConfigurationDTO;
 import org.apache.nifi.web.api.dto.ParameterProviderDTO;
+import org.apache.nifi.web.api.dto.ParameterStatus;
+import org.apache.nifi.web.api.dto.ParameterStatusDTO;
 import org.apache.nifi.web.api.dto.PropertyDescriptorDTO;
 import org.apache.nifi.web.api.dto.RevisionDTO;
 import org.apache.nifi.web.api.dto.VerifyConfigRequestDTO;
@@ -767,8 +770,6 @@ public class ParameterProviderResource extends 
AbstractParameterResource {
                     authorizable.getAuthorizable().authorize(authorizer, 
RequestAction.READ, user);
 
                     references.forEach(reference -> 
lookup.getParameterContext(reference.getComponent().getId()).authorize(authorizer,
 RequestAction.READ, user));
-                    // Verify READ permission for user, for every component 
that is currently referenced by relevant parameter contexts
-                    
referencingParameterContextDtos.forEach(parameterContextDto -> 
authorizeReferencingComponents(parameterContextDto.getId(), lookup, user));
                 },
                 () -> 
serviceFacade.verifyCanFetchParameters(fetchParametersEntity.getId()),
                 (revision, parameterProviderFetchEntity) -> {
@@ -791,11 +792,21 @@ public class ParameterProviderResource extends 
AbstractParameterResource {
                     });
                     final List<ParameterContextEntity> parameterContextUpdates 
= 
serviceFacade.getParameterContextUpdatesForAppliedParameters(parameterProviderId,
 parameterGroupConfigurations);
 
+                    final Set<ParameterEntity> removedParameters = 
parameterContextUpdates.stream()
+                            .flatMap(context -> 
context.getComponent().getParameters().stream())
+                            .filter(parameterEntity -> {
+                                final ParameterDTO dto = 
parameterEntity.getParameter();
+                                return dto.getSensitive() == null && 
dto.getValue() == null && dto.getDescription() == null;
+                            })
+                            .collect(Collectors.toSet());
                     final Set<AffectedComponentEntity> affectedComponents = 
getAffectedComponentEntities(parameterContextUpdates);
-
                     if (!affectedComponents.isEmpty()) {
                         
entity.getComponent().setAffectedComponents(affectedComponents);
                     }
+                    final Set<ParameterStatusDTO> parameterStatus = 
getParameterStatus(entity, parameterContextUpdates, removedParameters, user);
+                    if (!parameterStatus.isEmpty()) {
+                        
entity.getComponent().setParameterStatus(parameterStatus);
+                    }
                     populateRemainingParameterProviderEntityContent(entity);
 
                     return generateOkResponse(entity).build();
@@ -932,13 +943,82 @@ public class ParameterProviderResource extends 
AbstractParameterResource {
         );
     }
 
-    private Set<AffectedComponentEntity> 
getAffectedComponentEntities(List<ParameterContextEntity> 
parameterContextUpdates) {
+    private Set<AffectedComponentEntity> getAffectedComponentEntities(final 
List<ParameterContextEntity> parameterContextUpdates) {
         final Collection<ParameterContextDTO> updatedParameterContextDTOs = 
parameterContextUpdates.stream()
                 .map(ParameterContextEntity::getComponent)
                 .collect(Collectors.toList());
         return 
serviceFacade.getComponentsAffectedByParameterContextUpdate(updatedParameterContextDTOs);
     }
 
+    private Set<ParameterStatusDTO> getParameterStatus(final 
ParameterProviderEntity parameterProvider, final List<ParameterContextEntity> 
parameterContextUpdates,
+                                                       final 
Set<ParameterEntity> removedParameters, final NiFiUser niFiUser) {
+        final Set<ParameterStatusDTO> parameterStatus = new HashSet<>();
+        if (parameterProvider.getComponent() == null || 
parameterProvider.getComponent().getReferencingParameterContexts() == null) {
+            return parameterStatus;
+        }
+
+        final Map<String, Set<String>> removedParameterNamesByContextId = new 
HashMap<>();
+        removedParameters.forEach(parameterEntity -> {
+            
removedParameterNamesByContextId.computeIfAbsent(parameterEntity.getParameter().getParameterContext().getComponent().getId(),
 key -> new HashSet<>())
+                    .add(parameterEntity.getParameter().getName());
+        });
+
+        final Map<String, ParameterContextEntity> parameterContextUpdateMap = 
parameterContextUpdates.stream()
+                .collect(Collectors.toMap(entity -> 
entity.getComponent().getId(), Functions.identity()));
+
+        for (final ParameterProviderReferencingComponentEntity reference : 
parameterProvider.getComponent().getReferencingParameterContexts()) {
+            final String parameterContextId = reference.getComponent().getId();
+            final ParameterContextEntity parameterContext = 
serviceFacade.getParameterContext(parameterContextId, false, niFiUser);
+            if (parameterContext.getComponent() == null) {
+                continue;
+            }
+
+            final Set<String> removedParameterNames = 
removedParameterNamesByContextId.get(parameterContext.getComponent().getId());
+            final ParameterContextEntity parameterContextUpdate = 
parameterContextUpdateMap.get(parameterContextId);
+            final Map<String, ParameterEntity> updatedParameters = 
parameterContextUpdate == null ? Collections.emptyMap() : 
parameterContextUpdate.getComponent().getParameters().stream()
+                    .collect(Collectors.toMap(parameter -> 
parameter.getParameter().getName(), Functions.identity()));
+            final Set<String> currentParameterNames = new HashSet<>();
+
+            // Report changed and removed parameters
+            for (final ParameterEntity parameter : 
parameterContext.getComponent().getParameters()) {
+                currentParameterNames.add(parameter.getParameter().getName());
+
+                final ParameterStatusDTO dto = new ParameterStatusDTO();
+                final ParameterEntity updatedParameter = 
updatedParameters.get(parameter.getParameter().getName());
+                if (updatedParameter == null) {
+                    dto.setParameter(parameter);
+                    if (removedParameterNames != null && 
removedParameterNames.contains(parameter.getParameter().getName())) {
+                        dto.setStatus(ParameterStatus.MISSING_BUT_REFERENCED);
+                    } else {
+                        dto.setStatus(ParameterStatus.UNCHANGED);
+                    }
+                } else {
+                    final ParameterDTO updatedParameterDTO = 
updatedParameter.getParameter();
+                    final boolean isDeletion = 
updatedParameterDTO.getSensitive() == null && 
updatedParameterDTO.getDescription() == null && updatedParameterDTO.getValue() 
== null;
+                    dto.setParameter(updatedParameter);
+                    dto.setStatus(isDeletion ? ParameterStatus.REMOVED : 
ParameterStatus.CHANGED);
+                }
+                parameterStatus.add(dto);
+            }
+            // Report new parameters
+            updatedParameters.forEach((parameterName, parameterEntity) -> {
+                if (!currentParameterNames.contains(parameterName)) {
+                    final ParameterStatusDTO dto = new ParameterStatusDTO();
+                    dto.setParameter(parameterEntity);
+                    dto.setStatus(ParameterStatus.NEW);
+                    parameterStatus.add(dto);
+                }
+            });
+            parameterStatus.forEach(dto -> {
+                final ParameterDTO parameterDTO = 
dto.getParameter().getParameter();
+                if (parameterDTO.getValue() != null && 
parameterDTO.getSensitive() != null && parameterDTO.getSensitive()) {
+                    parameterDTO.setValue(DtoFactory.SENSITIVE_VALUE_MASK);
+                }
+            });
+        }
+        return parameterStatus;
+    }
+
     @GET
     @Consumes(MediaType.WILDCARD)
     @Produces(MediaType.APPLICATION_JSON)

Reply via email to