Repository: nifi Updated Branches: refs/heads/master b075f238a -> 893daf567
http://git-wip-us.apache.org/repos/asf/nifi/blob/893daf56/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml index a6c17b1..6142066 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/pom.xml @@ -350,5 +350,15 @@ <version>1.0.1.RELEASE</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>org.spockframework</groupId> + <artifactId>spock-core</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>cglib</groupId> + <artifactId>cglib-nodep</artifactId> + <scope>test</scope> + </dependency> </dependencies> </project> http://git-wip-us.apache.org/repos/asf/nifi/blob/893daf56/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 d4f235a..5be9d3c 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 @@ -592,10 +592,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Connection connectionNode = connectionDAO.getConnection(connectionDTO.getId()); final RevisionUpdate<ConnectionDTO> snapshot = updateComponent( - revision, - connectionNode, - () -> connectionDAO.updateConnection(connectionDTO), - connection -> dtoFactory.createConnectionDto(connection)); + revision, + connectionNode, + () -> connectionDAO.updateConnection(connectionDTO), + connection -> dtoFactory.createConnectionDto(connection)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connectionNode); final ConnectionStatusDTO status = dtoFactory.createConnectionStatusDto(controllerFacade.getConnectionStatus(connectionNode.getIdentifier())); @@ -612,9 +612,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // get the component, ensure we have access to it, and perform the update request final ProcessorNode processorNode = processorDAO.getProcessor(processorDTO.getId()); final RevisionUpdate<ProcessorDTO> snapshot = updateComponent(revision, - processorNode, - () -> processorDAO.updateProcessor(processorDTO), - proc -> dtoFactory.createProcessorDto(proc)); + processorNode, + () -> processorDAO.updateProcessor(processorDTO), + proc -> dtoFactory.createProcessorDto(proc)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processorNode); final ProcessorStatusDTO status = dtoFactory.createProcessorStatusDto(controllerFacade.getProcessorStatus(processorNode.getIdentifier())); @@ -630,9 +630,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Label labelNode = labelDAO.getLabel(labelDTO.getId()); final RevisionUpdate<LabelDTO> snapshot = updateComponent(revision, - labelNode, - () -> labelDAO.updateLabel(labelDTO), - label -> dtoFactory.createLabelDto(label)); + labelNode, + () -> labelDAO.updateLabel(labelDTO), + label -> dtoFactory.createLabelDto(label)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(labelNode); return new UpdateResult<>(entityFactory.createLabelEntity(snapshot.getComponent(), dtoFactory.createRevisionDTO(snapshot.getLastModification()), accessPolicy), false); @@ -647,9 +647,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Funnel funnelNode = funnelDAO.getFunnel(funnelDTO.getId()); final RevisionUpdate<FunnelDTO> snapshot = updateComponent(revision, - funnelNode, - () -> funnelDAO.updateFunnel(funnelDTO), - funnel -> dtoFactory.createFunnelDto(funnel)); + funnelNode, + () -> funnelDAO.updateFunnel(funnelDTO), + funnel -> dtoFactory.createFunnelDto(funnel)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnelNode); return new UpdateResult<>(entityFactory.createFunnelEntity(snapshot.getComponent(), dtoFactory.createRevisionDTO(snapshot.getLastModification()), accessPolicy), false); @@ -660,13 +660,11 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { * Updates a component with the given revision, using the provided supplier to call * into the appropriate DAO and the provided function to convert the component into a DTO. * - * @param revision the current revision - * @param daoUpdate a Supplier that will update the component via the appropriate DAO + * @param revision the current revision + * @param daoUpdate a Supplier that will update the component via the appropriate DAO * @param dtoCreation a Function to convert a component into a dao - * - * @param <D> the DTO Type of the updated component - * @param <C> the Component Type of the updated component - * + * @param <D> the DTO Type of the updated component + * @param <C> the Component Type of the updated component * @return A RevisionUpdate that represents the new configuration */ private <D, C> RevisionUpdate<D> updateComponent(final Revision revision, final Authorizable authorizable, final Supplier<C> daoUpdate, final Function<C, D> dtoCreation) { @@ -753,9 +751,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Port inputPortNode = inputPortDAO.getPort(inputPortDTO.getId()); final RevisionUpdate<PortDTO> snapshot = updateComponent(revision, - inputPortNode, - () -> inputPortDAO.updatePort(inputPortDTO), - port -> dtoFactory.createPortDto(port)); + inputPortNode, + () -> inputPortDAO.updatePort(inputPortDTO), + port -> dtoFactory.createPortDto(port)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(inputPortNode); final PortStatusDTO status = dtoFactory.createPortStatusDto(controllerFacade.getInputPortStatus(inputPortNode.getIdentifier())); @@ -771,9 +769,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Port outputPortNode = outputPortDAO.getPort(outputPortDTO.getId()); final RevisionUpdate<PortDTO> snapshot = updateComponent(revision, - outputPortNode, - () -> outputPortDAO.updatePort(outputPortDTO), - port -> dtoFactory.createPortDto(port)); + outputPortNode, + () -> outputPortDAO.updatePort(outputPortDTO), + port -> dtoFactory.createPortDto(port)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(outputPortNode); final PortStatusDTO status = dtoFactory.createPortStatusDto(controllerFacade.getOutputPortStatus(outputPortNode.getIdentifier())); @@ -789,10 +787,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId()); final RevisionUpdate<RemoteProcessGroupDTO> snapshot = updateComponent( - revision, - remoteProcessGroupNode, - () -> remoteProcessGroupDAO.updateRemoteProcessGroup(remoteProcessGroupDTO), - remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); + revision, + remoteProcessGroupNode, + () -> remoteProcessGroupDAO.updateRemoteProcessGroup(remoteProcessGroupDTO), + remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroupNode); final RevisionDTO updateRevision = dtoFactory.createRevisionDTO(snapshot.getLastModification()); @@ -806,10 +804,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupPortDTO.getGroupId()); final RevisionUpdate<RemoteProcessGroupPortDTO> snapshot = updateComponent( - revision, - remoteProcessGroupNode, - () -> remoteProcessGroupDAO.updateRemoteProcessGroupInputPort(remoteProcessGroupId, remoteProcessGroupPortDTO), - remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort)); + revision, + remoteProcessGroupNode, + () -> remoteProcessGroupDAO.updateRemoteProcessGroupInputPort(remoteProcessGroupId, remoteProcessGroupPortDTO), + remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroupNode); final RevisionDTO updatedRevision = dtoFactory.createRevisionDTO(snapshot.getLastModification()); @@ -822,10 +820,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final RemoteProcessGroup remoteProcessGroupNode = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupPortDTO.getGroupId()); final RevisionUpdate<RemoteProcessGroupPortDTO> snapshot = updateComponent( - revision, - remoteProcessGroupNode, - () -> remoteProcessGroupDAO.updateRemoteProcessGroupOutputPort(remoteProcessGroupId, remoteProcessGroupPortDTO), - remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort)); + revision, + remoteProcessGroupNode, + () -> remoteProcessGroupDAO.updateRemoteProcessGroupOutputPort(remoteProcessGroupId, remoteProcessGroupPortDTO), + remoteGroupPort -> dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroupNode); final RevisionDTO updatedRevision = dtoFactory.createRevisionDTO(snapshot.getLastModification()); @@ -845,9 +843,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final ProcessGroup processGroupNode = processGroupDAO.getProcessGroup(processGroupDTO.getId()); final RevisionUpdate<ProcessGroupDTO> snapshot = updateComponent(revision, - processGroupNode, - () -> processGroupDAO.updateProcessGroup(processGroupDTO), - processGroup -> dtoFactory.createProcessGroupDto(processGroup)); + processGroupNode, + () -> processGroupDAO.updateProcessGroup(processGroupDTO), + processGroup -> dtoFactory.createProcessGroupDto(processGroup)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroupNode); final RevisionDTO updatedRevision = dtoFactory.createRevisionDTO(snapshot.getLastModification()); @@ -859,27 +857,27 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ScheduleComponentsEntity scheduleComponents(final String processGroupId, final ScheduledState state, final Map<String, Revision> componentRevisions) { final NiFiUser user = NiFiUserUtils.getNiFiUser(); final RevisionUpdate<ScheduleComponentsEntity> updatedComponent = revisionManager.updateRevision(new StandardRevisionClaim(componentRevisions.values()), user, new - UpdateRevisionTask<ScheduleComponentsEntity>() { - @Override - public RevisionUpdate<ScheduleComponentsEntity> update() { - // schedule the components - processGroupDAO.scheduleComponents(processGroupId, state, componentRevisions.keySet()); - - // update the revisions - final Map<String, Revision> updatedRevisions = new HashMap<>(); - for (final Revision revision : componentRevisions.values()) { - final Revision currentRevision = revisionManager.getRevision(revision.getComponentId()); - final Revision updatedRevision = incrementRevision(currentRevision); - updatedRevisions.put(revision.getComponentId(), updatedRevision); - } + UpdateRevisionTask<ScheduleComponentsEntity>() { + @Override + public RevisionUpdate<ScheduleComponentsEntity> update() { + // schedule the components + processGroupDAO.scheduleComponents(processGroupId, state, componentRevisions.keySet()); + + // update the revisions + final Map<String, Revision> updatedRevisions = new HashMap<>(); + for (final Revision revision : componentRevisions.values()) { + final Revision currentRevision = revisionManager.getRevision(revision.getComponentId()); + final Revision updatedRevision = incrementRevision(currentRevision); + updatedRevisions.put(revision.getComponentId(), updatedRevision); + } - // gather details for response - final ScheduleComponentsEntity entity = new ScheduleComponentsEntity(); - entity.setId(processGroupId); - entity.setState(state.name()); - return new StandardRevisionUpdate<>(entity, null, new HashSet<>(updatedRevisions.values())); - } - }); + // gather details for response + final ScheduleComponentsEntity entity = new ScheduleComponentsEntity(); + entity.setId(processGroupId); + entity.setState(state.name()); + return new StandardRevisionUpdate<>(entity, null, new HashSet<>(updatedRevisions.values())); + } + }); return updatedComponent.getComponent(); } @@ -995,10 +993,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ConnectionEntity deleteConnection(final Revision revision, final String connectionId) { final Connection connection = connectionDAO.getConnection(connectionId); final ConnectionDTO snapshot = deleteComponent( - revision, - connection, - () -> connectionDAO.deleteConnection(connectionId), - dtoFactory.createConnectionDto(connection)); + revision, + connection, + () -> connectionDAO.deleteConnection(connectionId), + dtoFactory.createConnectionDto(connection)); return entityFactory.createConnectionEntity(snapshot, null, null, null); } @@ -1033,10 +1031,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ProcessorEntity deleteProcessor(final Revision revision, final String processorId) { final ProcessorNode processor = processorDAO.getProcessor(processorId); final ProcessorDTO snapshot = deleteComponent( - revision, - processor, - () -> processorDAO.deleteProcessor(processorId), - dtoFactory.createProcessorDto(processor)); + revision, + processor, + () -> processorDAO.deleteProcessor(processorId), + dtoFactory.createProcessorDto(processor)); return entityFactory.createProcessorEntity(snapshot, null, null, null); } @@ -1045,10 +1043,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public LabelEntity deleteLabel(final Revision revision, final String labelId) { final Label label = labelDAO.getLabel(labelId); final LabelDTO snapshot = deleteComponent( - revision, - label, - () -> labelDAO.deleteLabel(labelId), - dtoFactory.createLabelDto(label)); + revision, + label, + () -> labelDAO.deleteLabel(labelId), + dtoFactory.createLabelDto(label)); return entityFactory.createLabelEntity(snapshot, null, null); } @@ -1057,10 +1055,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public FunnelEntity deleteFunnel(final Revision revision, final String funnelId) { final Funnel funnel = funnelDAO.getFunnel(funnelId); final FunnelDTO snapshot = deleteComponent( - revision, - funnel, - () -> funnelDAO.deleteFunnel(funnelId), - dtoFactory.createFunnelDto(funnel)); + revision, + funnel, + () -> funnelDAO.deleteFunnel(funnelId), + dtoFactory.createFunnelDto(funnel)); return entityFactory.createFunnelEntity(snapshot, null, null); } @@ -1068,7 +1066,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { /** * Deletes a component using the Optimistic Locking Manager * - * @param revision the current revision + * @param revision the current revision * @param deleteAction the action that deletes the component via the appropriate DAO object * @return a dto that represents the new configuration */ @@ -1132,10 +1130,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public PortEntity deleteInputPort(final Revision revision, final String inputPortId) { final Port port = inputPortDAO.getPort(inputPortId); final PortDTO snapshot = deleteComponent( - revision, - port, - () -> inputPortDAO.deletePort(inputPortId), - dtoFactory.createPortDto(port)); + revision, + port, + () -> inputPortDAO.deletePort(inputPortId), + dtoFactory.createPortDto(port)); return entityFactory.createPortEntity(snapshot, null, null, null); } @@ -1144,10 +1142,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public PortEntity deleteOutputPort(final Revision revision, final String outputPortId) { final Port port = outputPortDAO.getPort(outputPortId); final PortDTO snapshot = deleteComponent( - revision, - port, - () -> outputPortDAO.deletePort(outputPortId), - dtoFactory.createPortDto(port)); + revision, + port, + () -> outputPortDAO.deletePort(outputPortId), + dtoFactory.createPortDto(port)); return entityFactory.createPortEntity(snapshot, null, null, null); } @@ -1156,10 +1154,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ProcessGroupEntity deleteProcessGroup(final Revision revision, final String groupId) { final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); final ProcessGroupDTO snapshot = deleteComponent( - revision, - processGroup, - () -> processGroupDAO.deleteProcessGroup(groupId), - dtoFactory.createProcessGroupDto(processGroup)); + revision, + processGroup, + () -> processGroupDAO.deleteProcessGroup(groupId), + dtoFactory.createProcessGroupDto(processGroup)); return entityFactory.createProcessGroupEntity(snapshot, null, null, null); } @@ -1168,10 +1166,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public RemoteProcessGroupEntity deleteRemoteProcessGroup(final Revision revision, final String remoteProcessGroupId) { final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupId); final RemoteProcessGroupDTO snapshot = deleteComponent( - revision, - remoteProcessGroup, - () -> remoteProcessGroupDAO.deleteRemoteProcessGroup(remoteProcessGroupId), - dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); + revision, + remoteProcessGroup, + () -> remoteProcessGroupDAO.deleteRemoteProcessGroup(remoteProcessGroupId), + dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); return entityFactory.createRemoteProcessGroupEntity(snapshot, null, null, null); } @@ -1185,9 +1183,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public ConnectionEntity createConnection(final String groupId, final ConnectionDTO connectionDTO) { final RevisionUpdate<ConnectionDTO> snapshot = createComponent( - connectionDTO, - () -> connectionDAO.createConnection(groupId, connectionDTO), - connection -> dtoFactory.createConnectionDto(connection)); + connectionDTO, + () -> connectionDAO.createConnection(groupId, connectionDTO), + connection -> dtoFactory.createConnectionDto(connection)); final Connection connection = connectionDAO.getConnection(connectionDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection); @@ -1224,9 +1222,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public ProcessorEntity createProcessor(final String groupId, final ProcessorDTO processorDTO) { final RevisionUpdate<ProcessorDTO> snapshot = createComponent( - processorDTO, - () -> processorDAO.createProcessor(groupId, processorDTO), - processor -> dtoFactory.createProcessorDto(processor)); + processorDTO, + () -> processorDAO.createProcessor(groupId, processorDTO), + processor -> dtoFactory.createProcessorDto(processor)); final ProcessorNode processor = processorDAO.getProcessor(processorDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processor); @@ -1237,9 +1235,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public LabelEntity createLabel(final String groupId, final LabelDTO labelDTO) { final RevisionUpdate<LabelDTO> snapshot = createComponent( - labelDTO, - () -> labelDAO.createLabel(groupId, labelDTO), - label -> dtoFactory.createLabelDto(label)); + labelDTO, + () -> labelDAO.createLabel(groupId, labelDTO), + label -> dtoFactory.createLabelDto(label)); final Label label = labelDAO.getLabel(labelDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(label); @@ -1250,12 +1248,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { * Creates a component using the optimistic locking manager. * * @param componentDto the DTO that will be used to create the component - * @param daoCreation A Supplier that will create the NiFi Component to use - * @param dtoCreation a Function that will convert the NiFi Component into a corresponding DTO - * - * @param <D> the DTO Type - * @param <C> the NiFi Component Type - * + * @param daoCreation A Supplier that will create the NiFi Component to use + * @param dtoCreation a Function that will convert the NiFi Component into a corresponding DTO + * @param <D> the DTO Type + * @param <C> the NiFi Component Type * @return a RevisionUpdate that represents the updated configuration */ private <D, C> RevisionUpdate<D> createComponent(final ComponentDTO componentDto, final Supplier<C> daoCreation, final Function<C, D> dtoCreation) { @@ -1281,13 +1277,12 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { } - @Override public FunnelEntity createFunnel(final String groupId, final FunnelDTO funnelDTO) { final RevisionUpdate<FunnelDTO> snapshot = createComponent( - funnelDTO, - () -> funnelDAO.createFunnel(groupId, funnelDTO), - funnel -> dtoFactory.createFunnelDto(funnel)); + funnelDTO, + () -> funnelDAO.createFunnel(groupId, funnelDTO), + funnel -> dtoFactory.createFunnelDto(funnel)); final Funnel funnel = funnelDAO.getFunnel(funnelDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnel); @@ -1342,7 +1337,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { if (flow.getRemoteProcessGroups() != null) { for (final RemoteProcessGroupDTO remoteProcessGroupDTO : flow.getRemoteProcessGroups()) { final RemoteProcessGroup remoteProcessGroup = revisionManager.get( - remoteProcessGroupDTO.getId(), rev -> remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId())); + remoteProcessGroupDTO.getId(), rev -> remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId())); if (remoteProcessGroup.getAuthorizationIssue() != null) { remoteProcessGroupDTO.setAuthorizationIssues(Arrays.asList(remoteProcessGroup.getAuthorizationIssue())); @@ -1354,55 +1349,19 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public FlowEntity copySnippet(final String groupId, final String snippetId, final Double originX, final Double originY, final String idGenerationSeed) { final FlowDTO flowDto = revisionManager.get(groupId, - rev -> { - // create the new snippet - final FlowSnippetDTO snippet = snippetDAO.copySnippet(groupId, snippetId, originX, originY, idGenerationSeed); - - // validate the new snippet - validateSnippetContents(snippet); + rev -> { + // create the new snippet + final FlowSnippetDTO snippet = snippetDAO.copySnippet(groupId, snippetId, originX, originY, idGenerationSeed); - // save the flow - controllerFacade.save(); + // save the flow + controllerFacade.save(); - // drop the snippet - snippetDAO.dropSnippet(snippetId); + // drop the snippet + snippetDAO.dropSnippet(snippetId); - // identify all components added - final Set<String> identifiers = new HashSet<>(); - snippet.getProcessors().stream() - .map(proc -> proc.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getConnections().stream() - .map(conn -> conn.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getInputPorts().stream() - .map(port -> port.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getOutputPorts().stream() - .map(port -> port.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getProcessGroups().stream() - .map(group -> group.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getRemoteProcessGroups().stream() - .map(remoteGroup -> remoteGroup.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getRemoteProcessGroups().stream() - .flatMap(remoteGroup -> remoteGroup.getContents().getInputPorts().stream()) - .map(remoteInputPort -> remoteInputPort.getId()) - .forEach(id -> identifiers.add(id)); - snippet.getRemoteProcessGroups().stream() - .flatMap(remoteGroup -> remoteGroup.getContents().getOutputPorts().stream()) - .map(remoteOutputPort -> remoteOutputPort.getId()) - .forEach(id -> identifiers.add(id)); - - final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); - return revisionManager.get(identifiers, - () -> { - final ProcessGroupStatus groupStatus = controllerFacade.getProcessGroupStatus(groupId); - return dtoFactory.createFlowDto(processGroup, groupStatus, snippet, revisionManager); - }); - }); + // post process new flow snippet + return postProcessNewFlowSnippet(groupId, snippet); + }); final FlowEntity flowEntity = new FlowEntity(); flowEntity.setFlow(flowDto); @@ -1433,9 +1392,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public PortEntity createInputPort(final String groupId, final PortDTO inputPortDTO) { final RevisionUpdate<PortDTO> snapshot = createComponent( - inputPortDTO, - () -> inputPortDAO.createPort(groupId, inputPortDTO), - port -> dtoFactory.createPortDto(port)); + inputPortDTO, + () -> inputPortDAO.createPort(groupId, inputPortDTO), + port -> dtoFactory.createPortDto(port)); final Port port = inputPortDAO.getPort(inputPortDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); @@ -1446,9 +1405,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public PortEntity createOutputPort(final String groupId, final PortDTO outputPortDTO) { final RevisionUpdate<PortDTO> snapshot = createComponent( - outputPortDTO, - () -> outputPortDAO.createPort(groupId, outputPortDTO), - port -> dtoFactory.createPortDto(port)); + outputPortDTO, + () -> outputPortDAO.createPort(groupId, outputPortDTO), + port -> dtoFactory.createPortDto(port)); final Port port = outputPortDAO.getPort(outputPortDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); @@ -1459,9 +1418,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public ProcessGroupEntity createProcessGroup(final String parentGroupId, final ProcessGroupDTO processGroupDTO) { final RevisionUpdate<ProcessGroupDTO> snapshot = createComponent( - processGroupDTO, - () -> processGroupDAO.createProcessGroup(parentGroupId, processGroupDTO), - processGroup -> dtoFactory.createProcessGroupDto(processGroup)); + processGroupDTO, + () -> processGroupDAO.createProcessGroup(parentGroupId, processGroupDTO), + processGroup -> dtoFactory.createProcessGroupDto(processGroup)); final ProcessGroup processGroup = processGroupDAO.getProcessGroup(processGroupDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroup); @@ -1472,9 +1431,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public RemoteProcessGroupEntity createRemoteProcessGroup(final String groupId, final RemoteProcessGroupDTO remoteProcessGroupDTO) { final RevisionUpdate<RemoteProcessGroupDTO> snapshot = createComponent( - remoteProcessGroupDTO, - () -> remoteProcessGroupDAO.createRemoteProcessGroup(groupId, remoteProcessGroupDTO), - remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); + remoteProcessGroupDTO, + () -> remoteProcessGroupDAO.createRemoteProcessGroup(groupId, remoteProcessGroupDTO), + remoteProcessGroup -> dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup)); final RemoteProcessGroup remoteProcessGroup = remoteProcessGroupDAO.getRemoteProcessGroup(remoteProcessGroupDTO.getId()); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(remoteProcessGroup); @@ -1493,6 +1452,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { templateDTO.setDescription(description); templateDTO.setTimestamp(new Date()); templateDTO.setSnippet(snippetUtils.populateFlowSnippet(snippet, true, true)); + templateDTO.setEncodingVersion(TemplateDTO.MAX_ENCODING_VERSION); // set the id based on the specified seed final String uuid = idGenerationSeed.isPresent() ? (UUID.nameUUIDFromBytes(idGenerationSeed.get().getBytes(StandardCharsets.UTF_8))).toString() : UUID.randomUUID().toString(); @@ -1523,54 +1483,71 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { return dtoFactory.createTemplateDTO(template); } - @Override - public FlowEntity createTemplateInstance(final String groupId, final Double originX, final Double originY, final String templateId, final String idGenerationSeed) { - final FlowDTO flowDto = revisionManager.get(groupId, rev -> { - // 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 snippet = templateDAO.instantiateTemplate(groupId, originX, originY, templateId, idGenerationSeed); - - // validate the new snippet - validateSnippetContents(snippet); - - // save the flow - controllerFacade.save(); + /** + * Post processes a new flow snippet including validation, removing the snippet, and DTO conversion. + * + * @param groupId group id + * @param snippet snippet + * @return flow dto + */ + private FlowDTO postProcessNewFlowSnippet(final String groupId, final FlowSnippetDTO snippet) { + // validate the new snippet + validateSnippetContents(snippet); - // identify all components added - final Set<String> identifiers = new HashSet<>(); - snippet.getProcessors().stream() + // identify all components added + final Set<String> identifiers = new HashSet<>(); + snippet.getProcessors().stream() .map(proc -> proc.getId()) .forEach(id -> identifiers.add(id)); - snippet.getConnections().stream() + snippet.getConnections().stream() .map(conn -> conn.getId()) .forEach(id -> identifiers.add(id)); - snippet.getInputPorts().stream() + snippet.getInputPorts().stream() .map(port -> port.getId()) .forEach(id -> identifiers.add(id)); - snippet.getOutputPorts().stream() + snippet.getOutputPorts().stream() .map(port -> port.getId()) .forEach(id -> identifiers.add(id)); - snippet.getProcessGroups().stream() + snippet.getProcessGroups().stream() .map(group -> group.getId()) .forEach(id -> identifiers.add(id)); - snippet.getRemoteProcessGroups().stream() + snippet.getRemoteProcessGroups().stream() .map(remoteGroup -> remoteGroup.getId()) .forEach(id -> identifiers.add(id)); - snippet.getRemoteProcessGroups().stream() + snippet.getRemoteProcessGroups().stream() + .filter(remoteGroup -> remoteGroup.getContents() != null && remoteGroup.getContents().getInputPorts() != null) .flatMap(remoteGroup -> remoteGroup.getContents().getInputPorts().stream()) .map(remoteInputPort -> remoteInputPort.getId()) .forEach(id -> identifiers.add(id)); - snippet.getRemoteProcessGroups().stream() + snippet.getRemoteProcessGroups().stream() + .filter(remoteGroup -> remoteGroup.getContents() != null && remoteGroup.getContents().getOutputPorts() != null) .flatMap(remoteGroup -> remoteGroup.getContents().getOutputPorts().stream()) .map(remoteOutputPort -> remoteOutputPort.getId()) .forEach(id -> identifiers.add(id)); + snippet.getLabels().stream() + .map(label -> label.getId()) + .forEach(id -> identifiers.add(id)); - return revisionManager.get(identifiers, + return revisionManager.get(identifiers, () -> { final ProcessGroup group = processGroupDAO.getProcessGroup(groupId); final ProcessGroupStatus groupStatus = controllerFacade.getProcessGroupStatus(groupId); return dtoFactory.createFlowDto(group, groupStatus, snippet, revisionManager); }); + } + + @Override + public FlowEntity createTemplateInstance(final String groupId, final Double originX, final Double originY, final String templateId, final String idGenerationSeed) { + final FlowDTO flowDto = revisionManager.get(groupId, rev -> { + // 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 snippet = templateDAO.instantiateTemplate(groupId, originX, originY, templateId, idGenerationSeed); + + // save the flow + controllerFacade.save(); + + // post process the new flow snippet + return postProcessNewFlowSnippet(groupId, snippet); }); final FlowEntity flowEntity = new FlowEntity(); @@ -1632,10 +1609,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { controllerServiceDTO.setParentGroupId(normalizedGroupId); final RevisionUpdate<ControllerServiceDTO> snapshot = createComponent( - controllerServiceDTO, - () -> { - // create the controller service - final ControllerServiceNode controllerService = controllerServiceDAO.createControllerService(controllerServiceDTO); + controllerServiceDTO, + () -> { + // create the controller service + final ControllerServiceNode controllerService = controllerServiceDAO.createControllerService(controllerServiceDTO); // TODO - this logic should be part of the controllerServiceDAO final ProcessGroup group = processGroupDAO.getProcessGroup(normalizedGroupId); @@ -1659,9 +1636,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // get the component, ensure we have access to it, and perform the update request final ControllerServiceNode controllerService = controllerServiceDAO.getControllerService(controllerServiceDTO.getId()); final RevisionUpdate<ControllerServiceDTO> snapshot = updateComponent(revision, - controllerService, - () -> controllerServiceDAO.updateControllerService(controllerServiceDTO), - cs -> dtoFactory.createControllerServiceDto(cs)); + controllerService, + () -> controllerServiceDAO.updateControllerService(controllerServiceDTO), + cs -> dtoFactory.createControllerServiceDto(cs)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(controllerService); return new UpdateResult<>(entityFactory.createControllerServiceEntity(snapshot.getComponent(), dtoFactory.createRevisionDTO(snapshot.getLastModification()), accessPolicy), false); @@ -1669,42 +1646,42 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public ControllerServiceReferencingComponentsEntity updateControllerServiceReferencingComponents( - final Map<String, Revision> referenceRevisions, final String controllerServiceId, final ScheduledState scheduledState, final ControllerServiceState controllerServiceState) { + final Map<String, Revision> referenceRevisions, final String controllerServiceId, final ScheduledState scheduledState, final ControllerServiceState controllerServiceState) { final RevisionClaim claim = new StandardRevisionClaim(referenceRevisions.values()); final NiFiUser user = NiFiUserUtils.getNiFiUser(); final RevisionUpdate<ControllerServiceReferencingComponentsEntity> update = revisionManager.updateRevision(claim, user, - new UpdateRevisionTask<ControllerServiceReferencingComponentsEntity>() { - @Override - public RevisionUpdate<ControllerServiceReferencingComponentsEntity> update() { - final ControllerServiceNode controllerService = controllerServiceDAO.getControllerService(controllerServiceId); - final ControllerServiceReference reference = controllerService.getReferences(); - for (final ConfiguredComponent component : reference.getReferencingComponents()) { - if (component instanceof Authorizable) { - // ensure we can write the referencing components - ((Authorizable) component).authorize(authorizer, RequestAction.WRITE); + new UpdateRevisionTask<ControllerServiceReferencingComponentsEntity>() { + @Override + public RevisionUpdate<ControllerServiceReferencingComponentsEntity> update() { + final ControllerServiceNode controllerService = controllerServiceDAO.getControllerService(controllerServiceId); + final ControllerServiceReference reference = controllerService.getReferences(); + for (final ConfiguredComponent component : reference.getReferencingComponents()) { + if (component instanceof Authorizable) { + // ensure we can write the referencing components + ((Authorizable) component).authorize(authorizer, RequestAction.WRITE); + } } - } - final Set<ConfiguredComponent> updated = controllerServiceDAO.updateControllerServiceReferencingComponents(controllerServiceId, scheduledState, controllerServiceState); - final ControllerServiceReference updatedReference = controllerServiceDAO.getControllerService(controllerServiceId).getReferences(); + final Set<ConfiguredComponent> updated = controllerServiceDAO.updateControllerServiceReferencingComponents(controllerServiceId, scheduledState, controllerServiceState); + final ControllerServiceReference updatedReference = controllerServiceDAO.getControllerService(controllerServiceId).getReferences(); - final Map<String, Revision> updatedRevisions = new HashMap<>(); - for (final Revision refRevision : referenceRevisions.values()) { - updatedRevisions.put(refRevision.getComponentId(), refRevision); - } + final Map<String, Revision> updatedRevisions = new HashMap<>(); + for (final Revision refRevision : referenceRevisions.values()) { + updatedRevisions.put(refRevision.getComponentId(), refRevision); + } - for (final ConfiguredComponent component : updated) { - final Revision currentRevision = revisionManager.getRevision(component.getIdentifier()); - final Revision updatedRevision = incrementRevision(currentRevision); - updatedRevisions.put(component.getIdentifier(), updatedRevision); - } + for (final ConfiguredComponent component : updated) { + final Revision currentRevision = revisionManager.getRevision(component.getIdentifier()); + final Revision updatedRevision = incrementRevision(currentRevision); + updatedRevisions.put(component.getIdentifier(), updatedRevision); + } - final ControllerServiceReferencingComponentsEntity entity = createControllerServiceReferencingComponentsEntity(updatedReference, updatedRevisions); - return new StandardRevisionUpdate<>(entity, null, new HashSet<>(updatedRevisions.values())); - } - }); + final ControllerServiceReferencingComponentsEntity entity = createControllerServiceReferencingComponentsEntity(updatedReference, updatedRevisions); + return new StandardRevisionUpdate<>(entity, null, new HashSet<>(updatedRevisions.values())); + } + }); return update.getComponent(); } @@ -1712,9 +1689,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { /** * Finds the identifiers for all components referencing a ControllerService. * - * @param reference ControllerServiceReference - * @param referencingIds Collection of identifiers - * @param visited ControllerServices we've already visited + * @param reference ControllerServiceReference + * @param referencingIds Collection of identifiers + * @param visited ControllerServices we've already visited */ private void findControllerServiceReferencingComponentIdentifiers(final ControllerServiceReference reference, final Set<String> referencingIds, final Set<ControllerServiceNode> visited) { for (final ConfiguredComponent component : reference.getReferencingComponents()) { @@ -1734,8 +1711,8 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { /** * Creates entities for components referencing a ControllerService using their current revision. * - * @param reference ControllerServiceReference - * @return The entity + * @param reference ControllerServiceReference + * @return The entity */ private ControllerServiceReferencingComponentsEntity createControllerServiceReferencingComponentsEntity(final ControllerServiceReference reference) { final Set<String> referencingIds = new HashSet<>(); @@ -1755,25 +1732,25 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { /** * Creates entities for components referencing a ControllerService using the specified revisions. * - * @param reference ControllerServiceReference - * @param revisions The revisions - * @return The entity + * @param reference ControllerServiceReference + * @param revisions The revisions + * @return The entity */ private ControllerServiceReferencingComponentsEntity createControllerServiceReferencingComponentsEntity( - final ControllerServiceReference reference, final Map<String, Revision> revisions) { + final ControllerServiceReference reference, final Map<String, Revision> revisions) { return createControllerServiceReferencingComponentsEntity(reference, revisions, new HashSet<>()); } /** * Creates entities for compnents referencing a ControllerServcie using the specified revisions. * - * @param reference ControllerServiceReference - * @param revisions The revisions - * @param visited Which services we've already considered (in case of cycle) - * @return The entity + * @param reference ControllerServiceReference + * @param revisions The revisions + * @param visited Which services we've already considered (in case of cycle) + * @return The entity */ private ControllerServiceReferencingComponentsEntity createControllerServiceReferencingComponentsEntity( - final ControllerServiceReference reference, final Map<String, Revision> revisions, final Set<ControllerServiceNode> visited) { + final ControllerServiceReference reference, final Map<String, Revision> revisions, final Set<ControllerServiceNode> visited) { final String modifier = NiFiUserUtils.getNiFiUserName(); final Set<ConfiguredComponent> referencingComponents = reference.getReferencingComponents(); @@ -1818,10 +1795,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ControllerServiceEntity deleteControllerService(final Revision revision, final String controllerServiceId) { final ControllerServiceNode controllerService = controllerServiceDAO.getControllerService(controllerServiceId); final ControllerServiceDTO snapshot = deleteComponent( - revision, - controllerService, - () -> controllerServiceDAO.deleteControllerService(controllerServiceId), - dtoFactory.createControllerServiceDto(controllerService)); + revision, + controllerService, + () -> controllerServiceDAO.deleteControllerService(controllerServiceId), + dtoFactory.createControllerServiceDto(controllerService)); return entityFactory.createControllerServiceEntity(snapshot, null, null); } @@ -1863,9 +1840,9 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // get the component, ensure we have access to it, and perform the update request final ReportingTaskNode reportingTask = reportingTaskDAO.getReportingTask(reportingTaskDTO.getId()); final RevisionUpdate<ReportingTaskDTO> snapshot = updateComponent(revision, - reportingTask, - () -> reportingTaskDAO.updateReportingTask(reportingTaskDTO), - rt -> dtoFactory.createReportingTaskDto(rt)); + reportingTask, + () -> reportingTaskDAO.updateReportingTask(reportingTaskDTO), + rt -> dtoFactory.createReportingTaskDto(rt)); final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(reportingTask); return new UpdateResult<>(entityFactory.createReportingTaskEntity(snapshot.getComponent(), dtoFactory.createRevisionDTO(snapshot.getLastModification()), accessPolicy), false); @@ -1875,10 +1852,10 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { public ReportingTaskEntity deleteReportingTask(final Revision revision, final String reportingTaskId) { final ReportingTaskNode reportingTask = reportingTaskDAO.getReportingTask(reportingTaskId); final ReportingTaskDTO snapshot = deleteComponent( - revision, - reportingTask, - () -> reportingTaskDAO.deleteReportingTask(reportingTaskId), - dtoFactory.createReportingTaskDto(reportingTask)); + revision, + reportingTask, + () -> reportingTaskDAO.deleteReportingTask(reportingTaskId), + dtoFactory.createReportingTaskDto(reportingTask)); return entityFactory.createReportingTaskEntity(snapshot, null, null); } @@ -2054,13 +2031,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Set<String> connectionIds = connections.stream().map(connection -> connection.getIdentifier()).collect(Collectors.toSet()); return revisionManager.get(connectionIds, () -> { return connections.stream() - .map(connection -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(connection.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection); - final ConnectionStatusDTO status = dtoFactory.createConnectionStatusDto(controllerFacade.getConnectionStatus(connection.getIdentifier())); - return entityFactory.createConnectionEntity(dtoFactory.createConnectionDto(connection), revision, accessPolicy, status); - }) - .collect(Collectors.toSet()); + .map(connection -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(connection.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(connection); + final ConnectionStatusDTO status = dtoFactory.createConnectionStatusDto(controllerFacade.getConnectionStatus(connection.getIdentifier())); + return entityFactory.createConnectionEntity(dtoFactory.createConnectionDto(connection), revision, accessPolicy, status); + }) + .collect(Collectors.toSet()); }); }); } @@ -2127,13 +2104,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Set<String> ids = processors.stream().map(proc -> proc.getIdentifier()).collect(Collectors.toSet()); return revisionManager.get(ids, () -> { return processors.stream() - .map(processor -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(processor.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processor); - final ProcessorStatusDTO status = dtoFactory.createProcessorStatusDto(controllerFacade.getProcessorStatus(processor.getIdentifier())); - return entityFactory.createProcessorEntity(dtoFactory.createProcessorDto(processor), revision, accessPolicy, status); - }) - .collect(Collectors.toSet()); + .map(processor -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(processor.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processor); + final ProcessorStatusDTO status = dtoFactory.createProcessorStatusDto(controllerFacade.getProcessorStatus(processor.getIdentifier())); + return entityFactory.createProcessorEntity(dtoFactory.createProcessorDto(processor), revision, accessPolicy, status); + }) + .collect(Collectors.toSet()); }); } @@ -2242,7 +2219,7 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { // getting the most recent results by ordering by timestamp desc above. this gets the // exact results we want but in reverse order final List<BulletinDTO> bulletins = new ArrayList<>(); - for (final ListIterator<Bulletin> bulletinIter = results.listIterator(results.size()); bulletinIter.hasPrevious();) { + for (final ListIterator<Bulletin> bulletinIter = results.listIterator(results.size()); bulletinIter.hasPrevious(); ) { bulletins.add(dtoFactory.createBulletinDto(bulletinIter.previous())); } @@ -2383,12 +2360,12 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Set<String> ids = labels.stream().map(label -> label.getIdentifier()).collect(Collectors.toSet()); return revisionManager.get(ids, () -> { return labels.stream() - .map(label -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(label.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(label); - return entityFactory.createLabelEntity(dtoFactory.createLabelDto(label), revision, accessPolicy); - }) - .collect(Collectors.toSet()); + .map(label -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(label.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(label); + return entityFactory.createLabelEntity(dtoFactory.createLabelDto(label), revision, accessPolicy); + }) + .collect(Collectors.toSet()); }); } @@ -2413,12 +2390,12 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Set<String> funnelIds = funnels.stream().map(funnel -> funnel.getIdentifier()).collect(Collectors.toSet()); return revisionManager.get(funnelIds, () -> { return funnels.stream() - .map(funnel -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(funnel.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnel); - return entityFactory.createFunnelEntity(dtoFactory.createFunnelDto(funnel), revision, accessPolicy); - }) - .collect(Collectors.toSet()); + .map(funnel -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(funnel.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(funnel); + return entityFactory.createFunnelEntity(dtoFactory.createFunnelDto(funnel), revision, accessPolicy); + }) + .collect(Collectors.toSet()); }); } @@ -2443,14 +2420,14 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Set<String> portIds = inputPorts.stream().map(port -> port.getIdentifier()).collect(Collectors.toSet()); return revisionManager.get(portIds, () -> { return inputPorts.stream() - .map(port -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(port.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); - final PortStatusDTO status = dtoFactory.createPortStatusDto(controllerFacade.getInputPortStatus(port.getIdentifier())); - return entityFactory.createPortEntity(dtoFactory.createPortDto(port), revision, accessPolicy, status); - }) - .collect(Collectors.toSet()); - }); + .map(port -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(port.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); + final PortStatusDTO status = dtoFactory.createPortStatusDto(controllerFacade.getInputPortStatus(port.getIdentifier())); + return entityFactory.createPortEntity(dtoFactory.createPortDto(port), revision, accessPolicy, status); + }) + .collect(Collectors.toSet()); + }); } @Override @@ -2463,13 +2440,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { return revisionManager.get(ids, () -> { return ports.stream() - .map(port -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(port.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); - final PortStatusDTO status = dtoFactory.createPortStatusDto(controllerFacade.getOutputPortStatus(port.getIdentifier())); - return entityFactory.createPortEntity(dtoFactory.createPortDto(port), revision, accessPolicy, status); - }) - .collect(Collectors.toSet()); + .map(port -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(port.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(port); + final PortStatusDTO status = dtoFactory.createPortStatusDto(controllerFacade.getOutputPortStatus(port.getIdentifier())); + return entityFactory.createPortEntity(dtoFactory.createPortDto(port), revision, accessPolicy, status); + }) + .collect(Collectors.toSet()); }); } @@ -2482,13 +2459,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { final Set<String> ids = groups.stream().map(group -> group.getIdentifier()).collect(Collectors.toSet()); return revisionManager.get(ids, () -> { return groups.stream() - .map(group -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(group.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(group); - final ProcessGroupStatusDTO status = dtoFactory.createConciseProcessGroupStatusDto(controllerFacade.getProcessGroupStatus(group.getIdentifier())); - return entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(group), revision, accessPolicy, status); - }) - .collect(Collectors.toSet()); + .map(group -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(group.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(group); + final ProcessGroupStatusDTO status = dtoFactory.createConciseProcessGroupStatusDto(controllerFacade.getProcessGroupStatus(group.getIdentifier())); + return entityFactory.createProcessGroupEntity(dtoFactory.createProcessGroupDto(group), revision, accessPolicy, status); + }) + .collect(Collectors.toSet()); }); } @@ -2502,13 +2479,13 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { return revisionManager.get(ids, () -> { return rpgs.stream() - .map(rpg -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(rpg.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(rpg); - final RemoteProcessGroupStatusDTO status = dtoFactory.createRemoteProcessGroupStatusDto(controllerFacade.getRemoteProcessGroupStatus(rpg.getIdentifier())); - return entityFactory.createRemoteProcessGroupEntity(dtoFactory.createRemoteProcessGroupDto(rpg), revision, accessPolicy, status); - }) - .collect(Collectors.toSet()); + .map(rpg -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(rpg.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(rpg); + final RemoteProcessGroupStatusDTO status = dtoFactory.createRemoteProcessGroupStatusDto(controllerFacade.getRemoteProcessGroupStatus(rpg.getIdentifier())); + return entityFactory.createRemoteProcessGroupEntity(dtoFactory.createRemoteProcessGroupDto(rpg), revision, accessPolicy, status); + }) + .collect(Collectors.toSet()); }); } @@ -2574,45 +2551,45 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { @Override public ProcessGroupFlowEntity getProcessGroupFlow(String groupId, boolean recurse) { return revisionManager.get(groupId, - rev -> { - // get all identifiers for every child component - final Set<String> identifiers = new HashSet<>(); - final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); - processGroup.getProcessors().stream() - .map(proc -> proc.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getConnections().stream() - .map(conn -> conn.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getInputPorts().stream() - .map(port -> port.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getOutputPorts().stream() - .map(port -> port.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getProcessGroups().stream() - .map(group -> group.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getRemoteProcessGroups().stream() - .map(remoteGroup -> remoteGroup.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getRemoteProcessGroups().stream() - .flatMap(remoteGroup -> remoteGroup.getInputPorts().stream()) - .map(remoteInputPort -> remoteInputPort.getIdentifier()) - .forEach(id -> identifiers.add(id)); - processGroup.getRemoteProcessGroups().stream() - .flatMap(remoteGroup -> remoteGroup.getOutputPorts().stream()) - .map(remoteOutputPort -> remoteOutputPort.getIdentifier()) - .forEach(id -> identifiers.add(id)); - - // read lock on every component being accessed in the dto conversion - return revisionManager.get(identifiers, - () -> { - final ProcessGroupStatus groupStatus = controllerFacade.getProcessGroupStatus(groupId); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroup); - return entityFactory.createProcessGroupFlowEntity(dtoFactory.createProcessGroupFlowDto(processGroup, groupStatus, revisionManager), accessPolicy); - }); - }); + rev -> { + // get all identifiers for every child component + final Set<String> identifiers = new HashSet<>(); + final ProcessGroup processGroup = processGroupDAO.getProcessGroup(groupId); + processGroup.getProcessors().stream() + .map(proc -> proc.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getConnections().stream() + .map(conn -> conn.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getInputPorts().stream() + .map(port -> port.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getOutputPorts().stream() + .map(port -> port.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getProcessGroups().stream() + .map(group -> group.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getRemoteProcessGroups().stream() + .map(remoteGroup -> remoteGroup.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getRemoteProcessGroups().stream() + .flatMap(remoteGroup -> remoteGroup.getInputPorts().stream()) + .map(remoteInputPort -> remoteInputPort.getIdentifier()) + .forEach(id -> identifiers.add(id)); + processGroup.getRemoteProcessGroups().stream() + .flatMap(remoteGroup -> remoteGroup.getOutputPorts().stream()) + .map(remoteOutputPort -> remoteOutputPort.getIdentifier()) + .forEach(id -> identifiers.add(id)); + + // read lock on every component being accessed in the dto conversion + return revisionManager.get(identifiers, + () -> { + final ProcessGroupStatus groupStatus = controllerFacade.getProcessGroupStatus(groupId); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(processGroup); + return entityFactory.createProcessGroupFlowEntity(dtoFactory.createProcessGroupFlowDto(processGroup, groupStatus, revisionManager), accessPolicy); + }); + }); } @Override @@ -2646,18 +2623,18 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { return revisionManager.get(serviceIds, () -> { return serviceNodes.stream() - .map(serviceNode -> { - final ControllerServiceDTO dto = dtoFactory.createControllerServiceDto(serviceNode); - - final ControllerServiceReference ref = serviceNode.getReferences(); - final ControllerServiceReferencingComponentsEntity referencingComponentsEntity = createControllerServiceReferencingComponentsEntity(ref); - dto.setReferencingComponents(referencingComponentsEntity.getControllerServiceReferencingComponents()); - - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(serviceNode.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(serviceNode); - return entityFactory.createControllerServiceEntity(dto, revision, accessPolicy); - }) - .collect(Collectors.toSet()); + .map(serviceNode -> { + final ControllerServiceDTO dto = dtoFactory.createControllerServiceDto(serviceNode); + + final ControllerServiceReference ref = serviceNode.getReferences(); + final ControllerServiceReferencingComponentsEntity referencingComponentsEntity = createControllerServiceReferencingComponentsEntity(ref); + dto.setReferencingComponents(referencingComponentsEntity.getControllerServiceReferencingComponents()); + + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(serviceNode.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(serviceNode); + return entityFactory.createControllerServiceEntity(dto, revision, accessPolicy); + }) + .collect(Collectors.toSet()); }); } @@ -2710,12 +2687,12 @@ public class StandardNiFiServiceFacade implements NiFiServiceFacade { return revisionManager.get(ids, () -> { return reportingTasks.stream() - .map(reportingTask -> { - final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(reportingTask.getIdentifier())); - final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(reportingTask); - return entityFactory.createReportingTaskEntity(dtoFactory.createReportingTaskDto(reportingTask), revision, accessPolicy); - }) - .collect(Collectors.toSet()); + .map(reportingTask -> { + final RevisionDTO revision = dtoFactory.createRevisionDTO(revisionManager.getRevision(reportingTask.getIdentifier())); + final AccessPolicyDTO accessPolicy = dtoFactory.createAccessPolicyDto(reportingTask); + return entityFactory.createReportingTaskEntity(dtoFactory.createReportingTaskDto(reportingTask), revision, accessPolicy); + }) + .collect(Collectors.toSet()); }); } http://git-wip-us.apache.org/repos/asf/nifi/blob/893daf56/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardTemplateDAO.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardTemplateDAO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardTemplateDAO.java index b2fd681..0774683 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardTemplateDAO.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardTemplateDAO.java @@ -16,22 +16,25 @@ */ package org.apache.nifi.web.dao.impl; -import java.util.HashSet; -import java.util.Set; - import org.apache.commons.lang3.StringUtils; import org.apache.nifi.controller.FlowController; import org.apache.nifi.controller.Template; import org.apache.nifi.controller.TemplateUtils; import org.apache.nifi.controller.exception.ProcessorInstantiationException; +import org.apache.nifi.controller.serialization.FlowEncodingVersion; import org.apache.nifi.groups.ProcessGroup; import org.apache.nifi.web.NiFiCoreException; import org.apache.nifi.web.ResourceNotFoundException; import org.apache.nifi.web.api.dto.FlowSnippetDTO; +import org.apache.nifi.web.api.dto.ProcessGroupDTO; import org.apache.nifi.web.api.dto.TemplateDTO; import org.apache.nifi.web.dao.TemplateDAO; import org.apache.nifi.web.util.SnippetUtils; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + /** * */ @@ -88,8 +91,23 @@ public class StandardTemplateDAO extends ComponentDAO implements TemplateDAO { TemplateDTO templateDetails = template.getDetails(); FlowSnippetDTO snippet = snippetUtils.copy(templateDetails.getSnippet(), group, idGenerationSeed); - // reposition the template contents - org.apache.nifi.util.SnippetUtils.moveSnippet(snippet, originX, originY); + // calculate scaling factors based on the template encoding version + // attempt to parse the encoding version + final FlowEncodingVersion templateEncodingVersion = FlowEncodingVersion.parse(templateDetails.getEncodingVersion()); + // get the major version, or 0 if no version could be parsed + int templateEncodingMajorVersion = templateEncodingVersion != null ? templateEncodingVersion.getMajorVersion() : 0; + // based on the major version < 1, use the default scaling factors. Otherwise, don't scale (use factor of 1.0) + double factorX = templateEncodingMajorVersion < 1 ? FlowController.DEFAULT_POSITION_SCALE_FACTOR_X : 1.0; + double factorY = templateEncodingMajorVersion < 1 ? FlowController.DEFAULT_POSITION_SCALE_FACTOR_Y : 1.0; + + // reposition and scale the template contents + org.apache.nifi.util.SnippetUtils.moveAndScaleSnippet(snippet, originX, originY, factorX, factorY); + + + // find all the child process groups in each process group in the top level of this snippet + final List<ProcessGroupDTO> childProcessGroups = org.apache.nifi.util.SnippetUtils.findAllProcessGroups(snippet); + // scale (but don't reposition) child process groups + childProcessGroups.stream().forEach(processGroup -> org.apache.nifi.util.SnippetUtils.scaleSnippet(processGroup.getContents(), factorX, factorY)); // instantiate the template into this group flowController.instantiateSnippet(group, snippet); http://git-wip-us.apache.org/repos/asf/nifi/blob/893daf56/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy new file mode 100644 index 0000000..31e490a --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/test/groovy/org/apache/nifi/web/dao/impl/StandardTemplateDAOSpec.groovy @@ -0,0 +1,155 @@ +/* + * 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.authorization.Authorizer +import org.apache.nifi.controller.FlowController +import org.apache.nifi.controller.Template +import org.apache.nifi.controller.serialization.FlowEncodingVersion +import org.apache.nifi.controller.service.ControllerServiceProvider +import org.apache.nifi.groups.ProcessGroup +import org.apache.nifi.web.api.dto.* +import org.apache.nifi.web.util.SnippetUtils +import spock.lang.Specification +import spock.lang.Unroll + +class StandardTemplateDAOSpec extends Specification { + + @Unroll + def "test InstantiateTemplate moves and scales templates"() { + given: + def flowController = Mock FlowController + def snippetUtils = new SnippetUtils() + snippetUtils.flowController = flowController + def dtoFactory = new DtoFactory() + dtoFactory.authorizer = Mock Authorizer + dtoFactory.controllerServiceProvider = Mock ControllerServiceProvider + snippetUtils.dtoFactory = dtoFactory + def standardTemplateDAO = new StandardTemplateDAO() + standardTemplateDAO.flowController = flowController + standardTemplateDAO.snippetUtils = snippetUtils + def templateEncodingVersion = FlowEncodingVersion.parse(encodingVersion); + // get the major version, or 0 if no version could be parsed + int templateEncodingMajorVersion = templateEncodingVersion != null ? templateEncodingVersion.getMajorVersion() : 0; + double factorX = templateEncodingMajorVersion < 1 ? FlowController.DEFAULT_POSITION_SCALE_FACTOR_X : 1.0; + double factorY = templateEncodingMajorVersion < 1 ? FlowController.DEFAULT_POSITION_SCALE_FACTOR_Y : 1.0; + // get all top-level component starting positions + def List<ComponentDTO> components = [snippet.connections + snippet.inputPorts + snippet.outputPorts + snippet.labels + snippet.processGroups + snippet.processGroups + + snippet.processors + snippet.funnels + snippet.remoteProcessGroups].flatten() + + // get all starting subcomponent starting positions + def List<ComponentDTO> subComponents = org.apache.nifi.util.SnippetUtils.findAllProcessGroups(snippet).collect { ProcessGroupDTO processGroup -> + def childSnippet = processGroup.contents + childSnippet.connections + childSnippet.inputPorts + childSnippet.outputPorts + childSnippet.labels + childSnippet.processGroups + childSnippet.processGroups + + childSnippet.processors + childSnippet.funnels + childSnippet.remoteProcessGroups + }.flatten() + + when: + def instantiatedTemplate = standardTemplateDAO.instantiateTemplate(rootGroupId, newOriginX, newOriginY, templateId, idGenerationSeed) + + then: + flowController.getGroup(_) >> { String gId -> + def pg = Mock ProcessGroup + pg.identifier >> gId + pg.findTemplate(templateId) >> { tId -> + def t = Mock Template + t.getDetails() >> { tDetails -> + def td = Mock TemplateDTO + td.snippet >> snippet + td.encodingVersion >> encodingVersion + return td + } + return t + } + pg.inputPorts >> [] + pg.outputPorts >> [] + pg.processGroups >> [] + return pg + } + flowController.rootGroupId >> rootGroupId + flowController.instantiateSnippet(*_) >> {} + 0 * _ + + def instantiatedComponents = [instantiatedTemplate.connections + instantiatedTemplate.inputPorts + instantiatedTemplate.outputPorts + instantiatedTemplate.labels + + instantiatedTemplate.processGroups + instantiatedTemplate.processGroups + instantiatedTemplate.processors + instantiatedTemplate.funnels + + instantiatedTemplate.remoteProcessGroups].flatten() + components.forEach { component -> + def correspondingScaledPosition = instantiatedComponents.find { scaledComponent -> + scaledComponent.name.equals(component.name) + }.position + assert correspondingScaledPosition != null + def expectedPosition = calculateMoveAndScalePosition(component.position, oldOriginX, oldOriginY, newOriginX, newOriginY, factorX, factorY) + assert correspondingScaledPosition.x == expectedPosition.x + assert correspondingScaledPosition.y == expectedPosition.y + + } + def instantiatedSubComponents = org.apache.nifi.util.SnippetUtils.findAllProcessGroups(instantiatedTemplate).collect { ProcessGroupDTO processGroup -> + def childSnippet = processGroup.contents + childSnippet.connections + childSnippet.inputPorts + childSnippet.outputPorts + childSnippet.labels + childSnippet.processGroups + childSnippet.processGroups + + childSnippet.processors + childSnippet.funnels + childSnippet.remoteProcessGroups + }.flatten() + subComponents.forEach { subComponent -> + def correspondingScaledPosition = instantiatedSubComponents.find { scaledComponent -> + scaledComponent.name.equals(subComponent.name) + }.position + assert correspondingScaledPosition != null + def expectedPosition = calculateScalePosition(subComponent.position, factorX, factorY) + assert correspondingScaledPosition.x == expectedPosition.x + assert correspondingScaledPosition.y == expectedPosition.y + + } + + where: + rootGroupId | oldOriginX | oldOriginY | newOriginX | newOriginY | templateId | idGenerationSeed | encodingVersion | snippet + 'g1' | 0.0 | 0.0 | 5.0 | 5.0 | 't1' | 'AAAA' | null | new FlowSnippetDTO() + 'g1' | 10.0 | 10.0 | 5.0 | 5.0 | 't1' | 'AAAA' | '0.7' | new FlowSnippetDTO( + processors: [new ProcessorDTO(name: 'proc1', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))]) + 'g1' | 10.0 | -10.0 | 5.0 | 5.0 | 't1' | 'AAAA' | null | new FlowSnippetDTO( + processors: [new ProcessorDTO(name: 'proc2', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))], + processGroups: [ + new ProcessGroupDTO( + name: 'g2', + position: new PositionDTO(x: 105, y: -10), + contents: new FlowSnippetDTO(processors: [new ProcessorDTO(name: 'proc3', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 50, y: 60))]))]) + 'g1' | 10.0 | -10.0 | 5.0 | 5.0 | 't1' | 'AAAA' | '0.7' | new FlowSnippetDTO( + processors: [new ProcessorDTO(name: 'proc2', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))], + processGroups: [ + new ProcessGroupDTO( + name: 'g2', + position: new PositionDTO(x: 105, y: -10), + contents: new FlowSnippetDTO(processors: [new ProcessorDTO(name: 'proc3', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 50, y: 60))]))]) + 'g1' | 10.0 | -10.0 | 5.0 | 5.0 | 't1' | 'AAAA' | '1.0' | new FlowSnippetDTO( + processors: [new ProcessorDTO(name: 'proc2', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 10, y: 10))], + processGroups: [ + new ProcessGroupDTO( + name: 'g2', + position: new PositionDTO(x: 105, y: -10), + contents: new FlowSnippetDTO(processors: [new ProcessorDTO(name: 'proc3', config: new ProcessorConfigDTO(), position: new PositionDTO(x: 50, y: 60))]))]) + } + + def PositionDTO calculateMoveAndScalePosition(position, oldOriginX, oldOriginY, newOriginX, newOriginY, factorX, factorY) { + new PositionDTO( + x: newOriginX + (position.x - oldOriginX) * factorX, + y: newOriginY + (position.y - oldOriginY) * factorY) + } + + def PositionDTO calculateScalePosition(position, factorX, factorY) { + new PositionDTO( + x: position.x * factorX, + y: position.y * factorY) + } +} \ No newline at end of file
