diff --git a/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/extension/ExtensionNodeSetFactory.java b/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/extension/ExtensionNodeSetFactory.java index f98b8c6d2..9aec2eadd 100644 --- a/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/extension/ExtensionNodeSetFactory.java +++ b/org.knime.python3.nodes/src/main/java/org/knime/python3/nodes/extension/ExtensionNodeSetFactory.java @@ -90,6 +90,7 @@ import org.knime.core.webui.node.view.NodeView; import org.knime.core.webui.node.view.NodeViewFactory; import org.knime.python3.nodes.DelegatingNodeModel; +import org.knime.python3.nodes.PythonExtensionPreferences; import org.knime.python3.nodes.dialog.DelegatingJsonSettingsDataService; import org.knime.python3.nodes.dialog.JsonFormsNodeDialog; import org.knime.python3.nodes.ports.PythonPortTypeRegistry; @@ -108,6 +109,8 @@ public abstract class ExtensionNodeSetFactory implements NodeSetFactory, Categor private static final Map ALL_EXTENSIONS = new ConcurrentHashMap<>(); + private final Supplier> m_extensionSupplier; + private final Map m_extensions; private final Map m_allNodes; @@ -120,17 +123,31 @@ public abstract class ExtensionNodeSetFactory implements NodeSetFactory, Categor * @param extensionSupplier supplier for a {@link Stream} of {@link KnimeExtension} objects. */ protected ExtensionNodeSetFactory(final Supplier> extensionSupplier) { - m_extensions = extensionSupplier.get().collect(toMap(KnimeExtension::getId, Function.identity())); - ALL_EXTENSIONS.putAll(m_extensions); + m_extensionSupplier = extensionSupplier; + m_extensions = new HashMap<>(); m_allNodes = new HashMap<>(); m_allCategories = new ArrayList<>(); - for (var extension : m_extensions.values()) { + refreshCaches(); + } + + private synchronized void refreshCaches() { + var extensions = m_extensionSupplier.get().collect(toMap(KnimeExtension::getId, Function.identity())); + m_extensions.clear(); + m_extensions.putAll(extensions); + ALL_EXTENSIONS.putAll(extensions); + m_allNodes.clear(); + m_allCategories.clear(); + for (var extension : extensions.values()) { var extensionId = extension.getId(); extension.getNodes().forEach(n -> m_allNodes.put(new NodeId(extensionId, n.getId()), n)); extension.getCategories().forEach(c -> m_allCategories.add(c)); } } + private static boolean hasCustomExtensions() { + return PythonExtensionPreferences.getPathsToCustomExtensions().findAny().isPresent(); + } + @Override public final Collection getNodeFactoryIds() { return m_allNodes.entrySet().stream().filter(entry -> !entry.getValue().isHidden()) @@ -164,6 +181,9 @@ public final ConfigRO getAdditionalSettings(final String id) { @Override public Collection getCategories() { + if (hasCustomExtensions()) { + refreshCaches(); + } return m_allCategories; }