*/
package org.argeo.slc.client.ui.dist.views;
-import java.util.List;
+import java.util.HashMap;
+import java.util.Map;
-import javax.jcr.Node;
-import javax.jcr.NodeIterator;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.qom.Ordering;
-import javax.jcr.query.qom.QueryObjectModel;
-import javax.jcr.query.qom.QueryObjectModelFactory;
-import javax.jcr.query.qom.Selector;
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.jcr.JcrUtils;
+import org.argeo.eclipse.ui.TreeParent;
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.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.utils.CommandHelpers;
import org.argeo.slc.jcr.SlcNames;
-import org.argeo.slc.jcr.SlcTypes;
+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.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
+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;
/**
- * Basic View to browse a maven based repository.
- *
- * By Default size of the various bundles is not computed but it can be
- * activated the view command.
+ * Browse and manipulate distributions (like merge, rename, etc.). Only support
+ * one single repository currently.
*/
public class DistributionsView extends ViewPart implements SlcNames {
public final static String ID = DistPlugin.ID + ".distributionsView";
private Repository repository;
- private String workspace;
- private Session session;
- private TableViewer viewer;
+ private TreeViewer viewer;
@Override
public void createPartControl(Composite parent) {
- try {
- session = repository.login(workspace);
- } catch (RepositoryException e) {
- ErrorFeedback.show("Cannot log to workspace " + workspace, e);
- }
-
// Define the TableViewer
- viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
- | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
+ viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL
+ | SWT.FULL_SELECTION | SWT.BORDER);
- TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE);
+ 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 JcrUtils.get((Node) element, SLC_SYMBOLIC_NAME);
+ return element.toString();
}
});
- final Table table = viewer.getTable();
+ final Tree table = viewer.getTree();
table.setHeaderVisible(true);
table.setLinesVisible(true);
viewer.setContentProvider(new DistributionsContentProvider());
- viewer.setInput(session);
+ viewer.addDoubleClickListener(new DistributionsDCL());
+
+ MenuManager menuManager = new MenuManager();
+ Menu menu = menuManager.createContextMenu(viewer.getTree());
+ menuManager.addMenuListener(new IMenuListener() {
+ public void menuAboutToShow(IMenuManager manager) {
+ contextMenuAboutToShow(manager);
+ }
+ });
+ viewer.getTree().setMenu(menu);
+ getSite().registerContextMenu(menuManager, viewer);
+
+ viewer.setInput(getSite());
+
}
@Override
public void setFocus() {
- viewer.getTable().setFocus();
+ viewer.getTree().setFocus();
+ }
+
+ /**
+ * Force refresh of the whole view
+ */
+ public void refresh() {
+ viewer.setContentProvider(new DistributionsContentProvider());
}
public void setRepository(Repository repository) {
this.repository = repository;
}
- public void setWorkspace(String workspace) {
- this.workspace = workspace;
- }
+ /** 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();
- private static class DistributionsContentProvider implements
- IStructuredContentProvider {
- private Session session;
+ if (firstElement instanceof TreeParent) {
+ TreeParent tp = (TreeParent) firstElement;
+ String wsName = tp.getName();
- public void dispose() {
- }
+ // 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;
+ }
+
+ // 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);
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- session = (Session) newInput;
+ // 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 {
public Object[] getElements(Object arg0) {
+ return new Object[] { new RepositoryElem("java", repository) };
+ }
+
+ }
+
+ private static class RepositoryElem extends TreeParent {
+ // private final Repository repository;
+ private Session defaultSession;
+
+ public RepositoryElem(String name, Repository repository) {
+ super(name);
+ // this.repository = repository;
try {
- List<Node> nodes = JcrUtils
- .nodeIteratorToList(listBundleArtifacts(session));
- return nodes.toArray();
+ defaultSession = repository.login();
+ String[] workspaceNames = defaultSession.getWorkspace()
+ .getAccessibleWorkspaceNames();
+ for (String workspace : workspaceNames)
+ addChild(new DistributionElem(repository, workspace));
} catch (RepositoryException e) {
- ErrorFeedback.show("Cannot list bundles", e);
- return null;
+ ErrorFeedback.show("Cannot log to repository", e);
}
}
+ @Override
+ public synchronized void dispose() {
+ if (log.isTraceEnabled())
+ log.trace("Disposing RepositoryElement");
+ if (defaultSession != null)
+ defaultSession.logout();
+ super.dispose();
+ }
}
- static NodeIterator listBundleArtifacts(Session session)
- throws RepositoryException {
- QueryManager queryManager = session.getWorkspace().getQueryManager();
- QueryObjectModelFactory factory = queryManager.getQOMFactory();
+ private static class DistributionElem extends TreeParent {
+ private final String workspaceName;
+ private final Repository repository;
- final String bundleArtifactsSelector = "bundleArtifacts";
- Selector source = factory.selector(SlcTypes.SLC_BUNDLE_ARTIFACT,
- bundleArtifactsSelector);
+ public DistributionElem(Repository repository, String workspaceName) {
+ super(workspaceName);
+ this.workspaceName = workspaceName;
+ this.repository = repository;
+ }
- Ordering order = factory.ascending(factory.propertyValue(
- bundleArtifactsSelector, SlcNames.SLC_SYMBOLIC_NAME));
- Ordering[] orderings = { order };
+ public String getWorkspaceName() {
+ return workspaceName;
+ }
- QueryObjectModel query = factory.createQuery(source, null, orderings,
- null);
+ public Repository getRepository() {
+ return repository;
+ }
+ }
- QueryResult result = query.execute();
- return result.getNodes();
+ @Override
+ public void dispose() {
+ super.dispose();
}
-}
+ 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.getRepository(),
+ distributionElem.getWorkspaceName());
+ try {
+ DistPlugin.getDefault().getWorkbench()
+ .getActiveWorkbenchWindow().getActivePage()
+ .openEditor(dei, DistributionEditor.ID);
+ } catch (PartInitException e) {
+ ErrorFeedback.show("Cannot open editor for "
+ + distributionElem.getWorkspaceName(), e);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file