1 package org
.argeo
.eclipse
.ui
.jcr
.views
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Arrays
;
5 import java
.util
.Comparator
;
9 import java
.util
.TreeSet
;
11 import javax
.jcr
.Item
;
12 import javax
.jcr
.LoginException
;
13 import javax
.jcr
.Node
;
14 import javax
.jcr
.NodeIterator
;
15 import javax
.jcr
.Property
;
16 import javax
.jcr
.PropertyIterator
;
17 import javax
.jcr
.PropertyType
;
18 import javax
.jcr
.Repository
;
19 import javax
.jcr
.RepositoryException
;
20 import javax
.jcr
.Session
;
21 import javax
.jcr
.nodetype
.NodeType
;
23 import org
.argeo
.ArgeoException
;
24 import org
.argeo
.eclipse
.ui
.TreeParent
;
25 import org
.argeo
.jcr
.RepositoryRegister
;
26 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
27 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
28 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
29 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
30 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
31 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
32 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
33 import org
.eclipse
.jface
.viewers
.LabelProvider
;
34 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
35 import org
.eclipse
.jface
.viewers
.TableViewer
;
36 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
37 import org
.eclipse
.jface
.viewers
.TreeNode
;
38 import org
.eclipse
.jface
.viewers
.TreeViewer
;
39 import org
.eclipse
.jface
.viewers
.Viewer
;
40 import org
.eclipse
.swt
.SWT
;
41 import org
.eclipse
.swt
.custom
.SashForm
;
42 import org
.eclipse
.swt
.layout
.FillLayout
;
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
.ui
.part
.ViewPart
;
48 public class GenericJcrBrowser
extends ViewPart
{
49 // private final static Log log =
50 // LogFactory.getLog(GenericJcrBrowser.class);
52 private TreeViewer nodesViewer
;
53 private TableViewer propertiesViewer
;
55 // private Session jcrSession;
56 private RepositoryRegister repositoryRegister
;
58 private Comparator
<Item
> itemComparator
= new Comparator
<Item
>() {
59 public int compare(Item o1
, Item o2
) {
61 return o1
.getName().compareTo(o2
.getName());
62 } catch (RepositoryException e
) {
63 throw new ArgeoException("Cannot compare " + o1
+ " and " + o2
,
70 public void createPartControl(Composite parent
) {
71 parent
.setLayout(new FillLayout());
73 SashForm sashForm
= new SashForm(parent
, SWT
.VERTICAL
);
74 sashForm
.setSashWidth(4);
75 sashForm
.setLayout(new FillLayout());
77 Composite top
= new Composite(sashForm
, SWT
.NONE
);
78 GridLayout gl
= new GridLayout(1, false);
81 nodesViewer
= new TreeViewer(top
, SWT
.MULTI
| SWT
.H_SCROLL
83 nodesViewer
.getTree().setLayoutData(
84 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
85 nodesViewer
.setContentProvider(new NodeContentProvider());
86 nodesViewer
.setLabelProvider(new NodeLabelProvider());
88 .addSelectionChangedListener(new ISelectionChangedListener() {
89 public void selectionChanged(SelectionChangedEvent event
) {
90 if (!event
.getSelection().isEmpty()) {
91 IStructuredSelection sel
= (IStructuredSelection
) event
93 propertiesViewer
.setInput(sel
.getFirstElement());
95 propertiesViewer
.setInput(getViewSite());
99 nodesViewer
.addDoubleClickListener(new IDoubleClickListener() {
100 public void doubleClick(DoubleClickEvent event
) {
101 Object obj
= ((IStructuredSelection
) event
.getSelection())
103 if (obj
instanceof RepositoryNode
) {
104 ((RepositoryNode
) obj
).login();
105 } else if (obj
instanceof WorkspaceNode
) {
106 ((WorkspaceNode
) obj
).login();
111 nodesViewer
.setInput(repositoryRegister
);
113 Composite bottom
= new Composite(sashForm
, SWT
.NONE
);
114 bottom
.setLayout(new GridLayout(1, false));
116 propertiesViewer
= new TableViewer(bottom
);
117 propertiesViewer
.getTable().setLayoutData(
118 new GridData(SWT
.FILL
, SWT
.FILL
, true, true));
119 propertiesViewer
.getTable().setHeaderVisible(true);
120 propertiesViewer
.setContentProvider(new PropertiesContentProvider());
121 TableViewerColumn col
= new TableViewerColumn(propertiesViewer
,
123 col
.getColumn().setText("Name");
124 col
.getColumn().setWidth(200);
125 col
.setLabelProvider(new ColumnLabelProvider() {
126 public String
getText(Object element
) {
128 return ((Property
) element
).getName();
129 } catch (RepositoryException e
) {
130 throw new ArgeoException(
131 "Unexpected exception in label provider", e
);
135 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
136 col
.getColumn().setText("Value");
137 col
.getColumn().setWidth(400);
138 col
.setLabelProvider(new ColumnLabelProvider() {
139 public String
getText(Object element
) {
141 Property property
= (Property
) element
;
142 if (property
.getType() == PropertyType
.BINARY
)
144 else if (property
.isMultiple())
145 return Arrays
.asList(property
.getValues()).toString();
147 return property
.getValue().getString();
148 } catch (RepositoryException e
) {
149 throw new ArgeoException(
150 "Unexpected exception in label provider", e
);
154 col
= new TableViewerColumn(propertiesViewer
, SWT
.NONE
);
155 col
.getColumn().setText("Type");
156 col
.getColumn().setWidth(200);
157 col
.setLabelProvider(new ColumnLabelProvider() {
158 public String
getText(Object element
) {
160 return PropertyType
.nameFromValue(((Property
) element
)
162 } catch (RepositoryException e
) {
163 throw new ArgeoException(
164 "Unexpected exception in label provider", e
);
168 propertiesViewer
.setInput(getViewSite());
170 sashForm
.setWeights(getWeights());
175 public void setFocus() {
176 nodesViewer
.getTree().setFocus();
180 * To be overidden to adapt size of form and result frames.
184 protected int[] getWeights() {
185 return new int[] { 70, 30 };
188 public void setRepositoryRegister(RepositoryRegister repositoryRegister
) {
189 this.repositoryRegister
= repositoryRegister
;
195 protected Object
[] childrenNodes(Node parentNode
) {
197 List
<Node
> children
= new ArrayList
<Node
>();
198 NodeIterator nit
= parentNode
.getNodes();
199 while (nit
.hasNext()) {
200 Node node
= nit
.nextNode();
203 Node
[] arr
= children
.toArray(new Node
[children
.size()]);
204 Arrays
.sort(arr
, itemComparator
);
206 } catch (RepositoryException e
) {
207 throw new ArgeoException("Cannot list children of " + parentNode
, e
);
211 private class NodeContentProvider
implements ITreeContentProvider
{
213 public Object
[] getElements(Object inputElement
) {
214 return getChildren(inputElement
);
217 public Object
[] getChildren(Object parentElement
) {
218 if (parentElement
instanceof Node
) {
219 return childrenNodes((Node
) parentElement
);
220 } else if (parentElement
instanceof RepositoryNode
) {
221 return ((RepositoryNode
) parentElement
).getChildren();
222 } else if (parentElement
instanceof WorkspaceNode
) {
223 Session session
= ((WorkspaceNode
) parentElement
).getSession();
225 return new Object
[0];
228 return childrenNodes(session
.getRootNode());
229 } catch (RepositoryException e
) {
230 throw new ArgeoException("Cannot retrieve root node of "
233 } else if (parentElement
instanceof RepositoryRegister
) {
234 RepositoryRegister repositoryRegister
= (RepositoryRegister
) parentElement
;
235 List
<RepositoryNode
> nodes
= new ArrayList
<RepositoryNode
>();
236 Map
<String
, Repository
> repositories
= repositoryRegister
238 for (String name
: repositories
.keySet()) {
239 nodes
.add(new RepositoryNode(name
, repositories
.get(name
)));
241 return nodes
.toArray();
243 return new Object
[0];
247 public Object
getParent(Object element
) {
249 if (element
instanceof Node
) {
250 return ((Node
) element
).getParent();
253 } catch (RepositoryException e
) {
254 throw new ArgeoException(
255 "Cannot retrieve parent of " + element
, e
);
259 public boolean hasChildren(Object element
) {
261 if (element
instanceof Node
) {
262 return ((Node
) element
).hasNodes();
263 } else if (element
instanceof RepositoryNode
) {
264 return ((RepositoryNode
) element
).hasChildren();
265 } else if (element
instanceof WorkspaceNode
) {
266 return ((WorkspaceNode
) element
).getSession() != null;
269 } catch (RepositoryException e
) {
270 throw new ArgeoException("Cannot check children of " + element
,
275 public void dispose() {
278 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
283 class NodeLabelProvider
extends LabelProvider
{
285 public String
getText(Object element
) {
287 if (element
instanceof Node
) {
288 Node node
= (Node
) element
;
289 String label
= node
.getName();
291 // Item primaryItem = node.getPrimaryItem();
292 // label = primaryItem instanceof Property ? ((Property)
294 // .getValue().getString()
297 // + ")" : node.getName();
298 // } catch (RepositoryException e) {
299 // label = node.getName();
301 StringBuffer mixins
= new StringBuffer("");
302 for (NodeType type
: node
.getMixinNodeTypes())
303 mixins
.append(' ').append(type
.getName());
305 return label
+ " [" + node
.getPrimaryNodeType().getName()
308 return element
.toString();
309 } catch (RepositoryException e
) {
310 throw new ArgeoException("Cannot get text for of " + element
, e
);
319 private class PropertiesContentProvider
implements
320 IStructuredContentProvider
{
322 public void dispose() {
325 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
328 public Object
[] getElements(Object inputElement
) {
330 if (inputElement
instanceof Node
) {
331 Set
<Property
> props
= new TreeSet
<Property
>(itemComparator
);
332 PropertyIterator pit
= ((Node
) inputElement
)
334 while (pit
.hasNext())
335 props
.add(pit
.nextProperty());
336 return props
.toArray();
338 return new Object
[] {};
339 } catch (RepositoryException e
) {
340 throw new ArgeoException("Cannot get element for "
347 private class RepositoryNode
extends TreeParent
{
348 private final String name
;
349 private final Repository repository
;
350 private Session defaultSession
= null;
352 public RepositoryNode(String name
, Repository repository
) {
355 this.repository
= repository
;
358 public Repository
getRepository() {
362 public Session
getDefaultSession() {
363 return defaultSession
;
366 public void login() {
368 defaultSession
= repository
.login();
369 String
[] wkpNames
= defaultSession
.getWorkspace()
370 .getAccessibleWorkspaceNames();
371 for (String wkpName
: wkpNames
) {
372 if (wkpName
.equals(defaultSession
.getWorkspace().getName()))
373 addChild(new WorkspaceNode(repository
, wkpName
,
376 addChild(new WorkspaceNode(repository
, wkpName
));
378 nodesViewer
.refresh(this);
379 } catch (RepositoryException e
) {
380 throw new ArgeoException(
381 "Cannot connect to repository " + name
, e
);
386 private class WorkspaceNode
extends TreeParent
{
387 private final String name
;
388 private final Repository repository
;
389 private Session session
= null;
391 public WorkspaceNode(Repository repository
, String name
) {
392 this(repository
, name
, null);
395 public WorkspaceNode(Repository repository
, String name
, Session session
) {
398 this.repository
= repository
;
399 this.session
= session
;
402 public Session
getSession() {
406 public void login() {
411 session
= repository
.login(name
);
412 nodesViewer
.refresh(this);
413 } catch (RepositoryException e
) {
414 throw new ArgeoException(
415 "Cannot connect to repository " + name
, e
);