1 14 15 package com.ibm.webdav.protocol.http; 16 17 18 import com.ibm.webdav.*; 19 import com.ibm.webdav.impl.*; 20 import com.ibm.webdav.impl.ResourceImpl; 21 22 import javax.servlet.http.*; 23 import javax.xml.parsers.*; 24 import javax.xml.parsers.DocumentBuilderFactory ; 25 26 import java.io.*; 27 import java.util.Enumeration ; 28 import org.w3c.dom.*; 29 30 36 public class BindMethod extends WebDAVMethod { 37 46 public BindMethod(HttpServletRequest request, HttpServletResponse response) 47 throws WebDAVException { 48 super(request, response); 49 methodName = "BIND"; 50 } 51 52 57 public WebDAVStatus execute() { 58 setStatusCode(WebDAVStatus.SC_CREATED); MultiStatus multiStatus = null; 60 try { 61 context.setMethodName("BIND"); 62 63 Document contents = null; 64 65 if (context.getRequestContext().contentLength() > 0) { 66 WebDAVErrorHandler errorHandler = new WebDAVErrorHandler( 68 resource.getURL().toString()); 69 70 DocumentBuilderFactory factory = DocumentBuilderFactory 71 .newInstance(); 72 factory.setNamespaceAware(true); 73 74 DocumentBuilder docbuilder = factory.newDocumentBuilder(); 75 docbuilder.setErrorHandler(errorHandler); 76 contents = docbuilder.parse(new org.xml.sax.InputSource (request 77 .getReader())); 78 79 if (errorHandler.getErrorCount() > 0) { 80 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, 81 "Syntax error in PROPFIND request entity body"); 82 } 83 } 84 85 if (contents == null) { 86 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, 87 "No body in request"); 88 } 89 90 Element bindEl = contents.getDocumentElement(); 91 92 if (bindEl.getLocalName().equals("bind") == false) { 93 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, 94 "Invalid root element in request body"); 95 } 96 97 NodeList segmentNL = bindEl.getElementsByTagNameNS("DAV:", 98 "segment"); 99 100 NodeList hrefNL = bindEl.getElementsByTagNameNS("DAV:", "href"); 101 102 if (segmentNL.getLength() != 1 || hrefNL.getLength() != 1) { 103 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, 104 "Invalid request body"); 105 } 106 107 String segment = segmentNL.item(0).getFirstChild().getNodeValue(); 108 109 String href = hrefNL.item(0).getFirstChild().getNodeValue(); 110 111 multiStatus = resource.createBinding(context, segment, href); 112 Enumeration responses = multiStatus.getResponses(); 113 if (responses.hasMoreElements()) { 114 MethodResponse methodResponse = (MethodResponse) responses 115 .nextElement(); 116 if (responses.hasMoreElements()) { 117 context.getResponseContext().contentType("text/xml"); 119 setStatusCode(WebDAVStatus.SC_MULTI_STATUS); 120 setResponseHeaders(); 121 122 Document results = multiStatus.asXML(); 124 if (ResourceImpl.debug) { 126 System.err.println("move results:"); 127 PrintWriter pout = new PrintWriter(System.err); 128 pout.print(XMLUtility.printNode(results 129 .getDocumentElement())); 130 } 132 PrintWriter pout = new PrintWriter(response.getWriter(), 133 false); 134 pout.print(XMLUtility.printNode(results 135 .getDocumentElement())); 136 pout.close(); 138 } else { 139 setStatusCode(methodResponse.getStatus()); 143 setResponseHeaders(); 144 } 145 } else { 146 setResponseHeaders(); 147 } 148 } catch (WebDAVException exc) { 149 setStatusCode(exc.getStatusCode()); 150 151 } catch (Exception exc) { 152 setStatusCode(WebDAVStatus.SC_INTERNAL_SERVER_ERROR); 153 } 154 return context.getStatusCode(); 155 } 156 } | Popular Tags |