You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2005/04/17 16:52:14 UTC
svn commit: r161660 [2/7] - in
incubator/jackrabbit/trunk/contrib/jcr-server: ./ client/
client/src/java/org/apache/jackrabbit/webdav/
client/src/java/org/apache/jackrabbit/webdav/client/
client/src/java/org/apache/jackrabbit/webdav/client/methods/ server/
server/src/java/org/apache/jackrabbit/
server/src/java/org/apache/jackrabbit/server/
server/src/java/org/apache/jackrabbit/server/io/
server/src/java/org/apache/jackrabbit/server/jcr/
server/src/java/org/apache/jackrabbit/server/simple/
server/src/java/org/apache/jackrabbit/server/simple/dav/
server/src/java/org/apache/jackrabbit/webdav/simple/
server/src/java/org/apache/jackrabbit/webdav/spi/
server/src/java/org/apache/jackrabbit/webdav/spi/lock/
server/src/java/org/apache/jackrabbit/webdav/spi/nodetype/
server/src/java/org/apache/jackrabbit/webdav/spi/observation/
server/src/java/org/apache/jackrabbit/webdav/spi/property/
server/src/java/org/apache/jackrabbit/webdav/spi/search/
server/src/java/org/apache/jackrabbit/webdav/spi/transaction/
server/src/java/org/apache/jackrabbit/webdav/spi/version/
server/src/java/org/apache/jackrabbit/webdav/spi/version/report/ webapp/
webapp/src/webapp/WEB-INF/ webdav/ webdav/src/java/org/apache/jackrabbit/
webdav/src/java/org/apache/jackrabbit/webdav/
webdav/src/java/org/apache/jackrabbit/webdav/header/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/lock/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/nodetype/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/observation/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/property/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/search/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/transaction/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/version/
webdav/src/java/org/apache/jackrabbit/webdav/jcr/version/report/
webdav/src/java/org/apache/jackrabbit/webdav/lock/
webdav/src/java/org/apache/jackrabbit/webdav/search/
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,299 @@
+/*
+ * 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.server.jcr;
+
+import org.apache.log4j.Logger;
+import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.jcr.JcrDavException;
+import org.apache.jackrabbit.client.RepositoryAccessServlet;
+
+import javax.jcr.*;
+import javax.servlet.ServletException;
+import java.util.HashMap;
+import java.util.HashSet;
+/**
+ * <code>JCRWebdavServer</code>...
+ */
+public class JCRWebdavServer implements DavSessionProvider {
+
+ /** the default logger */
+ private static Logger log = Logger.getLogger(JCRWebdavServer.class);
+
+ /** the session cache */
+ private final SessionCache cache = new SessionCache();
+
+ /** the jcr repository */
+ private final Repository repository;
+
+ /**
+ * Creates a new JCRWebdavServer that operates on the given repository.
+ *
+ * @param repository
+ */
+ public JCRWebdavServer(Repository repository) {
+ this.repository = repository;
+ }
+
+ //---------------------------------------< DavSessionProvider interface >---
+ /**
+ * Acquires a DavSession either from the session cache or creates a new
+ * one by login to the repository.
+ * Upon success, the WebdavRequest will reference that session.
+ *
+ * @param request
+ * @throws DavException if no session could be obtained.
+ * @see DavSessionProvider#acquireSession(org.apache.jackrabbit.webdav.WebdavRequest)
+ */
+ public void acquireSession(WebdavRequest request)
+ throws DavException {
+ DavSession session = cache.get(request);
+ request.setDavSession(session);
+ }
+
+ /**
+ * Releases the reference from the request to the session. If no further
+ * references to the session exist, the session will be removed from the
+ * cache.
+ *
+ * @param request
+ * @see DavSessionProvider#releaseSession(org.apache.jackrabbit.webdav.WebdavRequest)
+ */
+ public void releaseSession(WebdavRequest request) {
+ DavSession session = request.getDavSession();
+ if (session != null) {
+ session.removeReference(request);
+ }
+ // remove the session from the request
+ request.setDavSession(null);
+ }
+
+ //--------------------------------------------------------------------------
+ /**
+ * Private inner class implementing the <code>DavSession</code> interface.
+ */
+ private class DavSessionImpl implements DavSession {
+
+ /** the underlaying jcr session */
+ private final Session session;
+
+ /**
+ * Private constructor.
+ *
+ * @param request
+ * @throws DavException in case a {@link javax.jcr.LoginException} or {@link javax.jcr.RepositoryException} occurs.
+ */
+ private DavSessionImpl(DavServletRequest request) throws DavException {
+ try {
+ String workspaceName = request.getRequestLocator().getWorkspaceName();
+ Credentials creds = RepositoryAccessServlet.getCredentialsFromHeader(request.getHeader(DavConstants.HEADER_AUTHORIZATION));
+ session = repository.login(creds, workspaceName);
+ } catch (LoginException e) {
+ // LoginException results in UNAUTHORIZED,
+ throw new JcrDavException(e);
+ } catch (RepositoryException e) {
+ // RepositoryException results in FORBIDDEN
+ throw new JcrDavException(e);
+ } catch (ServletException e) {
+ throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ }
+ }
+
+ /**
+ * Add a reference to this <code>DavSession</code>.
+ *
+ * @see DavSession#addReference(Object)
+ */
+ public void addReference(Object reference) {
+ cache.addReference(this, reference);
+ }
+
+ /**
+ * Removes the reference from this <code>DavSession</code>. If no
+ * more references are present, this <code>DavSession</code> is removed
+ * from the internal cache and the underlaying session is released by calling
+ * {@link javax.jcr.Session#logout()}.
+ *
+ * @see DavSession#removeReference(Object)
+ */
+ public void removeReference(Object reference) {
+ cache.removeReference(this, reference);
+ }
+
+ /**
+ * @see DavSession#getRepositorySession()
+ */
+ public Session getRepositorySession() {
+ return session;
+ }
+
+ /**
+ * @see DavSession#addLockToken(String)
+ */
+ public void addLockToken(String token) {
+ session.addLockToken(token);
+ }
+
+ /**
+ * @see DavSession#getLockTokens()
+ */
+ public String[] getLockTokens() {
+ return session.getLockTokens();
+ }
+
+ /**
+ * @see DavSession#removeLockToken(String)
+ */
+ public void removeLockToken(String token) {
+ session.removeLockToken(token);
+ }
+ }
+
+ /**
+ * Private inner class providing a cache for referenced session objects.
+ */
+ private class SessionCache {
+
+ private SessionMap sessionMap = new SessionMap();
+ private HashMap referenceToSessionMap = new HashMap();
+
+ /**
+ * Try to retrieve <code>DavSession</code> if a TransactionId or
+ * SubscriptionId is present in the request header. If no cached session
+ * was found <code>null</code> is returned.
+ *
+ * @param request
+ * @return a cached <code>DavSession</code> or <code>null</code>.
+ * @throws DavException
+ */
+ private DavSession get(WebdavRequest request)
+ throws DavException {
+ String txId = request.getTransactionId();
+ String subscriptionId = request.getSubscriptionId();
+ String lockToken = request.getLockToken();
+
+ if ((lockToken != null || txId != null) && subscriptionId != null) {
+ throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED, "Ambiguous headers: either TransactionId/Lock-Token or SubscriptionId can be present, not both.");
+ }
+
+ DavSession session = null;
+ // try to retrieve a cached session
+ if (lockToken != null && containsReference(lockToken)) {
+ session = getSessionByReference(lockToken);
+ } else if (txId != null && containsReference(txId)) {
+ session = getSessionByReference(txId);
+ } else if (subscriptionId != null && containsReference(subscriptionId)) {
+ session = getSessionByReference(subscriptionId);
+ }
+ // no cached session present -> create new one.
+ if (session == null) {
+ session = new DavSessionImpl(request);
+ sessionMap.put(session, new HashSet());
+ log.info("login: User '" + session.getRepositorySession().getUserID() + "' logged in.");
+ } else {
+ log.info("login: Retrieved cached session for user '" + session.getRepositorySession().getUserID() + "'");
+ }
+ addReference(session, request);
+ return session;
+ }
+
+ /**
+ * Add a references to the specified <code>DavSession</code>.
+ *
+ * @param session
+ * @param reference
+ */
+ private void addReference(DavSession session, Object reference) {
+ HashSet referenceSet = sessionMap.get(session);
+ if (referenceSet != null) {
+ referenceSet.add(reference);
+ referenceToSessionMap.put(reference, session);
+ } else {
+ log.error("Failed to add reference to session. No entry in cache found.");
+ }
+ }
+
+ /**
+ * Remove the given reference from the specified <code>DavSession</code>.
+ *
+ * @param session
+ * @param reference
+ */
+ private void removeReference(DavSession session, Object reference) {
+ HashSet referenceSet = sessionMap.get(session);
+ if (referenceSet != null) {
+ if (referenceSet.remove(reference)) {
+ log.info("Removed reference " + reference + " to session " + session);
+ referenceToSessionMap.remove(reference);
+ } else {
+ log.warn("Failed to remove reference " + reference + " to session " + session);
+ }
+ if (referenceSet.isEmpty()) {
+ log.info("No more references present on webdav session -> clean up.");
+ sessionMap.remove(session);
+ log.info("Login: User '" + session.getRepositorySession().getUserID() + "' logged out");
+ session.getRepositorySession().logout();
+ } else {
+ log.debug(referenceSet.size() + " references remaining on webdav session " + session);
+ }
+ } else {
+ log.error("Failed to remove reference from session. No entry in cache found.");
+ }
+ }
+
+ /**
+ * Returns true, if there exists a <code>DavSession</code> in the cache
+ * that is referenced by the specified object.
+ *
+ * @param reference
+ * @return true if a <code>DavSession</code> is referenced by the given
+ * object.
+ */
+ private boolean containsReference(Object reference) {
+ return referenceToSessionMap.containsKey(reference);
+ }
+
+ /**
+ * Returns the <code>DavSession</code> that is referenced by the
+ * specified reference object.
+ *
+ * @param reference
+ * @return <code>DavSession</code> that is referenced by this reference
+ * object.
+ * @see #containsReference(Object)
+ */
+ private DavSession getSessionByReference(Object reference) {
+ return (DavSession) referenceToSessionMap.get(reference);
+ }
+ }
+
+ /**
+ * Simple inner class extending the {@link HashMap}.
+ */
+ private static class SessionMap extends HashMap {
+
+ public HashSet get(DavSession key) {
+ return (HashSet) super.get(key);
+ }
+
+ public HashSet put(DavSession key, HashSet value) {
+ return (HashSet) super.put(key, value);
+ }
+
+ public HashSet remove(DavSession key) {
+ return (HashSet) super.remove(key);
+ }
+ }
+}
\ No newline at end of file
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServer.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServerServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServerServlet.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServerServlet.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServerServlet.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,261 @@
+/*
+ * 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.server.jcr;
+
+import org.apache.log4j.Logger;
+import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.observation.*;
+import org.apache.jackrabbit.webdav.jcr.*;
+import org.apache.jackrabbit.webdav.jcr.observation.SubscriptionManagerImpl;
+import org.apache.jackrabbit.webdav.jcr.transaction.TxLockManagerImpl;
+import org.apache.jackrabbit.client.RepositoryAccessServlet;
+import org.apache.jackrabbit.server.AbstractWebdavServlet;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.*;
+import javax.jcr.Repository;
+import java.io.IOException;
+
+/**
+ * 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_PREFIX = "resource-path-prefix";
+ private static String pathPrefix;
+
+ 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_PREFIX);
+ log.debug(INIT_PARAM_PREFIX + " = " + pathPrefix);
+
+ Repository repository = RepositoryAccessServlet.getRepository();
+ if (repository == null) {
+ throw new ServletException("Repository could not be retrieved. Check config of 'RepositoryServlet'.");
+ }
+ server = new JCRWebdavServer(repository);
+ txMgr = new TxLockManagerImpl();
+ subscriptionMgr = new SubscriptionManagerImpl();
+
+ // todo: ev. make configurable
+ resourceFactory = new DavResourceFactoryImpl(txMgr, subscriptionMgr);
+ locatorFactory = new DavLocatorFactoryImpl(pathPrefix);
+ }
+
+ /**
+ * Returns the path prefix
+ *
+ * @return pathPrefix
+ * @see #INIT_PARAM_PREFIX
+ */
+ public static String getPathPrefix() {
+ return pathPrefix;
+ }
+
+ /**
+ * Service the request.
+ *
+ * @param request
+ * @param response
+ * @throws javax.servlet.ServletException
+ * @throws java.io.IOException
+ * @see HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
+ */
+ protected void service(HttpServletRequest request, HttpServletResponse response)
+ throws ServletException, IOException {
+
+ WebdavRequest webdavRequest = new WebdavRequestImpl(request, locatorFactory);
+ WebdavResponse webdavResponse = new WebdavResponseImpl(response);
+ try {
+ // login to the server
+ server.acquireSession(webdavRequest);
+
+ // create the resource and perform initial precondition tests
+ DavResource resource = createResource(webdavRequest.getRequestLocator(), webdavRequest, webdavResponse);
+ if (preconditionFailed(webdavRequest, resource)) {
+ webdavResponse.sendError(DavServletResponse.SC_PRECONDITION_FAILED);
+ return;
+ }
+
+ // execute the requested method
+ int methodCode = DavMethods.getMethodCode(webdavRequest.getMethod());
+ execute(webdavRequest, webdavResponse, methodCode, resource);
+ } catch (DavException e) {
+ webdavResponse.sendErrorResponse(e);
+ } finally {
+ // logout
+ server.releaseSession(webdavRequest);
+ }
+ }
+
+ /**
+ *
+ * @param locator
+ * @param request
+ * @param response
+ * @return
+ */
+ protected DavResource createResource(DavResourceLocator locator, WebdavRequest request,
+ WebdavResponse response) throws DavException {
+ return resourceFactory.createResource(locator, request, response);
+ }
+
+ /**
+ *
+ * @param request
+ * @param resource
+ * @return
+ */
+ private boolean preconditionFailed(WebdavRequest request, DavResource resource) {
+ // first check matching If header
+ if (!request.matchesIfHeader(resource)) {
+ return true;
+ }
+
+ // 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();
+ boolean failed = !resource.getLocator().isSameWorkspace(wsName);
+ if (!failed) {
+ // make sure, the TransactionId header is valid
+ String txId = request.getTransactionId();
+ if (txId != null && !txMgr.hasLock(txId, resource)) {
+ failed = true;
+ }
+ }
+ return failed;
+ }
+
+ /**
+ * @param request
+ * @param response
+ * @param method
+ * @param resource
+ * @throws ServletException
+ * @throws IOException
+ * @throws DavException
+ */
+ private void execute(WebdavRequest request, WebdavResponse response,
+ int method, DavResource resource)
+ throws ServletException, IOException, DavException {
+
+ switch (method) {
+ case DavMethods.DAV_GET:
+ doGet(request, response, resource);
+ break;
+ case DavMethods.DAV_HEAD:
+ doHead(request, response, resource);
+ break;
+ case DavMethods.DAV_PROPFIND:
+ doPropFind(request, response, resource);
+ break;
+ case DavMethods.DAV_PROPPATCH:
+ doPropPatch(request, response, resource);
+ break;
+ case DavMethods.DAV_POST:
+ case DavMethods.DAV_PUT:
+ doPut(request, response, resource);
+ break;
+ case DavMethods.DAV_DELETE:
+ doDelete(request, response, resource);
+ break;
+ case DavMethods.DAV_COPY:
+ doCopy(request, response, resource);
+ break;
+ case DavMethods.DAV_MOVE:
+ doMove(request, response, resource);
+ break;
+ case DavMethods.DAV_MKCOL:
+ doMkCol(request, response, resource);
+ break;
+ case DavMethods.DAV_OPTIONS:
+ doOptions(request, response, resource);
+ break;
+ case DavMethods.DAV_LOCK:
+ doLock(request, response, resource);
+ break;
+ case DavMethods.DAV_UNLOCK:
+ doUnlock(request, response, resource);
+ break;
+ case DavMethods.DAV_ORDERPATCH:
+ doOrderPatch(request, response, resource);
+ break;
+ case DavMethods.DAV_SUBSCRIBE:
+ doSubscribe(request, response, resource);
+ break;
+ case DavMethods.DAV_UNSUBSCRIBE:
+ doUnsubscribe(request, response, resource);
+ break;
+ case DavMethods.DAV_POLL:
+ doPoll(request, response, resource);
+ break;
+ case DavMethods.DAV_SEARCH:
+ doSearch(request, response, resource);
+ break;
+ case DavMethods.DAV_VERSION_CONTROL:
+ doVersionControl(request, response, resource);
+ break;
+ case DavMethods.DAV_LABEL:
+ doLabel(request, response, resource);
+ break;
+ case DavMethods.DAV_REPORT:
+ doReport(request, response, resource);
+ break;
+ case DavMethods.DAV_CHECKIN:
+ doCheckin(request, response, resource);
+ break;
+ case DavMethods.DAV_CHECKOUT:
+ doCheckout(request, response, resource);
+ break;
+ case DavMethods.DAV_UNCHECKOUT:
+ doUncheckout(request, response, resource);
+ break;
+ case DavMethods.DAV_MERGE:
+ doMerge(request, response, resource);
+ break;
+ case DavMethods.DAV_UPDATE:
+ doUpdate(request, response, resource);
+ break;
+ case DavMethods.DAV_MKWORKSPACE:
+ doMkWorkspace(request, response, resource);
+ break;
+ default:
+ // any other method
+ super.service(request, response);
+ }
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServerServlet.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/jcr/JCRWebdavServerServlet.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java?view=diff&r1=161659&r2=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/server/simple/WebdavServlet.java Sun Apr 17 07:51:59 2005
@@ -15,10 +15,10 @@
*/
package org.apache.jackrabbit.server.simple;
-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;
-import org.apache.jackrabbit.server.simple.dav.DavSessionProviderImpl;
+import org.apache.jackrabbit.webdav.lock.SimpleLockManager;
+import org.apache.jackrabbit.webdav.simple.ResourceFactoryImpl;
+import org.apache.jackrabbit.webdav.simple.LocatorFactoryImpl;
+import org.apache.jackrabbit.webdav.simple.DavSessionProviderImpl;
import javax.servlet.http.*;
import javax.servlet.*;
@@ -224,7 +224,7 @@
/**
* Returns the <code>DavLocatorFactory</code>. If no locator factory has
- * been set or created a new instance of {@link LocatorFactoryImpl} is
+ * been set or created a new instance of {@link org.apache.jackrabbit.webdav.simple.LocatorFactoryImpl} is
* returned.
*
* @return the locator factory
@@ -293,7 +293,7 @@
/**
* Returns the <code>DavSessionProvider</code>. If no session provider has
- * been set or created a new instance of {@link DavSessionProviderImpl} is
+ * been set or created a new instance of {@link org.apache.jackrabbit.webdav.simple.DavSessionProviderImpl} is
* returned.
*
* @return the session provider
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,638 @@
+/*
+ * 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 javax.jcr.*;
+import javax.jcr.lock.Lock;
+import java.util.*;
+import java.io.*;
+
+import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.util.Text;
+import org.apache.jackrabbit.webdav.jcr.lock.JcrActiveLock;
+import org.apache.jackrabbit.webdav.jcr.JcrDavException;
+import org.apache.jackrabbit.webdav.lock.*;
+import org.apache.jackrabbit.webdav.property.*;
+import org.apache.jackrabbit.JcrConstants;
+import org.apache.jackrabbit.server.io.ImportContext;
+import org.apache.jackrabbit.server.io.ImportResourceChain;
+import org.apache.jackrabbit.server.io.ImportCollectionChain;
+import org.apache.log4j.Logger;
+
+/**
+ * DavResourceImpl imeplements a DavResource.
+ */
+public class DavResourceImpl implements DavResource, JcrConstants {
+
+ /** the default logger */
+ private static final Logger log = Logger.getLogger(DavResourceImpl.class);
+
+ private DavResourceFactory factory;
+ private LockManager lockManager;
+ private DavSession session;
+ private Node node;
+ private DavResourceLocator locator;
+
+ private DavPropertySet properties;
+ private boolean isCollection = true;
+
+ /** is created on initProperties */
+ private NodeResource nodeResource;
+
+ /**
+ * Create a new {@link DavResource}.
+ *
+ * @param locator
+ * @param factory
+ * @param session
+ */
+ public DavResourceImpl(DavResourceLocator locator, DavResourceFactory factory,
+ DavSession session)
+ throws RepositoryException {
+ this.session = session;
+ this.factory = factory;
+ this.locator = locator;
+ if (locator != null && locator.getResourcePath() != null) {
+ try {
+ init(session.getRepositorySession().getItem(locator.getResourcePath()));
+ } catch (PathNotFoundException e) {
+ // ignore: exists field evaluates to false
+ }
+ }
+ }
+
+ /**
+ * Init the webdav resource and retrieve the relevant property.
+ *
+ * @param repositoryItem
+ * @throws RepositoryException
+ */
+ private void init(Item repositoryItem) throws RepositoryException {
+ if (repositoryItem == null || !repositoryItem.isNode()) {
+ return;
+ }
+ node = (Node)repositoryItem;
+
+ // define what is a resource in webdav
+ if (node.isNodeType(NT_RESOURCE) || node.isNodeType(NT_FILE)) {
+ isCollection = false;
+ }
+ }
+
+ /**
+ * @return DavResource#COMPLIANCE_CLASS
+ * @see org.apache.jackrabbit.webdav.DavResource#getComplianceClass()
+ */
+ public String getComplianceClass() {
+ return DavResource.COMPLIANCE_CLASS;
+ }
+
+ /**
+ * @return DavResource#METHODS
+ * @see org.apache.jackrabbit.webdav.DavResource#getSupportedMethods()
+ */
+ public String getSupportedMethods() {
+ return DavResource.METHODS;
+ }
+
+ /**
+ * @see DavResource#exists() )
+ */
+ public boolean exists() {
+ return node != null;
+ }
+
+ /**
+ * @see DavResource#isCollection()
+ */
+ public boolean isCollection() {
+ return isCollection;
+ }
+
+ /**
+ * @see org.apache.jackrabbit.webdav.DavResource#getLocator()
+ */
+ public DavResourceLocator getLocator() {
+ return locator;
+ }
+
+ /**
+ * @see DavResource#getResourcePath()
+ */
+ public String getResourcePath() {
+ return locator.getResourcePath();
+ }
+
+ /**
+ * @see DavResource#getHref()
+ */
+ public String getHref() {
+ return locator.getHref(isCollection());
+ }
+
+ /**
+ * @see DavResource#getDisplayName()
+ */
+ public String getDisplayName() {
+ String name = null;
+ if (exists()) {
+ try {
+ name = node.getName();
+ } catch (RepositoryException e) {
+ // ignore
+ }
+ }
+ if (name == null && getResourcePath() != null) {
+ name = Text.getLabel(getResourcePath());
+ }
+ return name;
+ }
+
+ /**
+ * @see org.apache.jackrabbit.webdav.DavResource#getModificationTime()
+ */
+ public long getModificationTime() {
+ initProperties();
+ return nodeResource == null ? 0 : nodeResource.getModificationTime();
+ }
+
+ /**
+ * @see org.apache.jackrabbit.webdav.DavResource#getStream()
+ */
+ public InputStream getStream() {
+ initProperties();
+ return nodeResource == null ? null : nodeResource.getStream();
+ }
+
+ /**
+ * @see DavResource#getProperty(org.apache.jackrabbit.webdav.property.DavPropertyName)
+ */
+ public DavProperty getProperty(DavPropertyName name) {
+ initProperties();
+ return properties.get(name);
+ }
+
+ /**
+ * @see DavResource#getProperties()
+ */
+ public DavPropertySet getProperties() {
+ initProperties();
+ return properties;
+ }
+
+ /**
+ * @see DavResource#getPropertyNames()
+ */
+ public DavPropertyName[] getPropertyNames() {
+ return getProperties().getPropertyNames();
+ }
+
+ /**
+ * Fill the set of properties
+ */
+ private void initProperties() {
+ if (properties == null && exists()) {
+ properties = new DavPropertySet();
+ try {
+ nodeResource = new NodeResource(this, node);
+ properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTLENGTH, nodeResource.getContentLength()+""));
+ properties.add(new DefaultDavProperty(DavPropertyName.CREATIONDATE, nodeResource.getCreationDate()));
+ properties.add(new DefaultDavProperty(DavPropertyName.GETLASTMODIFIED, nodeResource.getLastModified()));
+ String contentType = nodeResource.getContentType();
+ if (contentType != null) {
+ properties.add(new DefaultDavProperty(DavPropertyName.GETCONTENTTYPE, contentType));
+ }
+ properties.add(new DefaultDavProperty(DavPropertyName.GETETAG, nodeResource.getETag()));
+ } catch (RepositoryException e) {
+ // should not occure....
+ }
+
+ if (getDisplayName() != null) {
+ properties.add(new DefaultDavProperty(DavPropertyName.DISPLAYNAME, getDisplayName()));
+ }
+ if (isCollection()) {
+ properties.add(new ResourceType(ResourceType.COLLECTION));
+ // Windows XP support
+ properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "1"));
+ } else {
+ properties.add(new ResourceType(ResourceType.DEFAULT_RESOURCE));
+ // Windows XP support
+ properties.add(new DefaultDavProperty(DavPropertyName.ISCOLLECTION, "0"));
+ }
+
+ /* set current lock information. If no lock is set to this resource,
+ an empty lockdiscovery will be returned in the response. */
+ properties.add(new LockDiscovery(getLock(Type.WRITE, Scope.EXCLUSIVE)));
+
+ /* lock support information: all locks are lockable. */
+ SupportedLock supportedLock = new SupportedLock();
+ supportedLock.addEntry(Type.WRITE, Scope.EXCLUSIVE);
+ properties.add(supportedLock);
+ }
+ }
+
+ /**
+ * @param property
+ * @throws DavException
+ * @see DavResource#setProperty(org.apache.jackrabbit.webdav.property.DavProperty)
+ */
+ public void setProperty(DavProperty property) throws DavException {
+ if (isLocked(this)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+ throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED);
+ }
+
+ /**
+ * @param propertyName
+ * @throws DavException
+ * @see DavResource#removeProperty(org.apache.jackrabbit.webdav.property.DavPropertyName)
+ */
+ public void removeProperty(DavPropertyName propertyName) throws DavException {
+ if (isLocked(this)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+ throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED);
+ }
+
+ /**
+ * @see DavResource#getCollection()
+ */
+ public DavResource getCollection() {
+ DavResource parent = null;
+ if (getResourcePath() != null && !getResourcePath().equals("/")) {
+ String parentPath = Text.getRelativeParent(getResourcePath(), 1);
+ if (parentPath.equals("")) {
+ parentPath="/";
+ }
+ DavResourceLocator parentloc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), parentPath);
+ try {
+ parent = factory.createResource(parentloc, session);
+ } catch (DavException e) {
+ // should not occur
+ }
+ }
+ return parent;
+ }
+
+ /**
+ * @see DavResource#getMembers()
+ */
+ public DavResourceIterator getMembers() {
+ ArrayList list = new ArrayList();
+ if (exists() && isCollection()) {
+ try {
+ NodeIterator it = node.getNodes();
+ while(it.hasNext()) {
+ list.add(buildResourceFromItem(it.nextNode()));
+ }
+ } catch (RepositoryException e) {
+ // should not occure
+ } catch (DavException e) {
+ // should not occure
+ }
+ }
+ return new DavResourceIteratorImpl(list);
+ }
+
+ /**
+ * Adds a new non-collection member to this resource.
+ *
+ * @see DavResource#addMember(DavResource, InputStream)
+ */
+ public void addMember(DavResource member, InputStream in) throws DavException {
+ if (!exists() || in == null) {
+ throw new DavException(DavServletResponse.SC_BAD_REQUEST);
+ }
+ if (isLocked(this)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+
+ try {
+ String fileName = member.getDisplayName();
+ ImportContext ctx = new ImportContext(node);
+ ctx.setInputStream(in);
+ ctx.setSystemId(fileName);
+ ImportResourceChain.getChain().execute(ctx);
+ session.getRepositorySession().save();
+ } catch (RepositoryException e) {
+ log.error("Error while executing import chain: " + e.toString());
+ throw new JcrDavException(e);
+ } catch (IOException e) {
+ log.error("Error while executing import chain: " + e.toString());
+ throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ } catch (Exception e) {
+ log.error("Error while executing import chain: " + e.toString());
+ throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ }
+ }
+
+ /**
+ * Creates a new collection as member of this resource.
+ *
+ * @see DavResource#addMember(DavResource)
+ */
+ public void addMember(DavResource member) throws DavException {
+ if (!exists()) {
+ throw new DavException(DavServletResponse.SC_CONFLICT);
+ }
+ if (isLocked(this)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+ try {
+ ImportContext ctx = new ImportContext(node);
+ ctx.setSystemId(member.getDisplayName());
+ ImportCollectionChain.getChain().execute(ctx);
+ node.save();
+ } catch (ItemExistsException e) {
+ log.error("Error while executing import chain: " + e.toString());
+ throw new DavException(DavServletResponse.SC_METHOD_NOT_ALLOWED);
+ } catch (RepositoryException e) {
+ log.error("Error while executing import chain: " + e.toString());
+ throw new JcrDavException(e);
+ } catch (Exception e) {
+ log.error("Error while executing import chain: " + e.toString());
+ throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
+ }
+ }
+
+ /**
+ * @see DavResource#removeMember(DavResource)
+ */
+ public void removeMember(DavResource member) throws DavException {
+ if (!exists() || !member.exists()) {
+ throw new DavException(DavServletResponse.SC_NOT_FOUND);
+ }
+ if (isLocked(this) || isLocked(member)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+
+ try {
+ // make sure, non-jcr locks are removed.
+ if (!isJsrLockable()) {
+ ActiveLock lock = getLock(Type.WRITE, Scope.EXCLUSIVE);
+ if (lock != null) {
+ lockManager.releaseLock(lock.getToken(), member);
+ }
+ }
+ ActiveLock lock = getLock(Type.WRITE, Scope.EXCLUSIVE);
+ if (lock != null && lockManager.hasLock(lock.getToken(), member)) {
+ lockManager.releaseLock(lock.getToken(), member);
+ }
+
+ Session s = session.getRepositorySession();
+ Item memItem = s.getItem(member.getResourcePath());
+ memItem.remove();
+ s.save();
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ }
+
+ /**
+ * @see DavResource#move(DavResource)
+ */
+ public void move(DavResource destination) throws DavException {
+ if (!exists()) {
+ throw new DavException(DavServletResponse.SC_NOT_FOUND);
+ }
+ if (isLocked(this)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+ try {
+ session.getRepositorySession().getWorkspace().move(getResourcePath(), destination.getResourcePath());
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ }
+
+ /**
+ * @see DavResource#copy(DavResource, boolean)
+ */
+ public void copy(DavResource destination, boolean shallow) throws DavException {
+ if (!exists()) {
+ throw new DavException(DavServletResponse.SC_NOT_FOUND);
+ }
+ if (isLocked(destination)) {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+ // TODO: support shallow and deep copy
+ if (shallow) {
+ throw new DavException(DavServletResponse.SC_FORBIDDEN, "Unable to perform shallow copy.");
+ }
+ try {
+ session.getRepositorySession().getWorkspace().copy(getResourcePath(), destination.getResourcePath());
+ } catch (PathNotFoundException e) {
+ // according to rfc 2518: missing parent
+ throw new DavException(DavServletResponse.SC_CONFLICT, e.getMessage());
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ }
+
+ /**
+ * @param type
+ * @param scope
+ * @return true if type is {@link Type#WRITE} and scope is {@link Scope#EXCLUSIVE}
+ * @see DavResource#isLockable(org.apache.jackrabbit.webdav.lock.Type, org.apache.jackrabbit.webdav.lock.Scope)
+ */
+ public boolean isLockable(Type type, Scope scope) {
+ return Type.WRITE.equals(type) && Scope.EXCLUSIVE.equals(scope);
+ }
+
+ /**
+ * @see DavResource#hasLock(org.apache.jackrabbit.webdav.lock.Type, org.apache.jackrabbit.webdav.lock.Scope)
+ */
+ public boolean hasLock(Type type, Scope scope) {
+ return getLock(type, scope) != null;
+ }
+
+ /**
+ * @see DavResource#getLock(Type, Scope)
+ */
+ public ActiveLock getLock(Type type, Scope scope) {
+ ActiveLock lock = null;
+ if (exists() && Type.WRITE.equals(type) && Scope.EXCLUSIVE.equals(scope)) {
+ // try to retrieve the repository lock information first
+ if (isJsrLockable()) {
+ try {
+ Lock jcrLock = node.getLock();
+ if (jcrLock != null && jcrLock.isLive()) {
+ lock = new JcrActiveLock(jcrLock);
+ }
+ } catch (RepositoryException e) {
+ // LockException: no lock applies to this node >> ignore
+ // RepositoryException, AccessDeniedException or another error >> ignore
+ }
+ }
+
+ // could not retrieve jcr-lock (either not jcr-lockable or the lock has
+ // been created before the node was made jcr-lockable. test if a simple
+ // webdav lock is present.
+ if (lock == null) {
+ lock = lockManager.getLock(type, scope, this);
+ }
+ }
+ return lock;
+ }
+
+ /**
+ * @see org.apache.jackrabbit.webdav.DavResource#getLocks()
+ */
+ public ActiveLock[] getLocks() {
+ return new ActiveLock[] {getLock(Type.WRITE, Scope.EXCLUSIVE)};
+ }
+
+ /**
+ * @see DavResource#lock(LockInfo)
+ */
+ public ActiveLock lock(LockInfo lockInfo) throws DavException {
+ ActiveLock lock = null;
+ if (isLockable(lockInfo.getType(), lockInfo.getScope())) {
+ // todo: deal with existing locks, that may have been created, before the node was jcr-lockable...
+ if (isJsrLockable()) {
+ try {
+ // try to execute the lock operation
+ Lock jcrLock = node.lock(lockInfo.isDeep(), false);
+ if (jcrLock != null) {
+ lock = new JcrActiveLock(jcrLock);
+ }
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ } else {
+ // create a new webdav lock
+ lock = lockManager.createLock(lockInfo, this);
+ }
+ } else {
+ throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED, "Unsupported lock type or scope.");
+ }
+ return lock;
+ }
+
+ /**
+ * @see DavResource#refreshLock(LockInfo, String)
+ */
+ public ActiveLock refreshLock(LockInfo lockInfo, String lockToken) throws DavException{
+ if (!exists()) {
+ throw new DavException(DavServletResponse.SC_NOT_FOUND);
+ }
+ ActiveLock lock = getLock(lockInfo.getType(), lockInfo.getScope());
+ if (lock == null) {
+ throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED, "No lock with the given type/scope present on resource " + getResourcePath());
+ }
+
+ if (lock instanceof JcrActiveLock) {
+ try {
+ // refresh JCR lock and return the original lock object.
+ node.getLock().refresh();
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ } else {
+ lock = lockManager.refreshLock(lockInfo, lockToken, this);
+ }
+ /* since lock has infinite lock (simple) or undefined timeout (jcr)
+ return the lock as retrieved from getLock. */
+ return lock;
+ }
+
+ /**
+ * @see DavResource#unlock(String)
+ */
+ public void unlock(String lockToken) throws DavException {
+ ActiveLock lock = getLock(Type.WRITE, Scope.EXCLUSIVE);
+ if (lock == null) {
+ throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED);
+ } else if (lock.isLockedByToken(lockToken)) {
+ if (lock instanceof JcrActiveLock) {
+ try {
+ node.unlock();
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ } else {
+ lockManager.releaseLock(lockToken, this);
+ }
+ } else {
+ throw new DavException(DavServletResponse.SC_LOCKED);
+ }
+ }
+
+ /**
+ * @see DavResource#addLockManager(org.apache.jackrabbit.webdav.lock.LockManager)
+ */
+ public void addLockManager(LockManager lockMgr) {
+ this.lockManager = lockMgr;
+ }
+
+ /**
+ * @see org.apache.jackrabbit.webdav.DavResource#getFactory()
+ */
+ public DavResourceFactory getFactory() {
+ return factory;
+ }
+
+ /**
+ * Returns true, if this webdav resource allows for locking without checking
+ * its current lock status.
+ *
+ * @return true if this resource is lockable.
+ */
+ private boolean isJsrLockable() {
+ boolean lockable = false;
+ if (exists()) {
+ try {
+ lockable = node.isNodeType("mix:lockable");
+ } catch (RepositoryException e) {
+ // not jcr-lockable
+ }
+ }
+ return lockable;
+ }
+
+ /**
+ * Return true if this resource cannot be modified due to a write lock
+ * that is not owned by the given session.
+ *
+ * @return true if this resource cannot be modified due to a write lock
+ */
+ private boolean isLocked(DavResource res) {
+ ActiveLock lock = res.getLock(Type.WRITE, Scope.EXCLUSIVE);
+ if (lock == null) {
+ return false;
+ } else {
+ String[] sLockTokens = session.getLockTokens();
+ for (int i = 0; i < sLockTokens.length; i++) {
+ if (sLockTokens[i].equals(lock.getToken())) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+
+ /**
+ * @param item
+ * @return
+ * @throws DavException
+ * @throws RepositoryException
+ */
+ private DavResource buildResourceFromItem(Item item) throws DavException, RepositoryException {
+ DavResourceLocator parentloc = locator.getFactory().createResourceLocator(locator.getPrefix(), locator.getWorkspacePath(), item.getPath());
+ return factory.createResource(parentloc, session);
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionImpl.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionImpl.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionImpl.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,84 @@
+/*
+ * 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 javax.jcr.Session;
+import java.util.HashSet;
+
+import org.apache.jackrabbit.webdav.DavSession;
+
+/**
+ * Simple implementation of the {@link DavSession} interface. Stores
+ * lock tokens but does not yet store references.
+ */
+public 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
+ */
+ public 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);
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionImpl.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionProviderImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionProviderImpl.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionProviderImpl.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionProviderImpl.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,75 @@
+/*
+ * 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 javax.jcr.*;
+import javax.servlet.ServletException;
+
+import org.apache.jackrabbit.webdav.*;
+import org.apache.jackrabbit.webdav.jcr.JcrDavException;
+import org.apache.jackrabbit.client.RepositoryAccessServlet;
+
+/**
+ * Simple implementation of the {@link DavSessionProvider}
+ * interface that uses the {@link RepositoryAccessServlet} to locate
+ * credentials in the request, log into the respository, and provide
+ * a {@link DavSession} to the request.
+ */
+public class DavSessionProviderImpl implements DavSessionProvider {
+
+ /**
+ * 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 DavException if a problem occurred while obtaining the session
+ * @see DavSessionProvider#acquireSession(org.apache.jackrabbit.webdav.WebdavRequest)
+ */
+ public void acquireSession(WebdavRequest request) throws DavException {
+ try {
+ // extract credentials from the auth header. depending of the
+ // configuration of the RepositoryAccessServlet, this could also
+ // throw a login excetpion.
+ Credentials creds = RepositoryAccessServlet.getCredentialsFromHeader(
+ request.getHeader(DavConstants.HEADER_AUTHORIZATION));
+
+ // login to repository
+ Session repSession = RepositoryAccessServlet.getRepository().login(creds);
+ DavSession ds = new DavSessionImpl(repSession);
+ request.setDavSession(ds);
+ } catch (LoginException e) {
+ throw new JcrDavException(e);
+ } 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.
+ * No further actions required, since <code>DavSessionImpl</code> does not
+ * allow to keep track of references to it.
+ *
+ * @param request
+ * @see DavSessionProvider#releaseSession(org.apache.jackrabbit.webdav.WebdavRequest)
+ */
+ public void releaseSession(WebdavRequest request) {
+ request.setDavSession(null);
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionProviderImpl.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/DavSessionProviderImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/LocatorFactoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/LocatorFactoryImpl.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/LocatorFactoryImpl.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/LocatorFactoryImpl.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,139 @@
+/*
+ * 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.webdav.*;
+import org.apache.log4j.Logger;
+
+/**
+ * ResourceFactoryImpl implements a simple DavLocatorFactory
+ */
+// todo improve special handling of root item....
+public class LocatorFactoryImpl implements DavLocatorFactory {
+
+ /** the default logger */
+ private static final Logger log = Logger.getLogger(LocatorFactoryImpl.class);
+
+ private final String repositoryPrefix;
+
+ public LocatorFactoryImpl(String repositoryPrefix) {
+ this.repositoryPrefix = repositoryPrefix;
+ }
+
+ public DavResourceLocator createResourceLocator(String prefix, String requestHandle) {
+ String rPrefix = prefix + repositoryPrefix;
+ String rHandle = requestHandle;
+ // remove the configured repository prefix from the path
+ if (rHandle != null && rHandle.startsWith(repositoryPrefix)) {
+ rHandle = rHandle.substring(repositoryPrefix.length());
+ }
+ // special treatment for root item, that has no name but '/' path.
+ if (rHandle == null || "".equals(rHandle)) {
+ rHandle = "/";
+ }
+ return new Locator(rPrefix, rHandle, this);
+ }
+
+ public DavResourceLocator createResourceLocator(String prefix, String workspacePath, String resourcePath) {
+ return new Locator(prefix, resourcePath, this);
+ }
+
+ private class Locator implements DavResourceLocator {
+
+ private final String prefix;
+ private final String itemPath;
+ private final DavLocatorFactory factory;
+
+ private Locator(String prefix, String itemPath, DavLocatorFactory factory) {
+ this.prefix = prefix;
+ this.factory = factory;
+ // remove trailing '/' that is not part of the itemPath except for the root item.
+ if (itemPath.endsWith("/") && !"/".equals(itemPath)) {
+ itemPath = itemPath.substring(0, itemPath.length()-1);
+ }
+ this.itemPath = itemPath;
+ }
+
+ public String getPrefix() {
+ return prefix;
+ }
+
+ public String getResourcePath() {
+ return itemPath;
+ }
+
+ public String getWorkspacePath() {
+ return "";
+ }
+
+ public String getWorkspaceName() {
+ return "";
+ }
+
+ public boolean isSameWorkspace(DavResourceLocator path) {
+ return isSameWorkspace(path.getWorkspaceName());
+ }
+
+ public boolean isSameWorkspace(String workspaceName) {
+ return getWorkspaceName().equals(workspaceName);
+ }
+
+ public String getHref(boolean isCollection) {
+ // avoid doubled trainling '/' for the root item
+ String suffix = (isCollection && !isRootLocation()) ? "/" : "";
+ return prefix + itemPath + suffix;
+ }
+
+ public boolean isRootLocation() {
+ return "/".equals(itemPath);
+ }
+
+ public DavLocatorFactory getFactory() {
+ return factory;
+ }
+
+ /**
+ * Computes the hash code using the prefix and the itemPath
+ *
+ * @return the hash code
+ */
+ public int hashCode() {
+ int hashCode = prefix.hashCode();
+ if (itemPath != null) {
+ hashCode += itemPath.hashCode();
+ }
+ return hashCode % Integer.MAX_VALUE;
+ }
+
+ /**
+ * Equality of path is achieved if the specified object is a <code>DavResourceLocator</code>
+ * and the return values of the two <code>getHref(boolean)</code> methods are
+ * equal.
+ *
+ * @param obj the object to compare to
+ * @return <code>true</code> if the 2 objects are equal;
+ * <code>false</code> otherwise
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof DavResourceLocator) {
+ DavResourceLocator path = (DavResourceLocator) obj;
+ this.getHref(true).equals(path.getHref(true));
+ }
+ return false;
+ }
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/LocatorFactoryImpl.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/LocatorFactoryImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,181 @@
+/*
+ * 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.log4j.Logger;
+import org.apache.jackrabbit.server.io.ExportContext;
+import org.apache.jackrabbit.server.io.ExportCollectionChain;
+import org.apache.jackrabbit.server.io.ExportResourceChain;
+import org.apache.commons.chain.Command;
+
+import javax.jcr.*;
+import java.util.Date;
+import java.util.Locale;
+import java.io.*;
+import java.text.SimpleDateFormat;
+
+/**
+ * The <code>NodeResource</code> class wraps a jcr item in order to respond
+ * to 'GET', 'HEAD', 'PROPFIND' or 'PROPPATCH' requests. If the item is a
+ * {@link javax.jcr.Node} its primary property is determined. The value of the
+ * primary property can be accessed by {@link #getStream()}. If possible other
+ * required information (last modification date, content type...) is retrieved
+ * from the property siblings.<br>
+ * If the requested item is a {@link javax.jcr.Property} it is treated accordingly.
+ */
+public class NodeResource {
+
+ /**
+ * the default logger
+ */
+ private static final Logger log = Logger.getLogger(NodeResource.class);
+
+ /**
+ * modificationDate date format per RFC 1123
+ */
+ public static SimpleDateFormat modificationDateFormat =
+ new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US);
+
+ /**
+ * Simple date format for the creation date ISO representation (partial).
+ */
+ public static SimpleDateFormat creationDateFormat =
+ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+
+ private long creationTime = 0;
+ private long modificationTime = new Date().getTime();
+ private long contentLength = 0;
+ private String contentType = null;
+ private InputStream in = null;
+
+ /**
+ * Create a new <code>NodeResource</code> that wraps a JSR170 item.
+ *
+ * @throws ItemNotFoundException
+ * @throws RepositoryException
+ * @throws IllegalArgumentException if the given item is <code>null</code>
+ */
+ public NodeResource(DavResourceImpl davResource, Node node) throws ItemNotFoundException, RepositoryException {
+ ExportContext ctx = new ExportContext(node);
+ Command exportChain = davResource.isCollection()
+ ? ExportCollectionChain.getChain()
+ : ExportResourceChain.getChain();
+ try {
+ exportChain.execute(ctx);
+ } catch (Exception e) {
+ log.error("Error while executing export chain: " + e.toString());
+ throw new RepositoryException(e);
+ }
+ this.contentLength = ctx.getContentLength();
+ this.contentType = ctx.getContentType();
+ this.in = ctx.getInputStream();
+ this.creationTime = ctx.getCreationTime();
+ this.modificationTime = ctx.getModificationTime();
+ }
+
+ /**
+ * Return the content length or '0'.
+ *
+ * @return content Length or '0' if it could not be determined.
+ */
+ public long getContentLength() {
+ return contentLength;
+ }
+
+ /**
+ * Return the creation time or '0'.
+ *
+ * @return creation time or '0' if it could not be determined.
+ */
+ public long getCreationTime() {
+ return creationTime;
+ }
+
+ /**
+ * Return the last modification time. By default it is set to the current
+ * time.
+ *
+ * @return time of last modification or the current time, if it could not
+ * be determined.
+ */
+ public long getModificationTime() {
+ return modificationTime;
+ }
+
+ /**
+ * Return the last modification time as formatted string.
+ *
+ * @return last modification time as string.
+ * @see NodeResource#modificationDateFormat
+ */
+ public String getLastModified() {
+ if (modificationTime >= 0) {
+ return modificationDateFormat.format(new Date(modificationTime));
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Return the creation time as formatted string.
+ *
+ * @return creation time as string.
+ * @see NodeResource#creationDateFormat
+ */
+ public String getCreationDate() {
+ if (creationTime >= 0) {
+ return creationDateFormat.format(new Date(creationTime));
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Return the weak ETag
+ *
+ * @return weak ETag
+ */
+ public String getETag() {
+ return "W/\"" + this.contentLength + "-" + this.modificationTime + "\"";
+ }
+
+ /**
+ * Return the strong ETag or empty string if it cannot be determined.
+ *
+ * @return strong ETag
+ */
+ public String getStrongETag() {
+ return "";
+ }
+
+ /**
+ * Return the content type or <code>null</code> if it could not be determined.
+ *
+ * @return content type
+ */
+ public String getContentType() {
+ return contentType;
+ }
+
+ /**
+ * Return a stream to the resource value.
+ *
+ * @return
+ */
+ public InputStream getStream() {
+ return in;
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/NodeResource.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,50 @@
+/*
+ * 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.webdav.*;
+import org.apache.jackrabbit.webdav.jcr.JcrDavException;
+import org.apache.jackrabbit.webdav.lock.LockManager;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * ResourceFactoryImpl implements a simple DavResourceFactory
+ */
+public class ResourceFactoryImpl implements DavResourceFactory {
+
+ private final LockManager lockMgr;
+
+ public ResourceFactoryImpl(LockManager lockMgr) {
+ this.lockMgr = lockMgr;
+ }
+
+ public DavResource createResource(DavResourceLocator locator, DavServletRequest request,
+ DavServletResponse response) throws DavException {
+ return createResource(locator, request.getDavSession());
+ }
+
+ public DavResource createResource(DavResourceLocator locator, DavSession session) throws DavException {
+ try {
+ DavResource res = new DavResourceImpl(locator, this, session);
+ res.addLockManager(lockMgr);
+ return res;
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
+ }
+ }
+}
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
------------------------------------------------------------------------------
svn =
Propchange: incubator/jackrabbit/trunk/contrib/jcr-server/server/src/java/org/apache/jackrabbit/webdav/simple/ResourceFactoryImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/project.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/project.xml?view=diff&r1=161659&r2=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/project.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/project.xml Sun Apr 17 07:51:59 2005
@@ -57,15 +57,15 @@
<dependency>
<groupId>jsr170</groupId>
<artifactId>jcr</artifactId>
- <version>0.16.2</version>
- <url>http://www.day.com/maven/jsr170/jars/jcr-0.16.2.jar</url>
+ <version>0.16.4</version>
+ <url>http://www.day.com/maven/jsr170/jars/jcr-0.16.4.jar</url>
<properties>
<war.bundle>true</war.bundle>
</properties>
</dependency>
<dependency>
<id>jackrabbit</id>
- <version>0.16.2-dev</version>
+ <version>0.16.4-dev</version>
<properties>
<war.bundle>true</war.bundle>
</properties>
@@ -90,7 +90,7 @@
</dependency>
<dependency>
<id>jcr-rmi</id>
- <version>0.16.2</version>
+ <version>0.16.4</version>
<properties>
<war.bundle>false</war.bundle>
</properties>
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml?view=diff&r1=161659&r2=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/catalog.xml Sun Apr 17 07:51:59 2005
@@ -24,7 +24,7 @@
<!--
command-chain for importing a webdav non-collection-resource into the jcr repository
-->
- <chain name="import-nc-resource">
+ <chain name="import-resource">
<!--
registers the content type of the resource in the import context
@return false
@@ -109,7 +109,7 @@
<!--
command-chain for exporting non-collection-resources
-->
- <chain name="export-nc-resource">
+ <chain name="export-resource">
<!--
exports the jcr:data property if the node contains a jcr:content
node of type nt:resource.
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/simple_catalog.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/simple_catalog.xml?view=diff&r1=161659&r2=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/simple_catalog.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/simple_catalog.xml Sun Apr 17 07:51:59 2005
@@ -17,7 +17,7 @@
<!--
command-chain for importing a webdav non-collection-resource into the jcr repository
-->
- <chain name="import-nc-resource">
+ <chain name="import-resource">
<command
id="set-contenttype"
className="org.apache.jackrabbit.server.io.SetContentTypeCommand"
@@ -42,7 +42,7 @@
<!--
command-chain for exporting non-collection-resources
-->
- <chain name="export-nc-resource">
+ <chain name="export-resource">
<command
id="export-file"
className="org.apache.jackrabbit.server.io.FileExportCommand"
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml?view=diff&r1=161659&r2=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webapp/src/webapp/WEB-INF/web.xml Sun Apr 17 07:51:59 2005
@@ -40,6 +40,7 @@
<description>Repository Name under which the repository is registered via JNDI/RMI</description>
</init-param>
+ <!--
<init-param>
<param-name>rmi-port</param-name>
<param-value>0</param-value>
@@ -49,7 +50,7 @@
disable RMI server completely.
</description>
</init-param>
-
+ -->
<!--
JNDI environment variables for creating the initial context
(all init parameters starting with java.naming.* will be added to the initial context environment).
@@ -169,7 +170,7 @@
<description>
The webdav servlet that connects HTTP request to the repository.
</description>
- <servlet-class>org.apache.jackrabbit.server.JCRWebdavServerServlet</servlet-class>
+ <servlet-class>org.apache.jackrabbit.server.jcr.JCRWebdavServerServlet</servlet-class>
<init-param>
<param-name>resource-path-prefix</param-name>
Modified: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/project.xml
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/project.xml?view=diff&r1=161659&r2=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/project.xml (original)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/project.xml Sun Apr 17 07:51:59 2005
@@ -32,12 +32,12 @@
<dependency>
<groupId>jsr170</groupId>
<artifactId>jcr</artifactId>
- <version>0.16.2</version>
- <url>http://www.day.com/maven/jsr170/jars/jcr-0.16.2.jar</url>
+ <version>0.16.4</version>
+ <url>http://www.day.com/maven/jsr170/jars/jcr-0.16.4.jar</url>
</dependency>
<dependency>
<id>jackrabbit</id>
- <version>0.16.2-dev</version>
+ <version>0.16.4-dev</version>
</dependency>
<dependency>
<id>jdom</id>
@@ -51,51 +51,6 @@
<id>servletapi</id>
<version>2.3</version>
</dependency>
- <dependency>
- <id>jcr-rmi</id>
- <version>0.16.2</version>
- </dependency>
- <!-- dependencies of jackrabbit -->
- <!--
- <dependency>
- <id>concurrent</id>
- <version>1.3.4</version>
- <properties>
- <war.bundle>true</war.bundle>
- </properties>
- </dependency>
- <dependency>
- <id>commons-collections</id>
- <version>2.1</version>
- <properties>
- <war.bundle>true</war.bundle>
- </properties>
- </dependency>
- <dependency>
- <groupId>geronimo-spec</groupId>
- <artifactId>geronimo-spec-jta</artifactId>
- <version>1.0-M1</version>
- <properties>
- <war.bundle>true</war.bundle>
- </properties>
- </dependency>
- <dependency>
- <groupId>lucene</groupId>
- <artifactId>lucene</artifactId>
- <version>1.4.3</version>
- <properties>
- <war.bundle>true</war.bundle>
- </properties>
- </dependency>
- <dependency>
- <groupId>xerces</groupId>
- <artifactId>xercesImpl</artifactId>
- <version>2.6.2</version>
- <properties>
- <war.bundle>true</war.bundle>
- </properties>
- </dependency>
- -->
</dependencies>
<!-- ====================================================================== -->
Added: incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/JcrConstants.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/JcrConstants.java?view=auto&rev=161660
==============================================================================
--- incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/JcrConstants.java (added)
+++ incubator/jackrabbit/trunk/contrib/jcr-server/webdav/src/java/org/apache/jackrabbit/JcrConstants.java Sun Apr 17 07:51:59 2005
@@ -0,0 +1,314 @@
+/*
+ * Copyright (c) 2005 Your Corporation. All Rights Reserved.
+ */
+package org.apache.jackrabbit;
+
+/**
+ * This Interface defines some jcr constants
+ */
+public interface JcrConstants {
+ /**
+ * jcr:autoCreated
+ */
+ public static final String JCR_AUTOCREATED = "jcr:autoCreated";
+ /**
+ * jcr:baseVersion
+ */
+ public static final String JCR_BASEVERSION = "jcr:baseVersion";
+ /**
+ * jcr:child
+ */
+ public static final String JCR_CHILD = "jcr:child";
+ /**
+ * jcr:childNodeDefinition
+ */
+ public static final String JCR_CHILDNODEDEFINITION = "jcr:childNodeDefinition";
+ /**
+ * jcr:content
+ */
+ public static final String JCR_CONTENT = "jcr:content";
+ /**
+ * jcr:created
+ */
+ public static final String JCR_CREATED = "jcr:created";
+ /**
+ * jcr:data
+ */
+ public static final String JCR_DATA = "jcr:data";
+ /**
+ * jcr:defaultPrimaryType
+ */
+ public static final String JCR_DEFAULTPRIMARYTYPE = "jcr:defaultPrimaryType";
+ /**
+ * jcr:defaultValues
+ */
+ public static final String JCR_DEFAULTVALUES = "jcr:defaultValues";
+ /**
+ * jcr:encoding
+ */
+ public static final String JCR_ENCODING = "jcr:encoding";
+ /**
+ * jcr:frozenMixinTypes
+ */
+ public static final String JCR_FROZENMIXINTYPES = "jcr:frozenMixinTypes";
+ /**
+ * jcr:frozenNode
+ */
+ public static final String JCR_FROZENNODE = "jcr:frozenNode";
+ /**
+ * jcr:frozenPrimaryType
+ */
+ public static final String JCR_FROZENPRIMARYTYPE = "jcr:frozenPrimaryType";
+ /**
+ * jcr:frozenUuid
+ */
+ public static final String JCR_FROZENUUID = "jcr:frozenUuid";
+ /**
+ * jcr:hasOrderableChildNodes
+ */
+ public static final String JCR_HASORDERABLECHILDNODES = "jcr:hasOrderableChildNodes";
+ /**
+ * jcr:isCheckedOut
+ */
+ public static final String JCR_ISCHECKEDOUT = "jcr:isCheckedOut";
+ /**
+ * jcr:isMixin
+ */
+ public static final String JCR_ISMIXIN = "jcr:isMixin";
+ /**
+ * jcr:language
+ */
+ public static final String JCR_LANGUAGE = "jcr:language";
+ /**
+ * jcr:lastModified
+ */
+ public static final String JCR_LASTMODIFIED = "jcr:lastModified";
+ /**
+ * jcr:lockIsDeep
+ */
+ public static final String JCR_LOCKISDEEP = "jcr:lockIsDeep";
+ /**
+ * jcr:lockOwner
+ */
+ public static final String JCR_LOCKOWNER = "jcr:lockOwner";
+ /**
+ * jcr:mandatory
+ */
+ public static final String JCR_MANDATORY = "jcr:mandatory";
+ /**
+ * jcr:mergeFailed
+ */
+ public static final String JCR_MERGEFAILED = "jcr:mergeFailed";
+ /**
+ * jcr:mimeType
+ */
+ public static final String JCR_MIMETYPE = "jcr:mimeType";
+ /**
+ * jcr:mixinTypes
+ */
+ public static final String JCR_MIXINTYPES = "jcr:mixinTypes";
+ /**
+ * jcr:multiple
+ */
+ public static final String JCR_MULTIPLE = "jcr:multiple";
+ /**
+ * jcr:name
+ */
+ public static final String JCR_NAME = "jcr:name";
+ /**
+ * jcr:nodeTypeName
+ */
+ public static final String JCR_NODETYPENAME = "jcr:nodeTypeName";
+ /**
+ * jcr:onParentVersion
+ */
+ public static final String JCR_ONPARENTVERSION = "jcr:onParentVersion";
+ /**
+ * jcr:predecessors
+ */
+ public static final String JCR_PREDECESSORS = "jcr:predecessors";
+ /**
+ * jcr:primaryItemName
+ */
+ public static final String JCR_PRIMARYITEMNAME = "jcr:primaryItemName";
+ /**
+ * jcr:primaryType
+ */
+ public static final String JCR_PRIMARYTYPE = "jcr:primaryType";
+ /**
+ * jcr:propertyDefinition
+ */
+ public static final String JCR_PROPERTYDEFINITION = "jcr:propertyDefinition";
+ /**
+ * jcr:protected
+ */
+ public static final String JCR_PROTECTED = "jcr:protected";
+ /**
+ * jcr:requiredPrimaryTypes
+ */
+ public static final String JCR_REQUIREDPRIMARYTYPES = "jcr:requiredPrimaryTypes";
+ /**
+ * jcr:requiredType
+ */
+ public static final String JCR_REQUIREDTYPE = "jcr:requiredType";
+ /**
+ * jcr:rootVersion
+ */
+ public static final String JCR_ROOTVERSION = "jcr:rootVersion";
+ /**
+ * jcr:sameNameSiblings
+ */
+ public static final String JCR_SAMENAMESIBLINGS = "jcr:sameNameSiblings";
+ /**
+ * jcr:statement
+ */
+ public static final String JCR_STATEMENT = "jcr:statement";
+ /**
+ * jcr:successors
+ */
+ public static final String JCR_SUCCESSORS = "jcr:successors";
+ /**
+ * jcr:supertypes
+ */
+ public static final String JCR_SUPERTYPES = "jcr:supertypes";
+ /**
+ * jcr:system
+ */
+ public static final String JCR_SYSTEM = "jcr:system";
+ /**
+ * jcr:uuid
+ */
+ public static final String JCR_UUID = "jcr:uuid";
+ /**
+ * jcr:valueConstraints
+ */
+ public static final String JCR_VALUECONSTRAINTS = "jcr:valueConstraints";
+ /**
+ * jcr:versionHistory
+ */
+ public static final String JCR_VERSIONHISTORY = "jcr:versionHistory";
+ /**
+ * jcr:versionLabels
+ */
+ public static final String JCR_VERSIONLABELS = "jcr:versionLabels";
+ /**
+ * jcr:versionStorage
+ */
+ public static final String JCR_VERSIONSTORAGE = "jcr:versionStorage";
+ /**
+ * jcr:versionableUuid
+ */
+ public static final String JCR_VERSIONABLEUUID = "jcr:versionableUuid";
+ /**
+ * mix:lockable
+ */
+ public static final String MIX_LOCKABLE = "mix:lockable";
+ /**
+ * mix:referenceable
+ */
+ public static final String MIX_REFERENCEABLE = "mix:referenceable";
+ /**
+ * mix:versionable
+ */
+ public static final String MIX_VERSIONABLE = "mix:versionable";
+ /**
+ * nt:base
+ */
+ public static final String NT_BASE = "nt:base";
+ /**
+ * nt:childNodeDefinition
+ */
+ public static final String NT_CHILDNODEDEFINITION = "nt:childNodeDefinition";
+ /**
+ * nt:file
+ */
+ public static final String NT_FILE = "nt:file";
+ /**
+ * nt:folder
+ */
+ public static final String NT_FOLDER = "nt:folder";
+ /**
+ * nt:frozenNode
+ */
+ public static final String NT_FROZENNODE = "nt:frozenNode";
+ /**
+ * nt:hierarchyNode
+ */
+ public static final String NT_HIERARCHYNODE = "nt:hierarchyNode";
+ /**
+ * nt:linkedFile
+ */
+ public static final String NT_LINKEDFILE = "nt:linkedFile";
+ /**
+ * nt:nodeType
+ */
+ public static final String NT_NODETYPE = "nt:nodeType";
+ /**
+ * nt:propertyDefinition
+ */
+ public static final String NT_PROPERTYDEFINITION = "nt:propertyDefinition";
+ /**
+ * nt:query
+ */
+ public static final String NT_QUERY = "nt:query";
+ /**
+ * nt:resource
+ */
+ public static final String NT_RESOURCE = "nt:resource";
+ /**
+ * nt:unstructured
+ */
+ public static final String NT_UNSTRUCTURED = "nt:unstructured";
+ /**
+ * nt:version
+ */
+ public static final String NT_VERSION = "nt:version";
+ /**
+ * nt:versionHistory
+ */
+ public static final String NT_VERSIONHISTORY = "nt:versionHistory";
+ /**
+ * nt:versionLabels
+ */
+ public static final String NT_VERSIONLABELS = "nt:versionLabels";
+ /**
+ * nt:versionedChild
+ */
+ public static final String NT_VERSIONEDCHILD = "nt:versionedChild";
+ /**
+ * rep:frozen
+ */
+ public static final String REP_FROZEN = "rep:frozen";
+ /**
+ * rep:frozenVersionHistory
+ */
+ public static final String REP_FROZENVERSIONHISTORY = "rep:frozenVersionHistory";
+ /**
+ * rep:nodeTypes
+ */
+ public static final String REP_NODETYPES = "rep:nodeTypes";
+ /**
+ * rep:root
+ */
+ public static final String REP_ROOT = "rep:root";
+ /**
+ * rep:system
+ */
+ public static final String REP_SYSTEM = "rep:system";
+ /**
+ * rep:version
+ */
+ public static final String REP_VERSION = "rep:version";
+ /**
+ * rep:versionHistory
+ */
+ public static final String REP_VERSIONHISTORY = "rep:versionHistory";
+ /**
+ * rep:versionLabels
+ */
+ public static final String REP_VERSIONLABELS = "rep:versionLabels";
+ /**
+ * rep:versionStorage
+ */
+ public static final String REP_VERSIONSTORAGE = "rep:versionStorage";
+}