cmswebdavservlet.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,879 行 · 第 1/5 页
JAVA
1,879 行
*
* @param req the servlet request we are processing
* @param resp the servlet response we are creating
*
* @throws IOException if an input/output error occurs
*/
protected void doMkcol(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String path = getRelativePath(req);
// Check if Webdav is read only
if (m_readOnly) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_WEBDAV_READ_ONLY_0));
}
resp.setStatus(CmsWebdavStatus.SC_FORBIDDEN);
return;
}
// Check if resource is locked
if (isLocked(req)) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_LOCKED_1, path));
}
resp.setStatus(CmsWebdavStatus.SC_LOCKED);
return;
}
boolean exists = m_session.exists(path);
// Can't create a collection if a resource already exists at the given path
if (exists) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_EXISTS_1, path));
}
// Get allowed methods
StringBuffer methodsAllowed = determineMethodsAllowed(getRelativePath(req));
resp.addHeader(HEADER_ALLOW, methodsAllowed.toString());
resp.setStatus(CmsWebdavStatus.SC_METHOD_NOT_ALLOWED);
return;
}
if (req.getInputStream().available() > 0) {
try {
new SAXReader().read(req.getInputStream());
// TODO: Process this request body (from Apache Tomcat)
resp.setStatus(CmsWebdavStatus.SC_NOT_IMPLEMENTED);
return;
} catch (DocumentException de) {
// Parse error - assume invalid content
resp.setStatus(CmsWebdavStatus.SC_BAD_REQUEST);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_INVALID_CONTENT_0));
}
return;
}
}
// call session to create collection
try {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_CREATE_COLLECTION_0));
}
m_session.create(path);
} catch (CmsVfsResourceAlreadyExistsException raeex) {
// should never happen, because it was checked if the item exists before
resp.setStatus(CmsWebdavStatus.SC_PRECONDITION_FAILED);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_EXISTS_1, path));
}
return;
} catch (CmsSecurityException sex) {
resp.setStatus(CmsWebdavStatus.SC_FORBIDDEN);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_NO_PERMISSION_0));
}
return;
} catch (CmsException ex) {
resp.setStatus(CmsWebdavStatus.SC_INTERNAL_SERVER_ERROR);
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_REPOSITORY_ERROR_2, "MKCOL", path), ex);
}
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_CREATE_SUCCESS_0));
}
resp.setStatus(CmsWebdavStatus.SC_CREATED);
}
/**
* Process a MOVE WebDAV request for the specified resource.<p>
*
* @param req the servlet request we are processing
* @param resp the servlet response we are creating
*/
protected void doMove(HttpServletRequest req, HttpServletResponse resp) {
// Get source path
String src = getRelativePath(req);
// Check if Webdav is read only
if (m_readOnly) {
resp.setStatus(CmsWebdavStatus.SC_FORBIDDEN);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_WEBDAV_READ_ONLY_0));
}
return;
}
// Check if resource is locked
if (isLocked(req)) {
resp.setStatus(CmsWebdavStatus.SC_LOCKED);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_LOCKED_1, src));
}
return;
}
// Parsing destination header
String dest = parseDestinationHeader(req);
if (dest == null) {
resp.setStatus(CmsWebdavStatus.SC_BAD_REQUEST);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_PARSE_DEST_HEADER_0));
}
return;
}
// source and destination are the same
if (dest.equals(src)) {
resp.setStatus(CmsWebdavStatus.SC_FORBIDDEN);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_SRC_DEST_EQUALS_0));
}
return;
}
// Parsing overwrite header
boolean overwrite = parseOverwriteHeader(req);
// Check if source exists
if (!m_session.exists(src)) {
resp.setStatus(CmsWebdavStatus.SC_NOT_FOUND);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_NOT_FOUND_1, src));
}
return;
}
// If the destination exists, then it's a conflict
if ((m_session.exists(dest)) && (!overwrite)) {
resp.setStatus(CmsWebdavStatus.SC_PRECONDITION_FAILED);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_DEST_PATH_EXISTS_1, dest));
}
return;
}
if ((!m_session.exists(dest)) && (overwrite)) {
resp.setStatus(CmsWebdavStatus.SC_CREATED);
}
// trigger move in session handler
try {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_MOVE_ITEM_2, src, dest));
}
m_session.move(src, dest, overwrite);
} catch (CmsVfsResourceNotFoundException rnfex) {
resp.setStatus(CmsWebdavStatus.SC_NOT_FOUND);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_NOT_FOUND_1, src));
}
return;
} catch (CmsSecurityException sex) {
resp.setStatus(CmsWebdavStatus.SC_FORBIDDEN);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_NO_PERMISSION_0));
}
return;
} catch (CmsVfsResourceAlreadyExistsException raeex) {
resp.setStatus(CmsWebdavStatus.SC_PRECONDITION_FAILED);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_EXISTS_1, dest));
}
return;
} catch (CmsException ex) {
resp.setStatus(CmsWebdavStatus.SC_INTERNAL_SERVER_ERROR);
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_REPOSITORY_ERROR_2, "MOVE", src), ex);
}
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_MOVE_ITEM_SUCCESS_0));
}
}
/**
* Process a OPTIONS WebDAV request for the specified resource.<p>
*
* @param req the servlet request we are processing
* @param resp the servlet response we are creating
*/
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) {
resp.addHeader("DAV", "1,2");
StringBuffer methodsAllowed = determineMethodsAllowed(getRelativePath(req));
resp.addHeader(HEADER_ALLOW, methodsAllowed.toString());
resp.addHeader("MS-Author-Via", "DAV");
}
/**
* Process a PROPFIND WebDAV request for the specified resource.<p>
*
* @param req the servlet request we are processing
* @param resp the servlet response we are creating
*
* @throws IOException if an input/output error occurs
*/
protected void doPropfind(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String path = getRelativePath(req);
if (!m_listings) {
// Get allowed methods
StringBuffer methodsAllowed = determineMethodsAllowed(getRelativePath(req));
resp.addHeader(HEADER_ALLOW, methodsAllowed.toString());
resp.setStatus(CmsWebdavStatus.SC_METHOD_NOT_ALLOWED);
return;
}
// Properties which are to be displayed.
List properties = new Vector();
// Propfind depth
int depth = CmsRepositoryLockInfo.DEPTH_INFINITY_VALUE;
// Propfind type
int type = FIND_ALL_PROP;
String depthStr = req.getHeader(HEADER_DEPTH);
if (depthStr == null) {
depth = CmsRepositoryLockInfo.DEPTH_INFINITY_VALUE;
} else {
if (depthStr.equals("0")) {
depth = 0;
} else if (depthStr.equals("1")) {
depth = 1;
} else if (depthStr.equalsIgnoreCase(DEPTH_INFINITY)) {
depth = CmsRepositoryLockInfo.DEPTH_INFINITY_VALUE;
}
}
Element propNode = null;
try {
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(req.getInputStream());
// Get the root element of the document
Element rootElement = document.getRootElement();
Iterator iter = rootElement.elementIterator();
while (iter.hasNext()) {
Element currentElem = (Element)iter.next();
switch (currentElem.getNodeType()) {
case Node.TEXT_NODE:
break;
case Node.ELEMENT_NODE:
if (currentElem.getName().endsWith("prop")) {
type = FIND_BY_PROPERTY;
propNode = currentElem;
}
if (currentElem.getName().endsWith("propname")) {
type = FIND_PROPERTY_NAMES;
}
if (currentElem.getName().endsWith("allprop")) {
type = FIND_ALL_PROP;
}
break;
default:
break;
}
}
} catch (Exception e) {
// Most likely there was no content : we use the defaults.
}
if (propNode != null) {
if (type == FIND_BY_PROPERTY) {
Iterator iter = propNode.elementIterator();
while (iter.hasNext()) {
Element currentElem = (Element)iter.next();
switch (currentElem.getNodeType()) {
case Node.TEXT_NODE:
break;
case Node.ELEMENT_NODE:
String nodeName = currentElem.getName();
String propertyName = null;
if (nodeName.indexOf(':') != -1) {
propertyName = nodeName.substring(nodeName.indexOf(':') + 1);
} else {
propertyName = nodeName;
}
// href is a live property which is handled differently
properties.add(propertyName);
break;
default:
break;
}
}
}
}
bo
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?