juergen 02/04/03 04:01:38 Modified: src/webdav/server/org/apache/slide/webdav/method DeleteMethod.java Log: Implemented deltaV precondition DAV:no-version-delete. (ralf) Revision Changes Path 1.15 +86 -8 jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/DeleteMethod.java Index: DeleteMethod.java =================================================================== RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/DeleteMethod.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- DeleteMethod.java 28 Mar 2002 06:12:12 -0000 1.14 +++ DeleteMethod.java 3 Apr 2002 12:01:38 -0000 1.15 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/DeleteMethod.java,v 1.14 2002/03/28 06:12:12 jericho Exp $ - * $Revision: 1.14 $ - * $Date: 2002/03/28 06:12:12 $ + * $Header: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/DeleteMethod.java,v 1.15 2002/04/03 12:01:38 juergen Exp $ + * $Revision: 1.15 $ + * $Date: 2002/04/03 12:01:38 $ * * ==================================================================== * @@ -76,14 +76,25 @@ import org.apache.slide.lock.*; import org.apache.slide.content.*; import org.apache.slide.security.AccessDeniedException; +import org.apache.slide.security.NodePermission; import org.apache.slide.structure.*; +import org.apache.slide.webdav.util.PreconditionViolationException; +import org.apache.slide.webdav.util.ViolatedPrecondition; +import org.apache.slide.webdav.util.UriHandler; +import org.apache.slide.webdav.util.DeltavConstants; +import org.apache.slide.webdav.util.XMLValue; + +import org.jdom.Element; +import org.jdom.JDOMException; + +import org.jdom.output.XMLOutputter; /** * DELETE method. * * @author <a href="mailto:[EMAIL PROTECTED]">Remy Maucherat</a> */ -public class DeleteMethod extends AbstractMultistatusResponseMethod { +public class DeleteMethod extends AbstractMultistatusResponseMethod implements DeltavConstants, DeleteListener { // ----------------------------------------------------- Instance Variables @@ -94,6 +105,21 @@ */ private String toDelete; + /** + * The NodeRevisionDescriptors of the history of the deleted version. + */ + protected NodeRevisionDescriptors historyNrds = null; + + /** + * Indicates if the resource to delete is a collection. + */ + protected boolean isCollection = false; + + /** + * The UriHandler used by method {@link #beforeDelete beforeDelete()} and + * {@link #afterDelete afterDelete()}. + */ + protected UriHandler uriHandler = null; // ----------------------------------------------------------- Constructors @@ -139,9 +165,9 @@ // Prevent dirty reads slideToken.setForceStoreEnlistment(true); - boolean isCollection = isCollection(toDelete); + isCollection = isCollection(toDelete); try { - macro.delete(slideToken, toDelete); + macro.delete(slideToken, toDelete, this); resp.setStatus(WebdavStatus.SC_NO_CONTENT); } catch (DeleteMacroException dme) { // If it's not a collection, we don't want to give a 207, @@ -152,6 +178,7 @@ // Write it on the servlet writer resp.setStatus(WebdavStatus.SC_MULTI_STATUS); try { + resp.setContentType(TEXT_XML_UTF_8); resp.getWriter().write(errorMessage); } catch(IOException ex) { // Critical error ... Servlet container is dead or something @@ -163,8 +190,21 @@ // Returning 207 on non-collection requests is generally // considered bad. So let's not do it, since this way // makes clients generally behave better. - resp.setStatus( - getErrorCode((SlideException)dme.enumerateExceptions().nextElement())); + SlideException exception = (SlideException)dme.enumerateExceptions().nextElement(); + resp.setStatus(getErrorCode(exception)); + if (exception instanceof PreconditionViolationException) { + try { + StringWriter stringWriter = new StringWriter(); + new XMLOutputter().output(getPreconditionViolationError((PreconditionViolationException)exception), stringWriter); + resp.setContentType(TEXT_XML_UTF_8); + resp.getWriter().write(stringWriter.toString()); + } catch(IOException ex) { + // Critical error ... Servlet container is dead or something + ex.printStackTrace(); + throw new WebdavException + (WebdavStatus.SC_INTERNAL_SERVER_ERROR); + } + } } // // make sure the transaction is aborted @@ -174,6 +214,44 @@ } } + + // ------------------------------------------------------ Interface DeleteListener + + /** + * This method is called prior to deleting the resource associated by + * the given <code>targetUri</code>. The deletion can be prohibited by + * throwing a SlideException. + * + * @param targetUri the Uri of the resource that will be deleted. + * + * @throws SlideException this Exception will be passed to the caller + * of the Macro helper (contained in the + * MacroDeleteException. + */ + public void beforeDelete(String targetUri) throws SlideException { + + uriHandler = UriHandler.getUriHandler(token, targetUri); + if (uriHandler.isVersionUri() && !isCollection) { + // delete of version is only allowed if the history collection is deleted + throw new PreconditionViolationException(new ViolatedPrecondition(C_NO_VERSION_DELETE, + WebdavStatus.SC_FORBIDDEN), + targetUri); + } + } + + /** + * This method is called after deleting the resource associated by + * the given <code>targetUri</code>. + * + * @param targetUri the Uri of the resource that will be deleted. + * + * @throws SlideException this Exception will be passed to the caller + * of the Macro helper (contained in the + * MacroDeleteException. + */ + public void afterDelete(String targetUri) throws SlideException { + } + }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>