Throw any exceptions thrown unwrapped. This way, the caller knows what it's dealing...
[pithos] / src / gr / ebs / gss / server / webdav / Webdav.java
index 908abc6..4128c96 100644 (file)
@@ -31,6 +31,7 @@ import gr.ebs.gss.server.domain.dto.FileBodyDTO;
 import gr.ebs.gss.server.domain.dto.FileHeaderDTO;
 import gr.ebs.gss.server.domain.dto.FolderDTO;
 import gr.ebs.gss.server.ejb.ExternalAPI;
+import gr.ebs.gss.server.ejb.TransactionHelper;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
@@ -63,6 +64,7 @@ import java.util.Stack;
 import java.util.StringTokenizer;
 import java.util.TimeZone;
 import java.util.Vector;
+import java.util.concurrent.Callable;
 
 import javax.naming.Context;
 import javax.naming.InitialContext;
@@ -350,6 +352,23 @@ public class Webdav extends HttpServlet {
                }
        }
 
+       private void updateAccounting(final User user, final Date date, final long bandwidthDiff) {
+               try {
+                       new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                               @Override
+                               public Void call() throws Exception {
+                                       getService().updateAccounting(user, date, bandwidthDiff);
+                                       return null;
+                               }
+                       });
+               } catch (RuntimeException e) {
+                       throw e;
+               } catch (Exception e) {
+                       // updateAccounting() doesn't throw any checked exceptions
+                       assert false;
+               }
+       }
+
        @Override
        public void service(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException {
                String method = request.getMethod();
@@ -670,7 +689,7 @@ public class Webdav extends HttpServlet {
                        return;
                }
 
-               User user = getUser(req);
+               final User user = getUser(req);
                String path = getRelativePath(req);
                boolean exists = true;
                Object resource = null;
@@ -722,15 +741,14 @@ public class Webdav extends HttpServlet {
                        resourceInputStream = req.getInputStream();
 
                try {
-                       FolderDTO folder = null;
                        Object parent = getService().getResourceAtPath(user.getId(), getParentPath(path), true);
                        if (!(parent instanceof FolderDTO)) {
                                resp.sendError(HttpServletResponse.SC_CONFLICT);
                                return;
                        }
-                       folder = (FolderDTO) parent;
-                       String name = getLastElement(path);
-                       String mimeType = getServletContext().getMimeType(name);
+                       final FolderDTO folder = (FolderDTO) parent;
+                       final String name = getLastElement(path);
+                       final String mimeType = getServletContext().getMimeType(name);
                File uploadedFile = null;
                try {
                                uploadedFile = getService().uploadFile(resourceInputStream, user.getId());
@@ -739,11 +757,23 @@ public class Webdav extends HttpServlet {
                        }
                        // FIXME: Add attributes
                        FileHeaderDTO fileDTO = null;
+                       final FileHeaderDTO f = file;
+                       final File uf = uploadedFile;
                        if (exists)
-                               fileDTO = getService().updateFileContents(user.getId(), file.getId(), mimeType, uploadedFile.length(), uploadedFile.getAbsolutePath());
+                               fileDTO = new TransactionHelper<FileHeaderDTO>().tryExecute(new Callable<FileHeaderDTO>() {
+                                       @Override
+                                       public FileHeaderDTO call() throws Exception {
+                                               return getService().updateFileContents(user.getId(), f.getId(), mimeType, uf.length(), uf.getAbsolutePath());
+                                       }
+                               });
                        else
-                               fileDTO = getService().createFile(user.getId(), folder.getId(), name, mimeType, uploadedFile.length(), uploadedFile.getAbsolutePath());
-                       getService().updateAccounting(user, new Date(), fileDTO.getFileSize());
+                               fileDTO = new TransactionHelper<FileHeaderDTO>().tryExecute(new Callable<FileHeaderDTO>() {
+                                       @Override
+                                       public FileHeaderDTO call() throws Exception {
+                                               return getService().createFile(user.getId(), folder.getId(), name, mimeType, uf.length(), uf.getAbsolutePath());
+                                       }
+                               });
+                       updateAccounting(user, new Date(), fileDTO.getFileSize());
                } catch (ObjectNotFoundException e) {
                        result = false;
                } catch (InsufficientPermissionsException e) {
@@ -761,6 +791,9 @@ public class Webdav extends HttpServlet {
                } catch (DuplicateNameException e) {
                        resp.sendError(HttpServletResponse.SC_CONFLICT);
                        return;
+               } catch (Exception e) {
+                       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path);
+                       return;
                }
 
                if (result) {
@@ -1061,13 +1094,13 @@ public class Webdav extends HttpServlet {
                        resp.sendError(WebdavStatus.SC_LOCKED);
                        return;
                }
-               String path = getRelativePath(req);
+               final String path = getRelativePath(req);
                if (path.toUpperCase().startsWith("/WEB-INF") || path.toUpperCase().startsWith("/META-INF")) {
                        resp.sendError(WebdavStatus.SC_FORBIDDEN);
                        return;
                }
 
-               User user = getUser(req);
+               final User user = getUser(req);
                boolean exists = true;
                try {
                        getService().getResourceAtPath(user.getId(), path, true);
@@ -1120,8 +1153,14 @@ public class Webdav extends HttpServlet {
                }
                try {
                        if (parent instanceof FolderDTO) {
-                               FolderDTO folder = (FolderDTO) parent;
-                               getService().createFolder(user.getId(), folder.getId(), getLastElement(path));
+                               final FolderDTO folder = (FolderDTO) parent;
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().createFolder(user.getId(), folder.getId(), getLastElement(path));
+                                               return null;
+                                       }
+                               });
                        } else {
                                resp.sendError(WebdavStatus.SC_FORBIDDEN, WebdavStatus.getStatusText(WebdavStatus.SC_FORBIDDEN));
                                return;
@@ -1141,6 +1180,9 @@ public class Webdav extends HttpServlet {
                } catch (RpcException e) {
                        resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path);
                        return;
+               } catch (Exception e) {
+                       resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, path);
+                       return;
                }
                resp.setStatus(WebdavStatus.SC_CREATED);
        }
@@ -1892,7 +1934,7 @@ public class Webdav extends HttpServlet {
                                        copy(file, renderResult, ostream, req, null);
                                else
                                        copy(file, renderResult, writer, req, null);
-                               getService().updateAccounting(user, new Date(), contentLength);
+                               updateAccounting(user, new Date(), contentLength);
                        }
                } else {
                        if (ranges == null || ranges.isEmpty())
@@ -1926,7 +1968,7 @@ public class Webdav extends HttpServlet {
                                                copy(file, ostream, range, req, null);
                                        else
                                                copy(file, writer, range, req, null);
-                                       getService().updateAccounting(user, new Date(), contentLength);
+                                       updateAccounting(user, new Date(), contentLength);
                                }
 
                        } else {
@@ -2974,7 +3016,7 @@ public class Webdav extends HttpServlet {
                if (logger.isDebugEnabled())
                        logger.debug("Copy: " + source + " To: " + dest);
 
-               User user = getUser(req);
+               final User user = getUser(req);
                Object object = null;
                try {
                        object = getService().getResourceAtPath(user.getId(), source, true);
@@ -2982,9 +3024,16 @@ public class Webdav extends HttpServlet {
                }
 
                if (object instanceof FolderDTO) {
-                       FolderDTO folder = (FolderDTO) object;
+                       final FolderDTO folder = (FolderDTO) object;
                        try {
-                               getService().copyFolder(user.getId(), folder.getId(), dest);
+                               final String des = dest;
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().copyFolder(user.getId(), folder.getId(), des);
+                                               return null;
+                                       }
+                               });
                        } catch (ObjectNotFoundException e) {
                                errorList.put(dest, new Integer(WebdavStatus.SC_CONFLICT));
                                return false;
@@ -2994,6 +3043,9 @@ public class Webdav extends HttpServlet {
                        } catch (InsufficientPermissionsException e) {
                                errorList.put(dest, new Integer(WebdavStatus.SC_FORBIDDEN));
                                return false;
+                       } catch (Exception e) {
+                               errorList.put(dest, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
+                               return false;
                        }
 
                        try {
@@ -3029,9 +3081,16 @@ public class Webdav extends HttpServlet {
                        }
 
                } else if (object instanceof FileHeaderDTO) {
-                       FileHeaderDTO file = (FileHeaderDTO) object;
+                       final FileHeaderDTO file = (FileHeaderDTO) object;
                        try {
-                               getService().copyFile(user.getId(), file.getId(), dest);
+                               final String des = dest;
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().copyFile(user.getId(), file.getId(), des);
+                                               return null;
+                                       }
+                               });
                        } catch (ObjectNotFoundException e) {
                                errorList.put(source, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
                                return false;
@@ -3047,6 +3106,9 @@ public class Webdav extends HttpServlet {
                        } catch (GSSIOException e) {
                                errorList.put(source, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
                                return false;
+                       } catch (Exception e) {
+                               errorList.put(dest, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
+                               return false;
                        }
                } else {
                        errorList.put(source, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
@@ -3097,7 +3159,7 @@ public class Webdav extends HttpServlet {
                        return false;
                }
 
-               User user = getUser(req);
+               final User user = getUser(req);
                boolean exists = true;
                Object object = null;
                try {
@@ -3123,7 +3185,14 @@ public class Webdav extends HttpServlet {
 
                if (file != null)
                        try {
-                               getService().deleteFile(user.getId(), file.getId());
+                               final FileHeaderDTO f = file;
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().deleteFile(user.getId(), f.getId());
+                                               return null;
+                                       }
+                               });
                        } catch (InsufficientPermissionsException e) {
                                resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED);
                                return false;
@@ -3135,18 +3204,30 @@ public class Webdav extends HttpServlet {
                        } catch (RpcException e) {
                                resp.sendError(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
                                return false;
+                       } catch (Exception e) {
+                               resp.sendError(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
+                               return false;
                        }
                else if (folder != null) {
                        Hashtable<String, Integer> errorList = new Hashtable<String, Integer>();
                        deleteCollection(req, folder, path, errorList);
                        try {
-                               getService().deleteFolder(user.getId(), folder.getId());
+                               final FolderDTO f = folder;
+                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                       @Override
+                                       public Void call() throws Exception {
+                                               getService().deleteFolder(user.getId(), f.getId());
+                                               return null;
+                                       }
+                               });
                        } catch (InsufficientPermissionsException e) {
                                errorList.put(path, new Integer(WebdavStatus.SC_METHOD_NOT_ALLOWED));
                        } catch (ObjectNotFoundException e) {
                                errorList.put(path, new Integer(WebdavStatus.SC_NOT_FOUND));
                        } catch (RpcException e) {
                                errorList.put(path, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
+                       } catch (Exception e) {
+                               errorList.put(path, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
                        }
 
                        if (!errorList.isEmpty()) {
@@ -3197,7 +3278,7 @@ public class Webdav extends HttpServlet {
                                errorList.put(childName, new Integer(WebdavStatus.SC_LOCKED));
                        else
                                try {
-                                       User user = getUser(req);
+                                       final User user = getUser(req);
                                        Object object = getService().getResourceAtPath(user.getId(), childName, true);
                                        FolderDTO childFolder = null;
                                        FileHeaderDTO childFile = null;
@@ -3206,16 +3287,33 @@ public class Webdav extends HttpServlet {
                                        else
                                                childFile = (FileHeaderDTO) object;
                                        if (childFolder != null) {
+                                               final FolderDTO cf = childFolder;
                                                deleteCollection(req, childFolder, childName, errorList);
-                                               getService().deleteFolder(user.getId(), childFolder.getId());
-                                       } else if (childFile != null)
-                                               getService().deleteFile(user.getId(), childFile.getId());
+                                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                                       @Override
+                                                       public Void call() throws Exception {
+                                                               getService().deleteFolder(user.getId(), cf.getId());
+                                                               return null;
+                                                       }
+                                               });
+                                       } else if (childFile != null) {
+                                               final FileHeaderDTO cf = childFile;
+                                               new TransactionHelper<Void>().tryExecute(new Callable<Void>() {
+                                                       @Override
+                                                       public Void call() throws Exception {
+                                                               getService().deleteFile(user.getId(), cf.getId());
+                                                               return null;
+                                                       }
+                                               });
+                                       }
                                } catch (ObjectNotFoundException e) {
                                        errorList.put(childName, new Integer(WebdavStatus.SC_NOT_FOUND));
                                } catch (InsufficientPermissionsException e) {
                                        errorList.put(childName, new Integer(WebdavStatus.SC_FORBIDDEN));
                                } catch (RpcException e) {
                                        errorList.put(childName, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
+                               } catch (Exception e) {
+                                       errorList.put(childName, new Integer(WebdavStatus.SC_INTERNAL_SERVER_ERROR));
                                }
                }
        }