]> 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 5270e1463ef2a30c5515fac03a22528aee84a4a8..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;
@@ -100,18 +104,17 @@ 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 dnTxt = createLT(body, "DN",
-                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_DN));
+               final Text dnTxt = createLT(body, "DN", group.getName());
                dnTxt.setEnabled(false);
 
                final Text cnTxt = createLT(body, "Common Name",
-                               UiAdminUtils.getProperty(group, UserAdminConstants.KEY_CN));
+                               UserAdminUtils.getProperty(group, LdifName.cn.name()));
                cnTxt.setEnabled(false);
 
                Label descLbl = new Label(body, SWT.LEAD);
@@ -131,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);
                        }
 
@@ -143,7 +147,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                        @SuppressWarnings("unchecked")
                        public void commit(boolean onSave) {
-                               group.getProperties().put(UserAdminConstants.KEY_DESC,
+                               group.getProperties().put(LdifName.description.name(),
                                                descTxt.getText());
                                // Enable common name ?
                                // editor.setProperty(UserAdminConstants.KEY_CN,
@@ -155,11 +159,10 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                        public void refresh() {
                                refreshFormTitle(group);
                                dnTxt.setText(group.getName());
-                               cnTxt.setText(UiAdminUtils.getProperty(group,
-                                               UserAdminConstants.KEY_CN));
-                               descTxt.setText(UiAdminUtils.getProperty(group,
-                                               UserAdminConstants.KEY_DESC));
-
+                               cnTxt.setText(UserAdminUtils.getProperty(group,
+                                               LdifName.cn.name()));
+                               descTxt.setText(UserAdminUtils.getProperty(group,
+                                               LdifName.description.name()));
                                super.refresh();
                        }
                };
@@ -176,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));
@@ -202,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);
@@ -222,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
@@ -236,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;
                }
        }
@@ -291,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);
                        }
 
@@ -303,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));
                }
@@ -310,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;
@@ -325,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);
                }
 
@@ -340,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();
                }
@@ -355,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;
@@ -377,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
@@ -418,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));
                        }
@@ -438,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) {