2 * Copyright (C) 2007-2012 Argeo GmbH
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.argeo
.security
.ui
.admin
.internal
.parts
;
18 import java
.util
.ArrayList
;
19 import java
.util
.Arrays
;
20 import java
.util
.List
;
22 import org
.argeo
.ArgeoException
;
23 import org
.argeo
.eclipse
.ui
.EclipseUiUtils
;
24 import org
.argeo
.jcr
.ArgeoNames
;
25 import org
.argeo
.security
.ui
.admin
.internal
.ColumnDefinition
;
26 import org
.argeo
.security
.ui
.admin
.internal
.UserAdminConstants
;
27 import org
.argeo
.security
.ui
.admin
.internal
.UserAdminWrapper
;
28 import org
.argeo
.security
.ui
.admin
.internal
.UserTableViewer
;
29 import org
.argeo
.security
.ui
.admin
.internal
.providers
.CommonNameLP
;
30 import org
.argeo
.security
.ui
.admin
.internal
.providers
.RoleIconLP
;
31 import org
.argeo
.security
.ui
.admin
.internal
.providers
.UserNameLP
;
32 import org
.argeo
.security
.ui
.admin
.internal
.providers
.UserTableDefaultDClickListener
;
33 import org
.eclipse
.jface
.viewers
.TableViewer
;
34 import org
.eclipse
.jface
.viewers
.Viewer
;
35 import org
.eclipse
.jface
.viewers
.ViewerDropAdapter
;
36 import org
.eclipse
.swt
.SWT
;
37 import org
.eclipse
.swt
.dnd
.DND
;
38 import org
.eclipse
.swt
.dnd
.DropTargetEvent
;
39 import org
.eclipse
.swt
.dnd
.TextTransfer
;
40 import org
.eclipse
.swt
.dnd
.Transfer
;
41 import org
.eclipse
.swt
.dnd
.TransferData
;
42 import org
.eclipse
.swt
.events
.ModifyEvent
;
43 import org
.eclipse
.swt
.events
.ModifyListener
;
44 import org
.eclipse
.swt
.layout
.GridData
;
45 import org
.eclipse
.swt
.layout
.GridLayout
;
46 import org
.eclipse
.swt
.widgets
.Composite
;
47 import org
.eclipse
.swt
.widgets
.Label
;
48 import org
.eclipse
.swt
.widgets
.Text
;
49 import org
.eclipse
.ui
.forms
.AbstractFormPart
;
50 import org
.eclipse
.ui
.forms
.IManagedForm
;
51 import org
.eclipse
.ui
.forms
.SectionPart
;
52 import org
.eclipse
.ui
.forms
.editor
.FormEditor
;
53 import org
.eclipse
.ui
.forms
.editor
.FormPage
;
54 import org
.eclipse
.ui
.forms
.widgets
.FormToolkit
;
55 import org
.eclipse
.ui
.forms
.widgets
.ScrolledForm
;
56 import org
.eclipse
.ui
.forms
.widgets
.Section
;
57 import org
.osgi
.service
.useradmin
.Group
;
58 import org
.osgi
.service
.useradmin
.Role
;
59 import org
.osgi
.service
.useradmin
.User
;
60 import org
.osgi
.service
.useradmin
.UserAdmin
;
61 import org
.osgi
.service
.useradmin
.UserAdminEvent
;
63 /** Display/edit the properties common to all users */
64 public class UserMainPage
extends FormPage
implements ArgeoNames
{
65 final static String ID
= "argeoUserEditor.mainPage";
67 // private final static Log log = LogFactory.getLog(UserMainPage.class);
69 private final UserEditor editor
;
70 private UserAdminWrapper userAdminWrapper
;
72 private char[] newPassword
;
74 // Local configuration
75 private final int PRE_TITLE_INDENT
= 10;
77 public UserMainPage(FormEditor editor
, UserAdminWrapper userAdminWrapper
) {
78 super(editor
, ID
, "Main");
79 this.editor
= (UserEditor
) editor
;
80 this.userAdminWrapper
= userAdminWrapper
;
83 public String
getNewPassword() {
84 if (newPassword
!= null)
85 return new String(newPassword
);
90 public void resetNewPassword() {
91 if (newPassword
!= null)
92 Arrays
.fill(newPassword
, 'x');
96 protected void createFormContent(final IManagedForm mf
) {
97 ScrolledForm form
= mf
.getForm();
98 // Form page main title
99 form
.setText(editor
.getProperty(UserAdminConstants
.KEY_CN
));
102 Composite body
= form
.getBody();
103 GridLayout mainLayout
= new GridLayout(1, true);
104 body
.setLayout(mainLayout
);
105 appendOverviewPart(body
);
106 appendPasswordPart(body
);
107 appendMemberOfPart(body
);
110 /** Creates the general section */
111 protected void appendOverviewPart(Composite parent
) {
112 FormToolkit tk
= getManagedForm().getToolkit();
113 Composite body
= addSection(tk
, parent
, "Main information");
114 body
.setLayout(new GridLayout(2, false));
116 Text distinguishedName
= createLT(body
, "User Name",
117 editor
.getProperty(UserAdminConstants
.KEY_UID
));
118 distinguishedName
.setEnabled(false);
120 final Text commonName
= createLT(body
, "Common Name",
121 editor
.getProperty(UserAdminConstants
.KEY_CN
));
122 commonName
.setEnabled(false);
124 final Text firstName
= createLT(body
, "First name",
125 editor
.getProperty(UserAdminConstants
.KEY_FIRSTNAME
));
127 final Text lastName
= createLT(body
, "Last name",
128 editor
.getProperty(UserAdminConstants
.KEY_LASTNAME
));
130 final Text email
= createLT(body
, "Email",
131 editor
.getProperty(UserAdminConstants
.KEY_MAIL
));
133 // create form part (controller)
134 AbstractFormPart part
= new SectionPart((Section
) body
.getParent()) {
135 public void commit(boolean onSave
) {
136 // TODO check changed ?
137 // TODO Sanity checks
139 editor
.setProperty(UserAdminConstants
.KEY_FIRSTNAME
,
140 firstName
.getText());
141 editor
.setProperty(UserAdminConstants
.KEY_LASTNAME
,
143 editor
.setProperty(UserAdminConstants
.KEY_CN
,
144 commonName
.getText());
145 // TODO check mail validity
146 editor
.setProperty(UserAdminConstants
.KEY_MAIL
, email
.getText());
148 // Enable common name ?
149 // editor.setProperty(UserAdminConstants.KEY_CN,
151 super.commit(onSave
);
155 ModifyListener cnML
= new ModifyListener() {
156 private static final long serialVersionUID
= 4298649222869835486L;
159 public void modifyText(ModifyEvent event
) {
160 String first
= firstName
.getText();
161 String last
= lastName
.getText();
162 String cn
= first
.trim() + " " + last
.trim() + " ";
164 commonName
.setText(cn
);
165 getManagedForm().getForm().setText(cn
);
166 editor
.updateEditorTitle(cn
);
169 firstName
.addModifyListener(cnML
);
170 lastName
.addModifyListener(cnML
);
171 firstName
.addModifyListener(new FormPartML(part
));
172 lastName
.addModifyListener(new FormPartML(part
));
173 email
.addModifyListener(new FormPartML(part
));
174 getManagedForm().addPart(part
);
177 /** Creates the password section */
178 protected void appendPasswordPart(Composite parent
) {
179 FormToolkit tk
= getManagedForm().getToolkit();
180 Composite body
= addSection(tk
, parent
, "Password");
182 // Section section = tk.createSection(parent, Section.TITLE_BAR);
183 // section.setLayoutData(EclipseUiUtils.fillWidth());
184 // section.setText("Password");
185 // Composite body = tk.createComposite(section, SWT.NO_FOCUS);
186 // section.setClient(body);
187 // body.setLayoutData(EclipseUiUtils.fillWidth());
189 body
.setLayout(new GridLayout(2, false));
190 // add widgets (view)
191 final Text password1
= createLP(body
, "New password", "");
192 final Text password2
= createLP(body
, "Repeat password", "");
193 // create form part (controller)
194 AbstractFormPart part
= new SectionPart((Section
) body
.getParent()) {
196 public void commit(boolean onSave
) {
197 if (!password1
.getText().equals("")
198 || !password2
.getText().equals("")) {
199 if (password1
.getText().equals(password2
.getText())) {
200 newPassword
= password1
.getText().toCharArray();
201 // TODO real set password
202 password1
.setText("");
203 password2
.setText("");
204 super.commit(onSave
);
206 password1
.setText("");
207 password2
.setText("");
208 throw new ArgeoException("Passwords are not equals");
214 password1
.addModifyListener(new FormPartML(part
));
215 password2
.addModifyListener(new FormPartML(part
));
216 getManagedForm().addPart(part
);
219 private UserTableViewer userTableViewerCmp
;
220 private TableViewer userViewer
;
222 private void appendMemberOfPart(Composite parent
) {
223 FormToolkit tk
= getManagedForm().getToolkit();
224 Composite body
= addSection(tk
, parent
, "Roles");
225 body
.setLayout(EclipseUiUtils
.noSpaceGridLayout());
227 // Define the displayed columns
228 List
<ColumnDefinition
> columnDefs
= new ArrayList
<ColumnDefinition
>();
229 columnDefs
.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
230 columnDefs
.add(new ColumnDefinition(new UserNameLP(),
231 "Distinguished Name", 300));
232 columnDefs
.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
235 // Create and configure the table
236 userTableViewerCmp
= new MyUserTableViewer(body
, SWT
.MULTI
237 | SWT
.H_SCROLL
| SWT
.V_SCROLL
, userAdminWrapper
.getUserAdmin());
239 userTableViewerCmp
.setColumnDefinitions(columnDefs
);
240 userTableViewerCmp
.populate(true, false);
241 GridData gd
= EclipseUiUtils
.fillAll();
243 userTableViewerCmp
.setLayoutData(gd
);
246 userViewer
= userTableViewerCmp
.getTableViewer();
247 userViewer
.addDoubleClickListener(new UserTableDefaultDClickListener());
249 userTableViewerCmp
.refresh();
252 int operations
= DND
.DROP_COPY
| DND
.DROP_MOVE
;
253 Transfer
[] tt
= new Transfer
[] { TextTransfer
.getInstance() };
254 userViewer
.addDropSupport(operations
, tt
, new GroupDropListener(
255 userViewer
, userAdminWrapper
.getUserAdmin(), editor
.getDisplayedUser()));
259 private class MyUserTableViewer
extends UserTableViewer
{
260 private static final long serialVersionUID
= 8467999509931900367L;
262 public MyUserTableViewer(Composite parent
, int style
,
263 UserAdmin userAdmin
) {
264 super(parent
, style
, userAdmin
, true);
268 protected List
<User
> listFilteredElements(String filter
) {
269 return (List
<User
>) editor
.getFlatGroups(null);
274 * Defines this table as being a potential target to add group membership
275 * (roles) to this user
277 private class GroupDropListener
extends ViewerDropAdapter
{
278 private static final long serialVersionUID
= 2893468717831451621L;
280 private final UserAdmin myUserAdmin
;
281 private final User myUser
;
283 public GroupDropListener(Viewer viewer
, UserAdmin userAdmin
, User user
) {
285 this.myUserAdmin
= userAdmin
;
290 public boolean validateDrop(Object target
, int operation
,
291 TransferData transferType
) {
292 // Target is always OK in a list only view
293 // TODO check if not a string
294 boolean validDrop
= true;
299 public void drop(DropTargetEvent event
) {
300 String name
= (String
) event
.data
;
301 Role role
= myUserAdmin
.getRole(name
);
302 // TODO this check should be done before.
303 if (role
.getType() == Role
.GROUP
) {
304 // TODO check if the user is already member of this group
305 userAdminWrapper
.beginTransactionIfNeeded();
306 Group group
= (Group
) role
;
307 group
.addMember(myUser
);
308 userAdminWrapper
.notifyListeners(new UserAdminEvent(null,
309 UserAdminEvent
.ROLE_CHANGED
, group
));
315 public boolean performDrop(Object data
) {
316 userTableViewerCmp
.refresh();
322 /** Appends a section with a title */
323 private Composite
addSection(FormToolkit tk
, Composite parent
, String title
) {
324 Section section
= tk
.createSection(parent
, Section
.TITLE_BAR
);
325 GridData gd
= EclipseUiUtils
.fillWidth();
326 gd
.verticalAlignment
= PRE_TITLE_INDENT
;
327 section
.setLayoutData(gd
);
328 section
.setText(title
);
329 Composite body
= tk
.createComposite(section
, SWT
.WRAP
);
330 body
.setLayoutData(EclipseUiUtils
.fillAll());
331 section
.setClient(body
);
335 /** Creates label and multiline text. */
336 protected Text
createLMT(Composite body
, String label
, String value
) {
337 FormToolkit toolkit
= getManagedForm().getToolkit();
338 Label lbl
= toolkit
.createLabel(body
, label
);
339 lbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false));
340 Text text
= toolkit
.createText(body
, value
, SWT
.BORDER
| SWT
.MULTI
);
341 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, true));
345 /** Creates label and password. */
346 protected Text
createLP(Composite body
, String label
, String value
) {
347 FormToolkit toolkit
= getManagedForm().getToolkit();
348 Label lbl
= toolkit
.createLabel(body
, label
);
349 lbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false));
350 Text text
= toolkit
.createText(body
, value
, SWT
.BORDER
| SWT
.PASSWORD
);
351 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
355 /** Creates label and text. */
356 protected Text
createLT(Composite body
, String label
, String value
) {
357 FormToolkit toolkit
= getManagedForm().getToolkit();
358 Label lbl
= toolkit
.createLabel(body
, label
);
359 lbl
.setLayoutData(new GridData(SWT
.RIGHT
, SWT
.CENTER
, false, false));
360 Text text
= toolkit
.createText(body
, value
, SWT
.BORDER
);
361 text
.setLayoutData(new GridData(SWT
.FILL
, SWT
.CENTER
, true, false));
365 private class FormPartML
implements ModifyListener
{
366 private static final long serialVersionUID
= 6299808129505381333L;
367 private AbstractFormPart formPart
;
369 public FormPartML(AbstractFormPart generalPart
) {
370 this.formPart
= generalPart
;
373 public void modifyText(ModifyEvent e
) {
374 formPart
.markDirty();