]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/users/Users.java
e7f09440d88fdd015edd0dde9d4a7e0a557946bf
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / users / Users.java
1 package org.argeo.cms.users;
2
3 import javax.jcr.Node;
4 import javax.jcr.RepositoryException;
5 import javax.jcr.Session;
6 import javax.jcr.security.AccessControlManager;
7 import javax.jcr.security.Privilege;
8
9 import org.argeo.ArgeoException;
10 import org.argeo.cms.CmsUiProvider;
11 import org.argeo.cms.CmsUtils;
12 import org.argeo.cms.maintenance.NonAdminPage;
13 import org.argeo.eclipse.ui.dialogs.UserCreationWizard;
14 import org.argeo.eclipse.ui.parts.UsersTable;
15 import org.argeo.jcr.JcrUtils;
16 import org.argeo.security.UserAdminService;
17 import org.argeo.security.jcr.JcrSecurityModel;
18 import org.eclipse.jface.viewers.ISelectionChangedListener;
19 import org.eclipse.jface.viewers.IStructuredSelection;
20 import org.eclipse.jface.viewers.SelectionChangedEvent;
21 import org.eclipse.jface.viewers.TableViewer;
22 import org.eclipse.jface.wizard.WizardDialog;
23 import org.eclipse.swt.SWT;
24 import org.eclipse.swt.events.DisposeEvent;
25 import org.eclipse.swt.events.DisposeListener;
26 import org.eclipse.swt.events.SelectionEvent;
27 import org.eclipse.swt.events.SelectionListener;
28 import org.eclipse.swt.layout.GridLayout;
29 import org.eclipse.swt.widgets.Button;
30 import org.eclipse.swt.widgets.Composite;
31 import org.eclipse.swt.widgets.Control;
32
33 /**
34 * Simple page to manage users of a given repository. We still rely on Argeo
35 * model; with user stored in the main workspace
36 */
37 public class Users implements CmsUiProvider {
38
39 // Enable user CRUD // INJECTED
40 private UserAdminService userAdminService;
41 private JcrSecurityModel jcrSecurityModel;
42 private String userWkspName;
43
44 // Local UI Providers
45 NonAdminPage nap = new NonAdminPage();
46 UserPage userPage = new UserPage();
47
48 // Manage authorization
49 @Override
50 public Control createUi(Composite parent, Node context)
51 throws RepositoryException {
52 if (isAdmin(context)) {
53 Session session = context.getSession().getRepository()
54 .login(userWkspName);
55 return createMainLayout(parent, session);
56 } else
57 nap.createUi(parent, context);
58 return null;
59 }
60
61 // Main layout
62 // Left: User Table - Right User Details Edition
63 private Control createMainLayout(Composite parent, final Session session)
64 throws RepositoryException {
65
66 Composite layoutCmp = new Composite(parent, SWT.NO_FOCUS);
67 layoutCmp.setLayoutData(CmsUtils.fillAll());
68 layoutCmp
69 .setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(2, true)));
70
71 Composite left = new Composite(layoutCmp, SWT.NO_FOCUS);
72 left.setLayoutData(CmsUtils.fillAll());
73 UsersTable table = createUsersTable(left, session);
74
75 final Composite right = new Composite(layoutCmp, SWT.NO_FOCUS);
76 right.setLayoutData(CmsUtils.fillAll());
77 // Composite innerPage = createUserPage(right);
78 // final UserViewerOld userViewer = new UserViewerOld(innerPage);
79
80 final TableViewer viewer = table.getTableViewer();
81 viewer.addSelectionChangedListener(new ISelectionChangedListener() {
82
83 @Override
84 public void selectionChanged(SelectionChangedEvent event) {
85 IStructuredSelection selection = (IStructuredSelection) viewer
86 .getSelection();
87 if (selection.isEmpty()) {
88 // Should we clean the right column?
89 return;
90 } else {
91 Node context = (Node) selection.getFirstElement();
92 try {
93 CmsUtils.clear(right);
94 userPage.createUi(right, context);
95 right.layout();
96 right.getParent().layout();
97 } catch (RepositoryException e) {
98 e.printStackTrace();
99 throw new ArgeoException("unable to create "
100 + "editor for user " + context, e);
101 }
102 }
103 }
104 });
105 return left;
106 }
107
108 private UsersTable createUsersTable(Composite parent, final Session session)
109 throws RepositoryException {
110 parent.setLayout(CmsUtils.noSpaceGridLayout());
111
112 // Add user CRUD buttons
113 Composite buttonCmp = new Composite(parent, SWT.NO_FOCUS);
114 buttonCmp.setLayoutData(CmsUtils.fillWidth());
115 buttonCmp.setLayout(new GridLayout(2, false));
116 // Delete
117 final Button deleteBtn = new Button(buttonCmp, SWT.PUSH);
118 deleteBtn.setText("Delete selected");
119 // Add
120 final Button addBtn = new Button(buttonCmp, SWT.PUSH);
121 addBtn.setText("Create");
122 addBtn.addSelectionListener(new SelectionListener() {
123 private static final long serialVersionUID = 9214984636836267786L;
124
125 @Override
126 public void widgetSelected(SelectionEvent e) {
127 UserCreationWizard newUserWizard = new UserCreationWizard(
128 session, userAdminService, jcrSecurityModel);
129 WizardDialog dialog = new WizardDialog(addBtn.getShell(),
130 newUserWizard);
131 dialog.open();
132 // TODO refresh list if user has been created
133 }
134
135 @Override
136 public void widgetDefaultSelected(SelectionEvent e) {
137 }
138 });
139
140 // Create the composite that displays the list and a filter
141 UsersTable userTableCmp = new UsersTable(parent, SWT.NO_FOCUS, session);
142 userTableCmp.populate(true, false);
143 userTableCmp.setLayoutData(CmsUtils.fillAll());
144 userTableCmp.addDisposeListener(new DisposeListener() {
145 private static final long serialVersionUID = -8854052549807709846L;
146
147 @Override
148 public void widgetDisposed(DisposeEvent event) {
149 JcrUtils.logoutQuietly(session);
150 }
151 });
152
153 // Configure
154 // userTableCmp.getTableViewer().addDoubleClickListener(
155 // new ViewDoubleClickListener());
156 // getViewSite().setSelectionProvider(userTableCmp.getTableViewer());
157
158 // Add listener to refresh the list when something changes
159 // userStructureListener = new JcrUserListener(getSite().getShell()
160 // .getDisplay());
161 // JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
162 // | Event.NODE_REMOVED, ArgeoJcrConstants.PEOPLE_BASE_PATH, null);
163 // userPropertiesListener = new JcrUserListener(getSite().getShell()
164 // .getDisplay());
165 // JcrUtils.addListener(session, userStructureListener,
166 // Event.PROPERTY_CHANGED | Event.PROPERTY_ADDED
167 // | Event.PROPERTY_REMOVED,
168 // ArgeoJcrConstants.PEOPLE_BASE_PATH,
169 // ArgeoTypes.ARGEO_USER_PROFILE);
170
171 return userTableCmp;
172 }
173
174 // protected Composite createUserPage(Composite parent) {
175 // parent.setLayout(CmsUtils.noSpaceGridLayout());
176 // ScrolledPage scrolled = new ScrolledPage(parent, SWT.NONE);
177 // scrolled.setLayoutData(CmsUtils.fillAll());
178 // scrolled.setLayout(CmsUtils.noSpaceGridLayout());
179 // // TODO manage style
180 // // CmsUtils.style(scrolled, "maintenance_user_form");
181 //
182 // Composite page = new Composite(scrolled, SWT.NONE);
183 // page.setLayout(CmsUtils.noSpaceGridLayout());
184 // page.setBackgroundMode(SWT.INHERIT_NONE);
185 //
186 // return page;
187 // }
188
189 private boolean isAdmin(Node node) throws RepositoryException {
190 // FIXME clean this once new user management policy has been
191 // implemented.
192 AccessControlManager acm = node.getSession().getAccessControlManager();
193 Privilege[] privs = new Privilege[1];
194 privs[0] = acm.privilegeFromName(Privilege.JCR_ALL);
195 return acm.hasPrivileges("/", privs);
196 }
197
198 // @Override
199 // public void dispose() {
200 // JcrUtils.removeListenerQuietly(session, userStructureListener);
201 // JcrUtils.removeListenerQuietly(session, userPropertiesListener);
202 // JcrUtils.logoutQuietly(session);
203 // super.dispose();
204 // }
205 //
206 // // public void setSession(Session session) {
207 // // this.session = session;
208 // // }
209 //
210 // public void refresh() {
211 // this.getSite().getShell().getDisplay().asyncExec(new Runnable() {
212 // @Override
213 // public void run() {
214 // userTableCmp.refresh();
215 // }
216 // });
217 // }
218 //
219 // private class JcrUserListener implements EventListener {
220 // private final Display display;
221 //
222 // public JcrUserListener(Display display) {
223 // super();
224 // this.display = display;
225 // }
226 //
227 // @Override
228 // public void onEvent(EventIterator events) {
229 // display.asyncExec(new Runnable() {
230 // @Override
231 // public void run() {
232 // userTableCmp.refresh();
233 // }
234 // });
235 // }
236 // }
237 //
238 // class ViewDoubleClickListener implements IDoubleClickListener {
239 // public void doubleClick(DoubleClickEvent evt) {
240 // if (evt.getSelection().isEmpty())
241 // return;
242 //
243 // Object obj = ((IStructuredSelection) evt.getSelection())
244 // .getFirstElement();
245 // if (obj instanceof Node) {
246 // try {
247 // String username = ((Node) obj).getProperty(ARGEO_USER_ID)
248 // .getString();
249 // String commandId = OpenArgeoUserEditor.COMMAND_ID;
250 // String paramName = OpenArgeoUserEditor.PARAM_USERNAME;
251 // CommandUtils.callCommand(commandId, paramName, username);
252 // } catch (RepositoryException e) {
253 // throw new ArgeoException("Cannot open user editor", e);
254 // }
255 // }
256 // }
257
258 /* DEPENDENCY INJECTION */
259 public void setWorkspaceName(String workspaceName) {
260 this.userWkspName = workspaceName;
261 }
262
263 public void setUserAdminService(UserAdminService userAdminService) {
264 this.userAdminService = userAdminService;
265 userPage.setUserAdminService(userAdminService);
266 }
267
268 public void setJcrSecurityModel(JcrSecurityModel jcrSecurityModel) {
269 this.jcrSecurityModel = jcrSecurityModel;
270 userPage.setJcrSecurityModel(jcrSecurityModel);
271 }
272 }