]> 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
Improve Javadoc
[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(), user);
72 userAdminWrapper.addListener(listener);
73 updateEditorTitle(null);
74 }
75
76 /**
77 * returns the list of all authorization for the given user or of the
78 * current 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 void updateEditorTitle(String title) {
104 if (title == null) {
105 String commonName = UserAdminUtils.getProperty(user, LdapAttrs.cn.name());
106 title = "".equals(commonName) ? user.getName() : commonName;
107 }
108 setPartName(title);
109 }
110
111 protected void addPages() {
112 try {
113 if (user.getType() == Role.GROUP)
114 addPage(new GroupMainPage(this, userAdminWrapper, repository, nodeInstance));
115 else
116 addPage(new UserMainPage(this, userAdminWrapper));
117 } catch (Exception e) {
118 throw new CmsException("Cannot add pages", e);
119 }
120 }
121
122 @Override
123 public void doSave(IProgressMonitor monitor) {
124 userAdminWrapper.beginTransactionIfNeeded();
125 commitPages(true);
126 userAdminWrapper.commitOrNotifyTransactionStateChange();
127 firePropertyChange(PROP_DIRTY);
128 userAdminWrapper.notifyListeners(new UserAdminEvent(null, UserAdminEvent.ROLE_REMOVED, user));
129 }
130
131 @Override
132 public void doSaveAs() {
133 }
134
135 @Override
136 public boolean isSaveAsAllowed() {
137 return false;
138 }
139
140 @Override
141 public void dispose() {
142 userAdminWrapper.removeListener(listener);
143 super.dispose();
144 }
145
146 // CONTROLERS FOR THIS EDITOR AND ITS PAGES
147
148 private class NameChangeListener extends UiUserAdminListener {
149
150 private final User user;
151
152 public NameChangeListener(Display display, User user) {
153 super(display);
154 this.user = user;
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 }
163 }
164
165 class MainInfoListener extends UiUserAdminListener {
166 private final AbstractFormPart part;
167
168 public MainInfoListener(Display display, AbstractFormPart part) {
169 super(display);
170 this.part = part;
171 }
172
173 @Override
174 public void roleChangedToUiThread(UserAdminEvent event) {
175 // Rollback
176 if (event.getRole() == null)
177 part.markStale();
178 }
179 }
180
181 class GroupChangeListener extends UiUserAdminListener {
182 private final AbstractFormPart part;
183
184 public GroupChangeListener(Display display, AbstractFormPart part) {
185 super(display);
186 this.part = part;
187 }
188
189 @Override
190 public void roleChangedToUiThread(UserAdminEvent event) {
191 // always mark as stale
192 part.markStale();
193 }
194 }
195
196 /** Registers a listener that will notify this part */
197 class FormPartML implements ModifyListener {
198 private static final long serialVersionUID = 6299808129505381333L;
199 private AbstractFormPart formPart;
200
201 public FormPartML(AbstractFormPart generalPart) {
202 this.formPart = generalPart;
203 }
204
205 public void modifyText(ModifyEvent e) {
206 // Discard event when the control does not have the focus, typically
207 // to avoid all editors being marked as dirty during a Rollback
208 if (((Control) e.widget).isFocusControl())
209 formPart.markDirty();
210 }
211 }
212
213 /* DEPENDENCY INJECTION */
214 public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
215 this.userAdminWrapper = userAdminWrapper;
216 }
217
218 public void setRepository(Repository repository) {
219 this.repository = repository;
220 }
221
222 public void setNodeInstance(NodeInstance nodeInstance) {
223 this.nodeInstance = nodeInstance;
224 }
225
226 }