cmswebdavservlet.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,879 行 · 第 1/5 页
JAVA
1,879 行
/** Secret information used to generate reasonably secure lock ids. */
private String m_secret = "catalina";
/** The session which handles the action made with WebDAV. */
private I_CmsRepositorySession m_session;
/** The name of the user found in the authorization header. */
private String m_username = null;
static {
URL_SAFE_CHARS = new BitSet();
URL_SAFE_CHARS.set('a', 'z' + 1);
URL_SAFE_CHARS.set('A', 'Z' + 1);
URL_SAFE_CHARS.set('0', '9' + 1);
URL_SAFE_CHARS.set('-');
URL_SAFE_CHARS.set('_');
URL_SAFE_CHARS.set('.');
URL_SAFE_CHARS.set('*');
URL_SAFE_CHARS.set('/');
URL_SAFE_CHARS.set(':');
ISO8601_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
ISO8601_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));
HTTP_DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.US);
HTTP_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT"));
}
/**
* Adds an xml element to the given parent and sets the appropriate namespace and
* prefix.<p>
*
* @param parent the parent node to add the element
* @param name the name of the new element
*
* @return the created element with the given name which was added to the given parent
*/
public static Element addElement(Element parent, String name) {
return parent.addElement(new QName(name, Namespace.get("D", DEFAULT_NAMESPACE)));
}
/**
* Initialize this servlet.<p>
*
* @throws ServletException if something goes wrong
*/
public void init() throws ServletException {
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(Messages.LOG_INIT_WEBDAV_SERVLET_0));
}
String value = null;
// init parameter: listings
try {
value = getServletConfig().getInitParameter(INIT_PARAM_LIST);
if (value != null) {
m_listings = Boolean.valueOf(value).booleanValue();
}
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(
Messages.get().getBundle().key(Messages.LOG_READ_INIT_PARAM_ERROR_2, INIT_PARAM_LIST, value),
e);
}
}
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_READ_INIT_PARAM_2,
INIT_PARAM_LIST,
Boolean.valueOf(m_listings)));
}
// init parameter: read only
try {
value = getServletConfig().getInitParameter(INIT_PARAM_READONLY);
if (value != null) {
m_readOnly = Boolean.valueOf(value).booleanValue();
}
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(
Messages.LOG_READ_INIT_PARAM_ERROR_2,
INIT_PARAM_READONLY,
value), e);
}
}
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_READ_INIT_PARAM_2,
INIT_PARAM_READONLY,
Boolean.valueOf(m_readOnly)));
}
// Load the MD5 helper used to calculate signatures.
try {
m_md5Helper = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_MD5_NOT_AVAILABLE_0), e);
}
throw new UnavailableException(Messages.get().getBundle().key(Messages.ERR_MD5_NOT_AVAILABLE_0));
}
// Instantiate repository from init-param
String repositoryName = getInitParameter(INIT_PARAM_REPOSITORY);
if (repositoryName == null) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_INIT_PARAM_MISSING_1, INIT_PARAM_REPOSITORY));
}
throw new ServletException(Messages.get().getBundle().key(
Messages.ERR_INIT_PARAM_MISSING_1,
INIT_PARAM_REPOSITORY));
}
m_repository = OpenCms.getRepositoryManager().getRepository(repositoryName);
if (m_repository == null) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_REPOSITORY_NOT_FOUND_1, repositoryName));
}
throw new ServletException(Messages.get().getBundle().key(
Messages.ERR_REPOSITORY_NOT_FOUND_1,
repositoryName));
}
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(Messages.LOG_USE_REPOSITORY_1, repositoryName));
}
}
/**
* 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 item the RepositoryItem
* @param is the input stream to copy from
* @param writer the writer to write to
*
* @throws IOException if an input/output error occurs
*/
protected void copy(I_CmsRepositoryItem item, InputStream is, PrintWriter writer) throws IOException {
IOException exception = null;
InputStream resourceInputStream = null;
if (!item.isCollection()) {
resourceInputStream = new ByteArrayInputStream(item.getContent());
} else {
resourceInputStream = is;
}
Reader reader = new InputStreamReader(resourceInputStream);
// Copy the input stream to the output stream
exception = copyRange(reader, writer);
// Clean up the reader
try {
reader.close();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_CLOSE_READER_0), e);
}
}
// 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 item the RepositoryItem
* @param is the input stream to copy from
* @param ostream the output stream to write to
*
* @throws IOException if an input/output error occurs
*/
protected void copy(I_CmsRepositoryItem item, InputStream is, ServletOutputStream ostream) throws IOException {
IOException exception = null;
InputStream resourceInputStream = null;
// Optimization: If the binary content has already been loaded, send
// it directly
if (!item.isCollection()) {
byte[] buffer = item.getContent();
if (buffer != null) {
ostream.write(buffer, 0, buffer.length);
return;
}
resourceInputStream = new ByteArrayInputStream(item.getContent());
} else {
resourceInputStream = is;
}
InputStream istream = new BufferedInputStream(resourceInputStream, m_input);
// Copy the input stream to the output stream
exception = copyRange(istream, ostream);
// Clean up the input stream
try {
istream.close();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_CLOSE_INPUT_STREAM_0), e);
}
}
// 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 item the RepositoryItem
* @param writer the writer to write to
* @param range the range the client wants to retrieve
*
* @throws IOException if an input/output error occurs
*/
protected void copy(I_CmsRepositoryItem item, PrintWriter writer, CmsWebdavRange range) throws IOException {
IOException exception = null;
InputStream resourceInputStream = new ByteArrayInputStream(item.getContent());
Reader reader = new InputStreamReader(resourceInputStream);
exception = copyRange(reader, writer, range.getStart(), range.getEnd());
// Clean up the input stream
try {
reader.close();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_CLOSE_READER_0), e);
}
}
// 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 item the RepositoryItem
* @param writer the writer to write to
* @param ranges iterator of the ranges the client wants to retrieve
* @param contentType the content type of the resource
*
* @throws IOException if an input/output error occurs
*/
protected void copy(I_CmsRepositoryItem item, PrintWriter writer, Iterator ranges, String contentType)
throws IOException {
IOException exception = null;
while ((exception == null) && (ranges.hasNext())) {
InputStream resourceInputStream = new ByteArrayInputStream(item.getContent());
Reader reader = new InputStreamReader(resourceInputStream);
CmsWebdavRange currentRange = (CmsWebdavRange)ranges.next();
// Writing MIME header.
writer.println();
writer.println("--" + MIME_SEPARATION);
if (contentType != null) {
writer.println("Content-Type: " + contentType);
}
writer.println("Content-Range: bytes "
+ currentRange.getStart()
+ "-"
+ currentRange.getEnd()
+ "/"
+ currentRange.getLength());
writer.println();
// Printing content
exception = copyRange(reader, writer, currentRange.getStart(), currentRange.getEnd());
try {
reader.close();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_CLOSE_READER_0), e);
}
}
}
writer.println();
writer.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 item the RepositoryItem
* @param ostream the output stream to write to
* @param range the range the client wants to retrieve
*
* @throws IOException if an input/output error occurs
*/
protected void copy(I_CmsRepositoryItem item, ServletOutputStream ostream, CmsWebdavRange range) throws IOException {
IOException exception = null;
InputStream resourceInputStream = new ByteArrayInputStream(item.getContent());
InputStream istream = new BufferedInputStream(resourceInputStream, m_input);
exception = copyRange(istream, ostream, range.getStart(), range.getEnd());
// Clean up the input stream
try {
istream.close();
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_CLOSE_INPUT_STREAM_0), e);
}
}
// 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 item the RepositoryItem
* @param ostream the output stream to write to
* @param ranges iterator of the ranges the client wants to retrieve
* @param contentType the content type of the resource
*
* @throws IOException if an input/output error occurs
*/
protected void copy(I_CmsRepositoryItem item, ServletOutputStream ostream, Iterator ranges, String contentType)
throws IOException {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?