]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/GroupsView.java
0d33677ac572da6e018da14fc9556f10af99071e
[lgpl/argeo-commons.git] / org.argeo.cms.ui.workbench / src / org / argeo / cms / ui / workbench / internal / useradmin / parts / GroupsView.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.internal.useradmin.parts;
17
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.apache.commons.logging.Log;
22 import org.apache.commons.logging.LogFactory;
23 import org.argeo.cms.ArgeoNames;
24 import org.argeo.cms.CmsException;
25 import org.argeo.cms.auth.CurrentUser;
26 import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
27 import org.argeo.cms.ui.workbench.internal.useradmin.UiUserAdminListener;
28 import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper;
29 import org.argeo.cms.ui.workbench.internal.useradmin.providers.CommonNameLP;
30 import org.argeo.cms.ui.workbench.internal.useradmin.providers.DomainNameLP;
31 import org.argeo.cms.ui.workbench.internal.useradmin.providers.RoleIconLP;
32 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserDragListener;
33 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserNameLP;
34 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserTableDefaultDClickListener;
35 import org.argeo.eclipse.ui.ColumnDefinition;
36 import org.argeo.eclipse.ui.EclipseUiUtils;
37 import org.argeo.eclipse.ui.parts.LdifUsersTable;
38 import org.argeo.naming.LdapAttrs;
39 import org.argeo.naming.LdapObjs;
40 import org.argeo.node.NodeConstants;
41 import org.eclipse.jface.viewers.TableViewer;
42 import org.eclipse.swt.SWT;
43 import org.eclipse.swt.dnd.DND;
44 import org.eclipse.swt.dnd.TextTransfer;
45 import org.eclipse.swt.dnd.Transfer;
46 import org.eclipse.swt.events.SelectionAdapter;
47 import org.eclipse.swt.events.SelectionEvent;
48 import org.eclipse.swt.layout.GridLayout;
49 import org.eclipse.swt.widgets.Button;
50 import org.eclipse.swt.widgets.Composite;
51 import org.eclipse.swt.widgets.Display;
52 import org.eclipse.ui.part.ViewPart;
53 import org.osgi.framework.InvalidSyntaxException;
54 import org.osgi.service.useradmin.Role;
55 import org.osgi.service.useradmin.User;
56 import org.osgi.service.useradmin.UserAdminEvent;
57 import org.osgi.service.useradmin.UserAdminListener;
58
59 /** List all groups with filter */
60 public class GroupsView extends ViewPart implements ArgeoNames {
61 private final static Log log = LogFactory.getLog(GroupsView.class);
62 public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".groupsView";
63
64 /* DEPENDENCY INJECTION */
65 private UserAdminWrapper userAdminWrapper;
66
67 // UI Objects
68 private LdifUsersTable groupTableViewerCmp;
69 private TableViewer userViewer;
70 private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
71
72 private UserAdminListener listener;
73
74 @Override
75 public void createPartControl(Composite parent) {
76 parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
77
78 boolean isAdmin = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN);
79
80 // Define the displayed columns
81 columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 26));
82 columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
83 150));
84 columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 200));
85 // Only show technical DN to admin
86 if (isAdmin)
87 columnDefs.add(new ColumnDefinition(new UserNameLP(),
88 "Distinguished Name", 300));
89
90 // Create and configure the table
91 groupTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
92 | SWT.H_SCROLL | SWT.V_SCROLL);
93
94 groupTableViewerCmp.setColumnDefinitions(columnDefs);
95 if (isAdmin)
96 groupTableViewerCmp.populateWithStaticFilters(false, false);
97 else
98 groupTableViewerCmp.populate(true, false);
99
100 groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
101
102 // Links
103 userViewer = groupTableViewerCmp.getTableViewer();
104 userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
105 getViewSite().setSelectionProvider(userViewer);
106
107 // Really?
108 groupTableViewerCmp.refresh();
109
110 // Drag and drop
111 int operations = DND.DROP_COPY | DND.DROP_MOVE;
112 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
113 userViewer.addDragSupport(operations, tt, new UserDragListener(
114 userViewer));
115
116 // // Register a useradmin listener
117 // listener = new UserAdminListener() {
118 // @Override
119 // public void roleChanged(UserAdminEvent event) {
120 // if (userViewer != null && !userViewer.getTable().isDisposed())
121 // refresh();
122 // }
123 // };
124 // userAdminWrapper.addListener(listener);
125 // }
126
127 // Register a useradmin listener
128 listener = new MyUiUAListener(parent.getDisplay());
129 userAdminWrapper.addListener(listener);
130 }
131
132 private class MyUiUAListener extends UiUserAdminListener {
133 public MyUiUAListener(Display display) {
134 super(display);
135 }
136
137 @Override
138 public void roleChangedToUiThread(UserAdminEvent event) {
139 if (userViewer != null && !userViewer.getTable().isDisposed())
140 refresh();
141 }
142 }
143
144 private class MyUserTableViewer extends LdifUsersTable {
145 private static final long serialVersionUID = 8467999509931900367L;
146
147 private boolean showSystemRoles;
148
149 private final String[] knownProps = { LdapAttrs.uid.name(),
150 LdapAttrs.cn.name(), LdapAttrs.DN };
151
152 public MyUserTableViewer(Composite parent, int style) {
153 super(parent, style);
154 }
155
156 protected void populateStaticFilters(Composite staticFilterCmp) {
157 staticFilterCmp.setLayout(new GridLayout());
158 final Button showSystemRoleBtn = new Button(staticFilterCmp,
159 SWT.CHECK);
160 showSystemRoleBtn.setText("Show system roles");
161 showSystemRoles = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN);
162 showSystemRoleBtn.setSelection(showSystemRoles);
163
164 showSystemRoleBtn.addSelectionListener(new SelectionAdapter() {
165 private static final long serialVersionUID = -7033424592697691676L;
166
167 @Override
168 public void widgetSelected(SelectionEvent e) {
169 showSystemRoles = showSystemRoleBtn.getSelection();
170 refresh();
171 }
172
173 });
174 }
175
176 @Override
177 protected List<User> listFilteredElements(String filter) {
178 Role[] roles;
179 try {
180 StringBuilder builder = new StringBuilder();
181 StringBuilder tmpBuilder = new StringBuilder();
182 if (EclipseUiUtils.notEmpty(filter))
183 for (String prop : knownProps) {
184 tmpBuilder.append("(");
185 tmpBuilder.append(prop);
186 tmpBuilder.append("=*");
187 tmpBuilder.append(filter);
188 tmpBuilder.append("*)");
189 }
190 if (tmpBuilder.length() > 1) {
191 builder.append("(&(").append(LdapAttrs.objectClass.name())
192 .append("=").append(LdapObjs.groupOfNames.name())
193 .append(")");
194 if (!showSystemRoles)
195 builder.append("(!(").append(LdapAttrs.DN).append("=*")
196 .append(NodeConstants.ROLES_BASEDN)
197 .append("))");
198 builder.append("(|");
199 builder.append(tmpBuilder.toString());
200 builder.append("))");
201 } else {
202 if (!showSystemRoles)
203 builder.append("(&(")
204 .append(LdapAttrs.objectClass.name())
205 .append("=")
206 .append(LdapObjs.groupOfNames.name())
207 .append(")(!(").append(LdapAttrs.DN)
208 .append("=*")
209 .append(NodeConstants.ROLES_BASEDN)
210 .append(")))");
211 else
212 builder.append("(")
213 .append(LdapAttrs.objectClass.name())
214 .append("=")
215 .append(LdapObjs.groupOfNames.name())
216 .append(")");
217
218 }
219 roles = userAdminWrapper.getUserAdmin().getRoles(
220 builder.toString());
221 } catch (InvalidSyntaxException e) {
222 throw new CmsException("Unable to get roles with filter: "
223 + filter, e);
224 }
225 List<User> users = new ArrayList<User>();
226 for (Role role : roles)
227 if (!users.contains(role))
228 users.add((User) role);
229 else
230 log.warn("Duplicated role: " + role);
231
232 return users;
233 }
234 }
235
236 public void refresh() {
237 groupTableViewerCmp.refresh();
238 }
239
240 // Override generic view methods
241 @Override
242 public void dispose() {
243 userAdminWrapper.removeListener(listener);
244 super.dispose();
245 }
246
247 @Override
248 public void setFocus() {
249 groupTableViewerCmp.setFocus();
250 }
251
252 /* DEPENDENCY INJECTION */
253 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
254 this.userAdminWrapper = userAdminWrapper;
255 }
256 }