juergen     02/03/21 06:05:25

  Modified:    src/webdav/server/org/apache/slide/webdav/util
                        VersioningHelper.java
  Log:
  Fixed bug for uncheckout:
  Now a backup copy is made in checkout in order to make a clean restore in 
uncheckout. This is necessary because the properties can not be restored from those of 
the checked-in VR, since they are quite different from the properties of the VCR.
  (ralf)
  
  Revision  Changes    Path
  1.12      +117 -28   
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.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- VersioningHelper.java     19 Mar 2002 14:10:54 -0000      1.11
  +++ VersioningHelper.java     21 Mar 2002 14:05:25 -0000      1.12
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
 1.11 2002/03/19 14:10:54 juergen Exp $
  - * $Revision: 1.11 $
  - * $Date: 2002/03/19 14:10:54 $
  + * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
 1.12 2002/03/21 14:05:25 juergen Exp $
  + * $Revision: 1.12 $
  + * $Date: 2002/03/21 14:05:25 $
    *
    * ====================================================================
    *
  @@ -124,6 +124,11 @@
   public class VersioningHelper extends AbstractWebdavHelper {
                           
       /**
  +     * The NodeRevisionNumber of the VHR backup needed for checkout-uncheckout.
  +     */
  +    public static final NodeRevisionNumber VHR_BACKUP_REVISION_NUMBER = new 
NodeRevisionNumber(0, 1);
  +    
  +    /**
        * Factory method.
        */
       public static VersioningHelper
  @@ -352,11 +357,14 @@
                   throw new PreconditionViolationException(violatedPrecondition);
               }
               
  +            NodeRevisionDescriptors vhrNrds = content.retrieve(sToken, cinUri);
  +            
               // update <checkout-set>
               addUriToCheckoutSet(cinNrd, rNrds.getUri());
               content.store(sToken, cinNrds.getUri(), cinNrd, null);
               
               // do the checkout
  +            backupNodeRevisionDescriptor(rNrds, rNrd, vhrNrds);
               rNrd.removeProperty( cinProp );
               rNrd.setProperty(
                   new NodeProperty(P_CHECKED_OUT, cinProp.getValue()) );
  @@ -480,12 +488,14 @@
           NodeRevisionDescriptor coutNrd = content.retrieve(sToken, coutNrds, 
coutNrn);
           NodeRevisionContent coutNrc = content.retrieve( sToken, coutNrds, coutNrd );
           
  +        NodeRevisionDescriptors vhrNrds = content.retrieve(sToken, coutUri);
  +        
           // update <checkout-set>
           removeUriFromCheckoutSet(coutNrd, rNrds.getUri());
           content.store( sToken, coutNrds.getUri(), coutNrd, null);
           
  -        // restore revision descriptor from the checked-in one
  -        restoreRevisionDescriptor(coutNrd, rNrd);
  +        // restore revision descriptor
  +        restoreNodeRevisionDescriptor(rNrds, rNrd, vhrNrds);
           rNrd.setLastModified(new Date());
           rNrd.setProperty(new NodeProperty(P_CHECKED_IN, coutProp.getValue()) );
           NodeRevisionContent oldContent = new NodeRevisionContent();
  @@ -777,41 +787,120 @@
       }
       
       /**
  -     * Restores the <code>destination</code> NodeRevisionDescriptor from
  -     * the <code>source</code>.
  +     * Backups the given <code>revisionDescriptor</code> at the
  +     * {@link #VHR_BACKUP_REVISION_NUMBER special revision} of the
  +     * NodeRevisionDescriptors of the VHR associated with the VCR.
  +     *
  +     * @param      revisionDescriptors         the NodeRevisionDescriptors of the
  +     *                                         VCR to backup.
  +     * @param      revisionDescriptor          the NodeRevisionDescriptor of the
  +     *                                         VCR to backup.
  +     * @param      historyRevisionDescriptors  the NodeRevisionDescriptors of the
  +     *                                         VHR associated with the VCR.
  +     *
  +     * @throws     SlideException
  +     */
  +    protected void backupNodeRevisionDescriptor(NodeRevisionDescriptors 
revisionDescriptors, NodeRevisionDescriptor revisionDescriptor, 
NodeRevisionDescriptors historyRevisionDescriptors) throws SlideException {
  +        
  +        NodeRevisionDescriptor backup = cloneRevisionDescriptor(revisionDescriptor, 
VHR_BACKUP_REVISION_NUMBER);
  +        NodeRevisionContent revisionContent = content.retrieve(sToken, 
revisionDescriptors, revisionDescriptor);
  +        NodeRevisionContent backupContent = new NodeRevisionContent();
  +        backupContent.setContent(revisionContent.getContentBytes());
  +        try {
  +            content.retrieve(sToken, historyRevisionDescriptors, 
backup.getRevisionNumber());
  +            content.store(sToken, historyRevisionDescriptors.getUri(), backup, 
backupContent);
  +        }
  +        catch (RevisionDescriptorNotFoundException e) {
  +            content.create(sToken, historyRevisionDescriptors.getUri(),null,  
backup, backupContent);
  +        }
  +    }
  +    
  +    /**
  +     * Restores the given <code>revisionDescriptor</code> from the
  +     * {@link #VHR_BACKUP_REVISION_NUMBER special revision} of the
  +     * NodeRevisionDescriptors of the VHR associated with the VCR.
  +     *
  +     * @param      revisionDescriptors         the NodeRevisionDescriptors of the
  +     *                                         VCR to restore.
  +     * @param      revisionDescriptor          the NodeRevisionDescriptor of the
  +     *                                         VCR to restore.
  +     * @param      historyRevisionDescriptors  the NodeRevisionDescriptors of the
  +     *                                         VHR associated with the VCR.
  +     *
  +     * @throws     SlideException
  +     */
  +    protected void restoreNodeRevisionDescriptor(NodeRevisionDescriptors 
revisionDescriptors, NodeRevisionDescriptor revisionDescriptor, 
NodeRevisionDescriptors historyRevisionDescriptors) throws SlideException {
  +
  +        NodeRevisionDescriptor backup = content.retrieve(sToken, 
historyRevisionDescriptors, VHR_BACKUP_REVISION_NUMBER);
  +        NodeRevisionContent backupContent = content.retrieve(sToken, 
historyRevisionDescriptors, backup);
  +        copyRevisionDescriptor(backup, revisionDescriptor);
  +        content.store(sToken, revisionDescriptors.getUri(), revisionDescriptor, 
backupContent);
  +    }
  +        
  +    /**
  +     * Returns a clone of the given <code>revisionDescriptor</code> with
  +     * the given <code>revisionNumber</code>.
        *
  -     * @param      source       the source NodeRevisionDescriptor.
  -     * @param      destination  the destination NodeRevisionDescriptor.
  +     * @param      revisionDescriptor  the NodeRevisionDescriptor to clone.
  +     * @param      revisionNumber      the NodeRevsionNumber to use for the clone.
  +     *
  +     * @return     the cloned NodeRevisionDescriptor.
        */
  -    public static void restoreRevisionDescriptor(NodeRevisionDescriptor source, 
NodeRevisionDescriptor destination) {
  +    private NodeRevisionDescriptor cloneRevisionDescriptor(NodeRevisionDescriptor 
revisionDescriptor, NodeRevisionNumber revisionNumber) {
           
  -        // remove all dead properties
  -        Enumeration propertyNames = destination.enumeratePropertiesName();
  +        String branchName = revisionDescriptor.getBranchName();
  +        Enumeration labelEnum = revisionDescriptor.enumerateLabels();
  +        Vector labels = new Vector();
  +        while (labelEnum.hasMoreElements()) {
  +            labels.add(labelEnum.nextElement());
  +        }
  +        Hashtable properties = new Hashtable();
  +        Enumeration propertiesEnum = revisionDescriptor.enumerateProperties();
           NodeProperty property = null;
  -        if (propertyNames != null) {
  -            while (propertyNames.hasMoreElements()) {
  -                property = 
destination.getProperty(propertyNames.nextElement().toString());
  -                if ( ! property.isProtected() ) {
  -                    destination.removeProperty(property);
  +        String name = null;
  +        String namespace = null;
  +        while (propertiesEnum.hasMoreElements()) {
  +            property = (NodeProperty)propertiesEnum.nextElement();
  +            name = property.getName();
  +            namespace = property.getNamespace();
  +            if (namespace != null) {
  +                name = namespace + name;
                   }
  +            properties.put(name, property);
               }
  +        NodeRevisionDescriptor backup = new NodeRevisionDescriptor(revisionNumber, 
branchName, labels, properties);
  +        return backup;
           }
           
  -        // copy dead properties
  -        propertyNames = source.enumeratePropertiesName();
  -        if (propertyNames != null) {
  -            while (propertyNames.hasMoreElements()) {
  -                property = 
source.getProperty(propertyNames.nextElement().toString());
  -                if ( ! property.isProtected() ) {
  -                    destination.setProperty(property);
  +    /**
  +     * Copies the labels and properties of the given <code>source</code>
  +     * to the <code>destination</code> NodeRevisionDescriptor.
  +     *
  +     * @param      source       the NodeRevisionDescriptor to copy the labels
  +     *                          and properties from.
  +     * @param      destination  the NodeRevisionDescriptor to copy the labels
  +     *                          and properties to.
  +     */
  +    private void copyRevisionDescriptor(NodeRevisionDescriptor source, 
NodeRevisionDescriptor destination) {
  +        
  +        destination.removeLabels();
  +        Enumeration labelEnum = source.enumerateLabels();
  +        while (labelEnum.hasMoreElements()) {
  +            destination.addLabel((String)labelEnum.nextElement());
                   }
  -            }
  +        
  +        Enumeration propertiesEnum = destination.enumerateProperties();
  +        while (propertiesEnum.hasMoreElements()) {
  +            destination.removeProperty((NodeProperty)propertiesEnum.nextElement());
  +            }
  +        propertiesEnum = source.enumerateProperties();
  +        while (propertiesEnum.hasMoreElements()) {
  +            destination.setProperty((NodeProperty)propertiesEnum.nextElement());
           }
  -        destination.setContentLanguage(source.getContentLanguage());
  -        destination.setContentLength(source.getContentLength());
  -        destination.setContentType(source.getContentType());
       }
       
   }
  +
  +
   
   
  
  
  

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

Reply via email to