]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/editors/DistWkspBrowserPage.java
SLC UI building (except Dist)
[gpl/argeo-slc.git] / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / editors / DistWkspBrowserPage.java
diff --git a/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/editors/DistWkspBrowserPage.java b/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/editors/DistWkspBrowserPage.java
new file mode 100644 (file)
index 0000000..1574038
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * 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.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.client.ui.dist.editors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+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.argeo.eclipse.ui.workbench.CommandUtils;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.dist.DistConstants;
+import org.argeo.slc.client.ui.dist.DistImages;
+import org.argeo.slc.client.ui.dist.commands.OpenModuleEditor;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.RepoConstants;
+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.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+/**
+ * Expose Maven artifacts of a given workspace as a tree. Artifacts are grouped
+ * by Maven group.
+ */
+public class DistWkspBrowserPage extends FormPage implements DistConstants,
+               RepoConstants {
+       // private final static Log log = LogFactory
+       // .getLog(ArtifactsBrowserPage.class);
+
+       final static String PAGE_ID = "artifactsBrowserPage";
+
+       // Business object
+       private Session session;
+
+       // This page widgets
+       private TreeViewer artifactTreeViewer;
+
+       public DistWkspBrowserPage(FormEditor editor, String title, Session session) {
+               super(editor, PAGE_ID, title);
+               this.session = session;
+       }
+
+       @Override
+       protected void createFormContent(IManagedForm managedForm) {
+               try {
+                       ScrolledForm form = managedForm.getForm();
+                       Composite parent = form.getBody();
+                       parent.setLayout(new FillLayout());
+                       createMavenBrowserPart(parent);
+                       getEditor().getSite().setSelectionProvider(artifactTreeViewer);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot create artifact browser page", e);
+               }
+       }
+
+       /** Aether specific browser for the current workspace */
+       private void createMavenBrowserPart(Composite parent)
+                       throws RepositoryException {
+
+               int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
+                               | SWT.FULL_SELECTION | SWT.BORDER;
+               
+               Tree tree = new Tree(parent, style);
+               createColumn(tree, "Maven browser", SWT.LEFT, 450);
+               tree.setLinesVisible(true);
+               tree.setHeaderVisible(true);
+
+               artifactTreeViewer = new TreeViewer(tree);
+
+               artifactTreeViewer.setLabelProvider(new ColumnLabelProvider() {
+                       @Override
+                       public String getText(Object element) {
+                               Node node = (Node) element;
+                               try {
+                                       if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
+                                               return JcrUtils.get((Node) element,
+                                                               SlcNames.SLC_GROUP_BASE_ID);
+                                       else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
+                                               return JcrUtils.get((Node) element,
+                                                               SlcNames.SLC_ARTIFACT_ID);
+                                       else
+                                               return node.getName();
+                               } catch (RepositoryException e) {
+                                       throw new SlcException("Cannot browse artifacts", e);
+                               }
+                       }
+
+                       @Override
+                       public Image getImage(Object element) {
+                               Node node = (Node) element;
+                               try {
+
+                                       if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
+                                               return DistImages.IMG_GROUP_BASE;
+                                       else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
+                                               return DistImages.IMG_ARTIFACT_BASE;
+                                       else if (node
+                                                       .isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE))
+                                               return DistImages.IMG_ARTIFACT_VERSION_BASE;
+                                       else
+                                               return null;
+                               } catch (RepositoryException e) {
+                                       throw new SlcException("Cannot get images for artifacts", e);
+                               }
+                       }
+               });
+
+               artifactTreeViewer.setContentProvider(new ITreeContentProvider() {
+
+                       public void dispose() {
+                       }
+
+                       public void inputChanged(Viewer viewer, Object oldInput,
+                                       Object newInput) {
+                       }
+
+                       public Object[] getElements(Object inputElement) {
+                               try {
+                                       List<Node> nodes = JcrUtils.nodeIteratorToList(listNodes(
+                                                       SlcTypes.SLC_GROUP_BASE, SlcNames.SLC_NAME));
+                                       return nodes.toArray();
+                               } catch (RepositoryException e) {
+                                       throw new SlcException("Cannot list children Nodes", e);
+                               }
+                       }
+
+                       public Object[] getChildren(Object parentElement) {
+                               // Only 3 levels for the time being
+                               try {
+                                       Node pNode = (Node) parentElement;
+                                       if (pNode.isNodeType(SlcTypes.SLC_GROUP_BASE)) {
+                                               return getArtifactBase(pNode,
+                                                               SlcTypes.SLC_ARTIFACT_BASE);
+                                       } else if (pNode.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) {
+                                               return getArtifactBase(pNode,
+                                                               SlcTypes.SLC_ARTIFACT_VERSION_BASE);
+                                       }
+                                       return null;
+                               } catch (RepositoryException e) {
+                                       throw new SlcException("Cannot list children Nodes", e);
+                               }
+                       }
+
+                       // Helper to get children because current version of Jackrabbit is
+                       // buggy in remote
+                       private Object[] getArtifactBase(Node parent, String nodeType)
+                                       throws RepositoryException {
+                               List<Node> nodes = new ArrayList<Node>();
+                               NodeIterator ni = parent.getNodes();
+                               while (ni.hasNext()) {
+                                       Node node = ni.nextNode();
+                                       if (node.isNodeType(nodeType))
+                                               nodes.add(node);
+                               }
+                               return nodes.toArray();
+                       }
+
+                       public Object getParent(Object element) {
+                               return null;
+                       }
+
+                       public boolean hasChildren(Object element) {
+                               try {
+                                       Node pNode = (Node) element;
+                                       if (pNode.isNodeType(SlcTypes.SLC_GROUP_BASE)
+                                                       || pNode.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) {
+                                               // might return true even if there is no "valid" child
+                                               return pNode.hasNodes();
+                                       } else
+                                               return false;
+                               } catch (RepositoryException e) {
+                                       throw new SlcException("Cannot check children Nodes", e);
+                               }
+                       }
+               });
+
+               artifactTreeViewer.addDoubleClickListener(new DoubleClickListener());
+
+               artifactTreeViewer.setInput("Initialize");
+       }
+
+       private class DoubleClickListener implements IDoubleClickListener {
+
+               public void doubleClick(DoubleClickEvent event) {
+                       Object obj = ((IStructuredSelection) event.getSelection())
+                                       .getFirstElement();
+                       if (obj instanceof Node) {
+                               Node node = (Node) obj;
+                               try {
+                                       if (node.isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE)) {
+                                               NodeIterator nit = node.getNodes();
+                                               while (nit.hasNext()) {
+                                                       Node curr = nit.nextNode();
+                                                       if (curr.isNodeType(SlcTypes.SLC_ARTIFACT)) {
+                                                               node = curr;
+                                                               break;
+                                                       }
+                                               }
+                                       }
+
+                                       if (node.isNodeType(SlcTypes.SLC_ARTIFACT)) {
+                                               DistWkspEditorInput dwip = (DistWkspEditorInput) getEditorInput();
+                                               Map<String, String> params = new HashMap<String, String>();
+                                               params.put(OpenModuleEditor.PARAM_REPO_NODE_PATH,
+                                                               dwip.getRepoNodePath());
+                                               params.put(OpenModuleEditor.PARAM_REPO_URI,
+                                                               dwip.getUri());
+                                               params.put(OpenModuleEditor.PARAM_WORKSPACE_NAME,
+                                                               dwip.getWorkspaceName());
+                                               String path = node.getPath();
+                                               params.put(OpenModuleEditor.PARAM_MODULE_PATH, path);
+                                               CommandUtils.callCommand(OpenModuleEditor.ID, params);
+                                       }
+                               } catch (RepositoryException re) {
+                                       throw new SlcException("Cannot get path for node " + node
+                                                       + " while setting parameters for "
+                                                       + "command OpenModuleEditor", re);
+                               }
+
+                       }
+               }
+       }
+
+       private static TreeColumn createColumn(Tree parent, String name, int style,
+                       int width) {
+               TreeColumn result = new TreeColumn(parent, style);
+               result.setText(name);
+               result.setWidth(width);
+               result.setMoveable(true);
+               result.setResizable(true);
+               return result;
+       }
+
+       private NodeIterator listNodes(String nodeType, String orderBy)
+                       throws RepositoryException {
+               QueryManager queryManager = session.getWorkspace().getQueryManager();
+               QueryObjectModelFactory factory = queryManager.getQOMFactory();
+
+               final String nodeSelector = "nodes";
+               Selector source = factory.selector(nodeType, nodeSelector);
+
+               Ordering order = factory.ascending(factory.propertyValue(nodeSelector,
+                               orderBy));
+               Ordering[] orderings = { order };
+
+               QueryObjectModel query = factory.createQuery(source, null, orderings,
+                               null);
+
+               QueryResult result = query.execute();
+
+               return result.getNodes();
+       }
+
+       
+}