/* * ==================================================================== * Copyright (c) 2004-2008 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.server.dav.handlers; import java.util.logging.Level; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.server.dav.DAVDepth; import org.tmatesoft.svn.core.internal.server.dav.DAVException; import org.tmatesoft.svn.core.internal.server.dav.DAVRepositoryManager; import org.tmatesoft.svn.core.internal.server.dav.DAVResource; import org.tmatesoft.svn.core.internal.util.SVNEncodingUtil; import org.tmatesoft.svn.util.SVNDebugLog; import org.tmatesoft.svn.util.SVNLogType; /** * @version 1.2.0 * @author TMate Software Ltd. */ public class DAVDeleteHandler extends ServletDAVHandler { private DAVDeleteRequest myDAVRequest; public DAVDeleteHandler(DAVRepositoryManager repositoryManager, HttpServletRequest request, HttpServletResponse response) { super(repositoryManager, request, response); } public void execute() throws SVNException { readInput(false); DAVResource resource = getRequestedDAVResource(false, false); if (!resource.exists()) { sendError(HttpServletResponse.SC_NOT_FOUND, null); return; } DAVDepth depth = getRequestDepth(DAVDepth.DEPTH_INFINITY); if (resource.isCollection() && depth != DAVDepth.DEPTH_INFINITY) { SVNDebugLog.getDefaultLog().logError(SVNLogType.NETWORK, "Depth must be \"infinity\" for DELETE of a collection."); sendError(HttpServletResponse.SC_BAD_REQUEST, null); return; } if (!resource.isCollection() && depth == DAVDepth.DEPTH_ONE) { SVNDebugLog.getDefaultLog().logError(SVNLogType.NETWORK, "Depth of \"1\" is not allowed for DELETE."); sendError(HttpServletResponse.SC_BAD_REQUEST, null); return; } try { validateRequest(resource, depth, DAV_VALIDATE_PARENT | DAV_VALIDATE_USE_424, null, null, null); } catch (DAVException dave) { throw new DAVException("Could not DELETE {0} due to a failed precondition (e.g. locks).", new Object[] { SVNEncodingUtil.xmlEncodeCDATA(getURI()) }, dave.getResponseCode(), null, SVNLogType.NETWORK, Level.FINE, dave, null, null, 0, dave.getResponse()); } int respCode = unlock(resource, null); if (respCode != HttpServletResponse.SC_OK) { sendError(respCode, null); return; } DAVAutoVersionInfo avInfo = autoCheckOut(resource, true); try { removeResource(resource); } catch (DAVException dave) { autoCheckIn(null, true, false, avInfo); throw new DAVException("Could not DELETE {0}.", new Object[] { SVNEncodingUtil.xmlEncodeCDATA(getURI()) }, dave.getResponseCode(), dave, 0); } try { autoCheckIn(null, false, false, avInfo); } catch (DAVException dave) { //TODO: add better logging here later SVNDebugLog.getDefaultLog().logFine(SVNLogType.NETWORK, "The DELETE was successful, but there was a problem automatically checking in the parent collection."); } setResponseStatus(HttpServletResponse.SC_NO_CONTENT); } protected DAVRequest getDAVRequest() { if (myDAVRequest == null) { myDAVRequest = new DAVDeleteRequest(); } return myDAVRequest; } }