]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.eclipse.ui.workbench/src/org/argeo/eclipse/ui/workbench/users/PickUpUserDialog.java
Enhance privilege display to ease JCR privilege management
[lgpl/argeo-commons.git] / org.argeo.eclipse.ui.workbench / src / org / argeo / eclipse / ui / workbench / users / PickUpUserDialog.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
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.eclipse.ui.workbench.users;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.argeo.ArgeoException;
22 import org.argeo.eclipse.ui.ColumnDefinition;
23 import org.argeo.eclipse.ui.EclipseUiUtils;
24 import org.argeo.eclipse.ui.parts.LdifUsersTable;
25 import org.argeo.eclipse.ui.workbench.users.internal.UsersUtils;
26 import org.argeo.osgi.useradmin.LdifName;
27 import org.eclipse.jface.dialogs.TrayDialog;
28 import org.eclipse.jface.viewers.DoubleClickEvent;
29 import org.eclipse.jface.viewers.IDoubleClickListener;
30 import org.eclipse.jface.viewers.ISelectionChangedListener;
31 import org.eclipse.jface.viewers.IStructuredSelection;
32 import org.eclipse.jface.viewers.SelectionChangedEvent;
33 import org.eclipse.jface.viewers.TableViewer;
34 import org.eclipse.swt.SWT;
35 import org.eclipse.swt.events.SelectionAdapter;
36 import org.eclipse.swt.events.SelectionEvent;
37 import org.eclipse.swt.events.SelectionListener;
38 import org.eclipse.swt.graphics.Point;
39 import org.eclipse.swt.layout.FillLayout;
40 import org.eclipse.swt.layout.GridLayout;
41 import org.eclipse.swt.widgets.Button;
42 import org.eclipse.swt.widgets.Composite;
43 import org.eclipse.swt.widgets.Control;
44 import org.eclipse.swt.widgets.Shell;
45 import org.osgi.framework.InvalidSyntaxException;
46 import org.osgi.service.useradmin.Group;
47 import org.osgi.service.useradmin.Role;
48 import org.osgi.service.useradmin.User;
49 import org.osgi.service.useradmin.UserAdmin;
50
51 /** Dialog with a group list to pick up one */
52 public class PickUpUserDialog extends TrayDialog {
53 private static final long serialVersionUID = -1420106871173920369L;
54
55 // Business objects
56 private final UserAdmin userAdmin;
57 private User selectedUser;
58
59 // this page widgets and UI objects
60 private String title;
61 private LdifUsersTable userTableViewerCmp;
62 private TableViewer userViewer;
63 private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
64
65 public PickUpUserDialog(Shell parentShell, String title, UserAdmin userAdmin) {
66 super(parentShell);
67 this.title = title;
68 this.userAdmin = userAdmin;
69
70 // Define the displayed columns
71 columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_ICON), "",
72 26, 0));
73 columnDefs.add(new ColumnDefinition(
74 new UserLP(UserLP.COL_DISPLAY_NAME), "Common Name", 150, 100));
75 columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DOMAIN),
76 "Domain", 100, 120));
77 columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DN),
78 "Distinguished Name", 300, 100));
79 }
80
81 protected Point getInitialSize() {
82 return new Point(700, 450);
83 }
84
85 protected Control createDialogArea(Composite parent) {
86 Composite dialogArea = (Composite) super.createDialogArea(parent);
87 dialogArea.setLayout(new FillLayout());
88
89 Composite bodyCmp = new Composite(dialogArea, SWT.NO_FOCUS);
90 bodyCmp.setLayout(new GridLayout());
91
92 // Create and configure the table
93 userTableViewerCmp = new MyUserTableViewer(bodyCmp, SWT.MULTI
94 | SWT.H_SCROLL | SWT.V_SCROLL);
95
96 userTableViewerCmp.setColumnDefinitions(columnDefs);
97 userTableViewerCmp.populateWithStaticFilters(false, false);
98 userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
99 userTableViewerCmp.refresh();
100
101 // Controllers
102 userViewer = userTableViewerCmp.getTableViewer();
103 userViewer.addDoubleClickListener(new MyDoubleClickListener());
104 userViewer
105 .addSelectionChangedListener(new MySelectionChangedListener());
106
107 parent.pack();
108 return dialogArea;
109 }
110
111 public User getSelected() {
112 if (selectedUser == null)
113 return null;
114 else
115 return selectedUser;
116 }
117
118 protected void configureShell(Shell shell) {
119 super.configureShell(shell);
120 shell.setText(title);
121 }
122
123 class MyDoubleClickListener implements IDoubleClickListener {
124 public void doubleClick(DoubleClickEvent evt) {
125 if (evt.getSelection().isEmpty())
126 return;
127
128 Object obj = ((IStructuredSelection) evt.getSelection())
129 .getFirstElement();
130 if (obj instanceof User) {
131 selectedUser = (User) obj;
132 okPressed();
133 }
134 }
135 }
136
137 class MySelectionChangedListener implements ISelectionChangedListener {
138 @Override
139 public void selectionChanged(SelectionChangedEvent event) {
140 if (event.getSelection().isEmpty()) {
141 selectedUser = null;
142 return;
143 }
144 Object obj = ((IStructuredSelection) event.getSelection())
145 .getFirstElement();
146 if (obj instanceof Group) {
147 selectedUser = (Group) obj;
148 }
149 }
150 }
151
152 private class MyUserTableViewer extends LdifUsersTable {
153 private static final long serialVersionUID = 8467999509931900367L;
154
155 private final String[] knownProps = { LdifName.uid.name(),
156 LdifName.cn.name(), LdifName.dn.name() };
157
158 private Button showSystemRoleBtn;
159 private Button showUserBtn;
160
161 public MyUserTableViewer(Composite parent, int style) {
162 super(parent, style);
163 }
164
165 protected void populateStaticFilters(Composite staticFilterCmp) {
166 staticFilterCmp.setLayout(new GridLayout());
167 showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK);
168 showSystemRoleBtn.setText("Show system roles ");
169
170 showUserBtn = new Button(staticFilterCmp, SWT.CHECK);
171 showUserBtn.setText("Show users ");
172
173 SelectionListener sl = new SelectionAdapter() {
174 private static final long serialVersionUID = -7033424592697691676L;
175
176 @Override
177 public void widgetSelected(SelectionEvent e) {
178 refresh();
179 }
180 };
181
182 showSystemRoleBtn.addSelectionListener(sl);
183 showUserBtn.addSelectionListener(sl);
184 }
185
186 @Override
187 protected List<User> listFilteredElements(String filter) {
188 Role[] roles;
189 try {
190 StringBuilder builder = new StringBuilder();
191
192 StringBuilder filterBuilder = new StringBuilder();
193 if (notNull(filter))
194 for (String prop : knownProps) {
195 filterBuilder.append("(");
196 filterBuilder.append(prop);
197 filterBuilder.append("=*");
198 filterBuilder.append(filter);
199 filterBuilder.append("*)");
200 }
201
202 String typeStr = "(" + LdifName.objectClass.name() + "="
203 + LdifName.groupOfNames.name() + ")";
204 if ((showUserBtn.getSelection()))
205 typeStr = "(|(" + LdifName.objectClass.name() + "="
206 + LdifName.inetOrgPerson.name() + ")" + typeStr
207 + ")";
208
209 if (!showSystemRoleBtn.getSelection())
210 typeStr = "(& " + typeStr + "(!(" + LdifName.dn.name()
211 + "=*" + UsersUtils.ROLES_BASEDN + ")))";
212
213 if (filterBuilder.length() > 1) {
214 builder.append("(&" + typeStr);
215 builder.append("(|");
216 builder.append(filterBuilder.toString());
217 builder.append("))");
218 } else {
219 builder.append(typeStr);
220 }
221 roles = userAdmin.getRoles(builder.toString());
222 } catch (InvalidSyntaxException e) {
223 throw new ArgeoException("Unable to get roles with filter: "
224 + filter, e);
225 }
226 List<User> users = new ArrayList<User>();
227 for (Role role : roles)
228 if (!users.contains(role))
229 users.add((User) role);
230 return users;
231 }
232 }
233
234 private boolean notNull(String string) {
235 if (string == null)
236 return false;
237 else
238 return !"".equals(string.trim());
239 }
240 }