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