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 re...@apache.org on 2001/08/30 16:56:58 UTC

cvs commit: jakarta-slide/src/share/org/apache/slide/store AbstractStore.java

remm        01/08/30 07:56:58

  Modified:    src/share/org/apache/slide/store AbstractStore.java
  Log:
  - Add a new flag in the SlideToken, called 'ForceStoreEnlistment', which can
    be used to tell Slide to always enlist the store on every operation (incl reads).
    Of course, that will have a huge impact on performance, so it is only to be
    used in some critical code sections (where it is very important to avoid
    dirty reads).
  - Untested at the moment, but portions of the WebDAV servlet will be modified
    to use that feature.
  - There's a problem with the Uri cache and this. Either the Uri will have to be
    fast cloned, and / or the mapping algorithm should be rewritten to something
    efficient.
  
  Revision  Changes    Path
  1.18      +127 -16   jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java
  
  Index: AbstractStore.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -u -r1.17 -r1.18
  --- AbstractStore.java	2001/07/25 18:07:41	1.17
  +++ AbstractStore.java	2001/08/30 14:56:57	1.18
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java,v 1.17 2001/07/25 18:07:41 dirkv Exp $
  - * $Revision: 1.17 $
  - * $Date: 2001/07/25 18:07:41 $
  + * $Header: /home/cvs/jakarta-slide/src/share/org/apache/slide/store/AbstractStore.java,v 1.18 2001/08/30 14:56:57 remm Exp $
  + * $Revision: 1.18 $
  + * $Date: 2001/08/30 14:56:57 $
    *
    * ====================================================================
    *
  @@ -89,7 +89,7 @@
    * Abstract implementation of a store. Handles all caching operations.
    *
    * @author <a href="mailto:remm@apache.org">Remy Maucherat</a>
  - * @version $Revision: 1.17 $
  + * @version $Revision: 1.18 $
    */
   public abstract class AbstractStore extends AbstractSimpleService
       implements Store {
  @@ -486,7 +486,24 @@
        */
       public ObjectNode retrieveObject(Uri uri)
           throws ServiceAccessException, ObjectNotFoundException {
  -        ObjectNode objectNode = nodeStore.retrieveObject(uri);
  +        ObjectNode objectNode = null;
  +        if (isForceStoreEnlistment(uri)) {
  +            enlist(nodeStore);
  +            try {
  +                objectNode = nodeStore.retrieveObject(uri);
  +            }  catch (ServiceAccessException e) {
  +                delist(nodeStore, false);
  +                throw e;
  +            } catch (ObjectNotFoundException e) {
  +                // Note : Failed reads aren't considered fatal (ie, the 
  +                // transaction won't be always rolledback when committed)
  +                delist(nodeStore);
  +                throw e;
  +            }
  +            delist(nodeStore);
  +        } else {
  +            objectNode = nodeStore.retrieveObject(uri);
  +        }
           objectNode.validate(uri.toString());
           return objectNode;
       }
  @@ -637,7 +654,20 @@
       public Enumeration enumeratePermissions(Uri uri)
           throws ServiceAccessException {
           // TODO : The vectors elements MUST be cloned
  -        return securityStore.enumeratePermissions(uri);
  +        if (isForceStoreEnlistment(uri)) {
  +            enlist(securityStore);
  +            Enumeration permissions = null;
  +            try {
  +                permissions = securityStore.enumeratePermissions(uri);
  +            } catch (ServiceAccessException e) {
  +                delist(securityStore, false);
  +                throw e;
  +            }
  +            delist(securityStore);
  +            return permissions;
  +        } else {
  +            return securityStore.enumeratePermissions(uri);
  +        }
       }
       
       
  @@ -742,7 +772,20 @@
        */
       public Enumeration enumerateLocks(Uri uri)
           throws ServiceAccessException {
  -        return lockStore.enumerateLocks(uri);
  +        if (isForceStoreEnlistment(uri)) {
  +            enlist(lockStore);
  +            Enumeration locks = null;
  +            try {
  +                locks = lockStore.enumerateLocks(uri);
  +            } catch (ServiceAccessException e) {
  +                delist(lockStore, false);
  +                throw e;
  +            }
  +            delist(lockStore);
  +            return locks;
  +        } else {
  +            return lockStore.enumerateLocks(uri);
  +        }
       }
       
       
  @@ -756,10 +799,27 @@
        */
       public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
           throws ServiceAccessException, RevisionDescriptorNotFoundException {
  -        NodeRevisionDescriptors tempDescriptors =
  -            revisionDescriptorsStore.retrieveRevisionDescriptors(uri);
  -        tempDescriptors.validate(uri.toString());
  -        return tempDescriptors;
  +        NodeRevisionDescriptors revisionDescriptors = null;
  +        if (isForceStoreEnlistment(uri)) {
  +            enlist(revisionDescriptorsStore);
  +            try {
  +                revisionDescriptors = 
  +                    revisionDescriptorsStore.retrieveRevisionDescriptors(uri);
  +            } catch (ServiceAccessException e) {
  +                delist(revisionDescriptorsStore, false);
  +                throw e;
  +            } catch (RevisionDescriptorNotFoundException e) {
  +                // Normal read failures aren't considered fatal
  +                delist(revisionDescriptorsStore);
  +                throw e;
  +            }
  +            delist(revisionDescriptorsStore);
  +        } else {
  +            revisionDescriptors =
  +                revisionDescriptorsStore.retrieveRevisionDescriptors(uri);
  +        }
  +        revisionDescriptors.validate(uri.toString());
  +        return revisionDescriptors;
       }
       
       
  @@ -842,9 +902,27 @@
       public NodeRevisionDescriptor retrieveRevisionDescriptor
           (Uri uri, NodeRevisionNumber revisionNumber)
           throws ServiceAccessException, RevisionDescriptorNotFoundException {
  -        NodeRevisionDescriptor revisionDescriptor =
  -            revisionDescriptorStore.retrieveRevisionDescriptor
  -            (uri, revisionNumber);
  +        NodeRevisionDescriptor revisionDescriptor = null;
  +        if (isForceStoreEnlistment(uri)) {
  +            enlist(revisionDescriptorsStore);
  +            try {
  +                revisionDescriptor =
  +                    revisionDescriptorStore.retrieveRevisionDescriptor
  +                    (uri, revisionNumber);
  +            } catch (ServiceAccessException e) {
  +                delist(revisionDescriptorsStore, false);
  +                throw e;
  +            } catch (RevisionDescriptorNotFoundException e) {
  +                // Normal read failures aren't considered fatal
  +                delist(revisionDescriptorsStore);
  +                throw e;
  +            }
  +            delist(revisionDescriptorsStore);
  +        } else {
  +            revisionDescriptor =
  +                revisionDescriptorStore.retrieveRevisionDescriptor
  +                (uri, revisionNumber);
  +        }
           revisionDescriptor.validate();
           return revisionDescriptor;
       }
  @@ -931,8 +1009,26 @@
       public NodeRevisionContent retrieveRevisionContent
           (Uri uri, NodeRevisionDescriptor revisionDescriptor)
           throws ServiceAccessException, RevisionNotFoundException {
  -        NodeRevisionContent revisionContent =
  -            contentStore.retrieveRevisionContent(uri, revisionDescriptor);
  +        NodeRevisionContent revisionContent = null;
  +        if (isForceStoreEnlistment(uri)) {
  +            enlist(contentStore);
  +            try {
  +                revisionContent = 
  +                    contentStore.retrieveRevisionContent
  +                    (uri, revisionDescriptor);
  +            } catch (ServiceAccessException e) {
  +                delist(contentStore, false);
  +                throw e;
  +            } catch (RevisionNotFoundException e) {
  +                // Normal read failures aren't considered fatal
  +                delist(contentStore);
  +                throw e;
  +            }
  +            delist(contentStore);
  +        } else {
  +            revisionContent =
  +                contentStore.retrieveRevisionContent(uri, revisionDescriptor);
  +        }
           revisionContent.validate();
           return revisionContent;
       }
  @@ -1016,6 +1112,21 @@
   
   
       // ------------------------------------------------------ Protected Methods
  +    
  +    
  +    /**
  +     * Return true if the store should also be enlisted for a read operation.
  +     */
  +    protected boolean isForceStoreEnlistment(Uri uri) {
  +        
  +        SlideToken token = uri.getToken();
  +        
  +        if (token == null)
  +            return false;
  +        
  +        return token.isForceStoreEnlistment();
  +        
  +    }
       
       
       /**