Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -188,16 +189,16 @@ 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) {
// dialog has been cancelled - no changes
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)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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} */
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -418,16 +414,14 @@ private void setItemVersionList(final List<NamedItemVersion> 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();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,16 @@
*/
package org.knime.workbench.editor2.commands;

import java.net.URISyntaxException;
import java.time.Instant;

import org.eclipse.gef.commands.CompoundCommand;
import org.knime.core.node.NodeLogger;
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.
Expand All @@ -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();
Expand All @@ -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;
Expand All @@ -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);
}
}

Expand Down