]> 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
Merge branch 'master' of https://github.com/argeo/argeo-commons.git
[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.UserTableDefaultDClickListener;
34 import org.argeo.eclipse.ui.ColumnDefinition;
35 import org.argeo.eclipse.ui.EclipseUiUtils;
36 import org.argeo.eclipse.ui.parts.LdifUsersTable;
37 import org.argeo.naming.LdapAttrs;
38 import org.argeo.naming.LdapObjs;
39 import org.argeo.node.NodeConstants;
40 import org.eclipse.jface.viewers.TableViewer;
41 import org.eclipse.swt.SWT;
42 import org.eclipse.swt.dnd.DND;
43 import org.eclipse.swt.dnd.TextTransfer;
44 import org.eclipse.swt.dnd.Transfer;
45 import org.eclipse.swt.events.SelectionAdapter;
46 import org.eclipse.swt.events.SelectionEvent;
47 import org.eclipse.swt.layout.GridData;
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(), "", 19));
82 columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Name", 150));
83 columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 100));
84 // Only show technical DN to admin
85 // if (isAdmin)
86 // columnDefs.add(new ColumnDefinition(new UserNameLP(),
87 // "Distinguished Name", 300));
88
89 // Create and configure the table
90 groupTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
91
92 groupTableViewerCmp.setColumnDefinitions(columnDefs);
93 // if (isAdmin)
94 // groupTableViewerCmp.populateWithStaticFilters(false, false);
95 // else
96 groupTableViewerCmp.populate(true, false);
97
98 groupTableViewerCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
99
100 // Links
101 userViewer = groupTableViewerCmp.getTableViewer();
102 userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
103 getViewSite().setSelectionProvider(userViewer);
104
105 // Really?
106 groupTableViewerCmp.refresh();
107
108 // Drag and drop
109 int operations = DND.DROP_COPY | DND.DROP_MOVE;
110 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
111 userViewer.addDragSupport(operations, tt, new UserDragListener(userViewer));
112
113 // // Register a useradmin listener
114 // listener = new UserAdminListener() {
115 // @Override
116 // public void roleChanged(UserAdminEvent event) {
117 // if (userViewer != null && !userViewer.getTable().isDisposed())
118 // refresh();
119 // }
120 // };
121 // userAdminWrapper.addListener(listener);
122 // }
123
124 // Register a useradmin listener
125 listener = new MyUiUAListener(parent.getDisplay());
126 userAdminWrapper.addListener(listener);
127 }
128
129 private class MyUiUAListener extends UiUserAdminListener {
130 public MyUiUAListener(Display display) {
131 super(display);
132 }
133
134 @Override
135 public void roleChangedToUiThread(UserAdminEvent event) {
136 if (userViewer != null && !userViewer.getTable().isDisposed())
137 refresh();
138 }
139 }
140
141 private class MyUserTableViewer extends LdifUsersTable {
142 private static final long serialVersionUID = 8467999509931900367L;
143
144 private boolean showSystemRoles = true;
145
146 private final String[] knownProps = { LdapAttrs.uid.name(), LdapAttrs.cn.name(), LdapAttrs.DN };
147
148 public MyUserTableViewer(Composite parent, int style) {
149 super(parent, style);
150 showSystemRoles = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN);
151 }
152
153 protected void populateStaticFilters(Composite staticFilterCmp) {
154 staticFilterCmp.setLayout(new GridLayout());
155 final Button showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK);
156 showSystemRoleBtn.setText("Show system roles");
157 showSystemRoles = CurrentUser.isInRole(NodeConstants.ROLE_ADMIN);
158 showSystemRoleBtn.setSelection(showSystemRoles);
159
160 showSystemRoleBtn.addSelectionListener(new SelectionAdapter() {
161 private static final long serialVersionUID = -7033424592697691676L;
162
163 @Override
164 public void widgetSelected(SelectionEvent e) {
165 showSystemRoles = showSystemRoleBtn.getSelection();
166 refresh();
167 }
168
169 });
170 }
171
172 @Override
173 protected List<User> listFilteredElements(String filter) {
174 Role[] roles;
175 try {
176 StringBuilder builder = new StringBuilder();
177 StringBuilder tmpBuilder = new StringBuilder();
178 if (EclipseUiUtils.notEmpty(filter))
179 for (String prop : knownProps) {
180 tmpBuilder.append("(");
181 tmpBuilder.append(prop);
182 tmpBuilder.append("=*");
183 tmpBuilder.append(filter);
184 tmpBuilder.append("*)");
185 }
186 if (tmpBuilder.length() > 1) {
187 builder.append("(&(").append(LdapAttrs.objectClass.name()).append("=")
188 .append(LdapObjs.groupOfNames.name()).append(")");
189 if (!showSystemRoles)
190 builder.append("(!(").append(LdapAttrs.DN).append("=*").append(NodeConstants.ROLES_BASEDN)
191 .append("))");
192 builder.append("(|");
193 builder.append(tmpBuilder.toString());
194 builder.append("))");
195 } else {
196 if (!showSystemRoles)
197 builder.append("(&(").append(LdapAttrs.objectClass.name()).append("=")
198 .append(LdapObjs.groupOfNames.name()).append(")(!(").append(LdapAttrs.DN).append("=*")
199 .append(NodeConstants.ROLES_BASEDN).append(")))");
200 else
201 builder.append("(").append(LdapAttrs.objectClass.name()).append("=")
202 .append(LdapObjs.groupOfNames.name()).append(")");
203
204 }
205 roles = userAdminWrapper.getUserAdmin().getRoles(builder.toString());
206 } catch (InvalidSyntaxException e) {
207 throw new CmsException("Unable to get roles with filter: " + filter, e);
208 }
209 List<User> users = new ArrayList<User>();
210 for (Role role : roles)
211 if (!users.contains(role))
212 users.add((User) role);
213 else
214 log.warn("Duplicated role: " + role);
215
216 return users;
217 }
218 }
219
220 public void refresh() {
221 groupTableViewerCmp.refresh();
222 }
223
224 // Override generic view methods
225 @Override
226 public void dispose() {
227 userAdminWrapper.removeListener(listener);
228 super.dispose();
229 }
230
231 @Override
232 public void setFocus() {
233 groupTableViewerCmp.setFocus();
234 }
235
236 /* DEPENDENCY INJECTION */
237 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
238 this.userAdminWrapper = userAdminWrapper;
239 }
240 }