--- /dev/null
+package org.argeo.slc.client.ui.dist.commands;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import org.argeo.cms.ArgeoNames;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.dist.DistPlugin;
+import org.argeo.slc.client.ui.dist.editors.DistWkspEditorInput;
+import org.argeo.slc.client.ui.dist.editors.DistWorkspaceEditor;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Open a distribution workspace editor for a given workspace in a repository
+ */
+public class OpenWorkspaceEditor extends AbstractHandler {
+ public final static String ID = DistPlugin.PLUGIN_ID
+ + ".openWorkspaceEditor";
+ public final static String DEFAULT_LABEL = "Open editor";
+ public final static ImageDescriptor DEFAULT_ICON = DistPlugin
+ .getImageDescriptor("icons/distribution_perspective.gif");
+
+ // Use local node repo and repository factory to retrieve and log to
+ // relevant repository
+ public final static String PARAM_REPO_NODE_PATH = "param.repoNodePath";
+ // Use URI and repository factory to retrieve and ANONYMOUSLY log in
+ // relevant repository
+ public final static String PARAM_REPO_URI = "param.repoUri";
+ public final static String PARAM_WORKSPACE_NAME = "param.workspaceName";
+
+ /* DEPENDENCY INJECTION */
+ private Repository localRepository;
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ String repoNodePath = event.getParameter(PARAM_REPO_NODE_PATH);
+ String repoUri = event.getParameter(PARAM_REPO_URI);
+ String workspaceName = event.getParameter(PARAM_WORKSPACE_NAME);
+
+ Session defaultSession = null;
+ if (repoNodePath != null && repoUri == null) {
+ try {
+ defaultSession = localRepository.login();
+ if (defaultSession.nodeExists(repoNodePath)) {
+ Node repoNode = defaultSession.getNode(repoNodePath);
+ repoUri = repoNode.getProperty(ArgeoNames.ARGEO_URI)
+ .getString();
+ }
+ } catch (RepositoryException e) {
+ throw new SlcException("Unexpected error while "
+ + "getting repoNode at path " + repoNodePath, e);
+ } finally {
+ JcrUtils.logoutQuietly(defaultSession);
+ }
+ }
+
+ DistWkspEditorInput wei = new DistWkspEditorInput(repoNodePath,
+ repoUri, workspaceName);
+ try {
+ HandlerUtil.getActiveWorkbenchWindow(event).getActivePage()
+ .openEditor(wei, DistWorkspaceEditor.ID);
+ } catch (PartInitException e) {
+ throw new SlcException("Unexpected error while "
+ + "opening editor for workspace " + workspaceName
+ + " with URI " + repoUri + " and repoNode at path "
+ + repoNodePath, e);
+ }
+ return null;
+ }
+
+ /* DEPENDENCY INJECTION */
+ public void setLocalRepository(Repository localRepository) {
+ this.localRepository = localRepository;
+ }
+}
\ No newline at end of file