2 * Copyright (C) 2007-2012 Argeo GmbH
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.slc
.client
.ui
.dist
.editors
;
18 import java
.util
.List
;
20 import javax
.jcr
.Node
;
21 import javax
.jcr
.NodeIterator
;
22 import javax
.jcr
.RepositoryException
;
24 import org
.argeo
.ArgeoException
;
25 import org
.argeo
.eclipse
.ui
.ErrorFeedback
;
26 import org
.argeo
.jcr
.JcrUtils
;
27 import org
.argeo
.slc
.SlcException
;
28 import org
.argeo
.slc
.client
.ui
.dist
.DistConstants
;
29 import org
.argeo
.slc
.client
.ui
.dist
.DistImages
;
30 import org
.argeo
.slc
.jcr
.SlcNames
;
31 import org
.argeo
.slc
.jcr
.SlcTypes
;
32 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
33 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
34 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
35 import org
.eclipse
.jface
.viewers
.TableLayout
;
36 import org
.eclipse
.jface
.viewers
.TableViewer
;
37 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
38 import org
.eclipse
.jface
.viewers
.TreeViewer
;
39 import org
.eclipse
.jface
.viewers
.TreeViewerColumn
;
40 import org
.eclipse
.jface
.viewers
.Viewer
;
41 import org
.eclipse
.swt
.SWT
;
42 import org
.eclipse
.swt
.graphics
.Image
;
43 import org
.eclipse
.swt
.layout
.GridData
;
44 import org
.eclipse
.swt
.layout
.GridLayout
;
45 import org
.eclipse
.swt
.widgets
.Composite
;
46 import org
.eclipse
.swt
.widgets
.Table
;
47 import org
.eclipse
.swt
.widgets
.Text
;
48 import org
.eclipse
.swt
.widgets
.Tree
;
49 import org
.eclipse
.ui
.forms
.IManagedForm
;
50 import org
.eclipse
.ui
.forms
.editor
.FormEditor
;
51 import org
.eclipse
.ui
.forms
.editor
.FormPage
;
52 import org
.eclipse
.ui
.forms
.widgets
.FormToolkit
;
53 import org
.eclipse
.ui
.forms
.widgets
.ScrolledForm
;
54 import org
.eclipse
.ui
.forms
.widgets
.Section
;
57 * Presents main information of a given OSGI bundle
60 public class BundleDetailsPage
extends FormPage
implements SlcNames
, SlcTypes
{
61 // private final static Log log =
62 // LogFactory.getLog(ArtifactDetailsPage.class);
64 // Main business Objects
65 private Node currBundle
;
68 private Text mavenSnippet
;
69 private FormToolkit toolkit
;
71 public BundleDetailsPage(FormEditor editor
, String title
, Node currentNode
) {
72 super(editor
, "id", title
);
73 this.currBundle
= currentNode
;
76 protected void createFormContent(IManagedForm managedForm
) {
77 ScrolledForm form
= managedForm
.getForm();
78 toolkit
= managedForm
.getToolkit();
80 form
.setText(currBundle
.hasProperty(DistConstants
.SLC_BUNDLE_NAME
) ? currBundle
81 .getProperty(DistConstants
.SLC_BUNDLE_NAME
).getString()
83 Composite body
= form
.getBody();
84 GridLayout layout
= new GridLayout(1, false);
85 layout
.marginWidth
= 5;
86 layout
.verticalSpacing
= 15;
88 body
.setLayout(layout
);
89 createdetailsPart(body
);
91 createExportPackageSection(body
);
92 createImportPackageSection(body
);
93 createReqBundleSection(body
);
94 createMavenSnipet(body
);
96 } catch (RepositoryException e
) {
97 throw new SlcException("unexpected error "
98 + "while creating bundle details page");
102 /** Add useful info for the current bundle */
103 private void createdetailsPart(Composite parent
) throws RepositoryException
{
104 Composite details
= toolkit
.createComposite(parent
);
105 GridLayout layout
= new GridLayout(2, false);
106 layout
.horizontalSpacing
= 20;
107 details
.setLayout(layout
);
109 createField(details
, "Symbolic name", SlcNames
.SLC_SYMBOLIC_NAME
);
110 createField(details
, "Version", SlcNames
.SLC_BUNDLE_VERSION
);
111 createField(details
, "Group Id", SlcNames
.SLC_GROUP_ID
);
112 // Single sourcing issue: this does not works with rap
113 // createHyperlink(details, "Licence",
114 // DistConstants.SLC_BUNDLE_LICENCE);
115 createField(details
, "Licence", DistConstants
.SLC_BUNDLE_LICENCE
);
117 createField(details
, "Vendor", DistConstants
.SLC_BUNDLE_VENDOR
);
121 // Workaround to add an artificial level to the export package browser
122 private class LevelElem
{
123 private String label
;
124 private Object parent
;
126 public LevelElem(String label
, Object parent
) {
128 this.parent
= parent
;
131 public String
toString() {
135 public Object
getParent() {
140 /** Export Package Section */
141 private void createExportPackageSection(Composite parent
)
142 throws RepositoryException
{
144 // Define the TableViewer
145 Section headerSection
= addSection(parent
, "Export packages");
146 // TreeViewer viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL
147 // | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
148 TreeViewer viewer
= new TreeViewer(headerSection
, SWT
.MULTI
149 | SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.BORDER
);
151 final Tree tree
= viewer
.getTree();
152 tree
.setHeaderVisible(false);
153 tree
.setLinesVisible(true);
154 GridData gd
= new GridData(SWT
.LEFT
, SWT
.TOP
, true, true);
156 tree
.setLayoutData(gd
);
158 TreeViewerColumn col
= new TreeViewerColumn(viewer
, SWT
.FILL
);
159 col
.getColumn().setWidth(400);
161 col
.setLabelProvider(new ColumnLabelProvider() {
163 public String
getText(Object element
) {
164 if (element
instanceof Node
)
165 return JcrUtils
.get((Node
) element
, SlcNames
.SLC_NAME
);
167 return element
.toString();
171 public Image
getImage(Object element
) {
172 if (element
instanceof Node
) {
175 Node node
= (Node
) element
;
176 if (node
.isNodeType(SlcTypes
.SLC_EXPORTED_PACKAGE
))
177 return DistImages
.IMG_PACKAGE
;
178 else if (node
.isNodeType(SlcTypes
.SLC_JAVA_PACKAGE
))
179 return DistImages
.IMG_PACKAGE
;
181 } catch (RepositoryException e
) {
182 throw new SlcException("Error retriving "
183 + "image for the labelProvider", e
);
190 viewer
.setContentProvider(new ITreeContentProvider() {
192 public void dispose() {
195 public void inputChanged(Viewer viewer
, Object oldInput
,
199 public Object
[] getElements(Object inputElement
) {
201 List
<Node
> nodes
= JcrUtils
.nodeIteratorToList(listNodes(
202 currBundle
, SlcTypes
.SLC_EXPORTED_PACKAGE
,
204 return nodes
.toArray();
205 } catch (RepositoryException e
) {
206 throw new SlcException("Cannot list children Nodes", e
);
210 public Object
[] getChildren(Object parentElement
) {
211 // Only 2 levels for the time being
213 if (parentElement
instanceof LevelElem
) {
214 Node node
= (Node
) ((LevelElem
) parentElement
)
216 List
<Node
> nodes
= JcrUtils
217 .nodeIteratorToList(listNodes(node
,
218 SlcTypes
.SLC_JAVA_PACKAGE
,
220 return nodes
.toArray();
221 } else if (parentElement
instanceof Node
) {
222 Node pNode
= (Node
) parentElement
;
223 if (pNode
.isNodeType(SlcTypes
.SLC_EXPORTED_PACKAGE
)) {
224 if (listNodes(pNode
, SlcTypes
.SLC_JAVA_PACKAGE
,
225 SlcNames
.SLC_NAME
).getSize() > 0) {
226 Object
[] result
= { new LevelElem("uses", pNode
) };
232 } catch (RepositoryException e
) {
233 throw new SlcException("Cannot list children Nodes", e
);
237 public Object
getParent(Object element
) {
242 public boolean hasChildren(Object element
) {
244 if (element
instanceof LevelElem
)
247 Node pNode
= (Node
) element
;
248 if (pNode
.isNodeType(SlcTypes
.SLC_EXPORTED_PACKAGE
)) {
249 return listNodes(pNode
, SlcTypes
.SLC_JAVA_PACKAGE
,
250 SlcNames
.SLC_NAME
).getSize() > 0;
254 } catch (RepositoryException e
) {
255 throw new SlcException("Cannot check children Nodes", e
);
260 headerSection
.setClient(tree
);
261 viewer
.setInput("Initialize");
262 // work around a display problem : the tree table has only a few lines
263 // when the tree is not expended
264 viewer
.expandToLevel(3);
267 /** Import Package Section */
268 private void createImportPackageSection(Composite parent
)
269 throws RepositoryException
{
271 // Define the TableViewer
272 Section headerSection
= addSection(parent
, "Import packages");
273 TableViewer viewer
= new TableViewer(headerSection
, SWT
.MULTI
274 | SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.BORDER
);
277 TableViewerColumn col
= new TableViewerColumn(viewer
, SWT
.NONE
);
278 col
.getColumn().setWidth(350);
279 col
.getColumn().setText("Name");
280 col
.setLabelProvider(new ColumnLabelProvider() {
282 public String
getText(Object element
) {
283 return JcrUtils
.get((Node
) element
, SLC_NAME
);
288 col
= new TableViewerColumn(viewer
, SWT
.NONE
);
289 col
.getColumn().setWidth(100);
290 col
.getColumn().setText("Version");
291 col
.setLabelProvider(new ColumnLabelProvider() {
293 public String
getText(Object element
) {
294 return JcrUtils
.get((Node
) element
, SLC_VERSION
);
299 col
= new TableViewerColumn(viewer
, SWT
.NONE
);
300 col
.getColumn().setWidth(100);
301 col
.getColumn().setText("Optional");
302 col
.setLabelProvider(new ColumnLabelProvider() {
304 public String
getText(Object element
) {
305 return JcrUtils
.get((Node
) element
, SLC_OPTIONAL
);
309 final Table table
= viewer
.getTable();
310 table
.setHeaderVisible(true);
311 table
.setLinesVisible(true);
312 GridData gd
= new GridData(SWT
.LEFT
, SWT
.TOP
, true, true);
314 table
.setLayoutData(gd
);
316 viewer
.setContentProvider(new TableContentProvider(
317 SLC_IMPORTED_PACKAGE
, SLC_NAME
));
318 headerSection
.setClient(viewer
.getTable());
320 viewer
.setInput("Initialize");
323 /** Required Bundle Section */
324 private void createReqBundleSection(Composite parent
)
325 throws RepositoryException
{
327 // Define the TableViewer
328 Section headerSection
= addSection(parent
, "Required bundles");
329 TableViewer viewer
= new TableViewer(headerSection
, SWT
.MULTI
330 | SWT
.H_SCROLL
| SWT
.V_SCROLL
| SWT
.FULL_SELECTION
| SWT
.BORDER
);
333 TableViewerColumn col
= new TableViewerColumn(viewer
, SWT
.NONE
);
334 col
.getColumn().setWidth(300);
335 col
.getColumn().setText("Name");
336 col
.setLabelProvider(new ColumnLabelProvider() {
338 public String
getText(Object element
) {
339 return JcrUtils
.get((Node
) element
, SLC_SYMBOLIC_NAME
);
344 col
= new TableViewerColumn(viewer
, SWT
.NONE
);
345 col
.getColumn().setWidth(100);
346 col
.getColumn().setText("Version");
347 col
.setLabelProvider(new ColumnLabelProvider() {
349 public String
getText(Object element
) {
350 return JcrUtils
.get((Node
) element
, SLC_BUNDLE_VERSION
);
355 col
= new TableViewerColumn(viewer
, SWT
.NONE
);
356 col
.getColumn().setWidth(100);
357 col
.getColumn().setText("Optional");
358 col
.setLabelProvider(new ColumnLabelProvider() {
360 public String
getText(Object element
) {
361 return JcrUtils
.get((Node
) element
, SLC_OPTIONAL
);
365 final Table table
= viewer
.getTable();
366 table
.setHeaderVisible(true);
367 table
.setLinesVisible(true);
369 viewer
.setContentProvider(new TableContentProvider(SLC_REQUIRED_BUNDLE
,
371 headerSection
.setClient(viewer
.getTable());
373 viewer
.setInput("Initialize");
377 * Build repository request
379 * FIXME Workaround for remote repository, the path to bundleartifact (for
381 * .../org/argeo/slc/org.argeo.slc.client.ui.dist/1.1.12/org.argeo.slc
382 * .client.ui.dist-1.1.12/ ) is not valid for method factory.childNode(); it
383 * fails parsing the "1.1.12" part, trying to cast it as a BigDecimal
386 private NodeIterator
listNodes(Node parent
, String nodeType
, String orderBy
)
387 throws RepositoryException
{
388 // QueryManager queryManager = currBundle.getSession().getWorkspace()
389 // .getQueryManager();
390 // QueryObjectModelFactory factory = queryManager.getQOMFactory();
392 // final String nodeSelector = "nodes";
393 // Selector source = factory.selector(nodeType, nodeSelector);
395 // Constraint childOf = factory.childNode(nodeSelector,
396 // parent.getPath());
399 // factory.ascending(factory.propertyValue(nodeSelector,
401 // Ordering[] orderings = { order };
403 // QueryObjectModel query = factory.createQuery(source, childOf,
406 // QueryResult result = query.execute();
408 String pattern
= null;
409 if (SlcTypes
.SLC_EXPORTED_PACKAGE
.equals(nodeType
))
410 pattern
= "slc:Export-Package*";
411 else if (SlcTypes
.SLC_JAVA_PACKAGE
.equals(nodeType
))
412 pattern
= "slc:uses*";
413 else if (SlcTypes
.SLC_IMPORTED_PACKAGE
.equals(nodeType
))
414 pattern
= "slc:Import-Package*";
415 else if (SlcTypes
.SLC_REQUIRED_BUNDLE
.equals(nodeType
))
416 pattern
= "slc:Require-Bundle*";
418 return parent
.getNodes(pattern
);
421 private class TableContentProvider
implements IStructuredContentProvider
{
422 private String nodeType
;
423 private String orderBy
;
425 TableContentProvider(String nodeType
, String orderBy
) {
426 this.nodeType
= nodeType
;
427 this.orderBy
= orderBy
;
430 public void dispose() {
433 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
436 public Object
[] getElements(Object arg0
) {
438 List
<Node
> nodes
= JcrUtils
.nodeIteratorToList(listNodes(
439 currBundle
, nodeType
, orderBy
));
440 return nodes
.toArray();
441 } catch (RepositoryException e
) {
442 ErrorFeedback
.show("Cannot list children Nodes", e
);
449 private void createField(Composite parent
, String label
, String jcrPropName
)
450 throws RepositoryException
{
451 toolkit
.createLabel(parent
, label
, SWT
.NONE
);
452 Text txt
= toolkit
.createText(parent
, "", SWT
.SINGLE
);
453 txt
.setText(currBundle
.hasProperty(jcrPropName
) ? currBundle
454 .getProperty(jcrPropName
).getString() : "");
455 txt
.setEditable(false);
456 GridData gd
= new GridData(SWT
.FILL
, SWT
.TOP
, true, false);
457 txt
.setLayoutData(gd
);
460 private Section
addSection(Composite parent
, String title
) {
461 Section section
= toolkit
.createSection(parent
, Section
.TWISTIE
);
462 section
.setText(title
);
463 section
.setExpanded(false);
464 GridData gd
= new GridData(SWT
.FILL
, SWT
.FILL
, false, false);
465 section
.setLayoutData(gd
);
466 Composite body
= new Composite(section
, SWT
.FILL
);
467 section
.setClient(body
);
469 body
.setLayout(new TableLayout());
473 // private void createHyperlink(Composite parent, String label,
474 // String jcrPropName) throws RepositoryException {
475 // toolkit.createLabel(parent, label, SWT.NONE);
476 // if (currBundle.hasProperty(jcrPropName)) {
477 // final Hyperlink link = toolkit.createHyperlink(parent, currBundle
478 // .getProperty(jcrPropName).getString(), SWT.NONE);
479 // link.addHyperlinkListener(new AbstractHyperlinkListener() {
481 // public void linkActivated(HyperlinkEvent e) {
483 // IWorkbenchBrowserSupport browserSupport = PlatformUI
484 // .getWorkbench().getBrowserSupport();
485 // IWebBrowser browser = browserSupport
487 // IWorkbenchBrowserSupport.LOCATION_BAR
488 // | IWorkbenchBrowserSupport.NAVIGATION_BAR,
489 // "SLC Distribution browser",
490 // "SLC Distribution browser",
492 // browser.openURL(new URL(link.getText()));
493 // } catch (Exception ex) {
494 // throw new SlcException("error opening browser", ex); //$NON-NLS-1$
499 // toolkit.createLabel(parent, "", SWT.NONE);
502 /** Creates a text area with corresponding maven snippet */
503 private void createMavenSnipet(Composite parent
) {
504 mavenSnippet
= new Text(parent
, SWT
.MULTI
| SWT
.WRAP
| SWT
.BORDER
);
505 GridData gd
= new GridData(GridData
.FILL_HORIZONTAL
);
506 gd
.grabExcessHorizontalSpace
= true;
508 mavenSnippet
.setLayoutData(gd
);
509 mavenSnippet
.setText(generateXmlSnippet());
513 private String
generateXmlSnippet() {
515 StringBuffer sb
= new StringBuffer();
516 sb
.append("<dependency>\n");
517 sb
.append("\t<groupeId>");
518 sb
.append(currBundle
.getProperty(SLC_GROUP_ID
).getString());
519 sb
.append("</groupeId>\n");
520 sb
.append("\t<artifactId>");
521 sb
.append(currBundle
.getProperty(SLC_ARTIFACT_ID
).getString());
522 sb
.append("</artifactId>\n");
523 sb
.append("\t<version>");
524 sb
.append(currBundle
.getProperty(SLC_ARTIFACT_VERSION
).getString());
525 sb
.append("</version>\n");
526 sb
.append("</dependency>");
527 return sb
.toString();
528 } catch (RepositoryException re
) {
529 throw new ArgeoException(
530 "unexpected error while generating maven snippet");