Search in sources :

Example 1 with ModifiablePortsConfiguration

use of org.knime.core.node.context.ports.ModifiablePortsConfiguration in project knime-core by knime.

the class ModifiableNodeCreationConfiguration method saveSettingsTo.

@Override
public void saveSettingsTo(final NodeSettingsWO settings) {
    Optional<ModifiableURLConfiguration> urlConfig = getModifiableURLConfig();
    Optional<ModifiablePortsConfiguration> portsConfig = getModifiablePortConfig();
    if (urlConfig.isPresent() || portsConfig.isPresent()) {
        final NodeSettingsWO creationConfig = settings.addNodeSettings(NODE_CREATION_CONFIG_KEY);
        urlConfig.ifPresent(urlCfg -> urlCfg.saveSettingsTo(creationConfig));
        portsConfig.ifPresent(portCfg -> portCfg.saveSettingsTo(creationConfig));
    }
}
Also used : ModifiablePortsConfiguration(org.knime.core.node.context.ports.ModifiablePortsConfiguration) NodeSettingsWO(org.knime.core.node.NodeSettingsWO) ModifiableURLConfiguration(org.knime.core.node.context.url.ModifiableURLConfiguration) DefaultModifiableURLConfiguration(org.knime.core.node.context.url.impl.DefaultModifiableURLConfiguration)

Example 2 with ModifiablePortsConfiguration

use of org.knime.core.node.context.ports.ModifiablePortsConfiguration in project knime-workbench by knime.

the class Nodalizer method parseNodeAndPrint.

private static void parseNodeAndPrint(final NodeFactory<?> fac, final String factoryString, final List<String> path, final String categoryPath, final String name, final NodeAndBundleInformation nodeAndBundleInfo, final boolean isDeprecated, final File directory, final Map<String, ExtensionInfo> extensions, final List<String> bundles) throws Exception {
    // Read update site info
    // Do this early to prevent instantiating unnecessary nodes.
    String extensionId = null;
    SiteInfo updateSite = null;
    String owner = null;
    NodeAndBundleInformation nabi = nodeAndBundleInfo;
    if (extensions != null && bundles != null) {
        // TODO: Check symbolic name and version once we support reading multiple extension versions
        String cleanedSymbolicName = NodalizerUtil.cleanSymbolicName(nabi.getFeatureSymbolicName().orElse(null));
        if (extensions.containsKey(cleanedSymbolicName)) {
            // HACK: See https://knime-com.atlassian.net/browse/AP-13547 for details
            ExtensionInfo e;
            if (cleanedSymbolicName.equals("org.knime.features.testing.core") && extensions.containsKey("org.knime.features.testing.application")) {
                e = extensions.get("org.knime.features.testing.application");
            } else {
                e = extensions.get(cleanedSymbolicName);
            }
            e.setHasNodes(true);
            updateSite = e.getUpdateSite();
            extensionId = e.getId();
            owner = e.getOwner();
            nabi = new NodeAndBundleInformation(nodeAndBundleInfo.getFactoryClass(), nodeAndBundleInfo.getBundleSymbolicName(), nodeAndBundleInfo.getBundleName(), nodeAndBundleInfo.getBundleVendor(), nodeAndBundleInfo.getNodeName(), nodeAndBundleInfo.getBundleVersion(), Optional.of(e.getSymbolicName()), Optional.ofNullable(e.getName()), Optional.ofNullable(e.getVendor()), Optional.ofNullable(e.getVersion()));
        } else if (!nabi.getFeatureSymbolicName().isPresent() && bundles.contains(nabi.getBundleSymbolicName().orElse(null))) {
            LOGGER.warn(fac.getClass() + " does not contain extension information, skipping ...");
            return;
        } else {
            // to the update site being read.
            return;
        }
    }
    @SuppressWarnings("unchecked") final org.knime.core.node.Node kcn = new org.knime.core.node.Node((NodeFactory<NodeModel>) fac);
    final NodeInfo nInfo = new NodeInfo();
    nInfo.setAdditionalSiteInformation(updateSite);
    nInfo.setBundleInformation(nabi, extensionId);
    nInfo.setOwner(owner);
    // Read from node
    final NodeSettings settings = new NodeSettings("");
    fac.saveAdditionalFactorySettings(settings);
    final String factoryName = factoryString + ConfigUtils.contentBasedHashString(settings);
    nInfo.setFactoryName(factoryName);
    nInfo.setTitle(name.trim());
    nInfo.setNodeType(kcn.getType().toString());
    nInfo.setPath(path);
    nInfo.setDeprecated(isDeprecated);
    nInfo.setStreamable(NodeUtil.isStreamable(kcn));
    nInfo.setTags(new ArrayList<>());
    nInfo.getTags().addAll(nInfo.getPath());
    if (NodeUtil.isStreamable(kcn)) {
        nInfo.getTags().add("Streamable");
    }
    // Read icon
    URL imageURL = fac.getIcon();
    if (imageURL == null) {
        imageURL = NodeFactory.class.getResource("defaulticon.png");
    }
    final String mimeType = URLConnection.guessContentTypeFromName(imageURL.getFile());
    byte[] imageBytes = null;
    try (InputStream s = imageURL.openStream()) {
        imageBytes = IOUtils.toByteArray(s);
    }
    final String iconBase64 = "data:" + mimeType + ";base64," + Base64.getEncoder().encodeToString(imageBytes);
    nInfo.setIcon(iconBase64);
    // Parse HTML, and read fields
    final Element nodeXML = fac.getXMLDescription();
    Document nodeHTML = null;
    if (nodeXML == null) {
        LOGGER.warn("Node factory XML not found for " + fac.getClass() + ". Skipping ...");
        return;
    }
    final String s = NodeFactoryHTMLCreator.instance.readFullDescription(nodeXML);
    nodeHTML = Jsoup.parse(s);
    String descriptHTML = "";
    org.jsoup.nodes.Node n = nodeHTML.getElementsByTag("p").first();
    while (n != null) {
        if (n instanceof org.jsoup.nodes.Element) {
            final org.jsoup.nodes.Element e = (org.jsoup.nodes.Element) n;
            if (e.tagName().equalsIgnoreCase("h2")) {
                n = null;
            } else if (e.hasText()) {
                descriptHTML += e.outerHtml();
                n = n.nextSibling();
            } else if (e.tagName().equalsIgnoreCase("br")) {
                descriptHTML += e.outerHtml();
                n = n.nextSibling();
            } else {
                n = n.nextSibling();
            }
        } else if (n instanceof TextNode) {
            final TextNode tn = (TextNode) n;
            descriptHTML += tn.getWholeText();
            n = n.nextSibling();
        } else {
            n = n.nextSibling();
        }
    }
    nInfo.setDescription(descriptHTML);
    parseHTML(nodeHTML, nInfo, kcn.getInteractiveViewName());
    // Read PortInfo
    final PortInfo[] inports = new PortInfo[kcn.getNrInPorts() - 1];
    final PortInfo[] outports = new PortInfo[kcn.getNrOutPorts() - 1];
    for (int i = 1; i < kcn.getNrInPorts(); i++) {
        String portDescriptHTML = fac.getInportDescription(i - 1);
        if (!nodeHTML.getElementsMatchingOwnText("Input Ports").isEmpty()) {
            final org.jsoup.nodes.Element sibling = nodeHTML.getElementsMatchingOwnText("Input Ports").first().nextElementSibling();
            if (sibling != null) {
                final Elements matches = sibling.getElementsByAttributeValue("class", "dt");
                for (final org.jsoup.nodes.Element match : matches) {
                    if (match.ownText().equals("" + (i - 1))) {
                        portDescriptHTML = NodalizerUtil.cleanHTML(match.nextElementSibling());
                        break;
                    }
                }
            }
        }
        final PortInfo port = new PortInfo(kcn.getInportName(i), portDescriptHTML, kcn.getInputType(i).isOptional(), kcn.getInputType(i).getName(), NodalizerUtil.getColorAsHex(kcn.getInputType(i).getColor()), kcn.getInputType(i).getPortObjectClass().getCanonicalName());
        inports[i - 1] = port;
    }
    for (int i = 1; i < kcn.getNrOutPorts(); i++) {
        String portDescriptHTML = fac.getOutportDescription(i - 1);
        if (!nodeHTML.getElementsMatchingOwnText("Output Ports").isEmpty()) {
            final org.jsoup.nodes.Element sibling = nodeHTML.getElementsMatchingOwnText("Output Ports").first().nextElementSibling();
            if (sibling != null) {
                final Elements matches = sibling.getElementsByAttributeValue("class", "dt");
                for (final org.jsoup.nodes.Element match : matches) {
                    if (match.ownText().equals("" + (i - 1))) {
                        portDescriptHTML = NodalizerUtil.cleanHTML(match.nextElementSibling());
                        break;
                    }
                }
            }
        }
        final PortInfo port = new PortInfo(kcn.getOutportName(i), portDescriptHTML, kcn.getOutputType(i).isOptional(), kcn.getOutputType(i).getName(), NodalizerUtil.getColorAsHex(kcn.getOutputType(i).getColor()), kcn.getOutputType(i).getPortObjectClass().getCanonicalName());
        outports[i - 1] = port;
    }
    nInfo.setInPorts(inports);
    nInfo.setOutPorts(outports);
    if (kcn.getCopyOfCreationConfig().isPresent() && kcn.getCopyOfCreationConfig().get().getPortConfig().isPresent() && fac instanceof ConfigurableNodeFactory) {
        final ModifiablePortsConfiguration portConfigs = kcn.getCopyOfCreationConfig().get().getPortConfig().get();
        final List<DynamicPortGroup> dynInports = parseDynamicPorts(nodeXML, "dynInPort", nodeHTML, "Dynamic Input Ports", portConfigs, fac.getClass().getCanonicalName());
        final List<DynamicPortGroup> dynOutports = parseDynamicPorts(nodeXML, "dynOutPort", nodeHTML, "Dynamic Output Ports", portConfigs, fac.getClass().getCanonicalName());
        nInfo.setDynInPorts(dynInports);
        nInfo.setDynOutPorts(dynOutports);
    }
    // Write to file
    NodalizerUtil.writeFile(directory, categoryPath + "/" + name + "_" + nInfo.getId().substring(1), nInfo);
}
Also used : TextNode(org.jsoup.nodes.TextNode) Element(org.w3c.dom.Element) Document(org.jsoup.nodes.Document) Elements(org.jsoup.select.Elements) URL(java.net.URL) NodeModel(org.knime.core.node.NodeModel) NodeAndBundleInformation(org.knime.core.util.workflowalizer.NodeAndBundleInformation) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) TextNode(org.jsoup.nodes.TextNode) NodeSettings(org.knime.core.node.NodeSettings) DynamicNodeFactory(org.knime.core.node.DynamicNodeFactory) ConfigurableNodeFactory(org.knime.core.node.ConfigurableNodeFactory) NodeFactory(org.knime.core.node.NodeFactory) ConfigurableNodeFactory(org.knime.core.node.ConfigurableNodeFactory) ModifiablePortsConfiguration(org.knime.core.node.context.ports.ModifiablePortsConfiguration)

Example 3 with ModifiablePortsConfiguration

use of org.knime.core.node.context.ports.ModifiablePortsConfiguration in project knime-json-node-doc-generator by NodePit.

the class JsonNodeDocuGenerator method getDynamicPorts.

/* package */
static List<DynamicPortGroup> getDynamicPorts(NodeFactory<? extends NodeModel> factory, PortDirection portDirection) {
    if (factory instanceof ConfigurableNodeFactory) {
        // TODO implement this; look at this mess:
        // https://github.com/knime/knime-workbench/commit/508b59c8f475277df5c095567c8f441eda6808cd
        // https://github.com/knime/knime-workbench/blob/master/org.knime.workbench.repository/src/eclipse/org/knime/workbench/repository/nodalizer/Nodalizer.java#L646
        @SuppressWarnings("unchecked") Node node = new Node((NodeFactory<NodeModel>) factory);
        if (node.getCopyOfCreationConfig().isPresent()) {
            ModifiableNodeCreationConfiguration nodeCreationConfig = node.getCopyOfCreationConfig().get();
            if (nodeCreationConfig.getPortConfig().isPresent()) {
                ModifiablePortsConfiguration portsConfig = nodeCreationConfig.getPortConfig().get();
                List<DynamicPortGroup> dynamicPortGroups = new ArrayList<>();
                for (String portGroupName : portsConfig.getPortGroupNames()) {
                    PortGroupConfiguration groupConfig = portsConfig.getGroup(portGroupName);
                    if (groupConfig instanceof ConfigurablePortGroup && (groupConfig.definesInputPorts() && portDirection == PortDirection.In || groupConfig.definesOutputPorts() && portDirection == PortDirection.Out)) {
                        ConfigurablePortGroup configurablePortGroup = (ConfigurablePortGroup) groupConfig;
                        PortType[] supportedTypes = configurablePortGroup.getSupportedPortTypes();
                        dynamicPortGroups.add(new DynamicPortGroup(null, null, portGroupName, null, Arrays.stream(supportedTypes).map(t -> t.getPortObjectClass().getName()).collect(Collectors.toList())));
                    }
                }
                return dynamicPortGroups;
            }
        }
    }
    return Collections.emptyList();
}
Also used : Arrays(java.util.Arrays) NodeCreationConfiguration(org.knime.core.node.context.NodeCreationConfiguration) Category(org.knime.workbench.repository.model.Category) Logger(org.apache.log4j.Logger) Node(org.knime.core.node.Node) ConfigurablePortGroup(org.knime.core.node.context.ports.ConfigurablePortGroup) Map(java.util.Map) ModifiableNodeCreationConfiguration(org.knime.core.node.context.ModifiableNodeCreationConfiguration) CategoryDocBuilder(de.philippkatz.knime.jsondocgen.docs.CategoryDoc.CategoryDocBuilder) Root(org.knime.workbench.repository.model.Root) PortGroupConfiguration(org.knime.core.node.context.ports.PortGroupConfiguration) Method(java.lang.reflect.Method) PortType(org.knime.core.node.port.PortType) PartitionInfo(org.knime.core.node.streamable.PartitionInfo) Collection(java.util.Collection) Set(java.util.Set) Display(org.eclipse.swt.widgets.Display) NodeModel(org.knime.core.node.NodeModel) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) IOUtils(org.apache.commons.io.IOUtils) List(java.util.List) SplashIconDoc(de.philippkatz.knime.jsondocgen.docs.SplashIconDoc) Port(de.philippkatz.knime.jsondocgen.docs.NodeDoc.Port) Optional(java.util.Optional) IApplicationContext(org.eclipse.equinox.app.IApplicationContext) PortObject(org.knime.core.node.port.PortObject) TransformerException(javax.xml.transform.TransformerException) HashMap(java.util.HashMap) Function(java.util.function.Function) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) PortTypeRegistry(org.knime.core.node.port.PortTypeRegistry) ConfigurableNodeFactory(org.knime.core.node.ConfigurableNodeFactory) IApplication(org.eclipse.equinox.app.IApplication) DynamicPortGroup(de.philippkatz.knime.jsondocgen.docs.NodeDoc.DynamicPortGroup) PortTypeDoc(de.philippkatz.knime.jsondocgen.docs.PortTypeDoc) NodeFactory(org.knime.core.node.NodeFactory) PortTypeDocBuilder(de.philippkatz.knime.jsondocgen.docs.PortTypeDoc.PortTypeDocBuilder) ModifiablePortsConfiguration(org.knime.core.node.context.ports.ModifiablePortsConfiguration) NodeDocBuilder(de.philippkatz.knime.jsondocgen.docs.NodeDoc.NodeDocBuilder) FileOutputStream(java.io.FileOutputStream) PortObjectSpec(org.knime.core.node.port.PortObjectSpec) File(java.io.File) IRepositoryObject(org.knime.workbench.repository.model.IRepositoryObject) IContainerObject(org.knime.workbench.repository.model.IContainerObject) NodeTemplate(org.knime.workbench.repository.model.NodeTemplate) Element(org.w3c.dom.Element) Collections(java.util.Collections) CategoryDoc(de.philippkatz.knime.jsondocgen.docs.CategoryDoc) DynamicPortGroup(de.philippkatz.knime.jsondocgen.docs.NodeDoc.DynamicPortGroup) PortGroupConfiguration(org.knime.core.node.context.ports.PortGroupConfiguration) Node(org.knime.core.node.Node) ArrayList(java.util.ArrayList) ConfigurablePortGroup(org.knime.core.node.context.ports.ConfigurablePortGroup) NodeModel(org.knime.core.node.NodeModel) ModifiableNodeCreationConfiguration(org.knime.core.node.context.ModifiableNodeCreationConfiguration) ConfigurableNodeFactory(org.knime.core.node.ConfigurableNodeFactory) ModifiablePortsConfiguration(org.knime.core.node.context.ports.ModifiablePortsConfiguration) PortType(org.knime.core.node.port.PortType)

Aggregations

ModifiablePortsConfiguration (org.knime.core.node.context.ports.ModifiablePortsConfiguration)3 ConfigurableNodeFactory (org.knime.core.node.ConfigurableNodeFactory)2 NodeFactory (org.knime.core.node.NodeFactory)2 NodeModel (org.knime.core.node.NodeModel)2 Element (org.w3c.dom.Element)2 CategoryDoc (de.philippkatz.knime.jsondocgen.docs.CategoryDoc)1 CategoryDocBuilder (de.philippkatz.knime.jsondocgen.docs.CategoryDoc.CategoryDocBuilder)1 DynamicPortGroup (de.philippkatz.knime.jsondocgen.docs.NodeDoc.DynamicPortGroup)1 NodeDocBuilder (de.philippkatz.knime.jsondocgen.docs.NodeDoc.NodeDocBuilder)1 Port (de.philippkatz.knime.jsondocgen.docs.NodeDoc.Port)1 PortTypeDoc (de.philippkatz.knime.jsondocgen.docs.PortTypeDoc)1 PortTypeDocBuilder (de.philippkatz.knime.jsondocgen.docs.PortTypeDoc.PortTypeDocBuilder)1 SplashIconDoc (de.philippkatz.knime.jsondocgen.docs.SplashIconDoc)1 ByteArrayInputStream (java.io.ByteArrayInputStream)1 File (java.io.File)1 FileOutputStream (java.io.FileOutputStream)1 InputStream (java.io.InputStream)1 Method (java.lang.reflect.Method)1 URL (java.net.URL)1 StandardCharsets (java.nio.charset.StandardCharsets)1