]> git.argeo.org Git - lgpl/argeo-commons.git/blob - NodeContentProvider.java
602ae7f6c8073a35237b2eb47d76d4c29e48e9c1
[lgpl/argeo-commons.git] / NodeContentProvider.java
1 package org.argeo.cms.ui.jcr;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.Comparator;
6 import java.util.List;
7
8 import javax.jcr.Node;
9 import javax.jcr.RepositoryException;
10 import javax.jcr.RepositoryFactory;
11 import javax.jcr.Session;
12 import javax.jcr.nodetype.NodeType;
13
14 import org.argeo.api.NodeConstants;
15 import org.argeo.api.security.Keyring;
16 import org.argeo.cms.jcr.CmsJcrUtils;
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;
22
23 /**
24 * Implementation of the {@code ITreeContentProvider} to display multiple
25 * repository environment in a tree like structure
26 */
27 public class NodeContentProvider implements ITreeContentProvider {
28 private static final long serialVersionUID = -4083809398848374403L;
29 final private RepositoryRegister repositoryRegister;
30 final private RepositoryFactory repositoryFactory;
31
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;
36
37 // Reference for cleaning
38 private SingleJcrNodeElem homeNode = null;
39 private RepositoriesElem repositoriesNode = null;
40
41 // Utils
42 private TreeBrowserComparator itemComparator = new TreeBrowserComparator();
43
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;
52 }
53
54 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
55 if (newInput == null)// dispose
56 return;
57
58 if (userSession != null) {
59 Node userHome = CmsJcrUtils.getUserHome(userSession);
60 if (userHome != null) {
61 // TODO : find a way to dynamically get alias for the node
62 if (homeNode != null)
63 homeNode.dispose();
64 homeNode = new SingleJcrNodeElem(null, userHome,
65 userSession.getUserID(), NodeConstants.EGO_REPOSITORY);
66 }
67 }
68 if (repositoryRegister != null) {
69 if (repositoriesNode != null)
70 repositoriesNode.dispose();
71 repositoriesNode = new RepositoriesElem("Repositories",
72 repositoryRegister, repositoryFactory, null, userSession,
73 keyring);
74 }
75 }
76
77 /**
78 * Sends back the first level of the Tree. Independent from inputElement
79 * that can be null
80 */
81 public Object[] getElements(Object inputElement) {
82 List<Object> objs = new ArrayList<Object>();
83 if (homeNode != null)
84 objs.add(homeNode);
85 if (repositoriesNode != null)
86 objs.add(repositoriesNode);
87 return objs.toArray();
88 }
89
90 public Object[] getChildren(Object parentElement) {
91 if (parentElement instanceof TreeParent) {
92 if (sortChildren) {
93 Object[] tmpArr = ((TreeParent) parentElement).getChildren();
94 if (tmpArr == null)
95 return new Object[0];
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);
100 return arr;
101 } else
102 return ((TreeParent) parentElement).getChildren();
103 } else
104 return new Object[0];
105 }
106
107 /**
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
110 * parameter.
111 */
112 public void setSortChildren(boolean sortChildren) {
113 this.sortChildren = sortChildren;
114 }
115
116 public Object getParent(Object element) {
117 if (element instanceof TreeParent) {
118 return ((TreeParent) element).getParent();
119 } else
120 return null;
121 }
122
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();
131 }
132 return false;
133 }
134
135 public void dispose() {
136 if (homeNode != null)
137 homeNode.dispose();
138 if (repositoriesNode != null) {
139 // logs out open sessions
140 // see https://bugzilla.argeo.org/show_bug.cgi?id=23
141 repositoriesNode.dispose();
142 }
143 }
144
145 /**
146 * Specific comparator for this view. See specification here:
147 * https://www.argeo.org/bugzilla/show_bug.cgi?id=139
148 */
149 private class TreeBrowserComparator implements Comparator<TreeParent> {
150
151 public int category(TreeParent element) {
152 if (element instanceof SingleJcrNodeElem) {
153 Node node = ((SingleJcrNodeElem) element).getNode();
154 try {
155 if (node.isNodeType(NodeType.NT_FOLDER))
156 return 5;
157 } catch (RepositoryException e) {
158 // TODO Auto-generated catch block
159 e.printStackTrace();
160 }
161 }
162 return 10;
163 }
164
165 public int compare(TreeParent o1, TreeParent o2) {
166 int cat1 = category(o1);
167 int cat2 = category(o2);
168
169 if (cat1 != cat2) {
170 return cat1 - cat2;
171 }
172 return o1.getName().compareTo(o2.getName());
173 }
174 }
175 }