X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fviews%2FDistributionsView.java;h=908aff571be7285c915bd833f9a09addec45e19c;hb=d19ee0fc60f905f0f33bbc7ab34da3659accb046;hp=dc37c34205837f0a882cd35a243723625e337c8e;hpb=5187ffaff5610275cf3dbc5fb913f59126576da8;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java index dc37c3420..908aff571 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java @@ -15,65 +15,45 @@ */ 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.NoSuchWorkspaceException; -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.Property; import javax.jcr.Repository; import javax.jcr.RepositoryException; -import javax.jcr.RepositoryFactory; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; -import javax.jcr.query.Query; -import javax.jcr.query.QueryResult; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.ArgeoMonitor; -import org.argeo.eclipse.ui.EclipseArgeoMonitor; -import org.argeo.eclipse.ui.ErrorFeedback; + import org.argeo.eclipse.ui.TreeParent; -import org.argeo.jcr.ArgeoJcrUtils; +import org.argeo.eclipse.ui.utils.CommandUtils; import org.argeo.jcr.ArgeoNames; -import org.argeo.jcr.ArgeoTypes; -import org.argeo.jcr.JcrUtils; -import org.argeo.jcr.UserJcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.client.ui.dist.DistPlugin; -import org.argeo.slc.client.ui.dist.commands.AddRepository; 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.commands.RepoSyncCommand; +import org.argeo.slc.client.ui.dist.commands.NormalizeWorkspace; +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.editors.DistributionEditor; -import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput; +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.argeo.slc.repo.RepoConstants; -import org.argeo.slc.repo.RepoUtils; -import org.argeo.util.security.Keyring; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.ColumnLabelProvider; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; @@ -89,20 +69,21 @@ 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 across multiple repositories + * (like fetch, merge, publish, etc.). */ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames { - private final static Log log = LogFactory.getLog(DistributionsView.class); + // private final static Log log = + // LogFactory.getLog(DistributionsView.class); + public final static String ID = DistPlugin.ID + ".distributionsView"; + /* DEPENDENCY INJECTION */ private Repository nodeRepository; - private RepositoryFactory repositoryFactory; - private Keyring keyring; + private DistTreeContentProvider treeContentProvider; private TreeViewer viewer; @@ -113,26 +94,22 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames | SWT.FULL_SELECTION | SWT.BORDER); TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.NONE); - col.getColumn().setWidth(200); - col.setLabelProvider(new ColumnLabelProvider() { - @Override - public String getText(Object element) { - if (element instanceof RepoElem) - return ((RepoElem) element).getLabel(); - return element.toString(); - } - }); + col.getColumn().setWidth(400); + col.setLabelProvider(new DistTreeLabelProvider()); + + final Tree tree = viewer.getTree(); + tree.setHeaderVisible(false); + tree.setLinesVisible(false); - final Tree table = viewer.getTree(); - table.setHeaderVisible(false); - table.setLinesVisible(false); + // viewer.setContentProvider(new DistTreeContentProvider()); + viewer.setContentProvider(treeContentProvider); + viewer.addDoubleClickListener(new DistTreeDoubleClickListener()); + viewer.setComparator(new DistTreeComparator()); - viewer.setContentProvider(new DistributionsContentProvider()); - viewer.addDoubleClickListener(new DistributionsDCL()); - // Enable selection retrieving from outside the view + // Enable retrieving current tree selected items from outside the view getSite().setSelectionProvider(viewer); - // Drag'n drop + // Drag and drop Transfer[] tt = new Transfer[] { TextTransfer.getInstance() }; int operations = DND.DROP_COPY | DND.DROP_MOVE; viewer.addDragSupport(operations, tt, new ViewDragListener()); @@ -148,44 +125,15 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames viewer.getTree().setMenu(menu); getSite().registerContextMenu(menuManager, viewer); - Session nodeSession = null; - try { - nodeSession = nodeRepository.login(); - - // make sure base directory is available - Node repos = JcrUtils.mkdirs(nodeSession, - UserJcrUtils.getUserHome(nodeSession).getPath() - + RepoConstants.REPOSITORIES_BASE_PATH); - nodeSession.save(); - - // register default local java repository - String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS; - Repository javaRepository = ArgeoJcrUtils.getRepositoryByAlias( - repositoryFactory, alias); - if (javaRepository != null) { - if (!repos.hasNode(alias)) { - Node repoNode = repos.addNode(alias, - ArgeoTypes.ARGEO_REMOTE_REPOSITORY); - repoNode.setProperty(ARGEO_URI, "vm:///" + alias); - repoNode.addMixin(NodeType.MIX_TITLE); - repoNode.setProperty(Property.JCR_TITLE, "Internal " - + alias + " repository"); - nodeSession.save(); - } - } - } catch (RepositoryException e) { - throw new SlcException("Cannot register repository", e); - } finally { - JcrUtils.logoutQuietly(nodeSession); - } - - viewer.setInput(nodeRepository); + // Initialize + refresh(); } /** Programatically configure the context menu */ protected void contextMenuAboutToShow(IMenuManager menuManager) { IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow(); + try { // Most of the implemented commands support only one selected // element @@ -196,87 +144,158 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames .getFirstElement(); if (firstElement instanceof TreeParent - || firstElement instanceof RepoElem) { - String wsName = null; - String targetRepoPath = null; + || 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; - // Build conditions depending on element type (repo or - // distribution - // for the time being) - boolean isDistribElem = false; // , isRepoElem = false; + RepoElem re = null; - if (firstElement instanceof DistributionElem) { + if (firstElement instanceof WorkspaceElem) { + WorkspaceElem de = (WorkspaceElem) firstElement; + re = de.getRepoElem(); isDistribElem = true; - wsName = ((DistributionElem) firstElement).getName(); + 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(); } - if (firstElement instanceof RepoElem) { - Node node = ((RepoElem) firstElement).getRepoNode(); - targetRepoPath = node.getPath(); + if (re != null) { + // targetRepoUri = re.getUri(); + targetRepoPath = re.getRepoNode().getPath(); } + // Display repo info + CommandUtils.refreshCommand(menuManager, window, + DisplayRepoInformation.ID, + DisplayRepoInformation.DEFAULT_LABEL, + DisplayRepoInformation.DEFAULT_ICON, isRepoElem + && singleElement); + // create workspace - CommandHelpers.refreshCommand(menuManager, window, + Map params = new HashMap(); + params.put(CreateWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(CreateWorkspace.PARAM_WORKSPACE_PREFIX, + workspacePrefix); + CommandUtils.refreshParametrizedCommand(menuManager, window, CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL, - CreateWorkspace.DEFAULT_ICON_PATH, !isDistribElem - && singleElement); + CreateWorkspace.DEFAULT_ICON, + (isRepoElem || isDistribGroupElem) && singleElement + && !isReadOnly, params); // Register a remote repository - CommandHelpers.refreshCommand(menuManager, window, - AddRepository.ID, AddRepository.DEFAULT_LABEL, - AddRepository.DEFAULT_ICON_PATH, !isDistribElem + CommandUtils.refreshCommand(menuManager, window, + RegisterRepository.ID, + RegisterRepository.DEFAULT_LABEL, + RegisterRepository.DEFAULT_ICON, isRepoElem && singleElement); // Unregister a remote repository - Map params = new HashMap(); + params = new HashMap(); params.put(UnregisterRemoteRepo.PARAM_REPO_PATH, targetRepoPath); - CommandHelpers.refreshParameterizedCommand(menuManager, window, + CommandUtils.refreshParametrizedCommand(menuManager, window, UnregisterRemoteRepo.ID, UnregisterRemoteRepo.DEFAULT_LABEL, - UnregisterRemoteRepo.DEFAULT_ICON_PATH, !isDistribElem - && singleElement, params); + UnregisterRemoteRepo.DEFAULT_ICON, isRepoElem + && !isHomeRepo && singleElement, params); // Fetch repository params = new HashMap(); - params.put(RepoSyncCommand.PARAM_TARGET_REPO, targetRepoPath); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - RepoSyncCommand.ID, RepoSyncCommand.DEFAULT_LABEL, - RepoSyncCommand.DEFAULT_ICON_PATH, !isDistribElem - && singleElement, params); + params.put(Fetch.PARAM_TARGET_REPO_PATH, targetRepoPath); + CommandUtils.refreshParametrizedCommand(menuManager, window, + Fetch.ID, Fetch.DEFAULT_LABEL, Fetch.DEFAULT_ICON, + isRepoElem && isHomeRepo && singleElement + && !isReadOnly, params); // Normalize workspace params = new HashMap(); - params.put(NormalizeDistribution.PARAM_WORKSPACE, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - NormalizeDistribution.ID, - NormalizeDistribution.DEFAULT_LABEL, - NormalizeDistribution.DEFAULT_ICON_PATH, isDistribElem - && singleElement, params); + params.put(NormalizeWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(NormalizeWorkspace.PARAM_WORKSPACE_NAME, + workspaceName); + + CommandUtils.refreshParametrizedCommand(menuManager, window, + NormalizeWorkspace.ID, "Normalize...", + NormalizeWorkspace.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); // Copy workspace params = new HashMap(); - params.put(CopyWorkspace.PARAM_WORKSPACE_NAME, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, + params.put(CopyWorkspace.PARAM_TARGET_REPO_PATH, targetRepoPath); + params.put(CopyWorkspace.PARAM_SOURCE_WORKSPACE_NAME, + workspaceName); + CommandUtils.refreshParametrizedCommand(menuManager, window, CopyWorkspace.ID, CopyWorkspace.DEFAULT_LABEL, - CopyWorkspace.DEFAULT_ICON_PATH, isDistribElem + CopyWorkspace.DEFAULT_ICON, isDistribElem && singleElement, params); - // Delete Workspace + // Clear Workspace params = new HashMap(); - params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, + params.put(DeleteWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(DeleteWorkspace.PARAM_WORKSPACE_NAME, workspaceName); + CommandUtils.refreshParametrizedCommand(menuManager, window, DeleteWorkspace.ID, DeleteWorkspace.DEFAULT_LABEL, - DeleteWorkspace.DEFAULT_ICON_PATH, isDistribElem - && singleElement, params); - - // Manage workspace authorizations + DeleteWorkspace.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + // Advanced submenu + MenuManager submenu = new MenuManager("Advanced", DistPlugin.ID + + ".advancedSubmenu"); + IContributionItem ici = menuManager.find(DistPlugin.ID + + ".advancedSubmenu"); + if (ici != null) + menuManager.remove(ici); + + // Publish workspace params = new HashMap(); - params.put(ManageWorkspaceAuth.PARAM_WORKSPACE_NAME, wsName); - CommandHelpers.refreshParameterizedCommand(menuManager, window, - ManageWorkspaceAuth.ID, - ManageWorkspaceAuth.DEFAULT_LABEL, - ManageWorkspaceAuth.DEFAULT_ICON_PATH, isDistribElem - && singleElement, params); + params.put(PublishWorkspace.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(PublishWorkspace.PARAM_WORKSPACE_NAME, workspaceName); + CommandUtils.refreshParametrizedCommand(submenu, window, + PublishWorkspace.ID, PublishWorkspace.DEFAULT_LABEL, + PublishWorkspace.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + // Normalize distribution (Legacy) + params = new HashMap(); + params.put(NormalizeDistribution.PARAM_TARGET_REPO_PATH, + targetRepoPath); + params.put(NormalizeDistribution.PARAM_WORKSPACE_NAME, + workspaceName); + CommandUtils.refreshParametrizedCommand(submenu, window, + NormalizeDistribution.ID, + NormalizeDistribution.DEFAULT_LABEL, + NormalizeDistribution.DEFAULT_ICON, isDistribElem + && singleElement && !isReadOnly, params); + + + + if (submenu.getSize() > 0) + menuManager.add(submenu); + + // // Manage workspace authorizations + // params = new HashMap(); + // 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 " @@ -293,207 +312,8 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames * Force refresh of the whole view */ public void refresh() { - viewer.setContentProvider(new DistributionsContentProvider()); - } - - /* - * INTERNAL CLASSES - */ - /** Content provider */ - private class DistributionsContentProvider implements ITreeContentProvider { - Session nodeSession; - List repositories = new ArrayList(); - - public Object[] getElements(Object input) { - Repository nodeRepository = (Repository) input; - try { - if (nodeSession != null) - dispose(); - nodeSession = nodeRepository.login(); - - String reposPath = UserJcrUtils.getUserHome(nodeSession) - .getPath() + RepoConstants.REPOSITORIES_BASE_PATH; - NodeIterator repos = nodeSession.getNode(reposPath).getNodes(); - while (repos.hasNext()) { - Node repoNode = repos.nextNode(); - if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) { - repositories.add(new RepoElem(repoNode)); - } - } - } catch (RepositoryException e) { - throw new SlcException("Cannot get base elements", e); - } - return repositories.toArray(); - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - - } - - public Object[] getChildren(Object parentElement) { - if (parentElement instanceof RepoElem) { - return ((RepoElem) parentElement).getChildren(); - } else if (parentElement instanceof DistributionElem) { - return ((DistributionElem) parentElement).getChildren(); - } - return null; - } - - public Object getParent(Object element) { - // TODO register repo elem in distirbution elem? - return null; - } - - public boolean hasChildren(Object element) { - if (element instanceof RepoElem) { - return true; - } else if (element instanceof DistributionElem) { - return false; - } - return false; - } - - public void dispose() { - for (RepoElem repoElem : repositories) - repoElem.dispose(); - repositories = new ArrayList(); - JcrUtils.logoutQuietly(nodeSession); - } - - } - - /** A software repository */ - private class RepoElem { - private Node repoNode; - - private Repository repository; - private Credentials credentials; - - public RepoElem(Node repoNode) { - this.repoNode = repoNode; - } - - /** Lazily connects to repository */ - protected void connect() { - if (repository != null) - return; - repository = RepoUtils.getRepository(repositoryFactory, keyring, - repoNode); - credentials = RepoUtils.getRepositoryCredentials(keyring, repoNode); - } - - public String getLabel() { - try { - if (repoNode.isNodeType(NodeType.MIX_TITLE)) { - return repoNode.getProperty(Property.JCR_TITLE).getString(); - } else { - return repoNode.getName(); - } - } catch (RepositoryException e) { - throw new SlcException("Cannot read label of " + repoNode, e); - } - } - - public String toString() { - return repoNode.toString(); - } - - public Object[] getChildren() { - connect(); - Session session = null; - try { - session = repository.login(credentials); - String[] workspaceNames = session.getWorkspace() - .getAccessibleWorkspaceNames(); - List distributionElems = new ArrayList(); - for (String workspaceName : workspaceNames) { - Node workspaceNode = repoNode.hasNode(workspaceName) ? repoNode - .getNode(workspaceName) : repoNode - .addNode(workspaceName); - repoNode.getSession().save(); - distributionElems.add(new DistributionElem(this, - workspaceNode)); - // FIXME remove deleted workspaces - } - return distributionElems.toArray(); - } catch (RepositoryException e) { - throw new SlcException( - "Cannot list workspaces for " + repoNode, e); - } finally { - JcrUtils.logoutQuietly(session); - } - } - - public void dispose() { - } - - public Node getRepoNode() { - return repoNode; - } - - public String getRepoPath() { - try { - return repoNode.getPath(); - } catch (RepositoryException e) { - throw new SlcException("Cannot get path for " + repoNode, e); - } - } - - public Repository getRepository() { - connect(); - return repository; - } - - public Credentials getCredentials() { - return credentials; - } - - } - - /** Abstracts a distribution, that is a workspace */ - private static class DistributionElem extends TreeParent { - private final RepoElem repoElem; - private final Node workspaceNode; - - public DistributionElem(RepoElem repoElem, Node workspaceNode) { - super(JcrUtils.getNameQuietly(workspaceNode)); - this.repoElem = repoElem; - this.workspaceNode = workspaceNode; - } - - public Node getWorkspaceNode() { - return workspaceNode; - } - - public String getWorkspaceName() { - return JcrUtils.getNameQuietly(workspaceNode); - } - - public String getWorkspacePath() { - try { - return workspaceNode.getPath(); - } catch (RepositoryException e) { - throw new SlcException("Cannot get or add workspace path " - + getWorkspaceName(), e); - } - } - - public String getRepoPath() { - try { - return workspaceNode.getParent().getPath(); - } catch (RepositoryException e) { - throw new SlcException("Cannot get or add workspace path " - + getWorkspaceName(), e); - } - } - - public RepoElem getRepoElem() { - return repoElem; - } - - public Credentials getCredentials() { - return repoElem.getCredentials(); - } + viewer.setInput(nodeRepository); + viewer.expandToLevel(2); } /** Listens to drag */ @@ -501,11 +321,11 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames public void dragSetData(DragSourceEvent event) { IStructuredSelection selection = (IStructuredSelection) viewer .getSelection(); - if (selection.getFirstElement() instanceof DistributionElem) { - DistributionElem de = (DistributionElem) selection - .getFirstElement(); + if (selection.getFirstElement() instanceof WorkspaceElem) { + WorkspaceElem de = (WorkspaceElem) selection.getFirstElement(); if (TextTransfer.getInstance().isSupportedType(event.dataType)) { - event.data = de.getWorkspacePath(); + event.data = de.getRepoElem().getUri() + "/" + + de.getWorkspaceName(); } } } @@ -520,7 +340,7 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames @Override public boolean performDrop(Object data) { - DistributionElem sourceDist = (DistributionElem) getSelectedObject(); + WorkspaceElem sourceDist = (WorkspaceElem) getSelectedObject(); RepoElem targetRepo = (RepoElem) getCurrentTarget(); Boolean ok = MessageDialog.openConfirm(getSite().getShell(), @@ -532,50 +352,14 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames return false; try { - String sourceWorkspace = sourceDist.getWorkspaceName(); - Repository sourceRepository = RepoUtils.getRepository( - repositoryFactory, keyring, sourceDist - .getWorkspaceNode().getParent()); - Credentials sourceCredentials = RepoUtils - .getRepositoryCredentials(keyring, sourceDist - .getWorkspaceNode().getParent()); - - String targetWorkspace = sourceWorkspace; - Repository targetRepository = RepoUtils.getRepository( - repositoryFactory, keyring, targetRepo.getRepoNode()); - Credentials targetCredentials = RepoUtils - .getRepositoryCredentials(keyring, - targetRepo.getRepoNode()); - - // Open sessions here since the background thread - // won't necessarily be authenticated. - // Job should close the sessions. - Session sourceSession = sourceRepository.login( - sourceCredentials, sourceWorkspace); - Session targetSession; - try { - targetSession = targetRepository.login(targetCredentials, - targetWorkspace); - } catch (NoSuchWorkspaceException e) { - Session defaultSession = targetRepository - .login(targetCredentials); - try { - defaultSession.getWorkspace().createWorkspace( - targetWorkspace); - } catch (Exception e1) { - throw new SlcException("Cannot create new workspace " - + targetWorkspace, e); - } finally { - JcrUtils.logoutQuietly(defaultSession); - } - targetSession = targetRepository.login(targetCredentials, - targetWorkspace); - } - - Job workspaceMergeJob = new WorkspaceMergeJob(sourceSession, - targetSession); - workspaceMergeJob.setUser(true); - workspaceMergeJob.schedule(); + Map params = new HashMap(); + 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) { throw new SlcException("Cannot process drop from " + sourceDist @@ -587,106 +371,27 @@ public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames public boolean validateDrop(Object target, int operation, TransferData transferType) { if (target instanceof RepoElem) { - if (getSelectedObject() instanceof DistributionElem) { + if (getSelectedObject() instanceof WorkspaceElem) { // check if not same repository - String srcRepoPath = ((DistributionElem) getSelectedObject()) - .getRepoPath(); - String targetRepoPath = ((RepoElem) target).getRepoPath(); - return !targetRepoPath.equals(srcRepoPath); + String srcRepoUri = ((WorkspaceElem) getSelectedObject()) + .getRepoElem().getUri(); + String targetRepoUri = ((RepoElem) target).getUri(); + return !targetRepoUri.equals(srcRepoUri); } } return false; } } - private static class WorkspaceMergeJob extends Job { - private Session sourceSession; - private Session targetSession; - - public WorkspaceMergeJob(Session sourceSession, Session targetSession) { - super("Workspace merge"); - this.sourceSession = sourceSession; - this.targetSession = targetSession; - } - - @Override - protected IStatus run(IProgressMonitor eclipseMonitor) { - long begin = System.currentTimeMillis(); - try { - Query countQuery = sourceSession - .getWorkspace() - .getQueryManager() - .createQuery("select file from [nt:file] as file", - Query.JCR_SQL2); - QueryResult result = countQuery.execute(); - Long expectedCount = result.getNodes().getSize(); - if (log.isDebugEnabled()) - log.debug("Will copy " + expectedCount + " files..."); - - ArgeoMonitor monitor = new EclipseArgeoMonitor(eclipseMonitor); - eclipseMonitor - .beginTask("Copy files", expectedCount.intValue()); - - Long count = JcrUtils.copyFiles(sourceSession.getRootNode(), - targetSession.getRootNode(), true, monitor); - - monitor.done(); - long duration = (System.currentTimeMillis() - begin) / 1000;// in - // s - if (log.isDebugEnabled()) - log.debug("Copied " + count + " files in " - + (duration / 60) + "min " + (duration % 60) + "s"); - - return Status.OK_STATUS; - } catch (RepositoryException e) { - return new Status(IStatus.ERROR, DistPlugin.ID, "Cannot merge", - e); - } finally { - JcrUtils.logoutQuietly(sourceSession); - JcrUtils.logoutQuietly(targetSession); - } - } - } - - /** Listen to double-clicks */ - 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 - .getRepoElem().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); - } - } - } - } - /* * DEPENDENCY INJECTION */ - public void setRepositoryFactory(RepositoryFactory repositoryFactory) { - this.repositoryFactory = repositoryFactory; - } - - public void setKeyring(Keyring keyring) { - this.keyring = keyring; - } - public void setNodeRepository(Repository repository) { this.nodeRepository = repository; } + + public void setTreeContentProvider( + DistTreeContentProvider treeContentProvider) { + this.treeContentProvider = treeContentProvider; + } } \ No newline at end of file