Search in sources :

Example 1 with Output

use of org.knime.core.node.workflow.capture.WorkflowSegment.Output in project knime-core by knime.

the class WorkflowCaptureOperation method capture.

/**
 * Carries out the actual capture-operation and returns the captured sub-workflow as a {@link WorkflowSegment}.
 *
 * @return the captured sub-workflow
 */
public WorkflowSegment capture() {
    WorkflowManager tempParent = null;
    try (WorkflowLock lock = m_wfm.lock()) {
        NodeID endNodeID = m_endNode.getID();
        WorkflowCreationHelper workflowCreationHelper = new WorkflowCreationHelper();
        Optional.ofNullable(NodeContext.getContext()).map(NodeContext::getWorkflowManager).map(WorkflowManager::getContext).ifPresent(workflowCreationHelper::setWorkflowContext);
        tempParent = WorkflowManager.EXTRACTED_WORKFLOW_ROOT.createAndAddProject("Capture-" + endNodeID, workflowCreationHelper);
        // "scope body" -- will copy those nodes later
        List<NodeContainer> nodesInScope = m_wfm.getWorkflow().getNodesInScope(m_endNode);
        // "scope body" and port object ref readers -- will determine bounding box and move them to the top left
        List<NodeContainer> nodesToDetermineBoundingBox = new ArrayList<>(nodesInScope);
        // copy nodes in scope body
        WorkflowCopyContent.Builder copyContent = WorkflowCopyContent.builder();
        NodeID[] allIDs = nodesInScope.stream().map(NodeContainer::getID).toArray(NodeID[]::new);
        HashSet<NodeID> allIDsHashed = new HashSet<>(Arrays.asList(allIDs));
        // port object reader nodes grouped by the original node
        Map<NodeID, List<NodeID>> portObjectReaderGroups = new HashMap<>();
        Set<NodeIDSuffix> addedPortObjectReaderNodes = new HashSet<>();
        NodeID[] allButScopeIDs = ArrayUtils.removeElements(allIDs, endNodeID, m_startNode.getID());
        copyContent.setNodeIDs(allButScopeIDs);
        copyContent.setIncludeInOutConnections(false);
        final int[] boundingBox = NodeUIInformation.getBoundingBoxOf(nodesToDetermineBoundingBox);
        final int[] moveUIDist = new int[] { -boundingBox[0] + 50, -boundingBox[1] + 50 };
        copyContent.setPositionOffset(moveUIDist);
        tempParent.copyFromAndPasteHere(m_wfm, copyContent.build());
        // collect nodes outside the scope body but connected to the scope body (only incoming)
        // maps to 'pasted' node id
        Map<Pair<NodeID, Integer>, NodeID> visitedSrcPorts = new HashMap<>();
        FlowVirtualScopeContext virtualScopeContext = getVirtualScopeContext(m_startNode);
        for (int i = 0; i < allButScopeIDs.length; i++) {
            NodeContainer oldNode = m_wfm.getNodeContainer(allButScopeIDs[i]);
            for (int p = 0; p < oldNode.getNrInPorts(); p++) {
                ConnectionContainer c = m_wfm.getIncomingConnectionFor(allButScopeIDs[i], p);
                if (c == null) {
                // ignore: no incoming connection
                } else if (allIDsHashed.contains(c.getSource())) {
                // ignore: connection already retained by paste persistor
                } else {
                    Pair<NodeID, Integer> currentSrcPort = Pair.create(c.getSource(), c.getSourcePort());
                    if (!visitedSrcPorts.containsKey(currentSrcPort)) {
                        // only add portObjectReader if not inserted already in previous loop iteration
                        // add port object reader
                        NodeID pastedID = addPortObjectReferenceReader(m_wfm, tempParent, c, virtualScopeContext);
                        NodeIDSuffix pastedIDSuffix = NodeIDSuffix.create(tempParent.getID(), pastedID);
                        // position
                        NodeID sourceID = c.getSource();
                        NodeUIInformation sourceUIInformation = getSourceNodeAndUIInformation(sourceID, c.getDest(), nodesToDetermineBoundingBox);
                        tempParent.getNodeContainer(pastedID).setUIInformation(sourceUIInformation);
                        // keeping track
                        visitedSrcPorts.put(Pair.create(c.getSource(), c.getSourcePort()), pastedID);
                        addedPortObjectReaderNodes.add(pastedIDSuffix);
                        portObjectReaderGroups.computeIfAbsent(currentSrcPort.getFirst(), id -> new ArrayList<>()).add(pastedID);
                    }
                    // connect all new port object readers to the in-scope-nodes
                    NodeIDSuffix destID = NodeIDSuffix.create(m_wfm.getID(), c.getDest());
                    tempParent.addConnection(visitedSrcPorts.get(currentSrcPort), 1, destID.prependParent(tempParent.getID()), c.getDestPort());
                }
            }
        }
        groupAndPositionPortObjectReaders(tempParent, portObjectReaderGroups, addedPortObjectReaderNodes, moveUIDist);
        // transfer editor settings, too
        tempParent.setEditorUIInformation(m_wfm.getEditorUIInformation());
        List<Input> workflowFragmentInputs = getInputs();
        List<Output> workflowFragmentOutputs = getOutputs();
        return new WorkflowSegment(tempParent, workflowFragmentInputs, workflowFragmentOutputs, addedPortObjectReaderNodes);
    } catch (Exception e) {
        if (tempParent != null) {
            WorkflowManager.EXTRACTED_WORKFLOW_ROOT.removeNode(tempParent.getID());
            tempParent = null;
        }
        throw e;
    }
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Input(org.knime.core.node.workflow.capture.WorkflowSegment.Input) Output(org.knime.core.node.workflow.capture.WorkflowSegment.Output) ArrayList(java.util.ArrayList) List(java.util.List) HashSet(java.util.HashSet) Pair(org.knime.core.util.Pair) CanceledExecutionException(org.knime.core.node.CanceledExecutionException) IOException(java.io.IOException) FlowVirtualScopeContext(org.knime.core.node.workflow.virtual.parchunk.FlowVirtualScopeContext) WorkflowSegment(org.knime.core.node.workflow.capture.WorkflowSegment) NodeIDSuffix(org.knime.core.node.workflow.NodeID.NodeIDSuffix)

Example 2 with Output

use of org.knime.core.node.workflow.capture.WorkflowSegment.Output in project knime-core by knime.

the class WorkflowCaptureOperation method getOutputs.

/**
 * Returns the outputs of the (to be) captured sub-workflow, i.e. the same ports {@link #capture()} with a
 * subsequent {@link WorkflowSegment#getConnectedOutputs()} would return.
 *
 * @return the outputs of the (to be) captured workflow fragment
 */
public List<Output> getOutputs() {
    List<Output> res = new ArrayList<>();
    for (int i = 0; i < m_endNode.getNrInPorts(); i++) {
        ConnectionContainer cc = m_wfm.getIncomingConnectionFor(m_endNode.getID(), i);
        PortID connectPort = null;
        PortType type = null;
        DataTableSpec spec = null;
        if (cc != null) {
            connectPort = new PortID(NodeIDSuffix.create(m_wfm.getID(), cc.getSource()), cc.getSourcePort());
            NodeOutPort outPort = m_wfm.getNodeContainer(cc.getSource()).getOutPort(cc.getSourcePort());
            type = outPort.getPortType();
            spec = castToDTSpecOrNull(outPort.getPortObjectSpec());
        }
        res.add(new Output(type, spec, connectPort));
    }
    return res;
}
Also used : DataTableSpec(org.knime.core.data.DataTableSpec) Output(org.knime.core.node.workflow.capture.WorkflowSegment.Output) ArrayList(java.util.ArrayList) PortID(org.knime.core.node.workflow.capture.WorkflowSegment.PortID) PortType(org.knime.core.node.port.PortType)

Example 3 with Output

use of org.knime.core.node.workflow.capture.WorkflowSegment.Output in project knime-core by knime.

the class WorkflowPortObjectSpec method loadOutputs.

private static Pair<List<Output>, List<String>> loadOutputs(final ModelContentRO model) throws InvalidSettingsException {
    int size = model.getInt("num_outputs");
    List<Output> outputs = new ArrayList<>(size);
    List<String> outputIDs = new ArrayList<>(size);
    for (int i = 0; i < size; i++) {
        Config outputConf = model.getConfig("output_" + i);
        PortID connectedPort = null;
        if (outputConf.containsKey("connected_port")) {
            connectedPort = loadPortID(outputConf.getConfig("connected_port"));
        }
        Output output = new Output(outputConf.containsKey("type") ? loadPortType(outputConf.getConfig("type")) : null, outputConf.containsKey("spec") ? loadTableSpec(outputConf.getConfig("spec")) : null, connectedPort);
        outputs.add(output);
        outputIDs.add(outputConf.getString("id"));
    }
    return Pair.create(outputs, outputIDs);
}
Also used : Config(org.knime.core.node.config.Config) Output(org.knime.core.node.workflow.capture.WorkflowSegment.Output) ArrayList(java.util.ArrayList) PortID(org.knime.core.node.workflow.capture.WorkflowSegment.PortID)

Example 4 with Output

use of org.knime.core.node.workflow.capture.WorkflowSegment.Output in project knime-core by knime.

the class WorkflowPortObjectSpec method saveOutputs.

private static void saveOutputs(final ModelContentWO model, final List<Output> outputs, final List<String> outputIDs) {
    model.addInt("num_outputs", outputs.size());
    for (int i = 0; i < outputs.size(); i++) {
        Output output = outputs.get(i);
        Config outputConf = model.addConfig("output_" + i);
        if (output.getType().isPresent()) {
            Config type = outputConf.addConfig("type");
            savePortType(type, output.getType().get());
        }
        Optional<DataTableSpec> optionalSpec = output.getSpec();
        if (optionalSpec.isPresent()) {
            Config spec = outputConf.addConfig("spec");
            saveSpec(spec, output.getSpec().get());
        }
        Optional<PortID> connectedPort = output.getConnectedPort();
        if (connectedPort.isPresent()) {
            Config portConf = outputConf.addConfig("connected_port");
            savePortID(portConf, connectedPort.get());
        }
        outputConf.addString("id", outputIDs.get(i));
    }
}
Also used : DataTableSpec(org.knime.core.data.DataTableSpec) Config(org.knime.core.node.config.Config) Output(org.knime.core.node.workflow.capture.WorkflowSegment.Output) PortID(org.knime.core.node.workflow.capture.WorkflowSegment.PortID)

Aggregations

Output (org.knime.core.node.workflow.capture.WorkflowSegment.Output)4 ArrayList (java.util.ArrayList)3 PortID (org.knime.core.node.workflow.capture.WorkflowSegment.PortID)3 DataTableSpec (org.knime.core.data.DataTableSpec)2 Config (org.knime.core.node.config.Config)2 IOException (java.io.IOException)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 List (java.util.List)1 CanceledExecutionException (org.knime.core.node.CanceledExecutionException)1 PortType (org.knime.core.node.port.PortType)1 NodeIDSuffix (org.knime.core.node.workflow.NodeID.NodeIDSuffix)1 WorkflowSegment (org.knime.core.node.workflow.capture.WorkflowSegment)1 Input (org.knime.core.node.workflow.capture.WorkflowSegment.Input)1 FlowVirtualScopeContext (org.knime.core.node.workflow.virtual.parchunk.FlowVirtualScopeContext)1 Pair (org.knime.core.util.Pair)1