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.argeo.api.NodeConstants;
26  import org.argeo.cms.CmsException;
27  import org.argeo.cms.auth.CurrentUser;
28  import org.argeo.cms.e4.users.providers.CommonNameLP;
29  import org.argeo.cms.e4.users.providers.DomainNameLP;
30  import org.argeo.cms.e4.users.providers.MailLP;
31  import org.argeo.cms.e4.users.providers.UserDragListener;
32  import org.argeo.cms.e4.users.providers.UserNameLP;
33  import org.argeo.eclipse.ui.ColumnDefinition;
34  import org.argeo.eclipse.ui.EclipseUiUtils;
35  import org.argeo.eclipse.ui.parts.LdifUsersTable;
36  import org.argeo.naming.LdapAttrs;
37  import org.argeo.naming.LdapObjs;
38  import org.eclipse.e4.ui.di.Focus;
39  import org.eclipse.e4.ui.workbench.modeling.EPartService;
40  import org.eclipse.e4.ui.workbench.modeling.ESelectionService;
41  import org.eclipse.jface.viewers.ISelectionChangedListener;
42  import org.eclipse.jface.viewers.IStructuredSelection;
43  import org.eclipse.jface.viewers.SelectionChangedEvent;
44  import org.eclipse.jface.viewers.TableViewer;
45  import org.eclipse.swt.SWT;
46  import org.eclipse.swt.dnd.DND;
47  import org.eclipse.swt.dnd.TextTransfer;
48  import org.eclipse.swt.dnd.Transfer;
49  import org.eclipse.swt.widgets.Composite;
50  import org.eclipse.swt.widgets.Display;
51  import org.osgi.framework.InvalidSyntaxException;
52  import org.osgi.service.useradmin.Role;
53  import org.osgi.service.useradmin.User;
54  import org.osgi.service.useradmin.UserAdminEvent;
55  import org.osgi.service.useradmin.UserAdminListener;
56  
57  /** List all users with filter - based on Ldif userAdmin */
58  public class UsersView {
59  	// private final static Log log = LogFactory.getLog(UsersView.class);
60  
61  	// public final static String ID = WorkbenchUiPlugin.PLUGIN_ID + ".usersView";
62  
63  	@Inject
64  	private UserAdminWrapper userAdminWrapper;
65  	@Inject
66  	private EPartService partService;
67  
68  	// UI Objects
69  	private LdifUsersTable userTableViewerCmp;
70  	private TableViewer userViewer;
71  	private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
72  
73  	private UserAdminListener listener;
74  
75  	@PostConstruct
76  	public void createPartControl(Composite parent, ESelectionService selectionService) {
77  
78  		parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
79  		// Define the displayed columns
80  		columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name", 150));
81  		columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
82  		columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 200));
83  		// Only show technical DN to admin
84  		if (CurrentUser.isInRole(NodeConstants.ROLE_ADMIN))
85  			columnDefs.add(new ColumnDefinition(new UserNameLP(), "Distinguished Name", 300));
86  
87  		// Create and configure the table
88  		userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
89  		userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
90  		userTableViewerCmp.setColumnDefinitions(columnDefs);
91  		userTableViewerCmp.populate(true, false);
92  
93  		// Links
94  		userViewer = userTableViewerCmp.getTableViewer();
95  		userViewer.addDoubleClickListener(new UserTableDefaultDClickListener(partService));
96  		userViewer.addSelectionChangedListener(new ISelectionChangedListener() {
97  
98  			@Override
99  			public void selectionChanged(SelectionChangedEvent event) {
100 				IStructuredSelection selection = (IStructuredSelection) event.getSelection();
101 				selectionService.setSelection(selection.toList());
102 			}
103 		});
104 		// getViewSite().setSelectionProvider(userViewer);
105 
106 		// Really?
107 		userTableViewerCmp.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(userViewer));
113 
114 		// Register a useradmin listener
115 		listener = new MyUiUAListener(parent.getDisplay());
116 		userAdminWrapper.addListener(listener);
117 	}
118 
119 	private class MyUiUAListener extends UiUserAdminListener {
120 		public MyUiUAListener(Display display) {
121 			super(display);
122 		}
123 
124 		@Override
125 		public void roleChangedToUiThread(UserAdminEvent event) {
126 			if (userViewer != null && !userViewer.getTable().isDisposed())
127 				refresh();
128 		}
129 	}
130 
131 	private class MyUserTableViewer extends LdifUsersTable {
132 		private static final long serialVersionUID = 8467999509931900367L;
133 
134 		private final String[] knownProps = { LdapAttrs.DN, LdapAttrs.uid.name(), LdapAttrs.cn.name(),
135 				LdapAttrs.givenName.name(), LdapAttrs.sn.name(), LdapAttrs.mail.name() };
136 
137 		public MyUserTableViewer(Composite parent, int style) {
138 			super(parent, style);
139 		}
140 
141 		@Override
142 		protected List<User> listFilteredElements(String filter) {
143 			Role[] roles;
144 
145 			try {
146 				StringBuilder builder = new StringBuilder();
147 
148 				StringBuilder tmpBuilder = new StringBuilder();
149 				if (EclipseUiUtils.notEmpty(filter))
150 					for (String prop : knownProps) {
151 						tmpBuilder.append("(");
152 						tmpBuilder.append(prop);
153 						tmpBuilder.append("=*");
154 						tmpBuilder.append(filter);
155 						tmpBuilder.append("*)");
156 					}
157 				if (tmpBuilder.length() > 1) {
158 					builder.append("(&(").append(LdapAttrs.objectClass.name()).append("=")
159 							.append(LdapObjs.inetOrgPerson.name()).append(")(|");
160 					builder.append(tmpBuilder.toString());
161 					builder.append("))");
162 				} else
163 					builder.append("(").append(LdapAttrs.objectClass.name()).append("=")
164 							.append(LdapObjs.inetOrgPerson.name()).append(")");
165 				roles = userAdminWrapper.getUserAdmin().getRoles(builder.toString());
166 			} catch (InvalidSyntaxException e) {
167 				throw new CmsException("Unable to get roles with filter: " + filter, e);
168 			}
169 			List<User> users = new ArrayList<User>();
170 			for (Role role : roles)
171 				// if (role.getType() == Role.USER && role.getType() !=
172 				// Role.GROUP)
173 				users.add((User) role);
174 			return users;
175 		}
176 	}
177 
178 	public void refresh() {
179 		userTableViewerCmp.refresh();
180 	}
181 
182 	// Override generic view methods
183 	@PreDestroy
184 	public void dispose() {
185 		userAdminWrapper.removeListener(listener);
186 	}
187 
188 	@Focus
189 	public void setFocus() {
190 		userTableViewerCmp.setFocus();
191 	}
192 
193 	/* DEPENDENCY INJECTION */
194 	public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
195 		this.userAdminWrapper = userAdminWrapper;
196 	}
197 }