1 package org
.argeo
.cms
.users
;
3 import java
.util
.Iterator
;
5 import java
.util
.TreeMap
;
8 import javax
.jcr
.RepositoryException
;
9 import javax
.jcr
.Session
;
10 import javax
.jcr
.security
.AccessControlManager
;
11 import javax
.jcr
.security
.Privilege
;
13 import org
.apache
.commons
.logging
.Log
;
14 import org
.apache
.commons
.logging
.LogFactory
;
15 import org
.argeo
.ArgeoException
;
16 import org
.argeo
.cms
.CmsUiProvider
;
17 import org
.argeo
.cms
.maintenance
.NonAdminPage
;
18 import org
.argeo
.cms
.util
.CmsUtils
;
19 import org
.argeo
.eclipse
.ui
.parts
.UsersTable
;
20 import org
.argeo
.jcr
.ArgeoNames
;
21 import org
.argeo
.jcr
.JcrUtils
;
22 import org
.argeo
.security
.UserAdminService
;
23 import org
.eclipse
.jface
.dialogs
.Dialog
;
24 import org
.eclipse
.jface
.dialogs
.MessageDialog
;
25 import org
.eclipse
.jface
.viewers
.ISelection
;
26 import org
.eclipse
.jface
.viewers
.ISelectionChangedListener
;
27 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
28 import org
.eclipse
.jface
.viewers
.SelectionChangedEvent
;
29 import org
.eclipse
.jface
.viewers
.TableViewer
;
30 import org
.eclipse
.jface
.wizard
.WizardDialog
;
31 import org
.eclipse
.swt
.SWT
;
32 import org
.eclipse
.swt
.events
.DisposeEvent
;
33 import org
.eclipse
.swt
.events
.DisposeListener
;
34 import org
.eclipse
.swt
.events
.SelectionAdapter
;
35 import org
.eclipse
.swt
.events
.SelectionEvent
;
36 import org
.eclipse
.swt
.layout
.GridData
;
37 import org
.eclipse
.swt
.layout
.GridLayout
;
38 import org
.eclipse
.swt
.widgets
.Button
;
39 import org
.eclipse
.swt
.widgets
.Composite
;
40 import org
.eclipse
.swt
.widgets
.Control
;
41 import org
.springframework
.security
.provisioning
.UserDetailsManager
;
44 * Simple page to manage users of a given repository. We still rely on Argeo
45 * model; with user stored in the main workspace
47 public class Users
implements CmsUiProvider
{
49 private final static Log log
= LogFactory
.getLog(Users
.class);
51 // Enable user CRUD // INJECTED
52 private UserAdminService userAdminService
;
53 // private UserDetailsManager userDetailsManager;
54 private String userWkspName
;
57 NonAdminPage nap
= new NonAdminPage();
58 UserPage userPage
= new UserPage();
60 // Manage authorization
62 public Control
createUi(Composite parent
, Node context
)
63 throws RepositoryException
{
64 if (isAdmin(context
)) {
65 Session session
= context
.getSession().getRepository()
67 return createMainLayout(parent
, session
);
69 nap
.createUi(parent
, context
);
74 // Left: User Table - Right User Details Edition
75 private Control
createMainLayout(Composite parent
, final Session session
)
76 throws RepositoryException
{
78 Composite layoutCmp
= new Composite(parent
, SWT
.NO_FOCUS
);
79 layoutCmp
.setLayoutData(CmsUtils
.fillAll());
81 .setLayout(CmsUtils
.noSpaceGridLayout(new GridLayout(2, true)));
83 Composite left
= new Composite(layoutCmp
, SWT
.NO_FOCUS
);
84 left
.setLayoutData(CmsUtils
.fillAll());
85 UsersTable table
= createUsersTable(left
, session
);
87 final Composite right
= new Composite(layoutCmp
, SWT
.NO_FOCUS
);
88 right
.setLayoutData(CmsUtils
.fillAll());
89 // Composite innerPage = createUserPage(right);
90 // final UserViewerOld userViewer = new UserViewerOld(innerPage);
92 final TableViewer viewer
= table
.getTableViewer();
93 viewer
.addSelectionChangedListener(new ISelectionChangedListener() {
96 public void selectionChanged(SelectionChangedEvent event
) {
97 IStructuredSelection selection
= (IStructuredSelection
) viewer
99 if (selection
.isEmpty()) {
100 // Should we clean the right column?
103 Node context
= (Node
) selection
.getFirstElement();
105 CmsUtils
.clear(right
);
106 userPage
.createUi(right
, context
);
108 right
.getParent().layout();
109 } catch (RepositoryException e
) {
111 throw new ArgeoException("unable to create "
112 + "editor for user " + context
, e
);
120 private UsersTable
createUsersTable(Composite parent
, final Session session
)
121 throws RepositoryException
{
122 parent
.setLayout(CmsUtils
.noSpaceGridLayout());
124 // Add user CRUD buttons
125 Composite buttonCmp
= new Composite(parent
, SWT
.NO_FOCUS
);
126 buttonCmp
.setLayoutData(CmsUtils
.fillWidth());
127 buttonCmp
.setLayout(new GridLayout(2, false));
129 final Button deleteBtn
= new Button(buttonCmp
, SWT
.PUSH
);
130 deleteBtn
.setText("Delete selected");
132 .setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, true, false));
135 final Button addBtn
= new Button(buttonCmp
, SWT
.PUSH
);
136 addBtn
.setText("Create");
138 // Create the composite that displays the list and a filter
139 final UsersTable userTableCmp
= new UsersTable(parent
, SWT
.NO_FOCUS
,
141 userTableCmp
.populate(true, false);
142 userTableCmp
.setLayoutData(CmsUtils
.fillAll());
144 // The various listeners
145 userTableCmp
.addDisposeListener(new DisposeListener() {
146 private static final long serialVersionUID
= -8854052549807709846L;
149 public void widgetDisposed(DisposeEvent event
) {
150 JcrUtils
.logoutQuietly(session
);
154 deleteBtn
.addSelectionListener(new SelectionAdapter() {
155 private static final long serialVersionUID
= -7340611909297995666L;
158 public void widgetSelected(SelectionEvent e
) {
160 TableViewer viewer
= userTableCmp
.getTableViewer();
161 ISelection selection
= viewer
.getSelection();
162 if (selection
.isEmpty())
165 Map
<String
, Node
> toDelete
= new TreeMap
<String
, Node
>();
166 @SuppressWarnings("unchecked")
167 Iterator
<Node
> it
= ((IStructuredSelection
) selection
)
169 nodes
: while (it
.hasNext()) {
170 Node profileNode
= it
.next();
172 String userName
= profileNode
.getProperty(
173 ArgeoNames
.ARGEO_USER_ID
).getString();
174 if (userName
.equals(profileNode
.getSession()
176 log
.warn("Cannot delete its own user: " + userName
);
179 toDelete
.put(userName
, profileNode
);
180 } catch (RepositoryException re
) {
181 log
.warn("Cannot interpred user " + profileNode
);
185 if (!MessageDialog
.openQuestion(
186 userTableCmp
.getShell(),
188 "Are you sure that you want to delete users "
191 + "This may lead to inconsistencies in the application."))
194 for (String username
: toDelete
.keySet()) {
195 Session session
= null;
197 Node profileNode
= toDelete
.get(username
);
198 userAdminService
.deleteUser(username
);
199 profileNode
.getParent().remove();
200 session
= profileNode
.getSession();
202 } catch (RepositoryException re
) {
203 JcrUtils
.discardQuietly(session
);
204 throw new ArgeoException("Cannot list users", re
);
207 userTableCmp
.refresh();
211 addBtn
.addSelectionListener(new SelectionAdapter() {
212 private static final long serialVersionUID
= 9214984636836267786L;
215 public void widgetSelected(SelectionEvent e
) {
216 NewUserWizard newUserWizard
= new NewUserWizard(session
,
218 WizardDialog dialog
= new WizardDialog(addBtn
.getShell(),
220 if (dialog
.open() == Dialog
.OK
)
221 userTableCmp
.refresh();
226 // userTableCmp.getTableViewer().addDoubleClickListener(
227 // new ViewDoubleClickListener());
228 // getViewSite().setSelectionProvider(userTableCmp.getTableViewer());
230 // Add listener to refresh the list when something changes
231 // userStructureListener = new JcrUserListener(getSite().getShell()
233 // JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
234 // | Event.NODE_REMOVED, ArgeoJcrConstants.PEOPLE_BASE_PATH, null);
235 // userPropertiesListener = new JcrUserListener(getSite().getShell()
237 // JcrUtils.addListener(session, userStructureListener,
238 // Event.PROPERTY_CHANGED | Event.PROPERTY_ADDED
239 // | Event.PROPERTY_REMOVED,
240 // ArgeoJcrConstants.PEOPLE_BASE_PATH,
241 // ArgeoTypes.ARGEO_USER_PROFILE);
246 // protected Composite createUserPage(Composite parent) {
247 // parent.setLayout(CmsUtils.noSpaceGridLayout());
248 // ScrolledPage scrolled = new ScrolledPage(parent, SWT.NONE);
249 // scrolled.setLayoutData(CmsUtils.fillAll());
250 // scrolled.setLayout(CmsUtils.noSpaceGridLayout());
251 // // TODO manage style
252 // // CmsUtils.style(scrolled, "maintenance_user_form");
254 // Composite page = new Composite(scrolled, SWT.NONE);
255 // page.setLayout(CmsUtils.noSpaceGridLayout());
256 // page.setBackgroundMode(SWT.INHERIT_NONE);
261 private boolean isAdmin(Node node
) throws RepositoryException
{
262 // FIXME clean this once new user management policy has been
264 AccessControlManager acm
= node
.getSession().getAccessControlManager();
265 Privilege
[] privs
= new Privilege
[1];
266 privs
[0] = acm
.privilegeFromName(Privilege
.JCR_ALL
);
267 return acm
.hasPrivileges("/", privs
);
271 // public void dispose() {
272 // JcrUtils.removeListenerQuietly(session, userStructureListener);
273 // JcrUtils.removeListenerQuietly(session, userPropertiesListener);
274 // JcrUtils.logoutQuietly(session);
278 // // public void setSession(Session session) {
279 // // this.session = session;
282 // public void refresh() {
283 // this.getSite().getShell().getDisplay().asyncExec(new Runnable() {
285 // public void run() {
286 // userTableCmp.refresh();
291 // private class JcrUserListener implements EventListener {
292 // private final Display display;
294 // public JcrUserListener(Display display) {
296 // this.display = display;
300 // public void onEvent(EventIterator events) {
301 // display.asyncExec(new Runnable() {
303 // public void run() {
304 // userTableCmp.refresh();
310 // class ViewDoubleClickListener implements IDoubleClickListener {
311 // public void doubleClick(DoubleClickEvent evt) {
312 // if (evt.getSelection().isEmpty())
315 // Object obj = ((IStructuredSelection) evt.getSelection())
316 // .getFirstElement();
317 // if (obj instanceof Node) {
319 // String username = ((Node) obj).getProperty(ARGEO_USER_ID)
321 // String commandId = OpenArgeoUserEditor.COMMAND_ID;
322 // String paramName = OpenArgeoUserEditor.PARAM_USERNAME;
323 // CommandUtils.callCommand(commandId, paramName, username);
324 // } catch (RepositoryException e) {
325 // throw new ArgeoException("Cannot open user editor", e);
330 /* DEPENDENCY INJECTION */
331 public void setWorkspaceName(String workspaceName
) {
332 this.userWkspName
= workspaceName
;
335 public void setUserAdminService(UserAdminService userAdminService
) {
336 this.userAdminService
= userAdminService
;
337 userPage
.setUserAdminService(userAdminService
);
340 public void setUserDetailsManager(UserDetailsManager userDetailsManager
) {
341 // this.userDetailsManager = userDetailsManager;
342 // userPage.setUserDetailsManager(userDetailsManager);