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 2015/06/18 21:13:34 UTC
svn commit: r1686293 - in
/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit:
server/io/ webdav/simple/
Author: tripod
Date: Thu Jun 18 19:13:34 2015
New Revision: 1686293
URL: http://svn.apache.org/r1686293
Log:
JCR-3884 Add handler to handle webdav based DELETE requests
Added:
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContext.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContextImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteHandler.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManager.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManagerImpl.java
Modified:
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java?rev=1686293&r1=1686292&r2=1686293&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DefaultHandler.java Thu Jun 18 19:13:34 2015
@@ -71,7 +71,7 @@ import java.util.HashMap;
* Subclasses therefore should provide their own {@link #importData(ImportContext, boolean, Node)
* importData} method, that handles the data according their needs.
*/
-public class DefaultHandler implements IOHandler, PropertyHandler, CopyMoveHandler {
+public class DefaultHandler implements IOHandler, PropertyHandler, CopyMoveHandler, DeleteHandler {
private static Logger log = LoggerFactory.getLogger(DefaultHandler.class);
@@ -720,6 +720,35 @@ public class DefaultHandler implements I
return true;
} catch (RepositoryException e) {
throw new JcrDavException(e);
+ }
+ }
+
+ //----------------------------------------------------< DeleteHandler >---
+
+ /**
+ * @see DeleteHandler#canDelete(DeleteContext, DavResource)
+ */
+ public boolean canDelete(DeleteContext deleteContext, DavResource member) {
+ return true;
+ }
+
+ /**
+ * @see DeleteHandler#delete(DeleteContext, DavResource)
+ */
+ public boolean delete(DeleteContext deleteContext, DavResource member) throws DavException {
+ try {
+ String itemPath = member.getLocator().getRepositoryPath();
+ Item item = deleteContext.getSession().getItem(itemPath);
+ if (item instanceof Node) {
+ ((Node) item).removeShare();
+ } else {
+ item.remove();
+ }
+ deleteContext.getSession().save();
+ log.debug("default handler deleted {}", member.getResourcePath());
+ return true;
+ } catch (RepositoryException e) {
+ throw new JcrDavException(e);
}
}
Added: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContext.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContext.java?rev=1686293&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContext.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContext.java Thu Jun 18 19:13:34 2015
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.io;
+
+import javax.jcr.Session;
+
+/**
+ * The context associated with a DELETE operation
+ */
+public interface DeleteContext {
+
+ /**
+ * @return the jcr session associated with this context.
+ */
+ public Session getSession();
+
+}
Added: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContextImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContextImpl.java?rev=1686293&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContextImpl.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteContextImpl.java Thu Jun 18 19:13:34 2015
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.io;
+
+import javax.jcr.Session;
+
+/**
+ * Implements a simple delete context
+ */
+public class DeleteContextImpl implements DeleteContext {
+
+ private final Session session;
+
+ public DeleteContextImpl(Session session) {
+ this.session = session;
+ }
+
+ /**
+ * @see DeleteContext#getSession()
+ */
+ public Session getSession() {
+ return this.session;
+ }
+}
Added: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteHandler.java?rev=1686293&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteHandler.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteHandler.java Thu Jun 18 19:13:34 2015
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.io;
+
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavResource;
+
+/**
+ * The DeleteHandler is invoked when a webdav DELETE request is received. Implementers of this interface should plugin
+ * their handling of DELETE request here
+ */
+public interface DeleteHandler {
+
+ /**
+ * Executes the delete operation with the given parameters.
+ *
+ * @param deleteContext The context of the delete.
+ * @param resource The resource to be deleted
+ * @return {@code true} if this instance successfully executed the delete operation with the given parameters;
+ * {@code false} otherwise.
+ * @throws DavException If an error occurs.
+ */
+ public boolean delete(DeleteContext deleteContext, DavResource resource) throws DavException;
+
+
+ /**
+ * Validates if this handler is able to execute a delete operation with the given
+ * parameters.
+ *
+ * @param deleteContext The context of the delete
+ * @param resource The resource to be deleted
+ * @return {@code true} if this instance can successfully execute the delete operation with the given parameters;
+ * {@code false} otherwise.
+ */
+ public boolean canDelete(DeleteContext deleteContext, DavResource resource);
+}
Added: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManager.java?rev=1686293&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManager.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManager.java Thu Jun 18 19:13:34 2015
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.io;
+
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavResource;
+
+/**
+ * The DeleteManager handles DELETE operation by delegating it to its handlers. It also provides a way
+ * to register {@link org.apache.jackrabbit.server.io.DeleteHandler} within it. Implementers of this interface
+ * must invoke the registered delete handlers appropriately when a DELETE operation is to be performed
+ */
+public interface DeleteManager {
+
+ /**
+ * Delegates the delete operation to the fist handler that accepts it.
+ *
+ * @param deleteContext The context associated with the DELETE operation
+ * @param resource The resource to be deleted
+ * @return {@code true} if this instance successfully executed the delete operation with the given parameters;
+ * {@code false} otherwise.
+ * @throws DavException If an error occurs.
+ */
+ public boolean delete(DeleteContext deleteContext, DavResource resource) throws DavException;
+
+ /**
+ * Registers a delete handler
+ *
+ * @param deleteHandler Registers a delete handler with this delete manager
+ */
+ public void addDeleteHandler(DeleteHandler deleteHandler);
+
+ /**
+ * Returns the registered delete handlers
+ *
+ * @return An array of all the registered delete handlers.
+ */
+ public DeleteHandler[] getDeleteHandlers();
+}
Added: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManagerImpl.java?rev=1686293&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManagerImpl.java (added)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/server/io/DeleteManagerImpl.java Thu Jun 18 19:13:34 2015
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.io;
+
+import org.apache.jackrabbit.webdav.DavException;
+import org.apache.jackrabbit.webdav.DavResource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DeleteManagerImpl implements DeleteManager {
+
+ private static DeleteManager DEFAULT_MANAGER;
+
+ private final List<DeleteHandler> deleteHandlers = new ArrayList<DeleteHandler>();
+
+ /**
+ * @see DeleteManager#delete(DeleteContext, DavResource)
+ */
+ public boolean delete(DeleteContext deleteContext, DavResource member) throws DavException {
+ boolean success = false;
+ DeleteHandler[] deleteHandlers = getDeleteHandlers();
+ for (int i = 0; i < deleteHandlers.length && !success; i++) {
+ DeleteHandler dh = deleteHandlers[i];
+ if (dh.canDelete(deleteContext, member)) {
+ success = dh.delete(deleteContext, member);
+ }
+ }
+ return success;
+ }
+
+ /**
+ * @see DeleteManager#addDeleteHandler(DeleteHandler)
+ */
+ public void addDeleteHandler(DeleteHandler deleteHandler) {
+ if (deleteHandler == null) {
+ throw new IllegalArgumentException("'null' is not a valid DeleteHandler.");
+ }
+ deleteHandlers.add(deleteHandler);
+
+ }
+
+ /**
+ * @see DeleteManager#getDeleteHandlers()
+ */
+ public DeleteHandler[] getDeleteHandlers() {
+ return deleteHandlers.toArray(new DeleteHandler[deleteHandlers.size()]);
+ }
+
+ /**
+ * Returns this delete manager singleton
+ */
+ public static DeleteManager getDefaultManager() {
+ if (DEFAULT_MANAGER == null) {
+ DeleteManager manager = new DeleteManagerImpl();
+ manager.addDeleteHandler(new DefaultHandler());
+ DEFAULT_MANAGER = manager;
+ }
+ return DEFAULT_MANAGER;
+ }
+
+}
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java?rev=1686293&r1=1686292&r2=1686293&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/DavResourceImpl.java Thu Jun 18 19:13:34 2015
@@ -20,6 +20,8 @@ import org.apache.jackrabbit.JcrConstant
import org.apache.jackrabbit.server.io.AbstractExportContext;
import org.apache.jackrabbit.server.io.CopyMoveContextImpl;
import org.apache.jackrabbit.server.io.DefaultIOListener;
+import org.apache.jackrabbit.server.io.DeleteContextImpl;
+import org.apache.jackrabbit.server.io.DeleteManager;
import org.apache.jackrabbit.server.io.ExportContext;
import org.apache.jackrabbit.server.io.ExportContextImpl;
import org.apache.jackrabbit.server.io.IOListener;
@@ -557,31 +559,20 @@ public class DavResourceImpl implements
throw new DavException(DavServletResponse.SC_FORBIDDEN);
}
+ DeleteManager dm = config.getDeleteManager();
+ dm.delete(new DeleteContextImpl(getJcrSession()), member);
+ // make sure, non-jcr locks are removed, once the removal is completed
try {
- String itemPath = member.getLocator().getRepositoryPath();
- Item memItem = getJcrSession().getItem(itemPath);
- if (memItem instanceof Node) {
- ((Node)memItem).removeShare();
- } else {
- memItem.remove();
- }
- getJcrSession().save();
-
- // make sure, non-jcr locks are removed, once the removal is completed
- try {
- if (!isJcrLockable()) {
- ActiveLock lock = getLock(Type.WRITE, Scope.EXCLUSIVE);
- if (lock != null) {
- lockManager.releaseLock(lock.getToken(), member);
- }
+ if (!isJcrLockable()) {
+ ActiveLock lock = getLock(Type.WRITE, Scope.EXCLUSIVE);
+ if (lock != null) {
+ lockManager.releaseLock(lock.getToken(), member);
}
- } catch (DavException e) {
- // since check for 'locked' exception has been performed before
- // ignore any error here
}
- } catch (RepositoryException e) {
- throw new JcrDavException(e);
+ } catch (DavException e) {
+ // since check for 'locked' exception has been performed before
+ // ignore any error here
}
}
Modified: jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java?rev=1686293&r1=1686292&r2=1686293&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java (original)
+++ jackrabbit/trunk/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ResourceConfig.java Thu Jun 18 19:13:34 2015
@@ -35,6 +35,8 @@ import org.apache.jackrabbit.server.io.C
import org.apache.jackrabbit.server.io.CopyMoveManager;
import org.apache.jackrabbit.server.io.CopyMoveManagerImpl;
import org.apache.jackrabbit.server.io.DefaultIOManager;
+import org.apache.jackrabbit.server.io.DeleteManager;
+import org.apache.jackrabbit.server.io.DeleteManagerImpl;
import org.apache.jackrabbit.server.io.IOHandler;
import org.apache.jackrabbit.server.io.IOManager;
import org.apache.jackrabbit.server.io.PropertyHandler;
@@ -80,6 +82,7 @@ public class ResourceConfig {
private IOManager ioManager;
private CopyMoveManager cmManager;
private PropertyManager propManager;
+ private DeleteManager deleteManager;
private String[] nodetypeNames = new String[0];
private boolean collectionNames = false;
@@ -473,6 +476,18 @@ public class ResourceConfig {
}
/**
+ * Returns the delete manager.
+ * @return the delete manager
+ */
+ public DeleteManager getDeleteManager() {
+ if (deleteManager == null) {
+ log.debug("Missing delete-manager > building default.");
+ deleteManager = DeleteManagerImpl.getDefaultManager();
+ }
+ return deleteManager;
+ }
+
+ /**
* Returns true, if the given item represents a {@link Node node} that is
* either any of the nodetypes specified to represent a collection or
* none of the nodetypes specified to represent a non-collection, respectively.