/*
- * Copyright (C) 2007-2012 Mathieu Baudier
+ * Copyright (C) 2007-2012 Argeo GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
package org.argeo.slc.client.ui.dist.views;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import javax.jcr.Credentials;
-import javax.jcr.GuestCredentials;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
-import javax.jcr.RepositoryFactory;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.eclipse.ui.AbstractTreeContentProvider;
-import org.argeo.eclipse.ui.ErrorFeedback;
+
import org.argeo.eclipse.ui.TreeParent;
-import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.slc.SlcException;
import org.argeo.slc.client.ui.dist.DistPlugin;
import org.argeo.slc.client.ui.dist.commands.CopyWorkspace;
import org.argeo.slc.client.ui.dist.commands.CreateWorkspace;
import org.argeo.slc.client.ui.dist.commands.DeleteWorkspace;
-import org.argeo.slc.client.ui.dist.commands.ManageWorkspaceAuth;
+import org.argeo.slc.client.ui.dist.commands.DisplayRepoInformation;
+import org.argeo.slc.client.ui.dist.commands.Fetch;
+import org.argeo.slc.client.ui.dist.commands.MergeWorkspaces;
import org.argeo.slc.client.ui.dist.commands.NormalizeDistribution;
-import org.argeo.slc.client.ui.dist.editors.DistributionEditor;
-import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput;
+import org.argeo.slc.client.ui.dist.commands.PublishWorkspace;
+import org.argeo.slc.client.ui.dist.commands.RefreshDistributionsView;
+import org.argeo.slc.client.ui.dist.commands.RegisterRepository;
+import org.argeo.slc.client.ui.dist.commands.UnregisterRemoteRepo;
+import org.argeo.slc.client.ui.dist.controllers.DistTreeComparator;
+import org.argeo.slc.client.ui.dist.controllers.DistTreeContentProvider;
+import org.argeo.slc.client.ui.dist.controllers.DistTreeDoubleClickListener;
+import org.argeo.slc.client.ui.dist.controllers.DistTreeLabelProvider;
+import org.argeo.slc.client.ui.dist.model.DistParentElem;
+import org.argeo.slc.client.ui.dist.model.GroupElem;
+import org.argeo.slc.client.ui.dist.model.RepoElem;
+import org.argeo.slc.client.ui.dist.model.WorkspaceElem;
import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
import org.argeo.slc.jcr.SlcNames;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerDropAdapter;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceAdapter;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
/**
- * Browse and manipulate distributions (like merge, rename, etc.). Only support
- * one single repository currently.
+ * Browse, manipulate and manage distributions accross multiple repositories
+ * (like fetch, merge, publish, etc.).
*/
-
-public class DistributionsView extends ViewPart implements SlcNames {
- private final static Log log = LogFactory.getLog(DistributionsView.class);
+public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames {
+ // private final static Log log =
+ // LogFactory.getLog(DistributionsView.class);
public final static String ID = DistPlugin.ID + ".distributionsView";
- private Repository repository;
- private RepositoryFactory repositoryFactory;
+ /* DEPENDENCY INJECTION */
+ private Repository nodeRepository;
+ private DistTreeContentProvider treeContentProvider;
private TreeViewer viewer;
- private List<RepositoryElem> repositories = new ArrayList<DistributionsView.RepositoryElem>();
-
@Override
public void createPartControl(Composite parent) {
// Define the TableViewer
| SWT.FULL_SELECTION | SWT.BORDER);
TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.NONE);
- col.getColumn().setWidth(200);
- col.getColumn().setText("Workspace");
- col.setLabelProvider(new ColumnLabelProvider() {
- @Override
- public String getText(Object element) {
- return element.toString();
- }
- });
+ col.getColumn().setWidth(400);
+ col.setLabelProvider(new DistTreeLabelProvider());
+
+ final Tree tree = viewer.getTree();
+ tree.setHeaderVisible(false);
+ tree.setLinesVisible(false);
+
+ // viewer.setContentProvider(new DistTreeContentProvider());
+ viewer.setContentProvider(treeContentProvider);
+ viewer.addDoubleClickListener(new DistTreeDoubleClickListener());
+ viewer.setComparator(new DistTreeComparator());
- final Tree table = viewer.getTree();
- table.setHeaderVisible(true);
- table.setLinesVisible(true);
+ // Enable selection retrieving from outside the view
+ getSite().setSelectionProvider(viewer);
- viewer.setContentProvider(new DistributionsContentProvider());
- viewer.addDoubleClickListener(new DistributionsDCL());
+ // Drag'n drop
+ Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+ int operations = DND.DROP_COPY | DND.DROP_MOVE;
+ viewer.addDragSupport(operations, tt, new ViewDragListener());
+ viewer.addDropSupport(operations, tt, new ViewDropListener(viewer));
MenuManager menuManager = new MenuManager();
Menu menu = menuManager.createContextMenu(viewer.getTree());
viewer.getTree().setMenu(menu);
getSite().registerContextMenu(menuManager, viewer);
- // Initializes repositories
- // TODO make it more generic, with remote repositories etc.
- repositories.add(new RepositoryElem("java", repository, null));
-
- // Remote
- String uri = null;
- Credentials credentials = null;
- Repository remoteRepository = null;
+ // Initialize
+ refresh();
+ }
- uri = "http://dev.argeo.org/org.argeo.jcr.webapp/pub/java";
- credentials = new GuestCredentials();
- remoteRepository = JcrUtils.getRepositoryByUri(repositoryFactory, uri);
- repositories.add(new RepositoryElem("anonymous@dev.argeo.org//java",
- remoteRepository, credentials));
+ /** Programatically configure the context menu */
+ protected void contextMenuAboutToShow(IMenuManager menuManager) {
+ IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench()
+ .getActiveWorkbenchWindow();
- uri = "http://localhost:7070/org.argeo.jcr.webapp/pub/java";
- credentials = new GuestCredentials();
- remoteRepository = JcrUtils.getRepositoryByUri(repositoryFactory, uri);
- repositories.add(new RepositoryElem("anonymous@localhost//java",
- remoteRepository, credentials));
+ try {
+ // Most of the implemented commands support only one selected
+ // element
+ boolean singleElement = ((IStructuredSelection) viewer
+ .getSelection()).size() == 1;
+ // Get Current selected item :
+ Object firstElement = ((IStructuredSelection) viewer.getSelection())
+ .getFirstElement();
- uri = "http://localhost:7070/org.argeo.jcr.webapp/remoting/java";
- credentials = new SimpleCredentials(System.getProperty("user.name"),
- "".toCharArray());
- remoteRepository = JcrUtils.getRepositoryByUri(repositoryFactory, uri);
- repositories.add(new RepositoryElem("@localhost//java",
- remoteRepository, credentials));
+ if (firstElement instanceof TreeParent
+ || firstElement instanceof DistParentElem) {
+
+ String targetRepoPath = null, workspaceName = null, workspacePrefix = null;
+ // String targetRepoUri = null;
+ // Build conditions depending on element type
+ boolean isDistribElem = false, isRepoElem = false, isDistribGroupElem = false;
+ boolean isHomeRepo = false, isReadOnly = true;
+
+ RepoElem re = null;
+
+ if (firstElement instanceof WorkspaceElem) {
+ WorkspaceElem de = (WorkspaceElem) firstElement;
+ re = de.getRepoElem();
+ isDistribElem = true;
+ isReadOnly = de.isReadOnly();
+ workspaceName = de.getWorkspaceName();
+ } else if (firstElement instanceof RepoElem) {
+ re = (RepoElem) firstElement;
+ isRepoElem = true;
+ isHomeRepo = re.inHome();
+ isReadOnly = re.isReadOnly();
+ } else if (firstElement instanceof GroupElem) {
+ GroupElem dge = (GroupElem) firstElement;
+ isReadOnly = dge.isReadOnly();
+ isDistribGroupElem = true;
+ re = dge.getRepoElem();
+ workspacePrefix = dge.getLabel();
+ }
- viewer.setInput(getSite());
+ if (re != null) {
+ // targetRepoUri = re.getUri();
+ targetRepoPath = re.getRepoNode().getPath();
+ }
+ // Display repo info
+ CommandHelpers.refreshCommand(menuManager, window,
+ DisplayRepoInformation.ID,
+ DisplayRepoInformation.DEFAULT_LABEL,
+ DisplayRepoInformation.DEFAULT_ICON_PATH, isRepoElem
+ && singleElement);
+
+ // create workspace
+ Map<String, String> params = new HashMap<String, String>();
+ params.put(CreateWorkspace.PARAM_TARGET_REPO_PATH,
+ targetRepoPath);
+ params.put(CreateWorkspace.PARAM_WORKSPACE_PREFIX,
+ workspacePrefix);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL,
+ CreateWorkspace.DEFAULT_ICON_PATH,
+ (isRepoElem || isDistribGroupElem) && singleElement
+ && !isReadOnly, params);
+
+ // publish workspace
+ params = new HashMap<String, String>();
+ params.put(PublishWorkspace.PARAM_TARGET_REPO_PATH,
+ targetRepoPath);
+ params.put(PublishWorkspace.PARAM_WORKSPACE_NAME, workspaceName);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ PublishWorkspace.ID, PublishWorkspace.DEFAULT_LABEL,
+ PublishWorkspace.DEFAULT_ICON_PATH, isDistribElem
+ && singleElement && !isReadOnly, params);
+
+ // Register a remote repository
+ CommandHelpers.refreshCommand(menuManager, window,
+ RegisterRepository.ID,
+ RegisterRepository.DEFAULT_LABEL,
+ RegisterRepository.DEFAULT_ICON_PATH, isRepoElem
+ && singleElement);
+
+ // Unregister a remote repository
+ params = new HashMap<String, String>();
+ params.put(UnregisterRemoteRepo.PARAM_REPO_PATH, targetRepoPath);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ UnregisterRemoteRepo.ID,
+ UnregisterRemoteRepo.DEFAULT_LABEL,
+ UnregisterRemoteRepo.DEFAULT_ICON_PATH, isRepoElem
+ && !isHomeRepo && singleElement, params);
+
+ // Fetch repository
+ params = new HashMap<String, String>();
+ params.put(Fetch.PARAM_TARGET_REPO_PATH, targetRepoPath);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ Fetch.ID, Fetch.DEFAULT_LABEL, Fetch.DEFAULT_ICON_PATH,
+ isRepoElem && singleElement && !isReadOnly, params);
+
+ // Normalize workspace
+ params = new HashMap<String, String>();
+ params.put(NormalizeDistribution.PARAM_TARGET_REPO_PATH,
+ targetRepoPath);
+ params.put(NormalizeDistribution.PARAM_WORKSPACE_NAME,
+ workspaceName);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ NormalizeDistribution.ID,
+ NormalizeDistribution.DEFAULT_LABEL,
+ NormalizeDistribution.DEFAULT_ICON_PATH, isDistribElem
+ && singleElement && !isReadOnly, params);
+
+ // Copy workspace
+ params = new HashMap<String, String>();
+ params.put(CopyWorkspace.PARAM_TARGET_REPO_PATH, targetRepoPath);
+ params.put(CopyWorkspace.PARAM_SOURCE_WORKSPACE_NAME,
+ workspaceName);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL,
+ CopyWorkspace.DEFAULT_ICON_PATH, isDistribElem
+ && singleElement, params);
+
+ // Clear Workspace
+ params = new HashMap<String, String>();
+ params.put(DeleteWorkspace.PARAM_TARGET_REPO_PATH,
+ targetRepoPath);
+ params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, workspaceName);
+ CommandHelpers.refreshParameterizedCommand(menuManager, window,
+ DeleteWorkspace.ID, DeleteWorkspace.DEFAULT_LABEL,
+ DeleteWorkspace.DEFAULT_ICON_PATH, isDistribElem
+ && singleElement && !isReadOnly, params);
+
+ // // Manage workspace authorizations
+ // params = new HashMap<String, String>();
+ // params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName);
+ // CommandHelpers.refreshParameterizedCommand(menuManager,
+ // window,
+ // ManageWorkspaceAuth.ID, ManageWorkspaceAuth.DEFAULT_LABEL,
+ // ManageWorkspaceAuth.DEFAULT_ICON_PATH, isDistribElem
+ // && singleElement && !isReadOnly, params);
+ }
+ } catch (RepositoryException e) {
+ throw new SlcException("unexpected errror while "
+ + "building context menu", e);
+ }
}
@Override
* Force refresh of the whole view
*/
public void refresh() {
- viewer.setContentProvider(new DistributionsContentProvider());
- }
-
- public void setRepository(Repository repository) {
- this.repository = repository;
- }
-
- public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
- this.repositoryFactory = repositoryFactory;
+ viewer.setInput(nodeRepository);
+ viewer.expandToLevel(2);
}
- /** Programatically configure the context menu */
- protected void contextMenuAboutToShow(IMenuManager menuManager) {
- IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench()
- .getActiveWorkbenchWindow();
- // Get Current selected item :
- Object firstElement = ((IStructuredSelection) viewer.getSelection())
- .getFirstElement();
-
- if (firstElement instanceof TreeParent) {
- TreeParent tp = (TreeParent) firstElement;
- String wsName = tp.getName();
-
- // Build conditions depending on element type (repo or distribution
- // for the time being)
- boolean isDistribElem = false; // , isRepoElem = false;
-
- // if (tp instanceof RepositoryElem){
- // isRepoElem = true;
- // } else
- if (tp instanceof DistributionElem) {
- isDistribElem = true;
+ /** Listens to drag */
+ class ViewDragListener extends DragSourceAdapter {
+ public void dragSetData(DragSourceEvent event) {
+ IStructuredSelection selection = (IStructuredSelection) viewer
+ .getSelection();
+ if (selection.getFirstElement() instanceof WorkspaceElem) {
+ WorkspaceElem de = (WorkspaceElem) selection.getFirstElement();
+ if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
+ event.data = de.getRepoElem().getUri() + "/"
+ + de.getWorkspaceName();
+ }
}
-
- // create workspace
- CommandHelpers.refreshCommand(menuManager, window,
- CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL,
- CreateWorkspace.DEFAULT_ICON_PATH,
- tp instanceof RepositoryElem);
-
- // Normalize workspace
- Map<String, String> params = new HashMap<String, String>();
- params.put(NormalizeDistribution.PARAM_WORKSPACE, wsName);
- CommandHelpers.refreshParameterizedCommand(menuManager, window,
- NormalizeDistribution.ID,
- NormalizeDistribution.DEFAULT_LABEL,
- NormalizeDistribution.DEFAULT_ICON_PATH, isDistribElem,
- params);
-
- // Copy workspace
- params = new HashMap<String, String>();
- params.put(CopyWorkspace.PARAM_WORKSPACE_NAME, wsName);
- CommandHelpers.refreshParameterizedCommand(menuManager, window,
- CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL,
- CopyWorkspace.DEFAULT_ICON_PATH, isDistribElem, params);
-
- // Delete Workspace
- params = new HashMap<String, String>();
- params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, wsName);
- CommandHelpers.refreshParameterizedCommand(menuManager, window,
- DeleteWorkspace.ID, DeleteWorkspace.DEFAULT_LABEL,
- DeleteWorkspace.DEFAULT_ICON_PATH, isDistribElem, params);
-
- // Manage workspace authorizations
- params = new HashMap<String, String>();
- params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName);
- CommandHelpers.refreshParameterizedCommand(menuManager, window,
- ManageWorkspaceAuth.ID, ManageWorkspaceAuth.DEFAULT_LABEL,
- ManageWorkspaceAuth.DEFAULT_ICON_PATH, isDistribElem,
- params);
}
}
- private class DistributionsContentProvider extends
- AbstractTreeContentProvider {
+ /** Listens to drop */
+ class ViewDropListener extends ViewerDropAdapter {
- public Object[] getElements(Object arg0) {
- return repositories.toArray();
+ public ViewDropListener(Viewer viewer) {
+ super(viewer);
}
- }
-
- /** Wraps a repository **/
- private static class RepositoryElem extends TreeParent {
- // private final Repository repository;
- private Session defaultSession;
+ @Override
+ public boolean performDrop(Object data) {
+ WorkspaceElem sourceDist = (WorkspaceElem) getSelectedObject();
+ RepoElem targetRepo = (RepoElem) getCurrentTarget();
+
+ Boolean ok = MessageDialog.openConfirm(getSite().getShell(),
+ "Confirm distribution merge", "Do you want to merge "
+ + sourceDist.getWorkspaceName() + " (from repo "
+ + sourceDist.getRepoElem().getLabel()
+ + ") to repo " + targetRepo.getLabel() + "?");
+ if (!ok)
+ return false;
- public RepositoryElem(String name, Repository repository,
- Credentials credentials) {
- super(name);
try {
- defaultSession = repository.login(credentials);
- String[] workspaceNames = defaultSession.getWorkspace()
- .getAccessibleWorkspaceNames();
- for (String workspace : workspaceNames)
- addChild(new DistributionElem(repository, workspace,
- credentials));
+ Map<String, String> params = new HashMap<String, String>();
+ params.put(MergeWorkspaces.PARAM_TARGET_REPO_PATH, targetRepo
+ .getRepoNode().getPath());
+ params.put(MergeWorkspaces.PARAM_SOURCE_REPO_PATH, sourceDist
+ .getRepoElem().getRepoNode().getPath());
+ params.put(MergeWorkspaces.PARAM_SOURCE_WORKSPACE_NAME,
+ sourceDist.getWorkspaceName());
+ CommandHelpers.callCommand(RefreshDistributionsView.ID, params);
+ return true;
} catch (RepositoryException e) {
- ErrorFeedback.show("Cannot log to repository", e);
+ throw new SlcException("Cannot process drop from " + sourceDist
+ + " to " + targetRepo, e);
}
}
@Override
- public synchronized void dispose() {
- if (log.isTraceEnabled())
- log.trace("Disposing RepositoryElement");
- JcrUtils.logoutQuietly(defaultSession);
- super.dispose();
- }
- }
-
- private static class DistributionElem extends TreeParent {
- private final String workspaceName;
- private final Repository repository;
- private final Credentials credentials;
-
- public DistributionElem(Repository repository, String workspaceName,
- Credentials credentials) {
- super(workspaceName);
- this.workspaceName = workspaceName;
- this.repository = repository;
- this.credentials = credentials;
- }
-
- public String getWorkspaceName() {
- return workspaceName;
- }
-
- public Repository getRepository() {
- return repository;
- }
-
- public Credentials getCredentials() {
- return credentials;
+ public boolean validateDrop(Object target, int operation,
+ TransferData transferType) {
+ if (target instanceof RepoElem) {
+ if (getSelectedObject() instanceof WorkspaceElem) {
+ // check if not same repository
+ String srcRepoUri = ((WorkspaceElem) getSelectedObject())
+ .getRepoElem().getUri();
+ String targetRepoUri = ((RepoElem) target).getUri();
+ return !targetRepoUri.equals(srcRepoUri);
+ }
+ }
+ return false;
}
}
- @Override
- public void dispose() {
- for (RepositoryElem re : repositories)
- re.dispose();
- super.dispose();
+ /*
+ * DEPENDENCY INJECTION
+ */
+ public void setNodeRepository(Repository repository) {
+ this.nodeRepository = repository;
}
- private class DistributionsDCL implements IDoubleClickListener {
-
- public void doubleClick(DoubleClickEvent event) {
- if (event.getSelection() == null || event.getSelection().isEmpty())
- return;
- Object obj = ((IStructuredSelection) event.getSelection())
- .getFirstElement();
- if (obj instanceof DistributionElem) {
- DistributionElem distributionElem = (DistributionElem) obj;
- DistributionEditorInput dei = new DistributionEditorInput(
- distributionElem.getName(),
- distributionElem.getRepository(),
- distributionElem.getWorkspaceName(),
- distributionElem.getCredentials());
- try {
- DistPlugin.getDefault().getWorkbench()
- .getActiveWorkbenchWindow().getActivePage()
- .openEditor(dei, DistributionEditor.ID);
- } catch (PartInitException e) {
- ErrorFeedback.show("Cannot open editor for "
- + distributionElem.getWorkspaceName(), e);
- }
- }
- }
+ public void setTreeContentProvider(
+ DistTreeContentProvider treeContentProvider) {
+ this.treeContentProvider = treeContentProvider;
}
}
\ No newline at end of file