]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupMainPage.java
Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / parts / GroupMainPage.java
index f3fdabfb19ccf16650e664280ef4963686aca5b7..fe56679db3e6c2b70982e8ad406f49393c98b444 100644 (file)
@@ -19,19 +19,23 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import javax.transaction.UserTransaction;
+
+import org.argeo.cms.CmsException;
+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.ColumnDefinition;
-import org.argeo.security.ui.admin.internal.UiAdminUtils;
-import org.argeo.security.ui.admin.internal.UserAdminConstants;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
-import org.argeo.security.ui.admin.internal.UserTableViewer;
 import org.argeo.security.ui.admin.internal.parts.UserEditor.GroupChangeListener;
 import org.argeo.security.ui.admin.internal.parts.UserEditor.MainInfoListener;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
 import org.argeo.security.ui.admin.internal.providers.MailLP;
 import org.argeo.security.ui.admin.internal.providers.RoleIconLP;
+import org.argeo.security.ui.admin.internal.providers.UserFilter;
 import org.argeo.security.ui.admin.internal.providers.UserNameLP;
 import org.argeo.security.ui.admin.internal.providers.UserTableDefaultDClickListener;
 import org.eclipse.jface.action.Action;
@@ -50,6 +54,7 @@ import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.swt.dnd.TransferData;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.graphics.Cursor;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
@@ -99,19 +104,27 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        }
 
        /** Creates the general section */
-       protected void appendOverviewPart(Composite parent, final Group group) {
+       protected void appendOverviewPart(final Composite parent, final Group group) {
                FormToolkit tk = getManagedForm().getToolkit();
                Composite body = addSection(tk, parent, "Main information");
                GridLayout layout = new GridLayout(2, false);
                body.setLayout(layout);
 
-               final Text distinguishedName = createLT(body, "Group Name",
-                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_UID));
-               distinguishedName.setEnabled(false);
+               final Text dnTxt = createLT(body, "DN", group.getName());
+               dnTxt.setEnabled(false);
+
+               final Text cnTxt = createLT(body, "Common Name",
+                               UserAdminUtils.getProperty(group, LdifName.cn.name()));
+               cnTxt.setEnabled(false);
 
-               final Text commonName = createLT(body, "Common Name",
-                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_CN));
-               commonName.setEnabled(false);
+               Label descLbl = new Label(body, SWT.LEAD);
+               descLbl.setText("Description");
+               descLbl.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, false));
+               final Text descTxt = new Text(body, SWT.LEAD | SWT.MULTI | SWT.WRAP
+                               | SWT.BORDER);
+               GridData gd = EclipseUiUtils.fillAll();
+               gd.heightHint = 100;
+               descTxt.setLayoutData(gd);
 
                // create form part (controller)
                AbstractFormPart part = new SectionPart((Section) body.getParent()) {
@@ -121,7 +134,8 @@ public class GroupMainPage 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);
                        }
 
@@ -131,16 +145,30 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                                super.dispose();
                        }
 
+                       @SuppressWarnings("unchecked")
+                       public void commit(boolean onSave) {
+                               group.getProperties().put(LdifName.description.name(),
+                                               descTxt.getText());
+                               // Enable common name ?
+                               // editor.setProperty(UserAdminConstants.KEY_CN,
+                               // email.getText());
+                               super.commit(onSave);
+                       }
+
                        @Override
                        public void refresh() {
                                refreshFormTitle(group);
-                               distinguishedName.setText(UiAdminUtils.getProperty(group,
-                                               UserAdminConstants.KEY_UID));
-                               commonName.setText(UiAdminUtils.getProperty(group,
-                                               UserAdminConstants.KEY_CN));
+                               dnTxt.setText(group.getName());
+                               cnTxt.setText(UserAdminUtils.getProperty(group,
+                                               LdifName.cn.name()));
+                               descTxt.setText(UserAdminUtils.getProperty(group,
+                                               LdifName.description.name()));
                                super.refresh();
                        }
                };
+
+               ModifyListener defaultListener = editor.new FormPartML(part);
+               descTxt.addModifyListener(defaultListener);
                getManagedForm().addPart(part);
        }
 
@@ -151,22 +179,21 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                Section section = tk.createSection(parent, Section.TITLE_BAR);
                section.setLayoutData(EclipseUiUtils.fillAll());
 
-               // Composite body = tk.createComposite(section, SWT.NONE);
                Composite body = new Composite(section, SWT.NO_FOCUS);
                section.setClient(body);
                body.setLayoutData(EclipseUiUtils.fillAll());
 
-               UserTableViewer userTableViewerCmp = createMemberPart(body, group);
+               LdifUsersTable userTableViewerCmp = createMemberPart(body, group);
 
-               // create form part (controller)
                SectionPart part = new GroupMembersPart(section, userTableViewerCmp,
                                group);
                getManagedForm().addPart(part);
                addRemoveAbitily(part, userTableViewerCmp.getTableViewer(), group);
        }
 
-       public UserTableViewer createMemberPart(Composite parent, Group group) {
+       public LdifUsersTable createMemberPart(Composite parent, Group group) {
                parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+
                // Define the displayed columns
                List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 0, 24));
@@ -177,7 +204,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                                "Distinguished Name", 240));
 
                // Create and configure the table
-               UserTableViewer userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
+               LdifUsersTable userViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
                                | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin());
 
                userViewerCmp.setColumnDefinitions(columnDefs);
@@ -197,13 +224,16 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        }
 
        // Local viewers
-
-       private class MyUserTableViewer extends UserTableViewer {
+       private class MyUserTableViewer extends LdifUsersTable {
                private static final long serialVersionUID = 8467999509931900367L;
 
+               private final UserFilter userFilter;
+
                public MyUserTableViewer(Composite parent, int style,
                                UserAdmin userAdmin) {
-                       super(parent, style, userAdmin, true);
+                       super(parent, style, true);
+                       userFilter = new UserFilter();
+
                }
 
                @Override
@@ -211,9 +241,11 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        Group group = (Group) editor.getDisplayedUser();
                        Role[] roles = group.getMembers();
                        List<User> users = new ArrayList<User>();
+                       userFilter.setSearchText(filter);
                        for (Role role : roles)
                                // if (role.getType() == Role.GROUP)
-                               users.add((User) role);
+                               if (userFilter.select(null, null, role))
+                                       users.add((User) role);
                        return users;
                }
        }
@@ -266,11 +298,8 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        @SuppressWarnings("unchecked")
                        Iterator<User> it = ((IStructuredSelection) selection).iterator();
                        List<User> users = new ArrayList<User>();
-                       // StringBuilder builder = new StringBuilder();
                        while (it.hasNext()) {
                                User currUser = it.next();
-                               // String groupName = UiAdminUtils.getUsername(currGroup);
-                               // builder.append(groupName).append("; ");
                                users.add(currUser);
                        }
 
@@ -278,6 +307,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        for (User user : users) {
                                group.removeMember(user);
                        }
+                       userAdminWrapper.commitOrNotifyTransactionStateChange();
                        userAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                        UserAdminEvent.ROLE_CHANGED, group));
                }
@@ -285,12 +315,12 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
        // LOCAL CONTROLLERS
        private class GroupMembersPart extends SectionPart {
-               private final UserTableViewer userViewer;
+               private final LdifUsersTable userViewer;
                private final Group group;
 
                private GroupChangeListener listener;
 
-               public GroupMembersPart(Section section, UserTableViewer userViewer,
+               public GroupMembersPart(Section section, LdifUsersTable userViewer,
                                Group group) {
                        super(section);
                        this.userViewer = userViewer;
@@ -300,7 +330,8 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                @Override
                public void initialize(IManagedForm form) {
                        super.initialize(form);
-                       listener = editor.new GroupChangeListener(GroupMembersPart.this);
+                       listener = editor.new GroupChangeListener(userViewer.getDisplay(),
+                                       GroupMembersPart.this);
                        userAdminWrapper.addListener(listener);
                }
 
@@ -315,8 +346,8 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        refreshFormTitle(group);
                        getSection().setText(
                                        "Members of group "
-                                                       + UiAdminUtils.getProperty(group,
-                                                                       UserAdminConstants.KEY_CN));
+                                                       + UserAdminUtils.getProperty(group,
+                                                                       LdifName.cn.name()));
                        userViewer.refresh();
                        super.refresh();
                }
@@ -330,11 +361,11 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                private static final long serialVersionUID = 2893468717831451621L;
 
                private final UserAdminWrapper userAdminWrapper;
-               // private final UserTableViewer myUserViewerCmp;
+               // private final LdifUsersTable myUserViewerCmp;
                private final Group myGroup;
 
                public GroupDropListener(UserAdminWrapper userAdminWrapper,
-                               UserTableViewer userTableViewerCmp, Group group) {
+                               LdifUsersTable userTableViewerCmp, Group group) {
                        super(userTableViewerCmp.getTableViewer());
                        this.userAdminWrapper = userAdminWrapper;
                        this.myGroup = group;
@@ -352,21 +383,13 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                @Override
                public void drop(DropTargetEvent event) {
-                       // TODO Is there an opportunity to perform ceck before?
+                       // TODO Is there an opportunity to perform the check before?
 
                        String newUserName = (String) event.data;
                        UserAdmin myUserAdmin = userAdminWrapper.getUserAdmin();
                        Role role = myUserAdmin.getRole(newUserName);
-                       if (role.getType() == Role.USER) {
-                               // TODO check if the group is already member of this group
-                               userAdminWrapper.beginTransactionIfNeeded();
-                               User user = (User) role;
-                               myGroup.addMember(user);
-                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
-                                               UserAdminEvent.ROLE_CHANGED, myGroup));
-                       } else if (role.getType() == Role.GROUP) {
+                       if (role.getType() == Role.GROUP) {
                                Group newGroup = (Group) role;
-
                                Shell shell = getViewer().getControl().getShell();
                                // Sanity checks
                                if (myGroup == newGroup) { // Equality
@@ -393,10 +416,24 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                                                                        + ", this membership already exists");
                                        return;
                                }
-
                                userAdminWrapper.beginTransactionIfNeeded();
-                               // TODO implement the dirty state
                                myGroup.addMember(newGroup);
+                               userAdminWrapper.commitOrNotifyTransactionStateChange();
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                               UserAdminEvent.ROLE_CHANGED, myGroup));
+                       } else if (role.getType() == Role.USER) {
+                               // TODO check if the group is already member of this group
+                               UserTransaction transaction = userAdminWrapper
+                                               .beginTransactionIfNeeded();
+                               User user = (User) role;
+                               myGroup.addMember(user);
+                               if (UserAdminWrapper.COMMIT_ON_SAVE)
+                                       try {
+                                               transaction.commit();
+                                       } catch (Exception e) {
+                                               throw new CmsException("Cannot commit transaction "
+                                                               + "after user group membership update", e);
+                                       }
                                userAdminWrapper.notifyListeners(new UserAdminEvent(null,
                                                UserAdminEvent.ROLE_CHANGED, myGroup));
                        }
@@ -413,7 +450,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        // LOCAL HELPERS
        private void refreshFormTitle(Group group) {
                getManagedForm().getForm().setText(
-                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_CN));
+                               UserAdminUtils.getProperty(group, LdifName.cn.name()));
        }
 
        private Composite addSection(FormToolkit tk, Composite parent, String title) {