X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Finternal%2FUserAdminWrapper.java;fp=org.argeo.security.ui.admin%2Fsrc%2Forg%2Fargeo%2Fsecurity%2Fui%2Fadmin%2Finternal%2FUserAdminWrapper.java;h=d443a3d47ce3c1a4b4e3c8109d7cc02334585796;hb=c13da2a3a91edd21b54db7563727d009def37d3e;hp=8306e155234aedd1f6abc9c1643e40117922b65e;hpb=0d843d64df3f588ad1429905cf5f6e29c65becd3;p=lgpl%2Fargeo-commons.git 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 index 8306e1552..d443a3d47 100644 --- 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 @@ -10,24 +10,27 @@ import org.argeo.cms.CmsException; import org.osgi.service.useradmin.UserAdminEvent; import org.osgi.service.useradmin.UserAdminListener; -/** Centralize interaction with the UserAdmin in this bundle */ +/** Centralise interaction with the UserAdmin in this bundle */ public class UserAdminWrapper extends org.argeo.cms.util.useradmin.UserAdminWrapper { - // private Log log = LogFactory.getLog(UserAdminWrapper.class); + + // First effort to simplify UX while managing users and groups + public final static boolean COMMIT_ON_SAVE = true; // Registered listeners List listeners = new ArrayList(); /** - * Overwrite the normal begin transaction behaviour to also notify the UI. - * Must be called from the UI Thread. + * Starts a transaction if necessary. Should always been called together + * with {@link UserAdminWrapper#commitOrNotifyTransactionStateChange()} once + * the security model changes have been performed. */ public UserTransaction beginTransactionIfNeeded() { try { UserTransaction userTransaction = getUserTransaction(); if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) { userTransaction.begin(); - UiAdminUtils.notifyTransactionStateChange(userTransaction); + // UiAdminUtils.notifyTransactionStateChange(userTransaction); } return userTransaction; } catch (Exception e) { @@ -35,13 +38,33 @@ public class UserAdminWrapper extends } } + /** + * Depending on the current application configuration, it will either commit + * the current transaction or throw a notification that the transaction + * state has changed (In the later case, it must be called from the UI + * thread). + */ + public void commitOrNotifyTransactionStateChange() { + try { + UserTransaction userTransaction = getUserTransaction(); + if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) + return; + + if (UserAdminWrapper.COMMIT_ON_SAVE) + userTransaction.commit(); + else + UiAdminUtils.notifyTransactionStateChange(userTransaction); + } catch (Exception e) { + throw new CmsException("Unable to clean transaction", e); + } + } + // TODO implement safer mechanism public void addListener(UserAdminListener userAdminListener) { if (!listeners.contains(userAdminListener)) listeners.add(userAdminListener); } - // Expose this? public void removeListener(UserAdminListener userAdminListener) { if (listeners.contains(userAdminListener)) listeners.remove(userAdminListener);