1 package org
.argeo
.eclipse
.ui
.jcr
.views
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Arrays
;
5 import java
.util
.Comparator
;
8 import java
.util
.TreeSet
;
10 import javax
.jcr
.Item
;
11 import javax
.jcr
.Node
;
12 import javax
.jcr
.NodeIterator
;
13 import javax
.jcr
.Property
;
14 import javax
.jcr
.PropertyIterator
;
15 import javax
.jcr
.PropertyType
;
16 import javax
.jcr
.RepositoryException
;
17 import javax
.jcr
.Session
;
18 import javax
.jcr
.nodetype
.NodeType
;
20 import org
.argeo
.ArgeoException
;
21 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
22 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
23 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
24 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
25 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
26 import org
.eclipse
.jface
.viewers
.LabelProvider
;
27 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
28 import org
.eclipse
.jface
.viewers
.TableViewer
;
29 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
30 import org
.eclipse
.jface
.viewers
.TreeViewer
;
31 import org
.eclipse
.jface
.viewers
.Viewer
;
32 import org
.eclipse
.swt
.SWT
;
33 import org
.eclipse
.swt
.custom
.SashForm
;
34 import org
.eclipse
.swt
.layout
.FillLayout
;
35 import org
.eclipse
.swt
.layout
.GridData
;
36 import org
.eclipse
.swt
.layout
.GridLayout
;
37 import org
.eclipse
.swt
.widgets
.Composite
;
38 import org
.eclipse
.ui
.part
.ViewPart
;
40 public class GenericJcrBrowser
extends ViewPart
{
41 // private final static Log log =
42 // LogFactory.getLog(GenericJcrBrowser.class);
44 private TreeViewer nodesViewer
;
45 private TableViewer propertiesViewer
;
47 private Session jcrSession
;
49 private Comparator
<Item
> itemComparator
= new Comparator
<Item
>() {
50 public int compare(Item o1
, Item o2
) {
52 return o1
.getName().compareTo(o2
.getName());
53 } catch (RepositoryException e
) {
54 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
61 public void createPartControl(Composite parent
) {
62 parent
.setLayout(new FillLayout());
64 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
65 sashForm
.setSashWidth(4);
66 sashForm
.setLayout(new FillLayout());
68 Composite top
= new Composite(sashForm
, SWT
.NONE
);
69 GridLayout gl
= new GridLayout(1, false);
72 nodesViewer
= new TreeViewer(top
, SWT
.MULTI
| SWT
.H_SCROLL
74 nodesViewer
.getTree().setLayoutData(
75 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
76 nodesViewer
.setContentProvider(new NodeContentProvider());
77 nodesViewer
.setLabelProvider(new NodeLabelProvider());
79 .addSelectionChangedListener(new ISelectionChangedListener() {
80 public void selectionChanged(SelectionChangedEvent event
) {
81 if (!event
.getSelection().isEmpty()) {
82 IStructuredSelection sel
= (IStructuredSelection
) event
84 propertiesViewer
.setInput(sel
.getFirstElement());
86 propertiesViewer
.setInput(getViewSite());
91 nodesViewer
.setInput(jcrSession
.getRootNode());
92 } catch (RepositoryException e
) {
93 throw new ArgeoException("Cannot initialize view", e
);
96 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
97 bottom
.setLayout(new GridLayout(1, false));
99 propertiesViewer
= new TableViewer(bottom
);
100 propertiesViewer
.getTable().setLayoutData(
101 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
102 propertiesViewer
.getTable().setHeaderVisible(true);
103 propertiesViewer
.setContentProvider(new PropertiesContentProvider());
104 TableViewerColumn col
= new TableViewerColumn(propertiesViewer
,
106 col
.getColumn().setText("Name");
107 col
.getColumn().setWidth(200);
108 col
.setLabelProvider(new ColumnLabelProvider() {
109 public String
getText(Object element
) {
111 return ((Property
) element
).getName();
112 } catch (RepositoryException e
) {
113 throw new ArgeoException(
114 "Unexpected exception in label provider", e
);
118 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
119 col
.getColumn().setText("Value");
120 col
.getColumn().setWidth(400);
121 col
.setLabelProvider(new ColumnLabelProvider() {
122 public String
getText(Object element
) {
124 Property property
= (Property
) element
;
125 if (property
.getType() == PropertyType
.BINARY
)
127 else if (property
.isMultiple())
128 return Arrays
.asList(property
.getValues()).toString();
130 return property
.getValue().getString();
131 } catch (RepositoryException e
) {
132 throw new ArgeoException(
133 "Unexpected exception in label provider", e
);
137 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
138 col
.getColumn().setText("Type");
139 col
.getColumn().setWidth(200);
140 col
.setLabelProvider(new ColumnLabelProvider() {
141 public String
getText(Object element
) {
143 return PropertyType
.nameFromValue(((Property
) element
)
145 } catch (RepositoryException e
) {
146 throw new ArgeoException(
147 "Unexpected exception in label provider", e
);
151 propertiesViewer
.setInput(getViewSite());
153 sashForm
.setWeights(getWeights());
158 public void setFocus() {
159 nodesViewer
.getTree().setFocus();
163 * To be overidden to adapt size of form and result frames.
167 protected int[] getWeights() {
168 return new int[] { 70, 30 };
171 public void setJcrSession(Session jcrSession
) {
172 this.jcrSession
= jcrSession
;
178 private class NodeContentProvider
implements ITreeContentProvider
{
180 public Object
[] getElements(Object inputElement
) {
181 return getChildren(inputElement
);
184 public Object
[] getChildren(Object parentElement
) {
186 if (parentElement
instanceof Node
) {
187 List
<Node
> children
= new ArrayList
<Node
>();
188 NodeIterator nit
= ((Node
) parentElement
).getNodes();
189 while (nit
.hasNext()) {
190 Node node
= nit
.nextNode();
193 Node
[] arr
= children
.toArray(new Node
[children
.size()]);
194 Arrays
.sort(arr
, itemComparator
);
199 } catch (RepositoryException e
) {
200 throw new ArgeoException("Cannot retrieve children for "
205 public Object
getParent(Object element
) {
207 if (element
instanceof Node
) {
208 return ((Node
) element
).getParent();
211 } catch (RepositoryException e
) {
212 throw new ArgeoException(
213 "Cannot retrieve parent of " + element
, e
);
217 public boolean hasChildren(Object element
) {
219 if (element
instanceof Node
) {
220 return ((Node
) element
).hasNodes();
223 } catch (RepositoryException e
) {
224 throw new ArgeoException("Cannot check children of " + element
,
229 public void dispose() {
232 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
237 class NodeLabelProvider
extends LabelProvider
{
239 public String
getText(Object element
) {
241 if (element
instanceof Node
) {
242 Node node
= (Node
) element
;
243 String label
= node
.getName();
245 // Item primaryItem = node.getPrimaryItem();
246 // label = primaryItem instanceof Property ? ((Property)
248 // .getValue().getString()
251 // + ")" : node.getName();
252 // } catch (RepositoryException e) {
253 // label = node.getName();
255 StringBuffer mixins
= new StringBuffer("");
256 for (NodeType type
: node
.getMixinNodeTypes())
257 mixins
.append(' ').append(type
.getName());
259 return label
+ " [" + node
.getPrimaryNodeType().getName()
262 return element
.toString();
263 } catch (RepositoryException e
) {
264 throw new ArgeoException("Cannot get text for of " + element
, e
);
273 private class PropertiesContentProvider
implements
274 IStructuredContentProvider
{
276 public void dispose() {
279 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
282 public Object
[] getElements(Object inputElement
) {
284 if (inputElement
instanceof Node
) {
285 Set
<Property
> props
= new TreeSet
<Property
>(itemComparator
);
286 PropertyIterator pit
= ((Node
) inputElement
)
288 while (pit
.hasNext())
289 props
.add(pit
.nextProperty());
290 return props
.toArray();
292 return new Object
[] {};
293 } catch (RepositoryException e
) {
294 throw new ArgeoException("Cannot get element for "