blob: 9eb5aefc25a1623349f3ffdddb37257de2aebb74 [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.j2ee;
import org.apache.jackrabbit.server.AbstractWebdavServlet;
import org.apache.jackrabbit.server.BasicCredentialsProvider;
import org.apache.jackrabbit.server.SessionProviderImpl;
import org.apache.jackrabbit.server.jcr.JCRWebdavServer;
import org.apache.jackrabbit.webdav.DavConstants;
import org.apache.jackrabbit.webdav.DavLocatorFactory;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavResourceFactory;
import org.apache.jackrabbit.webdav.DavSessionProvider;
import org.apache.jackrabbit.webdav.WebdavRequest;
import org.apache.jackrabbit.webdav.jcr.DavLocatorFactoryImpl;
import org.apache.jackrabbit.webdav.jcr.DavResourceFactoryImpl;
import org.apache.jackrabbit.webdav.jcr.observation.SubscriptionManagerImpl;
import org.apache.jackrabbit.webdav.jcr.transaction.TxLockManagerImpl;
import org.apache.jackrabbit.webdav.observation.SubscriptionManager;
import org.apache.log4j.Logger;
import javax.jcr.Repository;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
/**
* JCRWebdavServerServlet provides request/response handling for the JCRWebdavServer.
*/
public class JCRWebdavServerServlet extends AbstractWebdavServlet implements DavConstants {
/**
* the default logger
*/
private static Logger log = Logger.getLogger(JCRWebdavServerServlet.class);
/**
* Init parameter specifying the prefix used with the resource path.
*/
public static final String INIT_PARAM_RESOURCE_PATH_PREFIX = "resource-path-prefix";
/**
* Name of the optional init parameter that defines the value of the
* 'WWW-Authenticate' header.<p/>
* If the parameter is omitted the default value
* {@link #DEFAULT_AUTHENTICATE_HEADER "Basic Realm=Jackrabbit Webdav Server"}
* is used.
*
* @see #getAuthenticateHeaderValue()
*/
public static final String INIT_PARAM_AUTHENTICATE_HEADER = "authenticate-header";
/** the 'missing-auth-mapping' init parameter */
public final static String INIT_PARAM_MISSING_AUTH_MAPPING = "missing-auth-mapping";
/**
* Servlet context attribute used to store the path prefix instead of
* having a static field with this servlet. The latter causes problems
* when running multiple
*/
public static final String CTX_ATTR_RESOURCE_PATH_PREFIX = "jackrabbit.webdav.jcr.resourcepath";
private String pathPrefix;
private String authenticate_header;
private JCRWebdavServer server;
private DavResourceFactory resourceFactory;
private DavLocatorFactory locatorFactory;
private TxLockManagerImpl txMgr;
private SubscriptionManager subscriptionMgr;
/**
* Initializes the servlet set reads the following parameter from the
* servlet configuration:
* <ul>
* <li>resource-path-prefix: optional prefix for all resources.</li>
* </ul>
*
* @throws ServletException
*/
public void init() throws ServletException {
super.init();
// set resource path prefix
pathPrefix = getInitParameter(INIT_PARAM_RESOURCE_PATH_PREFIX);
getServletContext().setAttribute(CTX_ATTR_RESOURCE_PATH_PREFIX, pathPrefix);
log.debug(INIT_PARAM_RESOURCE_PATH_PREFIX + " = " + pathPrefix);
authenticate_header = getInitParameter(INIT_PARAM_AUTHENTICATE_HEADER);
if (authenticate_header == null) {
authenticate_header = DEFAULT_AUTHENTICATE_HEADER;
}
log.debug(INIT_PARAM_AUTHENTICATE_HEADER + " = " + authenticate_header);
txMgr = new TxLockManagerImpl();
subscriptionMgr = new SubscriptionManagerImpl();
// todo: ev. make configurable
resourceFactory = new DavResourceFactoryImpl(txMgr, subscriptionMgr);
locatorFactory = new DavLocatorFactoryImpl(pathPrefix);
}
/**
* Returns true if the preconditions are met. This includes validation of
* {@link WebdavRequest#matchesIfHeader(DavResource) If header} and validation
* of {@link org.apache.jackrabbit.webdav.transaction.TransactionConstants#HEADER_TRANSACTIONID
* TransactionId header}. This method will also return false if the requested
* resource resides within a differenct workspace as is assigned to the repository
* session attached to the given request.
*
* @see AbstractWebdavServlet#isPreconditionValid(WebdavRequest, DavResource)
*/
protected boolean isPreconditionValid(WebdavRequest request, DavResource resource) {
// first check matching If header
if (!request.matchesIfHeader(resource)) {
return false;
}
// test if the requested path matches to the existing session
// this may occur if the session was retrieved from the cache.
String wsName = request.getDavSession().getRepositorySession().getWorkspace().getName();
if (!resource.getLocator().isSameWorkspace(wsName)) {
return false;
}
// make sure, the TransactionId header is valid
String txId = request.getTransactionId();
return txId == null || txMgr.hasLock(txId, resource);
}
/**
* Returns the <code>DavSessionProvider</code>
*
* @return server
* @see AbstractWebdavServlet#getDavSessionProvider()
*/
public DavSessionProvider getDavSessionProvider() {
if (server == null) {
Repository repository = RepositoryAccessServlet.getRepository(getServletContext());
server = new JCRWebdavServer(repository, new SessionProviderImpl(
new BasicCredentialsProvider(
getInitParameter(INIT_PARAM_MISSING_AUTH_MAPPING)))
);
}
return server;
}
/**
* Throws <code>UnsupportedOperationException</code>.
*
* @see AbstractWebdavServlet#setDavSessionProvider(DavSessionProvider)
*/
public void setDavSessionProvider(DavSessionProvider davSessionProvider) {
throw new UnsupportedOperationException("Not implemented. DavSession(s) are provided by the 'JCRWebdavServer'");
}
/**
* Returns the <code>DavLocatorFactory</code>
*
* @see AbstractWebdavServlet#getLocatorFactory()
*/
public DavLocatorFactory getLocatorFactory() {
if (locatorFactory == null) {
locatorFactory = new DavLocatorFactoryImpl(pathPrefix);
}
return locatorFactory;
}
/**
* Sets the <code>DavLocatorFactory</code>
*
* @see AbstractWebdavServlet#setLocatorFactory(DavLocatorFactory)
*/
public void setLocatorFactory(DavLocatorFactory locatorFactory) {
this.locatorFactory = locatorFactory;
}
/**
* Returns the <code>DavResourceFactory</code>.
*
* @see AbstractWebdavServlet#getResourceFactory()
*/
public DavResourceFactory getResourceFactory() {
if (resourceFactory == null) {
resourceFactory = new DavResourceFactoryImpl(txMgr, subscriptionMgr);
}
return resourceFactory;
}
/**
* Sets the <code>DavResourceFactory</code>.
*
* @see AbstractWebdavServlet#setResourceFactory(org.apache.jackrabbit.webdav.DavResourceFactory)
*/
public void setResourceFactory(DavResourceFactory resourceFactory) {
this.resourceFactory = resourceFactory;
}
/**
* Returns the init param of the servlet configuration or
* {@link #DEFAULT_AUTHENTICATE_HEADER} as default value.
*
* @return corresponding init parameter or {@link #DEFAULT_AUTHENTICATE_HEADER}.
* @see #INIT_PARAM_AUTHENTICATE_HEADER
*/
public String getAuthenticateHeaderValue() {
return authenticate_header;
}
/**
* Returns the configured path prefix
*
* @return resourcePathPrefix
* @see #INIT_PARAM_RESOURCE_PATH_PREFIX
*/
public static String getPathPrefix(ServletContext ctx) {
return (String) ctx.getAttribute(CTX_ATTR_RESOURCE_PATH_PREFIX);
}
}