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));
}
}
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);
}
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();
}
Aggregations