killbill-uncached

util: propagate SecurityApiException from DAO transactions Signed-off-by:

1/26/2017 7:15:40 PM

Details

diff --git a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/DefaultUserDao.java b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/DefaultUserDao.java
index 07c8737..7dc71e7 100644
--- a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/DefaultUserDao.java
+++ b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/DefaultUserDao.java
@@ -66,7 +66,7 @@ public class DefaultUserDao implements UserDao {
                                                            password, salt.toBase64(), securityConfig.getShiroNbHashIterations()).toBase64();
 
         final DateTime createdDate = clock.getUTCNow();
-        dbi.inTransaction(new TransactionCallback<Void>() {
+        inTransactionWithExceptionHandling(new TransactionCallback<Void>() {
             @Override
             public Void inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
                 final UserRolesSqlDao userRolesSqlDao = handle.attach(UserRolesSqlDao.class);
@@ -96,9 +96,9 @@ public class DefaultUserDao implements UserDao {
     }
 
     @Override
-    public void addRoleDefinition(final String role, final List<String> permissions, final String createdBy) {
+    public void addRoleDefinition(final String role, final List<String> permissions, final String createdBy)  throws SecurityApiException {
         final DateTime createdDate = clock.getUTCNow();
-        dbi.inTransaction(new TransactionCallback<Void>() {
+        inTransactionWithExceptionHandling(new TransactionCallback<Void>() {
             @Override
             public Void inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
                 final RolesPermissionsSqlDao rolesPermissionsSqlDao = handle.attach(RolesPermissionsSqlDao.class);
@@ -132,7 +132,7 @@ public class DefaultUserDao implements UserDao {
         final String hashedPasswordBase64 = new SimpleHash(KillbillCredentialsMatcher.HASH_ALGORITHM_NAME,
                                                            password, salt.toBase64(), securityConfig.getShiroNbHashIterations()).toBase64();
 
-        dbi.inTransaction(new TransactionCallback<Void>() {
+        inTransactionWithExceptionHandling(new TransactionCallback<Void>() {
             @Override
             public Void inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
 
@@ -150,7 +150,7 @@ public class DefaultUserDao implements UserDao {
 
     @Override
     public void updateUserRoles(final String username, final List<String> roles, final String updatedBy) throws SecurityApiException {
-        dbi.inTransaction(new TransactionCallback<Void>() {
+        inTransactionWithExceptionHandling(new TransactionCallback<Void>() {
             @Override
             public Void inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
                 final DateTime updatedDate = clock.getUTCNow();
@@ -192,7 +192,7 @@ public class DefaultUserDao implements UserDao {
 
     @Override
     public void invalidateUser(final String username, final String updatedBy) throws SecurityApiException {
-        dbi.inTransaction(new TransactionCallback<Void>() {
+        inTransactionWithExceptionHandling(new TransactionCallback<Void>() {
             @Override
             public Void inTransaction(final Handle handle, final TransactionStatus status) throws Exception {
                 final DateTime updatedDate = clock.getUTCNow();
@@ -206,4 +206,24 @@ public class DefaultUserDao implements UserDao {
             }
         });
     }
+
+    private <T> T inTransactionWithExceptionHandling(final TransactionCallback<T> callback) throws SecurityApiException {
+        // Similar to EntitySqlDaoTransactionalJdbiWrapper#execute
+        try {
+            return dbi.inTransaction(callback);
+        } catch (final RuntimeException e) {
+            throwSecurityApiException(e);
+            return null;
+        }
+    }
+
+    private void throwSecurityApiException(final Throwable e) throws SecurityApiException {
+        if (e.getCause() != null && e.getCause().getClass().isAssignableFrom(SecurityApiException.class)) {
+            throw (SecurityApiException) e.getCause();
+        } else if (e.getCause() != null) {
+            throwSecurityApiException(e.getCause());
+        } else {
+            throw e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
+        }
+    }
 }
diff --git a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/UserDao.java b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/UserDao.java
index bb0ab0d..142e13d 100644
--- a/util/src/main/java/org/killbill/billing/util/security/shiro/dao/UserDao.java
+++ b/util/src/main/java/org/killbill/billing/util/security/shiro/dao/UserDao.java
@@ -27,7 +27,7 @@ public interface UserDao {
 
     public List<UserRolesModelDao> getUserRoles(String username);
 
-    public void addRoleDefinition(String role, List<String> permissions, String createdBy);
+    public void addRoleDefinition(String role, List<String> permissions, String createdBy) throws SecurityApiException;
 
     public List<RolesPermissionsModelDao> getRoleDefinition(String role);