juergen     02/03/15 01:38:05

  Modified:    src/webdav/server/org/apache/slide/webdav/util
                        VersioningHelper.java
  Log:
  Implemented precondition check for method 'checkin()'.
  (ralf)
  
  Revision  Changes    Path
  1.8       +85 -11    
jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java
  
  Index: VersioningHelper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- VersioningHelper.java     15 Mar 2002 06:44:10 -0000      1.7
  +++ VersioningHelper.java     15 Mar 2002 09:38:05 -0000      1.8
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
 1.7 2002/03/15 06:44:10 juergen Exp $
  - * $Revision: 1.7 $
  - * $Date: 2002/03/15 06:44:10 $
  + * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
 1.8 2002/03/15 09:38:05 juergen Exp $
  + * $Revision: 1.8 $
  + * $Date: 2002/03/15 09:38:05 $
    *
    * ====================================================================
    *
  @@ -82,20 +82,33 @@
   import org.apache.slide.common.Uri;
   import org.apache.slide.common.Domain;
   import org.apache.slide.common.NamespaceAccessToken;
  -import org.apache.slide.structure.Structure;
  -import org.apache.slide.structure.SubjectNode;
  +import org.apache.slide.common.ServiceAccessException;
  +
   import org.apache.slide.content.Content;
   import org.apache.slide.content.NodeProperty;
   import org.apache.slide.content.NodeRevisionContent;
   import org.apache.slide.content.NodeRevisionDescriptor;
   import org.apache.slide.content.NodeRevisionDescriptors;
   import org.apache.slide.content.NodeRevisionNumber;
  +import org.apache.slide.content.RevisionDescriptorNotFoundException;
  +
  +import org.apache.slide.lock.ObjectLockedException;
  +
  +import org.apache.slide.security.AccessDeniedException;
  +
  +import org.apache.slide.structure.Structure;
  +import org.apache.slide.structure.SubjectNode;
  +import org.apache.slide.structure.ObjectNotFoundException;
  +import org.apache.slide.structure.LinkedObjectNotFoundException;
  +
   import org.apache.slide.webdav.WebdavServletConfig;
   import org.apache.slide.webdav.WebdavException;
  +
   import org.apache.slide.webdav.util.PropertyHelper;
   import org.apache.slide.webdav.util.UriHandler;
   import org.apache.slide.webdav.util.DeltavConstants;
   import org.apache.slide.webdav.util.resourcekind.*;
  +
   import org.apache.util.WebdavStatus;
   
   import org.apache.slide.common.SlideException;
  @@ -395,7 +408,7 @@
                       }
                       
                       // check precondition 
C_CHECKOUT_OF_VERSION_WITH_DESCENDANT_IS_DISCOURAGED
  -                    if (E_DISCOURAGED.equals(checkoutForkElement.getName()) && 
!isForkOK())  {
  +                    else if (E_DISCOURAGED.equals(checkoutForkElement.getName()) && 
!isForkOK())  {
                           violatedPrecondition = new 
ViolatedPrecondition(C_CHECKOUT_OF_VERSION_WITH_DESCENDANT_IS_DISCOURAGED, 
WebdavStatus.SC_CONFLICT);
                       }
                   }
  @@ -412,7 +425,7 @@
                           }
                           
                           // check precondition 
C_CHECKOUT_OF_CHECKED_OUT_VERSION_IS_DISCOURAGED
  -                        if (E_DISCOURAGED.equals(checkoutForkElement.getName()) && 
!isForkOK())  {
  +                        else if 
(E_DISCOURAGED.equals(checkoutForkElement.getName()) && !isForkOK())  {
                               violatedPrecondition = new 
ViolatedPrecondition(C_CHECKOUT_OF_CHECKED_OUT_VERSION_IS_DISCOURAGED, 
WebdavStatus.SC_CONFLICT);
                           }
                       }
  @@ -460,10 +473,6 @@
               NodeProperty coutProp = rNrd.getProperty( P_CHECKED_OUT );
               NodeProperty predSetProp = rNrd.getProperty( P_PREDECESSOR_SET );
               
  -            // TODO: check precondition C_VERSION_HISTORY_IS_TREE
  -            // TODO: check precondition C_CHECKIN_FORK_FORBIDDEN
  -            // TODO: check precondition C_CHECKIN_FORK_DISCOURAGED
  -            
               // Retrieve VHR
               Element coutElm = pHelp.parsePropertyValue( (String)coutProp.getValue() 
);
               String vrUriOld = coutElm.getTextTrim();
  @@ -477,6 +486,12 @@
               NodeRevisionDescriptor vrNrdOld =
                   retrieveLatestRevisionDescriptor( vrUriOld, vhrNrds );
               
  +            ViolatedPrecondition violatedPrecondition = 
getCheckinPreconditionViolation(predSetProp, vhrNrds);
  +            if (violatedPrecondition != null) {
  +                sendPreconditionViolation(violatedPrecondition);
  +                return;
  +            }
  +            
               removeUriFromCheckoutSet(vrNrdOld, rNrds.getUri());
               
               // Create new VR in the MAIN branch
  @@ -538,6 +553,64 @@
       }
       
       /**
  +     * Returns the ViolatedPrecondition if one of the precondition defined for
  +     * the <code>CHECKIN</code> methods has been violated, otherwise
  +     * <code>null</code>.
  +     *
  +     * @param      predSetProp   the <code>predecessor-set</code> NodeProperty
  +     *                           of the VCR to checkin.
  +     * @param      vhrNrds       the NodeRevisionDescriptors of the associated VHR.
  +     *
  +     * @return     the ViolatedPrecondition (if any).
  +     */
  +    private ViolatedPrecondition getCheckinPreconditionViolation(NodeProperty 
predSetProp, NodeRevisionDescriptors vhrNrds) throws LinkedObjectNotFoundException, 
ServiceAccessException, ObjectLockedException, RevisionDescriptorNotFoundException, 
JDOMException, IllegalArgumentException, ObjectNotFoundException, 
AccessDeniedException {
  +        
  +        ViolatedPrecondition violatedPrecondition = null;
  +        
  +        if ( (predSetProp != null) && (predSetProp.getValue() != null) ) {
  +            XMLValue predecessors = new XMLValue(predSetProp.getValue().toString());
  +            
  +            Iterator iterator = predecessors.iterator();
  +            while (iterator.hasNext()) {
  +                String href = ((Element)iterator.next()).getText();
  +                if (href != null) {
  +                    
  +                    UriHandler predecessorUriHandler = new UriHandler( 
nsaToken.getName(), href);
  +                    
  +                    // check precondition C_VERSION_HISTORY_IS_TREE
  +                    if ( !predecessorUriHandler.isVersionUri() ||
  +                        
!vhrNrds.getUri().equals(predecessorUriHandler.getAssociatedHistoryUri()) ) {
  +                        violatedPrecondition = new 
ViolatedPrecondition(C_VERSION_HISTORY_IS_TREE, WebdavStatus.SC_FORBIDDEN);
  +                    }
  +                    
  +                    NodeRevisionNumber predecessorNrn = new 
NodeRevisionNumber(predecessorUriHandler.getVersionName());
  +                    NodeRevisionDescriptor predecessorNrd = content.retrieve(sToken,
  +                                                                             
vhrNrds,
  +                                                                             
predecessorNrn);
  +                    NodeProperty predecessorCheckinForkProperty = 
predecessorNrd.getProperty(P_CHECKIN_FORK);
  +                    if (predecessorCheckinForkProperty != null) {
  +                        
  +                        Enumeration predecessorSuccessors = 
vhrNrds.getSuccessors(predecessorNrn);
  +                        if ( (predecessorSuccessors != null) && 
(predecessorSuccessors.hasMoreElements()) ) {
  +                            
  +                            // check precondition C_CHECKIN_FORK_FORBIDDEN
  +                            if 
(E_FORBIDDEN.equals(predecessorCheckinForkProperty.getValue())) {
  +                                violatedPrecondition = new 
ViolatedPrecondition(C_CHECKIN_FORK_FORBIDDEN, WebdavStatus.SC_FORBIDDEN);
  +                            }
  +                            
  +                            // check precondition C_CHECKIN_FORK_DISCOURAGED
  +                            else if 
(E_DISCOURAGED.equals(predecessorCheckinForkProperty.getValue()) && !isForkOK() ) {
  +                                violatedPrecondition = new 
ViolatedPrecondition(C_CHECKIN_FORK_FORBIDDEN, WebdavStatus.SC_CONFLICT);
  +                            }
  +                        }
  +                    }
  +                }
  +            }
  +        }
  +        return violatedPrecondition;
  +    }
  +    
  +    /**
        * Adds the given <code>uri</code> to the <code>&lt;checkout-set&gt;</code>
        * property of the VR's NodeRevisionDescriptor (if not already contained).
        *
  @@ -675,4 +748,5 @@
       }
       
   }
  +
   
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to