]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/browser/NodeContentProvider.java
Improve cleaning of the model (bug 23)
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / browser / NodeContentProvider.java
1 package org.argeo.jcr.ui.explorer.browser;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.List;
6
7 import javax.jcr.Node;
8 import javax.jcr.Session;
9
10 import org.argeo.eclipse.ui.TreeParent;
11 import org.argeo.jcr.ArgeoJcrConstants;
12 import org.argeo.jcr.JcrUtils;
13 import org.argeo.jcr.RepositoryRegister;
14 import org.argeo.jcr.security.JcrKeyring;
15 import org.argeo.jcr.ui.explorer.model.RepositoriesNode;
16 import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
17 import org.argeo.jcr.ui.explorer.utils.TreeObjectsComparator;
18 import org.eclipse.jface.viewers.ITreeContentProvider;
19 import org.eclipse.jface.viewers.Viewer;
20
21 /**
22 * Implementation of the {@code ITreeContentProvider} to display multiple
23 * repository environment in a tree like structure
24 *
25 */
26 public class NodeContentProvider implements ITreeContentProvider {
27 // private final static Log log =
28 // LogFactory.getLog(NodeContentProvider.class);
29
30 // Business Objects
31 final private RepositoryRegister repositoryRegister;
32 final private Session userSession;
33 final private JcrKeyring jcrKeyring;
34 final private boolean sortChildren;
35
36 // reference for cleaning
37 private SingleJcrNode homeNode = null;
38 private RepositoriesNode repositoriesNode = null;
39
40 // Utils
41 private TreeObjectsComparator itemComparator = new TreeObjectsComparator();
42
43 public NodeContentProvider(JcrKeyring jcrKeyring,
44 RepositoryRegister repositoryRegister, Boolean sortChildren) {
45 this.userSession = jcrKeyring != null ? jcrKeyring.getSession() : null;
46 this.jcrKeyring = jcrKeyring;
47 this.repositoryRegister = repositoryRegister;
48 this.sortChildren = sortChildren;
49 }
50
51 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
52 if (userSession != null) {
53 Node userHome = JcrUtils.getUserHome(userSession);
54 if (userHome != null) {
55 // TODO : find a way to dynamically get alias for the node
56 if (homeNode != null)
57 homeNode.dispose();
58 homeNode = new SingleJcrNode(null, userHome,
59 userSession.getUserID(), ArgeoJcrConstants.ALIAS_NODE);
60 }
61 }
62 if (repositoryRegister != null) {
63 if (repositoriesNode != null)
64 repositoriesNode.dispose();
65 repositoriesNode = new RepositoriesNode("Repositories",
66 repositoryRegister, null, jcrKeyring);
67 }
68 }
69
70 /**
71 * Sends back the first level of the Tree. Independent from inputElement
72 * that can be null
73 */
74 public Object[] getElements(Object inputElement) {
75 List<Object> objs = new ArrayList<Object>();
76 if (homeNode != null)
77 objs.add(homeNode);
78 if (repositoriesNode != null)
79 objs.add(repositoriesNode);
80 return objs.toArray();
81 }
82
83 public Object[] getChildren(Object parentElement) {
84 if (parentElement instanceof TreeParent) {
85 if (sortChildren) {
86 // TreeParent[] arr = (TreeParent[]) ((TreeParent)
87 // parentElement)
88 // .getChildren();
89 Object[] tmpArr = ((TreeParent) parentElement).getChildren();
90 TreeParent[] arr = new TreeParent[tmpArr.length];
91 for (int i = 0; i < tmpArr.length; i++)
92 arr[i] = (TreeParent) tmpArr[i];
93
94 Arrays.sort(arr, itemComparator);
95 return arr;
96 } else
97 return ((TreeParent) parentElement).getChildren();
98
99 } else {
100 return new Object[0];
101 }
102 }
103
104 public Object getParent(Object element) {
105 if (element instanceof TreeParent) {
106 return ((TreeParent) element).getParent();
107 } else
108 return null;
109 }
110
111 public boolean hasChildren(Object element) {
112 if (element instanceof RepositoriesNode) {
113 RepositoryRegister rr = ((RepositoriesNode) element)
114 .getRepositoryRegister();
115 return rr.getRepositories().size() > 0;
116 } else if (element instanceof TreeParent) {
117 TreeParent tp = (TreeParent) element;
118 return tp.hasChildren();
119 }
120 return false;
121 }
122
123 public void dispose() {
124 if (homeNode != null)
125 homeNode.dispose();
126 if (repositoriesNode != null) {
127 // logs out open sessions
128 // see https://bugzilla.argeo.org/show_bug.cgi?id=23
129 repositoriesNode.dispose();
130 }
131 }
132
133 }