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