]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactsBrowserPage.java
+ first draft of anonymous perspective
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / ArtifactsBrowserPage.java
index 9f44f1611eef1dc5c8ffd75cb057f7fc4a551033..48afaec6ca8cf3d34ad63337a324e220b60beadf 100644 (file)
  */
 package org.argeo.slc.client.ui.dist.editors;
 
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.jcr.Node;
-import javax.jcr.Property;
+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.ArgeoException;
 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.providers.ArtifactsTreeContentProvider;
-import org.argeo.slc.client.ui.dist.utils.GenericDoubleClickListener;
+import org.argeo.slc.client.ui.dist.DistPlugin;
+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.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerCell;
+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.PartInitException;
 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;
 
 /**
- * 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.
+ * Exposes the various group id of a distribution as a tree.
  */
 public class ArtifactsBrowserPage extends FormPage implements DistConstants,
                RepoConstants {
+
        final static String PAGE_ID = "artifactsBrowserPage";
        // private final static Log log = LogFactory
        // .getLog(ArtifactsBrowserPage.class);
 
-       /* DEPENDENCY INJECTION */
-       private Session jcrSession;
-
-       // Business objects
-       private Node rootNode;
+       // Business object
+       private Session session;
 
        // This page widgets
        private TreeViewer artifactTreeViewer;
-       private boolean isSizeVisible = false;
-
-       // To be able to configure columns easily
-       public static final int COLUMN_TREE = 0;
-       public static final int COLUMN_DATE = 1;
-       public static final int COLUMN_SIZE = 2;
-       private static final int SIZE_COL_WIDTH = 55;
 
        public ArtifactsBrowserPage(FormEditor editor, String title, Session session) {
                super(editor, PAGE_ID, title);
-               this.jcrSession = session;
+               this.session = session;
        }
 
        @Override
        protected void createFormContent(IManagedForm managedForm) {
-               ScrolledForm form = managedForm.getForm();
-               Composite parent = form.getBody();
-               // Enable the different parts to fill the whole page when the tab is
-               // maximized
-               parent.setLayout(new FillLayout());
-               artifactTreeViewer = createArtifactsTreeViewer(parent);
-
-               // context menu : it is completely defined in the plugin.xml file.
-               // Nothing in the context menu for the time being
-               // MenuManager menuManager = new MenuManager();
-               // Menu menu =
-               // menuManager.createContextMenu(artifactTreeViewer.getTree());
-               // artifactTreeViewer.getTree().setMenu(menu);
-               // getSite().registerContextMenu(menuManager, artifactTreeViewer);
-
-               getEditor().getSite().setSelectionProvider(artifactTreeViewer);
-
-               // packagesViewer.setComparer(new NodeViewerComparer());
-
-               // Model initialisation
-               if (jcrSession != null) {
-                       try {
-                               DistributionEditorInput dei = (DistributionEditorInput) getEditorInput();
-                               if (dei.getArtifactsBase().equals(DEFAULT_ARTIFACTS_BASE_PATH)) {
-                                       rootNode = jcrSession.getRootNode();
-                               } else {
-                                       rootNode = jcrSession.getNode(dei.getArtifactsBase());
-                               }
-                               artifactTreeViewer.setInput(rootNode);
-                       } catch (RepositoryException e) {
-                               throw new ArgeoException("Cannot load base artifact nodes", e);
-                       }
+               try {
+                       ScrolledForm form = managedForm.getForm();
+                       Composite parent = form.getBody();
+                       // Enable the different parts to fill the whole page when the tab is
+                       // maximized
+                       parent.setLayout(new FillLayout());
+                       createExportPackageSection(parent);
+                       getEditor().getSite().setSelectionProvider(artifactTreeViewer);
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot create artifact browser page", e);
                }
        }
 
-       protected TreeViewer createArtifactsTreeViewer(Composite parent) {
-               int style = SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION;
-               Tree tree = new Tree(parent, style);
-               createColumn(tree, "Artifacts", SWT.LEFT, 300);
-               createColumn(tree, "Date created", SWT.LEFT, 105);
-               createColumn(tree, "Size", SWT.RIGHT, 0);
-               tree.setLinesVisible(true);
-               tree.setHeaderVisible(true);
+       private NodeIterator listNodes(String nodeType, String orderBy)
+                       throws RepositoryException {
+               QueryManager queryManager = session.getWorkspace().getQueryManager();
+               QueryObjectModelFactory factory = queryManager.getQOMFactory();
 
-               TreeViewer viewer = new TreeViewer(tree);
+               final String nodeSelector = "nodes";
+               Selector source = factory.selector(nodeType, nodeSelector);
 
-               viewer.setContentProvider(new ArtifactsTreeContentProvider());
-               viewer.setLabelProvider(new ArtifactLabelProvider());
-               viewer.addSelectionChangedListener(new ArtifactTreeSelectionListener());
-               viewer.addDoubleClickListener(new GenericDoubleClickListener());
-               viewer.setInput(rootNode);
+               Ordering order = factory.ascending(factory.propertyValue(nodeSelector,
+                               orderBy));
+               Ordering[] orderings = { order };
 
-               return viewer;
-       }
+               QueryObjectModel query = factory.createQuery(source, null, orderings,
+                               null);
 
-       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;
-       }
+               QueryResult result = query.execute();
 
-       protected TreeViewer getArtifactTreeViewer() {
-               return artifactTreeViewer;
+               return result.getNodes();
        }
 
-       /**
-        * Refresh the given element of the tree browser. If null is passed as a
-        * parameter, it refreshes the whole tree
-        */
-       public void refresh(Object element) {
-               if (element == null) {
-                       artifactTreeViewer.refresh(rootNode);
-               } else
-                       artifactTreeViewer.refresh(element);
-       }
+       /** Export Package Section */
+       private void createExportPackageSection(Composite parent)
+                       throws RepositoryException {
 
-       /** Returns wether size column is visible or not */
-       public boolean isSizeVisible() {
-               return isSizeVisible;
-       }
-
-       /** Sets the visibility of the size column */
-       public void setSizeVisible(boolean visible) {
-               if (isSizeVisible == visible)
-                       return; // nothing has changed
-               else
-                       isSizeVisible = visible;
-
-               if (visible) {
-                       artifactTreeViewer.getTree().getColumn(COLUMN_SIZE)
-                                       .setWidth(SIZE_COL_WIDTH);
-               } else {
-                       // we just hide the column, we don't refresh the whole tree.
-                       artifactTreeViewer.getTree().getColumn(COLUMN_SIZE).setWidth(0);
-               }
-       }
-
-       private class ArtifactLabelProvider extends ColumnLabelProvider implements
-                       DistConstants, SlcTypes {
-
-               // Utils
-               protected DateFormat timeFormatter = new SimpleDateFormat(
-                               DATE_TIME_FORMAT);
+               int style = SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL
+                               | SWT.FULL_SELECTION | SWT.BORDER;
+               Tree tree = new Tree(parent, style);
+               createColumn(tree, "Artifacts", SWT.LEFT, 300);
+               tree.setLinesVisible(true);
+               tree.setHeaderVisible(true);
 
-               public void update(ViewerCell cell) {
-                       int colIndex = cell.getColumnIndex();
-                       Object element = cell.getElement();
-                       cell.setText(getColumnText(element, colIndex));
+               artifactTreeViewer = new TreeViewer(tree);
 
-                       if (element instanceof Node && colIndex == 0) {
+               artifactTreeViewer.setLabelProvider(new ColumnLabelProvider() {
+                       @Override
+                       public String getText(Object element) {
                                Node node = (Node) element;
                                try {
-                                       if (node.isNodeType(SLC_ARTIFACT_BASE))
-                                               cell.setImage(DistImages.IMG_ARTIFACT_BASE);
-                                       else if (node.isNodeType(SLC_ARTIFACT_VERSION_BASE))
-                                               cell.setImage(DistImages.IMG_ARTIFACT_VERSION_BASE);
+                                       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) {
-                                       // Silent
+                                       throw new SlcException("Cannot browse artifacts", e);
                                }
                        }
-               }
-
-               @Override
-               public Image getImage(Object element) {
 
-                       if (element instanceof Node) {
+                       @Override
+                       public Image getImage(Object element) {
                                Node node = (Node) element;
                                try {
-                                       if (node.isNodeType(SLC_ARTIFACT_BASE)) {
+
+                                       if (node.isNodeType(SlcTypes.SLC_GROUP_BASE))
+                                               return DistImages.IMG_WKSP;
+                                       else if (node.isNodeType(SlcTypes.SLC_ARTIFACT_BASE))
                                                return DistImages.IMG_ARTIFACT_BASE;
-                                       } else if (node.isNodeType(SLC_ARTIFACT_VERSION_BASE)) {
+                                       else if (node
+                                                       .isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE))
                                                return DistImages.IMG_ARTIFACT_VERSION_BASE;
-                                       }
+                                       else
+                                               return null;
                                } catch (RepositoryException e) {
-                                       // Silent
+                                       throw new SlcException("Cannot get images for artifacts", e);
                                }
                        }
-                       return null;
-               }
+               });
 
-               public String getColumnText(Object element, int columnIndex) {
-                       try {
-                               if (element instanceof Node) {
-                                       Node node = (Node) element;
-                                       switch (columnIndex) {
-                                       case COLUMN_TREE:
-                                               return node.getName();
-                                       case COLUMN_SIZE:
-                                               if (isSizeVisible) {
-                                                       long size = JcrUtils.getNodeApproxSize(node) / 1024;
-                                                       if (size > 1024)
-                                                               return size / 1024 + " MB";
-                                                       else
-                                                               return size + " KB";
-                                               } else
-                                                       return "";
-                                       case COLUMN_DATE:
-                                               if (node.hasProperty(Property.JCR_CREATED))
-                                                       return timeFormatter.format(node
-                                                                       .getProperty(Property.JCR_CREATED)
-                                                                       .getDate().getTime());
-                                               else
-                                                       return null;
+               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);
                                }
-                       } catch (RepositoryException re) {
-                               throw new ArgeoException(
-                                               "Unexepected error while getting property values", re);
                        }
-                       return null;
-               }
 
-               // private String formatValueAsString(Value value) {
-               // // TODO enhance this method
-               // try {
-               // String strValue;
-               //
-               // if (value.getType() == PropertyType.BINARY)
-               // strValue = "<binary>";
-               // else if (value.getType() == PropertyType.DATE)
-               // strValue = timeFormatter.format(value.getDate().getTime());
-               // else
-               // strValue = value.getString();
-               // return strValue;
-               // } catch (RepositoryException e) {
-               // throw new ArgeoException(
-               // "unexpected error while formatting value", 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();
+                       }
 
-       private class ArtifactTreeSelectionListener implements
-                       ISelectionChangedListener {
+                       public Object getParent(Object element) {
+                               return null;
+                       }
 
-               public void selectionChanged(SelectionChangedEvent event) {
-                       ISelection selection = event.getSelection();
-                       if (selection != null && selection instanceof IStructuredSelection) {
-                               IStructuredSelection iss = (IStructuredSelection) selection;
-                               if (iss.size() == 1) {
-                                       artifactTreeViewer.refresh(iss.getFirstElement());
+                       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();
+                       try {
+                               if (obj instanceof Node) {
+                                       Node node = (Node) obj;
+                                       if (node.isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE)) {
+                                               // TODO fix using QOM after jcr upgrade
+                                               NodeIterator ni = node.getNodes();
+                                               while (ni.hasNext()) {
+                                                       Node curr = ni.nextNode();
+                                                       if (curr.isNodeType(SlcTypes.SLC_BUNDLE_ARTIFACT)) {
+                                                               GenericBundleEditorInput gaei = new GenericBundleEditorInput(
+                                                                               curr);
+                                                               DistPlugin
+                                                                               .getDefault()
+                                                                               .getWorkbench()
+                                                                               .getActiveWorkbenchWindow()
+                                                                               .getActivePage()
+                                                                               .openEditor(gaei,
+                                                                                               GenericBundleEditor.ID);
+                                                       }
+                                               }
+                                       }
+                               }
+                       } catch (RepositoryException re) {
+                               throw new ArgeoException(
+                                               "Repository error while getting node info", re);
+                       } catch (PartInitException pie) {
+                               throw new ArgeoException(
+                                               "Unexepected exception while opening artifact editor",
+                                               pie);
+                       }
                }
+       }
 
+       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;
        }
+
 }