]> 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/BundleDetailsPage.java
work on fetch and normalization.
[gpl/argeo-slc.git] / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / editors / BundleDetailsPage.java
index 269466083b12240c64b6d559d859d506d3b11edb..b9e7ab30662bd947fcf5e0b3820acb3015509895 100644 (file)
  */
 package org.argeo.slc.client.ui.dist.editors;
 
+import java.net.URL;
 import java.util.List;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.jcr.query.qom.Constraint;
-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.eclipse.ui.ErrorFeedback;
 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.utils.AbstractHyperlinkListener;
 import org.argeo.slc.jcr.SlcNames;
 import org.argeo.slc.jcr.SlcTypes;
+import org.argeo.slc.repo.RepoConstants;
+import org.argeo.slc.repo.RepoUtils;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.ITreeContentProvider;
@@ -48,14 +46,20 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.browser.IWebBrowser;
+import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
 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.events.HyperlinkEvent;
 import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
 import org.eclipse.ui.forms.widgets.ScrolledForm;
 import org.eclipse.ui.forms.widgets.Section;
 
@@ -97,7 +101,7 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                        createExportPackageSection(body);
                        createImportPackageSection(body);
                        createReqBundleSection(body);
-                       createMavenSnipet(body);
+                       createMavenSnippet(body);
 
                } catch (RepositoryException e) {
                        throw new SlcException("unexpected error "
@@ -115,12 +119,48 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                createField(details, "Symbolic name", SlcNames.SLC_SYMBOLIC_NAME);
                createField(details, "Version", SlcNames.SLC_BUNDLE_VERSION);
                createField(details, "Group Id", SlcNames.SLC_GROUP_ID);
-               //createHyperlink(details, "Licence", DistConstants.SLC_BUNDLE_LICENCE);
+               createHyperlink(details, "Licence", DistConstants.SLC_BUNDLE_LICENCE);
                createField(details, "Vendor", DistConstants.SLC_BUNDLE_VENDOR);
+               addSourceAvailableLabel(details);
 
        }
 
-       /** Import Package Section */
+       // helper to check if sources are available
+       private void addSourceAvailableLabel(Composite parent) {
+               Button srcChk = toolkit.createButton(parent, "Sources available",
+                               SWT.CHECK);
+               srcChk.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 2, 1));
+
+               try {
+                       String srcPath = RepoUtils.relatedPdeSourcePath(
+                                       RepoConstants.DEFAULT_ARTIFACTS_BASE_PATH, currBundle);
+                       srcChk.setSelection(currBundle.getSession().nodeExists(srcPath));
+               } catch (RepositoryException e) {
+                       throw new SlcException("Unable to check sources", e);
+               }
+               srcChk.setEnabled(false);
+       }
+
+       // Workaround to add an artificial level to the export package browser
+       private class LevelElem {
+               private String label;
+               private Object parent;
+
+               public LevelElem(String label, Object parent) {
+                       this.label = label;
+                       this.parent = parent;
+               }
+
+               public String toString() {
+                       return label;
+               }
+
+               public Object getParent() {
+                       return parent;
+               }
+       }
+
+       /** Export Package Section */
        private void createExportPackageSection(Composite parent)
                        throws RepositoryException {
 
@@ -139,16 +179,29 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                tree.setLayoutData(gd);
 
                TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.FILL);
-               col.getColumn().setWidth(200);
+               col.getColumn().setWidth(400);
 
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
                        public String getText(Object element) {
-                               return JcrUtils.get((Node) element, SlcNames.SLC_NAME);
+                               if (element instanceof Node)
+                                       return JcrUtils.get((Node) element, SlcNames.SLC_NAME);
+                               else
+                                       return element.toString();
                        }
 
                        @Override
                        public Image getImage(Object element) {
+                               if (element instanceof Node) {
+                                       try {
+                                               Node node = (Node) element;
+                                               if (node.isNodeType(SlcTypes.SLC_EXPORTED_PACKAGE))
+                                                       return DistImages.IMG_PACKAGE;
+                                       } catch (RepositoryException e) {
+                                               throw new SlcException("Error retriving "
+                                                               + "image for the labelProvider", e);
+                                       }
+                               }
                                return null;
                        }
                });
@@ -176,15 +229,25 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                        public Object[] getChildren(Object parentElement) {
                                // Only 2 levels for the time being
                                try {
-                                       Node pNode = (Node) parentElement;
-                                       if (pNode.isNodeType(SlcTypes.SLC_EXPORTED_PACKAGE)) {
+                                       if (parentElement instanceof LevelElem) {
+                                               Node node = (Node) ((LevelElem) parentElement)
+                                                               .getParent();
                                                List<Node> nodes = JcrUtils
-                                                               .nodeIteratorToList(listNodes(pNode,
+                                                               .nodeIteratorToList(listNodes(node,
                                                                                SlcTypes.SLC_JAVA_PACKAGE,
                                                                                SlcNames.SLC_NAME));
                                                return nodes.toArray();
-                                       } else
-                                               return null;
+                                       } else if (parentElement instanceof Node) {
+                                               Node pNode = (Node) parentElement;
+                                               if (pNode.isNodeType(SlcTypes.SLC_EXPORTED_PACKAGE)) {
+                                                       if (listNodes(pNode, SlcTypes.SLC_JAVA_PACKAGE,
+                                                                       SlcNames.SLC_NAME).getSize() > 0) {
+                                                               Object[] result = { new LevelElem("uses", pNode) };
+                                                               return result;
+                                                       }
+                                               }
+                                       }
+                                       return null;
                                } catch (RepositoryException e) {
                                        throw new SlcException("Cannot list children Nodes", e);
                                }
@@ -197,12 +260,16 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
 
                        public boolean hasChildren(Object element) {
                                try {
-                                       Node pNode = (Node) element;
-                                       if (pNode.isNodeType(SlcTypes.SLC_EXPORTED_PACKAGE)) {
-                                               // might return true even if there is no "valid" child
-                                               return pNode.hasNodes();
-                                       } else
-                                               return false;
+                                       if (element instanceof LevelElem)
+                                               return true;
+                                       else {
+                                               Node pNode = (Node) element;
+                                               if (pNode.isNodeType(SlcTypes.SLC_EXPORTED_PACKAGE)) {
+                                                       return listNodes(pNode, SlcTypes.SLC_JAVA_PACKAGE,
+                                                                       SlcNames.SLC_NAME).getSize() > 0;
+                                               }
+                                       }
+                                       return false;
                                } catch (RepositoryException e) {
                                        throw new SlcException("Cannot check children Nodes", e);
                                }
@@ -211,6 +278,9 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
 
                headerSection.setClient(tree);
                viewer.setInput("Initialize");
+               // work around a display problem : the tree table has only a few lines
+               // when the tree is not expended
+               viewer.expandToLevel(3);
        }
 
        /** Import Package Section */
@@ -224,13 +294,18 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
 
                // Name
                TableViewerColumn col = new TableViewerColumn(viewer, SWT.NONE);
-               col.getColumn().setWidth(300);
+               col.getColumn().setWidth(350);
                col.getColumn().setText("Name");
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
                        public String getText(Object element) {
                                return JcrUtils.get((Node) element, SLC_NAME);
                        }
+
+                       public Image getImage(Object element) {
+                               return DistImages.IMG_PACKAGE;
+                       }
+
                });
 
                // Version
@@ -287,11 +362,16 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                        public String getText(Object element) {
                                return JcrUtils.get((Node) element, SLC_SYMBOLIC_NAME);
                        }
+
+                       @Override
+                       public Image getImage(Object element) {
+                               return DistImages.IMG_BUNDLE;
+                       }
                });
 
                // Version
                col = new TableViewerColumn(viewer, SWT.NONE);
-               col.getColumn().setWidth(100);
+               col.getColumn().setWidth(140);
                col.getColumn().setText("Version");
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
@@ -322,28 +402,49 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                viewer.setInput("Initialize");
        }
 
-       /** Build repository request */
+       /**
+        * Build repository request
+        * 
+        * FIXME Workaround for remote repository, the path to bundleartifact (for
+        * instance
+        * .../org/argeo/slc/org.argeo.slc.client.ui.dist/1.1.12/org.argeo.slc
+        * .client.ui.dist-1.1.12/ ) is not valid for method factory.childNode(); it
+        * fails parsing the "1.1.12" part, trying to cast it as a BigDecimal
+        * 
+        * */
        private NodeIterator listNodes(Node parent, String nodeType, String orderBy)
                        throws RepositoryException {
-               QueryManager queryManager = currBundle.getSession().getWorkspace()
-                               .getQueryManager();
-               QueryObjectModelFactory factory = queryManager.getQOMFactory();
-
-               final String nodeSelector = "nodes";
-               Selector source = factory.selector(nodeType, nodeSelector);
-
-               Constraint childOf = factory.childNode(nodeSelector, parent.getPath());
-
-               Ordering order = factory.ascending(factory.propertyValue(nodeSelector,
-                               orderBy));
-               Ordering[] orderings = { order };
-
-               QueryObjectModel query = factory.createQuery(source, childOf,
-                               orderings, null);
-
-               QueryResult result = query.execute();
-               return result.getNodes();
-
+               // QueryManager queryManager = currBundle.getSession().getWorkspace()
+               // .getQueryManager();
+               // QueryObjectModelFactory factory = queryManager.getQOMFactory();
+               //
+               // final String nodeSelector = "nodes";
+               // Selector source = factory.selector(nodeType, nodeSelector);
+               //
+               // Constraint childOf = factory.childNode(nodeSelector,
+               // parent.getPath());
+               //
+               // Ordering order =
+               // factory.ascending(factory.propertyValue(nodeSelector,
+               // orderBy));
+               // Ordering[] orderings = { order };
+               //
+               // QueryObjectModel query = factory.createQuery(source, childOf,
+               // orderings, null);
+               //
+               // QueryResult result = query.execute();
+
+               String pattern = null;
+               if (SlcTypes.SLC_EXPORTED_PACKAGE.equals(nodeType))
+                       pattern = "slc:Export-Package*";
+               else if (SlcTypes.SLC_JAVA_PACKAGE.equals(nodeType))
+                       pattern = "slc:uses*";
+               else if (SlcTypes.SLC_IMPORTED_PACKAGE.equals(nodeType))
+                       pattern = "slc:Import-Package*";
+               else if (SlcTypes.SLC_REQUIRED_BUNDLE.equals(nodeType))
+                       pattern = "slc:Require-Bundle*";
+
+               return parent.getNodes(pattern);
        }
 
        private class TableContentProvider implements IStructuredContentProvider {
@@ -398,37 +499,37 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                return section;
        }
 
-       // private void createHyperlink(Composite parent, String label,
-       // String jcrPropName) throws RepositoryException {
-       // toolkit.createLabel(parent, label, SWT.NONE);
-       // if (currBundle.hasProperty(jcrPropName)) {
-       // final Hyperlink link = toolkit.createHyperlink(parent, currBundle
-       // .getProperty(jcrPropName).getString(), SWT.NONE);
-       // link.addHyperlinkListener(new AbstractHyperlinkListener() {
-       // @Override
-       // public void linkActivated(HyperlinkEvent e) {
-       // try {
-       // IWorkbenchBrowserSupport browserSupport = PlatformUI
-       // .getWorkbench().getBrowserSupport();
-       // IWebBrowser browser = browserSupport
-       // .createBrowser(
-       // IWorkbenchBrowserSupport.LOCATION_BAR
-       // | IWorkbenchBrowserSupport.NAVIGATION_BAR,
-       // "SLC Distribution browser",
-       // "SLC Distribution browser",
-       // "A tool tip");
-       // browser.openURL(new URL(link.getText()));
-       // } catch (Exception ex) {
-       //                                              throw new SlcException("error opening browser", ex); //$NON-NLS-1$
-       // }
-       // }
-       // });
-       // } else
-       // toolkit.createLabel(parent, "", SWT.NONE);
-       // }
+       private void createHyperlink(Composite parent, String label,
+                       String jcrPropName) throws RepositoryException {
+               toolkit.createLabel(parent, label, SWT.NONE);
+               if (currBundle.hasProperty(jcrPropName)) {
+                       final Hyperlink link = toolkit.createHyperlink(parent, currBundle
+                                       .getProperty(jcrPropName).getString(), SWT.NONE);
+                       link.addHyperlinkListener(new AbstractHyperlinkListener() {
+                               @Override
+                               public void linkActivated(HyperlinkEvent e) {
+                                       try {
+                                               IWorkbenchBrowserSupport browserSupport = PlatformUI
+                                                               .getWorkbench().getBrowserSupport();
+                                               IWebBrowser browser = browserSupport
+                                                               .createBrowser(
+                                                                               IWorkbenchBrowserSupport.LOCATION_BAR
+                                                                                               | IWorkbenchBrowserSupport.NAVIGATION_BAR,
+                                                                               "SLC Distribution browser",
+                                                                               "SLC Distribution browser",
+                                                                               "A tool tip");
+                                               browser.openURL(new URL(link.getText()));
+                                       } catch (Exception ex) {
+                                               throw new SlcException("error opening browser", ex); //$NON-NLS-1$
+                                       }
+                               }
+                       });
+               } else
+                       toolkit.createLabel(parent, "", SWT.NONE);
+       }
 
        /** Creates a text area with corresponding maven snippet */
-       private void createMavenSnipet(Composite parent) {
+       private void createMavenSnippet(Composite parent) {
                mavenSnippet = new Text(parent, SWT.MULTI | SWT.WRAP | SWT.BORDER);
                GridData gd = new GridData(GridData.FILL_HORIZONTAL);
                gd.grabExcessHorizontalSpace = true;
@@ -442,9 +543,9 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes {
                try {
                        StringBuffer sb = new StringBuffer();
                        sb.append("<dependency>\n");
-                       sb.append("\t<groupeId>");
+                       sb.append("\t<groupId>");
                        sb.append(currBundle.getProperty(SLC_GROUP_ID).getString());
-                       sb.append("</groupeId>\n");
+                       sb.append("</groupId>\n");
                        sb.append("\t<artifactId>");
                        sb.append(currBundle.getProperty(SLC_ARTIFACT_ID).getString());
                        sb.append("</artifactId>\n");