1 package org
.argeo
.cms
.ui
.jcr
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Arrays
;
5 import java
.util
.Comparator
;
9 import javax
.jcr
.RepositoryException
;
10 import javax
.jcr
.RepositoryFactory
;
11 import javax
.jcr
.Session
;
12 import javax
.jcr
.nodetype
.NodeType
;
14 import org
.argeo
.api
.NodeConstants
;
15 import org
.argeo
.api
.NodeUtils
;
16 import org
.argeo
.api
.security
.Keyring
;
17 import org
.argeo
.cms
.ui
.jcr
.model
.RepositoriesElem
;
18 import org
.argeo
.cms
.ui
.jcr
.model
.SingleJcrNodeElem
;
19 import org
.argeo
.eclipse
.ui
.TreeParent
;
20 import org
.eclipse
.jface
.viewers
.ITreeContentProvider
;
21 import org
.eclipse
.jface
.viewers
.Viewer
;
24 * Implementation of the {@code ITreeContentProvider} to display multiple
25 * repository environment in a tree like structure
27 public class NodeContentProvider
implements ITreeContentProvider
{
28 private static final long serialVersionUID
= -4083809398848374403L;
29 final private RepositoryRegister repositoryRegister
;
30 final private RepositoryFactory repositoryFactory
;
32 // Current user session on the default workspace of the argeo Node
33 final private Session userSession
;
34 final private Keyring keyring
;
35 private boolean sortChildren
;
37 // Reference for cleaning
38 private SingleJcrNodeElem homeNode
= null;
39 private RepositoriesElem repositoriesNode
= null;
42 private TreeBrowserComparator itemComparator
= new TreeBrowserComparator();
44 public NodeContentProvider(Session userSession
, Keyring keyring
,
45 RepositoryRegister repositoryRegister
,
46 RepositoryFactory repositoryFactory
, Boolean sortChildren
) {
47 this.userSession
= userSession
;
48 this.keyring
= keyring
;
49 this.repositoryRegister
= repositoryRegister
;
50 this.repositoryFactory
= repositoryFactory
;
51 this.sortChildren
= sortChildren
;
54 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
55 if (newInput
== null)// dispose
58 if (userSession
!= null) {
59 Node userHome
= NodeUtils
.getUserHome(userSession
);
60 if (userHome
!= null) {
61 // TODO : find a way to dynamically get alias for the node
64 homeNode
= new SingleJcrNodeElem(null, userHome
,
65 userSession
.getUserID(), NodeConstants
.EGO_REPOSITORY
);
68 if (repositoryRegister
!= null) {
69 if (repositoriesNode
!= null)
70 repositoriesNode
.dispose();
71 repositoriesNode
= new RepositoriesElem("Repositories",
72 repositoryRegister
, repositoryFactory
, null, userSession
,
78 * Sends back the first level of the Tree. Independent from inputElement
81 public Object
[] getElements(Object inputElement
) {
82 List
<Object
> objs
= new ArrayList
<Object
>();
85 if (repositoriesNode
!= null)
86 objs
.add(repositoriesNode
);
87 return objs
.toArray();
90 public Object
[] getChildren(Object parentElement
) {
91 if (parentElement
instanceof TreeParent
) {
93 Object
[] tmpArr
= ((TreeParent
) parentElement
).getChildren();
96 TreeParent
[] arr
= new TreeParent
[tmpArr
.length
];
97 for (int i
= 0; i
< tmpArr
.length
; i
++)
98 arr
[i
] = (TreeParent
) tmpArr
[i
];
99 Arrays
.sort(arr
, itemComparator
);
102 return ((TreeParent
) parentElement
).getChildren();
104 return new Object
[0];
108 * Sets whether the content provider should order the children nodes or not.
109 * It is user duty to call a full refresh of the tree after changing this
112 public void setSortChildren(boolean sortChildren
) {
113 this.sortChildren
= sortChildren
;
116 public Object
getParent(Object element
) {
117 if (element
instanceof TreeParent
) {
118 return ((TreeParent
) element
).getParent();
123 public boolean hasChildren(Object element
) {
124 if (element
instanceof RepositoriesElem
) {
125 RepositoryRegister rr
= ((RepositoriesElem
) element
)
126 .getRepositoryRegister();
127 return rr
.getRepositories().size() > 0;
128 } else if (element
instanceof TreeParent
) {
129 TreeParent tp
= (TreeParent
) element
;
130 return tp
.hasChildren();
135 public void dispose() {
136 if (homeNode
!= null)
138 if (repositoriesNode
!= null) {
139 // logs out open sessions
140 // see https://bugzilla.argeo.org/show_bug.cgi?id=23
141 repositoriesNode
.dispose();
146 * Specific comparator for this view. See specification here:
147 * https://www.argeo.org/bugzilla/show_bug.cgi?id=139
149 private class TreeBrowserComparator
implements Comparator
<TreeParent
> {
151 public int category(TreeParent element
) {
152 if (element
instanceof SingleJcrNodeElem
) {
153 Node node
= ((SingleJcrNodeElem
) element
).getNode();
155 if (node
.isNodeType(NodeType
.NT_FOLDER
))
157 } catch (RepositoryException e
) {
158 // TODO Auto-generated catch block
165 public int compare(TreeParent o1
, TreeParent o2
) {
166 int cat1
= category(o1
);
167 int cat2
= category(o2
);
172 return o1
.getName().compareTo(o2
.getName());