Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / parts / GroupsView.java
index 0f4d12ccfef357f317325b2d95704f2656682141..82f4e1bdd8f27a0f6f1713f159d85e68910846ed 100644 (file)
@@ -18,15 +18,19 @@ package org.argeo.security.ui.admin.internal.parts;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.argeo.ArgeoException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+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.SecurityAdminPlugin;
-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.UiUserAdminListener;
 import org.argeo.security.ui.admin.internal.UserAdminWrapper;
-import org.argeo.security.ui.admin.internal.UserTableViewer;
 import org.argeo.security.ui.admin.internal.providers.CommonNameLP;
 import org.argeo.security.ui.admin.internal.providers.DomainNameLP;
 import org.argeo.security.ui.admin.internal.providers.RoleIconLP;
@@ -38,17 +42,22 @@ import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.TextTransfer;
 import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.part.ViewPart;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
-import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.service.useradmin.UserAdminEvent;
 import org.osgi.service.useradmin.UserAdminListener;
 
 /** List all groups with filter */
 public class GroupsView extends ViewPart implements ArgeoNames {
+       private final static Log log = LogFactory.getLog(GroupsView.class);
        public final static String ID = SecurityAdminPlugin.PLUGIN_ID
                        + ".groupsView";
 
@@ -56,7 +65,7 @@ public class GroupsView extends ViewPart implements ArgeoNames {
        private UserAdminWrapper userAdminWrapper;
 
        // UI Objects
-       private UserTableViewer groupTableViewerCmp;
+       private LdifUsersTable groupTableViewerCmp;
        private TableViewer userViewer;
        private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
 
@@ -65,20 +74,29 @@ public class GroupsView extends ViewPart implements ArgeoNames {
        @Override
        public void createPartControl(Composite parent) {
                parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+
+               boolean isAdmin = UserAdminUtils.isUserInRole(AuthConstants.ROLE_ADMIN);
+
                // Define the displayed columns
                columnDefs.add(new ColumnDefinition(new RoleIconLP(), "", 26));
                columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
                                150));
-               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 120));
-               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 300));
+               columnDefs.add(new ColumnDefinition(new DomainNameLP(), "Domain", 200));
+               // Only show technical DN to admin
+               if (isAdmin)
+                       columnDefs.add(new ColumnDefinition(new UserNameLP(),
+                                       "Distinguished Name", 300));
 
                // Create and configure the table
                groupTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
-                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin());
+                               | SWT.H_SCROLL | SWT.V_SCROLL);
 
                groupTableViewerCmp.setColumnDefinitions(columnDefs);
-               groupTableViewerCmp.populate(true, false);
+               if (isAdmin)
+                       groupTableViewerCmp.populateWithStaticFilters(false, false);
+               else
+                       groupTableViewerCmp.populate(true, false);
+
                groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
 
                // Links
@@ -95,26 +113,61 @@ public class GroupsView extends ViewPart implements ArgeoNames {
                userViewer.addDragSupport(operations, tt, new UserDragListener(
                                userViewer));
 
+               // // Register a useradmin listener
+               // listener = new UserAdminListener() {
+               // @Override
+               // public void roleChanged(UserAdminEvent event) {
+               // if (userViewer != null && !userViewer.getTable().isDisposed())
+               // refresh();
+               // }
+               // };
+               // userAdminWrapper.addListener(listener);
+               // }
+
                // Register a useradmin listener
-               listener = new UserAdminListener() {
-                       @Override
-                       public void roleChanged(UserAdminEvent event) {
-                               if (userViewer != null && !userViewer.getTable().isDisposed())
-                                       refresh();
-                       }
-               };
+               listener = new MyUiUAListener(parent.getDisplay());
                userAdminWrapper.addListener(listener);
        }
 
-       private class MyUserTableViewer extends UserTableViewer {
+       private class MyUiUAListener extends UiUserAdminListener {
+               public MyUiUAListener(Display display) {
+                       super(display);
+               }
+
+               @Override
+               public void roleChangedToUiThread(UserAdminEvent event) {
+                       if (userViewer != null && !userViewer.getTable().isDisposed())
+                               refresh();
+               }
+       }
+
+       private class MyUserTableViewer extends LdifUsersTable {
                private static final long serialVersionUID = 8467999509931900367L;
 
-               private final String[] knownProps = { UserAdminConstants.KEY_UID,
-                               UserAdminConstants.KEY_CN, UserAdminConstants.KEY_DN };
+               private boolean showSystemRoles = false;
 
-               public MyUserTableViewer(Composite parent, int style,
-                               UserAdmin userAdmin) {
-                       super(parent, style, userAdmin);
+               private final String[] knownProps = { LdifName.uid.name(),
+                               LdifName.cn.name(), LdifName.dn.name() };
+
+               public MyUserTableViewer(Composite parent, int style) {
+                       super(parent, style);
+               }
+
+               protected void populateStaticFilters(Composite staticFilterCmp) {
+                       staticFilterCmp.setLayout(new GridLayout());
+                       final Button 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) {
+                                       showSystemRoles = showSystemRoleBtn.getSelection();
+                                       refresh();
+                               }
+
+                       });
                }
 
                @Override
@@ -123,7 +176,7 @@ public class GroupsView extends ViewPart implements ArgeoNames {
                        try {
                                StringBuilder builder = new StringBuilder();
                                StringBuilder tmpBuilder = new StringBuilder();
-                               if (UiAdminUtils.notNull(filter))
+                               if (EclipseUiUtils.notEmpty(filter))
                                        for (String prop : knownProps) {
                                                tmpBuilder.append("(");
                                                tmpBuilder.append(prop);
@@ -132,21 +185,47 @@ public class GroupsView extends ViewPart implements ArgeoNames {
                                                tmpBuilder.append("*)");
                                        }
                                if (tmpBuilder.length() > 1) {
-                                       builder.append("(&(objectclass=groupOfNames)(|");
+                                       builder.append("(&(").append(LdifName.objectClass.name())
+                                                       .append("=").append(LdifName.groupOfNames.name())
+                                                       .append(")");
+                                       if (!showSystemRoles)
+                                               builder.append("(!(").append(LdifName.dn.name())
+                                                               .append("=*")
+                                                               .append(AuthConstants.ROLES_BASEDN)
+                                                               .append("))");
+                                       builder.append("(|");
                                        builder.append(tmpBuilder.toString());
                                        builder.append("))");
-                               } else
-                                       builder.append("(objectclass=groupOfNames)");
+                               } else {
+                                       if (!showSystemRoles)
+                                               builder.append("(&(")
+                                                               .append(LdifName.objectClass.name())
+                                                               .append("=")
+                                                               .append(LdifName.groupOfNames.name())
+                                                               .append(")(!(").append(LdifName.dn.name())
+                                                               .append("=*")
+                                                               .append(AuthConstants.ROLES_BASEDN)
+                                                               .append(")))");
+                                       else
+                                               builder.append("(").append(LdifName.objectClass.name())
+                                                               .append("=")
+                                                               .append(LdifName.groupOfNames.name())
+                                                               .append(")");
+
+                               }
                                roles = userAdminWrapper.getUserAdmin().getRoles(
                                                builder.toString());
                        } catch (InvalidSyntaxException e) {
-                               throw new ArgeoException("Unable to get roles with filter: "
+                               throw new CmsException("Unable to get roles with filter: "
                                                + filter, e);
                        }
                        List<User> users = new ArrayList<User>();
                        for (Role role : roles)
-                               // if (role.getType() == Role.GROUP)
-                               users.add((User) role);
+                               if (!users.contains(role))
+                                       users.add((User) role);
+                               else
+                                       log.warn("Duplicated role: " + role);
+
                        return users;
                }
        }