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