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%2FBundleDetailsPage.java;h=b9e7ab30662bd947fcf5e0b3820acb3015509895;hb=7af5edc4d006d39174dba9665b0f78ccc2f9dfe6;hp=dc605e67e7be8a393829650c8f25e8c2c126b4e3;hpb=de4970e4ea18056ef32137834bb0ac59b23117ce;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/BundleDetailsPage.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java index dc605e67e..b9e7ab306 100644 --- a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java +++ b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/editors/BundleDetailsPage.java @@ -15,26 +15,24 @@ */ 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,16 +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); - // Single sourcing issue: this does not works with rap - // createHyperlink(details, "Licence", - // DistConstants.SLC_BUNDLE_LICENCE); - createField(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 { @@ -143,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; } }); @@ -180,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 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); } @@ -201,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); } @@ -215,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 */ @@ -228,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 @@ -291,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 @@ -326,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 { @@ -402,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; @@ -446,9 +543,9 @@ public class BundleDetailsPage extends FormPage implements SlcNames, SlcTypes { try { StringBuffer sb = new StringBuffer(); sb.append("\n"); - sb.append("\t"); + sb.append("\t"); sb.append(currBundle.getProperty(SLC_GROUP_ID).getString()); - sb.append("\n"); + sb.append("\n"); sb.append("\t"); sb.append(currBundle.getProperty(SLC_ARTIFACT_ID).getString()); sb.append("\n");