cmswebdavservlet.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,879 行 · 第 1/5 页
JAVA
1,879 行
IOException exception = null;
while ((exception == null) && (ranges.hasNext())) {
InputStream resourceInputStream = new ByteArrayInputStream(item.getContent());
InputStream istream = new BufferedInputStream(resourceInputStream, m_input);
CmsWebdavRange currentRange = (CmsWebdavRange)ranges.next();
// Writing MIME header.
ostream.println();
ostream.println("--" + MIME_SEPARATION);
if (contentType != null) {
ostream.println("Content-Type: " + contentType);
}
ostream.println("Content-Range: bytes "
+ currentRange.getStart()
+ "-"
+ currentRange.getEnd()
+ "/"
+ currentRange.getLength());
ostream.println();
// Printing content
exception = copyRange(istream, ostream, currentRange.getStart(), currentRange.getEnd());
try {
istream.close();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_CLOSE_INPUT_STREAM_0), e);
}
}
}
ostream.println();
ostream.print("--" + MIME_SEPARATION + "--");
// Rethrow any exception that has occurred
if (exception != null) {
throw exception;
}
}
/**
* Copy the contents of the specified input stream to the specified
* output stream, and ensure that both streams are closed before returning
* (even in the face of an exception).<p>
*
* @param istream the input stream to read from
* @param ostream the output stream to write to
*
* @return the exception which occurred during processing
*/
protected IOException copyRange(InputStream istream, ServletOutputStream ostream) {
// Copy the input stream to the output stream
IOException exception = null;
byte[] buffer = new byte[m_input];
int len = buffer.length;
while (true) {
try {
len = istream.read(buffer);
if (len == -1) {
break;
}
ostream.write(buffer, 0, len);
} catch (IOException e) {
exception = e;
len = -1;
break;
}
}
return exception;
}
/**
* Copy the contents of the specified input stream to the specified
* output stream, and ensure that both streams are closed before returning
* (even in the face of an exception).<p>
*
* @param istream the input stream to read from
* @param ostream the output stream to write to
* @param start the start of the range which will be copied
* @param end the end of the range which will be copied
*
* @return the exception which occurred during processing
*/
protected IOException copyRange(InputStream istream, ServletOutputStream ostream, long start, long end) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_SERVE_BYTES_2, new Long(start), new Long(end)));
}
try {
istream.skip(start);
} catch (IOException e) {
return e;
}
IOException exception = null;
long bytesToRead = end - start + 1;
byte[] buffer = new byte[m_input];
int len = buffer.length;
while ((bytesToRead > 0) && (len >= buffer.length)) {
try {
len = istream.read(buffer);
if (bytesToRead >= len) {
ostream.write(buffer, 0, len);
bytesToRead -= len;
} else {
ostream.write(buffer, 0, (int)bytesToRead);
bytesToRead = 0;
}
} catch (IOException e) {
exception = e;
len = -1;
}
if (len < buffer.length) {
break;
}
}
return exception;
}
/**
* Copy the contents of the specified input stream to the specified
* output stream, and ensure that both streams are closed before returning
* (even in the face of an exception).<p>
*
* @param reader the reader to read from
* @param writer the writer to write to
*
* @return the exception which occurred during processing
*/
protected IOException copyRange(Reader reader, PrintWriter writer) {
// Copy the input stream to the output stream
IOException exception = null;
char[] buffer = new char[m_input];
int len = buffer.length;
while (true) {
try {
len = reader.read(buffer);
if (len == -1) {
break;
}
writer.write(buffer, 0, len);
} catch (IOException e) {
exception = e;
len = -1;
break;
}
}
return exception;
}
/**
* Copy the contents of the specified input stream to the specified
* output stream, and ensure that both streams are closed before returning
* (even in the face of an exception).<p>
*
* @param reader the reader to read from
* @param writer the writer to write to
* @param start the start of the range which will be copied
* @param end the end of the range which will be copied
*
* @return the exception which occurred during processing
*/
protected IOException copyRange(Reader reader, PrintWriter writer, long start, long end) {
try {
reader.skip(start);
} catch (IOException e) {
return e;
}
IOException exception = null;
long bytesToRead = end - start + 1;
char[] buffer = new char[m_input];
int len = buffer.length;
while ((bytesToRead > 0) && (len >= buffer.length)) {
try {
len = reader.read(buffer);
if (bytesToRead >= len) {
writer.write(buffer, 0, len);
bytesToRead -= len;
} else {
writer.write(buffer, 0, (int)bytesToRead);
bytesToRead = 0;
}
} catch (IOException e) {
exception = e;
len = -1;
}
if (len < buffer.length) {
break;
}
}
return exception;
}
/**
* Process a COPY 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 doCopy(HttpServletRequest req, HttpServletResponse resp) {
// Check if webdav is set to 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;
}
// Get the source path to copy
String src = getRelativePath(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;
}
// Get the destination path to copy to
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);
// 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);
}
// Copying source to destination
try {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_COPY_ITEM_2, src, dest));
}
m_session.copy(src, dest, overwrite);
} 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) {
// should never happen
resp.setStatus(CmsWebdavStatus.SC_PRECONDITION_FAILED);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_EXISTS_1, dest));
}
return;
} catch (CmsVfsResourceNotFoundException rnfex) {
// should never happen
resp.setStatus(CmsWebdavStatus.SC_NOT_FOUND);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_NOT_FOUND_1, src));
}
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, "COPY", src), ex);
}
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_COPY_SUCCESS_0));
}
}
/**
* Process a DELETE 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 doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// Get the path to delete
String path = getRelativePath(req);
// Check if webdav is set to 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 path exists
boolean exists = m_session.exists(path);
if (!exists) {
resp.setStatus(CmsWebdavStatus.SC_NOT_FOUND);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ITEM_NOT_FOUND_1, path));
}
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?