Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / parts / UserMainPage.java
index d732e7e7fbdccc96f5d7b406d948a281b4ee8b14..db6eb538fe059635393edfa3781e20bb4055c917 100644 (file)
@@ -19,14 +19,15 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.util.useradmin.UserAdminUtils;
 import org.argeo.eclipse.ui.ColumnDefinition;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.parts.LdifUsersTable;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.osgi.useradmin.LdifName;
 import org.argeo.security.ui.admin.SecurityAdminImages;
-import org.argeo.security.ui.admin.internal.UiAdminUtils;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.parts.UserEditor.GroupChangeListener;
 import org.argeo.security.ui.admin.internal.parts.UserEditor.MainInfoListener;
@@ -54,9 +55,12 @@ import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Cursor;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
@@ -95,18 +99,19 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                ScrolledForm form = mf.getForm();
                Composite body = form.getBody();
                GridLayout mainLayout = new GridLayout();
+               // mainLayout.marginRight = 10;
                body.setLayout(mainLayout);
                User user = editor.getDisplayedUser();
                appendOverviewPart(body, user);
                // Remove to ability to force the password for his own user. The user
                // must then use the change pwd feature
-               if (!UiAdminUtils.isCurrentUser(user))
+               if (!UserAdminUtils.isCurrentUser(user))
                        appendPasswordPart(body, user);
                appendMemberOfPart(body, user);
        }
 
        /** Creates the general section */
-       private void appendOverviewPart(Composite parent, final User user) {
+       private void appendOverviewPart(final Composite parent, final User user) {
                FormToolkit tk = getManagedForm().getToolkit();
 
                Section section = addSection(tk, parent, "Main information");
@@ -114,21 +119,21 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                body.setLayout(new GridLayout(2, false));
 
                final Text distinguishedName = createLT(tk, body, "User Name",
-                               UiAdminUtils.getProperty(user, LdifName.uid.name()));
+                               UserAdminUtils.getProperty(user, LdifName.uid.name()));
                distinguishedName.setEnabled(false);
 
                final Text commonName = createLT(tk, body, "Common Name",
-                               UiAdminUtils.getProperty(user, LdifName.cn.name()));
+                               UserAdminUtils.getProperty(user, LdifName.cn.name()));
                commonName.setEnabled(false);
 
                final Text firstName = createLT(tk, body, "First name",
-                               UiAdminUtils.getProperty(user, LdifName.givenname.name()));
+                               UserAdminUtils.getProperty(user, LdifName.givenName.name()));
 
                final Text lastName = createLT(tk, body, "Last name",
-                               UiAdminUtils.getProperty(user, LdifName.sn.name()));
+                               UserAdminUtils.getProperty(user, LdifName.sn.name()));
 
                final Text email = createLT(tk, body, "Email",
-                               UiAdminUtils.getProperty(user, LdifName.mail.name()));
+                               UserAdminUtils.getProperty(user, LdifName.mail.name()));
 
                // create form part (controller)
                AbstractFormPart part = new SectionPart((Section) body.getParent()) {
@@ -137,7 +142,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new MainInfoListener(this);
+                               listener = editor.new MainInfoListener(parent.getDisplay(),
+                                               this);
                                userAdminWrapper.addListener(listener);
                        }
 
@@ -150,30 +156,28 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @SuppressWarnings("unchecked")
                        public void commit(boolean onSave) {
                                // TODO Sanity checks (mail validity...)
-                               user.getProperties().put(LdifName.givenname.name(),
+                               user.getProperties().put(LdifName.givenName.name(),
                                                firstName.getText());
                                user.getProperties()
                                                .put(LdifName.sn.name(), lastName.getText());
                                user.getProperties().put(LdifName.cn.name(),
                                                commonName.getText());
                                user.getProperties().put(LdifName.mail.name(), email.getText());
-                               // Enable common name ?
-                               // editor.setProperty(UserAdminConstants.KEY_CN,
-                               // email.getText());
                                super.commit(onSave);
                        }
 
                        @Override
                        public void refresh() {
-                               distinguishedName.setText(UiAdminUtils.getProperty(user,
+                               distinguishedName.setText(UserAdminUtils.getProperty(user,
                                                LdifName.uid.name()));
-                               commonName.setText(UiAdminUtils.getProperty(user,
+                               commonName.setText(UserAdminUtils.getProperty(user,
                                                LdifName.cn.name()));
-                               firstName.setText(UiAdminUtils.getProperty(user,
-                                               LdifName.givenname.name()));
-                               lastName.setText(UiAdminUtils.getProperty(user,
+                               firstName.setText(UserAdminUtils.getProperty(user,
+                                               LdifName.givenName.name()));
+                               lastName.setText(UserAdminUtils.getProperty(user,
                                                LdifName.sn.name()));
-                               email.setText(LdifName.mail.name());
+                               email.setText(UserAdminUtils.getProperty(user,
+                                               LdifName.mail.name()));
                                refreshFormTitle(user);
                                super.refresh();
                        }
@@ -224,7 +228,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                                                || !password2.getText().equals("")) {
                                        if (password1.getText().equals(password2.getText())) {
                                                char[] newPassword = password1.getText().toCharArray();
-                                               userAdminWrapper.beginTransactionIfNeeded();
+                                               // userAdminWrapper.beginTransactionIfNeeded();
                                                user.getCredentials().put(null, newPassword);
                                                password1.setText("");
                                                password2.setText("");
@@ -232,7 +236,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                                        } else {
                                                password1.setText("");
                                                password2.setText("");
-                                               throw new ArgeoException("Passwords are not equals");
+                                               throw new CmsException("Passwords are not equals");
                                        }
                                }
                        }
@@ -243,28 +247,35 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                getManagedForm().addPart(part);
        }
 
-       private LdifUsersTable appendMemberOfPart(Composite parent, User user) {
+       private LdifUsersTable appendMemberOfPart(final Composite parent, User user) {
                FormToolkit tk = getManagedForm().getToolkit();
                Section section = addSection(tk, parent, "Roles");
                Composite body = (Composite) section.getClient();
                body.setLayout(EclipseUiUtils.noSpaceGridLayout());
 
+               boolean isAdmin = UserAdminUtils.isUserInRole(AuthConstants.ROLE_ADMIN);
+
                // Displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
                columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain Name",
-                               120));
-               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 300));
+                               200));
+               // Only show technical DN to administrators
+               if (isAdmin)
+                       columnDefs.add(new ColumnDefinition(new UserNameLP(),
+                                       "Distinguished Name", 120));
 
                // Create and configure the table
                final LdifUsersTable userViewerCmp = new MyUserTableViewer(body,
                                SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL, user);
 
                userViewerCmp.setColumnDefinitions(columnDefs);
-               userViewerCmp.populate(true, false);
+               if (isAdmin)
+                       userViewerCmp.populateWithStaticFilters(false, false);
+               else
+                       userViewerCmp.populate(true, false);
                GridData gd = EclipseUiUtils.fillAll();
                gd.heightHint = 300;
                userViewerCmp.setLayoutData(gd);
@@ -285,7 +296,8 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @Override
                        public void initialize(IManagedForm form) {
                                super.initialize(form);
-                               listener = editor.new GroupChangeListener(this);
+                               listener = editor.new GroupChangeListener(parent.getDisplay(),
+                                               this);
                                userAdminWrapper.addListener(listener);
                        }
 
@@ -311,7 +323,9 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        }
 
        private class MyUserTableViewer extends LdifUsersTable {
-               private static final long serialVersionUID = 8467999509931900367L;
+               private static final long serialVersionUID = 2653790051461237329L;
+
+               private Button showSystemRoleBtn;
 
                private final User user;
                private final UserFilter userFilter;
@@ -320,6 +334,23 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        super(parent, style, true);
                        this.user = user;
                        userFilter = new UserFilter();
+                       userFilter.setShowSystemRole(false);
+               }
+
+               protected void populateStaticFilters(Composite staticFilterCmp) {
+                       staticFilterCmp.setLayout(new GridLayout());
+                       showSystemRoleBtn = new Button(staticFilterCmp, SWT.CHECK);
+                       showSystemRoleBtn.setText("Show system roles");
+                       showSystemRoleBtn.addSelectionListener(new SelectionAdapter() {
+                               private static final long serialVersionUID = -7033424592697691676L;
+
+                               @Override
+                               public void widgetSelected(SelectionEvent e) {
+                                       userFilter.setShowSystemRole(showSystemRoleBtn
+                                                       .getSelection());
+                                       refresh();
+                               }
+                       });
                }
 
                @Override
@@ -354,7 +385,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        }
                });
 
-               String tooltip = "Remove " + UiAdminUtils.getUsername(user)
+               String tooltip = "Remove " + UserAdminUtils.getUsername(user)
                                + " from the below selected groups";
                Action action = new RemoveMembershipAction(userViewer, user, tooltip,
                                SecurityAdminImages.ICON_REMOVE_DESC);
@@ -385,25 +416,17 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        @SuppressWarnings("unchecked")
                        Iterator<Group> it = ((IStructuredSelection) selection).iterator();
                        List<Group> groups = new ArrayList<Group>();
-                       // StringBuilder builder = new StringBuilder();
                        while (it.hasNext()) {
                                Group currGroup = it.next();
-                               // String groupName = UiAdminUtils.getUsername(currGroup);
-                               // builder.append(groupName).append("; ");
                                groups.add(currGroup);
                        }
 
-                       // if (!MessageDialog.openQuestion(
-                       // HandlerUtil.getActiveShell(event),
-                       // "Re",
-                       // "Are you sure that you want to delete these users?\n"
-                       // + builder.substring(0, builder.length() - 2)))
-                       // return null;
-
                        userAdminWrapper.beginTransactionIfNeeded();
                        for (Group group : groups) {
                                group.removeMember(user);
-                               // sectionPart.refresh();
+                       }
+                       userAdminWrapper.commitOrNotifyTransactionStateChange();
+                       for (Group group : groups) {
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                                UserAdminEvent.ROLE_CHANGED, group));
                        }
@@ -444,9 +467,11 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                        // TODO this check should be done before.
                        if (role.getType() == Role.GROUP) {
                                // TODO check if the user is already member of this group
+
                                myUserAdminWrapper.beginTransactionIfNeeded();
                                Group group = (Group) role;
                                group.addMember(myUser);
+                               userAdminWrapper.commitOrNotifyTransactionStateChange();
                                myUserAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                                UserAdminEvent.ROLE_CHANGED, group));
                        }
@@ -463,7 +488,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        // LOCAL HELPERS
        private void refreshFormTitle(User group) {
                getManagedForm().getForm().setText(
-                               UiAdminUtils.getProperty(group, LdifName.cn.name()));
+                               UserAdminUtils.getProperty(group, LdifName.cn.name()));
        }
 
        /** Appends a section with a title */