From cd2948994931fcb43283ffb30c1058d5860dec68 Mon Sep 17 00:00:00 2001 From: Bruno Sinou Date: Wed, 16 Sep 2015 23:10:31 +0000 Subject: [PATCH] Introduce a UserAdmin wrapper service Implement base listener mechanism Some code cleaning and refactoring git-svn-id: https://svn.argeo.org/commons/trunk@8413 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/spring/commands.xml | 21 ++--- .../META-INF/spring/common.xml | 7 ++ .../spring/{editors.xml => parts.xml} | 18 +++-- .../META-INF/spring/views.xml | 16 ---- .../ui/admin/SecurityAdminPerspective.java | 4 +- .../ui/admin/commands/DeleteGroups.java | 70 ++++++---------- .../ui/admin/commands/DeleteUsers.java | 79 +++++++------------ .../ui/admin/commands/ForceRefresh.java | 4 +- .../security/ui/admin/commands/NewGroup.java | 44 +++-------- .../security/ui/admin/commands/NewUser.java | 59 +++++++------- .../commands/UserTransactionHandler.java | 27 +++---- .../ui/admin/editors/GroupMainPage.java | 37 +++++---- .../security/ui/admin/editors/UserEditor.java | 35 +++----- .../ui/admin/editors/UserMainPage.java | 18 +++-- .../ui/admin/internal/UiAdminUtils.java | 45 +++++++++-- .../admin/internal/UserAdminAbstractLP.java | 19 +++-- .../ui/admin/internal/UserAdminWrapper.java | 69 ++++++++++++++++ .../{views => internal/parts}/GroupsView.java | 29 +++++-- .../{views => internal/parts}/UsersView.java | 38 +++++---- 19 files changed, 343 insertions(+), 296 deletions(-) rename org.argeo.security.ui.admin/META-INF/spring/{editors.xml => parts.xml} (51%) delete mode 100644 org.argeo.security.ui.admin/META-INF/spring/views.xml create mode 100644 org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminWrapper.java rename org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/{views => internal/parts}/GroupsView.java (84%) rename org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/{views => internal/parts}/UsersView.java (87%) diff --git a/org.argeo.security.ui.admin/META-INF/spring/commands.xml b/org.argeo.security.ui.admin/META-INF/spring/commands.xml index 6ce0496c6..412355054 100644 --- a/org.argeo.security.ui.admin/META-INF/spring/commands.xml +++ b/org.argeo.security.ui.admin/META-INF/spring/commands.xml @@ -7,41 +7,30 @@ - - + - - + - - + - - + - - - + diff --git a/org.argeo.security.ui.admin/META-INF/spring/common.xml b/org.argeo.security.ui.admin/META-INF/spring/common.xml index 5cf10913b..bcb039da6 100644 --- a/org.argeo.security.ui.admin/META-INF/spring/common.xml +++ b/org.argeo.security.ui.admin/META-INF/spring/common.xml @@ -10,6 +10,13 @@ + + + + + diff --git a/org.argeo.security.ui.admin/META-INF/spring/editors.xml b/org.argeo.security.ui.admin/META-INF/spring/parts.xml similarity index 51% rename from org.argeo.security.ui.admin/META-INF/spring/editors.xml rename to org.argeo.security.ui.admin/META-INF/spring/parts.xml index e9cf5ac8d..d680910fd 100644 --- a/org.argeo.security.ui.admin/META-INF/spring/editors.xml +++ b/org.argeo.security.ui.admin/META-INF/spring/parts.xml @@ -8,11 +8,17 @@ - - + - - - + + + + + + + + + \ 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 index 0af9b377d..000000000 --- a/org.argeo.security.ui.admin/META-INF/spring/views.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java index 7b340d643..a296961ea 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/SecurityAdminPerspective.java @@ -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; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteGroups.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteGroups.java index 8d72a5891..2add11bc4 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteGroups.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteGroups.java @@ -15,29 +15,23 @@ */ 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 toDelete = new TreeMap(); - // List names = new ArrayList(); + List groups = new ArrayList(); Iterator 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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteUsers.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteUsers.java index 554e90aff..6a9da4b8d 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteUsers.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/DeleteUsers.java @@ -15,27 +15,23 @@ */ 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 toDelete = new TreeMap(); - // Map toDelete = new TreeMap(); Iterator it = ((IStructuredSelection) selection).iterator(); - users: while (it.hasNext()) { + List users = new ArrayList(); + 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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/ForceRefresh.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/ForceRefresh.java index 189e78563..7d0f8266f 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/ForceRefresh.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/ForceRefresh.java @@ -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; diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewGroup.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewGroup.java index d797c5d74..d752bd1b2 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewGroup.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewGroup.java @@ -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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java index 0154f03bd..443fe079c 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/NewUser.java @@ -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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/UserTransactionHandler.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/UserTransactionHandler.java index 0a94d1a7d..aa07040f5 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/UserTransactionHandler.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/commands/UserTransactionHandler.java @@ -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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java index 401aa400d..1f71c6360 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/GroupMainPage.java @@ -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); } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java index 2f7aa41c7..ed39f30f2 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserEditor.java @@ -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 diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java index c657c3508..dbaba9c1a 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/editors/UserMainPage.java @@ -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); } diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java index 58ca19c6e..136c41540 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java @@ -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) { diff --git a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java index 6c07b8c3a..f584afe67 100644 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminAbstractLP.java @@ -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 index 000000000..794230ff6 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UserAdminWrapper.java @@ -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 listeners = new ArrayList(); + + // 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/views/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java similarity index 84% rename from org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java rename to org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java index 74d2c995d..62990baae 100644 --- 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/internal/parts/GroupsView.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.argeo.security.ui.admin.views; +package org.argeo.security.ui.admin.internal.parts; import java.util.ArrayList; import java.util.List; @@ -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.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; @@ -40,6 +41,8 @@ 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 { @@ -47,13 +50,15 @@ public class GroupsView extends UsersView implements ArgeoNames { + ".groupsView"; /* DEPENDENCY INJECTION */ - private UserAdmin userAdmin; + private UserAdminWrapper userAdminWrapper; // UI Objects private UserTableViewer groupTableViewerCmp; private TableViewer userViewer; private List columnDefs = new ArrayList(); + private UserAdminListener listener; + @Override public void createPartControl(Composite parent) { parent.setLayout(EclipseUiUtils.noSpaceGridLayout()); @@ -65,7 +70,7 @@ public class GroupsView extends UsersView implements ArgeoNames { // Create and configure the table groupTableViewerCmp = new MyUserTableViewer(parent, SWT.MULTI - | SWT.H_SCROLL | SWT.V_SCROLL, userAdmin); + | SWT.H_SCROLL | SWT.V_SCROLL, userAdminWrapper.getUserAdmin()); groupTableViewerCmp.setColumnDefinitions(columnDefs); groupTableViewerCmp.populate(true, false); @@ -84,6 +89,16 @@ public class GroupsView extends UsersView implements ArgeoNames { 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 { @@ -117,7 +132,8 @@ public class GroupsView extends UsersView implements ArgeoNames { builder.append("))"); } else builder.append("(objectclass=groupOfNames)"); - roles = userAdmin.getRoles(builder.toString()); + roles = userAdminWrapper.getUserAdmin().getRoles( + builder.toString()); } catch (InvalidSyntaxException e) { throw new ArgeoException("Unable to get roles with filter: " + filter, e); @@ -137,6 +153,7 @@ public class GroupsView extends UsersView implements ArgeoNames { // Override generic view methods @Override public void dispose() { + userAdminWrapper.removeListener(listener); super.dispose(); } @@ -146,7 +163,7 @@ public class GroupsView extends UsersView implements ArgeoNames { } /* DEPENDENCY INJECTION */ - public void setUserAdmin(UserAdmin userAdmin) { - this.userAdmin = userAdmin; + 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/views/UsersView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java similarity index 87% rename from org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java rename to org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java index a14e2b42f..15bdf4a60 100644 --- 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/internal/parts/UsersView.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.argeo.security.ui.admin.views; +package org.argeo.security.ui.admin.internal.parts; import java.util.ArrayList; import java.util.List; @@ -21,13 +21,13 @@ 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.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; @@ -37,13 +37,14 @@ 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; +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 { @@ -52,6 +53,8 @@ public class UsersView extends ViewPart implements ArgeoNames { + ".usersView"; /* DEPENDENCY INJECTION */ + private UserAdminWrapper userAdminWrapper; + private UserAdmin userAdmin; // UI Objects @@ -59,6 +62,8 @@ public class UsersView extends ViewPart implements ArgeoNames { private TableViewer userViewer; private List columnDefs = new ArrayList(); + private UserAdminListener listener; + @Override public void createPartControl(Composite parent) { @@ -92,11 +97,15 @@ public class UsersView extends ViewPart implements ArgeoNames { 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; + // 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 { @@ -155,14 +164,8 @@ public class UsersView extends ViewPart implements ArgeoNames { // Override generic view methods @Override public void dispose() { + userAdminWrapper.removeListener(listener); super.dispose(); - // try { - // if (userTransaction != null - // && userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION) - // userTransaction.rollback(); - // } catch (Exception e) { - // log.error("Cannot clean transaction", e); - // } } @Override @@ -171,7 +174,8 @@ public class UsersView extends ViewPart implements ArgeoNames { } /* DEPENDENCY INJECTION */ - public void setUserAdmin(UserAdmin userAdmin) { - this.userAdmin = userAdmin; + public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) { + this.userAdminWrapper = userAdminWrapper; + this.userAdmin = userAdminWrapper.getUserAdmin(); } } \ No newline at end of file -- 2.30.2