1 package com.ibm.webdav.protocol.http; 2 3 17 import java.io.*; 18 import java.util.logging.*; 19 20 import javax.servlet.http.*; 21 import javax.xml.parsers.*; 22 23 import org.w3c.dom.*; 24 25 import com.ibm.webdav.*; 26 import com.ibm.webdav.impl.*; 27 28 31 public class LockMethod extends WebDAVMethod { 32 33 private static Logger m_logger = Logger.getLogger(LockMethod.class.getName()); 34 35 40 public LockMethod(HttpServletRequest request, HttpServletResponse response) throws WebDAVException { 41 super(request, response); 42 methodName = "LOCK"; 43 } 44 47 public WebDAVStatus execute() { 48 49 try { 50 setStatusCode(WebDAVStatus.SC_OK); 51 52 String depth = context.getRequestContext().depth(); 54 if (depth == null) { 55 depth = Collection.deep; 56 } 57 if (!(depth.equals(Collection.shallow) || depth.equals(Collection.deep))) { 58 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, "Depth header must be 0 or infinity"); 59 } 60 61 int timeout = context.getRequestContext().getTimeout(); 62 context.setMethodName(methodName); 63 String lockToken = null; 64 Precondition precondition = context.getRequestContext().precondition(); 65 if (precondition != null) { 66 lockToken = context.getRequestContext().precondition().toString(); 67 } 68 if (lockToken != null && lockToken.length() > 2) { 69 lockToken = lockToken.substring(2, lockToken.length() - 2); 71 } 72 73 Element lockinfo = null; 76 if (lockToken == null) { 80 WebDAVErrorHandler errorHandler = new WebDAVErrorHandler(resource.getURL().toString()); 81 85 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 86 factory.setNamespaceAware(true); 87 DocumentBuilder docbuilder = factory.newDocumentBuilder(); 88 docbuilder.setErrorHandler(errorHandler); 89 90 Document contents = docbuilder.parse(new org.xml.sax.InputSource (request.getReader())); 91 if (errorHandler.getErrorCount() > 0) { 92 throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, "Syntax error in LOCK request entity body"); 93 } 94 lockinfo = (Element) contents.getDocumentElement(); 95 } 96 97 98 99 MultiStatus multiStatus = null; 100 if (lockinfo != null) { 102 103 Element lockscope = (Element)lockinfo.getElementsByTagNameNS("DAV:","lockscope").item(0); 104 105 106 107 String type = null; 108 Element locktype = (Element)lockinfo.getElementsByTagNameNS("DAV:", "locktype").item(0); 109 String scope = null; 110 if (lockscope != null) { 111 if (lockscope.getElementsByTagNameNS("DAV:", "exclusive").item(0) != null) { 112 scope = ActiveLock.exclusive; 113 } else 114 if (lockscope.getElementsByTagNameNS("DAV:", "shared").item(0) != null) { 115 scope = ActiveLock.shared; 116 } 117 } 118 119 if (locktype != null) { 120 if (locktype.getElementsByTagNameNS("DAV:", "write").item(0) != null) { 121 type = ActiveLock.writeLock; 122 } 123 } 124 Element owner = (Element)lockinfo.getElementsByTagNameNS("DAV:", "owner").item(0); 125 if (resource.exists() && resource.isCollection()) { 126 multiStatus = ((CollectionImpl) resource).lock(context, scope, type, timeout, owner, depth); 127 } else { 128 multiStatus = resource.lock(context, scope, type, timeout, owner); 129 } 130 131 } else { 132 133 if (lockToken != null) { multiStatus = resource.refreshLock(context, lockToken, timeout); 135 } else { throw new WebDAVException(WebDAVStatus.SC_BAD_REQUEST, "LOCK missing Lock-Token header or bad LOCK request entity body"); 137 } 138 139 } 140 if (multiStatus.getResponses().hasMoreElements()) { 141 context.getResponseContext().contentType("text/xml"); 142 setResponseHeaders(); 143 144 Document results = null; 150 if (depth.equals(Collection.shallow)) { 151 results = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 152 Element prop = results.createElementNS("DAV:","D:prop"); 154 prop.setAttribute("xmlns:D", "DAV:"); 155 results.appendChild(prop); 156 PropertyResponse response = (PropertyResponse) multiStatus.getResponses().nextElement(); 158 PropertyValue lockDiscovery = response.getProperty( PropertyName.pnLockdiscovery ); 159 if (lockDiscovery != null) { 160 prop.appendChild(results.importNode(lockDiscovery.value,true)); 161 } 162 } else { 163 setStatusCode(WebDAVStatus.SC_MULTI_STATUS); 164 results = (Document) multiStatus.asXML(); 165 } 166 PrintWriter pout = new PrintWriter(response.getWriter(), false); 168 pout.print(XMLUtility.printNode(results.getDocumentElement())); 169 pout.close(); 171 } else { 172 setResponseHeaders(); 173 } 174 } catch (WebDAVException exc) { 175 m_logger.log(Level.INFO, exc.getLocalizedMessage() + " - " + request.getQueryString()); 176 setStatusCode(exc.getStatusCode()); 177 } catch (Exception exc) { 178 m_logger.log(Level.WARNING, exc.getMessage(), exc); 179 setStatusCode(WebDAVStatus.SC_INTERNAL_SERVER_ERROR); 180 } 181 return context.getStatusCode(); 182 } 183 } 184 | Popular Tags |