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.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 }