Introduce a UserAdmin wrapper service
authorBruno Sinou <bsinou@argeo.org>
Wed, 16 Sep 2015 23:10:31 +0000 (23:10 +0000)
committerBruno Sinou <bsinou@argeo.org>
Wed, 16 Sep 2015 23:10:31 +0000 (23:10 +0000)
Implement base listener mechanism
Some code cleaning and refactoring

git-svn-id: https://svn.argeo.org/commons/trunk@8413 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

22 files changed:
org.argeo.security.ui.admin/META-INF/spring/commands.xml
org.argeo.security.ui.admin/META-INF/spring/common.xml
org.argeo.security.ui.admin/META-INF/spring/editors.xml [deleted file]
org.argeo.security.ui.admin/META-INF/spring/parts.xml [new file with mode: 0644]
org.argeo.security.ui.admin/META-INF/spring/views.xml [deleted file]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteGroups.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteUsers.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/ForceRefresh.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewGroup.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/UserTransactionHandler.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminWrapper.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java [new file with mode: 0644]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java [deleted file]
org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java [deleted file]

index 6ce0496c669938313d01396ae7f03f801bf666be..412355054ed6caf628214fd87dbde4260be57c09 100644 (file)
@@ -7,41 +7,30 @@
        <!-- USERS & GROUPS CRUDS -->
        <bean id="newUser" class="org.argeo.security.ui.admin.commands.NewUser"
                scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-               <property name="userTransaction" ref="userTransaction" />
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
 
        <bean id="newGroup" class="org.argeo.security.ui.admin.commands.NewGroup"
                scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-               <property name="userTransaction" ref="userTransaction" />
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
        <bean id="deleteUsers" class="org.argeo.security.ui.admin.commands.DeleteUsers"
                scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-               <property name="userTransaction" ref="userTransaction" />
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
        <bean id="deleteGroups" class="org.argeo.security.ui.admin.commands.DeleteGroups"
                scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-               <property name="userTransaction" ref="userTransaction" />
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
 
        <!-- <bean id="userBatchUpdate" class="org.argeo.security.ui.admin.commands.UserBatchUpdate" 
                scope="prototype"> <property name="repository" ref="nodeRepository" /> <property 
                name="userAdminService" ref="userAdminService" /> </bean> -->
-       <!-- ROLES -->
-       <!-- <bean id="refreshRoles" class="org.argeo.security.ui.admin.commands.RefreshRoles" 
-               scope="prototype"> </bean> <bean id="addRole" class="org.argeo.security.ui.admin.commands.AddRole" 
-               scope="prototype"> <property name="userAdminService" ref="userAdminService" 
-               /> </bean> <bean id="deleteRole" class="org.argeo.security.ui.admin.commands.DeleteRole" 
-               scope="prototype"> <property name="userAdminService" ref="userAdminService" 
-               /> </bean> -->
 
        <!-- TRANSACTIONS -->
        <bean id="userTransactionHandler"
                class="org.argeo.security.ui.admin.commands.UserTransactionHandler"
                scope="prototype">
-               <property name="userTransaction" ref="userTransaction" />
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
        </bean>
 </beans>
index 5cf10913b84ae8ed6922a2fd9d778efd0aee6ed9..bcb039da657770c528b94ac86a66ce39c1b9ada8 100644 (file)
                <property name="userTransaction" ref="userTransaction" />\r
        </bean>\r
 \r
+       <bean id="userAdminWrapper"\r
+               class="org.argeo.security.ui.admin.internal.UserAdminWrapper"\r
+               scope="singleton" lazy-init="false">\r
+               <property name="userTransaction" ref="userTransaction" />\r
+               <property name="userAdmin" ref="userAdmin" />\r
+       </bean>\r
+\r
        <bean\r
                class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">\r
                <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />\r
diff --git a/org.argeo.security.ui.admin/META-INF/spring/editors.xml b/org.argeo.security.ui.admin/META-INF/spring/editors.xml
deleted file mode 100644 (file)
index e9cf5ac..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-        http://www.springframework.org/schema/beans/spring-beans.xsd">
-
-
-       <!-- Editors -->
-       <bean id="userEditor" class="org.argeo.security.ui.admin.editors.UserEditor"
-               scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-               <property name="userTransaction" ref="userTransaction" />
-       </bean>
-
-       <!-- <bean id="groupEditor" class="org.argeo.security.ui.admin.editors.GroupEditor" 
-               scope="prototype"> <property name="userAdmin" ref="userAdmin" /> </bean> -->
-       <!-- LEGACY -->
-</beans>
diff --git a/org.argeo.security.ui.admin/META-INF/spring/parts.xml b/org.argeo.security.ui.admin/META-INF/spring/parts.xml
new file mode 100644 (file)
index 0000000..d680910
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+
+       <!-- Editors -->
+       <bean id="userEditor" class="org.argeo.security.ui.admin.editors.UserEditor"
+               scope="prototype">
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
+       </bean>
+
+       <!-- Views -->
+       <bean id="usersView" class="org.argeo.security.ui.admin.internal.parts.UsersView"
+               scope="prototype">
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
+       </bean>
+       <bean id="groupsView" class="org.argeo.security.ui.admin.internal.parts.GroupsView"
+               scope="prototype">
+               <property name="userAdminWrapper" ref="userAdminWrapper" />
+       </bean>
+       
+</beans>
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/META-INF/spring/views.xml b/org.argeo.security.ui.admin/META-INF/spring/views.xml
deleted file mode 100644 (file)
index 0af9b37..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans
-        http://www.springframework.org/schema/beans/spring-beans.xsd">
-
-       <bean id="usersView" class="org.argeo.security.ui.admin.views.UsersView"
-               scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-       </bean>
-
-       <bean id="groupsView" class="org.argeo.security.ui.admin.views.GroupsView"
-               scope="prototype">
-               <property name="userAdmin" ref="userAdmin" />
-       </bean>
-</beans>
index 7b340d64347720731e623847157931b724d6f29c..a296961ea933ad45ec3914f010258c75a43beb13 100644 (file)
@@ -15,8 +15,8 @@
  */
 package org.argeo.security.ui.admin;
 
-import org.argeo.security.ui.admin.views.GroupsView;
-import org.argeo.security.ui.admin.views.UsersView;
+import org.argeo.security.ui.admin.internal.parts.GroupsView;
+import org.argeo.security.ui.admin.internal.parts.UsersView;
 import org.eclipse.ui.IFolderLayout;
 import org.eclipse.ui.IPageLayout;
 import org.eclipse.ui.IPerspectiveFactory;
index 8d72a5891ebcca82a422fa65a08aa6d15ca416cb..2add11bc4b7f026f1400b39a3cb0914aead4ffa5 100644 (file)
  */
 package org.argeo.security.ui.admin.commands;
 
+import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.transaction.UserTransaction;
+import java.util.List;
 
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.internal.UiAdminUtils;
-import org.argeo.security.ui.admin.internal.UserAdminConstants;
-import org.argeo.security.ui.admin.views.GroupsView;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Deletes the selected groups */
 public class DeleteGroups extends AbstractHandler {
@@ -45,8 +39,7 @@ public class DeleteGroups extends AbstractHandler {
                        + ".deleteGroups";
 
        /* DEPENDENCY INJECTION */
-       private UserAdmin userAdmin;
-       private UserTransaction userTransaction;
+       private UserAdminWrapper userAdminWrapper;
 
        @SuppressWarnings("unchecked")
        public Object execute(ExecutionEvent event) throws ExecutionException {
@@ -54,52 +47,35 @@ public class DeleteGroups extends AbstractHandler {
                if (selection.isEmpty())
                        return null;
 
-               Map<String, String> toDelete = new TreeMap<String, String>();
-               // List<String> names = new ArrayList<String>();
+               List<Group> groups = new ArrayList<Group>();
                Iterator<Group> it = ((IStructuredSelection) selection).iterator();
+               StringBuilder builder = new StringBuilder();
                while (it.hasNext()) {
                        Group currGroup = it.next();
-                       String groupName = UiAdminUtils.getProperty(currGroup,
-                                       UserAdminConstants.KEY_CN);
+                       String groupName = UiAdminUtils.getUsername(currGroup);
                        // TODO add checks
-                       toDelete.put(groupName, currGroup.getName());
+                       builder.append(groupName).append("; ");
+                       groups.add(currGroup);
                }
 
-               if (!MessageDialog
-                               .openQuestion(
-                                               HandlerUtil.getActiveShell(event),
-                                               "Delete Groups",
-                                               "Are you sure that you want to delete groups "
-                                                               + toDelete.keySet()
-                                                               + "?\n"
-                                                               + "This might lead to inconsistencies in the application."))
+               if (!MessageDialog.openQuestion(HandlerUtil.getActiveShell(event),
+                               "Delete Groups",
+                               "Are you sure that you " + "want to delete these groups?\n"
+                                               + builder.substring(0, builder.length() - 2)))
                        return null;
 
-               UiAdminUtils.beginTransactionIfNeeded(userTransaction);
-               for (String name : toDelete.values())
-                       userAdmin.removeRole(name);
-
-               // TODO rather notify the update listener
-               forceRefresh(event);
+               userAdminWrapper.beginTransactionIfNeeded();
+               UserAdmin userAdmin = userAdminWrapper.getUserAdmin();
+               for (Group group : groups) {
+                       userAdmin.removeRole(group.getName());
+                       userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                       UserAdminEvent.ROLE_REMOVED, group));
+               }
                return null;
        }
 
-       private void forceRefresh(ExecutionEvent event) {
-               IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
-               if (iww == null)
-                       return;
-               IWorkbenchPage activePage = iww.getActivePage();
-               IWorkbenchPart part = activePage.getActivePart();
-               if (part instanceof GroupsView)
-                       ((GroupsView) part).refresh();
-       }
-
        /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
-       }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
        }
 }
\ No newline at end of file
index 554e90aff3421da52c565bb7d6a96e8866897e22..6a9da4b8d34e166b8f7dbaf8cec842189e2df41b 100644 (file)
  */
 package org.argeo.security.ui.admin.commands;
 
+import java.util.ArrayList;
 import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.transaction.UserTransaction;
+import java.util.List;
 
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.internal.UiAdminUtils;
-import org.argeo.security.ui.admin.views.UsersView;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Deletes the selected users */
 public class DeleteUsers extends AbstractHandler {
@@ -43,8 +39,7 @@ public class DeleteUsers extends AbstractHandler {
                        + ".deleteUsers";
 
        /* DEPENDENCY INJECTION */
-       private UserAdmin userAdmin;
-       private UserTransaction userTransaction;
+       private UserAdminWrapper userAdminWrapper;
 
        @SuppressWarnings("unchecked")
        public Object execute(ExecutionEvent event) throws ExecutionException {
@@ -52,56 +47,42 @@ public class DeleteUsers extends AbstractHandler {
                if (selection.isEmpty())
                        return null;
 
-               Map<String, String> toDelete = new TreeMap<String, String>();
-               // Map<String, User> toDelete = new TreeMap<String, User>();
                Iterator<User> it = ((IStructuredSelection) selection).iterator();
-               users: while (it.hasNext()) {
+               List<User> users = new ArrayList<User>();
+               StringBuilder builder = new StringBuilder();
+
+               while (it.hasNext()) {
                        User currUser = it.next();
                        String userName = UiAdminUtils.getUsername(currUser);
-                       // TODO check not deleting own user
-                       // if (userName.equals(profileNode.getSession().getUserID())) {
-                       // log.warn("Cannot delete its own user: " + userName);
-                       // continue nodes;
-                       // }
-                       toDelete.put(userName, currUser.getName());
+                       if (UiAdminUtils.isCurrentUser(currUser)) {
+                               MessageDialog.openError(HandlerUtil.getActiveShell(event),
+                                               "Deletion forbidden",
+                                               "You cannot delete your own user this way.");
+                               return null;
+                       }
+                       builder.append(userName).append("; ");
+                       users.add(currUser);
                }
 
-               if (!MessageDialog
-                               .openQuestion(
-                                               HandlerUtil.getActiveShell(event),
-                                               "Delete Users",
-                                               "Are you sure that you want to delete users "
-                                                               + toDelete.keySet()
-                                                               + "?\n"
-                                                               + "This might lead to inconsistencies in the application."))
+               if (!MessageDialog.openQuestion(
+                               HandlerUtil.getActiveShell(event),
+                               "Delete Users",
+                               "Are you sure that you want to delete these users?\n"
+                                               + builder.substring(0, builder.length() - 2)))
                        return null;
 
-               UiAdminUtils.beginTransactionIfNeeded(userTransaction);
-               for (String name : toDelete.values()) {
-                       userAdmin.removeRole(name);
+               userAdminWrapper.beginTransactionIfNeeded();
+               UserAdmin userAdmin = userAdminWrapper.getUserAdmin();
+               for (User user : users) {
+                       userAdmin.removeRole(user.getName());
+                       userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                       UserAdminEvent.ROLE_REMOVED, user));
                }
-
-               // TODO rather notify the update listener
-               forceRefresh(event);
                return null;
        }
 
-       private void forceRefresh(ExecutionEvent event) {
-               IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
-               if (iww == null)
-                       return;
-               IWorkbenchPage activePage = iww.getActivePage();
-               IWorkbenchPart part = activePage.getActivePart();
-               if (part instanceof UsersView)
-                       ((UsersView) part).refresh();
-       }
-
        /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
-       }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
        }
 }
\ No newline at end of file
index 189e785634ec12f21b6fc4159588e33eca01df18..7d0f8266f57a9ded465a5f5e798fb359a1621434 100644 (file)
@@ -15,8 +15,8 @@
  */
 package org.argeo.security.ui.admin.commands;
 
-import org.argeo.security.ui.admin.views.GroupsView;
-import org.argeo.security.ui.admin.views.UsersView;
+import org.argeo.security.ui.admin.internal.parts.GroupsView;
+import org.argeo.security.ui.admin.internal.parts.UsersView;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
index d797c5d748fae47b1c09b59a63009acc0c259466..d752bd1b2d0e8dd553330699c4ad2847a6ae34e1 100644 (file)
@@ -17,19 +17,16 @@ package org.argeo.security.ui.admin.commands;
 
 import java.util.Dictionary;
 
-import javax.transaction.UserTransaction;
-
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.argeo.jcr.ArgeoNames;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.internal.UiAdminUtils;
 import org.argeo.security.ui.admin.internal.UserAdminConstants;
-import org.argeo.security.ui.admin.views.GroupsView;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.jface.wizard.WizardPage;
@@ -41,20 +38,19 @@ import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Create a new group. */
 public class NewGroup extends AbstractHandler {
        public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newGroup";
 
+       /* DEPENDENCY INJECTION */
+       private UserAdminWrapper userAdminWrapper;
        private UserAdmin userAdmin;
-       private UserTransaction userTransaction;
 
        // TODO implement a dynamic choice of the base dn
        private String getDn(String cn) {
@@ -66,23 +62,10 @@ public class NewGroup extends AbstractHandler {
                WizardDialog dialog = new WizardDialog(
                                HandlerUtil.getActiveShell(event), newGroupWizard);
                dialog.setTitle("Create a new group");
-
-               // Force refresh until the listener are implemented
-               if (Window.OK == dialog.open())
-                       forceRefresh(event);
+               dialog.open();
                return null;
        }
 
-       private void forceRefresh(ExecutionEvent event) {
-               IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
-               if (iww == null)
-                       return;
-               IWorkbenchPage activePage = iww.getActivePage();
-               IWorkbenchPart part = activePage.getActivePart();
-               if (part instanceof GroupsView)
-                       ((GroupsView) part).refresh();
-       }
-
        private class NewGroupWizard extends Wizard {
 
                // pages
@@ -110,13 +93,15 @@ public class NewGroup extends AbstractHandler {
                                return false;
                        String commonName = commonNameTxt.getText();
                        try {
-                               UiAdminUtils.beginTransactionIfNeeded(userTransaction);
-                               Group user = (Group) userAdmin.createRole(getDn(commonName),
+                               userAdminWrapper.beginTransactionIfNeeded();
+                               Group group = (Group) userAdmin.createRole(getDn(commonName),
                                                Role.GROUP);
-                               Dictionary props = user.getProperties();
+                               Dictionary props = group.getProperties();
                                String descStr = descriptionTxt.getText();
                                if (UiAdminUtils.notNull(descStr))
                                        props.put(UserAdminConstants.KEY_DESC, descStr);
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                               UserAdminEvent.ROLE_CREATED, group));
                                return true;
                        } catch (Exception e) {
                                ErrorFeedback.show("Cannot create new group " + commonName, e);
@@ -208,11 +193,8 @@ public class NewGroup extends AbstractHandler {
        }
 
        /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
-       }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
+               this.userAdmin = userAdminWrapper.getUserAdmin();
        }
 }
\ No newline at end of file
index 0154f03bdef9592db4c4ed87b4540f06111b2249..443fe079c16e0c11d71c20f5f4add70657341d83 100644 (file)
@@ -17,8 +17,6 @@ package org.argeo.security.ui.admin.commands;
 
 import java.util.Dictionary;
 
-import javax.transaction.UserTransaction;
-
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.argeo.jcr.ArgeoNames;
@@ -26,11 +24,10 @@ import org.argeo.security.UserAdminService;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.internal.UiAdminUtils;
 import org.argeo.security.ui.admin.internal.UserAdminConstants;
-import org.argeo.security.ui.admin.views.UsersView;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.window.Window;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
 import org.eclipse.jface.wizard.WizardPage;
@@ -40,13 +37,10 @@ import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.handlers.HandlerUtil;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
-import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Open a wizard that enables creation of a new user. */
 public class NewUser extends AbstractHandler {
@@ -54,8 +48,7 @@ public class NewUser extends AbstractHandler {
        public final static String ID = SecurityAdminPlugin.PLUGIN_ID + ".newUser";
 
        /* DEPENDENCY INJECTION */
-       private UserAdmin userAdmin;
-       private UserTransaction userTransaction;
+       private UserAdminWrapper userAdminWrapper;
 
        // TODO implement a dynamic choice of the base dn
        private String getDn(String uid) {
@@ -67,21 +60,23 @@ public class NewUser extends AbstractHandler {
                WizardDialog dialog = new WizardDialog(
                                HandlerUtil.getActiveShell(event), newUserWizard);
 
-               // Force refresh until the listener are implemented
-               if (Window.OK == dialog.open())
-                       forceRefresh(event);
+               dialog.open();
+
+               // // Force refresh until the listener are implemented
+               // if (Window.OK == dialog.open())
+               // forceRefresh(event);
                return null;
        }
 
-       private void forceRefresh(ExecutionEvent event) {
-               IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
-               if (iww == null)
-                       return;
-               IWorkbenchPage activePage = iww.getActivePage();
-               IWorkbenchPart part = activePage.getActivePart();
-               if (part instanceof UsersView)
-                       ((UsersView) part).refresh();
-       }
+       // private void forceRefresh(ExecutionEvent event) {
+       // IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
+       // if (iww == null)
+       // return;
+       // IWorkbenchPage activePage = iww.getActivePage();
+       // IWorkbenchPart part = activePage.getActivePart();
+       // if (part instanceof UsersView)
+       // ((UsersView) part).refresh();
+       // }
 
        private class NewUserWizard extends Wizard {
 
@@ -111,10 +106,10 @@ public class NewUser extends AbstractHandler {
                                return false;
                        String username = mainUserInfo.getUsername();
                        try {
-                               UiAdminUtils.beginTransactionIfNeeded(userTransaction);
+                               userAdminWrapper.beginTransactionIfNeeded();
                                char[] password = mainUserInfo.getPassword();
-                               User user = (User) userAdmin.createRole(getDn(username),
-                                               Role.USER);
+                               User user = (User) userAdminWrapper.getUserAdmin().createRole(
+                                               getDn(username), Role.USER);
 
                                Dictionary props = user.getProperties();
 
@@ -136,6 +131,9 @@ public class NewUser extends AbstractHandler {
                                        props.put(UserAdminConstants.KEY_MAIL, mailStr);
 
                                user.getCredentials().put(null, password);
+
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                               UserAdminEvent.ROLE_CREATED, user));
                                return true;
                        } catch (Exception e) {
                                ErrorFeedback.show("Cannot create new user " + username, e);
@@ -219,7 +217,8 @@ public class NewUser extends AbstractHandler {
 
                                if (name.trim().equals(""))
                                        return "User name must not be empty";
-                               Role role = userAdmin.getRole(getDn(name));
+                               Role role = userAdminWrapper.getUserAdmin()
+                                               .getRole(getDn(name));
                                if (role != null)
                                        return "User " + name + " already exists";
                                if (!primaryMailTxt.getText().matches(
@@ -255,11 +254,7 @@ public class NewUser extends AbstractHandler {
        }
 
        /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
-       }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
        }
 }
\ No newline at end of file
index 0a94d1a7d0d8351fb452b3e2874cede0a2e852ab..aa07040f5ac49b8d0e9c0b82d5b5191ee193c7b8 100644 (file)
@@ -21,9 +21,11 @@ import javax.transaction.UserTransaction;
 import org.argeo.ArgeoException;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
 import org.argeo.security.ui.admin.internal.UiAdminUtils;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Manage the transaction that is bound to the current perspective */
 public class UserTransactionHandler extends AbstractHandler {
@@ -36,11 +38,12 @@ public class UserTransactionHandler extends AbstractHandler {
        public final static String TRANSACTION_COMMIT = "transaction.commit";
        public final static String TRANSACTION_ROLLBACK = "transaction.rollback";
 
-       private UserTransaction userTransaction;
+       /* DEPENDENCY INJECTION */
+       private UserAdminWrapper userAdminWrapper;
 
        public Object execute(ExecutionEvent event) throws ExecutionException {
-
                String commandId = event.getParameter(PARAM_COMMAND_ID);
+               UserTransaction userTransaction = userAdminWrapper.getUserTransaction();
                try {
                        if (TRANSACTION_BEGIN.equals(commandId)) {
                                if (userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION)
@@ -55,8 +58,11 @@ public class UserTransactionHandler extends AbstractHandler {
                        } else if (TRANSACTION_ROLLBACK.equals(commandId)) {
                                if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
                                        throw new ArgeoException("No transaction to rollback.");
-                               else
+                               else {
                                        userTransaction.rollback();
+                                       userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                                       UserAdminEvent.ROLE_CHANGED, null));
+                               }
                        }
                        UiAdminUtils.notifyTransactionStateChange(userTransaction);
                } catch (ArgeoException e) {
@@ -65,20 +71,11 @@ public class UserTransactionHandler extends AbstractHandler {
                        throw new ArgeoException("Unable to call " + commandId + " on "
                                        + userTransaction, e);
                }
-               //
-               // IWorkbenchWindow iww = HandlerUtil.getActiveWorkbenchWindow(event);
-               // if (iww == null)
-               // return null;
-               // IWorkbenchPage activePage = iww.getActivePage();
-               // IWorkbenchPart part = activePage.getActivePart();
-               // if (part instanceof UsersView)
-               // ((UsersView) part).refresh();
-               // else if (part instanceof GroupsView)
-               // ((GroupsView) part).refresh();
                return null;
        }
 
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
+       /* DEPENDENCY INJECTION */
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
        }
 }
\ No newline at end of file
index 401aa400d5eeaabe811474a8b99fe35d09c39d96..1f71c6360f1d35b0a9606d3b1a54468574cabc65 100644 (file)
@@ -28,6 +28,7 @@ import org.argeo.security.ui.admin.internal.CommonNameLP;
 import org.argeo.security.ui.admin.internal.MailLP;
 import org.argeo.security.ui.admin.internal.RoleIconLP;
 import org.argeo.security.ui.admin.internal.UserAdminConstants;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.UserNameLP;
 import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
 import org.argeo.security.ui.admin.internal.UserTableViewer;
@@ -59,21 +60,22 @@ import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Display/edit main properties of a given group */
 public class GroupMainPage extends FormPage implements ArgeoNames {
        final static String ID = "GroupEditor.mainPage";
 
        private final UserEditor editor;
-       private UserAdmin userAdmin;
+       private UserAdminWrapper userAdminWrapper;
 
        // Local configuration
        private final int PRE_TITLE_INDENT = 10;
 
-       public GroupMainPage(FormEditor editor, UserAdmin userAdmin) {
+       public GroupMainPage(FormEditor editor, UserAdminWrapper userAdminWrapper) {
                super(editor, ID, "Main");
                this.editor = (UserEditor) editor;
-               this.userAdmin = userAdmin;
+               this.userAdminWrapper = userAdminWrapper;
        }
 
        protected void createFormContent(final IManagedForm mf) {
@@ -160,7 +162,7 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                // Create and configure the table
                userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
-                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin());
 
                userTableViewerCmp.setColumnDefinitions(columnDefs);
                userTableViewerCmp.populate(true, false);
@@ -177,8 +179,9 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                // Drag and drop
                int operations = DND.DROP_COPY | DND.DROP_MOVE;
                Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
-               userViewer.addDropSupport(operations, tt, new GroupDropListener(
-                               userViewer, userAdmin, (Group) editor.getDisplayedUser()));
+               userViewer.addDropSupport(operations, tt,
+                               new GroupDropListener(userViewer, userAdminWrapper,
+                                               (Group) editor.getDisplayedUser()));
        }
 
        private class MyUserTableViewer extends UserTableViewer {
@@ -213,12 +216,13 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
        private class GroupDropListener extends ViewerDropAdapter {
                private static final long serialVersionUID = 2893468717831451621L;
 
-               private final UserAdmin myUserAdmin;
+               private final UserAdminWrapper userAdminWrapper;
                private final Group myGroup;
 
-               public GroupDropListener(Viewer viewer, UserAdmin userAdmin, Group group) {
+               public GroupDropListener(Viewer viewer,
+                               UserAdminWrapper userAdminWrapper, Group group) {
                        super(viewer);
-                       this.myUserAdmin = userAdmin;
+                       this.userAdminWrapper = userAdminWrapper;
                        this.myGroup = group;
                }
 
@@ -233,23 +237,24 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
 
                @Override
                public void drop(DropTargetEvent event) {
+                       // TODO Is there an opportunity to perform ceck before?
+
                        String newUserName = (String) event.data;
+                       UserAdmin myUserAdmin = userAdminWrapper.getUserAdmin();
                        Role role = myUserAdmin.getRole(newUserName);
-                       // TODO this check should be done before.
                        if (role.getType() == Role.USER) {
                                // TODO check if the user is already member of this group
-                               // we expect here that there is already a begun transaction
-                               // TODO implement the dirty state
-                               editor.beginTransactionIfNeeded();
+                               userAdminWrapper.beginTransactionIfNeeded();
                                User user = (User) role;
                                myGroup.addMember(user);
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                               UserAdminEvent.ROLE_CHANGED, myGroup));
                        } else if (role.getType() == Role.GROUP) {
                                Group newGroup = (Group) role;
 
                                Shell shell = getViewer().getControl().getShell();
                                // Sanity checks
                                if (myGroup == newGroup) { // Equality
-
                                        MessageDialog.openError(shell, "Forbidden addition ",
                                                        "A group cannot be a member of itself.");
                                        return;
@@ -274,9 +279,11 @@ public class GroupMainPage extends FormPage implements ArgeoNames {
                                        return;
                                }
 
-                               editor.beginTransactionIfNeeded();
+                               userAdminWrapper.beginTransactionIfNeeded();
                                // TODO implement the dirty state
                                myGroup.addMember(newGroup);
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                               UserAdminEvent.ROLE_CHANGED, myGroup));
                        }
                        super.drop(event);
                }
index 2f7aa41c7c2672a3562bb909c746eded2507ebbb..ed39f30f282cac4cf776f98c90ab2a3e1f856adb 100644 (file)
@@ -18,12 +18,10 @@ package org.argeo.security.ui.admin.editors;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.transaction.UserTransaction;
-
 import org.argeo.ArgeoException;
 import org.argeo.security.ui.admin.SecurityAdminPlugin;
-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.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.ui.IEditorInput;
 import org.eclipse.ui.IEditorSite;
@@ -33,6 +31,7 @@ import org.osgi.service.useradmin.Authorization;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Editor for a user, might be a user or a group. */
 public class UserEditor extends FormEditor implements UserAdminConstants {
@@ -42,8 +41,8 @@ public class UserEditor extends FormEditor implements UserAdminConstants {
                        + ".userEditor";
 
        /* DEPENDENCY INJECTION */
+       private UserAdminWrapper userAdminWrapper;
        private UserAdmin userAdmin;
-       private UserTransaction userTransaction;
 
        // Context
        private User user;
@@ -101,9 +100,9 @@ public class UserEditor extends FormEditor implements UserAdminConstants {
        protected void addPages() {
                try {
                        if (user.getType() == Role.GROUP)
-                               addPage(new GroupMainPage(this, userAdmin));
+                               addPage(new GroupMainPage(this, userAdminWrapper));
                        else
-                               addPage(new UserMainPage(this, userAdmin));
+                               addPage(new UserMainPage(this, userAdminWrapper));
                } catch (Exception e) {
                        throw new ArgeoException("Cannot add pages", e);
                }
@@ -117,10 +116,6 @@ public class UserEditor extends FormEditor implements UserAdminConstants {
                        return "";
        }
 
-       protected void beginTransactionIfNeeded() {
-               UiAdminUtils.beginTransactionIfNeeded(userTransaction);
-       }
-
        /**
         * Updates the property in the working copy. The transaction must be
         * explicitly committed to persist the update.
@@ -132,15 +127,11 @@ public class UserEditor extends FormEditor implements UserAdminConstants {
 
        @Override
        public void doSave(IProgressMonitor monitor) {
-               UiAdminUtils.beginTransactionIfNeeded(userTransaction);
+               userAdminWrapper.beginTransactionIfNeeded();
                commitPages(true);
                firePropertyChange(PROP_DIRTY);
-               // FIXME transaction should be managed at a higher level
-               // try {
-               // userTransaction.commit();
-               // } catch (Exception e) {
-               // throw new ArgeoException("Could not save user editor", e);
-               // }
+               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                               UserAdminEvent.ROLE_REMOVED, user));
        }
 
        @Override
@@ -162,12 +153,8 @@ public class UserEditor extends FormEditor implements UserAdminConstants {
        }
 
        /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
+               this.userAdmin = userAdminWrapper.getUserAdmin();
        }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
-       }
-
 }
\ No newline at end of file
index c657c35086650e1f01f636ffbf8c3b97f6235690..dbaba9c1a85deb289bfccaf4fb539bac1e5fbeb6 100644 (file)
@@ -26,6 +26,7 @@ import org.argeo.security.ui.admin.internal.ColumnDefinition;
 import org.argeo.security.ui.admin.internal.CommonNameLP;
 import org.argeo.security.ui.admin.internal.RoleIconLP;
 import org.argeo.security.ui.admin.internal.UserAdminConstants;
+import org.argeo.security.ui.admin.internal.UserAdminWrapper;
 import org.argeo.security.ui.admin.internal.UserNameLP;
 import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
 import org.argeo.security.ui.admin.internal.UserTableViewer;
@@ -57,6 +58,7 @@ import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
 
 /** Display/edit the properties common to all users */
 public class UserMainPage extends FormPage implements ArgeoNames {
@@ -65,17 +67,17 @@ public class UserMainPage extends FormPage implements ArgeoNames {
        // private final static Log log = LogFactory.getLog(UserMainPage.class);
 
        private final UserEditor editor;
-       private UserAdmin userAdmin;
+       private UserAdminWrapper userAdminWrapper;
 
        private char[] newPassword;
 
        // Local configuration
        private final int PRE_TITLE_INDENT = 10;
 
-       public UserMainPage(FormEditor editor, UserAdmin userAdmin) {
+       public UserMainPage(FormEditor editor, UserAdminWrapper userAdminWrapper) {
                super(editor, ID, "Main");
                this.editor = (UserEditor) editor;
-               this.userAdmin = userAdmin;
+               this.userAdminWrapper = userAdminWrapper;
        }
 
        public String getNewPassword() {
@@ -232,7 +234,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
 
                // Create and configure the table
                userTableViewerCmp = new MyUserTableViewer(body, SWT.MULTI
-                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin());
 
                userTableViewerCmp.setColumnDefinitions(columnDefs);
                userTableViewerCmp.populate(true, false);
@@ -250,7 +252,7 @@ public class UserMainPage extends FormPage implements ArgeoNames {
                int operations = DND.DROP_COPY | DND.DROP_MOVE;
                Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
                userViewer.addDropSupport(operations, tt, new GroupDropListener(
-                               userViewer, userAdmin, editor.getDisplayedUser()));
+                               userViewer, userAdminWrapper.getUserAdmin(), editor.getDisplayedUser()));
 
        }
 
@@ -300,11 +302,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
-                               // we expect here that there is already a begun transaction
-                               // TODO implement the dirty state
-                               editor.beginTransactionIfNeeded();
+                               userAdminWrapper.beginTransactionIfNeeded();
                                Group group = (Group) role;
                                group.addMember(myUser);
+                               userAdminWrapper.notifyListeners(new UserAdminEvent(null,
+                                               UserAdminEvent.ROLE_CHANGED, group));
                        }
                        super.drop(event);
                }
index 58ca19c6e5fbbf271e91597035b8d7f20460505a..136c41540957913db11dc7666be5deea1d489163 100644 (file)
@@ -1,8 +1,9 @@
 package org.argeo.security.ui.admin.internal;
 
 import java.security.AccessController;
-import java.security.Principal;
 
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
 import javax.security.auth.Subject;
 import javax.security.auth.x500.X500Principal;
 import javax.transaction.Status;
@@ -14,15 +15,49 @@ import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.services.ISourceProviderService;
 import org.osgi.service.useradmin.Role;
 import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
 
 /** First effort to centralize back end methods used by the user admin UI */
 public class UiAdminUtils {
-       public final static String getUsername() {
+
+       /** returns the local name of the current connected user */
+       public final static String getUsername(UserAdmin userAdmin) {
+               LdapName dn = getLdapName();
+               return getUsername(getUser(userAdmin, dn));
+       }
+
+       public final static boolean isCurrentUser(User user) {
+               String userName = UiAdminUtils.getProperty(user,
+                               UserAdminConstants.KEY_DN);
+               try {
+                       LdapName selfUserName = UiAdminUtils.getLdapName();
+                       LdapName userLdapName = new LdapName(userName);
+                       if (userLdapName.equals(selfUserName))
+                               return true;
+                       else
+                               return false;
+               } catch (InvalidNameException e) {
+                       throw new ArgeoException("User " + user + " has an unvalid dn: "
+                                       + userName, e);
+               }
+       }
+
+       public final static LdapName getLdapName() {
                Subject subject = Subject.getSubject(AccessController.getContext());
-               Principal principal = subject.getPrincipals(X500Principal.class)
-                               .iterator().next();
-               return principal.getName();
+               String name = subject.getPrincipals(X500Principal.class).iterator()
+                               .next().toString();
+               LdapName dn;
+               try {
+                       dn = new LdapName(name);
+               } catch (InvalidNameException e) {
+                       throw new ArgeoException("Invalid user dn " + name, e);
+               }
+               return dn;
+       }
 
+       public final static User getUser(UserAdmin userAdmin, LdapName dn) {
+               User user = userAdmin.getUser(UserAdminConstants.KEY_DN, dn.toString());
+               return user;
        }
 
        public final static String getUsername(User user) {
index 6c07b8c3adf47387231a21d29911a08200ff8c2a..f584afe67217656f17e3777addbf645534d6c8f7 100644 (file)
@@ -1,5 +1,8 @@
 package org.argeo.security.ui.admin.internal;
 
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.swt.SWT;
@@ -20,12 +23,18 @@ public abstract class UserAdminAbstractLP extends ColumnLabelProvider implements
 
        @Override
        public Font getFont(Object element) {
-
                // Self as bold
-               String selfUserName = UiAdminUtils.getUsername();
-               String userName = ((User) element).getName();
-               if (userName.equals(selfUserName))
-                       return bold;
+               try {
+                       LdapName selfUserName = UiAdminUtils.getLdapName();
+                       String userName = UiAdminUtils.getProperty((User) element,
+                                       UserAdminConstants.KEY_DN);
+                       LdapName userLdapName = new LdapName(userName);
+                       if (userLdapName.equals(selfUserName))
+                               return bold;
+               } catch (InvalidNameException e) {
+                       // TODO Auto-generated catch block
+                       e.printStackTrace();
+               }
 
                // Disabled as Italic
                // Node userProfile = (Node) elem;
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminWrapper.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminWrapper.java
new file mode 100644 (file)
index 0000000..794230f
--- /dev/null
@@ -0,0 +1,69 @@
+package org.argeo.security.ui.admin.internal;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+
+import org.argeo.ArgeoException;
+import org.osgi.service.useradmin.UserAdmin;
+import org.osgi.service.useradmin.UserAdminEvent;
+import org.osgi.service.useradmin.UserAdminListener;
+
+/** Simplifies the interaction with the UserAdmin in this bundle */
+public class UserAdminWrapper {
+
+       private UserAdmin userAdmin;
+       private UserTransaction userTransaction;
+
+       // Registered listeners
+       List<UserAdminListener> listeners = new ArrayList<UserAdminListener>();
+
+       // TODO implement safer mechanism
+       public void addListener(UserAdminListener userAdminListener) {
+               if (!listeners.contains(userAdminListener))
+                       listeners.add(userAdminListener);
+       }
+
+       /** Must be called from the UI Thread. */
+       public void beginTransactionIfNeeded() {
+               try {
+                       if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) {
+                               userTransaction.begin();
+                               UiAdminUtils.notifyTransactionStateChange(userTransaction);
+                       }
+               } catch (Exception e) {
+                       throw new ArgeoException("Unable to begin transaction", e);
+               }
+       }
+
+       // Expose this?
+       public void removeListener(UserAdminListener userAdminListener) {
+               if (listeners.contains(userAdminListener))
+                       listeners.remove(userAdminListener);
+       }
+
+       public void notifyListeners(UserAdminEvent event) {
+               for (UserAdminListener listener : listeners)
+                       listener.roleChanged(event);
+       }
+
+       public UserAdmin getUserAdmin() {
+               return userAdmin;
+       }
+
+       public UserTransaction getUserTransaction() {
+               return userTransaction;
+       }
+
+       /* DEPENDENCY INJECTION */
+       public void setUserAdmin(UserAdmin userAdmin) {
+               this.userAdmin = userAdmin;
+       }
+
+       public void setUserTransaction(UserTransaction userTransaction) {
+               this.userTransaction = userTransaction;
+       }
+
+}
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java
new file mode 100644 (file)
index 0000000..62990ba
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.security.ui.admin.internal.parts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.internal.ColumnDefinition;
+import org.argeo.security.ui.admin.internal.CommonNameLP;
+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.UserDragListener;
+import org.argeo.security.ui.admin.internal.UserNameLP;
+import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
+import org.argeo.security.ui.admin.internal.UserTableViewer;
+import org.eclipse.jface.viewers.TableViewer;
+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.widgets.Composite;
+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 UsersView implements ArgeoNames {
+       public final static String ID = SecurityAdminPlugin.PLUGIN_ID
+                       + ".groupsView";
+
+       /* DEPENDENCY INJECTION */
+       private UserAdminWrapper userAdminWrapper;
+
+       // UI Objects
+       private UserTableViewer groupTableViewerCmp;
+       private TableViewer userViewer;
+       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
+
+       private UserAdminListener listener;
+
+       @Override
+       public void createPartControl(Composite parent) {
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               // Define the displayed columns
+               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
+                               150));
+               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());
+
+               groupTableViewerCmp.setColumnDefinitions(columnDefs);
+               groupTableViewerCmp.populate(true, false);
+               groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
+
+               // Links
+               userViewer = groupTableViewerCmp.getTableViewer();
+               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
+               getViewSite().setSelectionProvider(userViewer);
+
+               // Really?
+               groupTableViewerCmp.refresh();
+
+               // Drag and drop
+               int operations = DND.DROP_COPY | DND.DROP_MOVE;
+               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+               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);
+       }
+
+       private class MyUserTableViewer extends UserTableViewer {
+               private static final long serialVersionUID = 8467999509931900367L;
+
+               private final String[] knownProps = { UserAdminConstants.KEY_UID,
+                               UserAdminConstants.KEY_CN, UserAdminConstants.KEY_DN };
+
+               public MyUserTableViewer(Composite parent, int style,
+                               UserAdmin userAdmin) {
+                       super(parent, style, userAdmin);
+               }
+
+               @Override
+               protected List<User> listFilteredElements(String filter) {
+                       Role[] roles;
+                       try {
+                               StringBuilder builder = new StringBuilder();
+                               StringBuilder tmpBuilder = new StringBuilder();
+                               if (UiAdminUtils.notNull(filter))
+                                       for (String prop : knownProps) {
+                                               tmpBuilder.append("(");
+                                               tmpBuilder.append(prop);
+                                               tmpBuilder.append("=*");
+                                               tmpBuilder.append(filter);
+                                               tmpBuilder.append("*)");
+                                       }
+                               if (tmpBuilder.length() > 1) {
+                                       builder.append("(&(objectclass=groupOfNames)(|");
+                                       builder.append(tmpBuilder.toString());
+                                       builder.append("))");
+                               } else
+                                       builder.append("(objectclass=groupOfNames)");
+                               roles = userAdminWrapper.getUserAdmin().getRoles(
+                                               builder.toString());
+                       } catch (InvalidSyntaxException e) {
+                               throw new ArgeoException("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);
+                       return users;
+               }
+       }
+
+       public void refresh() {
+               groupTableViewerCmp.refresh();
+       }
+
+       // Override generic view methods
+       @Override
+       public void dispose() {
+               userAdminWrapper.removeListener(listener);
+               super.dispose();
+       }
+
+       @Override
+       public void setFocus() {
+               groupTableViewerCmp.setFocus();
+       }
+
+       /* DEPENDENCY INJECTION */
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java
new file mode 100644 (file)
index 0000000..15bdf4a
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.security.ui.admin.internal.parts;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.EclipseUiUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.security.ui.admin.SecurityAdminPlugin;
+import org.argeo.security.ui.admin.internal.ColumnDefinition;
+import org.argeo.security.ui.admin.internal.CommonNameLP;
+import org.argeo.security.ui.admin.internal.MailLP;
+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.UserDragListener;
+import org.argeo.security.ui.admin.internal.UserNameLP;
+import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
+import org.argeo.security.ui.admin.internal.UserTableViewer;
+import org.eclipse.jface.viewers.TableViewer;
+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.widgets.Composite;
+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 users with filter - based on Ldif userAdmin */
+public class UsersView extends ViewPart implements ArgeoNames {
+       // private final static Log log = LogFactory.getLog(UsersView.class);
+       public final static String ID = SecurityAdminPlugin.PLUGIN_ID
+                       + ".usersView";
+
+       /* DEPENDENCY INJECTION */
+       private UserAdminWrapper userAdminWrapper;
+
+       private UserAdmin userAdmin;
+
+       // UI Objects
+       private UserTableViewer userTableViewerCmp;
+       private TableViewer userViewer;
+       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
+
+       private UserAdminListener listener;
+
+       @Override
+       public void createPartControl(Composite parent) {
+
+               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
+               // Define the displayed columns
+               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
+                               150));
+               columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
+               columnDefs.add(new ColumnDefinition(new UserNameLP(),
+                               "Distinguished Name", 300));
+
+               // Create and configure the table
+               userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
+                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
+               userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
+
+               userTableViewerCmp.setColumnDefinitions(columnDefs);
+               userTableViewerCmp.populate(true, false);
+
+               // Links
+               userViewer = userTableViewerCmp.getTableViewer();
+               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
+               getViewSite().setSelectionProvider(userViewer);
+
+               // Really?
+               userTableViewerCmp.refresh();
+
+               // Drag and drop
+               int operations = DND.DROP_COPY | DND.DROP_MOVE;
+               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
+               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);
+       }
+
+       private class MyUserTableViewer extends UserTableViewer {
+               private static final long serialVersionUID = 8467999509931900367L;
+
+               private final String[] knownProps = { UserAdminConstants.KEY_UID,
+                               UserAdminConstants.KEY_DN, UserAdminConstants.KEY_CN,
+                               UserAdminConstants.KEY_FIRSTNAME,
+                               UserAdminConstants.KEY_LASTNAME, UserAdminConstants.KEY_MAIL };
+
+               public MyUserTableViewer(Composite parent, int style,
+                               UserAdmin userAdmin) {
+                       super(parent, style, userAdmin);
+               }
+
+               @Override
+               protected List<User> listFilteredElements(String filter) {
+                       Role[] roles;
+
+                       try {
+                               StringBuilder builder = new StringBuilder();
+
+                               StringBuilder tmpBuilder = new StringBuilder();
+                               if (UiAdminUtils.notNull(filter))
+                                       for (String prop : knownProps) {
+                                               tmpBuilder.append("(");
+                                               tmpBuilder.append(prop);
+                                               tmpBuilder.append("=*");
+                                               tmpBuilder.append(filter);
+                                               tmpBuilder.append("*)");
+                                       }
+                               if (tmpBuilder.length() > 1) {
+                                       builder.append("(&(objectclass=inetOrgPerson)(|");
+                                       builder.append(tmpBuilder.toString());
+                                       builder.append("))");
+                               } else
+                                       builder.append("(objectclass=inetOrgPerson)");
+                               roles = userAdmin.getRoles(builder.toString());
+                       } catch (InvalidSyntaxException e) {
+                               throw new ArgeoException("Unable to get roles with filter: "
+                                               + filter, e);
+                       }
+                       List<User> users = new ArrayList<User>();
+                       for (Role role : roles)
+                               // if (role.getType() == Role.USER && role.getType() !=
+                               // Role.GROUP)
+                               users.add((User) role);
+                       return users;
+               }
+       }
+
+       public void refresh() {
+               userTableViewerCmp.refresh();
+       }
+
+       // Override generic view methods
+       @Override
+       public void dispose() {
+               userAdminWrapper.removeListener(listener);
+               super.dispose();
+       }
+
+       @Override
+       public void setFocus() {
+               userTableViewerCmp.setFocus();
+       }
+
+       /* DEPENDENCY INJECTION */
+       public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
+               this.userAdminWrapper = userAdminWrapper;
+               this.userAdmin = userAdminWrapper.getUserAdmin();
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java
deleted file mode 100644 (file)
index 74d2c99..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.security.ui.admin.views;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.ui.admin.SecurityAdminPlugin;
-import org.argeo.security.ui.admin.internal.ColumnDefinition;
-import org.argeo.security.ui.admin.internal.CommonNameLP;
-import org.argeo.security.ui.admin.internal.UiAdminUtils;
-import org.argeo.security.ui.admin.internal.UserAdminConstants;
-import org.argeo.security.ui.admin.internal.UserDragListener;
-import org.argeo.security.ui.admin.internal.UserNameLP;
-import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
-import org.argeo.security.ui.admin.internal.UserTableViewer;
-import org.eclipse.jface.viewers.TableViewer;
-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.widgets.Composite;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.User;
-import org.osgi.service.useradmin.UserAdmin;
-
-/** List all groups with filter */
-public class GroupsView extends UsersView implements ArgeoNames {
-       public final static String ID = SecurityAdminPlugin.PLUGIN_ID
-                       + ".groupsView";
-
-       /* DEPENDENCY INJECTION */
-       private UserAdmin userAdmin;
-
-       // UI Objects
-       private UserTableViewer groupTableViewerCmp;
-       private TableViewer userViewer;
-       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-
-       @Override
-       public void createPartControl(Composite parent) {
-               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
-               // Define the displayed columns
-               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
-                               150));
-               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, userAdmin);
-
-               groupTableViewerCmp.setColumnDefinitions(columnDefs);
-               groupTableViewerCmp.populate(true, false);
-               groupTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
-
-               // Links
-               userViewer = groupTableViewerCmp.getTableViewer();
-               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
-               getViewSite().setSelectionProvider(userViewer);
-
-               // Really?
-               groupTableViewerCmp.refresh();
-
-               // Drag and drop
-               int operations = DND.DROP_COPY | DND.DROP_MOVE;
-               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
-               userViewer.addDragSupport(operations, tt, new UserDragListener(
-                               userViewer));
-       }
-
-       private class MyUserTableViewer extends UserTableViewer {
-               private static final long serialVersionUID = 8467999509931900367L;
-
-               private final String[] knownProps = { UserAdminConstants.KEY_UID,
-                               UserAdminConstants.KEY_CN, UserAdminConstants.KEY_DN };
-
-               public MyUserTableViewer(Composite parent, int style,
-                               UserAdmin userAdmin) {
-                       super(parent, style, userAdmin);
-               }
-
-               @Override
-               protected List<User> listFilteredElements(String filter) {
-                       Role[] roles;
-                       try {
-                               StringBuilder builder = new StringBuilder();
-                               StringBuilder tmpBuilder = new StringBuilder();
-                               if (UiAdminUtils.notNull(filter))
-                                       for (String prop : knownProps) {
-                                               tmpBuilder.append("(");
-                                               tmpBuilder.append(prop);
-                                               tmpBuilder.append("=*");
-                                               tmpBuilder.append(filter);
-                                               tmpBuilder.append("*)");
-                                       }
-                               if (tmpBuilder.length() > 1) {
-                                       builder.append("(&(objectclass=groupOfNames)(|");
-                                       builder.append(tmpBuilder.toString());
-                                       builder.append("))");
-                               } else
-                                       builder.append("(objectclass=groupOfNames)");
-                               roles = userAdmin.getRoles(builder.toString());
-                       } catch (InvalidSyntaxException e) {
-                               throw new ArgeoException("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);
-                       return users;
-               }
-       }
-
-       public void refresh() {
-               groupTableViewerCmp.refresh();
-       }
-
-       // Override generic view methods
-       @Override
-       public void dispose() {
-               super.dispose();
-       }
-
-       @Override
-       public void setFocus() {
-               groupTableViewerCmp.setFocus();
-       }
-
-       /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
-       }
-}
\ No newline at end of file
diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java
deleted file mode 100644 (file)
index a14e2b4..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.security.ui.admin.views;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.ui.admin.SecurityAdminImages;
-import org.argeo.security.ui.admin.SecurityAdminPlugin;
-import org.argeo.security.ui.admin.internal.ColumnDefinition;
-import org.argeo.security.ui.admin.internal.CommonNameLP;
-import org.argeo.security.ui.admin.internal.MailLP;
-import org.argeo.security.ui.admin.internal.UiAdminUtils;
-import org.argeo.security.ui.admin.internal.UserAdminConstants;
-import org.argeo.security.ui.admin.internal.UserDragListener;
-import org.argeo.security.ui.admin.internal.UserNameLP;
-import org.argeo.security.ui.admin.internal.UserTableDefaultDClickListener;
-import org.argeo.security.ui.admin.internal.UserTableViewer;
-import org.eclipse.jface.viewers.TableViewer;
-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.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-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;
-
-/** List all users with filter - based on Ldif userAdmin */
-public class UsersView extends ViewPart implements ArgeoNames {
-       // private final static Log log = LogFactory.getLog(UsersView.class);
-       public final static String ID = SecurityAdminPlugin.PLUGIN_ID
-                       + ".usersView";
-
-       /* DEPENDENCY INJECTION */
-       private UserAdmin userAdmin;
-
-       // UI Objects
-       private UserTableViewer userTableViewerCmp;
-       private TableViewer userViewer;
-       private List<ColumnDefinition> columnDefs = new ArrayList<ColumnDefinition>();
-
-       @Override
-       public void createPartControl(Composite parent) {
-
-               parent.setLayout(EclipseUiUtils.noSpaceGridLayout());
-               // Define the displayed columns
-               columnDefs.add(new ColumnDefinition(new CommonNameLP(), "Common Name",
-                               150));
-               columnDefs.add(new ColumnDefinition(new MailLP(), "E-mail", 150));
-               columnDefs.add(new ColumnDefinition(new UserNameLP(),
-                               "Distinguished Name", 300));
-
-               // Create and configure the table
-               userTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI
-                               | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin);
-               userTableViewerCmp.setLayoutData(EclipseUiUtils.fillAll());
-
-               userTableViewerCmp.setColumnDefinitions(columnDefs);
-               userTableViewerCmp.populate(true, false);
-
-               // Links
-               userViewer = userTableViewerCmp.getTableViewer();
-               userViewer.addDoubleClickListener(new UserTableDefaultDClickListener());
-               getViewSite().setSelectionProvider(userViewer);
-
-               // Really?
-               userTableViewerCmp.refresh();
-
-               // Drag and drop
-               int operations = DND.DROP_COPY | DND.DROP_MOVE;
-               Transfer[] tt = new Transfer[] { TextTransfer.getInstance() };
-               userViewer.addDragSupport(operations, tt, new UserDragListener(
-                               userViewer));
-
-               // FIXME insure the group and person icons are registered before calling
-               // the open editor
-               @SuppressWarnings("unused")
-               Image dummyImg = SecurityAdminImages.ICON_GROUP;
-               dummyImg = SecurityAdminImages.ICON_USER;
-       }
-
-       private class MyUserTableViewer extends UserTableViewer {
-               private static final long serialVersionUID = 8467999509931900367L;
-
-               private final String[] knownProps = { UserAdminConstants.KEY_UID,
-                               UserAdminConstants.KEY_DN, UserAdminConstants.KEY_CN,
-                               UserAdminConstants.KEY_FIRSTNAME,
-                               UserAdminConstants.KEY_LASTNAME, UserAdminConstants.KEY_MAIL };
-
-               public MyUserTableViewer(Composite parent, int style,
-                               UserAdmin userAdmin) {
-                       super(parent, style, userAdmin);
-               }
-
-               @Override
-               protected List<User> listFilteredElements(String filter) {
-                       Role[] roles;
-
-                       try {
-                               StringBuilder builder = new StringBuilder();
-
-                               StringBuilder tmpBuilder = new StringBuilder();
-                               if (UiAdminUtils.notNull(filter))
-                                       for (String prop : knownProps) {
-                                               tmpBuilder.append("(");
-                                               tmpBuilder.append(prop);
-                                               tmpBuilder.append("=*");
-                                               tmpBuilder.append(filter);
-                                               tmpBuilder.append("*)");
-                                       }
-                               if (tmpBuilder.length() > 1) {
-                                       builder.append("(&(objectclass=inetOrgPerson)(|");
-                                       builder.append(tmpBuilder.toString());
-                                       builder.append("))");
-                               } else
-                                       builder.append("(objectclass=inetOrgPerson)");
-                               roles = userAdmin.getRoles(builder.toString());
-                       } catch (InvalidSyntaxException e) {
-                               throw new ArgeoException("Unable to get roles with filter: "
-                                               + filter, e);
-                       }
-                       List<User> users = new ArrayList<User>();
-                       for (Role role : roles)
-                               // if (role.getType() == Role.USER && role.getType() !=
-                               // Role.GROUP)
-                               users.add((User) role);
-                       return users;
-               }
-       }
-
-       public void refresh() {
-               userTableViewerCmp.refresh();
-       }
-
-       // Override generic view methods
-       @Override
-       public void dispose() {
-               super.dispose();
-               // try {
-               // if (userTransaction != null
-               // && userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION)
-               // userTransaction.rollback();
-               // } catch (Exception e) {
-               // log.error("Cannot clean transaction", e);
-               // }
-       }
-
-       @Override
-       public void setFocus() {
-               userTableViewerCmp.setFocus();
-       }
-
-       /* DEPENDENCY INJECTION */
-       public void setUserAdmin(UserAdmin userAdmin) {
-               this.userAdmin = userAdmin;
-       }
-}
\ No newline at end of file