You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by lu...@apache.org on 2004/09/17 17:38:42 UTC
cvs commit: jakarta-slide/src/webdav/server/org/apache/slide/webdav/util UnlockListenerImpl.java
luetzkendorf 2004/09/17 08:38:42
Modified: src/webdav/server/org/apache/slide/webdav/method Tag:
SLIDE_2_1_RELEASE_BRANCH AbstractWebdavMethod.java
src/webdav/server/org/apache/slide/webdav/util Tag:
SLIDE_2_1_RELEASE_BRANCH UnlockListenerImpl.java
Log:
fix for bug 31156; moved removement of Lock-Null resources to
from AbstractWebdavmethod to UnlockListenerImpl tomake it reusable.
Changes regarding expired locks are now commited before the actually
required work is done.
Revision Changes Path
No revision
No revision
1.43.2.6 +13 -27 jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/AbstractWebdavMethod.java
Index: AbstractWebdavMethod.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/AbstractWebdavMethod.java,v
retrieving revision 1.43.2.5
retrieving revision 1.43.2.6
diff -u -r1.43.2.5 -r1.43.2.6
--- AbstractWebdavMethod.java 12 Sep 2004 17:33:56 -0000 1.43.2.5
+++ AbstractWebdavMethod.java 17 Sep 2004 15:38:42 -0000 1.43.2.6
@@ -45,6 +45,7 @@
import org.apache.commons.transaction.locking.GenericLock;
import org.apache.commons.transaction.locking.MultiLevelLock;
import org.apache.commons.transaction.util.PrintWriterLogger;
+
import org.apache.slide.authenticate.CredentialsToken;
import org.apache.slide.common.Domain;
import org.apache.slide.common.NamespaceAccessToken;
@@ -57,11 +58,9 @@
import org.apache.slide.content.NodeRevisionContent;
import org.apache.slide.content.NodeRevisionDescriptor;
import org.apache.slide.content.NodeRevisionDescriptors;
-import org.apache.slide.content.RevisionDescriptorNotFoundException;
import org.apache.slide.content.NodeProperty.NamespaceCache;
import org.apache.slide.lock.Lock;
import org.apache.slide.lock.NodeLock;
-import org.apache.slide.lock.UnlockListener;
import org.apache.slide.macro.Macro;
import org.apache.slide.search.Search;
import org.apache.slide.security.Security;
@@ -361,29 +360,16 @@
}
// clear expired lock-tokens
- UnlockListener listener = new UnlockListenerImpl(slideToken, token, config, req, resp);
+ UnlockListenerImpl listener = new UnlockListenerImpl(slideToken, token, config, req, resp);
lock.clearExpiredLocks(slideToken, requestUri, listener);
-
- // if the URI has no more locks associated to it and is
- // a lock-null resource, we must attempt to delete it
-
- Enumeration locks = lock.enumerateLocks(slideToken, requestUri);
- if (!locks.hasMoreElements()) {
- try {
- NodeRevisionDescriptors revisionDescriptors = content.retrieve(slideToken, requestUri);
- NodeRevisionDescriptor revisionDescriptor = content.retrieve(slideToken, revisionDescriptors);
- if (isLockNull(revisionDescriptor)) {
- content.remove(slideToken, requestUri, revisionDescriptor);
- content.remove(slideToken, revisionDescriptors);
- ObjectNode node = structure.retrieve(slideToken, requestUri);
- structure.remove(slideToken, node);
- }
- } catch (ObjectNotFoundException onfe) {
- } catch (RevisionDescriptorNotFoundException e) {
- // this happens e.g. if some one tries to create a resource
- // in the history that looks like a version
- // e.g. PUT /history/221/7.1 (cf VcPutVHR)
- }
+
+ if (listener.getUnlockCount() > 0) {
+ // If we have have cleared any lock or any lock-null resource in
+ // the prevois step we commit this changes, otherwise they will
+ // be lost ifexecuteRequest() exits with an exception (e.g.
+ // because of Not Found 404)
+ token.commit();
+ token.begin();
}
executeRequest();
No revision
No revision
1.3.2.1 +48 -3 jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/UnlockListenerImpl.java
Index: UnlockListenerImpl.java
===================================================================
RCS file: /home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/UnlockListenerImpl.java,v
retrieving revision 1.3
retrieving revision 1.3.2.1
diff -u -r1.3 -r1.3.2.1
--- UnlockListenerImpl.java 5 Aug 2004 14:43:31 -0000 1.3
+++ UnlockListenerImpl.java 17 Sep 2004 15:38:42 -0000 1.3.2.1
@@ -23,6 +23,9 @@
package org.apache.slide.webdav.util;
+import java.util.Enumeration;
+import java.util.HashSet;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -33,7 +36,10 @@
import org.apache.slide.content.NodeProperty;
import org.apache.slide.content.NodeRevisionDescriptor;
import org.apache.slide.content.NodeRevisionDescriptors;
+import org.apache.slide.content.RevisionDescriptorNotFoundException;
import org.apache.slide.lock.UnlockListener;
+import org.apache.slide.structure.ObjectNotFoundException;
+import org.apache.slide.structure.Structure;
import org.apache.slide.util.Configuration;
import org.apache.slide.webdav.WebdavServletConfig;
import org.apache.slide.webdav.util.resourcekind.AbstractResourceKind;
@@ -49,6 +55,10 @@
WebdavServletConfig config;
HttpServletRequest req;
HttpServletResponse resp;
+ // counts the locks this listner is called for
+ int unlockCount = 0;
+ // set ot uris that are Lock-Null resources anre removed by this listener
+ HashSet removedLockNullResources = new HashSet();
/**
* Constructor
@@ -77,8 +87,11 @@
* @throws SlideException
*/
public void afterUnlock(String uri) throws SlideException {
+ unlockCount++;
+
// Check whether the resource must be checked-in due to auto-versioning semantics.
Content content = token.getContentHelper();
+ Structure structure = token.getStructureHelper();
NodeRevisionDescriptors revisionDescriptors =
content.retrieve(slideToken, uri);
NodeRevisionDescriptor revisionDescriptor =
@@ -106,6 +119,38 @@
catch (org.jdom.JDOMException e) {}
}
}
+
+ // if the URI has no more locks associated to it and is
+ // a lock-null resource, we must attempt to delete it
+ try {
+ Enumeration locks = token.getLockHelper().enumerateLocks(slideToken, uri);
+ if (!locks.hasMoreElements() && isLockNull(revisionDescriptor)) {
+ this.removedLockNullResources.add(uri);
+ content.remove(slideToken, uri, revisionDescriptor);
+ content.remove(slideToken, revisionDescriptors);
+ structure.remove(slideToken, structure.retrieve(slideToken, uri));
+ }
+ } catch (ObjectNotFoundException onfe) {
+ } catch (RevisionDescriptorNotFoundException e) {
+ // this happens e.g. if some one tries to create a resource
+ // in the history that looks like a version
+ // e.g. PUT /history/221/7.1 (cf VcPutVHR)
+ }
+ }
+
+ /**
+ * Returns the number on unlocks processed be this listener.
+ */
+ public int getUnlockCount() {
+ return this.unlockCount;
+ }
+ public boolean isRemovedLockResource(String uri) {
+ return this.removedLockNullResources.contains(uri);
+ }
+
+ private boolean isLockNull( NodeRevisionDescriptor nrd ) {
+ return nrd.propertyValueContains(WebdavConstants.P_RESOURCETYPE,
+ WebdavConstants.E_LOCKNULL);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org