Index: contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java =================================================================== --- contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java (revision 157618) +++ contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java (working copy) @@ -15,6 +15,7 @@ */ package org.apache.jackrabbit.server.simple; +import org.apache.jackrabbit.server.DavSessionProvider; import org.apache.jackrabbit.server.simple.dav.lock.SimpleLockManager; import org.apache.jackrabbit.server.simple.dav.ResourceFactoryImpl; import org.apache.jackrabbit.server.simple.dav.LocatorFactoryImpl; @@ -23,13 +24,10 @@ import javax.servlet.*; import javax.jcr.*; import java.io.*; -import java.util.HashSet; import org.apache.log4j.Logger; import org.apache.jackrabbit.server.AbstractWebdavServlet; import org.apache.jackrabbit.webdav.*; -import org.apache.jackrabbit.webdav.spi.JcrDavException; -import org.apache.jackrabbit.client.RepositoryAccessServlet; /** * WebdavServlet provides webdav support (level 1 and 2 complient) for repository @@ -57,6 +55,9 @@ /** the locator factory */ private DavLocatorFactory locatorFactory; + /** the session provider */ + private DavSessionProvider sessionProvider; + /** the repository prefix retrieved from config */ private static String resourcePathPrefix; @@ -102,8 +103,8 @@ WebdavResponse webdavResponse = new WebdavResponseImpl(response); // make sure there is a authenticated user - DavSession session = getSession(webdavRequest); - if (session == null) { + sessionProvider.acquireSession(webdavRequest); + if (webdavRequest.getDavSession() == null) { return; } @@ -159,6 +160,8 @@ // GET, HEAD, TRACE...... super.service(request, response); } + + sessionProvider.releaseSession(webdavRequest); } catch (DavException e) { response.sendError(e.getErrorCode()); } @@ -193,92 +196,19 @@ } /** - * Retrieve the repository session for the given request object and force a header - * authentication if necessary. - * - * @param request - * @return a repository session for the given request or null if the - * authentication is missing. In the latter case the authentication is - * forces by the response code. - * @throws DavException + * Returns the configured {@link DavSessionProvider}. */ - private DavSession getSession(WebdavRequest request) throws DavException { - try { - Credentials creds = RepositoryAccessServlet.getCredentialsFromHeader(request.getHeader(DavConstants.HEADER_AUTHORIZATION)); - if (creds == null) { - // generate anonymous login to gain write access - creds = new SimpleCredentials("anonymous", "anonymous".toCharArray()); - } - Session repSession = RepositoryAccessServlet.getRepository().login(creds); - DavSession ds = new DavSessionImpl(repSession); - request.setDavSession(ds); - return ds; - } catch (RepositoryException e) { - throw new JcrDavException(e); - } catch (ServletException e) { - throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); - } + public DavSessionProvider getDavSessionProvider() { + if (sessionProvider == null) { + sessionProvider = new DavSessionProviderImpl(); + } + return sessionProvider; } /** - * Inner class implementing the DavSession interface + * Configures a {@link DavSessionProvider}. */ - private class DavSessionImpl implements DavSession { - - /** the underlaying jcr session */ - private final Session session; - - /** the lock tokens of this session */ - private final HashSet lockTokens = new HashSet(); - - /** - * Creates a new DavSession based on a jcr session - * @param session - */ - private DavSessionImpl(Session session) { - this.session = session; - } - - /** - * @see DavSession#addReference(Object) - */ - public void addReference(Object reference) { - throw new UnsupportedOperationException("No yet implemented."); - } - - /** - * @see DavSession#removeReference(Object) - */ - public void removeReference(Object reference) { - throw new UnsupportedOperationException("No yet implemented."); - } - - /** - * @see DavSession#getRepositorySession() - */ - public Session getRepositorySession() { - return session; - } - - /** - * @see DavSession#addLockToken(String) - */ - public void addLockToken(String token) { - lockTokens.add(token); - } - - /** - * @see DavSession#getLockTokens() - */ - public String[] getLockTokens() { - return (String[]) lockTokens.toArray(new String[lockTokens.size()]); - } - - /** - * @see DavSession#removeLockToken(String) - */ - public void removeLockToken(String token) { - lockTokens.remove(token); - } + public void setDavSessionProvider(DavSessionProvider provider) { + sessionProvider = provider; } } Index: contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/JCRWebdavServer.java =================================================================== --- contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/JCRWebdavServer.java (revision 157618) +++ contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/JCRWebdavServer.java (working copy) @@ -27,7 +27,7 @@ /** * JCRWebdavServer... */ -public class JCRWebdavServer { +public class JCRWebdavServer implements DavSessionProvider { /** the default logger */ private static Logger log = Logger.getLogger(JCRWebdavServer.class); @@ -54,6 +54,7 @@ * * @param request * @throws DavException if no session could be obtained. + * @see DavSessionProvider#acquireSession(WebdavRequest) */ public void acquireSession(WebdavRequest request) throws DavException { @@ -67,6 +68,7 @@ * cache. * * @param request + * @see DavSessionProvider#releaseSession(WebdavRequest) */ public void releaseSession(WebdavRequest request) { DavSession session = request.getDavSession(); @@ -288,4 +290,4 @@ return (HashSet) super.remove(key); } } -} \ No newline at end of file +}