http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java index 67f24e1..ba9d0ff 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiServiceFacade.java @@ -34,7 +34,6 @@ import org.apache.nifi.web.api.dto.CountersDTO; import org.apache.nifi.web.api.dto.DocumentedTypeDTO; import org.apache.nifi.web.api.dto.DropRequestDTO; import org.apache.nifi.web.api.dto.FlowFileDTO; -import org.apache.nifi.web.api.dto.FlowSnippetDTO; import org.apache.nifi.web.api.dto.FunnelDTO; import org.apache.nifi.web.api.dto.LabelDTO; import org.apache.nifi.web.api.dto.ListingRequestDTO; @@ -54,6 +53,8 @@ import org.apache.nifi.web.api.dto.TemplateDTO; import org.apache.nifi.web.api.dto.action.ActionDTO; import org.apache.nifi.web.api.dto.action.HistoryDTO; import org.apache.nifi.web.api.dto.action.HistoryQueryDTO; +import org.apache.nifi.web.api.dto.flow.FlowDTO; +import org.apache.nifi.web.api.dto.flow.ProcessGroupFlowDTO; import org.apache.nifi.web.api.dto.provenance.ProvenanceDTO; import org.apache.nifi.web.api.dto.provenance.ProvenanceEventDTO; import org.apache.nifi.web.api.dto.provenance.ProvenanceOptionsDTO; @@ -66,6 +67,13 @@ import org.apache.nifi.web.api.dto.status.ProcessGroupStatusDTO; import org.apache.nifi.web.api.dto.status.ProcessorStatusDTO; import org.apache.nifi.web.api.dto.status.RemoteProcessGroupStatusDTO; import org.apache.nifi.web.api.dto.status.StatusHistoryDTO; +import org.apache.nifi.web.api.entity.ConnectionEntity; +import org.apache.nifi.web.api.entity.FunnelEntity; +import org.apache.nifi.web.api.entity.LabelEntity; +import org.apache.nifi.web.api.entity.PortEntity; +import org.apache.nifi.web.api.entity.ProcessGroupEntity; +import org.apache.nifi.web.api.entity.ProcessorEntity; +import org.apache.nifi.web.api.entity.RemoteProcessGroupEntity; import java.util.Date; import java.util.List; @@ -318,7 +326,7 @@ public interface NiFiServiceFacade { * @param originY y * @return snapshot */ - ConfigurationSnapshot<FlowSnippetDTO> createTemplateInstance(Revision revision, String groupId, Double originX, Double originY, String templateId); + ConfigurationSnapshot<FlowDTO> createTemplateInstance(Revision revision, String groupId, Double originX, Double originY, String templateId); /** * Gets the template with the specified id. @@ -361,7 +369,7 @@ public interface NiFiServiceFacade { * @param processorDTO The processor DTO * @return The new processor DTO */ - ConfigurationSnapshot<ProcessorDTO> createProcessor(Revision revision, String groupId, ProcessorDTO processorDTO); + ProcessorEntity createProcessor(Revision revision, String groupId, ProcessorDTO processorDTO); /** * Gets the Processor transfer object for the specified id. @@ -369,7 +377,7 @@ public interface NiFiServiceFacade { * @param id Id of the processor to return * @return The Processor transfer object */ - ProcessorDTO getProcessor(String id); + ProcessorEntity getProcessor(String id); /** * Gets the processor status. @@ -402,7 +410,7 @@ public interface NiFiServiceFacade { * @param groupId group * @return List of all the Processor transfer object */ - Set<ProcessorDTO> getProcessors(String groupId); + Set<ProcessorEntity> getProcessors(String groupId); /** * Verifies the specified processor can be updated. @@ -418,7 +426,7 @@ public interface NiFiServiceFacade { * @param processorDTO The processorDTO * @return The updated processor */ - ConfigurationSnapshot<ProcessorDTO> updateProcessor(Revision revision, ProcessorDTO processorDTO); + UpdateResult<ProcessorEntity> updateProcessor(Revision revision, ProcessorDTO processorDTO); /** * Verifies the specified processor can be removed. @@ -434,7 +442,7 @@ public interface NiFiServiceFacade { * @param processorId The processor id to delete * @return snapshot */ - ConfigurationSnapshot<Void> deleteProcessor(Revision revision, String processorId); + ProcessorEntity deleteProcessor(Revision revision, String processorId); // ---------------------------------------- // Connections methods @@ -446,7 +454,7 @@ public interface NiFiServiceFacade { * @param groupId group * @return The Connection transfer objects */ - Set<ConnectionDTO> getConnections(String groupId); + Set<ConnectionEntity> getConnections(String groupId); /** * Gets the specified Connection transfer object. @@ -454,7 +462,7 @@ public interface NiFiServiceFacade { * @param connectionId The ID of the connection * @return The Connection transfer object */ - ConnectionDTO getConnection(String connectionId); + ConnectionEntity getConnection(String connectionId); /** * Gets the status of the specified connection. @@ -480,7 +488,7 @@ public interface NiFiServiceFacade { * @param connectionDTO The Connection DTO * @return The Connection DTO */ - ConfigurationSnapshot<ConnectionDTO> createConnection(Revision revision, String groupId, ConnectionDTO connectionDTO); + ConnectionEntity createConnection(Revision revision, String groupId, ConnectionDTO connectionDTO); /** * Determines if this connection can be listed. @@ -511,7 +519,7 @@ public interface NiFiServiceFacade { * @param connectionDTO The Connection DTO * @return The Connection DTO */ - ConfigurationSnapshot<ConnectionDTO> updateConnection(Revision revision, ConnectionDTO connectionDTO); + UpdateResult<ConnectionEntity> updateConnection(Revision revision, ConnectionDTO connectionDTO); /** * Determines if this connection can be removed. @@ -527,7 +535,7 @@ public interface NiFiServiceFacade { * @param connectionId The ID of the connection * @return snapshot */ - ConfigurationSnapshot<Void> deleteConnection(Revision revision, String connectionId); + ConnectionEntity deleteConnection(Revision revision, String connectionId); /** * Creates a new flow file drop request. @@ -603,7 +611,7 @@ public interface NiFiServiceFacade { * @param inputPortDTO The input PortDTO * @return snapshot */ - ConfigurationSnapshot<PortDTO> createInputPort(Revision revision, String groupId, PortDTO inputPortDTO); + PortEntity createInputPort(Revision revision, String groupId, PortDTO inputPortDTO); /** * Gets an input port. @@ -611,7 +619,7 @@ public interface NiFiServiceFacade { * @param inputPortId The input port id * @return port */ - PortDTO getInputPort(String inputPortId); + PortEntity getInputPort(String inputPortId); /** * Gets all input ports in a given group. @@ -619,7 +627,7 @@ public interface NiFiServiceFacade { * @param groupId The id of the group * @return port */ - Set<PortDTO> getInputPorts(String groupId); + Set<PortEntity> getInputPorts(String groupId); /** * Gets the input port status. @@ -643,7 +651,7 @@ public interface NiFiServiceFacade { * @param inputPortDTO The input PortDTO * @return snapshort */ - ConfigurationSnapshot<PortDTO> updateInputPort(Revision revision, PortDTO inputPortDTO); + UpdateResult<PortEntity> updateInputPort(Revision revision, PortDTO inputPortDTO); /** * Determines if the input port could be deleted. @@ -659,7 +667,7 @@ public interface NiFiServiceFacade { * @param inputPortId The id of the input port * @return snapshot */ - ConfigurationSnapshot<Void> deleteInputPort(Revision revision, String inputPortId); + PortEntity deleteInputPort(Revision revision, String inputPortId); // ---------------------------------------- // OutputPort methods @@ -672,7 +680,7 @@ public interface NiFiServiceFacade { * @param outputPortDTO The output PortDTO * @return snapshot */ - ConfigurationSnapshot<PortDTO> createOutputPort(Revision revision, String groupId, PortDTO outputPortDTO); + PortEntity createOutputPort(Revision revision, String groupId, PortDTO outputPortDTO); /** * Gets an output port. @@ -680,7 +688,7 @@ public interface NiFiServiceFacade { * @param outputPortId The output port id * @return port */ - PortDTO getOutputPort(String outputPortId); + PortEntity getOutputPort(String outputPortId); /** * Gets all output ports in a given group. @@ -688,7 +696,7 @@ public interface NiFiServiceFacade { * @param groupId The id of the group * @return ports */ - Set<PortDTO> getOutputPorts(String groupId); + Set<PortEntity> getOutputPorts(String groupId); /** * Gets the output port status. @@ -712,7 +720,7 @@ public interface NiFiServiceFacade { * @param outputPortDTO The output PortDTO * @return snapshot */ - ConfigurationSnapshot<PortDTO> updateOutputPort(Revision revision, PortDTO outputPortDTO); + UpdateResult<PortEntity> updateOutputPort(Revision revision, PortDTO outputPortDTO); /** * Determines if the output port could be deleted. @@ -728,7 +736,19 @@ public interface NiFiServiceFacade { * @param outputPortId The id of the output port * @return snapshot */ - ConfigurationSnapshot<Void> deleteOutputPort(Revision revision, String outputPortId); + PortEntity deleteOutputPort(Revision revision, String outputPortId); + + // ---------------------------------------- + // Flow methods + // ---------------------------------------- + /** + * Returns the flow. + * + * @param groupId group + * @param recurse recurse + * @return the flow + */ + ConfigurationSnapshot<ProcessGroupFlowDTO> getProcessGroupFlow(String groupId, boolean recurse); // ---------------------------------------- // ProcessGroup methods @@ -741,16 +761,15 @@ public interface NiFiServiceFacade { * @param processGroupDTO The ProcessGroupDTO * @return snapshot */ - ConfigurationSnapshot<ProcessGroupDTO> createProcessGroup(String parentGroupId, Revision revision, ProcessGroupDTO processGroupDTO); + ProcessGroupEntity createProcessGroup(String parentGroupId, Revision revision, ProcessGroupDTO processGroupDTO); /** * Returns the process group. * * @param groupId group - * @param recurse recurse * @return ProcessGroup transfer object */ - ConfigurationSnapshot<ProcessGroupDTO> getProcessGroup(String groupId, boolean recurse); + ProcessGroupEntity getProcessGroup(String groupId); /** * Gets all process groups in the specified parent group. @@ -758,7 +777,7 @@ public interface NiFiServiceFacade { * @param parentGroupId The id of the parent group * @return process group */ - Set<ProcessGroupDTO> getProcessGroups(String parentGroupId); + Set<ProcessGroupEntity> getProcessGroups(String parentGroupId); /** * Verifies the specified process group can be updated. @@ -774,7 +793,7 @@ public interface NiFiServiceFacade { * @param processGroupDTO The ProcessGroupDTO * @return snapshot */ - ConfigurationSnapshot<ProcessGroupDTO> updateProcessGroup(Revision revision, ProcessGroupDTO processGroupDTO); + UpdateResult<ProcessGroupEntity> updateProcessGroup(Revision revision, ProcessGroupDTO processGroupDTO); /** * Verifies the specified process group can be removed. @@ -790,7 +809,7 @@ public interface NiFiServiceFacade { * @param groupId The id of the process group * @return snapshot */ - ConfigurationSnapshot<Void> deleteProcessGroup(Revision revision, String groupId); + ProcessGroupEntity deleteProcessGroup(Revision revision, String groupId); // ---------------------------------------- // RemoteProcessGroup methods @@ -803,7 +822,7 @@ public interface NiFiServiceFacade { * @param remoteProcessGroupDTO The RemoteProcessGroupDTO * @return snapshot */ - ConfigurationSnapshot<RemoteProcessGroupDTO> createRemoteProcessGroup(Revision revision, String groupId, RemoteProcessGroupDTO remoteProcessGroupDTO); + RemoteProcessGroupEntity createRemoteProcessGroup(Revision revision, String groupId, RemoteProcessGroupDTO remoteProcessGroupDTO); /** * Gets a remote process group. @@ -811,7 +830,7 @@ public interface NiFiServiceFacade { * @param remoteProcessGroupId The id of the remote process group * @return group */ - RemoteProcessGroupDTO getRemoteProcessGroup(String remoteProcessGroupId); + RemoteProcessGroupEntity getRemoteProcessGroup(String remoteProcessGroupId); /** * Gets all remote process groups in the a given parent group. @@ -819,7 +838,7 @@ public interface NiFiServiceFacade { * @param groupId The id of the parent group * @return group */ - Set<RemoteProcessGroupDTO> getRemoteProcessGroups(String groupId); + Set<RemoteProcessGroupEntity> getRemoteProcessGroups(String groupId); /** * Gets the remote process group status. @@ -867,7 +886,7 @@ public interface NiFiServiceFacade { * @param remoteProcessGroupDTO The RemoteProcessGroupDTO * @return snapshot */ - ConfigurationSnapshot<RemoteProcessGroupDTO> updateRemoteProcessGroup(Revision revision, RemoteProcessGroupDTO remoteProcessGroupDTO); + UpdateResult<RemoteProcessGroupEntity> updateRemoteProcessGroup(Revision revision, RemoteProcessGroupDTO remoteProcessGroupDTO); /** * Updates the specified remote process groups input port. @@ -903,7 +922,7 @@ public interface NiFiServiceFacade { * @param remoteProcessGroupId The id of the remote process group * @return snapshot */ - ConfigurationSnapshot<Void> deleteRemoteProcessGroup(Revision revision, String remoteProcessGroupId); + RemoteProcessGroupEntity deleteRemoteProcessGroup(Revision revision, String remoteProcessGroupId); // ---------------------------------------- // Funnel methods @@ -916,7 +935,7 @@ public interface NiFiServiceFacade { * @param funnelDTO funnel * @return The funnel DTO */ - ConfigurationSnapshot<FunnelDTO> createFunnel(Revision revision, String groupId, FunnelDTO funnelDTO); + FunnelEntity createFunnel(Revision revision, String groupId, FunnelDTO funnelDTO); /** * Gets the specified funnel. @@ -924,7 +943,7 @@ public interface NiFiServiceFacade { * @param funnelId The funnel id * @return The funnel transfer object */ - FunnelDTO getFunnel(String funnelId); + FunnelEntity getFunnel(String funnelId); /** * Gets all of the funnels. @@ -932,7 +951,7 @@ public interface NiFiServiceFacade { * @param groupId group * @return The funnel transfer objects */ - Set<FunnelDTO> getFunnels(String groupId); + Set<FunnelEntity> getFunnels(String groupId); /** * Updates the specified label. @@ -941,7 +960,7 @@ public interface NiFiServiceFacade { * @param funnelDTO The funnel DTO * @return The funnel DTO */ - ConfigurationSnapshot<FunnelDTO> updateFunnel(Revision revision, FunnelDTO funnelDTO); + UpdateResult<FunnelEntity> updateFunnel(Revision revision, FunnelDTO funnelDTO); /** * Verifies the specified funnel can be deleted. @@ -957,7 +976,7 @@ public interface NiFiServiceFacade { * @param funnelId The funnel id * @return snapshot */ - ConfigurationSnapshot<Void> deleteFunnel(Revision revision, String funnelId); + FunnelEntity deleteFunnel(Revision revision, String funnelId); // ---------------------------------------- // Component state methods @@ -1046,7 +1065,7 @@ public interface NiFiServiceFacade { * @param labelDTO The label DTO * @return The label DTO */ - ConfigurationSnapshot<LabelDTO> createLabel(Revision revision, String groupId, LabelDTO labelDTO); + LabelEntity createLabel(Revision revision, String groupId, LabelDTO labelDTO); /** * Gets the specified label. @@ -1054,7 +1073,7 @@ public interface NiFiServiceFacade { * @param labelId The label id * @return The label transfer object */ - LabelDTO getLabel(String labelId); + LabelEntity getLabel(String labelId); /** * Gets all of the labels. @@ -1062,7 +1081,7 @@ public interface NiFiServiceFacade { * @param groupId group * @return The label transfer objects */ - Set<LabelDTO> getLabels(String groupId); + Set<LabelEntity> getLabels(String groupId); /** * Updates the specified label. @@ -1071,7 +1090,7 @@ public interface NiFiServiceFacade { * @param labelDTO The label DTO * @return The label DTO */ - ConfigurationSnapshot<LabelDTO> updateLabel(Revision revision, LabelDTO labelDTO); + UpdateResult<LabelEntity> updateLabel(Revision revision, LabelDTO labelDTO); /** * Deletes the specified label. @@ -1080,7 +1099,7 @@ public interface NiFiServiceFacade { * @param labelId The label id * @return snapshot */ - ConfigurationSnapshot<Void> deleteLabel(Revision revision, String labelId); + LabelEntity deleteLabel(Revision revision, String labelId); // ---------------------------------------- // Controller Services methods @@ -1294,7 +1313,7 @@ public interface NiFiServiceFacade { * @param originY y * @return snapshot */ - ConfigurationSnapshot<FlowSnippetDTO> copySnippet(Revision revision, String groupId, String snippetId, Double originX, Double originY); + ConfigurationSnapshot<FlowDTO> copySnippet(Revision revision, String groupId, String snippetId, Double originX, Double originY); /** * Creates a new snippet.
http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java index 58b0af8..51fa7a2 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/NiFiWebApiConfiguration.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.ImportResource; @Import({NiFiWebApiSecurityConfiguration.class}) @ImportResource({"classpath:nifi-context.xml", "classpath:nifi-administration-context.xml", + "classpath:nifi-framework-authorization-context.xml", "classpath:nifi-cluster-manager-context.xml", "classpath:nifi-cluster-protocol-context.xml", "classpath:nifi-web-security-context.xml", http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java index 66f1546..36db1d9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiContentAccess.java @@ -20,6 +20,8 @@ import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.ClientResponse.Status; import com.sun.jersey.core.util.MultivaluedMapImpl; import org.apache.commons.lang3.StringUtils; +import org.apache.nifi.authorization.AccessDeniedException; +import org.apache.nifi.authorization.user.NiFiUserDetails; import org.apache.nifi.cluster.manager.NodeResponse; import org.apache.nifi.cluster.manager.exception.UnknownNodeException; import org.apache.nifi.cluster.manager.impl.WebClusterManager; @@ -27,11 +29,9 @@ import org.apache.nifi.cluster.node.Node; import org.apache.nifi.cluster.protocol.NodeIdentifier; import org.apache.nifi.controller.repository.claim.ContentDirection; import org.apache.nifi.util.NiFiProperties; -import org.apache.nifi.web.security.user.NiFiUserDetails; import org.apache.nifi.web.util.WebUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; http://git-wip-us.apache.org/repos/asf/nifi/blob/ff98d823/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java index dae1ab6..b85c15d 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java @@ -24,7 +24,12 @@ import org.apache.nifi.action.Operation; import org.apache.nifi.action.details.FlowChangePurgeDetails; import org.apache.nifi.admin.service.AuditService; import org.apache.nifi.admin.service.KeyService; +import org.apache.nifi.authorization.Authorizer; +import org.apache.nifi.authorization.RequestAction; import org.apache.nifi.authorization.Resource; +import org.apache.nifi.authorization.resource.Authorizable; +import org.apache.nifi.authorization.user.NiFiUser; +import org.apache.nifi.authorization.user.NiFiUserUtils; import org.apache.nifi.cluster.context.ClusterContext; import org.apache.nifi.cluster.context.ClusterContextThreadLocal; import org.apache.nifi.cluster.coordination.heartbeat.NodeHeartbeat; @@ -62,13 +67,14 @@ import org.apache.nifi.remote.RootGroupPort; import org.apache.nifi.reporting.Bulletin; import org.apache.nifi.reporting.BulletinQuery; import org.apache.nifi.reporting.BulletinRepository; -import org.apache.nifi.user.NiFiUser; import org.apache.nifi.util.FormatUtils; import org.apache.nifi.util.NiFiProperties; +import org.apache.nifi.web.api.dto.AccessPolicyDTO; import org.apache.nifi.web.api.dto.BulletinBoardDTO; import org.apache.nifi.web.api.dto.BulletinDTO; import org.apache.nifi.web.api.dto.BulletinQueryDTO; import org.apache.nifi.web.api.dto.ClusterDTO; +import org.apache.nifi.web.api.dto.ComponentDTO; import org.apache.nifi.web.api.dto.ComponentHistoryDTO; import org.apache.nifi.web.api.dto.ComponentStateDTO; import org.apache.nifi.web.api.dto.ConnectionDTO; @@ -82,12 +88,12 @@ import org.apache.nifi.web.api.dto.CountersSnapshotDTO; import org.apache.nifi.web.api.dto.DocumentedTypeDTO; import org.apache.nifi.web.api.dto.DropRequestDTO; import org.apache.nifi.web.api.dto.DtoFactory; +import org.apache.nifi.web.api.dto.EntityFactory; import org.apache.nifi.web.api.dto.FlowFileDTO; import org.apache.nifi.web.api.dto.FlowSnippetDTO; import org.apache.nifi.web.api.dto.FunnelDTO; import org.apache.nifi.web.api.dto.LabelDTO; import org.apache.nifi.web.api.dto.ListingRequestDTO; -import org.apache.nifi.web.api.dto.NiFiComponentDTO; import org.apache.nifi.web.api.dto.NodeDTO; import org.apache.nifi.web.api.dto.PortDTO; import org.apache.nifi.web.api.dto.PreviousValueDTO; @@ -107,6 +113,8 @@ import org.apache.nifi.web.api.dto.TemplateDTO; import org.apache.nifi.web.api.dto.action.ActionDTO; import org.apache.nifi.web.api.dto.action.HistoryDTO; import org.apache.nifi.web.api.dto.action.HistoryQueryDTO; +import org.apache.nifi.web.api.dto.flow.FlowDTO; +import org.apache.nifi.web.api.dto.flow.ProcessGroupFlowDTO; import org.apache.nifi.web.api.dto.provenance.ProvenanceDTO; import org.apache.nifi.web.api.dto.provenance.ProvenanceEventDTO; import org.apache.nifi.web.api.dto.provenance.ProvenanceOptionsDTO; @@ -119,6 +127,13 @@ import org.apache.nifi.web.api.dto.status.ProcessGroupStatusDTO; import org.apache.nifi.web.api.dto.status.ProcessorStatusDTO; import org.apache.nifi.web.api.dto.status.RemoteProcessGroupStatusDTO; import org.apache.nifi.web.api.dto.status.StatusHistoryDTO; +import org.apache.nifi.web.api.entity.ConnectionEntity; +import org.apache.nifi.web.api.entity.FunnelEntity; +import org.apache.nifi.web.api.entity.LabelEntity; +import org.apache.nifi.web.api.entity.PortEntity; +import org.apache.nifi.web.api.entity.ProcessGroupEntity; +import org.apache.nifi.web.api.entity.ProcessorEntity; +import org.apache.nifi.web.api.entity.RemoteProcessGroupEntity; import org.apache.nifi.web.controller.ControllerFacade; import org.apache.nifi.web.dao.ConnectionDAO; import org.apache.nifi.web.dao.ControllerServiceDAO; @@ -131,7 +146,6 @@ import org.apache.nifi.web.dao.RemoteProcessGroupDAO; import org.apache.nifi.web.dao.ReportingTaskDAO; import org.apache.nifi.web.dao.SnippetDAO; import org.apache.nifi.web.dao.TemplateDAO; -import org.apache.nifi.web.security.user.NiFiUserUtils; import org.apache.nifi.web.util.SnippetUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -192,6 +206,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // properties private NiFiProperties properties; private DtoFactory dtoFactory; + private EntityFactory entityFactory; + + private Authorizer authorizer; // ----------------------------------------- // Verification Operations @@ -345,43 +362,73 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // Write Operations // ----------------------------------------- @Override - public ConfigurationSnapshot<ConnectionDTO> updateConnection(final Revision revision, final ConnectionDTO connectionDTO) { + public UpdateResult<ConnectionEntity> updateConnection(final Revision revision, final ConnectionDTO connectionDTO) { // if connection does not exist, then create new connection if (connectionDAO.hasConnection(connectionDTO.getId()) == false) { - return createConnection(revision, connectionDTO.getParentGroupId(), connectionDTO); + return new UpdateResult<>(createConnection(revision, connectionDTO.getParentGroupId(), connectionDTO), true); } - return updateComponent(revision, () -> connectionDAO.updateConnection(connectionDTO), connection -> dtoFactory.createConnectionDto(connection)); + final Connection connectionNode = connectionDAO.getConnection(connectionDTO.getId()); + final ConfigurationSnapshot<ConnectionDTO> snapshot = updateComponent( + revision, + connectionNode, + () -> connectionDAO.updateConnection(connectionDTO), + connection -> dtoFactory.createConnectionDto(connection)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connectionNode); + return new UpdateResult<>(entityFactory.createConnectionEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false); } @Override - public ConfigurationSnapshot<ProcessorDTO> updateProcessor(final Revision revision, final ProcessorDTO processorDTO) { + public UpdateResult<ProcessorEntity> updateProcessor(final Revision revision, final ProcessorDTO processorDTO) { // if processor does not exist, then create new processor if (processorDAO.hasProcessor(processorDTO.getId()) == false) { - return createProcessor(revision, processorDTO.getParentGroupId(), processorDTO); + return new UpdateResult<>(createProcessor(revision, processorDTO.getParentGroupId(), processorDTO), true); } - return updateComponent(revision, () -> processorDAO.updateProcessor(processorDTO), proc -> dtoFactory.createProcessorDto(proc)); + // get the component, ensure we have access to it, and perform the update request + final ProcessorNode processorNode = processorDAO.getProcessor(processorDTO.getId()); + final ConfigurationSnapshot<ProcessorDTO> snapshot = updateComponent(revision, + processorNode, + () -> processorDAO.updateProcessor(processorDTO), + proc -> dtoFactory.createProcessorDto(proc)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processorNode); + return new UpdateResult<>(entityFactory.createProcessorEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false); } @Override - public ConfigurationSnapshot<LabelDTO> updateLabel(final Revision revision, final LabelDTO labelDTO) { + public UpdateResult<LabelEntity> updateLabel(final Revision revision, final LabelDTO labelDTO) { // if label does not exist, then create new label if (labelDAO.hasLabel(labelDTO.getId()) == false) { - return createLabel(revision, labelDTO.getParentGroupId(), labelDTO); + return new UpdateResult<>(createLabel(revision, labelDTO.getParentGroupId(), labelDTO), false); } - return updateComponent(revision, () -> labelDAO.updateLabel(labelDTO), label -> dtoFactory.createLabelDto(label)); + final Label labelNode = labelDAO.getLabel(labelDTO.getId()); + final ConfigurationSnapshot<LabelDTO> snapshot = updateComponent(revision, + labelNode, + () -> labelDAO.updateLabel(labelDTO), + label -> dtoFactory.createLabelDto(label)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(labelNode); + return new UpdateResult<>(entityFactory.createLabelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false); } @Override - public ConfigurationSnapshot<FunnelDTO> updateFunnel(final Revision revision, final FunnelDTO funnelDTO) { + public UpdateResult<FunnelEntity> updateFunnel(final Revision revision, final FunnelDTO funnelDTO) { // if label does not exist, then create new label if (funnelDAO.hasFunnel(funnelDTO.getId()) == false) { - return createFunnel(revision, funnelDTO.getParentGroupId(), funnelDTO); + return new UpdateResult<>(createFunnel(revision, funnelDTO.getParentGroupId(), funnelDTO), true); } - return updateComponent(revision, () -> funnelDAO.updateFunnel(funnelDTO), funnel -> dtoFactory.createFunnelDto(funnel)); + final Funnel funnelNode = funnelDAO.getFunnel(funnelDTO.getId()); + final ConfigurationSnapshot<FunnelDTO> snapshot = updateComponent(revision, + funnelNode, + () -> funnelDAO.updateFunnel(funnelDTO), + funnel -> dtoFactory.createFunnelDto(funnel)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnelNode); + return new UpdateResult<>(entityFactory.createFunnelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false); } @@ -398,10 +445,18 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { * * @return A ConfigurationSnapshot that represents the new configuration */ - private <D, C> ConfigurationSnapshot<D> updateComponent(final Revision revision, final Supplier<C> daoUpdate, final Function<C, D> dtoCreation) { + private <D, C> ConfigurationSnapshot<D> updateComponent(final Revision revision, final Authorizable authorizable, final Supplier<C> daoUpdate, final Function<C, D> + dtoCreation) { return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<D>() { @Override public ConfigurationResult<D> execute() { + // ensure write access to the flow + authorizable.authorize(authorizer, RequestAction.WRITE); + + // also ensure read access to the flow as the component must be read in order to generate a response + authorizable.authorize(authorizer, RequestAction.READ); + + // get the updated component final C component = daoUpdate.get(); // save updated controller @@ -439,52 +494,77 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { return createSnippet(revision, snippetDto); } - return updateComponent(revision, + final ProcessGroup processGroup = processGroupDAO.getProcessGroup(snippetDto.getParentGroupId()); + return updateComponent( + revision, + processGroup, () -> snippetDAO.updateSnippet(snippetDto), snippet -> { - final SnippetDTO responseSnippetDto = dtoFactory.createSnippetDto(snippet); - responseSnippetDto.setContents(snippetUtils.populateFlowSnippet(snippet, false, false)); - return responseSnippetDto; + return dtoFactory.createSnippetDto(snippet); }); } @Override - public ConfigurationSnapshot<PortDTO> updateInputPort(final Revision revision, final PortDTO inputPortDTO) { + public UpdateResult<PortEntity> updateInputPort(final Revision revision, final PortDTO inputPortDTO) { // if input port does not exist, then create new input port if (inputPortDAO.hasPort(inputPortDTO.getId()) == false) { - return createInputPort(revision, inputPortDTO.getParentGroupId(), inputPortDTO); + return new UpdateResult<>(createInputPort(revision, inputPortDTO.getParentGroupId(), inputPortDTO), true); } - return updateComponent(revision, () -> inputPortDAO.updatePort(inputPortDTO), port -> dtoFactory.createPortDto(port)); + final Port inputPortNode = inputPortDAO.getPort(inputPortDTO.getId()); + final ConfigurationSnapshot<PortDTO> snapshot = updateComponent(revision, + inputPortNode, + () -> inputPortDAO.updatePort(inputPortDTO), + port -> dtoFactory.createPortDto(port)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(inputPortNode); + return new UpdateResult<>(entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false); } @Override - public ConfigurationSnapshot<PortDTO> updateOutputPort(final Revision revision, final PortDTO outputPortDTO) { + public UpdateResult<PortEntity> updateOutputPort(final Revision revision, final PortDTO outputPortDTO) { // if output port does not exist, then create new output port if (outputPortDAO.hasPort(outputPortDTO.getId()) == false) { - return createOutputPort(revision, outputPortDTO.getParentGroupId(), outputPortDTO); + return new UpdateResult<>(createOutputPort(revision, outputPortDTO.getParentGroupId(), outputPortDTO), true); } - return updateComponent(revision, () -> outputPortDAO.updatePort(outputPortDTO), port -> dtoFactory.createPortDto(port)); + final Port outputPortNode = outputPortDAO.getPort(outputPortDTO.getId()); + final ConfigurationSnapshot<PortDTO> snapshot = updateComponent(revision, + outputPortNode, + () -> outputPortDAO.updatePort(outputPortDTO), + port -> dtoFactory.createPortDto(port)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(outputPortNode); + return new UpdateResult<>(entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy), false); } @Override - public ConfigurationSnapshot<RemoteProcessGroupDTO> updateRemoteProcessGroup(final Revision revision, final RemoteProcessGroupDTO remoteProcessGroupDTO) { + public UpdateResult<RemoteProcessGroupEntity> updateRemoteProcessGroup(final Revision revision, final RemoteProcessGroupDTO remoteProcessGroupDTO) { // if controller reference does not exist, then create new controller reference if (remoteProcessGroupDAO.hasRemoteProcessGroup(remoteProcessGroupDTO.getId()) == false) { - return createRemoteProcessGroup(revision, remoteProcessGroupDTO.getParentGroupId(), remoteProcessGroupDTO); + return new UpdateResult<>(createRemoteProcessGroup(revision, remoteProcessGroupDTO.getParentGroupId(), remoteProcessGroupDTO), true); } - return updateComponent(revision, + final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId()); + final ConfigurationSnapshot<RemoteProcessGroupDTO> snapshot = updateComponent( + revision, + remoteProcessGroupNode, () -> remoteProcessGroupDAO.updateRemoteProcessGroup(remoteProcessGroupDTO), remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroupNode); + final RevisionDTO updateRevision = dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()); + return new UpdateResult<>(entityFactory.createRemoteProcessGroupEntity(snapshot.getConfiguration(), updateRevision, accessPolicy), false); } @Override public ConfigurationSnapshot<RemoteProcessGroupPortDTO> updateRemoteProcessGroupInputPort( final Revision revision, final String remoteProcessGroupId, final RemoteProcessGroupPortDTO remoteProcessGroupPortDTO) { - return updateComponent(revision, + final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupPortDTO.getGroupId()); + return updateComponent( + revision, + remoteProcessGroupNode, () -> remoteProcessGroupDAO.updateRemoteProcessGroupInputPort(remoteProcessGroupId, remoteProcessGroupPortDTO), remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort)); } @@ -493,28 +573,42 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ConfigurationSnapshot<RemoteProcessGroupPortDTO> updateRemoteProcessGroupOutputPort( final Revision revision, final String remoteProcessGroupId, final RemoteProcessGroupPortDTO remoteProcessGroupPortDTO) { - return updateComponent(revision, + final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupPortDTO.getGroupId()); + return updateComponent( + revision, + remoteProcessGroupNode, () -> remoteProcessGroupDAO.updateRemoteProcessGroupOutputPort(remoteProcessGroupId, remoteProcessGroupPortDTO), remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort)); } @Override - public ConfigurationSnapshot<ProcessGroupDTO> updateProcessGroup(final Revision revision, final ProcessGroupDTO processGroupDTO) { + public UpdateResult<ProcessGroupEntity> updateProcessGroup(final Revision revision, final ProcessGroupDTO processGroupDTO) { // if process group does not exist, then create new process group if (processGroupDAO.hasProcessGroup(processGroupDTO.getId()) == false) { if (processGroupDTO.getParentGroupId() == null) { throw new IllegalArgumentException("Unable to create the specified process group since the parent group was not specified."); } else { - return createProcessGroup(processGroupDTO.getParentGroupId(), revision, processGroupDTO); + return new UpdateResult<>(createProcessGroup(processGroupDTO.getParentGroupId(), revision, processGroupDTO), true); } } - return updateComponent(revision, () -> processGroupDAO.updateProcessGroup(processGroupDTO), processGroup -> dtoFactory.createProcessGroupDto(processGroup)); + final ProcessGroup processGroupNode = processGroupDAO.getProcessGroup(processGroupDTO.getId()); + final ConfigurationSnapshot<ProcessGroupDTO> snapshot = updateComponent(revision, + processGroupNode, + () -> processGroupDAO.updateProcessGroup(processGroupDTO), + processGroup -> dtoFactory.createProcessGroupDto(processGroup)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroupNode); + final RevisionDTO updatedRevision = dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()); + return new UpdateResult<>(entityFactory.createProcessGroupEntity(snapshot.getConfiguration(), updatedRevision, accessPolicy), false); } @Override public ConfigurationSnapshot<ControllerConfigurationDTO> updateControllerConfiguration(final Revision revision, final ControllerConfigurationDTO controllerConfigurationDTO) { - return updateComponent(revision, + + return updateComponent( + revision, + controllerFacade, () -> { // update the controller configuration through the proxy if (controllerConfigurationDTO.getName() != null) { @@ -611,21 +705,33 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<Void> deleteConnection(final Revision revision, final String connectionId) { - return deleteComponent(revision, () -> connectionDAO.deleteConnection(connectionId)); + public ConnectionEntity deleteConnection(final Revision revision, final String connectionId) { + final Connection connection = connectionDAO.getConnection(connectionId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + connection, + () -> connectionDAO.deleteConnection(connectionId)); + + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection); + return entityFactory.createConnectionEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override public DropRequestDTO deleteFlowFileDropRequest(String connectionId, String dropRequestId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); + return dtoFactory.createDropRequestDTO(connectionDAO.deleteFlowFileDropRequest(connectionId, dropRequestId)); } @Override public ListingRequestDTO deleteFlowFileListingRequest(String connectionId, String listingRequestId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); + final ListingRequestDTO listRequest = dtoFactory.createListingRequestDTO(connectionDAO.deleteFlowFileListingRequest(connectionId, listingRequestId)); // include whether the source and destination are running - final Connection connection = connectionDAO.getConnection(connectionId); if (connection.getSource() != null) { listRequest.setSourceRunning(connection.getSource().isRunning()); } @@ -637,18 +743,36 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<Void> deleteProcessor(final Revision revision, final String processorId) { - return deleteComponent(revision, () -> processorDAO.deleteProcessor(processorId)); + public ProcessorEntity deleteProcessor(final Revision revision, final String processorId) { + final ProcessorNode processor = processorDAO.getProcessor(processorId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + processor, + () -> processorDAO.deleteProcessor(processorId)); + + return entityFactory.createProcessorEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } @Override - public ConfigurationSnapshot<Void> deleteLabel(final Revision revision, final String labelId) { - return deleteComponent(revision, () -> labelDAO.deleteLabel(labelId)); + public LabelEntity deleteLabel(final Revision revision, final String labelId) { + final Label label = labelDAO.getLabel(labelId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + label, + () -> labelDAO.deleteLabel(labelId)); + + return entityFactory.createLabelEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } @Override - public ConfigurationSnapshot<Void> deleteFunnel(final Revision revision, final String funnelId) { - return deleteComponent(revision, () -> funnelDAO.deleteFunnel(funnelId)); + public FunnelEntity deleteFunnel(final Revision revision, final String funnelId) { + final Funnel funnel = funnelDAO.getFunnel(funnelId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + funnel, + () -> funnelDAO.deleteFunnel(funnelId)); + + return entityFactory.createFunnelEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } /** @@ -658,10 +782,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { * @param action the action that deletes the component via the appropriate DAO object * @return a ConfigurationSnapshot that represents the new configuration */ - private ConfigurationSnapshot<Void> deleteComponent(final Revision revision, final Runnable action) { + private ConfigurationSnapshot<Void> deleteComponent(final Revision revision, final Authorizable authorizable, final Runnable action) { return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<Void>() { @Override public ConfigurationResult<Void> execute() { + // ensure access to the component + authorizable.authorize(authorizer, RequestAction.WRITE); + action.run(); // save the flow @@ -688,27 +815,55 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public ConfigurationSnapshot<Void> deleteSnippet(final Revision revision, final String snippetId) { - return deleteComponent(revision, () -> snippetDAO.deleteSnippet(snippetId)); + final Snippet snippet = snippetDAO.getSnippet(snippetId); + final ProcessGroup processGroup = processGroupDAO.getProcessGroup(snippet.getParentGroupId()); + return deleteComponent(revision, + processGroup, + () -> snippetDAO.deleteSnippet(snippetId)); } @Override - public ConfigurationSnapshot<Void> deleteInputPort(final Revision revision, final String inputPortId) { - return deleteComponent(revision, () -> inputPortDAO.deletePort(inputPortId)); + public PortEntity deleteInputPort(final Revision revision, final String inputPortId) { + final Port port = inputPortDAO.getPort(inputPortId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + port, + () -> inputPortDAO.deletePort(inputPortId)); + + return entityFactory.createPortEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } @Override - public ConfigurationSnapshot<Void> deleteOutputPort(final Revision revision, final String outputPortId) { - return deleteComponent(revision, () -> outputPortDAO.deletePort(outputPortId)); + public PortEntity deleteOutputPort(final Revision revision, final String outputPortId) { + final Port port = outputPortDAO.getPort(outputPortId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + port, + () -> outputPortDAO.deletePort(outputPortId)); + + return entityFactory.createPortEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } @Override - public ConfigurationSnapshot<Void> deleteProcessGroup(final Revision revision, final String groupId) { - return deleteComponent(revision, () -> processGroupDAO.deleteProcessGroup(groupId)); + public ProcessGroupEntity deleteProcessGroup(final Revision revision, final String groupId) { + final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + processGroup, + () -> processGroupDAO.deleteProcessGroup(groupId)); + + return entityFactory.createProcessGroupEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } @Override - public ConfigurationSnapshot<Void> deleteRemoteProcessGroup(final Revision revision, final String remoteProcessGroupId) { - return deleteComponent(revision, () -> remoteProcessGroupDAO.deleteRemoteProcessGroup(remoteProcessGroupId)); + public RemoteProcessGroupEntity deleteRemoteProcessGroup(final Revision revision, final String remoteProcessGroupId) { + final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId); + final ConfigurationSnapshot<Void> snapshot = deleteComponent( + revision, + remoteProcessGroup, + () -> remoteProcessGroupDAO.deleteRemoteProcessGroup(remoteProcessGroupId)); + + return entityFactory.createRemoteProcessGroupEntity(null, dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), null); } @Override @@ -718,21 +873,34 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<ConnectionDTO> createConnection(final Revision revision, final String groupId, final ConnectionDTO connectionDTO) { - return createComponent(revision, connectionDTO, () -> connectionDAO.createConnection(groupId, connectionDTO), connection -> dtoFactory.createConnectionDto(connection)); + public ConnectionEntity createConnection(final Revision revision, final String groupId, final ConnectionDTO connectionDTO) { + final ConfigurationSnapshot<ConnectionDTO> snapshot = createComponent( + revision, + connectionDTO, + () -> connectionDAO.createConnection(groupId, connectionDTO), + connection -> dtoFactory.createConnectionDto(connection)); + + final Connection connection = connectionDAO.getConnection(connectionDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection); + return entityFactory.createConnectionEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override public DropRequestDTO createFlowFileDropRequest(String connectionId, String dropRequestId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); return dtoFactory.createDropRequestDTO(connectionDAO.createFlowFileDropRequest(connectionId, dropRequestId)); } @Override public ListingRequestDTO createFlowFileListingRequest(String connectionId, String listingRequestId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); + + // create the listing request final ListingRequestDTO listRequest = dtoFactory.createListingRequestDTO(connectionDAO.createFlowFileListingRequest(connectionId, listingRequestId)); // include whether the source and destination are running - final Connection connection = connectionDAO.getConnection(connectionId); if (connection.getSource() != null) { listRequest.setSourceRunning(connection.getSource().isRunning()); } @@ -744,13 +912,29 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<ProcessorDTO> createProcessor(final Revision revision, final String groupId, final ProcessorDTO processorDTO) { - return createComponent(revision, processorDTO, () -> processorDAO.createProcessor(groupId, processorDTO), processor -> dtoFactory.createProcessorDto(processor)); + public ProcessorEntity createProcessor(final Revision revision, final String groupId, final ProcessorDTO processorDTO) { + final ConfigurationSnapshot<ProcessorDTO> snapshot = createComponent( + revision, + processorDTO, + () -> processorDAO.createProcessor(groupId, processorDTO), + processor -> dtoFactory.createProcessorDto(processor)); + + final ProcessorNode processor = processorDAO.getProcessor(processorDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processor); + return entityFactory.createProcessorEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override - public ConfigurationSnapshot<LabelDTO> createLabel(final Revision revision, final String groupId, final LabelDTO labelDTO) { - return createComponent(revision, labelDTO, () -> labelDAO.createLabel(groupId, labelDTO), label -> dtoFactory.createLabelDto(label)); + public LabelEntity createLabel(final Revision revision, final String groupId, final LabelDTO labelDTO) { + final ConfigurationSnapshot<LabelDTO> snapshot = createComponent( + revision, + labelDTO, + () -> labelDAO.createLabel(groupId, labelDTO), + label -> dtoFactory.createLabelDto(label)); + + final Label label = labelDAO.getLabel(labelDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(label); + return entityFactory.createLabelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } /** @@ -766,7 +950,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { * * @return a ConfigurationSnapshot that represents the updated configuration */ - private <D, C> ConfigurationSnapshot<D> createComponent(final Revision revision, final NiFiComponentDTO componentDto, + private <D, C> ConfigurationSnapshot<D> createComponent(final Revision revision, final ComponentDTO componentDto, final Supplier<C> daoCreation, final Function<C, D> dtoCreation) { return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<D>() { @@ -777,6 +961,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { componentDto.setId(UUID.randomUUID().toString()); } + // ensure access to process group + final ProcessGroup parent = processGroupDAO.getProcessGroup(componentDto.getParentGroupId()); + parent.authorize(authorizer, RequestAction.WRITE); + // add the component final C component = daoCreation.get(); @@ -801,14 +989,22 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override - public ConfigurationSnapshot<FunnelDTO> createFunnel(final Revision revision, final String groupId, final FunnelDTO funnelDTO) { - return createComponent(revision, funnelDTO, () -> funnelDAO.createFunnel(groupId, funnelDTO), funnel -> dtoFactory.createFunnelDto(funnel)); + public FunnelEntity createFunnel(final Revision revision, final String groupId, final FunnelDTO funnelDTO) { + final ConfigurationSnapshot<FunnelDTO> snapshot = createComponent( + revision, + funnelDTO, + () -> funnelDAO.createFunnel(groupId, funnelDTO), + funnel -> dtoFactory.createFunnelDto(funnel)); + + final Funnel funnel = funnelDAO.getFunnel(funnelDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnel); + return entityFactory.createFunnelEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } - private void validateSnippetContents(final FlowSnippetDTO flowSnippet) { + private void validateSnippetContents(final FlowSnippetDTO flow) { // validate any processors - if (flowSnippet.getProcessors() != null) { - for (final ProcessorDTO processorDTO : flowSnippet.getProcessors()) { + if (flow.getProcessors() != null) { + for (final ProcessorDTO processorDTO : flow.getProcessors()) { final ProcessorNode processorNode = processorDAO.getProcessor(processorDTO.getId()); final Collection<ValidationResult> validationErrors = processorNode.getValidationErrors(); if (validationErrors != null && !validationErrors.isEmpty()) { @@ -821,8 +1017,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } } - if (flowSnippet.getInputPorts() != null) { - for (final PortDTO portDTO : flowSnippet.getInputPorts()) { + if (flow.getInputPorts() != null) { + for (final PortDTO portDTO : flow.getInputPorts()) { final Port port = inputPortDAO.getPort(portDTO.getId()); final Collection<ValidationResult> validationErrors = port.getValidationErrors(); if (validationErrors != null && !validationErrors.isEmpty()) { @@ -835,8 +1031,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } } - if (flowSnippet.getOutputPorts() != null) { - for (final PortDTO portDTO : flowSnippet.getOutputPorts()) { + if (flow.getOutputPorts() != null) { + for (final PortDTO portDTO : flow.getOutputPorts()) { final Port port = outputPortDAO.getPort(portDTO.getId()); final Collection<ValidationResult> validationErrors = port.getValidationErrors(); if (validationErrors != null && !validationErrors.isEmpty()) { @@ -850,8 +1046,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } // get any remote process group issues - if (flowSnippet.getRemoteProcessGroups() != null) { - for (final RemoteProcessGroupDTO remoteProcessGroupDTO : flowSnippet.getRemoteProcessGroups()) { + if (flow.getRemoteProcessGroups() != null) { + for (final RemoteProcessGroupDTO remoteProcessGroupDTO : flow.getRemoteProcessGroups()) { final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId()); if (remoteProcessGroup.getAuthorizationIssue() != null) { remoteProcessGroupDTO.setAuthorizationIssues(Arrays.asList(remoteProcessGroup.getAuthorizationIssue())); @@ -861,35 +1057,31 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<FlowSnippetDTO> copySnippet(final Revision revision, final String groupId, final String snippetId, final Double originX, final Double originY) { - return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowSnippetDTO>() { + public ConfigurationSnapshot<FlowDTO> copySnippet(final Revision revision, final String groupId, final String snippetId, final Double originX, final Double originY) { + return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowDTO>() { @Override - public ConfigurationResult<FlowSnippetDTO> execute() { + public ConfigurationResult<FlowDTO> execute() { String id = snippetId; - // ensure id is set - if (StringUtils.isBlank(id)) { - id = UUID.randomUUID().toString(); - } - // create the new snippet - final FlowSnippetDTO flowSnippet = snippetDAO.copySnippet(groupId, id, originX, originY); + final FlowSnippetDTO snippet = snippetDAO.copySnippet(groupId, id, originX, originY); // validate the new snippet - validateSnippetContents(flowSnippet); + validateSnippetContents(snippet); // save the flow controllerFacade.save(); - return new ConfigurationResult<FlowSnippetDTO>() { + return new ConfigurationResult<FlowDTO>() { @Override public boolean isNew() { return false; } @Override - public FlowSnippetDTO getConfiguration() { - return flowSnippet; + public FlowDTO getConfiguration() { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + return dtoFactory.createFlowDto(group, snippet); } }; } @@ -909,7 +1101,6 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // add the snippet final Snippet snippet = snippetDAO.createSnippet(snippetDTO); final SnippetDTO responseSnippetDTO = dtoFactory.createSnippetDto(snippet); - responseSnippetDTO.setContents(snippetUtils.populateFlowSnippet(snippet, false, false)); return new ConfigurationResult<SnippetDTO>() { @Override @@ -927,27 +1118,53 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<PortDTO> createInputPort(final Revision revision, final String groupId, final PortDTO inputPortDTO) { - return createComponent(revision, inputPortDTO, () -> inputPortDAO.createPort(groupId, inputPortDTO), port -> dtoFactory.createPortDto(port)); + public PortEntity createInputPort(final Revision revision, final String groupId, final PortDTO inputPortDTO) { + final ConfigurationSnapshot<PortDTO> snapshot = createComponent( + revision, + inputPortDTO, + () -> inputPortDAO.createPort(groupId, inputPortDTO), + port -> dtoFactory.createPortDto(port)); + + final Port port = inputPortDAO.getPort(inputPortDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); + return entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override - public ConfigurationSnapshot<PortDTO> createOutputPort(final Revision revision, final String groupId, final PortDTO outputPortDTO) { - return createComponent(revision, outputPortDTO, () -> outputPortDAO.createPort(groupId, outputPortDTO), port -> dtoFactory.createPortDto(port)); + public PortEntity createOutputPort(final Revision revision, final String groupId, final PortDTO outputPortDTO) { + final ConfigurationSnapshot<PortDTO> snapshot = createComponent( + revision, + outputPortDTO, + () -> outputPortDAO.createPort(groupId, outputPortDTO), + port -> dtoFactory.createPortDto(port)); + + final Port port = outputPortDAO.getPort(outputPortDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); + return entityFactory.createPortEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override - public ConfigurationSnapshot<ProcessGroupDTO> createProcessGroup(final String parentGroupId, final Revision revision, final ProcessGroupDTO processGroupDTO) { - return createComponent(revision, processGroupDTO, + public ProcessGroupEntity createProcessGroup(final String parentGroupId, final Revision revision, final ProcessGroupDTO processGroupDTO) { + final ConfigurationSnapshot<ProcessGroupDTO> snapshot = createComponent(revision, processGroupDTO, () -> processGroupDAO.createProcessGroup(parentGroupId, processGroupDTO), processGroup -> dtoFactory.createProcessGroupDto(processGroup)); + + final ProcessGroup processGroup = processGroupDAO.getProcessGroup(processGroupDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroup); + return entityFactory.createProcessGroupEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override - public ConfigurationSnapshot<RemoteProcessGroupDTO> createRemoteProcessGroup(final Revision revision, final String groupId, final RemoteProcessGroupDTO remoteProcessGroupDTO) { - return createComponent(revision, remoteProcessGroupDTO, + public RemoteProcessGroupEntity createRemoteProcessGroup(final Revision revision, final String groupId, final RemoteProcessGroupDTO remoteProcessGroupDTO) { + final ConfigurationSnapshot<RemoteProcessGroupDTO> snapshot = createComponent( + revision, + remoteProcessGroupDTO, () -> remoteProcessGroupDAO.createRemoteProcessGroup(groupId, remoteProcessGroupDTO), remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); + + final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId()); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroup); + return entityFactory.createRemoteProcessGroupEntity(snapshot.getConfiguration(), dtoFactory.createRevisionDTO(snapshot.getVersion(), revision.getClientId()), accessPolicy); } @Override @@ -993,29 +1210,30 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<FlowSnippetDTO> createTemplateInstance(final Revision revision, final String groupId, final Double originX, final Double originY, final String templateId) { - return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowSnippetDTO>() { + public ConfigurationSnapshot<FlowDTO> createTemplateInstance(final Revision revision, final String groupId, final Double originX, final Double originY, final String templateId) { + return optimisticLockingManager.configureFlow(revision, new ConfigurationRequest<FlowDTO>() { @Override - public ConfigurationResult<FlowSnippetDTO> execute() { + public ConfigurationResult<FlowDTO> execute() { // instantiate the template - there is no need to make another copy of the flow snippet since the actual template // was copied and this dto is only used to instantiate it's components (which as already completed) - final FlowSnippetDTO flowSnippet = templateDAO.instantiateTemplate(groupId, originX, originY, templateId); + final FlowSnippetDTO snippet = templateDAO.instantiateTemplate(groupId, originX, originY, templateId); // validate the new snippet - validateSnippetContents(flowSnippet); + validateSnippetContents(snippet); // save the flow controllerFacade.save(); - return new ConfigurationResult<FlowSnippetDTO>() { + return new ConfigurationResult<FlowDTO>() { @Override public boolean isNew() { return false; } @Override - public FlowSnippetDTO getConfiguration() { - return flowSnippet; + public FlowDTO getConfiguration() { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + return dtoFactory.createFlowDto(group, snippet); } }; } @@ -1367,30 +1585,39 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public Set<ConnectionDTO> getConnections(String groupId) { - Set<ConnectionDTO> connectionDtos = new LinkedHashSet<>(); + public Set<ConnectionEntity> getConnections(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + Set<ConnectionEntity> connections = new LinkedHashSet<>(); for (Connection connection : connectionDAO.getConnections(groupId)) { - connectionDtos.add(dtoFactory.createConnectionDto(connection)); + connections.add(entityFactory.createConnectionEntity(dtoFactory.createConnectionDto(connection), null, dtoFactory.createAccessPolicyDto(connection))); } - return connectionDtos; + return connections; } @Override - public ConnectionDTO getConnection(String connectionId) { - return dtoFactory.createConnectionDto(connectionDAO.getConnection(connectionId)); + public ConnectionEntity getConnection(String connectionId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.READ); + return entityFactory.createConnectionEntity(dtoFactory.createConnectionDto(connectionDAO.getConnection(connectionId)), null, dtoFactory.createAccessPolicyDto(connection)); } @Override public DropRequestDTO getFlowFileDropRequest(String connectionId, String dropRequestId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); return dtoFactory.createDropRequestDTO(connectionDAO.getFlowFileDropRequest(connectionId, dropRequestId)); } @Override public ListingRequestDTO getFlowFileListingRequest(String connectionId, String listingRequestId) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); + final ListingRequestDTO listRequest = dtoFactory.createListingRequestDTO(connectionDAO.getFlowFileListingRequest(connectionId, listingRequestId)); // include whether the source and destination are running - final Connection connection = connectionDAO.getConnection(connectionId); if (connection.getSource() != null) { listRequest.setSourceRunning(connection.getSource().isRunning()); } @@ -1403,6 +1630,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public FlowFileDTO getFlowFile(String connectionId, String flowFileUuid) { + final Connection connection = connectionDAO.getConnection(connectionId); + connection.authorize(authorizer, RequestAction.WRITE); return dtoFactory.createFlowFileDTO(connectionDAO.getFlowFile(connectionId, flowFileUuid)); } @@ -1417,12 +1646,15 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public Set<ProcessorDTO> getProcessors(String groupId) { - Set<ProcessorDTO> processorDtos = new LinkedHashSet<>(); + public Set<ProcessorEntity> getProcessors(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + Set<ProcessorEntity> processors = new LinkedHashSet<>(); for (ProcessorNode processor : processorDAO.getProcessors(groupId)) { - processorDtos.add(dtoFactory.createProcessorDto(processor)); + processors.add(entityFactory.createProcessorEntity(dtoFactory.createProcessorDto(processor), null, dtoFactory.createAccessPolicyDto(processor))); } - return processorDtos; + return processors; } @Override @@ -1470,10 +1702,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ProcessorDTO getProcessor(String id) { + public ProcessorEntity getProcessor(String id) { final ProcessorNode processor = processorDAO.getProcessor(id); - final ProcessorDTO processorDto = dtoFactory.createProcessorDto(processor); - return processorDto; + processor.authorize(authorizer, RequestAction.READ); + return entityFactory.createProcessorEntity(dtoFactory.createProcessorDto(processor), null, dtoFactory.createAccessPolicyDto(processor)); } @Override @@ -1662,80 +1894,103 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public Set<LabelDTO> getLabels(String groupId) { - Set<LabelDTO> labelDtos = new LinkedHashSet<>(); + public Set<LabelEntity> getLabels(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + Set<LabelEntity> labels = new LinkedHashSet<>(); for (Label label : labelDAO.getLabels(groupId)) { - labelDtos.add(dtoFactory.createLabelDto(label)); + labels.add(entityFactory.createLabelEntity(dtoFactory.createLabelDto(label), null, dtoFactory.createAccessPolicyDto(label))); } - return labelDtos; + return labels; } @Override - public LabelDTO getLabel(String labelId) { - return dtoFactory.createLabelDto(labelDAO.getLabel(labelId)); + public LabelEntity getLabel(String labelId) { + final Label label = labelDAO.getLabel(labelId); + label.authorize(authorizer, RequestAction.READ); + return entityFactory.createLabelEntity(dtoFactory.createLabelDto(label), null, dtoFactory.createAccessPolicyDto(label)); } @Override - public Set<FunnelDTO> getFunnels(String groupId) { - Set<FunnelDTO> funnelDtos = new LinkedHashSet<>(); + public Set<FunnelEntity> getFunnels(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + final Set<FunnelEntity> funnelDtos = new LinkedHashSet<>(); for (Funnel funnel : funnelDAO.getFunnels(groupId)) { - funnelDtos.add(dtoFactory.createFunnelDto(funnel)); + funnelDtos.add(entityFactory.createFunnelEntity(dtoFactory.createFunnelDto(funnel), null, dtoFactory.createAccessPolicyDto(funnel))); } return funnelDtos; } @Override - public FunnelDTO getFunnel(String funnelId) { - return dtoFactory.createFunnelDto(funnelDAO.getFunnel(funnelId)); + public FunnelEntity getFunnel(String funnelId) { + final Funnel funnel = funnelDAO.getFunnel(funnelId); + funnel.authorize(authorizer, RequestAction.READ); + return entityFactory.createFunnelEntity(dtoFactory.createFunnelDto(funnel), null, dtoFactory.createAccessPolicyDto(funnel)); } @Override public SnippetDTO getSnippet(String snippetId) { final Snippet snippet = snippetDAO.getSnippet(snippetId); final SnippetDTO snippetDTO = dtoFactory.createSnippetDto(snippet); - snippetDTO.setContents(snippetUtils.populateFlowSnippet(snippet, false, false)); return snippetDTO; } @Override - public Set<PortDTO> getInputPorts(String groupId) { - Set<PortDTO> portDtos = new LinkedHashSet<>(); + public Set<PortEntity> getInputPorts(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + final Set<PortEntity> ports = new LinkedHashSet<>(); for (Port port : inputPortDAO.getPorts(groupId)) { - portDtos.add(dtoFactory.createPortDto(port)); + ports.add(entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port))); } - return portDtos; + return ports; } @Override - public Set<PortDTO> getOutputPorts(String groupId) { - Set<PortDTO> portDtos = new LinkedHashSet<>(); + public Set<PortEntity> getOutputPorts(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + Set<PortEntity> ports = new LinkedHashSet<>(); for (Port port : outputPortDAO.getPorts(groupId)) { - portDtos.add(dtoFactory.createPortDto(port)); + ports.add(entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port))); } - return portDtos; + return ports; } @Override - public Set<ProcessGroupDTO> getProcessGroups(String parentGroupId) { - Set<ProcessGroupDTO> processGroupDtos = new LinkedHashSet<>(); - for (ProcessGroup groups : processGroupDAO.getProcessGroups(parentGroupId)) { - processGroupDtos.add(dtoFactory.createProcessGroupDto(groups)); + public Set<ProcessGroupEntity> getProcessGroups(String parentGroupId) { + final ProcessGroup parentGroup = processGroupDAO.getProcessGroup(parentGroupId); + parentGroup.authorize(authorizer, RequestAction.READ); + + Set<ProcessGroupEntity> processGroups = new LinkedHashSet<>(); + for (ProcessGroup group : processGroupDAO.getProcessGroups(parentGroupId)) { + processGroups.add(entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(group), null, dtoFactory.createAccessPolicyDto(group))); } - return processGroupDtos; + return processGroups; } @Override - public Set<RemoteProcessGroupDTO> getRemoteProcessGroups(String groupId) { - Set<RemoteProcessGroupDTO> remoteProcessGroupDtos = new LinkedHashSet<>(); - for (RemoteProcessGroup remoteProcessGroup : remoteProcessGroupDAO.getRemoteProcessGroups(groupId)) { - remoteProcessGroupDtos.add(dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); + public Set<RemoteProcessGroupEntity> getRemoteProcessGroups(String groupId) { + final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); + group.authorize(authorizer, RequestAction.READ); + + Set<RemoteProcessGroupEntity> remoteProcessGroups = new LinkedHashSet<>(); + for (RemoteProcessGroup rpg : remoteProcessGroupDAO.getRemoteProcessGroups(groupId)) { + remoteProcessGroups.add(entityFactory.createRemoteProcessGroupEntity(dtoFactory.createRemoteProcessGroupDto(rpg), null, dtoFactory.createAccessPolicyDto(rpg))); } - return remoteProcessGroupDtos; + return remoteProcessGroups; } @Override - public PortDTO getInputPort(String inputPortId) { - return dtoFactory.createPortDto(inputPortDAO.getPort(inputPortId)); + public PortEntity getInputPort(String inputPortId) { + final Port port = inputPortDAO.getPort(inputPortId); + port.authorize(authorizer, RequestAction.READ); + return entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port)); } @Override @@ -1744,8 +1999,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public PortDTO getOutputPort(String outputPortId) { - return dtoFactory.createPortDto(outputPortDAO.getPort(outputPortId)); + public PortEntity getOutputPort(String outputPortId) { + final Port port = outputPortDAO.getPort(outputPortId); + port.authorize(authorizer, RequestAction.READ); + return entityFactory.createPortEntity(dtoFactory.createPortDto(port), null, dtoFactory.createAccessPolicyDto(port)); } @Override @@ -1754,8 +2011,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public RemoteProcessGroupDTO getRemoteProcessGroup(String remoteProcessGroupId) { - return dtoFactory.createRemoteProcessGroupDto(remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId)); + public RemoteProcessGroupEntity getRemoteProcessGroup(String remoteProcessGroupId) { + final RemoteProcessGroup rpg = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId); + rpg.authorize(authorizer, RequestAction.READ); + return entityFactory.createRemoteProcessGroupEntity(dtoFactory.createRemoteProcessGroupDto(rpg), null, dtoFactory.createAccessPolicyDto(rpg)); } @Override @@ -1769,14 +2028,21 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } @Override - public ConfigurationSnapshot<ProcessGroupDTO> getProcessGroup(String groupId, final boolean recurse) { + public ConfigurationSnapshot<ProcessGroupFlowDTO> getProcessGroupFlow(String groupId, boolean recurse) { ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); Revision revision = optimisticLockingManager.getLastModification().getRevision(); - ConfigurationSnapshot<ProcessGroupDTO> response = new ConfigurationSnapshot<>(revision.getVersion(), dtoFactory.createProcessGroupDto(processGroup, recurse)); + ConfigurationSnapshot<ProcessGroupFlowDTO> response = new ConfigurationSnapshot<>(revision.getVersion(), dtoFactory.createProcessGroupFlowDto(processGroup, recurse)); return response; } @Override + public ProcessGroupEntity getProcessGroup(String groupId) { + final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); + processGroup.authorize(authorizer, RequestAction.READ); + return entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(processGroup), null, dtoFactory.createAccessPolicyDto(processGroup)); + } + + @Override public Set<ControllerServiceDTO> getControllerServices() { final Set<ControllerServiceDTO> controllerServiceDtos = new LinkedHashSet<>(); for (ControllerServiceNode controllerService : controllerServiceDAO.getControllerServices()) { @@ -2014,6 +2280,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { this.dtoFactory = dtoFactory; } + public void setEntityFactory(EntityFactory entityFactory) { + this.entityFactory = entityFactory; + } + public void setInputPortDAO(PortDAO inputPortDAO) { this.inputPortDAO = inputPortDAO; } @@ -2042,6 +2312,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { this.snippetUtils = snippetUtils; } + public void setAuthorizer(Authorizer authorizer) { + this.authorizer = authorizer; + } + private boolean isPrimaryNode(String nodeId) { final Node primaryNode = clusterManager.getPrimaryNode(); return (primaryNode != null && primaryNode.getNodeId().getId().equals(nodeId));
