// check lock-null resources
try {
if (isLockNull(resourcePath)) {
int statusCode = WebdavStatus.SC_NOT_FOUND;
sendError( statusCode, "lock-null resource", new Object[]{resourcePath} );
throw new WebdavException( statusCode );
}
}
catch (ServiceAccessException e) {
int statusCode = getErrorCode((Exception)e);
sendError( statusCode, e );
throw new WebdavException( statusCode );
}
try {
// fire put event
if ( WebdavEvent.GET.isEnabled() ) EventDispatcher.getInstance().fireVetoableEvent(WebdavEvent.GET, new WebdavEvent(this));
// Then we must get object contents ...
structure.retrieve(slideToken, resourcePath);
NodeRevisionDescriptors revisionDescriptors =
content.retrieve(slideToken, resourcePath);
if (revisionDescriptors.hasRevisions()) {
// Retrieve latest revision descriptor
NodeRevisionDescriptor revisionDescriptor =
content.retrieve(slideToken, revisionDescriptors);
if (revisionDescriptor != null) {
if (revisionDescriptor.propertyValueContains(
NodeRevisionDescriptor.RESOURCE_TYPE,
NodeRevisionDescriptor.COLLECTION_TYPE)) {
displayDirectory();
} else {
ResourceInfo resourceInfo =
new ResourceInfo(resourcePath, revisionDescriptor);
// Checking If headers
if (!checkIfHeaders(req, resp, resourceInfo))
return;
ServletOutputStream os = resp.getOutputStream();
InputStream is = null;
if (printContent) {
is = content.retrieve
(slideToken, revisionDescriptors,
revisionDescriptor).streamContent();
}
Vector ranges = parseRange(req, resp, resourceInfo);
// ETag header (tag must be quoted)
resp.setHeader("ETag", getETag(resourceInfo, true) );
resp.setHeader
("Content-Language", revisionDescriptor.getContentLanguage());
resp.addHeader
("Last-Modified",
revisionDescriptor.getLastModified().toString());
// do this before setting content length, as Tomcat 5 seems to be picky
// about this
resp.setBufferSize(output);
if ( ((ranges == null) || (ranges.isEmpty())) ) {
// full content response
resp.setContentType
(revisionDescriptor.getContentType());
resp.setContentLength
((int) revisionDescriptor.getContentLength());
// Copy the input stream to our output stream
// (if requested)
if (printContent) {
copy(resourceInfo, is, os);
}
} else {
// Partial content response.
resp.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
if (ranges.size() == 1) {
Range range = (Range) ranges.elementAt(0);
resp.addHeader("Content-Range", "bytes "
+ range.start
+ "-" + range.end + "/"
+ range.fileLength);
resp.setContentLength((int) range.length);
resp.setContentType
(revisionDescriptor.getContentType());
if (printContent) {
copy(resourceInfo, is, os, range);
}
} else {
resp.setContentType
("multipart/byteranges; boundary="
+ mimeSeparation);
if (printContent) {
copy(resourceInfo, is, os,
ranges.elements(),
revisionDescriptor.getContentType());
}
}
}
}
} else {
// XXX if there is no revision descriptor, this should be a directory
displayDirectory();
// resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
} else {
// XXX if there is no revisions, this should be a directory
displayDirectory();
// resp.setStatus(HttpServletResponse.SC_NO_CONTENT);
}
} catch (Exception e) {
int statusCode;
// XXX If there is some sort of IOException it has been issued by the copy methods
// which indicates the client aborted the connection
// like org.apache.catalina.connector.ClientAbortException thrown by Tomcat
if (e instanceof IOException) {
// XXX like in WebdavUtils which reacts on a failure upon put, we use this return method,
// however, is it sensible?
statusCode = WebdavStatus.SC_PRECONDITION_FAILED;
} else {
statusCode = getErrorCode( e );
}
sendError( statusCode, e );
throw new WebdavException( statusCode );
}
}