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