From: Wolfgang M. M. <wol...@us...> - 2004-08-05 12:09:52
|
Update of /cvsroot/exist/eXist-1.0/src/org/exist/http/webdav/methods In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11706/src/org/exist/http/webdav/methods Modified Files: Copy.java Delete.java Mkcol.java Put.java Log Message: Smaller changes to adjust the collection locking. Index: Mkcol.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/http/webdav/methods/Mkcol.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Mkcol.java 25 May 2004 12:52:01 -0000 1.3 --- Mkcol.java 5 Aug 2004 12:09:42 -0000 1.4 *************** *** 86,92 **** Collection parent = broker.getCollection(parentPath); if(parent == null) { ! LOG.debug("parent collection " + parentPath + " not found"); response.sendError(HttpServletResponse.SC_CONFLICT, ! "parent collection not found"); return; } --- 86,92 ---- Collection parent = broker.getCollection(parentPath); if(parent == null) { ! LOG.debug("Parent collection " + parentPath + " not found"); response.sendError(HttpServletResponse.SC_CONFLICT, ! "Parent collection not found"); return; } *************** *** 94,98 **** broker.saveCollection(created); broker.flush(); ! LOG.debug("created collection " + path); response.setStatus(HttpServletResponse.SC_CREATED); } catch(EXistException e) { --- 94,98 ---- broker.saveCollection(created); broker.flush(); ! LOG.debug("Created collection " + path); response.setStatus(HttpServletResponse.SC_CREATED); } catch(EXistException e) { Index: Copy.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/http/webdav/methods/Copy.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Copy.java 3 Aug 2004 16:45:45 -0000 1.3 --- Copy.java 5 Aug 2004 12:09:42 -0000 1.4 *************** *** 155,158 **** --- 155,208 ---- } + private void copyCollection(User user, HttpServletRequest request, HttpServletResponse response, + Collection collection, String destination) + throws ServletException, IOException { + int p = destination.lastIndexOf('/'); + if(p < 0) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + "Bad destination: " + destination); + return; + } + String newCollectionName = destination.substring(p + 1); + destination = destination.substring(0, p); + boolean replaced = false; + DBBroker broker = null; + Collection destCollection = null; + try { + broker = pool.get(user); + destCollection = broker.openCollection(destination, Lock.WRITE_LOCK); + if(destCollection == null) { + response.sendError(HttpServletResponse.SC_CONFLICT, + "Destination collection not found"); + return; + } + if(destCollection.hasChildCollection(newCollectionName)) { + boolean overwrite = overwrite(request); + if(!overwrite) { + response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, + "Destination collection exists and overwrite is not allowed"); + return; + } + replaced = true; + } + + broker.copyCollection(collection, destCollection, newCollectionName); + if(replaced) + response.setStatus(HttpServletResponse.SC_NO_CONTENT); + else + response.setStatus(HttpServletResponse.SC_CREATED); + } catch (EXistException e) { + throw new ServletException(e.getMessage(), e); + } catch (PermissionDeniedException e) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, e.getMessage()); + } catch (LockException e) { + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); + } finally { + if(destCollection != null) + destCollection.release(); + pool.release(broker); + } + } + private boolean overwrite(HttpServletRequest request) { String header = request.getHeader("Overwrite"); Index: Delete.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/http/webdav/methods/Delete.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Delete.java 3 Aug 2004 15:25:58 -0000 1.4 --- Delete.java 5 Aug 2004 12:09:42 -0000 1.5 *************** *** 38,41 **** --- 38,42 ---- import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; + import org.exist.util.Lock; import org.exist.util.LockException; *************** *** 64,74 **** try { broker = pool.get(user); if(resource == null) { broker.removeCollection(collection); } else { if(resource.getResourceType() == DocumentImpl.BINARY_FILE) ! resource.getCollection().removeBinaryResource(broker, resource.getFileName()); else ! resource.getCollection().removeDocument(broker, resource.getFileName()); } } catch (EXistException e) { --- 65,76 ---- try { broker = pool.get(user); + collection.getLock().acquire(Lock.WRITE_LOCK); if(resource == null) { broker.removeCollection(collection); } else { if(resource.getResourceType() == DocumentImpl.BINARY_FILE) ! collection.removeBinaryResource(broker, resource.getFileName()); else ! collection.removeDocument(broker, resource.getFileName()); } } catch (EXistException e) { *************** *** 81,84 **** --- 83,87 ---- response.sendError(HttpServletResponse.SC_CONFLICT, e.getMessage()); } finally { + collection.release(); pool.release(broker); } Index: Put.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/http/webdav/methods/Put.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** Put.java 21 May 2004 08:35:42 -0000 1.3 --- Put.java 5 Aug 2004 12:09:42 -0000 1.4 *************** *** 47,50 **** --- 47,51 ---- import org.exist.storage.BrokerPool; import org.exist.storage.DBBroker; + import org.exist.util.Lock; import org.exist.util.LockException; import org.xml.sax.InputSource; *************** *** 92,96 **** String collectionName = path.substring(0, p); path = path.substring(p + 1); ! collection = broker.getCollection(collectionName); if(collection == null) { response.sendError(HttpServletResponse.SC_CONFLICT, "Parent collection " + collectionName + --- 93,97 ---- String collectionName = path.substring(0, p); path = path.substring(p + 1); ! collection = broker.openCollection(collectionName, Lock.WRITE_LOCK); if(collection == null) { response.sendError(HttpServletResponse.SC_CONFLICT, "Parent collection " + collectionName + *************** *** 98,103 **** return; } ! } else path = path.substring(collection.getName().length() + 1); if(contentType == null) { contentType = URLConnection.guessContentTypeFromName(path); --- 99,106 ---- return; } ! } else { ! collection.getLock().acquire(Lock.WRITE_LOCK); path = path.substring(collection.getName().length() + 1); + } if(contentType == null) { contentType = URLConnection.guessContentTypeFromName(path); *************** *** 129,132 **** --- 132,136 ---- response.sendError(HttpServletResponse.SC_CONFLICT); } finally { + collection.release(); pool.release(broker); } |