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