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.useradmin;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  
21  import org.argeo.api.NodeConstants;
22  import org.argeo.eclipse.ui.ColumnDefinition;
23  import org.argeo.eclipse.ui.EclipseUiException;
24  import org.argeo.eclipse.ui.EclipseUiUtils;
25  import org.argeo.eclipse.ui.parts.LdifUsersTable;
26  import org.argeo.naming.LdapAttrs;
27  import org.argeo.naming.LdapObjs;
28  import org.eclipse.jface.dialogs.MessageDialog;
29  import org.eclipse.jface.dialogs.TrayDialog;
30  import org.eclipse.jface.viewers.DoubleClickEvent;
31  import org.eclipse.jface.viewers.IDoubleClickListener;
32  import org.eclipse.jface.viewers.ISelectionChangedListener;
33  import org.eclipse.jface.viewers.IStructuredSelection;
34  import org.eclipse.jface.viewers.SelectionChangedEvent;
35  import org.eclipse.jface.viewers.TableViewer;
36  import org.eclipse.swt.SWT;
37  import org.eclipse.swt.events.SelectionAdapter;
38  import org.eclipse.swt.events.SelectionEvent;
39  import org.eclipse.swt.events.SelectionListener;
40  import org.eclipse.swt.layout.FillLayout;
41  import org.eclipse.swt.layout.GridData;
42  import org.eclipse.swt.layout.GridLayout;
43  import org.eclipse.swt.widgets.Button;
44  import org.eclipse.swt.widgets.Composite;
45  import org.eclipse.swt.widgets.Control;
46  import org.eclipse.swt.widgets.Shell;
47  import org.osgi.framework.InvalidSyntaxException;
48  import org.osgi.service.useradmin.Group;
49  import org.osgi.service.useradmin.Role;
50  import org.osgi.service.useradmin.User;
51  import org.osgi.service.useradmin.UserAdmin;
52  
53  /** Dialog with a user (or group) list to pick up one */
54  public class PickUpUserDialog extends TrayDialog {
55  	private static final long serialVersionUID = -1420106871173920369L;
56  
57  	// Business objects
58  	private final UserAdmin userAdmin;
59  	private User selectedUser;
60  
61  	// this page widgets and UI objects
62  	private String title;
63  	private LdifUsersTable userTableViewerCmp;
64  	private TableViewer userViewer;
65  	private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
66  
67  	/**
68  	 * A dialog to pick up a group or a user, showing a table with default
69  	 * columns
70  	 */
71  	public PickUpUserDialog(Shell parentShell, String title, UserAdmin userAdmin) {
72  		super(parentShell);
73  		this.title = title;
74  		this.userAdmin = userAdmin;
75  
76  		columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_ICON), "",
77  				24, 24));
78  		columnDefs.add(new ColumnDefinition(
79  				new UserLP(UserLP.COL_DISPLAY_NAME), "Common Name", 150, 100));
80  		columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DOMAIN),
81  				"Domain", 100, 120));
82  		columnDefs.add(new ColumnDefinition(new UserLP(UserLP.COL_DN),
83  				"Distinguished Name", 300, 100));
84  	}
85  
86  	/** A dialog to pick up a group or a user */
87  	public PickUpUserDialog(Shell parentShell, String title,
88  			UserAdmin userAdmin, List<ColumnDefinition> columnDefs) {
89  		super(parentShell);
90  		this.title = title;
91  		this.userAdmin = userAdmin;
92  		this.columnDefs = columnDefs;
93  	}
94  
95  	@Override
96  	protected void okPressed() {
97  		if (getSelected() == null)
98  			MessageDialog.openError(getShell(), "No user chosen",
99  					"Please, choose a user or press Cancel.");
100 		else
101 			super.okPressed();
102 	}
103 
104 	protected Control createDialogArea(Composite parent) {
105 		Composite dialogArea = (Composite) super.createDialogArea(parent);
106 		dialogArea.setLayout(new FillLayout());
107 
108 		Composite bodyCmp = new Composite(dialogArea, SWT.NO_FOCUS);
109 		bodyCmp.setLayout(new GridLayout());
110 
111 		// Create and configure the table
112 		userTableViewerCmp = new MyUserTableViewer(bodyCmp, SWT.MULTI
113 				| SWT.H_SCROLL | SWT.V_SCROLL);
114 
115 		userTableViewerCmp.setColumnDefinitions(columnDefs);
116 		userTableViewerCmp.populateWithStaticFilters(false, false);
117 		GridData gd = EclipseUiUtils.fillAll();
118 		gd.minimumHeight = 300;
119 		userTableViewerCmp.setLayoutData(gd);
120 		userTableViewerCmp.refresh();
121 
122 		// Controllers
123 		userViewer = userTableViewerCmp.getTableViewer();
124 		userViewer.addDoubleClickListener(new MyDoubleClickListener());
125 		userViewer
126 				.addSelectionChangedListener(new MySelectionChangedListener());
127 
128 		parent.pack();
129 		return dialogArea;
130 	}
131 
132 	public User getSelected() {
133 		if (selectedUser == null)
134 			return null;
135 		else
136 			return selectedUser;
137 	}
138 
139 	protected void configureShell(Shell shell) {
140 		super.configureShell(shell);
141 		shell.setText(title);
142 	}
143 
144 	class MyDoubleClickListener implements IDoubleClickListener {
145 		public void doubleClick(DoubleClickEvent evt) {
146 			if (evt.getSelection().isEmpty())
147 				return;
148 
149 			Object obj = ((IStructuredSelection) evt.getSelection())
150 					.getFirstElement();
151 			if (obj instanceof User) {
152 				selectedUser = (User) obj;
153 				okPressed();
154 			}
155 		}
156 	}
157 
158 	class MySelectionChangedListener implements ISelectionChangedListener {
159 		@Override
160 		public void selectionChanged(SelectionChangedEvent event) {
161 			if (event.getSelection().isEmpty()) {
162 				selectedUser = null;
163 				return;
164 			}
165 			Object obj = ((IStructuredSelection) event.getSelection())
166 					.getFirstElement();
167 			if (obj instanceof Group) {
168 				selectedUser = (Group) obj;
169 			}
170 		}
171 	}
172 
173 	private class MyUserTableViewer extends LdifUsersTable {
174 		private static final long serialVersionUID = 8467999509931900367L;
175 
176 		private final String[] knownProps = { LdapAttrs.uid.name(),
177 				LdapAttrs.cn.name(), LdapAttrs.DN };
178 
179 		private Button showSystemRoleBtn;
180 		private Button showUserBtn;
181 
182 		public MyUserTableViewer(Composite parent, int style) {
183 			super(parent, style);
184 		}
185 
186 		protected void populateStaticFilters(Composite staticFilterCmp) {
187 			staticFilterCmp.setLayout(new GridLayout());
188 			showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK);
189 			showSystemRoleBtn.setText("Show system roles  ");
190 
191 			showUserBtn = new Button(staticFilterCmp, SWT.CHECK);
192 			showUserBtn.setText("Show users  ");
193 
194 			SelectionListener sl = new SelectionAdapter() {
195 				private static final long serialVersionUID = -7033424592697691676L;
196 
197 				@Override
198 				public void widgetSelected(SelectionEvent e) {
199 					refresh();
200 				}
201 			};
202 
203 			showSystemRoleBtn.addSelectionListener(sl);
204 			showUserBtn.addSelectionListener(sl);
205 		}
206 
207 		@Override
208 		protected List<User> listFilteredElements(String filter) {
209 			Role[] roles;
210 			try {
211 				StringBuilder builder = new StringBuilder();
212 
213 				StringBuilder filterBuilder = new StringBuilder();
214 				if (notNull(filter))
215 					for (String prop : knownProps) {
216 						filterBuilder.append("(");
217 						filterBuilder.append(prop);
218 						filterBuilder.append("=*");
219 						filterBuilder.append(filter);
220 						filterBuilder.append("*)");
221 					}
222 
223 				String typeStr = "(" + LdapAttrs.objectClass.name() + "="
224 						+ LdapObjs.groupOfNames.name() + ")";
225 				if ((showUserBtn.getSelection()))
226 					typeStr = "(|(" + LdapAttrs.objectClass.name() + "="
227 							+ LdapObjs.inetOrgPerson.name() + ")" + typeStr
228 							+ ")";
229 
230 				if (!showSystemRoleBtn.getSelection())
231 					typeStr = "(& " + typeStr + "(!(" + LdapAttrs.DN + "=*"
232 							+ NodeConstants.ROLES_BASEDN + ")))";
233 
234 				if (filterBuilder.length() > 1) {
235 					builder.append("(&" + typeStr);
236 					builder.append("(|");
237 					builder.append(filterBuilder.toString());
238 					builder.append("))");
239 				} else {
240 					builder.append(typeStr);
241 				}
242 				roles = userAdmin.getRoles(builder.toString());
243 			} catch (InvalidSyntaxException e) {
244 				throw new EclipseUiException(
245 						"Unable to get roles with filter: " + filter, e);
246 			}
247 			List<User> users = new ArrayList<User>();
248 			for (Role role : roles)
249 				if (!users.contains(role))
250 					users.add((User) role);
251 			return users;
252 		}
253 	}
254 
255 	private boolean notNull(String string) {
256 		if (string == null)
257 			return false;
258 		else
259 			return !"".equals(string.trim());
260 	}
261 }