pnever      02/03/01 08:49:04

  Modified:    src/webdav/server/org/apache/slide/webdav/util
                        VersioningHelper.java
  Log:
  Added checkin functionality
  
  Revision  Changes    Path
  1.3       +240 -70   
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.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- VersioningHelper.java     28 Feb 2002 12:39:01 -0000      1.2
  +++ VersioningHelper.java     1 Mar 2002 16:49:04 -0000       1.3
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
 1.2 2002/02/28 12:39:01 pnever Exp $
  - * $Revision: 1.2 $
  - * $Date: 2002/02/28 12:39:01 $
  + * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
 1.3 2002/03/01 16:49:04 pnever Exp $
  + * $Revision: 1.3 $
  + * $Date: 2002/03/01 16:49:04 $
    *
    * ====================================================================
    *
  @@ -66,6 +66,7 @@
   import java.io.*;
   import java.util.*;
   
  +import org.jdom.Element;
   import org.jdom.JDOMException;
   
   import javax.servlet.http.HttpServletRequest;
  @@ -118,6 +119,7 @@
       private HttpServletRequest req = null;
       private HttpServletResponse resp = null;
       private WebdavServletConfig sConf = null;
  +    private PropertyHelper pHelp = null;
       
       /**
        * Protected contructor
  @@ -130,32 +132,71 @@
           this.sConf = sConf;
           this.content = nsaToken.getContentHelper();
           this.structure = nsaToken.getStructureHelper();
  +        this.pHelp = PropertyHelper.getPropertyHelper( sToken,nsaToken );
  +    }
  +    
  +    /**
  +     * Retrieve the DeltaV-compliant NRDS instance for the specified resource path.
  +     */
  +    public NodeRevisionDescriptors
  +    retrieveRevisionDescriptors( String resourcePath ) throws SlideException {
  +        
  +        NodeRevisionDescriptors rNrds = null;
  +        UriHandler rUh = UriHandler.getUriHandler( nsaToken, resourcePath );
  +        
  +        if( rUh.isVersionUri() )
  +            rNrds = content.retrieve( sToken, rUh.getAssociatedHistoryUri() );
  +        else
  +            rNrds = content.retrieve( sToken, resourcePath );
  +        
  +        return rNrds;
  +    }
  +    
  +    /**
  +     * Retrieve the latest DeltaV-compliant NRD instance for the specified
  +     * resource path and associated to the specified NRDS instance.
  +     */
  +    public NodeRevisionDescriptor
  +    retrieveLatestRevisionDescriptor( String resourcePath, NodeRevisionDescriptors 
rNrds ) throws SlideException {
  +        
  +        NodeRevisionDescriptor rNrd = null;
  +        UriHandler rUh = UriHandler.getUriHandler( nsaToken, resourcePath );
  +        
  +        if( rUh.isHistoryUri() ) {
  +            rNrd = content.retrieve( sToken, rNrds,
  +                                 new NodeRevisionNumber(0, 0) );
  +        }
  +        else if( rUh.isVersionUri() ) {
  +            rNrd = content.retrieve( sToken, rNrds,
  +                                 new NodeRevisionNumber(rUh.getVersionName()) );
  +        }
  +        else {
  +            rNrd = content.retrieve( sToken, rNrds );
  +        }
  +        
  +        return rNrd;
       }
       
       /**
        * Set the specified resource under version control
        */
       public void versionControl( String resourcePath ) throws SlideException {
  -        UriHandler uh = UriHandler.getUriHandler( nsaToken, resourcePath );
  -        PropertyHelper ph = PropertyHelper.getPropertyHelper( sToken,nsaToken );
  +        UriHandler rUh = UriHandler.getUriHandler( nsaToken, resourcePath );
           Iterator i;
  +        Enumeration j;
           
  -        String realPath = resourcePath;
  -        if( uh.isVersionUri() )
  -            realPath = uh.getAssociatedHistoryUri();
  -        
  -        NodeRevisionDescriptors vcrNrds = content.retrieve( sToken, realPath );
  -        NodeRevisionDescriptor vcrNrd = content.retrieve( sToken, vcrNrds );
  -        NodeRevisionContent vcrNrc = content.retrieve( sToken, vcrNrds, vcrNrd );
  -        ResourceKind resourceKind = AbstractResourceKind.determineResourceKind( 
vcrNrd );
  +        NodeRevisionDescriptors rNrds = retrieveRevisionDescriptors( resourcePath );
  +        NodeRevisionDescriptor rNrd = retrieveLatestRevisionDescriptor( 
resourcePath, rNrds );
  +        NodeRevisionContent rNrc = content.retrieve( sToken, rNrds, rNrd );
  +        ResourceKind rRk = AbstractResourceKind.determineResourceKind( rNrd );
           
  -        if( !resourceKind.isSupportedMethod(req.getMethod()) ) {
  +        if( !rRk.isSupportedMethod(req.getMethod()) ) {
               resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
               return;
           }
           
  -        // Check for resourceKind = K_VERSION_CONTROLLED*
  -        if( resourceKind instanceof VersionControlled ) {
  +        // Check for rRk = K_VERSION_CONTROLLED*
  +        if( rRk instanceof VersionControlled ) {
               // nothing to do
               resp.setStatus(WebdavStatus.SC_OK);
               return;
  @@ -164,10 +205,20 @@
           // Set initial VR properties
           NodeRevisionDescriptor vrNrd =
               new NodeRevisionDescriptor(req.getContentLength());
  -        i = ph.createInitialProperties(VersionImpl.getInstance()).iterator();
  +        i = pHelp.createInitialProperties(VersionImpl.getInstance()).iterator();
           while( i.hasNext() )
               vrNrd.setProperty( (NodeProperty)i.next() );
           
  +        // Copy dead properties VCR -> VR
  +        j = rNrd.enumerateProperties();
  +        while( j.hasMoreElements() ) {
  +            NodeProperty p = (NodeProperty)j.nextElement();
  +            if( rRk.isSupportedLiveProperty(p.getName()) )
  +                continue;
  +            if( !vrNrd.exists(p.getName()) )
  +                vrNrd.setProperty( p );
  +        }
  +        
           // Set initial VHR properties
           NodeRevisionNumber vhrNrn = new NodeRevisionNumber( 0, 0 ); //major=0; 
minor=0
           Vector vhrLabels = new Vector();
  @@ -175,50 +226,47 @@
           String vhrBranch = NodeRevisionDescriptors.MAIN_BRANCH;
           NodeRevisionDescriptor vhrNrd =
               new NodeRevisionDescriptor( vhrNrn, vhrBranch, vhrLabels, vhrProps );
  -        i = ph.createInitialProperties(VersionHistoryImpl.getInstance()).iterator();
  +        i = 
pHelp.createInitialProperties(VersionHistoryImpl.getInstance()).iterator();
           while( i.hasNext() )
               vhrNrd.setProperty( (NodeProperty)i.next() );
           
           // Set initial VCR properties (do not overwrite existing!!)
  -        i = 
ph.createInitialProperties(VersionControlledImpl.getInstance()).iterator();
  +        i = 
pHelp.createInitialProperties(VersionControlledImpl.getInstance()).iterator();
           while( i.hasNext() ) {
               NodeProperty p = (NodeProperty)i.next();
  -            if( !vcrNrd.exists(p.getName()) )
  -                vcrNrd.setProperty( p );
  +            if( !rNrd.exists(p.getName()) )
  +                rNrd.setProperty( p );
           }
           
           // Create VHR/VR
  -        UriHandler vhrUri = UriHandler.createNextHistoryUri( sToken, nsaToken );
  -        String vhrUriStr = String.valueOf( vhrUri );
  +        UriHandler vhrUh = UriHandler.createNextHistoryUri( sToken, nsaToken );
  +        String vhrUri = String.valueOf( vhrUh );
           SubjectNode vhrNode = new SubjectNode();
  -        structure.create( sToken, vhrNode, String.valueOf(vhrUri) );
  -        content.create( sToken, vhrUriStr, true ); //isVersioned=true
  -        content.create( sToken, vhrUriStr, vrNrd, vcrNrc );
  +        structure.create( sToken, vhrNode, String.valueOf(vhrUh) );
  +        content.create( sToken, vhrUri, true ); //isVersioned=true
  +        content.create( sToken, vhrUri, vrNrd, rNrc );
           NodeRevisionDescriptors vhrNrds =
  -            content.retrieve( sToken, vhrUriStr );
  +            retrieveRevisionDescriptors( vhrUri );
           content.create(
  -            sToken, vhrUriStr, null, vhrNrd, null ); //branch=null, 
revisionContent=null
  +            sToken, vhrUri, null, vhrNrd, null ); //branch=null, 
revisionContent=null
           
           // Create VR node
           NodeRevisionNumber vrVersion = vrNrd.getRevisionNumber();
           SubjectNode vrNode = new SubjectNode();
  -        UriHandler vrUri =
  -            UriHandler.createVersionUri( nsaToken, vhrUri, 
String.valueOf(vrVersion) );
  -        String vrUriStr = String.valueOf( vrUri );
  -        structure.create( sToken, vrNode, String.valueOf(vrUri) );
  +        UriHandler vrUh =
  +            UriHandler.createVersionUri( nsaToken, vhrUh, String.valueOf(vrVersion) 
);
  +        String vrUri = String.valueOf( vrUh );
  +        structure.create( sToken, vrNode, String.valueOf(vrUh) );
           
           // Set specific properties
  -        // First VCR ...
  -        vcrNrd.setProperty(
  -            new NodeProperty(P_CHECKED_IN, ph.createHrefValue(vrUriStr)) );
  -        // ... then VHR ...
  -        vhrNrd.setETag( vhrUriStr.hashCode()+"_" ); // P_GETETAG
  +        rNrd.setProperty(
  +            new NodeProperty(P_CHECKED_IN, pHelp.createHrefValue(vrUri)) );
  +        vhrNrd.setETag( vhrUri.hashCode()+"_" ); // P_GETETAG
           vhrNrd.setLastModified( new Date() ); // P_GETLASTMODIFIED
           vhrNrd.setContentLength( 0 ); // P_GETCONTENTLENGTH
  -        vhrNrd.setName( vhrUri.getHistoryName() ); // P_DISPLAYNAME
  +        vhrNrd.setName( (String)pHelp.createCdataValue(vhrUh.getHistoryName()) ); 
// P_DISPLAYNAME
           vhrNrd.setProperty(
  -            new NodeProperty(P_VERSION_SET, ph.createHrefValue(vrUriStr)) );
  -        // ... and finally VR ...
  +            new NodeProperty(P_VERSION_SET, pHelp.createHrefValue(vrUri)) );
           /* Content Type --start-- */
           String contentType = req.getContentType();
           if (contentType == null) {
  @@ -230,43 +278,42 @@
           }
           vrNrd.setContentType(contentType); // P_GETCONTENTTYPE
           /* Content Type --end-- */
  -        vrNrd.setName( vrUri.getVersionName() ); // P_DISPLAYNAME
  -        vrNrd.setContentLanguage( "en" ); // P_GETCONTENTLANGUAGE
  -        vrNrd.setETag( vrUriStr.hashCode()+"_"+req.getContentLength() ); // 
P_GETETAG
  +        vrNrd.setName( (String)pHelp.createCdataValue(vrUh.getVersionName()) ); // 
P_DISPLAYNAME
  +        vrNrd.setETag( vrUri.hashCode()+"_"+req.getContentLength() ); // P_GETETAG
           vrNrd.setCreationDate( new Date() ); // P_CREATIONDATE
           vrNrd.setProperty(
  -            new NodeProperty(P_VERSION_HISTORY, ph.createHrefValue(vhrUriStr)) );
  -        vrNrd.setProperty(
  -            new NodeProperty(P_VERSION_NAME, vrUri.getVersionName()) );
  +            new NodeProperty(P_VERSION_NAME, vrUh.getVersionName()) );
           
           // Store changes
  -        content.store( sToken, resourcePath, vcrNrd, null ); //revisionContent=null
  -        content.store( sToken, vhrUriStr, vhrNrd, null ); //revisionContent=null
  -        content.store( sToken, vhrUriStr, vrNrd, null ); //revisionContent=null
  +        content.store( sToken, resourcePath, rNrd, null ); //revisionContent=null
  +        content.store( sToken, vhrUri, vhrNrd, null ); //revisionContent=null
  +        content.store( sToken, vhrUri, vrNrd, null ); //revisionContent=null
       }
       
       /**
        * Checkout the specified resource
        */
       public void checkout( String resourcePath, boolean forkOk, boolean 
applyToVersion )
  -    throws SlideException, JDOMException {
  +    throws SlideException {
           
  -        UriHandler uh = UriHandler.getUriHandler( nsaToken, resourcePath );
  -        PropertyHelper ph = PropertyHelper.getPropertyHelper( sToken,nsaToken );
  -        Iterator i;
  +        NodeRevisionDescriptors rNrds = retrieveRevisionDescriptors( resourcePath );
  +        NodeRevisionDescriptor rNrd = retrieveLatestRevisionDescriptor( 
resourcePath, rNrds );
  +        checkout( rNrds, rNrd, forkOk, applyToVersion );
  +    }
  +    
  +    /**
  +     * Checkout the specified resource
  +     */
  +    public void checkout( NodeRevisionDescriptors rNrds,
  +    NodeRevisionDescriptor rNrd, boolean forkOk, boolean applyToVersion )
  +    throws SlideException {
           
  -        String realPath = resourcePath;
  -        if( uh.isVersionUri() )
  -            realPath = uh.getAssociatedHistoryUri();
  -        
  -        NodeRevisionDescriptors vcrNrds = content.retrieve( sToken, realPath );
  -        NodeRevisionDescriptor vcrNrd = content.retrieve( sToken, vcrNrds );
  -        ResourceKind resourceKind = AbstractResourceKind.determineResourceKind( 
vcrNrd );
  +        Iterator i;
  +        ResourceKind rRk = AbstractResourceKind.determineResourceKind( rNrd );
           
  -        if( !resourceKind.isSupportedMethod(req.getMethod()) ) {
  +        if( !rRk.isSupportedMethod(req.getMethod()) ) {
               // check precondition C_MUST_BE_CHECKED_IN
  -            if( resourceKind instanceof CheckedOut )
  -            {
  +            if( rRk instanceof CheckedOut ) {
                   resp.setStatus(WebdavStatus.SC_CONFLICT);
                   // TODO: set response error element
                   return;
  @@ -275,28 +322,151 @@
               return;
           }
           
  -        if( resourceKind instanceof CheckedInVersionControlled ) {
  -            NodeProperty cinProp = vcrNrd.getProperty( P_CHECKED_IN );
  +        if( rRk instanceof CheckedInVersionControlled ) {
  +            NodeProperty cinProp = rNrd.getProperty( P_CHECKED_IN );
  +            
               // TODO: check precondition 
C_CHECKOUT_OF_VERSION_WITH_DESCENDANT_IS_FORBIDDEN
               // TODO: check precondition 
C_CHECKOUT_OF_VERSION_WITH_DESCENDANT_IS_DISCOURAGED
               // TODO: check precondition 
C_CHECKOUT_OF_CHECKED_OUT_VERSION_IS_FORBIDDEN
               // TODO: check precondition 
C_CHECKOUT_OF_CHECKED_OUT_VERSION_IS_DISCOURAGED
               
               // do the checkout
  -            vcrNrd.removeProperty( cinProp );
  -            vcrNrd.setProperty(
  +            rNrd.removeProperty( cinProp );
  +            rNrd.setProperty(
                   new NodeProperty(P_CHECKED_OUT, cinProp.getValue()) );
  -            vcrNrd.setProperty(
  +            rNrd.setProperty(
                   new NodeProperty(P_PREDECESSOR_SET, cinProp.getValue()) );
  +            
  +            // Store changes
  +            content.store( sToken, rNrds.getUri(), rNrd, null ); 
//revisionContent=null
           }
  -        else if( resourceKind instanceof Version ) {
  +        else if( rRk instanceof Version ) {
               Domain.info(
                   "Working resource feature NOT YET IMPLEMENTED" );
           }
           else {
               Domain.warn(
  -                "Do not know how to checkout a '"+resourceKind+"' resource" );
  +                "Do not know how to checkout a '"+rRk+"' resource" );
  +            resp.setStatus(WebdavStatus.SC_CONFLICT);
  +            return;
  +        }
  +    }
  +    
  +    /**
  +     * Checkin the specified resource
  +     */
  +    public void checkin( String resourcePath, boolean forkOk, boolean 
keepCheckedOut )
  +    throws SlideException, JDOMException {
  +        
  +        NodeRevisionDescriptors rNrds = retrieveRevisionDescriptors( resourcePath );
  +        NodeRevisionDescriptor rNrd = retrieveLatestRevisionDescriptor( 
resourcePath, rNrds );
  +        checkin( rNrds, rNrd, forkOk, keepCheckedOut );
  +    }
  +    
  +    /**
  +     * Checkin the specified resource
  +     */
  +    public void checkin( NodeRevisionDescriptors rNrds,
  +    NodeRevisionDescriptor rNrd, boolean forkOk, boolean keepCheckedOut )
  +    throws SlideException, JDOMException {
  +        
  +        Iterator i;
  +        Enumeration j;
  +        NodeRevisionContent rNrc = content.retrieve( sToken, rNrds, rNrd );
  +        ResourceKind rRk = AbstractResourceKind.determineResourceKind( rNrd );
  +        
  +        if( !rRk.isSupportedMethod(req.getMethod()) ) {
  +            // check precondition C_MUST_BE_CHECKED_OUT
  +            if( !(rRk instanceof CheckedOut) ) {
  +                resp.setStatus(WebdavStatus.SC_CONFLICT);
  +                // TODO: set response error element
  +                return;
  +            }
               resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
  +            return;
  +        }
  +        
  +        if( rRk instanceof CheckedOutVersionControlled ) {
  +            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();
  +            UriHandler vrUhOld = new UriHandler( nsaToken.getName(), vrUriOld );
  +            String vhrUri = vrUhOld.getAssociatedHistoryUri();
  +            NodeRevisionDescriptors vhrNrds = retrieveRevisionDescriptors( vhrUri );
  +            NodeRevisionDescriptor vhrNrd = retrieveLatestRevisionDescriptor( 
vhrUri, vhrNrds );
  +            NodeProperty vSetProp = vhrNrd.getProperty( P_VERSION_SET );
  +            
  +            // Retrieve old VR
  +            NodeRevisionDescriptor vrNrdOld =
  +                retrieveLatestRevisionDescriptor( vrUriOld, vhrNrds );
  +            
  +            // Create new VR in the MAIN branch
  +            NodeRevisionDescriptor vrNrdNew =
  +                new NodeRevisionDescriptor(req.getContentLength());
  +            i = pHelp.createInitialProperties(VersionImpl.getInstance()).iterator();
  +            while( i.hasNext() )
  +                vrNrdNew.setProperty( (NodeProperty)i.next() );
  +            // Copy dead properties VCR --> VR-new
  +            j = rNrd.enumerateProperties();
  +            while( j.hasMoreElements() ) {
  +                NodeProperty p = (NodeProperty)j.nextElement();
  +                if( rRk.isSupportedLiveProperty(p.getName()) )
  +                    continue;
  +                if( !vrNrdNew.exists(p.getName()) )
  +                    vrNrdNew.setProperty( p );
  +            }
  +            content.create( sToken, vhrUri, vrNrdNew, rNrc );
  +            String vrUriNew = vhrUri+"/"+vrNrdNew.getRevisionNumber().toString();
  +            UriHandler vrUhNew = new UriHandler( nsaToken.getName(), vrUriNew );
  +            SubjectNode vrNodeNew = new SubjectNode();
  +            structure.create( sToken, vrNodeNew, vrUriNew );
  +            
  +            // set specific properties
  +            rNrd.removeProperty( coutProp );
  +            rNrd.setProperty(
  +                new NodeProperty(P_CHECKED_IN, pHelp.createHrefValue(vrUriNew)) );
  +            vhrNrd.setLastModified( new Date() ); // P_GETLASTMODIFIED
  +            vhrNrd.setProperty( new NodeProperty(
  +                P_VERSION_SET, 
((String)vSetProp.getValue())+pHelp.createHrefValue(vrUriNew)) );
  +            /* Content Type --start-- */
  +            String contentType = req.getContentType();
  +            if (contentType == null) {
  +                contentType = sConf.getServletContext()
  +                    .getMimeType(rNrds.getUri());
  +            }
  +            if (contentType == null) {
  +                contentType = sConf.getDefaultMimeType();
  +            }
  +            vrNrdNew.setContentType(contentType); // P_GETCONTENTTYPE
  +            /* Content Type --end-- */
  +            vrNrdNew.setName( 
(String)pHelp.createCdataValue(vrUhNew.getVersionName()) ); // P_DISPLAYNAME
  +            vrNrdNew.setETag( vrUriNew.hashCode()+"_"+req.getContentLength() ); // 
P_GETETAG
  +            vrNrdNew.setCreationDate( new Date() ); // P_CREATIONDATE
  +            vrNrdNew.setProperty(
  +                new NodeProperty(P_VERSION_NAME, vrUhNew.getVersionName()) );
  +            vrNrdNew.setProperty(
  +                new NodeProperty(P_PREDECESSOR_SET, predSetProp.getValue()) );
  +            
  +            // Store changes
  +            content.store( sToken, rNrds.getUri(), rNrd, null ); 
//revisionContent=null
  +            content.store( sToken, vhrUri, vhrNrd, null ); //revisionContent=null
  +            content.store( sToken, vhrUri, vrNrdNew, null ); //revisionContent=null
  +        }
  +        else if( rRk instanceof Working ) {
  +            Domain.info(
  +                "Working resource feature NOT YET IMPLEMENTED" );
  +        }
  +        else {
  +            Domain.warn(
  +                "Do not know how to checkout a '"+rRk+"' resource" );
  +            resp.setStatus(WebdavStatus.SC_CONFLICT);
               return;
           }
       }
  
  
  

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

Reply via email to