Throw any exceptions thrown unwrapped. This way, the caller knows what it's dealing...
[pithos] / src / gr / ebs / gss / server / rest / GroupsHandler.java
index 3f30479..76e148c 100644 (file)
@@ -25,11 +25,13 @@ import gr.ebs.gss.client.exceptions.RpcException;
 import gr.ebs.gss.server.domain.User;
 import gr.ebs.gss.server.domain.dto.GroupDTO;
 import gr.ebs.gss.server.domain.dto.UserDTO;
+import gr.ebs.gss.server.ejb.TransactionHelper;
 
 import java.io.IOException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.util.List;
+import java.util.concurrent.Callable;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -165,17 +167,23 @@ public class GroupsHandler extends RequestHandler {
 
                try {
                User user = getUser(req);
-               User owner = getOwner(req);
+               final User owner = getOwner(req);
                if (!owner.equals(user))
                        throw new InsufficientPermissionsException("User " + user.getUsername()
                                                + " does not have permission to modify the groups owned by "
                                                + owner.getUsername());
                if (path.equals("/")) {
                        // Request to add group
-                       String group = req.getParameter(GROUP_PARAMETER);
+                       final String group = req.getParameter(GROUP_PARAMETER);
                        if (logger.isDebugEnabled())
                                logger.debug("Adding group " + group);
-                                       getService().createGroup(owner.getId(), group);
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                               @Override
+                                               public Void call() throws Exception {
+                                                       getService().createGroup(owner.getId(), group);
+                                                       return null;
+                                               }
+                                       });
                                resp.setStatus(HttpServletResponse.SC_CREATED);
                } else {
                        // Request to add group member
@@ -187,19 +195,27 @@ public class GroupsHandler extends RequestHandler {
                        if (logger.isDebugEnabled())
                                logger.debug("Adding member " + username +
                                                        " to group " + path);
-                       GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8"));
-                       User member = getService().findUser(username);
+                       final GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8"));
+                       final User member = getService().findUser(username);
                        if (member == null) {
                                resp.sendError(HttpServletResponse.SC_NOT_FOUND, "User " + username + " not found");
                                return;
                        }
-                       getService().addUserToGroup(owner.getId(), group.getId(), member.getId());
+                       new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().addUserToGroup(owner.getId(), group.getId(), member.getId());
+                                               return null;
+                                       }
+                               });
                        resp.setStatus(HttpServletResponse.SC_CREATED);
                }
                // Workaround for IE's broken caching behavior.
                        resp.setHeader("Expires", "-1");
                } catch (ObjectNotFoundException e) {
                        resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
+               } catch (IllegalArgumentException e) {
+                       resp.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
                } catch (DuplicateNameException e) {
                        resp.sendError(HttpServletResponse.SC_CONFLICT, e.getMessage());
                } catch (RpcException e) {
@@ -207,7 +223,11 @@ public class GroupsHandler extends RequestHandler {
                        resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                } catch (InsufficientPermissionsException e) {
                        resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getMessage());
+               } catch (Exception e) {
+                       logger.error("", e);
+                       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                }
+
        }
 
        /**
@@ -232,7 +252,7 @@ public class GroupsHandler extends RequestHandler {
                int slash = path.indexOf('/');
                try {
                User user = getUser(req);
-               User owner = getOwner(req);
+               final User owner = getOwner(req);
                if (!owner.equals(user))
                        throw new InsufficientPermissionsException("User " + user.getUsername()
                                                + " does not have permission to modify the groups owned by "
@@ -242,15 +262,27 @@ public class GroupsHandler extends RequestHandler {
                        if (logger.isDebugEnabled())
                                logger.debug("Removing member " + path.substring(slash + 1) +
                                                        " from group " + path.substring(0, slash));
-                       GroupDTO group = getService().getGroup(owner.getId(), path.substring(0, slash));
-                       for (UserDTO u: group.getMembers())
+                       final GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path.substring(0, slash),"UTF-8"));
+                       for (final UserDTO u: group.getMembers())
                                if (u.getUsername().equals(path.substring(slash + 1)))
-                                       getService().removeMemberFromGroup(owner.getId(), group.getId(), u.getId());
+                                       new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                               @Override
+                                               public Void call() throws Exception {
+                                                       getService().removeMemberFromGroup(owner.getId(), group.getId(), u.getId());
+                                                       return null;
+                                               }
+                                       });
                } else {
                        if (logger.isDebugEnabled())
                                logger.debug("Removing group " + path);
-                               GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8"));
-                               getService().deleteGroup(owner.getId(), group.getId());
+                               final GroupDTO group = getService().getGroup(owner.getId(), URLDecoder.decode(path,"UTF-8"));
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().deleteGroup(owner.getId(), group.getId());
+                                               return null;
+                                       }
+                               });
                }
                        resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
                        // Workaround for IE's broken caching behavior.
@@ -262,6 +294,9 @@ public class GroupsHandler extends RequestHandler {
                        resp.sendError(HttpServletResponse.SC_NOT_FOUND, e.getMessage());
                        } catch (InsufficientPermissionsException e) {
                                resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, e.getMessage());
+                       } catch (Exception e) {
+                       logger.error("", e);
+                       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
                        }
        }
        }