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