From: Bruno Sinou Date: Wed, 16 Sep 2015 23:10:31 +0000 (+0000) Subject: Introduce a UserAdmin wrapper service X-Git-Tag: argeo-commons-2.1.30~140 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=cd2948994931fcb43283ffb30c1058d5860dec68;p=lgpl%2Fargeo-commons.git 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 --- 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/editors.xml deleted file mode 100644 index e9cf5ac8d..000000000 --- a/org.argeo.security.ui.admin/META-INF/spring/editors.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - 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 index 000000000..d680910fd --- /dev/null +++ b/org.argeo.security.ui.admin/META-INF/spring/parts.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + \ 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/internal/parts/GroupsView.java b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java new file mode 100644 index 000000000..62990baae --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/GroupsView.java @@ -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 columnDefs = new ArrayList(); + + 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 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 users = new ArrayList(); + 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 index 000000000..15bdf4a60 --- /dev/null +++ b/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/parts/UsersView.java @@ -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 columnDefs = new ArrayList(); + + 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 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 users = new ArrayList(); + 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 index 74d2c995d..000000000 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/GroupsView.java +++ /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 columnDefs = new ArrayList(); - - @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 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 users = new ArrayList(); - 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 index a14e2b42f..000000000 --- a/org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/views/UsersView.java +++ /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 columnDefs = new ArrayList(); - - @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 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 users = new ArrayList(); - 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