]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ui.workbench/src/org/argeo/cms/ui/workbench/internal/useradmin/parts/UserEditor.java
Fix regressions
[lgpl/argeo-commons.git] / org.argeo.cms.ui.workbench / src / org / argeo / cms / ui / workbench / internal / useradmin / parts / UserEditor.java
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 (!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 }