]> 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
fix bug 85 : JCR explorer refresh was not implemented for TreeParent objects of type...
[lgpl/argeo-commons.git] / server / plugins / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / browser / NodeContentProvider.java
1 /*
2 * Copyright (C) 2007-2012 Mathieu Baudier
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.jcr.ui.explorer.browser;
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21
22 import javax.jcr.Node;
23 import javax.jcr.RepositoryFactory;
24 import javax.jcr.Session;
25
26 import org.argeo.eclipse.ui.TreeParent;
27 import org.argeo.jcr.ArgeoJcrConstants;
28 import org.argeo.jcr.JcrUtils;
29 import org.argeo.jcr.RepositoryRegister;
30 import org.argeo.jcr.security.JcrKeyring;
31 import org.argeo.jcr.ui.explorer.model.RepositoriesNode;
32 import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
33 import org.argeo.jcr.ui.explorer.utils.TreeObjectsComparator;
34 import org.eclipse.jface.viewers.ITreeContentProvider;
35 import org.eclipse.jface.viewers.Viewer;
36
37 /**
38 * Implementation of the {@code ITreeContentProvider} to display multiple
39 * repository environment in a tree like structure
40 *
41 */
42 public class NodeContentProvider implements ITreeContentProvider {
43 // private final static Log log =
44 // LogFactory.getLog(NodeContentProvider.class);
45
46 // Business Objects
47 final private RepositoryRegister repositoryRegister;
48 final private RepositoryFactory repositoryFactory;
49 final private Session userSession;
50 final private JcrKeyring jcrKeyring;
51 final private boolean sortChildren;
52
53 // reference for cleaning
54 private SingleJcrNode homeNode = null;
55 private RepositoriesNode repositoriesNode = null;
56
57 // Utils
58 private TreeObjectsComparator itemComparator = new TreeObjectsComparator();
59
60 public NodeContentProvider(JcrKeyring jcrKeyring,
61 RepositoryRegister repositoryRegister,
62 RepositoryFactory repositoryFactory, Boolean sortChildren) {
63 this.userSession = jcrKeyring != null ? jcrKeyring.getSession() : null;
64 this.jcrKeyring = jcrKeyring;
65 this.repositoryRegister = repositoryRegister;
66 this.repositoryFactory = repositoryFactory;
67 this.sortChildren = sortChildren;
68 }
69
70 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
71 if (newInput == null)// dispose
72 return;
73
74 if (userSession != null) {
75 Node userHome = JcrUtils.getUserHome(userSession);
76 if (userHome != null) {
77 // TODO : find a way to dynamically get alias for the node
78 if (homeNode != null)
79 homeNode.dispose();
80 homeNode = new SingleJcrNode(null, userHome,
81 userSession.getUserID(), ArgeoJcrConstants.ALIAS_NODE);
82 }
83 }
84 if (repositoryRegister != null) {
85 if (repositoriesNode != null)
86 repositoriesNode.dispose();
87 repositoriesNode = new RepositoriesNode("Repositories",
88 repositoryRegister, repositoryFactory, null, jcrKeyring);
89 }
90 }
91
92 /**
93 * Sends back the first level of the Tree. Independent from inputElement
94 * that can be null
95 */
96 public Object[] getElements(Object inputElement) {
97 List<Object> objs = new ArrayList<Object>();
98 if (homeNode != null)
99 objs.add(homeNode);
100 if (repositoriesNode != null)
101 objs.add(repositoriesNode);
102 return objs.toArray();
103 }
104
105 public Object[] getChildren(Object parentElement) {
106 if (parentElement instanceof TreeParent) {
107 if (sortChildren) {
108 // TreeParent[] arr = (TreeParent[]) ((TreeParent)
109 // parentElement)
110 // .getChildren();
111 Object[] tmpArr = ((TreeParent) parentElement).getChildren();
112 TreeParent[] arr = new TreeParent[tmpArr.length];
113 for (int i = 0; i < tmpArr.length; i++)
114 arr[i] = (TreeParent) tmpArr[i];
115
116 Arrays.sort(arr, itemComparator);
117 return arr;
118 } else
119 return ((TreeParent) parentElement).getChildren();
120
121 } else {
122 return new Object[0];
123 }
124 }
125
126 public Object getParent(Object element) {
127 if (element instanceof TreeParent) {
128 return ((TreeParent) element).getParent();
129 } else
130 return null;
131 }
132
133 public boolean hasChildren(Object element) {
134 if (element instanceof RepositoriesNode) {
135 RepositoryRegister rr = ((RepositoriesNode) element)
136 .getRepositoryRegister();
137 return rr.getRepositories().size() > 0;
138 } else if (element instanceof TreeParent) {
139 TreeParent tp = (TreeParent) element;
140 return tp.hasChildren();
141 }
142 return false;
143 }
144
145 public void dispose() {
146 if (homeNode != null)
147 homeNode.dispose();
148 if (repositoriesNode != null) {
149 // logs out open sessions
150 // see https://bugzilla.argeo.org/show_bug.cgi?id=23
151 repositoriesNode.dispose();
152 }
153 }
154
155 }