blob: 7c029542384ce0a637e0e401315b4ea062a142ab [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.webdav.simple;
import org.apache.jackrabbit.server.CredentialsProvider;
import org.apache.jackrabbit.server.SessionProvider;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavServletResponse;
import org.apache.jackrabbit.webdav.DavSession;
import org.apache.jackrabbit.webdav.DavSessionProvider;
import org.apache.jackrabbit.webdav.WebdavRequest;
import org.apache.jackrabbit.webdav.jcr.JcrDavException;
import org.apache.log4j.Logger;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.ServletException;
/**
* Simple implementation of the {@link org.apache.jackrabbit.webdav.DavSessionProvider}
* interface that uses a {@link CredentialsProvider} to locate
* credentials in the request, log into the respository, and provide
* a {@link org.apache.jackrabbit.webdav.DavSession} to the request.
*/
public class DavSessionProviderImpl implements DavSessionProvider {
private static Logger log = Logger.getLogger(DavSessionProviderImpl.class);
/**
* the repository
*/
private final Repository repository;
/**
* the credentials provider
*/
private final SessionProvider sesProvider;
/**
* Creates a new DavSessionProviderImpl
* @param rep
* @param sesProvider
*/
public DavSessionProviderImpl(Repository rep, SessionProvider sesProvider) {
this.repository = rep;
this.sesProvider = sesProvider;
}
/**
* Acquires a DavSession. Upon success, the WebdavRequest will
* reference that session.
*
* A session will not be available if an exception is thrown.
*
* @param request
* @throws org.apache.jackrabbit.webdav.DavException if a problem occurred while obtaining the session
* @see DavSessionProvider#attachSession(org.apache.jackrabbit.webdav.WebdavRequest)
*/
public boolean attachSession(WebdavRequest request) throws DavException {
try {
// retrieve the workspace name
String workspaceName = request.getRequestLocator().getWorkspaceName();
// empty workspaceName rather means default -> must be 'null'
if (workspaceName != null && "".equals(workspaceName)) {
workspaceName = null;
}
// login to repository
Session repSession = sesProvider.getSession(request, repository, workspaceName);
if (repSession == null) {
log.debug("Could not to retrieve a repository session.");
return false;
}
DavSession ds = new DavSessionImpl(repSession);
log.debug("Attaching session '"+ ds + "' to request '" + request + "'");
request.setDavSession(ds);
return true;
} catch (NoSuchWorkspaceException e) {
// the default error-code for NoSuchWorkspaceException is 409 conflict
// which seems not appropriate here
throw new JcrDavException(e, DavServletResponse.SC_NOT_FOUND);
} catch (RepositoryException e) {
throw new JcrDavException(e);
} catch (ServletException e) {
throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
}
/**
* Only removes the <code>DavSession</code> object from the given request object.
* and remove all the lock tokens from the underlying repository session
* in order make sure they can be reset when attaching a session to the
* next request. Finally the session provider is informed, that the
* session is no longer used.
*
* @param request
* @see DavSessionProvider#releaseSession(org.apache.jackrabbit.webdav.WebdavRequest)
*/
public void releaseSession(WebdavRequest request) {
DavSession ds = request.getDavSession();
if (ds != null) {
Session repSession = ds.getRepositorySession();
String[] lockTokens = repSession.getLockTokens();
for (int i = 0; i < lockTokens.length; i++) {
repSession.removeLockToken(lockTokens[i]);
}
sesProvider.releaseSession(repSession);
log.debug("Releasing session '"+ ds + "' from request '" + request + "'");
} else {
// session is null. nothing to be done.
}
request.setDavSession(null);
}
}