This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 7.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit e25eb1550f2d5df7b1fb8b0fc30a3e0923977fe1 Author: Mark Thomas <ma...@apache.org> AuthorDate: Mon Jul 29 21:30:19 2019 +0100 Refactor to remove duplicate code --- .../apache/catalina/servlets/WebdavServlet.java | 417 ++++++--------------- 1 file changed, 105 insertions(+), 312 deletions(-) diff --git a/java/org/apache/catalina/servlets/WebdavServlet.java b/java/org/apache/catalina/servlets/WebdavServlet.java index 2b677d3..54ef218 100644 --- a/java/org/apache/catalina/servlets/WebdavServlet.java +++ b/java/org/apache/catalina/servlets/WebdavServlet.java @@ -2110,13 +2110,6 @@ public class WebdavServlet extends DefaultServlet { return; } - generatedXML.writeElement("D", "response", XMLWriter.OPENING); - String status = "HTTP/1.1 " + WebdavStatus.SC_OK + " " + - WebdavStatus.getStatusText(WebdavStatus.SC_OK); - - // Generating href element - generatedXML.writeElement("D", "href", XMLWriter.OPENING); - String href = req.getContextPath() + req.getServletPath(); if ((href.endsWith("/")) && (path.startsWith("/"))) href += path.substring(1); @@ -2125,246 +2118,12 @@ public class WebdavServlet extends DefaultServlet { if ((cacheEntry.context != null) && (!href.endsWith("/"))) href += "/"; - generatedXML.writeText(rewriteUrl(href)); - - generatedXML.writeElement("D", "href", XMLWriter.CLOSING); - - String resourceName = path; - int lastSlash = path.lastIndexOf('/'); - if (lastSlash != -1) - resourceName = resourceName.substring(lastSlash + 1); - - switch (type) { - - case FIND_ALL_PROP : - - generatedXML.writeElement("D", "propstat", XMLWriter.OPENING); - generatedXML.writeElement("D", "prop", XMLWriter.OPENING); - - generatedXML.writeProperty("D", "creationdate", - getISOCreationDate(cacheEntry.attributes.getCreation())); - generatedXML.writeElement("D", "displayname", XMLWriter.OPENING); - generatedXML.writeData(resourceName); - generatedXML.writeElement("D", "displayname", XMLWriter.CLOSING); - if (cacheEntry.resource != null) { - generatedXML.writeProperty - ("D", "getlastmodified", FastHttpDateFormat.formatDate - (cacheEntry.attributes.getLastModified(), null)); - generatedXML.writeProperty - ("D", "getcontentlength", - String.valueOf(cacheEntry.attributes.getContentLength())); - String contentType = getServletContext().getMimeType - (cacheEntry.name); - if (contentType != null) { - generatedXML.writeProperty("D", "getcontenttype", - contentType); - } - generatedXML.writeProperty("D", "getetag", - cacheEntry.attributes.getETag()); - generatedXML.writeElement("D", "resourcetype", - XMLWriter.NO_CONTENT); - } else { - generatedXML.writeElement("D", "resourcetype", - XMLWriter.OPENING); - generatedXML.writeElement("D", "collection", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "resourcetype", - XMLWriter.CLOSING); - } - - generatedXML.writeProperty("D", "source", ""); - - String supportedLocks = "<D:lockentry>" - + "<D:lockscope><D:exclusive/></D:lockscope>" - + "<D:locktype><D:write/></D:locktype>" - + "</D:lockentry>" + "<D:lockentry>" - + "<D:lockscope><D:shared/></D:lockscope>" - + "<D:locktype><D:write/></D:locktype>" - + "</D:lockentry>"; - generatedXML.writeElement("D", "supportedlock", XMLWriter.OPENING); - generatedXML.writeText(supportedLocks); - generatedXML.writeElement("D", "supportedlock", XMLWriter.CLOSING); - - generateLockDiscovery(path, generatedXML); - - generatedXML.writeElement("D", "prop", XMLWriter.CLOSING); - generatedXML.writeElement("D", "status", XMLWriter.OPENING); - generatedXML.writeText(status); - generatedXML.writeElement("D", "status", XMLWriter.CLOSING); - generatedXML.writeElement("D", "propstat", XMLWriter.CLOSING); - - break; - - case FIND_PROPERTY_NAMES : - - generatedXML.writeElement("D", "propstat", XMLWriter.OPENING); - generatedXML.writeElement("D", "prop", XMLWriter.OPENING); - - generatedXML.writeElement("D", "creationdate", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "displayname", XMLWriter.NO_CONTENT); - if (cacheEntry.resource != null) { - generatedXML.writeElement("D", "getcontentlanguage", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getcontentlength", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getcontenttype", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getetag", XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getlastmodified", - XMLWriter.NO_CONTENT); - } - generatedXML.writeElement("D", "resourcetype", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "source", XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "lockdiscovery", - XMLWriter.NO_CONTENT); - - generatedXML.writeElement("D", "prop", XMLWriter.CLOSING); - generatedXML.writeElement("D", "status", XMLWriter.OPENING); - generatedXML.writeText(status); - generatedXML.writeElement("D", "status", XMLWriter.CLOSING); - generatedXML.writeElement("D", "propstat", XMLWriter.CLOSING); - - break; - - case FIND_BY_PROPERTY : - - Vector<String> propertiesNotFound = new Vector<String>(); - - // Parse the list of properties - - generatedXML.writeElement("D", "propstat", XMLWriter.OPENING); - generatedXML.writeElement("D", "prop", XMLWriter.OPENING); - - Enumeration<String> properties = propertiesVector.elements(); - - while (properties.hasMoreElements()) { - - String property = properties.nextElement(); - - if (property.equals("creationdate")) { - generatedXML.writeProperty - ("D", "creationdate", - getISOCreationDate(cacheEntry.attributes.getCreation())); - } else if (property.equals("displayname")) { - generatedXML.writeElement - ("D", "displayname", XMLWriter.OPENING); - generatedXML.writeData(resourceName); - generatedXML.writeElement - ("D", "displayname", XMLWriter.CLOSING); - } else if (property.equals("getcontentlanguage")) { - if (cacheEntry.context != null) { - propertiesNotFound.addElement(property); - } else { - generatedXML.writeElement("D", "getcontentlanguage", - XMLWriter.NO_CONTENT); - } - } else if (property.equals("getcontentlength")) { - if (cacheEntry.context != null) { - propertiesNotFound.addElement(property); - } else { - generatedXML.writeProperty - ("D", "getcontentlength", - (String.valueOf(cacheEntry.attributes.getContentLength()))); - } - } else if (property.equals("getcontenttype")) { - if (cacheEntry.context != null) { - propertiesNotFound.addElement(property); - } else { - generatedXML.writeProperty - ("D", "getcontenttype", - getServletContext().getMimeType - (cacheEntry.name)); - } - } else if (property.equals("getetag")) { - if (cacheEntry.context != null) { - propertiesNotFound.addElement(property); - } else { - generatedXML.writeProperty - ("D", "getetag", cacheEntry.attributes.getETag()); - } - } else if (property.equals("getlastmodified")) { - if (cacheEntry.context != null) { - propertiesNotFound.addElement(property); - } else { - generatedXML.writeProperty - ("D", "getlastmodified", FastHttpDateFormat.formatDate - (cacheEntry.attributes.getLastModified(), null)); - } - } else if (property.equals("resourcetype")) { - if (cacheEntry.context != null) { - generatedXML.writeElement("D", "resourcetype", - XMLWriter.OPENING); - generatedXML.writeElement("D", "collection", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "resourcetype", - XMLWriter.CLOSING); - } else { - generatedXML.writeElement("D", "resourcetype", - XMLWriter.NO_CONTENT); - } - } else if (property.equals("source")) { - generatedXML.writeProperty("D", "source", ""); - } else if (property.equals("supportedlock")) { - supportedLocks = "<D:lockentry>" - + "<D:lockscope><D:exclusive/></D:lockscope>" - + "<D:locktype><D:write/></D:locktype>" - + "</D:lockentry>" + "<D:lockentry>" - + "<D:lockscope><D:shared/></D:lockscope>" - + "<D:locktype><D:write/></D:locktype>" - + "</D:lockentry>"; - generatedXML.writeElement("D", "supportedlock", - XMLWriter.OPENING); - generatedXML.writeText(supportedLocks); - generatedXML.writeElement("D", "supportedlock", - XMLWriter.CLOSING); - } else if (property.equals("lockdiscovery")) { - if (!generateLockDiscovery(path, generatedXML)) - propertiesNotFound.addElement(property); - } else { - propertiesNotFound.addElement(property); - } - - } - - generatedXML.writeElement("D", "prop", XMLWriter.CLOSING); - generatedXML.writeElement("D", "status", XMLWriter.OPENING); - generatedXML.writeText(status); - generatedXML.writeElement("D", "status", XMLWriter.CLOSING); - generatedXML.writeElement("D", "propstat", XMLWriter.CLOSING); - - Enumeration<String> propertiesNotFoundList = - propertiesNotFound.elements(); - - if (propertiesNotFoundList.hasMoreElements()) { - - status = "HTTP/1.1 " + WebdavStatus.SC_NOT_FOUND + " " + - WebdavStatus.getStatusText(WebdavStatus.SC_NOT_FOUND); - - generatedXML.writeElement("D", "propstat", XMLWriter.OPENING); - generatedXML.writeElement("D", "prop", XMLWriter.OPENING); - - while (propertiesNotFoundList.hasMoreElements()) { - generatedXML.writeElement - ("D", propertiesNotFoundList.nextElement(), - XMLWriter.NO_CONTENT); - } - - generatedXML.writeElement("D", "prop", XMLWriter.CLOSING); - generatedXML.writeElement("D", "status", XMLWriter.OPENING); - generatedXML.writeText(status); - generatedXML.writeElement("D", "status", XMLWriter.CLOSING); - generatedXML.writeElement("D", "propstat", XMLWriter.CLOSING); - - } - - break; - - } - - generatedXML.writeElement("D", "response", XMLWriter.CLOSING); + String rewrittenUrl = rewriteUrl(href); + generatePropFindResponse(generatedXML, rewrittenUrl, path, type, propertiesVector, + cacheEntry.context == null, false, cacheEntry.attributes.getCreation(), cacheEntry.attributes.getLastModified(), + cacheEntry.attributes.getContentLength(), getServletContext().getMimeType(cacheEntry.name), + cacheEntry.attributes.getETag()); } @@ -2393,22 +2152,33 @@ public class WebdavServlet extends DefaultServlet { if (lock == null) return; - generatedXML.writeElement("D", "response", XMLWriter.OPENING); - String status = "HTTP/1.1 " + WebdavStatus.SC_OK + " " + - WebdavStatus.getStatusText(WebdavStatus.SC_OK); - - // Generating href element - generatedXML.writeElement("D", "href", XMLWriter.OPENING); - String absoluteUri = req.getRequestURI(); String relativePath = getRelativePath(req); String toAppend = path.substring(relativePath.length()); if (!toAppend.startsWith("/")) toAppend = "/" + toAppend; - generatedXML.writeText(rewriteUrl(RequestUtil.normalize( - absoluteUri + toAppend))); + String rewrittenUrl = rewriteUrl(RequestUtil.normalize( + absoluteUri + toAppend)); + + generatePropFindResponse(generatedXML, rewrittenUrl, path, type, propertiesVector, + true, true, lock.creationDate.getTime(), lock.creationDate.getTime(), + 0, "", ""); + } + + + private void generatePropFindResponse(XMLWriter generatedXML, String rewrittenUrl, + String path, int propFindType, Vector<String> propertiesVector, boolean isFile, + boolean isLockNull, long created, long lastModified, long contentLength, + String contentType, String eTag) { + + generatedXML.writeElement("D", "response", XMLWriter.OPENING); + String status = "HTTP/1.1 " + WebdavStatus.SC_OK + " " + + WebdavStatus.getStatusText(WebdavStatus.SC_OK); + // Generating href element + generatedXML.writeElement("D", "href", XMLWriter.OPENING); + generatedXML.writeText(rewrittenUrl); generatedXML.writeElement("D", "href", XMLWriter.CLOSING); String resourceName = path; @@ -2416,28 +2186,37 @@ public class WebdavServlet extends DefaultServlet { if (lastSlash != -1) resourceName = resourceName.substring(lastSlash + 1); - switch (type) { + switch (propFindType) { case FIND_ALL_PROP : generatedXML.writeElement("D", "propstat", XMLWriter.OPENING); generatedXML.writeElement("D", "prop", XMLWriter.OPENING); - generatedXML.writeProperty("D", "creationdate", - getISOCreationDate(lock.creationDate.getTime())); + generatedXML.writeProperty("D", "creationdate", getISOCreationDate(created)); generatedXML.writeElement("D", "displayname", XMLWriter.OPENING); generatedXML.writeData(resourceName); generatedXML.writeElement("D", "displayname", XMLWriter.CLOSING); - generatedXML.writeProperty("D", "getlastmodified", - FastHttpDateFormat.formatDate - (lock.creationDate.getTime(), null)); - generatedXML.writeProperty("D", "getcontentlength", - String.valueOf(0)); - generatedXML.writeProperty("D", "getcontenttype", ""); - generatedXML.writeProperty("D", "getetag", ""); - generatedXML.writeElement("D", "resourcetype", XMLWriter.OPENING); - generatedXML.writeElement("D", "lock-null", XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "resourcetype", XMLWriter.CLOSING); + if (isFile) { + generatedXML.writeProperty("D", "getlastmodified", + FastHttpDateFormat.formatDate(lastModified, null)); + generatedXML.writeProperty("D", "getcontentlength", Long.toString(contentLength)); + if (contentType != null) { + generatedXML.writeProperty("D", "getcontenttype", contentType); + } + generatedXML.writeProperty("D", "getetag", eTag); + if (isLockNull) { + generatedXML.writeElement("D", "resourcetype", XMLWriter.OPENING); + generatedXML.writeElement("D", "lock-null", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "resourcetype", XMLWriter.CLOSING); + } else { + generatedXML.writeElement("D", "resourcetype", XMLWriter.NO_CONTENT); + } + } else { + generatedXML.writeElement("D", "resourcetype", XMLWriter.OPENING); + generatedXML.writeElement("D", "collection", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "resourcetype", XMLWriter.CLOSING); + } generatedXML.writeProperty("D", "source", ""); @@ -2467,23 +2246,18 @@ public class WebdavServlet extends DefaultServlet { generatedXML.writeElement("D", "propstat", XMLWriter.OPENING); generatedXML.writeElement("D", "prop", XMLWriter.OPENING); - generatedXML.writeElement("D", "creationdate", - XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "creationdate", XMLWriter.NO_CONTENT); generatedXML.writeElement("D", "displayname", XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getcontentlanguage", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getcontentlength", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getcontenttype", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getetag", XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "getlastmodified", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "resourcetype", - XMLWriter.NO_CONTENT); + if (isFile) { + generatedXML.writeElement("D", "getcontentlanguage", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "getcontentlength", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "getcontenttype", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "getetag", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "getlastmodified", XMLWriter.NO_CONTENT); + } + generatedXML.writeElement("D", "resourcetype", XMLWriter.NO_CONTENT); generatedXML.writeElement("D", "source", XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "lockdiscovery", - XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "lockdiscovery", XMLWriter.NO_CONTENT); generatedXML.writeElement("D", "prop", XMLWriter.CLOSING); generatedXML.writeElement("D", "status", XMLWriter.OPENING); @@ -2509,36 +2283,58 @@ public class WebdavServlet extends DefaultServlet { String property = properties.nextElement(); if (property.equals("creationdate")) { - generatedXML.writeProperty("D", "creationdate", - getISOCreationDate(lock.creationDate.getTime())); + generatedXML.writeProperty("D", "creationdate", getISOCreationDate(created)); } else if (property.equals("displayname")) { - generatedXML.writeElement("D", "displayname", - XMLWriter.OPENING); + generatedXML.writeElement("D", "displayname", XMLWriter.OPENING); generatedXML.writeData(resourceName); - generatedXML.writeElement("D", "displayname", - XMLWriter.CLOSING); + generatedXML.writeElement("D", "displayname", XMLWriter.CLOSING); } else if (property.equals("getcontentlanguage")) { - generatedXML.writeElement("D", "getcontentlanguage", - XMLWriter.NO_CONTENT); + if (isFile) { + generatedXML.writeElement("D", "getcontentlanguage", + XMLWriter.NO_CONTENT); + } else { + propertiesNotFound.addElement(property); + } } else if (property.equals("getcontentlength")) { - generatedXML.writeProperty("D", "getcontentlength", - (String.valueOf(0))); + if (isFile) { + generatedXML.writeProperty("D", "getcontentlength", + Long.toString(contentLength)); + } else { + propertiesNotFound.addElement(property); + } } else if (property.equals("getcontenttype")) { - generatedXML.writeProperty("D", "getcontenttype", ""); + if (isFile) { + generatedXML.writeProperty("D", "getcontenttype", contentType); + } else { + propertiesNotFound.addElement(property); + } } else if (property.equals("getetag")) { - generatedXML.writeProperty("D", "getetag", ""); + if (isFile) { + generatedXML.writeProperty("D", "getetag", eTag); + } else { + propertiesNotFound.addElement(property); + } } else if (property.equals("getlastmodified")) { - generatedXML.writeProperty - ("D", "getlastmodified", - FastHttpDateFormat.formatDate - (lock.creationDate.getTime(), null)); + if (isFile) { + generatedXML.writeProperty("D", "getlastmodified", + FastHttpDateFormat.formatDate(lastModified, null)); + } else { + propertiesNotFound.addElement(property); + } } else if (property.equals("resourcetype")) { - generatedXML.writeElement("D", "resourcetype", - XMLWriter.OPENING); - generatedXML.writeElement("D", "lock-null", - XMLWriter.NO_CONTENT); - generatedXML.writeElement("D", "resourcetype", - XMLWriter.CLOSING); + if (isFile) { + if(isLockNull) { + generatedXML.writeElement("D", "resourcetype", XMLWriter.OPENING); + generatedXML.writeElement("D", "lock-null", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "resourcetype", XMLWriter.CLOSING); + } else { + generatedXML.writeElement("D", "resourcetype", XMLWriter.NO_CONTENT); + } + } else { + generatedXML.writeElement("D", "resourcetype", XMLWriter.OPENING); + generatedXML.writeElement("D", "collection", XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", "resourcetype",XMLWriter.CLOSING); + } } else if (property.equals("source")) { generatedXML.writeProperty("D", "source", ""); } else if (property.equals("supportedlock")) { @@ -2549,11 +2345,9 @@ public class WebdavServlet extends DefaultServlet { + "<D:lockscope><D:shared/></D:lockscope>" + "<D:locktype><D:write/></D:locktype>" + "</D:lockentry>"; - generatedXML.writeElement("D", "supportedlock", - XMLWriter.OPENING); + generatedXML.writeElement("D", "supportedlock", XMLWriter.OPENING); generatedXML.writeText(supportedLocks); - generatedXML.writeElement("D", "supportedlock", - XMLWriter.CLOSING); + generatedXML.writeElement("D", "supportedlock", XMLWriter.CLOSING); } else if (property.equals("lockdiscovery")) { if (!generateLockDiscovery(path, generatedXML)) propertiesNotFound.addElement(property); @@ -2580,9 +2374,8 @@ public class WebdavServlet extends DefaultServlet { generatedXML.writeElement("D", "prop", XMLWriter.OPENING); while (propertiesNotFoundList.hasMoreElements()) { - generatedXML.writeElement - ("D", propertiesNotFoundList.nextElement(), - XMLWriter.NO_CONTENT); + generatedXML.writeElement("D", propertiesNotFoundList.nextElement(), + XMLWriter.NO_CONTENT); } generatedXML.writeElement("D", "prop", XMLWriter.CLOSING); --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org