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

rfellows pushed a commit to branch NIFI-15258
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/NIFI-15258 by this push:
     new 98a8201034 NIFI-15539: Updating the actions in FlowFileQueueResource 
to support … (#10846)
98a8201034 is described below

commit 98a82010343f988d52abf3bf3f8b82d52798d68c
Author: Matt Gilman <[email protected]>
AuthorDate: Fri Feb 6 13:18:08 2026 -0500

    NIFI-15539: Updating the actions in FlowFileQueueResource to support … 
(#10846)
    
    * NIFI-15539: Updating the actions in FlowFileQueueResource to support 
interacting with queues in flows managed by a Connector.
    
    * NIFI-15539: Updating resource endpoint to include data policies for 
connectors.
---
 .../nifi/authorization/AuthorizableLookup.java     |  18 ++
 .../authorization/StandardAuthorizableLookup.java  |  14 +-
 .../apache/nifi/web/StandardNiFiServiceFacade.java |   6 +-
 .../apache/nifi/web/api/FlowFileQueueResource.java |  12 +-
 .../apache/nifi/web/api/ProcessGroupResource.java  |   2 +-
 .../nifi/web/controller/ControllerFacade.java      |   4 +
 .../org/apache/nifi/web/dao/ConnectionDAO.java     |   9 +
 .../org/apache/nifi/web/dao/ProcessGroupDAO.java   |   9 +
 .../org/apache/nifi/web/dao/impl/ComponentDAO.java |  27 ++-
 .../nifi/web/dao/impl/StandardConnectionDAO.java   |  52 ++++--
 .../nifi/web/dao/impl/StandardProcessGroupDAO.java |  11 +-
 .../StandardAuthorizableLookupTest.java            | 109 ++++++++++++
 .../web/dao/impl/StandardConnectionDAOTest.java    | 196 +++++++++++++++++++++
 .../web/dao/impl/StandardProcessGroupDAOTest.java  | 130 ++++++++++++++
 14 files changed, 568 insertions(+), 31 deletions(-)

diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizableLookup.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizableLookup.java
index 8df8c26162..382126b675 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizableLookup.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/AuthorizableLookup.java
@@ -137,6 +137,15 @@ public interface AuthorizableLookup {
      */
     ConnectionAuthorizable getConnection(String id);
 
+    /**
+     * Get the authorizable Connection, optionally including Connector-managed 
ProcessGroups in the search.
+     *
+     * @param id connection id
+     * @param includeConnectorManaged whether to search Connector-managed 
ProcessGroups
+     * @return authorizable
+     */
+    ConnectionAuthorizable getConnection(String id, boolean 
includeConnectorManaged);
+
     /**
      * Get the authorizable root ProcessGroup.
      *
@@ -152,6 +161,15 @@ public interface AuthorizableLookup {
      */
     ProcessGroupAuthorizable getProcessGroup(String id);
 
+    /**
+     * Get the authorizable ProcessGroup, optionally including 
Connector-managed ProcessGroups in the search.
+     *
+     * @param id process group id
+     * @param includeConnectorManaged whether to search Connector-managed 
ProcessGroups
+     * @return authorizable
+     */
+    ProcessGroupAuthorizable getProcessGroup(String id, boolean 
includeConnectorManaged);
+
     /**
      * Get the authorizable RemoteProcessGroup.
      *
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
index c9108be105..6b51771602 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/authorization/StandardAuthorizableLookup.java
@@ -296,7 +296,12 @@ public class StandardAuthorizableLookup implements 
AuthorizableLookup {
 
     @Override
     public ConnectionAuthorizable getConnection(final String id) {
-        final Connection connection = connectionDAO.getConnection(id);
+        return getConnection(id, false);
+    }
+
+    @Override
+    public ConnectionAuthorizable getConnection(final String id, final boolean 
includeConnectorManaged) {
+        final Connection connection = connectionDAO.getConnection(id, 
includeConnectorManaged);
         return new StandardConnectionAuthorizable(connection);
     }
 
@@ -307,7 +312,12 @@ public class StandardAuthorizableLookup implements 
AuthorizableLookup {
 
     @Override
     public ProcessGroupAuthorizable getProcessGroup(final String id) {
-        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(id);
+        return getProcessGroup(id, false);
+    }
+
+    @Override
+    public ProcessGroupAuthorizable getProcessGroup(final String id, final 
boolean includeConnectorManaged) {
+        final ProcessGroup processGroup = processGroupDAO.getProcessGroup(id, 
includeConnectorManaged);
         return new StandardProcessGroupAuthorizable(processGroup, 
controllerFacade.getExtensionManager());
     }
 
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index 1bfe0de934..f686080454 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -2184,7 +2184,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
     @Override
     public ListingRequestDTO deleteFlowFileListingRequest(final String 
connectionId, final String listingRequestId) {
-        final Connection connection = 
connectionDAO.getConnection(connectionId);
+        final Connection connection = 
connectionDAO.getConnection(connectionId, true);
         final ListingRequestDTO listRequest = 
dtoFactory.createListingRequestDTO(connectionDAO.deleteFlowFileListingRequest(connectionId,
 listingRequestId));
 
         // include whether the source and destination are running
@@ -2595,7 +2595,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
     @Override
     public ListingRequestDTO createFlowFileListingRequest(final String 
connectionId, final String listingRequestId) {
-        final Connection connection = 
connectionDAO.getConnection(connectionId);
+        final Connection connection = 
connectionDAO.getConnection(connectionId, true);
         final ListingRequestDTO listRequest = 
dtoFactory.createListingRequestDTO(connectionDAO.createFlowFileListingRequest(connectionId,
 listingRequestId));
 
         // include whether the source and destination are running
@@ -4346,7 +4346,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
     @Override
     public ListingRequestDTO getFlowFileListingRequest(final String 
connectionId, final String listingRequestId) {
-        final Connection connection = 
connectionDAO.getConnection(connectionId);
+        final Connection connection = 
connectionDAO.getConnection(connectionId, true);
         final ListingRequestDTO listRequest = 
dtoFactory.createListingRequestDTO(connectionDAO.getFlowFileListingRequest(connectionId,
 listingRequestId));
 
         // include whether the source and destination are running
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowFileQueueResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowFileQueueResource.java
index dba164a417..f11e98035f 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowFileQueueResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FlowFileQueueResource.java
@@ -307,7 +307,7 @@ public class FlowFileQueueResource extends 
ApplicationResource {
                 serviceFacade,
                 requestConnectionEntity,
                 lookup -> {
-                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(id);
+                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(id, true);
                     final Authorizable dataAuthorizable = 
connAuth.getSourceData();
                     dataAuthorizable.authorize(authorizer, RequestAction.READ, 
NiFiUserUtils.getNiFiUser());
                 },
@@ -374,7 +374,7 @@ public class FlowFileQueueResource extends 
ApplicationResource {
 
         // authorize access
         serviceFacade.authorizeAccess(lookup -> {
-            final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId);
+            final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId, true);
             final Authorizable dataAuthorizable = connAuth.getSourceData();
             dataAuthorizable.authorize(authorizer, RequestAction.READ, 
NiFiUserUtils.getNiFiUser());
         });
@@ -435,7 +435,7 @@ public class FlowFileQueueResource extends 
ApplicationResource {
                 serviceFacade,
                 new ListingEntity(connectionId, listingRequestId),
                 lookup -> {
-                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId);
+                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId, true);
                     final Authorizable dataAuthorizable = 
connAuth.getSourceData();
                     dataAuthorizable.authorize(authorizer, RequestAction.READ, 
NiFiUserUtils.getNiFiUser());
                 },
@@ -522,7 +522,7 @@ public class FlowFileQueueResource extends 
ApplicationResource {
                 serviceFacade,
                 requestConnectionEntity,
                 lookup -> {
-                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(id);
+                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(id, true);
                     final Authorizable dataAuthorizable = 
connAuth.getSourceData();
                     dataAuthorizable.authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
                 },
@@ -589,7 +589,7 @@ public class FlowFileQueueResource extends 
ApplicationResource {
 
         // authorize access
         serviceFacade.authorizeAccess(lookup -> {
-            final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId);
+            final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId, true);
             final Authorizable dataAuthorizable = connAuth.getSourceData();
             dataAuthorizable.authorize(authorizer, RequestAction.WRITE, 
NiFiUserUtils.getNiFiUser());
         });
@@ -650,7 +650,7 @@ public class FlowFileQueueResource extends 
ApplicationResource {
                 serviceFacade,
                 new DropEntity(connectionId, dropRequestId),
                 lookup -> {
-                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId);
+                    final ConnectionAuthorizable connAuth = 
lookup.getConnection(connectionId, true);
                     final Authorizable dataAuthorizable = 
connAuth.getSourceData();
                     dataAuthorizable.authorize(authorizer, 
RequestAction.WRITE, NiFiUserUtils.getNiFiUser());
                 },
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
index bb21091b16..847781a749 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
@@ -869,7 +869,7 @@ public class ProcessGroupResource extends 
FlowUpdateResource<ProcessGroupImportE
     }
 
     private void authorizeHandleDropAllFlowFilesRequest(String processGroupId, 
AuthorizableLookup lookup) {
-        final ProcessGroupAuthorizable processGroup = 
lookup.getProcessGroup(processGroupId);
+        final ProcessGroupAuthorizable processGroup = 
lookup.getProcessGroup(processGroupId, true);
 
         authorizeProcessGroup(processGroup, authorizer, lookup, 
RequestAction.READ, false, false, false, false, false);
 
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
index 4dd9837660..24bc33c534 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/controller/ControllerFacade.java
@@ -1073,6 +1073,8 @@ public class ControllerFacade implements Authorizable {
         resources.add(ResourceFactory.getSiteToSiteResource());
         resources.add(ResourceFactory.getParameterContextsResource());
         resources.add(ResourceFactory.getConnectorsResource());
+        
resources.add(ResourceFactory.getDataResource(ResourceFactory.getConnectorsResource()));
+        
resources.add(ResourceFactory.getProvenanceDataResource(ResourceFactory.getConnectorsResource()));
 
         // add each parameter context
         
flowController.getFlowManager().getParameterContextManager().getParameterContexts().forEach(parameterContext
 -> resources.add(parameterContext.getResource()));
@@ -1193,6 +1195,8 @@ public class ControllerFacade implements Authorizable {
         for (final ConnectorNode connector : 
flowController.getFlowManager().getAllConnectors()) {
             final Resource connectorResource = connector.getResource();
             resources.add(connectorResource);
+            resources.add(ResourceFactory.getDataResource(connectorResource));
+            
resources.add(ResourceFactory.getProvenanceDataResource(connectorResource));
             
resources.add(ResourceFactory.getPolicyResource(connectorResource));
             
resources.add(ResourceFactory.getOperationResource(connectorResource));
         }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ConnectionDAO.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ConnectionDAO.java
index 98caa34453..8785d670a6 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ConnectionDAO.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ConnectionDAO.java
@@ -43,6 +43,15 @@ public interface ConnectionDAO {
      */
     Connection getConnection(String id);
 
+    /**
+     * Gets the specified Connection, optionally including Connector-managed 
ProcessGroups in the search.
+     *
+     * @param id The connection id
+     * @param includeConnectorManaged Whether to search Connector-managed 
ProcessGroups
+     * @return The connection
+     */
+    Connection getConnection(String id, boolean includeConnectorManaged);
+
     /**
      * Gets the specified flow file drop request.
      *
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java
index c10f6145ca..a1a2f5979b 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/ProcessGroupDAO.java
@@ -58,6 +58,15 @@ public interface ProcessGroupDAO {
      */
     ProcessGroup getProcessGroup(String groupId);
 
+    /**
+     * Gets the specified process group, optionally including 
Connector-managed ProcessGroups in the search.
+     *
+     * @param groupId The process group id
+     * @param includeConnectorManaged Whether to search Connector-managed 
ProcessGroups
+     * @return The process group
+     */
+    ProcessGroup getProcessGroup(String groupId, boolean 
includeConnectorManaged);
+
     /**
      * Gets all of the process groups.
      *
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/ComponentDAO.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/ComponentDAO.java
index 90760cbcd3..26f0de3025 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/ComponentDAO.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/ComponentDAO.java
@@ -64,13 +64,34 @@ public abstract class ComponentDAO {
      * @return group
      */
     protected ProcessGroup locateProcessGroup(final FlowController 
flowController, final String groupId) {
+        return locateProcessGroup(flowController, groupId, false);
+    }
+
+    /**
+     * Locates the specified ProcessGroup, optionally including 
Connector-managed ProcessGroups.
+     *
+     * @param flowController controller
+     * @param groupId id
+     * @param includeConnectorManaged whether to include Connector-managed 
ProcessGroups in the search
+     * @return group
+     */
+    protected ProcessGroup locateProcessGroup(final FlowController 
flowController, final String groupId, final boolean includeConnectorManaged) {
+        // First, try to find the group in the main flow hierarchy 
(non-Connector groups)
         ProcessGroup group = flowController.getFlowManager().getGroup(groupId, 
null);
 
-        if (group == null) {
-            throw new ResourceNotFoundException(String.format("Unable to 
locate group with id '%s'.", groupId));
+        if (group != null) {
+            return group;
+        }
+
+        // Optionally search Connector-managed ProcessGroups
+        if (includeConnectorManaged) {
+            group = flowController.getFlowManager().getGroup(groupId);
+            if (group != null) {
+                return group;
+            }
         }
 
-        return group;
+        throw new ResourceNotFoundException(String.format("Unable to locate 
group with id '%s'.", groupId));
     }
 
     protected void verifyCreate(final ExtensionManager extensionManager, final 
String type, final BundleDTO bundle) {
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardConnectionDAO.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardConnectionDAO.java
index 696d8c11cf..47aa7a14dc 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardConnectionDAO.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardConnectionDAO.java
@@ -23,6 +23,8 @@ import org.apache.nifi.authorization.resource.Authorizable;
 import org.apache.nifi.authorization.resource.DataAuthorizable;
 import org.apache.nifi.authorization.user.NiFiUser;
 import org.apache.nifi.authorization.user.NiFiUserUtils;
+import org.apache.nifi.components.connector.ConnectorNode;
+import org.apache.nifi.components.connector.FrameworkFlowContext;
 import org.apache.nifi.connectable.Connectable;
 import org.apache.nifi.connectable.ConnectableType;
 import org.apache.nifi.connectable.Connection;
@@ -76,14 +78,33 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
     private Authorizer authorizer;
 
     private Connection locateConnection(final String connectionId) {
+        return locateConnection(connectionId, false);
+    }
+
+    private Connection locateConnection(final String connectionId, final 
boolean includeConnectorManaged) {
+        // First, search the main flow hierarchy
         final ProcessGroup rootGroup = 
flowController.getFlowManager().getRootGroup();
-        final Connection connection = rootGroup.findConnection(connectionId);
+        Connection connection = rootGroup.findConnection(connectionId);
 
-        if (connection == null) {
-            throw new ResourceNotFoundException(String.format("Unable to find 
connection with id '%s'.", connectionId));
-        } else {
+        if (connection != null) {
             return connection;
         }
+
+        // Optionally search Connector-managed ProcessGroups
+        if (includeConnectorManaged) {
+            for (final ConnectorNode connector : 
flowController.getConnectorRepository().getConnectors()) {
+                final FrameworkFlowContext flowContext = 
connector.getActiveFlowContext();
+                if (flowContext != null) {
+                    final ProcessGroup managedGroup = 
flowContext.getManagedProcessGroup();
+                    connection = managedGroup.findConnection(connectionId);
+                    if (connection != null) {
+                        return connection;
+                    }
+                }
+            }
+        }
+
+        throw new ResourceNotFoundException(String.format("Unable to find 
connection with id '%s'.", connectionId));
     }
 
     @Override
@@ -97,6 +118,11 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
         return locateConnection(id);
     }
 
+    @Override
+    public Connection getConnection(final String id, final boolean 
includeConnectorManaged) {
+        return locateConnection(id, includeConnectorManaged);
+    }
+
     @Override
     public Set<Connection> getConnections(final String groupId) {
         final ProcessGroup group = locateProcessGroup(flowController, groupId);
@@ -105,7 +131,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public DropFlowFileStatus getFlowFileDropRequest(String connectionId, 
String dropRequestId) {
-        final Connection connection = locateConnection(connectionId);
+        final Connection connection = locateConnection(connectionId, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
 
         final DropFlowFileStatus dropRequest = 
queue.getDropFlowFileStatus(dropRequestId);
@@ -118,7 +144,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public ListFlowFileStatus getFlowFileListingRequest(String connectionId, 
String listingRequestId) {
-        final Connection connection = locateConnection(connectionId);
+        final Connection connection = locateConnection(connectionId, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
 
         final ListFlowFileStatus listRequest = 
queue.getListFlowFileStatus(listingRequestId);
@@ -132,7 +158,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
     @Override
     public FlowFileRecord getFlowFile(String id, String flowFileUuid) {
         try {
-            final Connection connection = locateConnection(id);
+            final Connection connection = locateConnection(id, true);
             final FlowFileQueue queue = connection.getFlowFileQueue();
             final FlowFileRecord flowFile = queue.getFlowFile(flowFileUuid);
 
@@ -342,7 +368,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public DropFlowFileStatus createFlowFileDropRequest(String id, String 
dropRequestId) {
-        final Connection connection = locateConnection(id);
+        final Connection connection = locateConnection(id, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
 
         final NiFiUser user = NiFiUserUtils.getNiFiUser();
@@ -355,7 +381,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public ListFlowFileStatus createFlowFileListingRequest(String id, String 
listingRequestId) {
-        final Connection connection = locateConnection(id);
+        final Connection connection = locateConnection(id, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
 
         // ensure we can list
@@ -450,7 +476,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public void verifyList(String id) {
-        final Connection connection = locateConnection(id);
+        final Connection connection = locateConnection(id, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
         verifyList(queue);
     }
@@ -623,7 +649,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public DropFlowFileStatus deleteFlowFileDropRequest(String connectionId, 
String dropRequestId) {
-        final Connection connection = locateConnection(connectionId);
+        final Connection connection = locateConnection(connectionId, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
 
         final DropFlowFileStatus dropFlowFileStatus = 
queue.cancelDropFlowFileRequest(dropRequestId);
@@ -636,7 +662,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
 
     @Override
     public ListFlowFileStatus deleteFlowFileListingRequest(String 
connectionId, String listingRequestId) {
-        final Connection connection = locateConnection(connectionId);
+        final Connection connection = locateConnection(connectionId, true);
         final FlowFileQueue queue = connection.getFlowFileQueue();
 
         final ListFlowFileStatus listFlowFileStatus = 
queue.cancelListFlowFileRequest(listingRequestId);
@@ -652,7 +678,7 @@ public class StandardConnectionDAO extends ComponentDAO 
implements ConnectionDAO
         try {
             final NiFiUser user = NiFiUserUtils.getNiFiUser();
 
-            final Connection connection = locateConnection(id);
+            final Connection connection = locateConnection(id, true);
             final FlowFileQueue queue = connection.getFlowFileQueue();
             final FlowFileRecord flowFile = queue.getFlowFile(flowFileUuid);
 
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java
index aa7c5bf736..b6612c3126 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAO.java
@@ -187,6 +187,11 @@ public class StandardProcessGroupDAO extends ComponentDAO 
implements ProcessGrou
         return locateProcessGroup(flowController, groupId);
     }
 
+    @Override
+    public ProcessGroup getProcessGroup(String groupId, boolean 
includeConnectorManaged) {
+        return locateProcessGroup(flowController, groupId, 
includeConnectorManaged);
+    }
+
     @Override
     public Set<ProcessGroup> getProcessGroups(final String parentGroupId, 
final ProcessGroupRecursivity processGroupRecursivity) {
         ProcessGroup group = locateProcessGroup(flowController, parentGroupId);
@@ -616,7 +621,7 @@ public class StandardProcessGroupDAO extends ComponentDAO 
implements ProcessGrou
 
     @Override
     public DropFlowFileStatus createDropAllFlowFilesRequest(String 
processGroupId, String dropRequestId) {
-        ProcessGroup processGroup = locateProcessGroup(flowController, 
processGroupId);
+        ProcessGroup processGroup = locateProcessGroup(flowController, 
processGroupId, true);
 
         final NiFiUser user = NiFiUserUtils.getNiFiUser();
         if (user == null) {
@@ -628,14 +633,14 @@ public class StandardProcessGroupDAO extends ComponentDAO 
implements ProcessGrou
 
     @Override
     public DropFlowFileStatus getDropAllFlowFilesRequest(String 
processGroupId, String dropRequestId) {
-        ProcessGroup processGroup = locateProcessGroup(flowController, 
processGroupId);
+        ProcessGroup processGroup = locateProcessGroup(flowController, 
processGroupId, true);
 
         return processGroup.getDropAllFlowFilesStatus(dropRequestId);
     }
 
     @Override
     public DropFlowFileStatus deleteDropAllFlowFilesRequest(String 
processGroupId, String dropRequestId) {
-        ProcessGroup processGroup = locateProcessGroup(flowController, 
processGroupId);
+        ProcessGroup processGroup = locateProcessGroup(flowController, 
processGroupId, true);
 
         return processGroup.cancelDropAllFlowFiles(dropRequestId);
     }
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
index 116f55c727..9a7bfc6cdc 100644
--- 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/authorization/StandardAuthorizableLookupTest.java
@@ -22,21 +22,28 @@ import 
org.apache.nifi.authorization.resource.DataAuthorizable;
 import org.apache.nifi.authorization.resource.DataTransferAuthorizable;
 import org.apache.nifi.authorization.resource.OperationAuthorizable;
 import org.apache.nifi.authorization.resource.ProvenanceDataAuthorizable;
+import org.apache.nifi.connectable.Connectable;
+import org.apache.nifi.connectable.Connection;
 import org.apache.nifi.controller.FlowAnalysisRuleNode;
 import org.apache.nifi.controller.ProcessorNode;
+import org.apache.nifi.groups.ProcessGroup;
 import org.apache.nifi.nar.ExtensionDiscoveringManager;
 import org.apache.nifi.nar.ExtensionManager;
 import org.apache.nifi.registry.flow.FlowRegistryClientNode;
 import org.apache.nifi.web.controller.ControllerFacade;
+import org.apache.nifi.web.dao.ConnectionDAO;
 import org.apache.nifi.web.dao.FlowAnalysisRuleDAO;
 import org.apache.nifi.web.dao.FlowRegistryDAO;
+import org.apache.nifi.web.dao.ProcessGroupDAO;
 import org.apache.nifi.web.dao.ProcessorDAO;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 public class StandardAuthorizableLookupTest {
@@ -103,6 +110,108 @@ public class StandardAuthorizableLookupTest {
         assertEquals(flowAnalysisRuleNode, authorizable);
     }
 
+    @Test
+    void testGetConnectionWithoutIncludeConnectorManaged() {
+        final StandardAuthorizableLookup lookup = getLookup();
+        final ConnectionDAO connectionDAO = mock(ConnectionDAO.class);
+        final Connection connection = mock(Connection.class);
+        final Connectable sourceConnectable = mock(Connectable.class);
+
+        when(connectionDAO.getConnection(eq(COMPONENT_ID), 
eq(false))).thenReturn(connection);
+        when(connection.getSource()).thenReturn(sourceConnectable);
+        when(connection.getDestination()).thenReturn(sourceConnectable);
+        when(connection.getSourceAuthorizable()).thenReturn(sourceConnectable);
+        lookup.setConnectionDAO(connectionDAO);
+
+        final ConnectionAuthorizable result = 
lookup.getConnection(COMPONENT_ID);
+
+        assertNotNull(result);
+        verify(connectionDAO).getConnection(eq(COMPONENT_ID), eq(false));
+    }
+
+    @Test
+    void testGetConnectionWithIncludeConnectorManagedTrue() {
+        final StandardAuthorizableLookup lookup = getLookup();
+        final ConnectionDAO connectionDAO = mock(ConnectionDAO.class);
+        final Connection connection = mock(Connection.class);
+        final Connectable sourceConnectable = mock(Connectable.class);
+
+        when(connectionDAO.getConnection(eq(COMPONENT_ID), 
eq(true))).thenReturn(connection);
+        when(connection.getSource()).thenReturn(sourceConnectable);
+        when(connection.getDestination()).thenReturn(sourceConnectable);
+        when(connection.getSourceAuthorizable()).thenReturn(sourceConnectable);
+        lookup.setConnectionDAO(connectionDAO);
+
+        final ConnectionAuthorizable result = 
lookup.getConnection(COMPONENT_ID, true);
+
+        assertNotNull(result);
+        verify(connectionDAO).getConnection(eq(COMPONENT_ID), eq(true));
+    }
+
+    @Test
+    void testGetConnectionWithIncludeConnectorManagedFalse() {
+        final StandardAuthorizableLookup lookup = getLookup();
+        final ConnectionDAO connectionDAO = mock(ConnectionDAO.class);
+        final Connection connection = mock(Connection.class);
+        final Connectable sourceConnectable = mock(Connectable.class);
+
+        when(connectionDAO.getConnection(eq(COMPONENT_ID), 
eq(false))).thenReturn(connection);
+        when(connection.getSource()).thenReturn(sourceConnectable);
+        when(connection.getDestination()).thenReturn(sourceConnectable);
+        when(connection.getSourceAuthorizable()).thenReturn(sourceConnectable);
+        lookup.setConnectionDAO(connectionDAO);
+
+        final ConnectionAuthorizable result = 
lookup.getConnection(COMPONENT_ID, false);
+
+        assertNotNull(result);
+        verify(connectionDAO).getConnection(eq(COMPONENT_ID), eq(false));
+    }
+
+    @Test
+    void testGetProcessGroupWithoutIncludeConnectorManaged() {
+        final StandardAuthorizableLookup lookup = getLookup();
+        final ProcessGroupDAO processGroupDAO = mock(ProcessGroupDAO.class);
+        final ProcessGroup processGroup = mock(ProcessGroup.class);
+
+        when(processGroupDAO.getProcessGroup(eq(COMPONENT_ID), 
eq(false))).thenReturn(processGroup);
+        lookup.setProcessGroupDAO(processGroupDAO);
+
+        final ProcessGroupAuthorizable result = 
lookup.getProcessGroup(COMPONENT_ID);
+
+        assertNotNull(result);
+        verify(processGroupDAO).getProcessGroup(eq(COMPONENT_ID), eq(false));
+    }
+
+    @Test
+    void testGetProcessGroupWithIncludeConnectorManagedTrue() {
+        final StandardAuthorizableLookup lookup = getLookup();
+        final ProcessGroupDAO processGroupDAO = mock(ProcessGroupDAO.class);
+        final ProcessGroup processGroup = mock(ProcessGroup.class);
+
+        when(processGroupDAO.getProcessGroup(eq(COMPONENT_ID), 
eq(true))).thenReturn(processGroup);
+        lookup.setProcessGroupDAO(processGroupDAO);
+
+        final ProcessGroupAuthorizable result = 
lookup.getProcessGroup(COMPONENT_ID, true);
+
+        assertNotNull(result);
+        verify(processGroupDAO).getProcessGroup(eq(COMPONENT_ID), eq(true));
+    }
+
+    @Test
+    void testGetProcessGroupWithIncludeConnectorManagedFalse() {
+        final StandardAuthorizableLookup lookup = getLookup();
+        final ProcessGroupDAO processGroupDAO = mock(ProcessGroupDAO.class);
+        final ProcessGroup processGroup = mock(ProcessGroup.class);
+
+        when(processGroupDAO.getProcessGroup(eq(COMPONENT_ID), 
eq(false))).thenReturn(processGroup);
+        lookup.setProcessGroupDAO(processGroupDAO);
+
+        final ProcessGroupAuthorizable result = 
lookup.getProcessGroup(COMPONENT_ID, false);
+
+        assertNotNull(result);
+        verify(processGroupDAO).getProcessGroup(eq(COMPONENT_ID), eq(false));
+    }
+
     private StandardAuthorizableLookup getLookup() {
         final ExtensionManager extensionManager = 
mock(ExtensionDiscoveringManager.class);
         final ControllerFacade controllerFacade = mock(ControllerFacade.class);
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/dao/impl/StandardConnectionDAOTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/dao/impl/StandardConnectionDAOTest.java
new file mode 100644
index 0000000000..7aa6dc19d2
--- /dev/null
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/dao/impl/StandardConnectionDAOTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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.dao.impl;
+
+import org.apache.nifi.components.connector.ConnectorNode;
+import org.apache.nifi.components.connector.ConnectorRepository;
+import org.apache.nifi.components.connector.FrameworkFlowContext;
+import org.apache.nifi.connectable.Connection;
+import org.apache.nifi.controller.FlowController;
+import org.apache.nifi.controller.flow.FlowManager;
+import org.apache.nifi.groups.ProcessGroup;
+import org.apache.nifi.web.ResourceNotFoundException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class StandardConnectionDAOTest {
+
+    private StandardConnectionDAO connectionDAO;
+
+    @Mock
+    private FlowController flowController;
+
+    @Mock
+    private FlowManager flowManager;
+
+    @Mock
+    private ProcessGroup rootGroup;
+
+    @Mock
+    private ConnectorRepository connectorRepository;
+
+    @Mock
+    private ConnectorNode connectorNode;
+
+    @Mock
+    private FrameworkFlowContext frameworkFlowContext;
+
+    @Mock
+    private ProcessGroup connectorManagedGroup;
+
+    @Mock
+    private Connection rootConnection;
+
+    @Mock
+    private Connection connectorConnection;
+
+    private static final String ROOT_CONNECTION_ID = "root-connection-id";
+    private static final String CONNECTOR_CONNECTION_ID = 
"connector-connection-id";
+    private static final String NON_EXISTENT_ID = "non-existent-id";
+
+    @BeforeEach
+    void setUp() {
+        connectionDAO = new StandardConnectionDAO();
+        connectionDAO.setFlowController(flowController);
+
+        when(flowController.getFlowManager()).thenReturn(flowManager);
+        when(flowManager.getRootGroup()).thenReturn(rootGroup);
+        
when(flowController.getConnectorRepository()).thenReturn(connectorRepository);
+
+        // Setup root group connection
+        
when(rootGroup.findConnection(ROOT_CONNECTION_ID)).thenReturn(rootConnection);
+        
when(rootGroup.findConnection(CONNECTOR_CONNECTION_ID)).thenReturn(null);
+        when(rootGroup.findConnection(NON_EXISTENT_ID)).thenReturn(null);
+
+        // Setup connector managed group
+        
when(connectorRepository.getConnectors()).thenReturn(List.of(connectorNode));
+        
when(connectorNode.getActiveFlowContext()).thenReturn(frameworkFlowContext);
+        
when(frameworkFlowContext.getManagedProcessGroup()).thenReturn(connectorManagedGroup);
+        
when(connectorManagedGroup.findConnection(CONNECTOR_CONNECTION_ID)).thenReturn(connectorConnection);
+        
when(connectorManagedGroup.findConnection(ROOT_CONNECTION_ID)).thenReturn(null);
+        
when(connectorManagedGroup.findConnection(NON_EXISTENT_ID)).thenReturn(null);
+    }
+
+    @Test
+    void testGetConnectionFromRootGroup() {
+        final Connection result = 
connectionDAO.getConnection(ROOT_CONNECTION_ID);
+
+        assertEquals(rootConnection, result);
+    }
+
+    @Test
+    void testGetConnectionFromRootGroupWithIncludeConnectorManagedFalse() {
+        final Connection result = 
connectionDAO.getConnection(ROOT_CONNECTION_ID, false);
+
+        assertEquals(rootConnection, result);
+    }
+
+    @Test
+    void testGetConnectionFromRootGroupWithIncludeConnectorManagedTrue() {
+        final Connection result = 
connectionDAO.getConnection(ROOT_CONNECTION_ID, true);
+
+        assertEquals(rootConnection, result);
+    }
+
+    @Test
+    void 
testGetConnectionFromConnectorManagedGroupWithIncludeConnectorManagedTrue() {
+        final Connection result = 
connectionDAO.getConnection(CONNECTOR_CONNECTION_ID, true);
+
+        assertEquals(connectorConnection, result);
+    }
+
+    @Test
+    void 
testGetConnectionFromConnectorManagedGroupWithIncludeConnectorManagedFalseThrows()
 {
+        assertThrows(ResourceNotFoundException.class, () ->
+            connectionDAO.getConnection(CONNECTOR_CONNECTION_ID, false)
+        );
+    }
+
+    @Test
+    void testGetConnectionWithDefaultDoesNotFindConnectorManagedConnection() {
+        assertThrows(ResourceNotFoundException.class, () ->
+            connectionDAO.getConnection(CONNECTOR_CONNECTION_ID)
+        );
+    }
+
+    @Test
+    void testGetConnectionWithNonExistentIdThrows() {
+        assertThrows(ResourceNotFoundException.class, () ->
+            connectionDAO.getConnection(NON_EXISTENT_ID, true)
+        );
+    }
+
+    @Test
+    void testHasConnectionInRootGroup() {
+        assertTrue(connectionDAO.hasConnection(ROOT_CONNECTION_ID));
+    }
+
+    @Test
+    void testHasConnectionNotInRootGroup() {
+        // hasConnection only checks the root group, not connector-managed 
groups
+        assertFalse(connectionDAO.hasConnection(CONNECTOR_CONNECTION_ID));
+    }
+
+    @Test
+    void testHasConnectionWithNonExistentId() {
+        assertFalse(connectionDAO.hasConnection(NON_EXISTENT_ID));
+    }
+
+    @Test
+    void testGetConnectionFromConnectorWithNullActiveFlowContext() {
+        // Simulate connector with no active flow context
+        when(connectorNode.getActiveFlowContext()).thenReturn(null);
+
+        assertThrows(ResourceNotFoundException.class, () ->
+            connectionDAO.getConnection(CONNECTOR_CONNECTION_ID, true)
+        );
+    }
+
+    @Test
+    void testGetConnectionWithMultipleConnectors() {
+        // Setup a second connector
+        final ConnectorNode connectorNode2 = 
org.mockito.Mockito.mock(ConnectorNode.class);
+        final FrameworkFlowContext flowContext2 = 
org.mockito.Mockito.mock(FrameworkFlowContext.class);
+        final ProcessGroup managedGroup2 = 
org.mockito.Mockito.mock(ProcessGroup.class);
+        final Connection connectionInSecondConnector = 
org.mockito.Mockito.mock(Connection.class);
+        final String secondConnectorConnectionId = 
"second-connector-connection-id";
+
+        
when(connectorRepository.getConnectors()).thenReturn(List.of(connectorNode, 
connectorNode2));
+        when(connectorNode2.getActiveFlowContext()).thenReturn(flowContext2);
+        when(flowContext2.getManagedProcessGroup()).thenReturn(managedGroup2);
+        
when(managedGroup2.findConnection(secondConnectorConnectionId)).thenReturn(connectionInSecondConnector);
+
+        final Connection result = 
connectionDAO.getConnection(secondConnectorConnectionId, true);
+
+        assertEquals(connectionInSecondConnector, result);
+    }
+}
diff --git 
a/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAOTest.java
 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAOTest.java
new file mode 100644
index 0000000000..cf5441f199
--- /dev/null
+++ 
b/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/java/org/apache/nifi/web/dao/impl/StandardProcessGroupDAOTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.dao.impl;
+
+import org.apache.nifi.controller.FlowController;
+import org.apache.nifi.controller.flow.FlowManager;
+import org.apache.nifi.groups.ProcessGroup;
+import org.apache.nifi.web.ResourceNotFoundException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+class StandardProcessGroupDAOTest {
+
+    private StandardProcessGroupDAO processGroupDAO;
+
+    @Mock
+    private FlowController flowController;
+
+    @Mock
+    private FlowManager flowManager;
+
+    @Mock
+    private ProcessGroup rootGroup;
+
+    @Mock
+    private ProcessGroup connectorManagedGroup;
+
+    private static final String ROOT_GROUP_ID = "root-group-id";
+    private static final String CONNECTOR_GROUP_ID = "connector-group-id";
+    private static final String NON_EXISTENT_ID = "non-existent-id";
+
+    @BeforeEach
+    void setUp() {
+        processGroupDAO = new StandardProcessGroupDAO();
+        processGroupDAO.setFlowController(flowController);
+
+        when(flowController.getFlowManager()).thenReturn(flowManager);
+
+        // Setup root group lookup (non-connector managed)
+        when(flowManager.getGroup(ROOT_GROUP_ID, null)).thenReturn(rootGroup);
+        when(flowManager.getGroup(CONNECTOR_GROUP_ID, null)).thenReturn(null);
+        when(flowManager.getGroup(NON_EXISTENT_ID, null)).thenReturn(null);
+
+        // Setup connector-managed group lookup (includes all groups)
+        when(flowManager.getGroup(ROOT_GROUP_ID)).thenReturn(rootGroup);
+        
when(flowManager.getGroup(CONNECTOR_GROUP_ID)).thenReturn(connectorManagedGroup);
+        when(flowManager.getGroup(NON_EXISTENT_ID)).thenReturn(null);
+    }
+
+    @Test
+    void testGetProcessGroupFromRootHierarchy() {
+        final ProcessGroup result = 
processGroupDAO.getProcessGroup(ROOT_GROUP_ID);
+
+        assertEquals(rootGroup, result);
+    }
+
+    @Test
+    void 
testGetProcessGroupFromRootHierarchyWithIncludeConnectorManagedFalse() {
+        final ProcessGroup result = 
processGroupDAO.getProcessGroup(ROOT_GROUP_ID, false);
+
+        assertEquals(rootGroup, result);
+    }
+
+    @Test
+    void testGetProcessGroupFromRootHierarchyWithIncludeConnectorManagedTrue() 
{
+        final ProcessGroup result = 
processGroupDAO.getProcessGroup(ROOT_GROUP_ID, true);
+
+        assertEquals(rootGroup, result);
+    }
+
+    @Test
+    void 
testGetProcessGroupFromConnectorManagedWithIncludeConnectorManagedTrue() {
+        final ProcessGroup result = 
processGroupDAO.getProcessGroup(CONNECTOR_GROUP_ID, true);
+
+        assertEquals(connectorManagedGroup, result);
+    }
+
+    @Test
+    void 
testGetProcessGroupFromConnectorManagedWithIncludeConnectorManagedFalseThrows() 
{
+        assertThrows(ResourceNotFoundException.class, () ->
+            processGroupDAO.getProcessGroup(CONNECTOR_GROUP_ID, false)
+        );
+    }
+
+    @Test
+    void testGetProcessGroupWithDefaultDoesNotFindConnectorManagedGroup() {
+        assertThrows(ResourceNotFoundException.class, () ->
+            processGroupDAO.getProcessGroup(CONNECTOR_GROUP_ID)
+        );
+    }
+
+    @Test
+    void testGetProcessGroupWithNonExistentIdThrows() {
+        assertThrows(ResourceNotFoundException.class, () ->
+            processGroupDAO.getProcessGroup(NON_EXISTENT_ID, true)
+        );
+    }
+
+    @Test
+    void 
testGetProcessGroupWithNonExistentIdAndIncludeConnectorManagedFalseThrows() {
+        assertThrows(ResourceNotFoundException.class, () ->
+            processGroupDAO.getProcessGroup(NON_EXISTENT_ID, false)
+        );
+    }
+}

Reply via email to