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

ijokarumawak 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 e7f4af6  NIFI-6315 Ensuring remote ports get tracked correctly when 
saving/retrieving versioned flows
e7f4af6 is described below

commit e7f4af68014ea99f1e351436d6a078ad4b3346a6
Author: Bryan Bende <bbe...@apache.org>
AuthorDate: Thu May 23 14:18:37 2019 -0400

    NIFI-6315 Ensuring remote ports get tracked correctly when 
saving/retrieving versioned flows
    
    NIFI-6315 Renaming public ports during import/change-version when name 
alreadye exists, and ignorning name change from flow diffs
    
    NIFI-6315 Ensuring public ports get renamed during copy/paste
    
    NIFI-6315 Set max concurrent tasks on Port based on value from VersionedPort
    
    This closes #3488.
    
    Signed-off-by: Koji Kawamura <ijokaruma...@apache.org>
---
 .../apache/nifi/controller/flow/FlowManager.java   | 17 ++++
 .../nifi/controller/StandardFlowSnippet.java       | 25 +++++-
 .../nifi/controller/flow/StandardFlowManager.java  | 21 +++++
 .../apache/nifi/groups/StandardProcessGroup.java   | 98 +++++++++++++++-------
 .../flow/mapping/NiFiRegistryFlowMapper.java       |  8 ++
 .../apache/nifi/util/FlowDifferenceFilters.java    | 20 +++++
 .../nifi/util/TestFlowDifferenceFilters.java       | 45 ++++++++++
 .../apache/nifi/web/StandardNiFiServiceFacade.java |  5 ++
 .../org/apache/nifi/web/api/dto/DtoFactory.java    |  5 ++
 9 files changed, 214 insertions(+), 30 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java
index c48c06f..f2a9cf9 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core-api/src/main/java/org/apache/nifi/controller/flow/FlowManager.java
@@ -33,6 +33,7 @@ import org.apache.nifi.web.api.dto.FlowSnippetDTO;
 
 import java.net.URL;
 import java.util.Collection;
+import java.util.Optional;
 import java.util.Set;
 
 public interface FlowManager {
@@ -76,6 +77,22 @@ public interface FlowManager {
     Set<Port> getPublicOutputPorts();
 
     /**
+     * Gets the public input port with the given name.
+     *
+     * @param name the port name
+     * @return an optional containing the public input port with the given 
name, or empty if one does not exist
+     */
+    Optional<Port> getPublicInputPort(String name);
+
+    /**
+     * Gets the public output port with the given name.
+     *
+     * @param name the port name
+     * @return an optional containing the public output port with the given 
name, or empty if one does not exist
+     */
+    Optional<Port> getPublicOutputPort(String name);
+
+    /**
      * Creates a new Remote Process Group with the given ID that points to the 
given URI
      *
      * @param id Remote Process Group ID
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java
index 56622f8..d466c9c 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSnippet.java
@@ -72,6 +72,7 @@ import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -284,7 +285,8 @@ public class StandardFlowSnippet implements FlowSnippet {
         for (final PortDTO portDTO : dto.getInputPorts()) {
             final Port inputPort;
             if (group.isRootGroup() || 
Boolean.TRUE.equals(portDTO.getAllowRemoteAccess())) {
-                inputPort = flowManager.createPublicInputPort(portDTO.getId(), 
portDTO.getName());
+                final String portName = 
generatePublicInputPortName(flowManager, portDTO.getName());
+                inputPort = flowManager.createPublicInputPort(portDTO.getId(), 
portName);
                 if (portDTO.getGroupAccessControl() != null) {
                     ((PublicPort) 
inputPort).setGroupAccessControl(portDTO.getGroupAccessControl());
                 }
@@ -308,7 +310,8 @@ public class StandardFlowSnippet implements FlowSnippet {
         for (final PortDTO portDTO : dto.getOutputPorts()) {
             final Port outputPort;
             if (group.isRootGroup() || 
Boolean.TRUE.equals(portDTO.getAllowRemoteAccess())) {
-                outputPort = 
flowManager.createPublicOutputPort(portDTO.getId(), portDTO.getName());
+                final String portName = 
generatePublicOutputPortName(flowManager, portDTO.getName());
+                outputPort = 
flowManager.createPublicOutputPort(portDTO.getId(), portName);
                 if (portDTO.getGroupAccessControl() != null) {
                     ((PublicPort) 
outputPort).setGroupAccessControl(portDTO.getGroupAccessControl());
                 }
@@ -570,6 +573,24 @@ public class StandardFlowSnippet implements FlowSnippet {
         }
     }
 
+    private String generatePublicInputPortName(final FlowManager flowManager, 
final String proposedName) {
+        final Optional<Port> existingPort = 
flowManager.getPublicInputPort(proposedName);
+        if (existingPort.isPresent()) {
+            return generatePublicInputPortName(flowManager, "Copy of " + 
proposedName);
+        } else {
+            return proposedName;
+        }
+    }
+
+    private String generatePublicOutputPortName(final FlowManager flowManager, 
final String proposedName) {
+        final Optional<Port> existingPort = 
flowManager.getPublicOutputPort(proposedName);
+        if (existingPort.isPresent()) {
+            return generatePublicOutputPortName(flowManager, "Copy of " + 
proposedName);
+        } else {
+            return proposedName;
+        }
+    }
+
     private ProcessGroup getConnectableParent(final ProcessGroup group, final 
String parentGroupId, final FlowManager flowManager) {
         if (flowManager.areGroupsSame(group.getIdentifier(), parentGroupId)) {
             return group;
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java
index 6b9f558..0a31f11 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/flow/StandardFlowManager.java
@@ -82,6 +82,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -179,6 +180,26 @@ public class StandardFlowManager implements FlowManager {
         group.getProcessGroups().forEach(childGroup -> 
getPublicPorts(publicPorts, childGroup, getPorts));
     }
 
+    @Override
+    public Optional<Port> getPublicInputPort(String name) {
+        return findPort(name, getPublicInputPorts());
+    }
+
+    @Override
+    public Optional<Port> getPublicOutputPort(String name) {
+        return findPort(name, getPublicOutputPorts());
+    }
+
+    private Optional<Port> findPort(final String portName, final Set<Port> 
ports) {
+        if (ports != null) {
+            for (final Port port : ports) {
+                if (portName.equals(port.getName())) {
+                    return Optional.of(port);
+                }
+            }
+        }
+        return Optional.empty();
+    }
 
     public RemoteProcessGroup createRemoteProcessGroup(final String id, final 
String uris) {
         return new StandardRemoteProcessGroup(requireNonNull(id), uris, null, 
processScheduler, bulletinRepository, sslContext, nifiProperties);
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java
index 3f9014b..8679e3a 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/groups/StandardProcessGroup.java
@@ -16,31 +16,6 @@
  */
 package org.apache.nifi.groups;
 
-import static java.util.Objects.requireNonNull;
-
-import java.io.IOException;
-import java.net.ConnectException;
-import java.net.URL;
-import java.nio.charset.StandardCharsets;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.function.Function;
-import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -136,6 +111,7 @@ import 
org.apache.nifi.registry.variable.MutableVariableRegistry;
 import org.apache.nifi.remote.PublicPort;
 import org.apache.nifi.remote.RemoteGroupPort;
 import org.apache.nifi.remote.StandardRemoteProcessGroupPortDescriptor;
+import org.apache.nifi.remote.TransferDirection;
 import org.apache.nifi.remote.protocol.SiteToSiteTransportProtocol;
 import org.apache.nifi.scheduling.ExecutionNode;
 import org.apache.nifi.scheduling.SchedulingStrategy;
@@ -148,6 +124,32 @@ import org.apache.nifi.web.api.dto.TemplateDTO;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.net.ConnectException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import static java.util.Objects.requireNonNull;
+
 public final class StandardProcessGroup implements ProcessGroup {
 
     private final String id;
@@ -3834,7 +3836,16 @@ public final class StandardProcessGroup implements 
ProcessGroup {
             final Port port = portAndFinalName.getKey();
             final String finalName = portAndFinalName.getValue();
             LOG.info("Updating {} to replace temporary name with final name", 
port);
-            updatePortToSetFinalName(port, finalName);
+
+            // For public ports we need to consider if another public port 
exists somewhere else in the flow with the
+            // same name, and if so then rename the incoming port so the flow 
can still be imported
+            if (port instanceof PublicPort) {
+                final PublicPort publicPort = (PublicPort) port;
+                final String publicPortFinalName = 
getPublicPortFinalName(publicPort, finalName);
+                updatePortToSetFinalName(publicPort, publicPortFinalName);
+            } else {
+                updatePortToSetFinalName(port, finalName);
+            }
         }
 
         for (final String removedVersionedId : labelsRemoved) {
@@ -3862,6 +3873,21 @@ public final class StandardProcessGroup implements 
ProcessGroup {
         }
     }
 
+    private String getPublicPortFinalName(final PublicPort publicPort, final 
String proposedFinalName) {
+        final Optional<Port> existingPublicPort;
+        if (TransferDirection.RECEIVE == publicPort.getDirection()) {
+            existingPublicPort = 
flowManager.getPublicInputPort(proposedFinalName);
+        } else {
+            existingPublicPort = 
flowManager.getPublicOutputPort(proposedFinalName);
+        }
+
+        if (existingPublicPort.isPresent() && 
!existingPublicPort.get().getIdentifier().equals(publicPort.getIdentifier())) {
+            return getPublicPortFinalName(publicPort, "Copy of " + 
proposedFinalName);
+        } else {
+            return proposedFinalName;
+        }
+    }
+
     private boolean isUpdateable(final Connection connection) {
         final Connectable source = connection.getSource();
         if (source.getConnectableType() != ConnectableType.FUNNEL && 
source.isRunning()) {
@@ -4204,11 +4230,19 @@ public final class StandardProcessGroup implements 
ProcessGroup {
         port.setComments(proposed.getComments());
         port.setName(name);
         port.setPosition(new Position(proposed.getPosition().getX(), 
proposed.getPosition().getY()));
+        
port.setMaxConcurrentTasks(proposed.getConcurrentlySchedulableTaskCount());
     }
 
     private Port addInputPort(final ProcessGroup destination, final 
VersionedPort proposed, final String componentIdSeed, final String 
temporaryName) {
         final String name = temporaryName != null ? temporaryName : 
proposed.getName();
-        final Port port = 
flowManager.createLocalInputPort(generateUuid(proposed.getIdentifier(), 
destination.getIdentifier(), componentIdSeed), name);
+
+        final Port port;
+        if (proposed.isAllowRemoteAccess()) {
+            port = 
flowManager.createPublicInputPort(generateUuid(proposed.getIdentifier(), 
destination.getIdentifier(), componentIdSeed), name);
+        } else {
+            port = 
flowManager.createLocalInputPort(generateUuid(proposed.getIdentifier(), 
destination.getIdentifier(), componentIdSeed), name);
+        }
+
         port.setVersionedComponentId(proposed.getIdentifier());
         destination.addInputPort(port);
         updatePort(port, proposed, temporaryName);
@@ -4218,7 +4252,14 @@ public final class StandardProcessGroup implements 
ProcessGroup {
 
     private Port addOutputPort(final ProcessGroup destination, final 
VersionedPort proposed, final String componentIdSeed, final String 
temporaryName) {
         final String name = temporaryName != null ? temporaryName : 
proposed.getName();
-        final Port port = 
flowManager.createLocalOutputPort(generateUuid(proposed.getIdentifier(), 
destination.getIdentifier(), componentIdSeed), name);
+
+        final Port port;
+        if (proposed.isAllowRemoteAccess()) {
+            port = 
flowManager.createPublicOutputPort(generateUuid(proposed.getIdentifier(), 
destination.getIdentifier(), componentIdSeed), name);
+        } else {
+            port = 
flowManager.createLocalOutputPort(generateUuid(proposed.getIdentifier(), 
destination.getIdentifier(), componentIdSeed), name);
+        }
+
         port.setVersionedComponentId(proposed.getIdentifier());
         destination.addOutputPort(port);
         updatePort(port, proposed, temporaryName);
@@ -4431,6 +4472,7 @@ public final class StandardProcessGroup implements 
ProcessGroup {
         final Set<FlowDifference> differences = 
comparison.getDifferences().stream()
                 .filter(difference -> difference.getDifferenceType() != 
DifferenceType.BUNDLE_CHANGED)
                 
.filter(FlowDifferenceFilters.FILTER_ADDED_REMOVED_REMOTE_PORTS)
+                .filter(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES)
                 
.filter(FlowDifferenceFilters.FILTER_IGNORABLE_VERSIONED_FLOW_COORDINATE_CHANGES)
                 .collect(Collectors.toCollection(HashSet::new));
 
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java
index c45d960..e3aba02 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/registry/flow/mapping/NiFiRegistryFlowMapper.java
@@ -58,6 +58,7 @@ import org.apache.nifi.registry.flow.VersionedProcessor;
 import org.apache.nifi.registry.flow.VersionedPropertyDescriptor;
 import org.apache.nifi.registry.flow.VersionedRemoteGroupPort;
 import org.apache.nifi.registry.flow.VersionedRemoteProcessGroup;
+import org.apache.nifi.remote.PublicPort;
 import org.apache.nifi.remote.RemoteGroupPort;
 
 import java.nio.charset.StandardCharsets;
@@ -434,6 +435,13 @@ public class NiFiRegistryFlowMapper {
         versionedPort.setName(port.getName());
         versionedPort.setPosition(mapPosition(port.getPosition()));
         
versionedPort.setType(PortType.valueOf(port.getConnectableType().name()));
+
+        if (port instanceof PublicPort) {
+            versionedPort.setAllowRemoteAccess(true);
+        } else {
+            versionedPort.setAllowRemoteAccess(false);
+        }
+
         return versionedPort;
     }
 
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java
index 29c82fc..c4c7403 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/util/FlowDifferenceFilters.java
@@ -19,6 +19,7 @@ package org.apache.nifi.util;
 import org.apache.nifi.registry.flow.ComponentType;
 import org.apache.nifi.registry.flow.VersionedComponent;
 import org.apache.nifi.registry.flow.VersionedFlowCoordinates;
+import org.apache.nifi.registry.flow.VersionedPort;
 import org.apache.nifi.registry.flow.VersionedProcessGroup;
 import org.apache.nifi.registry.flow.diff.DifferenceType;
 import org.apache.nifi.registry.flow.diff.FlowDifference;
@@ -29,6 +30,25 @@ import java.util.function.Predicate;
 public class FlowDifferenceFilters {
 
     /**
+     * Predicate that returns true if the difference is NOT a name change on a 
public port (i.e. VersionedPort that allows remote access).
+     */
+    public static Predicate<FlowDifference> FILTER_PUBLIC_PORT_NAME_CHANGES = 
(fd) -> {
+        return !isPublicPortNameChange(fd);
+    };
+
+    public static boolean isPublicPortNameChange(final FlowDifference fd) {
+        final VersionedComponent versionedComponent = fd.getComponentA();
+        if (fd.getDifferenceType() == DifferenceType.NAME_CHANGED && 
versionedComponent instanceof VersionedPort) {
+            final VersionedPort versionedPort = (VersionedPort) 
versionedComponent;
+            if (versionedPort.isAllowRemoteAccess()) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
      * Predicate that returns true if the difference is NOT a remote port 
being added, and false if it is.
      */
     public static Predicate<FlowDifference> FILTER_ADDED_REMOVED_REMOTE_PORTS 
=  (fd) -> {
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java
index 330dd33..a6be1fa 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/util/TestFlowDifferenceFilters.java
@@ -18,6 +18,7 @@ package org.apache.nifi.util;
 
 import org.apache.nifi.registry.flow.ComponentType;
 import org.apache.nifi.registry.flow.VersionedFlowCoordinates;
+import org.apache.nifi.registry.flow.VersionedPort;
 import org.apache.nifi.registry.flow.VersionedProcessGroup;
 import org.apache.nifi.registry.flow.VersionedProcessor;
 import org.apache.nifi.registry.flow.VersionedRemoteGroupPort;
@@ -122,5 +123,49 @@ public class TestFlowDifferenceFilters {
         
Assert.assertTrue(FlowDifferenceFilters.FILTER_IGNORABLE_VERSIONED_FLOW_COORDINATE_CHANGES.test(flowDifference));
     }
 
+    @Test
+    public void testFilterPublicPortNameChangeWhenNotNameChange() {
+        final VersionedPort portA = new VersionedPort();
+        final VersionedPort portB = new VersionedPort();
+
+        final StandardFlowDifference flowDifference = new 
StandardFlowDifference(
+                DifferenceType.VERSIONED_FLOW_COORDINATES_CHANGED,
+                portA, portB,
+                "http://localhost:18080";, "http://localhost:17080";,
+                "");
+
+        
Assert.assertTrue(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES.test(flowDifference));
+    }
+
+    @Test
+    public void testFilterPublicPortNameChangeWhenNotAllowRemoteAccess() {
+        final VersionedPort portA = new VersionedPort();
+        final VersionedPort portB = new VersionedPort();
+
+        final StandardFlowDifference flowDifference = new 
StandardFlowDifference(
+                DifferenceType.NAME_CHANGED,
+                portA, portB,
+                "Port A", "Port B",
+                "");
+
+        
Assert.assertTrue(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES.test(flowDifference));
+    }
+
+    @Test
+    public void testFilterPublicPortNameChangeWhenAllowRemoteAccess() {
+        final VersionedPort portA = new VersionedPort();
+        portA.setAllowRemoteAccess(true);
+
+        final VersionedPort portB = new VersionedPort();
+        portB.setAllowRemoteAccess(false);
+
+        final StandardFlowDifference flowDifference = new 
StandardFlowDifference(
+                DifferenceType.NAME_CHANGED,
+                portA, portB,
+                "Port A", "Port B",
+                "");
+
+        
Assert.assertFalse(FlowDifferenceFilters.FILTER_PUBLIC_PORT_NAME_CHANGES.test(flowDifference));
+    }
 }
 
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 7bd16b8..fa967bf 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
@@ -4096,6 +4096,11 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 continue;
             }
 
+            // Ignore name changes to public ports
+            if (FlowDifferenceFilters.isPublicPortNameChange(difference)) {
+                continue;
+            }
+
             if 
(FlowDifferenceFilters.isIgnorableVersionedFlowCoordinateChange(difference)) {
                 continue;
             }
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index 4804d5f..542ca6c 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -2324,6 +2324,11 @@ public final class DtoFactory {
                 continue;
             }
 
+            // Ignore name changes to public ports
+            if (FlowDifferenceFilters.isPublicPortNameChange(difference)) {
+                continue;
+            }
+
             if 
(FlowDifferenceFilters.isIgnorableVersionedFlowCoordinateChange(difference)) {
                 continue;
             }

Reply via email to