Search in sources :

Example 6 with AbstractExplorerFileStore

use of org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore in project knime-core by knime.

the class WorkflowEditor method doSaveAs.

/**
 * {@inheritDoc}
 */
@Override
public void doSaveAs() {
    if (m_parentEditor != null) {
        // parent does it if this is a metanode editor
        m_parentEditor.doSaveAs();
        return;
    }
    URI fileResource = m_fileResource;
    Display display = Display.getDefault();
    Shell activeShell = display.getActiveShell();
    if (fileResource == null) {
        MessageDialog.openError(activeShell, "Workflow file resource", "Could not determine the save location to the workflow.");
        return;
    }
    File workflowDir = new File(fileResource);
    // Only continue if no  other editor to this workflow is open
    if (isOtherEditorToWorkflowOpen(workflowDir.toURI())) {
        MessageDialog.openError(activeShell, "\"Save As...\" not available", "\"Save As...\" is not possible while another editor to this workflow is open.");
        return;
    }
    OverwriteAndMergeInfo newLocationInfo = getNewLocation(fileResource, isTempRemoteWorkflowEditor());
    if (newLocationInfo == null) {
        // user canceled
        return;
    }
    AbstractExplorerFileStore newWorkflowDir;
    try {
        newWorkflowDir = ExplorerFileSystem.INSTANCE.getStore(new URI(newLocationInfo.getNewName()));
    } catch (URISyntaxException e2) {
        LOGGER.error("Unable to create a URI from the selected destination: " + e2.getMessage() + " Canceling the SaveAs.");
        MessageDialog.openError(getSite().getShell(), "Internal Error", "Unable to create a URI from the selected destination. \n" + e2.getMessage() + "\nCanceling the SaveAs.");
        return;
    }
    if (newLocationInfo.createSnapshot()) {
        try {
            ((RemoteExplorerFileStore) newWorkflowDir).createSnapshot(newLocationInfo.getComment());
        } catch (CoreException e) {
            String msg = "Unable to create the desired snapshot before overwriting the workflow:\n" + e.getMessage() + "\n\nCanceling the upload!";
            LOGGER.error("Unable to create the desired snapshot before overwriting the workflow: " + e.getMessage() + " Upload canceled!", e);
            MessageDialog.openError(getSite().getShell(), "Server Error", msg);
            return;
        }
    }
    if (newWorkflowDir instanceof RemoteExplorerFileStore) {
        // selected a remote location: save + upload
        if (isDirty()) {
            saveTo(m_fileResource, new NullProgressMonitor(), true, null);
        }
        AbstractExplorerFileStore localFS = getFileStore(fileResource);
        if (localFS == null || !(localFS instanceof LocalExplorerFileStore)) {
            LOGGER.error("Unable to resolve current workflow location. Flow not uploaded!");
            return;
        }
        try {
            m_workflowCanBeDeleted.acquire();
            newWorkflowDir.getContentProvider().performUploadAsync((LocalExplorerFileStore) localFS, (RemoteExplorerFileStore) newWorkflowDir, /*deleteSource=*/
            false, false, t -> m_workflowCanBeDeleted.release());
        } catch (CoreException | InterruptedException e) {
            String msg = "\"Save As...\" failed to upload the workflow to the selected remote location\n(" + e.getMessage() + ")";
            LOGGER.error(msg, e);
            MessageDialog.openError(activeShell, "\"Save As...\" failed.", msg);
        }
    // no need to change any registered locations as this was a save+upload (didn't change flow location)
    } else {
        // this is messy. Some methods want the URI with the folder, others the file store denoting workflow.knime
        AbstractExplorerFileStore newWorkflowFile = newWorkflowDir.getChild(WorkflowPersistor.WORKFLOW_FILE);
        File localNewWorkflowDir = null;
        try {
            localNewWorkflowDir = newWorkflowDir.toLocalFile();
        } catch (CoreException e1) {
            LOGGER.error("Unable to resolve selection to local file path: " + e1.getMessage(), e1);
            return;
        }
        File mountPointRoot = null;
        try {
            mountPointRoot = newWorkflowDir.getContentProvider().getFileStore("/").toLocalFile();
        } catch (CoreException ex) {
            LOGGER.warn("Could not determine mount point root for " + newWorkflowDir + ": " + ex.getMessage(), ex);
        }
        WorkflowContext context = new WorkflowContext.Factory(m_manager.getContext()).setCurrentLocation(localNewWorkflowDir).setMountpointRoot(mountPointRoot).setMountpointURI(newWorkflowDir.toURI()).createContext();
        saveTo(localNewWorkflowDir.toURI(), new NullProgressMonitor(), true, context);
        setInput(new FileStoreEditorInput(newWorkflowFile));
        if (newWorkflowDir.getParent() != null) {
            newWorkflowDir.getParent().refresh();
        }
        registerProject(localNewWorkflowDir);
    }
}
Also used : NullProgressMonitor(org.eclipse.core.runtime.NullProgressMonitor) LocalExplorerFileStore(org.knime.workbench.explorer.filesystem.LocalExplorerFileStore) WorkflowContext(org.knime.core.node.workflow.WorkflowContext) NodeFactory(org.knime.core.node.NodeFactory) URISyntaxException(java.net.URISyntaxException) URI(java.net.URI) Shell(org.eclipse.swt.widgets.Shell) OverwriteAndMergeInfo(org.knime.workbench.explorer.view.dialogs.OverwriteAndMergeInfo) CoreException(org.eclipse.core.runtime.CoreException) AbstractExplorerFileStore(org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore) RemoteExplorerFileStore(org.knime.workbench.explorer.filesystem.RemoteExplorerFileStore) ReferencedFile(org.knime.core.internal.ReferencedFile) File(java.io.File) FileStoreEditorInput(org.eclipse.ui.ide.FileStoreEditorInput) Display(org.eclipse.swt.widgets.Display)

Example 7 with AbstractExplorerFileStore

use of org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore in project knime-core by knime.

the class WorkflowEditor method getNewLocation.

/**
 * For SaveAs...
 * @param currentLocation
 * @param allowRemoteLocation local and remote mount points are added to the selection dialog
 * @return new (different!) URI or null if user canceled. Caller should create a snapshot if told so.
 */
private OverwriteAndMergeInfo getNewLocation(final URI currentLocation, final boolean allowRemoteLocation) {
    final AbstractExplorerFileStore currentStore = getFileStore(currentLocation);
    AbstractExplorerFileStore currentParent = null;
    if (currentStore != null) {
        currentParent = currentStore.getParent();
    }
    String currentName = new Path(currentLocation.getPath()).lastSegment();
    List<String> selIDs = new LinkedList<String>();
    for (String id : ExplorerMountTable.getAllVisibleMountIDs()) {
        AbstractContentProvider provider = ExplorerMountTable.getMountPoint(id).getProvider();
        if (!provider.isRemote() || (allowRemoteLocation && provider.isWritable())) {
            selIDs.add(id);
        }
    }
    ContentObject preSel = ContentObject.forFile(currentParent);
    if (isTempRemoteWorkflowEditor()) {
        AbstractExplorerFileStore remoteStore = null;
        try {
            remoteStore = ExplorerFileSystem.INSTANCE.getStore(m_origRemoteLocation);
        } catch (IllegalArgumentException e) {
        /* don't preselect on unknown original location */
        }
        if (remoteStore != null) {
            preSel = ContentObject.forFile(remoteStore);
        } else {
            preSel = null;
        }
    }
    OverwriteAndMergeInfo result = null;
    while (result == null) {
        // keep the selection dialog open until we get a useful result
        final SpaceResourceSelectionDialog dialog = new SpaceResourceSelectionDialog(getSite().getShell(), selIDs.toArray(new String[selIDs.size()]), preSel);
        SaveAsValidator validator = new SaveAsValidator(dialog, currentStore);
        String defName = currentName + " - Copy";
        if (!isTempRemoteWorkflowEditor()) {
            if (currentParent != null) {
                try {
                    Set<String> childs = new HashSet<String>(Arrays.asList(currentParent.childNames(EFS.NONE, null)));
                    defName = guessNewWorkflowNameOnSaveAs(childs, currentName);
                } catch (CoreException e1) {
                // keep the simple default
                }
            }
        } else {
            defName = currentName;
            if (defName.endsWith("." + KNIMEConstants.KNIME_WORKFLOW_FILE_EXTENSION)) {
                defName = defName.substring(0, defName.length() - KNIMEConstants.KNIME_WORKFLOW_FILE_EXTENSION.length() - 1);
            }
        }
        dialog.setTitle("Save to new Location");
        dialog.setDescription("Select the new destination workflow group for the workflow.");
        dialog.setValidator(validator);
        // Setup the name field of the dialog
        dialog.setNameFieldEnabled(true);
        dialog.setNameFieldDefaultValue(defName);
        final AtomicBoolean proceed = new AtomicBoolean(false);
        Display.getDefault().syncExec(new Runnable() {

            @Override
            public void run() {
                proceed.set(dialog.open() == Window.OK);
            }
        });
        if (!proceed.get()) {
            return null;
        }
        AbstractExplorerFileStore newLocation = dialog.getSelection();
        if (newLocation.fetchInfo().isWorkflowGroup()) {
            newLocation = newLocation.getChild(dialog.getNameFieldValue());
        } else {
            // in case they have selected a flow but changed the name in the name field afterwards
            newLocation = newLocation.getParent().getChild(dialog.getNameFieldValue());
        }
        assert !newLocation.fetchInfo().exists() || newLocation.fetchInfo().isWorkflow();
        if (newLocation.fetchInfo().exists()) {
            // confirm overwrite (with snapshot?)
            final AtomicBoolean snapshotSupported = new AtomicBoolean(false);
            final AtomicReference<SnapshotPanel> snapshotPanel = new AtomicReference<SnapshotPanel>(null);
            if (newLocation.getContentProvider().supportsSnapshots() && (newLocation instanceof RemoteExplorerFileStore)) {
                snapshotSupported.set(true);
            }
            MessageDialog dlg = new MessageDialog(getSite().getShell(), "Confirm SaveAs Overwrite", null, "The selected destination\n\n\t" + newLocation.getMountIDWithFullPath() + "\n\nalready exists. Do you want to overwrite?\n", MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, IDialogConstants.CANCEL_LABEL }, 1) {

                /**
                 * {@inheritDoc}
                 */
                @Override
                protected Control createCustomArea(final Composite parent) {
                    if (snapshotSupported.get()) {
                        snapshotPanel.set(new SnapshotPanel(parent, SWT.NONE));
                        snapshotPanel.get().setEnabled(true);
                        return snapshotPanel.get();
                    } else {
                        return null;
                    }
                }
            };
            int dlgResult = dlg.open();
            if (dlgResult == 2) /* CANCEL */
            {
                return null;
            }
            if (dlgResult == 0) {
                /* YES (= please overwrite) */
                if (snapshotPanel.get() != null) {
                    SnapshotPanel snapPanel = snapshotPanel.get();
                    result = new OverwriteAndMergeInfo(newLocation.toURI().toASCIIString(), false, true, snapPanel.createSnapshot(), snapPanel.getComment());
                } else {
                    result = new OverwriteAndMergeInfo(newLocation.toURI().toASCIIString(), false, true, false, "");
                }
            } else {
                /* NO, don't overwrite: continue while loop asking for a different location */
                preSel = ContentObject.forFile(newLocation);
                currentName = newLocation.getName();
            }
        } else {
            result = new OverwriteAndMergeInfo(newLocation.toURI().toASCIIString(), false, false, false, "");
        }
    }
    /* end of while (result != null) keep the target selection dialog open */
    return result;
}
Also used : Path(org.eclipse.core.runtime.Path) SaveAsValidator(org.knime.workbench.explorer.dialogs.SaveAsValidator) Composite(org.eclipse.swt.widgets.Composite) AtomicReference(java.util.concurrent.atomic.AtomicReference) SnapshotPanel(org.knime.workbench.explorer.view.dialogs.SnapshotPanel) LinkedList(java.util.LinkedList) ContentObject(org.knime.workbench.explorer.view.ContentObject) Point(org.eclipse.draw2d.geometry.Point) PrecisionPoint(org.eclipse.draw2d.geometry.PrecisionPoint) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) OverwriteAndMergeInfo(org.knime.workbench.explorer.view.dialogs.OverwriteAndMergeInfo) SpaceResourceSelectionDialog(org.knime.workbench.explorer.dialogs.SpaceResourceSelectionDialog) CoreException(org.eclipse.core.runtime.CoreException) AbstractExplorerFileStore(org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore) AbstractContentProvider(org.knime.workbench.explorer.view.AbstractContentProvider) RemoteExplorerFileStore(org.knime.workbench.explorer.filesystem.RemoteExplorerFileStore) MessageDialog(org.eclipse.jface.dialogs.MessageDialog) HashSet(java.util.HashSet)

Example 8 with AbstractExplorerFileStore

use of org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore in project knime-core by knime.

the class WorkflowEditorSelectionDropListener method isEnabled.

/**
 * {@inheritDoc}
 */
@Override
public boolean isEnabled(final DropTargetEvent event) {
    if (!super.isEnabled(event)) {
        return false;
    }
    AbstractExplorerFileStore fileStore = getDragResources(event).getObject();
    boolean enabled = !(AbstractExplorerFileStore.isMetaNode(fileStore) || AbstractExplorerFileStore.isWorkflow(fileStore) || AbstractExplorerFileStore.isWorkflowTemplate(fileStore) || AbstractExplorerFileStore.isWorkflowGroup(fileStore));
    if (enabled) {
        event.feedback = DND.FEEDBACK_SELECT;
        event.operations = DND.DROP_DEFAULT;
        event.detail = DND.DROP_DEFAULT;
    }
    return enabled;
}
Also used : AbstractExplorerFileStore(org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore)

Example 9 with AbstractExplorerFileStore

use of org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore in project knime-core by knime.

the class NewWorkflowContainerEditPolicy method getCreateCommand.

/**
 * {@inheritDoc}
 */
@Override
protected Command getCreateCommand(final CreateRequest request) {
    // point where the command occurred
    // The node/description should be initially located here
    boolean snapToGrid = WorkflowEditor.getActiveEditorSnapToGrid();
    WorkflowRootEditPart workflowPart = (WorkflowRootEditPart) this.getHost();
    if (!Wrapper.wraps(workflowPart.getWorkflowManager(), WorkflowManager.class)) {
        // adding new nodes not supported yet by UI-interfaces and implemenations
        LOGGER.error("Adding new nodes not supported by '" + workflowPart.getWorkflowManager().getClass().getSimpleName() + "'.");
        return null;
    }
    WorkflowManager manager = Wrapper.unwrapWFM(workflowPart.getWorkflowManager());
    if (request instanceof CreateDropRequest) {
        Object obj = request.getNewObject();
        CreateDropRequest cdr = (CreateDropRequest) request;
        if (obj instanceof NodeFactory) {
            return handleNodeDrop(manager, (NodeFactory<? extends NodeModel>) obj, cdr);
        } else if (obj instanceof AbstractExplorerFileStore) {
            AbstractExplorerFileStore fs = (AbstractExplorerFileStore) obj;
            if (AbstractExplorerFileStore.isWorkflowTemplate(fs)) {
                return handleMetaNodeTemplateDrop(manager, cdr, fs);
            }
        } else if (obj instanceof WorkflowPersistor) {
            return handleMetaNodeDrop(manager, (WorkflowPersistor) obj, cdr);
        } else if (obj instanceof ReaderNodeSettings) {
            ReaderNodeSettings settings = (ReaderNodeSettings) obj;
            return new DropNodeCommand(manager, settings.getFactory(), new NodeCreationContext(settings.getUrl()), request.getLocation(), snapToGrid);
        } else {
            LOGGER.error("Illegal drop object: " + obj);
        }
    }
    return null;
}
Also used : CreateDropRequest(org.knime.workbench.editor2.CreateDropRequest) DropNodeCommand(org.knime.workbench.editor2.commands.DropNodeCommand) ReaderNodeSettings(org.knime.workbench.editor2.ReaderNodeSettings) NodeFactory(org.knime.core.node.NodeFactory) AbstractExplorerFileStore(org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore) WorkflowRootEditPart(org.knime.workbench.editor2.editparts.WorkflowRootEditPart) WorkflowManager(org.knime.core.node.workflow.WorkflowManager) WorkflowPersistor(org.knime.core.node.workflow.WorkflowPersistor) NodeCreationContext(org.knime.core.node.NodeCreationContext)

Example 10 with AbstractExplorerFileStore

use of org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore in project knime-core by knime.

the class RevealSubNodeTemplateAction method runOnNodes.

/**
 * {@inheritDoc}
 */
@Override
public void runOnNodes(final NodeContainerEditPart[] nodes) {
    List<NodeID> candidateList = new ArrayList<NodeID>();
    List<AbstractExplorerFileStore> templates = new ArrayList<AbstractExplorerFileStore>();
    for (NodeContainerEditPart p : nodes) {
        Object model = p.getModel();
        if (wraps(model, SubNodeContainer.class)) {
            NodeContext.pushContext(Wrapper.unwrapNC(p.getNodeContainer()));
            try {
                SubNodeContainer snc = unwrap((UI) model, SubNodeContainer.class);
                MetaNodeTemplateInformation i = snc.getTemplateInformation();
                if (Role.Link.equals(i.getRole())) {
                    candidateList.add(snc.getID());
                    AbstractExplorerFileStore template = ExplorerFileSystem.INSTANCE.getStore(i.getSourceURI());
                    if (template != null) {
                        templates.add(template);
                    }
                }
            } finally {
                NodeContext.removeLastContext();
            }
        }
    }
    List<Object> treeObjects = ContentDelegator.getTreeObjectList(templates);
    if (treeObjects != null && treeObjects.size() > 0) {
        IViewReference[] views = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViewReferences();
        for (IViewReference view : views) {
            if (ExplorerView.ID.equals(view.getId())) {
                ExplorerView explorerView = (ExplorerView) view.getView(true);
                explorerView.getViewer().setSelection(new StructuredSelection(treeObjects), true);
            }
        }
    }
}
Also used : ExplorerView(org.knime.workbench.explorer.view.ExplorerView) ArrayList(java.util.ArrayList) StructuredSelection(org.eclipse.jface.viewers.StructuredSelection) SubNodeContainer(org.knime.core.node.workflow.SubNodeContainer) NodeContainerEditPart(org.knime.workbench.editor2.editparts.NodeContainerEditPart) AbstractExplorerFileStore(org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore) IViewReference(org.eclipse.ui.IViewReference) NodeID(org.knime.core.node.workflow.NodeID) MetaNodeTemplateInformation(org.knime.core.node.workflow.MetaNodeTemplateInformation)

Aggregations

AbstractExplorerFileStore (org.knime.workbench.explorer.filesystem.AbstractExplorerFileStore)19 URI (java.net.URI)6 AbstractContentProvider (org.knime.workbench.explorer.view.AbstractContentProvider)6 CoreException (org.eclipse.core.runtime.CoreException)5 LocalExplorerFileStore (org.knime.workbench.explorer.filesystem.LocalExplorerFileStore)5 ArrayList (java.util.ArrayList)4 Shell (org.eclipse.swt.widgets.Shell)4 NodeID (org.knime.core.node.workflow.NodeID)4 WorkflowManager (org.knime.core.node.workflow.WorkflowManager)4 NodeContainerEditPart (org.knime.workbench.editor2.editparts.NodeContainerEditPart)4 ContentObject (org.knime.workbench.explorer.view.ContentObject)4 File (java.io.File)3 IOException (java.io.IOException)3 ReferencedFile (org.knime.core.internal.ReferencedFile)3 SubNodeContainer (org.knime.core.node.workflow.SubNodeContainer)3 WorkflowContext (org.knime.core.node.workflow.WorkflowContext)3 WorkflowManagerUI (org.knime.core.ui.node.workflow.WorkflowManagerUI)3 SpaceResourceSelectionDialog (org.knime.workbench.explorer.dialogs.SpaceResourceSelectionDialog)3 AbstractExplorerFileInfo (org.knime.workbench.explorer.filesystem.AbstractExplorerFileInfo)3 RemoteExplorerFileStore (org.knime.workbench.explorer.filesystem.RemoteExplorerFileStore)3