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 javax.jcr.Repository;
22  
23  import org.argeo.cms.CmsException;
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.util.UserAdminUtils;
28  import org.argeo.naming.LdapAttrs;
29  import org.argeo.node.NodeInstance;
30  import org.eclipse.core.runtime.IProgressMonitor;
31  import org.eclipse.swt.events.ModifyEvent;
32  import org.eclipse.swt.events.ModifyListener;
33  import org.eclipse.swt.widgets.Control;
34  import org.eclipse.swt.widgets.Display;
35  import org.eclipse.ui.IEditorInput;
36  import org.eclipse.ui.IEditorSite;
37  import org.eclipse.ui.PartInitException;
38  import org.eclipse.ui.forms.AbstractFormPart;
39  import org.eclipse.ui.forms.editor.FormEditor;
40  import org.osgi.service.useradmin.Authorization;
41  import org.osgi.service.useradmin.Role;
42  import org.osgi.service.useradmin.User;
43  import org.osgi.service.useradmin.UserAdmin;
44  import org.osgi.service.useradmin.UserAdminEvent;
45  
46  /** Editor for a user, might be a user or a group. */
47  public class UserEditor extends FormEditor {
48  	private static final long serialVersionUID = 8357851520380820241L;
49  
50  	public final static String USER_EDITOR_ID = WorkbenchUiPlugin.PLUGIN_ID + ".userEditor";
51  	public final static String GROUP_EDITOR_ID = WorkbenchUiPlugin.PLUGIN_ID + ".groupEditor";
52  
53  	/* DEPENDENCY INJECTION */
54  	private Repository repository;
55  	private UserAdminWrapper userAdminWrapper;
56  	private UserAdmin userAdmin;
57  	private NodeInstance nodeInstance;
58  
59  	// Context
60  	private User user;
61  	private String username;
62  
63  	private NameChangeListener listener;
64  
65  	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
66  		super.init(site, input);
67  		this.userAdmin = userAdminWrapper.getUserAdmin();
68  		username = ((UserEditorInput) getEditorInput()).getUsername();
69  		user = (User) userAdmin.getRole(username);
70  
71  		listener = new NameChangeListener(site.getShell().getDisplay());
72  		userAdminWrapper.addListener(listener);
73  		updateEditorTitle(null);
74  	}
75  
76  	/**
77  	 * returns the list of all authorization for the given user or of the current
78  	 * displayed user if parameter is null
79  	 */
80  	protected List<User> getFlatGroups(User aUser) {
81  		Authorization currAuth;
82  		if (aUser == null)
83  			currAuth = userAdmin.getAuthorization(this.user);
84  		else
85  			currAuth = userAdmin.getAuthorization(aUser);
86  
87  		String[] roles = currAuth.getRoles();
88  
89  		List<User> groups = new ArrayList<User>();
90  		for (String roleStr : roles) {
91  			User currRole = (User) userAdmin.getRole(roleStr);
92  			if (currRole != null && !groups.contains(currRole))
93  				groups.add(currRole);
94  		}
95  		return groups;
96  	}
97  
98  	/** Exposes the user (or group) that is displayed by the current editor */
99  	protected User getDisplayedUser() {
100 		return user;
101 	}
102 
103 	private void setDisplayedUser(User user) {
104 		this.user = user;
105 	}
106 
107 	void updateEditorTitle(String title) {
108 		if (title == null) {
109 			String commonName = UserAdminUtils.getProperty(user, LdapAttrs.cn.name());
110 			title = "".equals(commonName) ? user.getName() : commonName;
111 		}
112 		setPartName(title);
113 	}
114 
115 	protected void addPages() {
116 		try {
117 			if (user.getType() == Role.GROUP)
118 				addPage(new GroupMainPage(this, userAdminWrapper, repository, nodeInstance));
119 			else
120 				addPage(new UserMainPage(this, userAdminWrapper));
121 		} catch (Exception e) {
122 			throw new CmsException("Cannot add pages", e);
123 		}
124 	}
125 
126 	@Override
127 	public void doSave(IProgressMonitor monitor) {
128 		userAdminWrapper.beginTransactionIfNeeded();
129 		commitPages(true);
130 		userAdminWrapper.commitOrNotifyTransactionStateChange();
131 		firePropertyChange(PROP_DIRTY);
132 		userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_REMOVED, user));
133 	}
134 
135 	@Override
136 	public void doSaveAs() {
137 	}
138 
139 	@Override
140 	public boolean isSaveAsAllowed() {
141 		return false;
142 	}
143 
144 	@Override
145 	public void dispose() {
146 		userAdminWrapper.removeListener(listener);
147 		super.dispose();
148 	}
149 
150 	// CONTROLERS FOR THIS EDITOR AND ITS PAGES
151 
152 	private class NameChangeListener extends UiUserAdminListener {
153 		public NameChangeListener(Display display) {
154 			super(display);
155 		}
156 
157 		@Override
158 		public void roleChangedToUiThread(UserAdminEvent event) {
159 			Role changedRole = event.getRole();
160 			if (changedRole == null || changedRole.equals(user)) {
161 				updateEditorTitle(null);
162 				User reloadedUser = (User) userAdminWrapper.getUserAdmin().getRole(user.getName());
163 				setDisplayedUser(reloadedUser);
164 			}
165 		}
166 	}
167 
168 	class MainInfoListener extends UiUserAdminListener {
169 		private final AbstractFormPart part;
170 
171 		public MainInfoListener(Display display, AbstractFormPart part) {
172 			super(display);
173 			this.part = part;
174 		}
175 
176 		@Override
177 		public void roleChangedToUiThread(UserAdminEvent event) {
178 			// Rollback
179 			if (event.getRole() == null)
180 				part.markStale();
181 		}
182 	}
183 
184 	class GroupChangeListener extends UiUserAdminListener {
185 		private final AbstractFormPart part;
186 
187 		public GroupChangeListener(Display display, AbstractFormPart part) {
188 			super(display);
189 			this.part = part;
190 		}
191 
192 		@Override
193 		public void roleChangedToUiThread(UserAdminEvent event) {
194 			// always mark as stale
195 			part.markStale();
196 		}
197 	}
198 
199 	/** Registers a listener that will notify this part */
200 	class FormPartML implements ModifyListener {
201 		private static final long serialVersionUID = 6299808129505381333L;
202 		private AbstractFormPart formPart;
203 
204 		public FormPartML(AbstractFormPart generalPart) {
205 			this.formPart = generalPart;
206 		}
207 
208 		public void modifyText(ModifyEvent e) {
209 			// Discard event when the control does not have the focus, typically
210 			// to avoid all editors being marked as dirty during a Rollback
211 			if (((Control) e.widget).isFocusControl())
212 				formPart.markDirty();
213 		}
214 	}
215 
216 	/* DEPENDENCY INJECTION */
217 	public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
218 		this.userAdminWrapper = userAdminWrapper;
219 	}
220 
221 	public void setRepository(Repository repository) {
222 		this.repository = repository;
223 	}
224 
225 	public void setNodeInstance(NodeInstance nodeInstance) {
226 		this.nodeInstance = nodeInstance;
227 	}
228 
229 }