2 * Copyright (C) 2007-2012 Mathieu Baudier
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.argeo
.security
.ui
.admin
.views
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 import javax
.jcr
.Node
;
22 import javax
.jcr
.NodeIterator
;
23 import javax
.jcr
.Property
;
24 import javax
.jcr
.RepositoryException
;
25 import javax
.jcr
.Session
;
26 import javax
.jcr
.observation
.Event
;
27 import javax
.jcr
.observation
.EventIterator
;
28 import javax
.jcr
.observation
.EventListener
;
29 import javax
.jcr
.query
.Query
;
31 import org
.argeo
.ArgeoException
;
32 import org
.argeo
.eclipse
.ui
.EclipseUiUtils
;
33 import org
.argeo
.eclipse
.ui
.specific
.EclipseUiSpecificUtils
;
34 import org
.argeo
.jcr
.ArgeoNames
;
35 import org
.argeo
.jcr
.ArgeoTypes
;
36 import org
.argeo
.jcr
.JcrUtils
;
37 import org
.argeo
.security
.ui
.admin
.SecurityAdminPlugin
;
38 import org
.argeo
.security
.ui
.admin
.commands
.OpenArgeoUserEditor
;
39 import org
.eclipse
.core
.commands
.Command
;
40 import org
.eclipse
.core
.commands
.IParameter
;
41 import org
.eclipse
.core
.commands
.Parameterization
;
42 import org
.eclipse
.core
.commands
.ParameterizedCommand
;
43 import org
.eclipse
.jface
.resource
.JFaceResources
;
44 import org
.eclipse
.jface
.viewers
.ColumnLabelProvider
;
45 import org
.eclipse
.jface
.viewers
.DoubleClickEvent
;
46 import org
.eclipse
.jface
.viewers
.IDoubleClickListener
;
47 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
48 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
49 import org
.eclipse
.jface
.viewers
.TableViewer
;
50 import org
.eclipse
.jface
.viewers
.TableViewerColumn
;
51 import org
.eclipse
.jface
.viewers
.Viewer
;
52 import org
.eclipse
.swt
.SWT
;
53 import org
.eclipse
.swt
.graphics
.Font
;
54 import org
.eclipse
.swt
.widgets
.Composite
;
55 import org
.eclipse
.swt
.widgets
.Table
;
56 import org
.eclipse
.ui
.IWorkbench
;
57 import org
.eclipse
.ui
.IWorkbenchWindow
;
58 import org
.eclipse
.ui
.commands
.ICommandService
;
59 import org
.eclipse
.ui
.handlers
.IHandlerService
;
60 import org
.eclipse
.ui
.part
.ViewPart
;
62 /** List all users. */
63 public class UsersView
extends ViewPart
implements ArgeoNames
, ArgeoTypes
{
64 public final static String ID
= "org.argeo.security.ui.admin.adminUsersView";
66 private TableViewer viewer
;
67 private Session session
;
69 private UserStructureListener userStructureListener
;
75 public void createPartControl(Composite parent
) {
76 italic
= EclipseUiUtils
.getItalicFont(parent
);
77 bold
= EclipseUiUtils
.getBoldFont(parent
);
79 // viewer = new TableViewer(createTable(parent));
80 viewer
= createTableViewer(parent
);
81 EclipseUiSpecificUtils
.enableToolTipSupport(viewer
);
82 viewer
.setContentProvider(new UsersContentProvider());
83 // viewer.setLabelProvider(new UsersLabelProvider());
84 viewer
.addDoubleClickListener(new ViewDoubleClickListener());
85 getViewSite().setSelectionProvider(viewer
);
86 viewer
.setInput(getViewSite());
88 userStructureListener
= new UserStructureListener();
89 JcrUtils
.addListener(session
, userStructureListener
, Event
.NODE_ADDED
90 | Event
.NODE_REMOVED
, JcrUtils
.DEFAULT_HOME_BASE_PATH
,
91 ArgeoTypes
.ARGEO_USER_HOME
);
94 protected TableViewer
createTableViewer(final Composite parent
) {
96 Table table
= new Table(parent
, SWT
.MULTI
| SWT
.H_SCROLL
| SWT
.V_SCROLL
);
97 TableViewer viewer
= new TableViewer(table
);
98 table
.setLinesVisible(true);
99 table
.setHeaderVisible(true);
102 TableViewerColumn column
= new TableViewerColumn(viewer
, SWT
.NONE
);
103 column
.getColumn().setText("User ID");
104 column
.getColumn().setWidth(100);
105 column
.setLabelProvider(new CLProvider() {
106 public String
getText(Object elem
) {
107 return getProperty(elem
, ARGEO_USER_ID
);
108 // if (username.equals(session.getUserID()))
109 // return "[" + username + "]";
116 column
= new TableViewerColumn(viewer
, SWT
.NONE
);
117 column
.getColumn().setText("Name");
118 column
.getColumn().setWidth(150);
119 column
.setLabelProvider(new CLProvider() {
120 public String
getText(Object elem
) {
121 return getProperty(elem
, Property
.JCR_TITLE
);
126 column
= new TableViewerColumn(viewer
, SWT
.NONE
);
127 column
.getColumn().setText("E-mail");
128 column
.getColumn().setWidth(150);
129 column
.setLabelProvider(new CLProvider() {
130 public String
getText(Object elem
) {
131 return getProperty(elem
, ARGEO_PRIMARY_EMAIL
);
136 column
= new TableViewerColumn(viewer
, SWT
.NONE
);
137 column
.getColumn().setText("Description");
138 column
.getColumn().setWidth(200);
139 column
.setLabelProvider(new CLProvider() {
140 public String
getText(Object elem
) {
141 return getProperty(elem
, Property
.JCR_DESCRIPTION
);
148 private class CLProvider
extends ColumnLabelProvider
{
150 public String
getToolTipText(Object element
) {
151 return getText(element
);
155 public Font
getFont(Object elem
) {
157 String username
= getProperty(elem
, ARGEO_USER_ID
);
158 if (username
.equals(session
.getUserID()))
163 Node userHome
= (Node
) elem
;
164 Node userProfile
= userHome
.getNode(ARGEO_PROFILE
);
165 if (!userProfile
.getProperty(ARGEO_ENABLED
).getBoolean())
169 } catch (RepositoryException e
) {
170 throw new ArgeoException("Cannot get font for " + username
, e
);
176 // protected Table createTable(Composite parent) {
177 // // TODO use a more flexible API
178 // Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
179 // table.setLinesVisible(true);
180 // table.setHeaderVisible(true);
181 // TableColumn column = new TableColumn(table, SWT.LEFT, 0);
182 // column.setText("Username");
183 // column.setWidth(100);
184 // column = new TableColumn(table, SWT.LEFT, 1);
185 // column.setText("Displayed name");
186 // column.setWidth(150);
187 // column = new TableColumn(table, SWT.LEFT, 2);
188 // column.setText("E-mail");
189 // column.setWidth(100);
190 // column = new TableColumn(table, SWT.LEFT, 3);
191 // column.setText("First Name");
192 // column.setWidth(100);
193 // column = new TableColumn(table, SWT.LEFT, 4);
194 // column.setText("Last Name");
195 // column.setWidth(100);
196 // column = new TableColumn(table, SWT.LEFT, 5);
197 // column.setText("Status");
198 // column.setWidth(50);
199 // column = new TableColumn(table, SWT.LEFT, 6);
200 // column.setText("Description");
201 // column.setWidth(200);
205 // private class UsersLabelProvider extends LabelProvider implements
206 // ITableLabelProvider {
207 // public String getColumnText(Object element, int columnIndex) {
209 // Node userHome = (Node) element;
210 // Node userProfile = userHome.getNode(ARGEO_PROFILE);
211 // switch (columnIndex) {
213 // String username = userHome.getProperty(ARGEO_USER_ID)
215 // if (username.equals(session.getUserID()))
216 // return "[" + username + "]";
220 // return getProperty(userProfile, Property.JCR_TITLE);
222 // return getProperty(userProfile, ARGEO_PRIMARY_EMAIL);
224 // return getProperty(userProfile, ARGEO_FIRST_NAME);
226 // return getProperty(userProfile, ARGEO_LAST_NAME);
228 // return userProfile.getProperty(ARGEO_ENABLED).getBoolean() ? ""
231 // return getProperty(userProfile, Property.JCR_DESCRIPTION);
233 // throw new ArgeoException("Unmanaged column " + columnIndex);
235 // } catch (RepositoryException e) {
236 // throw new ArgeoException("Cannot get text", e);
240 // public Image getColumnImage(Object element, int columnIndex) {
247 public void setFocus() {
248 viewer
.getTable().setFocus();
252 public void dispose() {
253 JcrUtils
.removeListenerQuietly(session
, userStructureListener
);
257 public void setSession(Session session
) {
258 this.session
= session
;
261 public void refresh() {
265 protected String
getProperty(Node userProfile
, String name
)
266 throws RepositoryException
{
267 return userProfile
.hasProperty(name
) ? userProfile
.getProperty(name
)
271 protected String
getProperty(Object element
, String name
) {
273 Node userHome
= (Node
) element
;
274 Node userProfile
= userHome
.getNode(ARGEO_PROFILE
);
275 return userProfile
.hasProperty(name
) ? userProfile
276 .getProperty(name
).getString() : "";
277 } catch (RepositoryException e
) {
278 throw new ArgeoException("Cannot get property " + name
, e
);
282 private class UserStructureListener
implements EventListener
{
285 public void onEvent(EventIterator events
) {
290 private class UsersContentProvider
implements IStructuredContentProvider
{
292 public Object
[] getElements(Object inputElement
) {
294 Query query
= session
298 "select [" + ARGEO_PROFILE
+ "] from ["
299 + ARGEO_USER_HOME
+ "]", Query
.JCR_SQL2
);
300 NodeIterator nit
= query
.execute().getNodes();
301 List
<Node
> userProfiles
= new ArrayList
<Node
>();
302 while (nit
.hasNext()) {
303 userProfiles
.add(nit
.nextNode());
305 return userProfiles
.toArray();
306 } catch (RepositoryException e
) {
307 throw new ArgeoException("Cannot list users", e
);
309 // return userAdminService.listUsers().toArray();
312 public void dispose() {
315 public void inputChanged(Viewer viewer
, Object oldInput
, Object newInput
) {
320 class ViewDoubleClickListener
implements IDoubleClickListener
{
321 public void doubleClick(DoubleClickEvent evt
) {
322 if (evt
.getSelection().isEmpty())
325 Object obj
= ((IStructuredSelection
) evt
.getSelection())
327 if (obj
instanceof Node
) {
328 IWorkbench iw
= SecurityAdminPlugin
.getDefault().getWorkbench();
329 IHandlerService handlerService
= (IHandlerService
) iw
330 .getService(IHandlerService
.class);
332 String username
= ((Node
) obj
).getProperty(ARGEO_USER_ID
)
334 String commandId
= OpenArgeoUserEditor
.COMMAND_ID
;
335 String paramName
= OpenArgeoUserEditor
.PARAM_USERNAME
;
337 // TODO: factorize this
338 // execute related command
339 IWorkbenchWindow window
= iw
.getActiveWorkbenchWindow();
340 ICommandService cmdService
= (ICommandService
) window
341 .getService(ICommandService
.class);
342 Command cmd
= cmdService
.getCommand(commandId
);
343 ArrayList
<Parameterization
> parameters
= new ArrayList
<Parameterization
>();
344 IParameter iparam
= cmd
.getParameter(paramName
);
345 Parameterization param
= new Parameterization(iparam
,
347 parameters
.add(param
);
348 ParameterizedCommand pc
= new ParameterizedCommand(cmd
,
349 parameters
.toArray(new Parameterization
[parameters
351 handlerService
= (IHandlerService
) window
352 .getService(IHandlerService
.class);
353 handlerService
.executeCommand(pc
, null);
354 } catch (Exception e
) {
355 throw new ArgeoException("Cannot open editor", e
);