Search in sources :

Example 26 with Connection

use of org.apache.nifi.connectable.Connection in project nifi by apache.

the class TestStandardProcessSession method testCloneOriginalDataSmaller.

@Test
public void testCloneOriginalDataSmaller() throws IOException {
    final byte[] originalContent = "hello".getBytes();
    final byte[] replacementContent = "NEW DATA".getBytes();
    final Connection conn1 = createConnection();
    final FlowFileRecord flowFileRecord = new StandardFlowFileRecord.Builder().id(1000L).addAttribute("uuid", "12345678-1234-1234-1234-123456789012").entryDate(System.currentTimeMillis()).contentClaim(contentRepo.create(originalContent)).size(originalContent.length).build();
    flowFileQueue.put(flowFileRecord);
    when(connectable.getIncomingConnections()).thenReturn(Collections.singletonList(conn1));
    final FlowFile input = session.get();
    assertEquals(originalContent.length, input.getSize());
    final FlowFile modified = session.write(input, (in, out) -> out.write(replacementContent));
    assertEquals(replacementContent.length, modified.getSize());
    // Clone 'input', not 'modified' because we want to ensure that we use the outdated reference to ensure
    // that the framework uses the most current reference.
    final FlowFile clone = session.clone(input);
    assertEquals(replacementContent.length, clone.getSize());
    final byte[] buffer = new byte[replacementContent.length];
    try (final InputStream in = session.read(clone)) {
        StreamUtils.fillBuffer(in, buffer);
    }
    assertArrayEquals(replacementContent, buffer);
}
Also used : FlowFile(org.apache.nifi.flowfile.FlowFile) MockFlowFile(org.apache.nifi.util.MockFlowFile) ByteArrayInputStream(java.io.ByteArrayInputStream) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Connection(org.apache.nifi.connectable.Connection) Test(org.junit.Test)

Example 27 with Connection

use of org.apache.nifi.connectable.Connection in project nifi by apache.

the class StandardProcessGroup method addConnection.

@Override
public void addConnection(final Connection connection) {
    writeLock.lock();
    try {
        final String id = requireNonNull(connection).getIdentifier();
        final Connection existingConnection = connections.get(id);
        if (existingConnection != null) {
            throw new IllegalStateException("Connection already exists with ID " + id);
        }
        final Connectable source = connection.getSource();
        final Connectable destination = connection.getDestination();
        final ProcessGroup sourceGroup = source.getProcessGroup();
        final ProcessGroup destinationGroup = destination.getProcessGroup();
        // validate the connection is validate wrt to the source & destination groups
        if (isInputPort(source)) {
            // if source is an input port, its destination must be in the same group unless it's an input port
            if (isInputPort(destination)) {
                // if destination is input port, it must be in a child group.
                if (!processGroups.containsKey(destinationGroup.getIdentifier())) {
                    throw new IllegalStateException("Cannot add Connection to Process Group because destination is an Input Port that does not belong to a child Process Group");
                }
            } else if (sourceGroup != this || destinationGroup != this) {
                throw new IllegalStateException("Cannot add Connection to Process Group because source and destination are not both in this Process Group");
            }
        } else if (isOutputPort(source)) {
            // group (processor/output port) or a child group (input port)
            if (!processGroups.containsKey(sourceGroup.getIdentifier())) {
                throw new IllegalStateException("Cannot add Connection to Process Group because source is an Output Port that does not belong to a child Process Group");
            }
            if (isInputPort(destination)) {
                if (!processGroups.containsKey(destinationGroup.getIdentifier())) {
                    throw new IllegalStateException("Cannot add Connection to Process Group because its destination is an Input Port that does not belong to a child Process Group");
                }
            } else if (destinationGroup != this) {
                throw new IllegalStateException("Cannot add Connection to Process Group because its destination does not belong to this Process Group");
            }
        } else {
            // source is not a port
            if (sourceGroup != this) {
                throw new IllegalStateException("Cannot add Connection to Process Group because the source does not belong to this Process Group");
            }
            if (isOutputPort(destination)) {
                if (destinationGroup != this) {
                    throw new IllegalStateException("Cannot add Connection to Process Group because its destination is an Output Port but does not belong to this Process Group");
                }
            } else if (isInputPort(destination)) {
                if (!processGroups.containsKey(destinationGroup.getIdentifier())) {
                    throw new IllegalStateException("Cannot add Connection to Process Group because its destination is an Input " + "Port but the Input Port does not belong to a child Process Group");
                }
            } else if (destinationGroup != this) {
                throw new IllegalStateException("Cannot add Connection between " + source.getIdentifier() + " and " + destination.getIdentifier() + " because they are in different Process Groups and neither is an Input Port or Output Port");
            }
        }
        connection.setProcessGroup(this);
        source.addConnection(connection);
        if (source != destination) {
            // don't call addConnection twice if it's a self-looping connection.
            destination.addConnection(connection);
        }
        connections.put(connection.getIdentifier(), connection);
        flowController.onConnectionAdded(connection);
        onComponentModified();
    } finally {
        writeLock.unlock();
    }
}
Also used : Connectable(org.apache.nifi.connectable.Connectable) Connection(org.apache.nifi.connectable.Connection) VersionedConnection(org.apache.nifi.registry.flow.VersionedConnection) VersionedProcessGroup(org.apache.nifi.registry.flow.VersionedProcessGroup) VersionedRemoteProcessGroup(org.apache.nifi.registry.flow.VersionedRemoteProcessGroup)

Example 28 with Connection

use of org.apache.nifi.connectable.Connection in project nifi by apache.

the class StandardProcessGroup method verifyCanDelete.

@Override
public void verifyCanDelete(final Snippet snippet) throws IllegalStateException {
    readLock.lock();
    try {
        if (!id.equals(snippet.getParentGroupId())) {
            throw new IllegalStateException("Snippet belongs to ProcessGroup with ID " + snippet.getParentGroupId() + " but this ProcessGroup has id " + id);
        }
        if (!isDisconnected(snippet)) {
            throw new IllegalStateException("One or more components within the snippet is connected to a component outside of the snippet. Only a disconnected snippet may be moved.");
        }
        for (final String id : snippet.getConnections().keySet()) {
            final Connection connection = getConnection(id);
            if (connection == null) {
                throw new IllegalStateException("Snippet references Connection with ID " + id + ", which does not exist in this ProcessGroup");
            }
            connection.verifyCanDelete();
        }
        for (final String id : snippet.getFunnels().keySet()) {
            final Funnel funnel = getFunnel(id);
            if (funnel == null) {
                throw new IllegalStateException("Snippet references Funnel with ID " + id + ", which does not exist in this ProcessGroup");
            }
            funnel.verifyCanDelete(true);
        }
        for (final String id : snippet.getInputPorts().keySet()) {
            final Port port = getInputPort(id);
            if (port == null) {
                throw new IllegalStateException("Snippet references Input Port with ID " + id + ", which does not exist in this ProcessGroup");
            }
            port.verifyCanDelete(true);
        }
        for (final String id : snippet.getLabels().keySet()) {
            final Label label = getLabel(id);
            if (label == null) {
                throw new IllegalStateException("Snippet references Label with ID " + id + ", which does not exist in this ProcessGroup");
            }
        }
        for (final String id : snippet.getOutputPorts().keySet()) {
            final Port port = getOutputPort(id);
            if (port == null) {
                throw new IllegalStateException("Snippet references Output Port with ID " + id + ", which does not exist in this ProcessGroup");
            }
            port.verifyCanDelete(true);
        }
        for (final String id : snippet.getProcessGroups().keySet()) {
            final ProcessGroup group = getProcessGroup(id);
            if (group == null) {
                throw new IllegalStateException("Snippet references Process Group with ID " + id + ", which does not exist in this ProcessGroup");
            }
            group.verifyCanDelete(true);
        }
        for (final String id : snippet.getProcessors().keySet()) {
            final ProcessorNode processor = getProcessor(id);
            if (processor == null) {
                throw new IllegalStateException("Snippet references Processor with ID " + id + ", which does not exist in this ProcessGroup");
            }
            processor.verifyCanDelete(true);
        }
        for (final String id : snippet.getRemoteProcessGroups().keySet()) {
            final RemoteProcessGroup group = getRemoteProcessGroup(id);
            if (group == null) {
                throw new IllegalStateException("Snippet references Remote Process Group with ID " + id + ", which does not exist in this ProcessGroup");
            }
            group.verifyCanDelete(true);
        }
    } finally {
        readLock.unlock();
    }
}
Also used : VersionedFunnel(org.apache.nifi.registry.flow.VersionedFunnel) Funnel(org.apache.nifi.connectable.Funnel) VersionedRemoteProcessGroup(org.apache.nifi.registry.flow.VersionedRemoteProcessGroup) ProcessorNode(org.apache.nifi.controller.ProcessorNode) RootGroupPort(org.apache.nifi.remote.RootGroupPort) VersionedRemoteGroupPort(org.apache.nifi.registry.flow.VersionedRemoteGroupPort) Port(org.apache.nifi.connectable.Port) VersionedPort(org.apache.nifi.registry.flow.VersionedPort) LocalPort(org.apache.nifi.connectable.LocalPort) RemoteGroupPort(org.apache.nifi.remote.RemoteGroupPort) Connection(org.apache.nifi.connectable.Connection) VersionedConnection(org.apache.nifi.registry.flow.VersionedConnection) VersionedLabel(org.apache.nifi.registry.flow.VersionedLabel) Label(org.apache.nifi.controller.label.Label) VersionedProcessGroup(org.apache.nifi.registry.flow.VersionedProcessGroup) VersionedRemoteProcessGroup(org.apache.nifi.registry.flow.VersionedRemoteProcessGroup)

Example 29 with Connection

use of org.apache.nifi.connectable.Connection in project nifi by apache.

the class StandardProcessGroup method removeFunnel.

@Override
public void removeFunnel(final Funnel funnel) {
    writeLock.lock();
    try {
        final Funnel existing = funnels.get(requireNonNull(funnel).getIdentifier());
        if (existing == null) {
            throw new IllegalStateException("Funnel " + funnel.getIdentifier() + " is not a member of this ProcessGroup");
        }
        funnel.verifyCanDelete();
        for (final Connection conn : funnel.getConnections()) {
            conn.verifyCanDelete();
        }
        stopFunnel(funnel);
        // must copy to avoid a concurrent modification
        final Set<Connection> copy = new HashSet<>(funnel.getConnections());
        for (final Connection conn : copy) {
            removeConnection(conn);
        }
        funnels.remove(funnel.getIdentifier());
        onComponentModified();
        flowController.onFunnelRemoved(funnel);
        LOG.info("{} removed from flow", funnel);
    } finally {
        writeLock.unlock();
    }
}
Also used : VersionedFunnel(org.apache.nifi.registry.flow.VersionedFunnel) Funnel(org.apache.nifi.connectable.Funnel) Connection(org.apache.nifi.connectable.Connection) VersionedConnection(org.apache.nifi.registry.flow.VersionedConnection) LinkedHashSet(java.util.LinkedHashSet) HashSet(java.util.HashSet)

Example 30 with Connection

use of org.apache.nifi.connectable.Connection in project nifi by apache.

the class StandardProcessGroup method addConnection.

private Connection addConnection(final ProcessGroup destinationGroup, final VersionedConnection proposed, final String componentIdSeed) {
    final Connectable source = getConnectable(destinationGroup, proposed.getSource());
    if (source == null) {
        throw new IllegalArgumentException("Connection has a source with identifier " + proposed.getIdentifier() + " but no component could be found in the Process Group with a corresponding identifier");
    }
    final Connectable destination = getConnectable(destinationGroup, proposed.getDestination());
    if (destination == null) {
        throw new IllegalArgumentException("Connection has a destination with identifier " + proposed.getDestination().getId() + " but no component could be found in the Process Group with a corresponding identifier");
    }
    final Connection connection = flowController.createConnection(generateUuid(proposed.getIdentifier(), destination.getIdentifier(), componentIdSeed), proposed.getName(), source, destination, proposed.getSelectedRelationships());
    connection.setVersionedComponentId(proposed.getIdentifier());
    destinationGroup.addConnection(connection);
    updateConnection(connection, proposed);
    return connection;
}
Also used : Connectable(org.apache.nifi.connectable.Connectable) Connection(org.apache.nifi.connectable.Connection) VersionedConnection(org.apache.nifi.registry.flow.VersionedConnection)

Aggregations

Connection (org.apache.nifi.connectable.Connection)95 ArrayList (java.util.ArrayList)35 HashSet (java.util.HashSet)35 VersionedConnection (org.apache.nifi.registry.flow.VersionedConnection)30 FlowFileQueue (org.apache.nifi.controller.queue.FlowFileQueue)28 Connectable (org.apache.nifi.connectable.Connectable)27 ProcessGroup (org.apache.nifi.groups.ProcessGroup)26 Relationship (org.apache.nifi.processor.Relationship)23 Port (org.apache.nifi.connectable.Port)21 RemoteProcessGroup (org.apache.nifi.groups.RemoteProcessGroup)21 ProcessorNode (org.apache.nifi.controller.ProcessorNode)19 RootGroupPort (org.apache.nifi.remote.RootGroupPort)19 LinkedHashSet (java.util.LinkedHashSet)18 Set (java.util.Set)17 RemoteGroupPort (org.apache.nifi.remote.RemoteGroupPort)17 Funnel (org.apache.nifi.connectable.Funnel)16 HashMap (java.util.HashMap)15 VersionedProcessGroup (org.apache.nifi.registry.flow.VersionedProcessGroup)15 IOException (java.io.IOException)14 Map (java.util.Map)14