X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=plugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Feditors%2FArtifactsBrowserPage.java;h=48afaec6ca8cf3d34ad63337a324e220b60beadf;hb=0d236262a853a1286b317c30d64d4692bc21c7a4;hp=4fcd9632857bd0b7a1cb15eea631b7abb22b1493;hpb=30337022a8b1ffe10eb645791d767d41c3db4e40;p=gpl%2Fargeo-slc.git diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactsBrowserPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactsBrowserPage.java index 4fcd96328..48afaec6c 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactsBrowserPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/ArtifactsBrowserPage.java @@ -1,5 +1,5 @@ /* - * 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. @@ -15,282 +15,275 @@ */ 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.PropertyType; +import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.Value; +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.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; + final static String PAGE_ID = "artifactsBrowserPage"; + // private final static Log log = LogFactory + // .getLog(ArtifactsBrowserPage.class); - // 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 { - rootNode = jcrSession.getNode(ARTIFACTS_BASE_PATH); - 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)); - 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 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 = ""; - 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 nodes = new ArrayList(); + 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; } + }