1 package com.ibm.webdav.protocol.http; 2 3 17 import java.io.*; 18 import java.util.*; 19 import java.util.logging.*; 20 21 import javax.servlet.http.*; 22 import javax.xml.parsers.*; 23 24 import org.w3c.dom.*; 25 26 import com.ibm.webdav.*; 27 import com.ibm.webdav.Collection; 28 import com.ibm.webdav.impl.*; 29 30 33 public class MoveMethod extends WebDAVMethod { 34 private static Logger m_logger = Logger.getLogger(MoveMethod.class.getName()); 35 36 41 public MoveMethod(HttpServletRequest request, HttpServletResponse response) throws WebDAVException { 42 super(request, response); 43 methodName = "MOVE"; 44 context.setMethodName("MOVE"); 45 } 46 49 public WebDAVStatus execute() { 50 setStatusCode(WebDAVStatus.SC_CREATED); MultiStatus multiStatus = null; 52 try { 53 String destination = context.getRequestContext().destination(); 55 String overwriteString = context.getRequestContext().overwrite(); 56 boolean overwrite = overwriteString != null && overwriteString.equals("T"); 57 String depth = context.getRequestContext().depth(); 58 if (depth == null) { 59 depth = Collection.deep; 60 } 61 if (!depth.equals(Collection.deep)) { 62 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, "Depth header must be infinity if present"); 63 } 64 65 Vector propertiesToMove = null; 68 if (request.getContentLength() > 0) { 69 WebDAVErrorHandler errorHandler = new WebDAVErrorHandler(resource.getURL().toString()); 70 74 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 75 factory.setNamespaceAware(true); 76 DocumentBuilder docbuilder = factory.newDocumentBuilder(); 77 docbuilder.setErrorHandler(errorHandler); 78 Document document = docbuilder.parse(new org.xml.sax.InputSource (request.getReader())); 79 if (errorHandler.getErrorCount() > 0) { 80 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, "Syntax error in MOVE request entity body"); 81 } 82 Element propertybehavior = (Element) document.getDocumentElement(); 83 Element keepalive = (Element) propertybehavior.getElementsByTagNameNS("DAV:", "keepalive").item(0); 84 if (keepalive != null) { 85 propertiesToMove = new Vector(); 86 NodeList hrefs = keepalive.getElementsByTagNameNS("DAV:", "href"); 87 Element href = null; 88 for (int i = 0; i < hrefs.getLength(); i++) { 89 href = (Element) hrefs.item(i); 90 String propertyURI = ((Text) href.getFirstChild()).getData(); 91 propertiesToMove.addElement(propertyURI); 92 } 93 } 94 } context.setMethodName("MOVE"); 96 multiStatus = resource.move(context, destination, overwrite, propertiesToMove); 97 Enumeration responses = multiStatus.getResponses(); 98 if (responses.hasMoreElements()) { 99 MethodResponse methodResponse = (MethodResponse) responses.nextElement(); 100 if (responses.hasMoreElements()) { 101 context.getResponseContext().contentType("text/xml"); 103 setStatusCode(WebDAVStatus.SC_MULTI_STATUS); 104 setResponseHeaders(); 105 106 Document results = multiStatus.asXML(); 108 if (ResourceImpl.debug) { 110 System.err.println("move results:"); 111 PrintWriter pout = new PrintWriter(System.err); 112 pout.print(XMLUtility.printNode(results.getDocumentElement())); 113 } 115 PrintWriter pout = new PrintWriter(response.getWriter(), false); 116 pout.print(XMLUtility.printNode(results.getDocumentElement())); 117 pout.close(); 119 } else { 120 setStatusCode(methodResponse.getStatus()); 123 setResponseHeaders(); 124 } 125 } else { 126 setResponseHeaders(); 127 } 128 } catch (WebDAVException exc) { 129 m_logger.log(Level.INFO, exc.getLocalizedMessage() + " - " + request.getQueryString()); 130 setStatusCode(exc.getStatusCode()); 131 132 } catch (Exception exc) { 133 m_logger.log(Level.WARNING, exc.getMessage(), exc); 134 setStatusCode(WebDAVStatus.SC_INTERNAL_SERVER_ERROR); 135 } 136 return context.getStatusCode(); 137 } 138 } 139 | Popular Tags |