]> 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
ec20a04e7d8e60829047a9ee99382ead81a25947
[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.CmsException;
24 import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
25 import org.argeo.cms.ui.workbench.internal.useradmin.UiUserAdminListener;
26 import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper;
27 import org.argeo.cms.ui.workbench.internal.useradmin.providers.CommonNameLP;
28 import org.argeo.cms.ui.workbench.internal.useradmin.providers.DomainNameLP;
29 import org.argeo.cms.ui.workbench.internal.useradmin.providers.RoleIconLP;
30 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserDragListener;
31 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserNameLP;
32 import org.argeo.cms.ui.workbench.internal.useradmin.providers.UserTableDefaultDClickListener;
33 import org.argeo.cms.util.useradmin.UserAdminUtils;
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.node.ArgeoNames;
38 import org.argeo.node.NodeConstants;
39 import org.argeo.osgi.useradmin.LdifName;
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.GridLayout;
48 import org.eclipse.swt.widgets.Button;
49 import org.eclipse.swt.widgets.Composite;
50 import org.eclipse.swt.widgets.Display;
51 import org.eclipse.ui.part.ViewPart;
52 import org.osgi.framework.InvalidSyntaxException;
53 import org.osgi.service.useradmin.Role;
54 import org.osgi.service.useradmin.User;
55 import org.osgi.service.useradmin.UserAdminEvent;
56 import org.osgi.service.useradmin.UserAdminListener;
57
58 /** List all groups with filter */
59 public class GroupsView extends ViewPart implements ArgeoNames {
60 private final static Log log = LogFactory.getLog(GroupsView.class);
61 public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".groupsView";
62
63 /* DEPENDENCY INJECTION */
64 private UserAdminWrapper userAdminWrapper;
65
66 // UI Objects
67 private LdifUsersTable groupTableViewerCmp;
68 private TableViewer userViewer;
69 private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
70
71 private UserAdminListener listener;
72
73 @Override
74 public void createPartControl(Composite parent) {
75 parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
76
77 boolean isAdmin = UserAdminUtils.isUserInRole(NodeConstants.ROLE_ADMIN);
78
79 // Define the displayed columns
80 columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 26));
81 columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
82 150));
83 columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 200));
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
91 | SWT.H_SCROLL | SWT.V_SCROLL);
92
93 groupTableViewerCmp.setColumnDefinitions(columnDefs);
94 if (isAdmin)
95 groupTableViewerCmp.populateWithStaticFilters(false, false);
96 else
97 groupTableViewerCmp.populate(true, false);
98
99 groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
100
101 // Links
102 userViewer = groupTableViewerCmp.getTableViewer();
103 userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
104 getViewSite().setSelectionProvider(userViewer);
105
106 // Really?
107 groupTableViewerCmp.refresh();
108
109 // Drag and drop
110 int operations = DND.DROP_COPY | DND.DROP_MOVE;
111 Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
112 userViewer.addDragSupport(operations, tt, new UserDragListener(
113 userViewer));
114
115 // // Register a useradmin listener
116 // listener = new UserAdminListener() {
117 // @Override
118 // public void roleChanged(UserAdminEvent event) {
119 // if (userViewer != null && !userViewer.getTable().isDisposed())
120 // refresh();
121 // }
122 // };
123 // userAdminWrapper.addListener(listener);
124 // }
125
126 // Register a useradmin listener
127 listener = new MyUiUAListener(parent.getDisplay());
128 userAdminWrapper.addListener(listener);
129 }
130
131 private class MyUiUAListener extends UiUserAdminListener {
132 public MyUiUAListener(Display display) {
133 super(display);
134 }
135
136 @Override
137 public void roleChangedToUiThread(UserAdminEvent event) {
138 if (userViewer != null && !userViewer.getTable().isDisposed())
139 refresh();
140 }
141 }
142
143 private class MyUserTableViewer extends LdifUsersTable {
144 private static final long serialVersionUID = 8467999509931900367L;
145
146 private boolean showSystemRoles = false;
147
148 private final String[] knownProps = { LdifName.uid.name(),
149 LdifName.cn.name(), LdifName.dn.name() };
150
151 public MyUserTableViewer(Composite parent, int style) {
152 super(parent, style);
153 }
154
155 protected void populateStaticFilters(Composite staticFilterCmp) {
156 staticFilterCmp.setLayout(new GridLayout());
157 final Button showSystemRoleBtn = new Button(staticFilterCmp,
158 SWT.CHECK);
159 showSystemRoleBtn.setText("Show system roles");
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(LdifName.objectClass.name())
188 .append("=").append(LdifName.groupOfNames.name())
189 .append(")");
190 if (!showSystemRoles)
191 builder.append("(!(").append(LdifName.dn.name())
192 .append("=*")
193 .append(NodeConstants.ROLES_BASEDN)
194 .append("))");
195 builder.append("(|");
196 builder.append(tmpBuilder.toString());
197 builder.append("))");
198 } else {
199 if (!showSystemRoles)
200 builder.append("(&(")
201 .append(LdifName.objectClass.name())
202 .append("=")
203 .append(LdifName.groupOfNames.name())
204 .append(")(!(").append(LdifName.dn.name())
205 .append("=*")
206 .append(NodeConstants.ROLES_BASEDN)
207 .append(")))");
208 else
209 builder.append("(").append(LdifName.objectClass.name())
210 .append("=")
211 .append(LdifName.groupOfNames.name())
212 .append(")");
213
214 }
215 roles = userAdminWrapper.getUserAdmin().getRoles(
216 builder.toString());
217 } catch (InvalidSyntaxException e) {
218 throw new CmsException("Unable to get roles with filter: "
219 + filter, e);
220 }
221 List<User> users = new ArrayList<User>();
222 for (Role role : roles)
223 if (!users.contains(role))
224 users.add((User) role);
225 else
226 log.warn("Duplicated role: " + role);
227
228 return users;
229 }
230 }
231
232 public void refresh() {
233 groupTableViewerCmp.refresh();
234 }
235
236 // Override generic view methods
237 @Override
238 public void dispose() {
239 userAdminWrapper.removeListener(listener);
240 super.dispose();
241 }
242
243 @Override
244 public void setFocus() {
245 groupTableViewerCmp.setFocus();
246 }
247
248 /* DEPENDENCY INJECTION */
249 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
250 this.userAdminWrapper = userAdminWrapper;
251 }
252 }