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