> Thanks Dirk, I can access to Http://localhost:8080/slide/ which is
> Directory listing for/ page. Now what I should do to run webdav
> servlets.
> I am able to see my http servlets like HelloWorld by:
> http://localhost:8080/servlet/HelloWorld
> however, when I try to see
> http://localhost:8080/slide/servlet/SimpleServletForGet I get:
>
> Not Found (404)
>
> Original request: /slide/servlet/SimpleServlet
>
> Not found request: /slide/servlet/SimpleServlet
>
>
> and When I try by http://localhost:8080/servlet/SimpleServletForGet
> I receive an error message box of netscape which is telling that the
> document contained no data.
The problem with the "no data" error is that your "GET" method should
be "doGet".
Ok, in the web.xml I described in my first mail (a couple of weeks ago),
it is configured that the original servlet gets all the requests.
Here is how you have to extend the WebdavServlet:
1) compile the attached SimpleServlet
2) copy it here: webapps\slide\WEB-INF\classes\SimpleServlet.class
3) modify: webapps\slide\WEB-INF\web.xml
change:
<servlet-class>org.apache.slide.webdav.WebdavServlet</servlet-class>
to:
<servlet-class>SimpleServlet</servlet-class>
Now when you request a directory listing, the following text is printed
on the top of the page
"This my servlet and not the default one"
You can change the look and implement the doPost method or anything you
want.
Only be carefull to always use a directory as a target to do your
special actions.
Operations on files always go to the original WebdavServlet and you can
only change
doGet and doPost, not the other WebDAV specific methods.
Dirk
================== SimpleServlet.java ==================
import java.io.*;
import java.net.URL;
import java.security.Principal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.apache.util.URLUtil;
import org.apache.util.WebdavStatus;
import org.apache.slide.authenticate.SecurityToken;
import org.apache.slide.common.*;
import org.apache.slide.content.Content;
import org.apache.slide.content.NodeRevisionDescriptor;
import org.apache.slide.content.NodeRevisionDescriptors;
import org.apache.slide.lock.Lock;
import org.apache.slide.lock.NodeLock;
import org.apache.slide.security.AccessDeniedException;
import org.apache.slide.security.NodePermission;
import org.apache.slide.security.Security;
import org.apache.slide.structure.LinkedObjectNotFoundException;
import org.apache.slide.structure.ObjectNode;
import org.apache.slide.structure.ObjectNotFoundException;
import org.apache.slide.structure.Structure;
import org.apache.slide.util.conf.*;
import org.apache.slide.util.Messages;
import org.apache.slide.util.logger.Logger;
import org.apache.slide.webdav.logger.XHttpServletRequestFacade;
import org.apache.slide.webdav.logger.XHttpServletResponseFacade;
import org.apache.slide.webdav.logger.XMLTestCaseGenerator;
import org.apache.slide.webdav.method.*;
import org.apache.slide.webdav.WebdavServlet;
public class SimpleServlet extends WebdavServlet {
private static final DateFormat formatter =
new SimpleDateFormat(DATE_FORMAT);
/**
* Handle a GET request on a collection resource.
*/
protected void doGet(HttpServletRequest req, HttpServletResponse
resp)
throws ServletException, IOException {
if (directoryBrowsing) {
Writer writer = resp.getWriter();
resp.setContentType("text/html");
try {
displayDirectoryBrowsing(req, writer);
} catch (AccessDeniedException e) {
resp.sendError(WebdavStatus.SC_FORBIDDEN);
} catch (ObjectNotFoundException e) {
resp.sendError(WebdavStatus.SC_NOT_FOUND);
} catch (LinkedObjectNotFoundException e) {
resp.sendError(WebdavStatus.SC_NOT_FOUND);
} catch (SlideException e) {
resp.setStatus(WebdavStatus.SC_INTERNAL_SERVER_ERROR);
}
} else {
resp.sendError(WebdavStatus.SC_FORBIDDEN);
}
}
/**
* Display a directory browsing page.
*/
protected void displayDirectoryBrowsing(HttpServletRequest req,
Writer servletWriter)
throws IOException, SlideException {
String contextPath = req.getContextPath();
if (contextPath == null)
contextPath = "";
// get the helpers
Content content = token.getContentHelper();
Lock lock = token.getLockHelper();
Security security = token.getSecurityHelper();
Structure structure = token.getStructureHelper();
SlideToken slideToken = WebdavMethod.createSlideToken(req);
String resourcePath = WebdavMethod.getRelativePath(req);
ObjectNode object = structure.retrieve(slideToken,
resourcePath);
String name = object.getUri();
// Number of characters to trim from the beginnings of filenames
int trim = name.length();
if (!name.endsWith("/"))
trim += 1;
if (name.equals("/"))
trim = 1;
PrintWriter writer = new PrintWriter(servletWriter);
// Render the page header
writer.print("<html>\r\n");
writer.print("<head>\r\n");
writer.print("<title>");
writer.print
(Messages.format
("org.apache.slide.webdav.GetMethod.directorylistingfor", name));
writer.print("</title>\r\n</head>\r\n");
writer.print("<body bgcolor=\"white\">\r\n");
/////////////////////////////
writer.print("<H1> This my servlet and not the default one
</H1>\r\n");
/////////////////////////////
writer.print("<table width=\"90%\" cellspacing=\"0\"" +
" cellpadding=\"5\" align=\"center\">\r\n");
// Render the in-page title
writer.print("<tr><td colspan=\"3\"><font
size=\"+2\">\r\n<strong>");
writer.print
(Messages.format
("org.apache.slide.webdav.GetMethod.directorylistingfor", name));
writer.print("</strong>\r\n</font></td></tr>\r\n");
// Render the link to our parent (if required)
String parentDirectory = name;
if (parentDirectory.endsWith("/")) {
parentDirectory =
parentDirectory.substring(0, parentDirectory.length() -
1);
}
int slash = parentDirectory.lastIndexOf("/");
if (slash >= 0) {
String parent = name.substring(0, slash);
writer.print("<tr><td colspan=\"5\"
bgcolor=\"#ffffff\">\r\n");
writer.print("<a href=\"");
writer.print(URLUtil.URLEncode(contextPath, "UTF8"));
if (parent.equals(""))
parent = "/";
writer.print(parent);
writer.print("\">");
writer.print(Messages.format
("org.apache.slide.webdav.GetMethod.parent", parent));
writer.print("</a>\r\n");
writer.print("</td></tr>\r\n");
}
Enumeration permissionsList = null;
Enumeration locksList = null;
try {
permissionsList =
security.enumeratePermissions(slideToken,
object.getUri());
locksList = lock.enumerateLocks(slideToken,
object.getUri());
} catch (SlideException e) {
// Any security based exception will be trapped here
// Any locking based exception will be trapped here
}
// Displaying ACL info
if( org.apache.slide.util.Configuration.useIntegratedSecurity()
)
displayPermissions(permissionsList, writer, false);
// Displaying lock info
displayLocks(locksList, writer, false);
writer.print("<tr><td colspan=\"5\" bgcolor=\"#ffffff\">");
writer.print(" ");
writer.print("</td></tr>\r\n");
// Render the column headings
writer.print("<tr bgcolor=\"#cccccc\">\r\n");
writer.print("<td align=\"left\" colspan=\"3\">");
writer.print("<font size=\"+1\"><strong>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.filename"));
writer.print("</strong></font></td>\r\n");
writer.print("<td align=\"center\"><font size=\"+1\"><strong>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.size"));
writer.print("</strong></font></td>\r\n");
writer.print("<td align=\"right\"><font size=\"+1\"><strong>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.lastModified"));
writer.print("</strong></font></td>\r\n");
writer.print("</tr>\r\n");
Enumeration resources = object.enumerateChildren();
boolean shade = false;
while (resources.hasMoreElements()) {
String currentResource = (String) resources.nextElement();
NodeRevisionDescriptor currentDescriptor = null;
permissionsList = null;
locksList = null;
try {
NodeRevisionDescriptors revisionDescriptors =
content.retrieve(slideToken, currentResource);
// Retrieve latest revision descriptor
currentDescriptor =
content.retrieve(slideToken, revisionDescriptors);
} catch (SlideException e) {
// Silent exception : Objects without any revision are
// considered collections, and do not have any
attributes
// Any security based exception will be trapped here
// Any locking based exception will be trapped here
}
try {
permissionsList =
security.enumeratePermissions(slideToken,
currentResource);
locksList = lock.enumerateLocks(slideToken,
currentResource);
} catch (SlideException e) {
// Any security based exception will be trapped here
// Any locking based exception will be trapped here
}
String trimmed = currentResource.substring(trim);
if (trimmed.equalsIgnoreCase("WEB-INF") ||
trimmed.equalsIgnoreCase("META-INF"))
continue;
writer.print("<tr");
if (shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
shade = !shade;
writer.print("<td align=\"left\"
colspan=\"3\"> \r\n");
writer.print("<a href=\"");
writer.print(URLUtil.URLEncode(contextPath +
currentResource,
"UTF8"));
writer.print("\"><tt>");
writer.print(trimmed);
if (WebdavMethod.isCollection(currentDescriptor)) {
writer.print("/");
}
writer.print("</tt></a></td>\r\n");
writer.print("<td align=\"right\"><tt>");
if (WebdavMethod.isCollection(currentDescriptor))
writer.print(" ");
else
writer.print(renderSize(currentDescriptor.getContentLength()));
writer.print("</tt></td>\r\n");
writer.print("<td align=\"right\"><tt>");
if (currentDescriptor != null) {
writer.print(currentDescriptor.getLastModified());
} else {
writer.print(" ");
}
writer.print("</tt></td>\r\n");
writer.print("</tr>\r\n");
// Displaying ACL info
if(
org.apache.slide.util.Configuration.useIntegratedSecurity() )
displayPermissions(permissionsList, writer, shade);
// Displaying lock info
displayLocks(locksList, writer, shade);
}
// Render the page footer
writer.print("<tr><td colspan=\"5\"> </td></tr>\r\n");
writer.print("<tr><td colspan=\"3\" bgcolor=\"#cccccc\">");
writer.print("<font size=\"-1\">");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.version"));
writer.print("</font></td>\r\n");
writer.print("<td colspan=\"2\" align=\"right\"
bgcolor=\"#cccccc\">");
writer.print("<font size=\"-1\">");
writer.print(formatter.format(new Date()));
writer.print("</font></td></tr>\r\n");
writer.print("</table>\r\n");
writer.print("</body>\r\n");
writer.print("</html>\r\n");
// Return an input stream to the underlying bytes
writer.flush();
}
/**
* Display an ACL list.
*
* @param permissionsList List of NodePermission objects
* @param boolean Shade
* @param writer The output will be appended to this writer
*/
private void displayPermissions(Enumeration permissionsList,
PrintWriter writer,
boolean shade)
throws IOException {
if ((permissionsList != null) &&
(permissionsList.hasMoreElements())) {
writer.print("<tr");
if (!shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
writer.print("<td align=\"left\" colspan=\"5\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.aclinfo"));
writer.print("</b></tt></td>\r\n");
writer.print("</tr>\r\n");
writer.print("<tr");
if (!shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
writer.print("<td align=\"left\" colspan=\"2\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.subject"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"left\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.action"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"right\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.inheritable"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"right\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.deny"));
writer.print("</b></tt></td>\r\n");
writer.print("</tr>\r\n");
while (permissionsList.hasMoreElements()) {
writer.print("<tr");
if (!shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
NodePermission currentPermission =
(NodePermission) permissionsList.nextElement();
writer.print("<td align=\"left\" colspan=\"2\"><tt>");
writer.print(currentPermission.getSubjectUri());
writer.print("</tt></td>\r\n");
writer.print("<td align=\"left\"><tt>");
writer.print(currentPermission.getActionUri());
writer.print("</tt></td>\r\n");
writer.print("<td align=\"right\"><tt>");
writer.print(currentPermission.isInheritable());
writer.print("</tt></td>\r\n");
writer.print("<td align=\"right\"><tt>");
writer.print(currentPermission.isNegative());
writer.print("</tt></td>\r\n");
writer.print("</tr>\r\n");
}
}
}
/**
* Display a lock list.
*
* @param locksList List of NodeLock objects
* @param boolean Shade
* @param writer The output will be appended to this writer
*/
private void displayLocks(Enumeration locksList, PrintWriter writer,
boolean shade)
throws IOException {
if ((locksList != null) && (locksList.hasMoreElements())) {
writer.print("<tr");
if (!shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
writer.print("<td align=\"left\" colspan=\"5\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.locksinfo"));
writer.print("</b></tt></td>\r\n");
writer.print("</tr>\r\n");
writer.print("<tr");
if (!shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
writer.print("<td align=\"left\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.subject"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"left\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.type"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"right\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.expiration"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"right\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.inheritable"));
writer.print("</b></tt></td>\r\n");
writer.print("<td align=\"right\"><tt><b>");
writer.print(Messages.message
("org.apache.slide.webdav.GetMethod.exclusive"));
writer.print("</b></tt></td>\r\n");
writer.print("</tr>\r\n");
while (locksList.hasMoreElements()) {
writer.print("<tr");
if (!shade) {
writer.print(" bgcolor=\"dddddd\"");
} else {
writer.print(" bgcolor=\"eeeeee\"");
}
writer.print(">\r\n");
NodeLock currentLock = (NodeLock)
locksList.nextElement();
writer.print("<td align=\"left\"><tt>");
writer.print(currentLock.getSubjectUri());
writer.print("</tt></td>\r\n");
writer.print("<td align=\"left\"><tt>");
writer.print(currentLock.getTypeUri());
writer.print("</tt></td>\r\n");
writer.print("<td align=\"right\"><tt>");
writer.print
(formatter.format(currentLock.getExpirationDate()));
writer.print("</tt></td>\r\n");
writer.print("<td align=\"right\"><tt>");
writer.print(currentLock.isInheritable());
writer.print("</tt></td>\r\n");
writer.print("<td align=\"right\"><tt>");
writer.print(currentLock.isExclusive());
writer.print("</tt></td>\r\n");
}
}
}
// -------------------------------------------------------- Private
Methods
/**
* Render the specified file size (in bytes).
*
* @param size File size (in bytes)
*/
private String renderSize(long size) {
long leftSide = size / 1024;
long rightSide = (size % 1024) / 103; // Makes 1 digit
if ((leftSide == 0) && (rightSide == 0) && (size > 0))
rightSide = 1;
return ("" + leftSide + "." + rightSide + " kb");
}
}