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)
+ );
+ }
+}