diff --git a/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/BulkChangeMetaNodeLinksDialog.java b/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/BulkChangeMetaNodeLinksDialog.java index 013857fa8..66068bd29 100644 --- a/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/BulkChangeMetaNodeLinksDialog.java +++ b/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/BulkChangeMetaNodeLinksDialog.java @@ -104,6 +104,7 @@ import org.knime.core.util.pathresolve.ResolverUtil; import org.knime.core.util.pathresolve.URIToFileResolve.KNIMEURIDescription; import org.knime.core.util.urlresolve.KnimeUrlResolver.KnimeUrlVariant; +import org.knime.core.util.urlresolve.URLResolverUtil; import org.knime.workbench.core.imports.ImportForbiddenException; import org.knime.workbench.core.imports.RepoObjectImport; import org.knime.workbench.core.imports.URIImporterFinder; @@ -568,10 +569,13 @@ private void openVersionChangeDialog() { return; } final var targetVersion = dialog.getSelectedVersion(); - final var newUri = targetVersion.applyTo(m_selectedLinkURI); - m_selectedLinkURI = newUri; - m_uriTextField.setText(newUri.toString()); - m_uriInputViaText = false; + try { + m_selectedLinkURI = URLResolverUtil.applyTo(targetVersion, m_selectedLinkURI); + m_uriTextField.setText(m_selectedLinkURI.toString()); + m_uriInputViaText = false; + } catch (URISyntaxException e) { + LOGGER.error("Unable to construct new URI for component: " + componentRepresentative.getNameWithID(), e); + } } /** diff --git a/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionAction.java b/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionAction.java index f15bef53a..3c0c65dc1 100644 --- a/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionAction.java +++ b/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionAction.java @@ -58,7 +58,8 @@ import org.knime.core.ui.node.workflow.SubNodeContainerUI; import org.knime.core.ui.util.SWTUtilities; import org.knime.core.ui.wrapper.Wrapper; -import org.knime.core.util.hub.HubItemVersion; +import org.knime.core.util.hub.ItemVersion; +import org.knime.core.util.urlresolve.URLResolverUtil; import org.knime.workbench.KNIMEEditorPlugin; import org.knime.workbench.core.util.ImageRepository; import org.knime.workbench.editor2.WorkflowEditor; @@ -188,9 +189,6 @@ public void runInSWT() { return; } - final var previousVersion = HubItemVersion.of(component.getTemplateInformation().getSourceURI()) // - .orElse(HubItemVersion.currentState()); - // prompt for target version final var dialog = new ChangeComponentHubVersionDialog(shell, component, manager); if (dialog.open() != 0) { @@ -198,6 +196,9 @@ public void runInSWT() { return; } + final var uri = component.getTemplateInformation().getSourceURI(); + final var previousVersion = URLResolverUtil.parseVersion(uri.getQuery()).orElseGet(ItemVersion::currentState); + // only do something if versions differ final var targetVersion = dialog.getSelectedVersion(); if (!Objects.equals(targetVersion, previousVersion)) { diff --git a/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionDialog.java b/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionDialog.java index 2e3998fc5..5be3a9198 100644 --- a/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionDialog.java +++ b/org.knime.workbench.editor/src/org/knime/workbench/editor2/actions/ChangeComponentHubVersionDialog.java @@ -87,13 +87,16 @@ import org.knime.core.node.NodeLogger; import org.knime.core.node.workflow.NodeContext; import org.knime.core.node.workflow.SubNodeContainer; -import org.knime.core.node.workflow.TemplateUpdateUtil.LinkType; import org.knime.core.node.workflow.WorkflowManager; import org.knime.core.ui.util.SWTUtilities; -import org.knime.core.util.hub.HubItemVersion; +import org.knime.core.util.hub.CurrentState; +import org.knime.core.util.hub.ItemVersion; +import org.knime.core.util.hub.MostRecent; import org.knime.core.util.hub.NamedItemVersion; +import org.knime.core.util.hub.SpecificVersion; import org.knime.core.util.pathresolve.ResolverUtil; import org.knime.core.util.pathresolve.URIToFileResolve.KNIMEURIDescription; +import org.knime.core.util.urlresolve.URLResolverUtil; import org.knime.workbench.ui.KNIMEUIPlugin; import org.knime.workbench.ui.preferences.PreferenceConstants; @@ -114,9 +117,7 @@ public final class ChangeComponentHubVersionDialog extends Dialog { /** The component to change version of. */ private final SubNodeContainer m_component; - private LinkType m_selectedLinkType; - - private Integer m_selectedItemVersion; + private ItemVersion m_selectedItemVersion; /** Fetched using a {@link FetchVersionListJob} */ @@ -153,8 +154,7 @@ public ChangeComponentHubVersionDialog(final Shell parent, final SubNodeContaine super(parent); m_manager = manager; m_component = subNodeContainer; - m_selectedLinkType = LinkType.LATEST_STATE; - m_selectedItemVersion = null; + m_selectedItemVersion = ItemVersion.currentState(); } @Override @@ -177,22 +177,22 @@ protected Control createDialogArea(final Composite parent) { final var buttonGroup = new Composite(content, SWT.NONE); buttonGroup.setLayout(new RowLayout()); - final var link = HubItemVersion.of(m_component.getTemplateInformation().getSourceURI()) // - .orElse(HubItemVersion.currentState()); + final var uri = m_component.getTemplateInformation().getSourceURI(); + final var version = URLResolverUtil.parseVersion(uri.getQuery()).orElseGet(ItemVersion::currentState); m_useSpecificVersionCheckBox = new Button(buttonGroup, SWT.RADIO); m_useSpecificVersionCheckBox.setText("Specific version "); - m_useSpecificVersionCheckBox.setSelection(link.linkType() == LinkType.FIXED_VERSION); + m_useSpecificVersionCheckBox.setSelection(version instanceof SpecificVersion); m_useSpecificVersionCheckBox.addListener(SWT.Selection, l -> sync()); m_useLatestVersionCheckBox = new Button(buttonGroup, SWT.RADIO); m_useLatestVersionCheckBox.setText("Latest version "); - m_useLatestVersionCheckBox.setSelection(link.linkType() == LinkType.LATEST_VERSION); + m_useLatestVersionCheckBox.setSelection(version instanceof MostRecent); m_useLatestVersionCheckBox.addListener(SWT.Selection, l -> sync()); m_useLatestStateCheckBox = new Button(buttonGroup, SWT.RADIO); m_useLatestStateCheckBox.setText("Latest edits"); - m_useLatestStateCheckBox.setSelection(link.linkType() == LinkType.LATEST_STATE); + m_useLatestStateCheckBox.setSelection(version instanceof CurrentState); m_useLatestStateCheckBox.addListener(SWT.Selection, l -> sync()); // holds the table and defines its resizing behavior var tableComp = new Composite(parent1, SWT.NONE); @@ -227,27 +227,24 @@ private void sync() { final boolean okEnabled; final var table = m_tableViewer.getTable(); - final LinkType selectedLinkType; - Integer selectedItemVersion = null; + ItemVersion selectedItemVersion = null; if (m_useLatestStateCheckBox.getSelection()) { - selectedLinkType = LinkType.LATEST_STATE; + selectedItemVersion = ItemVersion.currentState(); okEnabled = m_useLatestStateCheckBox.isEnabled(); table.setEnabled(false); } else if (m_useLatestVersionCheckBox.getSelection()) { - selectedLinkType = LinkType.LATEST_VERSION; + selectedItemVersion = ItemVersion.mostRecent(); okEnabled = m_useLatestVersionCheckBox.isEnabled(); table.setEnabled(false); } else { - selectedLinkType = LinkType.FIXED_VERSION; if (table.getSelectionIndex() != -1 && m_versions != null) { int index = table.getSelectionIndex(); // the table is not sortable, the i-th row always corresponds to the i-th item version - selectedItemVersion = m_versions.get(index).version(); + selectedItemVersion = ItemVersion.of(m_versions.get(index).version()); } table.setEnabled(m_useSpecificVersionCheckBox.isEnabled()); okEnabled = m_useSpecificVersionCheckBox.isEnabled() && selectedItemVersion != null; } - m_selectedLinkType = selectedLinkType; m_selectedItemVersion = selectedItemVersion; final var okButton = getButton(IDialogConstants.OK_ID); @@ -295,9 +292,8 @@ private static TableViewer createTableViewer(final Composite parent) { /** * @return selected link item version */ - public HubItemVersion getSelectedVersion() { - return new HubItemVersion(m_selectedLinkType, - m_selectedLinkType == LinkType.FIXED_VERSION ? m_selectedItemVersion : null); + public ItemVersion getSelectedVersion() { + return m_selectedItemVersion; } @Override @@ -418,16 +414,14 @@ private void setItemVersionList(final List list) { m_tableViewer.setInput(m_versions); final var uri = m_component.getTemplateInformation().getSourceURI(); - final var initialLinkPair = HubItemVersion.of(uri).orElse(HubItemVersion.currentState()); + final var version = URLResolverUtil.parseVersion(uri.getQuery()).orElseGet(ItemVersion::currentState); - if (initialLinkPair.linkType() == LinkType.FIXED_VERSION) { + if (version instanceof SpecificVersion specific) { // pre-select current version in the list - - rowIdxForItemVersion(initialLinkPair.versionNumber())// + rowIdxForItemVersion(specific.version())// .map(m_tableViewer::getElementAt)// .ifPresent(o -> m_tableViewer.setSelection(new StructuredSelection(o), true)); } - sync(); } diff --git a/org.knime.workbench.editor/src/org/knime/workbench/editor2/commands/ChangeComponentHubVersionCommand.java b/org.knime.workbench.editor/src/org/knime/workbench/editor2/commands/ChangeComponentHubVersionCommand.java index d43f73b79..1bca775b4 100644 --- a/org.knime.workbench.editor/src/org/knime/workbench/editor2/commands/ChangeComponentHubVersionCommand.java +++ b/org.knime.workbench.editor/src/org/knime/workbench/editor2/commands/ChangeComponentHubVersionCommand.java @@ -46,6 +46,7 @@ */ package org.knime.workbench.editor2.commands; +import java.net.URISyntaxException; import java.time.Instant; import org.eclipse.gef.commands.CompoundCommand; @@ -53,7 +54,8 @@ import org.knime.core.node.workflow.NodeID; import org.knime.core.node.workflow.SubNodeContainer; import org.knime.core.node.workflow.WorkflowManager; -import org.knime.core.util.hub.HubItemVersion; +import org.knime.core.util.hub.ItemVersion; +import org.knime.core.util.urlresolve.URLResolverUtil; /** * A compound command that first changes the link (source URI) of a linked Component and then performs an update. @@ -64,7 +66,7 @@ public class ChangeComponentHubVersionCommand extends AbstractKNIMECommand { private final SubNodeContainer m_component; - private final HubItemVersion m_targetVersion; + private final ItemVersion m_targetVersion; /** To achieve a version change, the source URI is modified and then an update is performed. */ private final CompoundCommand m_commandRegistry = new CompoundCommand(); @@ -75,7 +77,7 @@ public class ChangeComponentHubVersionCommand extends AbstractKNIMECommand { * @param targetVersion */ public ChangeComponentHubVersionCommand(final WorkflowManager manager, final SubNodeContainer component, - final HubItemVersion targetVersion) { + final ItemVersion targetVersion) { super(manager); m_component = component; @@ -93,12 +95,16 @@ public void execute() { private void doLinkURIChange() { final var templateInfo = m_component.getTemplateInformation(); final var oldUri = templateInfo.getSourceURI(); - final var targetUri = m_targetVersion.applyTo(oldUri); - final var changeCommand = new ChangeSubNodeLinkCommand(getHostWFM(), m_component, - oldUri, templateInfo.getTimestampInstant(), targetUri, Instant.EPOCH); - if (changeCommand.canExecute()) { - changeCommand.execute(); - m_commandRegistry.add(changeCommand); + try { + final var targetUri = URLResolverUtil.applyTo(m_targetVersion, oldUri); + final var changeCommand = new ChangeSubNodeLinkCommand(getHostWFM(), m_component, oldUri, + templateInfo.getTimestampInstant(), targetUri, Instant.EPOCH); + if (changeCommand.canExecute()) { + changeCommand.execute(); + m_commandRegistry.add(changeCommand); + } + } catch (URISyntaxException e) { + LOGGER.error("Unable to construct new URI for component: " + m_component.getNameWithID(), e); } }