Hello All,
I would like to know if its possible to subclass the webdav servlet that comes with Tomcat 5.x. We have need of webdav in our application, but need to provide a different JNDI InitialContext then the file system. The thought was we could just override the getResources() method in WebdavServlet to return our own context.
What follows is a description of what we are doing:
It seems there is at least one obstacle to doing this. We would have to move/copy the jar files: servlets-default.jar, servlets-common.jar, and servlets-webdav.jar to the common/lib folder. It seemed when we attempted to move the files to common/lib, all of the default webapps couldn't be loaded as well as some of our application servlets. When we leave the servlets*.jar files in both server/lib and common/lib, an exception is thrown when accessing our servlet:
javax.servlet.ServletException: Error instantiating servlet class com.test.webdav.XDav
And this is caused by:
java.lang.NoClassDefFoundError: org.apache.catalina.servlets.DefaultServlet
This seems strange considering the app should have access to the servlets-default.jar now that it is in common. Or is there an issue with libs in both server and common?
Any help is hugely appreciated.
Thanks!
-Mike Wille
Our subclassed servlet (with only test code for the InitialContext):
package com.test.webdav;
import javax.servlet.*; import javax.servlet.http.*;
import javax.naming.directory.InitialDirContext; import javax.naming.directory.DirContext;
import org.apache.catalina.servlets.*;
public class XDav extends WebdavServlet {
// need to dup this here because these have // private access in apaches webdavservlet protected static final String METHOD_HEAD = "HEAD"; protected static final String METHOD_PROPFIND = "PROPFIND"; protected static final String METHOD_PROPPATCH = "PROPPATCH"; protected static final String METHOD_MKCOL = "MKCOL"; protected static final String METHOD_COPY = "COPY"; protected static final String METHOD_MOVE = "MOVE"; protected static final String METHOD_LOCK = "LOCK"; protected static final String METHOD_UNLOCK = "UNLOCK"; protected Logger logger;
public void init (ServletConfig config) throws ServletException { // wake your parents super.init(config); }
public void destroy() {
// kill your parents
super.destroy();
}
/**
* Get resources. This method will try to retrieve the resources through
* JNDI first, then in the servlet context if JNDI has failed (it could be
* disabled). It will return null.
*
* @return A JNDI DirContext, or null.
*/
protected DirContext getResources() {
InitialDirContext result = null;
// Try the servlet context try { //result = new IntitialLibraryContext(); result.bind("directory 1", "directory 1"); result.bind("directory 2", "directory 2"); result.bind("directory 3", "directory 3"); result.bind("directory 4", "directory 4"); result.bind("directory 3/subdirectory 5", "subdirectory 5"); } catch(Exception e) { logger.warning(UtilityTank.getErrorDetail(e)); } return result;
} }