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