juergen     02/04/12 05:29:46

  Modified:    src/webdav/server/org/apache/slide/webdav/method
                        MoveMethod.java
  Log:
  Implemented pre- and postconditions for workspace feature.
  (ralf)
  
  Revision  Changes    Path
  1.24      +220 -10   
jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/MoveMethod.java
  
  Index: MoveMethod.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/MoveMethod.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- MoveMethod.java   4 Apr 2002 11:43:07 -0000       1.23
  +++ MoveMethod.java   12 Apr 2002 12:29:46 -0000      1.24
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/MoveMethod.java,v
 1.23 2002/04/04 11:43:07 juergen Exp $
  - * $Revision: 1.23 $
  - * $Date: 2002/04/04 11:43:07 $
  + * $Header: 
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/method/MoveMethod.java,v
 1.24 2002/04/12 12:29:46 juergen Exp $
  + * $Revision: 1.24 $
  + * $Date: 2002/04/12 12:29:46 $
    *
    * ====================================================================
    *
  @@ -85,6 +85,14 @@
   import org.apache.slide.webdav.util.VersioningHelper;
   import org.apache.slide.webdav.util.PropertyHelper;
   
  +import org.apache.slide.webdav.util.resourcekind.AbstractResourceKind;
  +import org.apache.slide.webdav.util.resourcekind.ResourceKind;
  +import org.apache.slide.webdav.util.resourcekind.CheckedOutVersionControlled;
  +import org.apache.slide.webdav.util.resourcekind.DeltavCompliantUnmappedUrl;
  +import org.apache.slide.webdav.util.resourcekind.Workspace;
  +
  +import org.apache.slide.util.Configuration;
  +
   import org.jdom.JDOMException;
   
   import org.jdom.output.XMLOutputter;
  @@ -104,12 +112,29 @@
       protected VersioningHelper versioningHelper = null;
       
       /**
  +     * The PropertyHelper used by this instance.
  +     */
  +    protected PropertyHelper propertyHelper = null;
  +    
  +    /**
        * The URI of the VR associated with the checked-out VCR which is target
        * of the delete operation used in {@link #beforeDelete beforeDelete()} and
        * {@link #afterDelete afterDelete()}.
        */
       protected String uriOfAssociatedVR = null;
       
  +    /**
  +     * The URI of the workspace associated with the checked-out VCR which is target
  +     * of the delete operation used in {@link #beforeDelete beforeDelete()} and
  +     * {@link #afterDelete afterDelete()}.
  +     */
  +    protected String uriOfAssociatedWorkspace = null;
  +    
  +    /**
  +     * Indicates if the source of the MOVE is a workspace.
  +     */
  +    protected boolean isSourceWorkspace = false;
  +    
       
       // ----------------------------------------------------------- Constructors
       
  @@ -129,6 +154,7 @@
                                                                   req,
                                                                   resp,
                                                                   config);
  +        propertyHelper = PropertyHelper.getPropertyHelper(slideToken, token);
       }
       
       
  @@ -156,7 +182,16 @@
               macroParameters = Macro.DEFAULT_PARAMETERS;
           }
           
  +        UriHandler sourceUriHandler = UriHandler.getUriHandler(token, sourceUri);
  +        isSourceWorkspace = sourceUriHandler.isWorkspaceUri();
  +        
           try {
  +            // check preconditions
  +            ViolatedPrecondition violatedPrecondition = 
getPreconditionViolation(sourceUri, destinationUri);
  +            if (violatedPrecondition != null) {
  +                throw new PreconditionViolationException(violatedPrecondition, 
sourceUri);
  +            }
  +            
               macro.move(slideToken, sourceUri, destinationUri, macroParameters, 
this, this);
               if (overwrite) {
                   resp.setStatus(WebdavStatus.SC_NO_CONTENT);
  @@ -202,6 +237,11 @@
               //
               throw new WebdavException(WebdavStatus.SC_ACCEPTED, false);
           }
  +        catch (SlideException e) {
  +            int statusCode = getErrorCode(e);
  +            resp.setStatus(statusCode);
  +            throw new WebdavException(statusCode);
  +        }
       }
       
       
  @@ -218,6 +258,53 @@
           }
       }
       
  +    /**
  +     * Checks the (DeltaV) preconditions
  +     * <ul>
  +     * <li>&lt;code&gt;DAV:resource-must-be-null&lt;/code&gt;</li>
  +     * <li>&lt;code&gt;DAV:workspace-location-ok&lt;/code&gt;</li>
  +     * </ul>
  +     *
  +     * @param      sourceUri       the URI of the resource.
  +     * @param      destinationUri  the URI of the resource.
  +     *
  +     * @return     the precondition that has been violated (if any).
  +     *
  +     * @throws     SlideException
  +     */
  +    private ViolatedPrecondition getPreconditionViolation(String sourceUri, String 
destinationUri) throws SlideException {
  +        
  +        ViolatedPrecondition violatedPrecondition = null;
  +        if( Configuration.useVersionControl() ) {
  +            
  +            if (isSourceWorkspace) {
  +                
  +                UriHandler destinationUriHandler = UriHandler.getUriHandler(token, 
destinationUri);
  +                NodeRevisionDescriptors destinationRevisionDescriptors = null;
  +                NodeRevisionDescriptor destinationRevisionDescriptor = null;
  +                try {
  +                    destinationRevisionDescriptors = 
versioningHelper.retrieveRevisionDescriptors(destinationUri);
  +                    destinationRevisionDescriptor = 
versioningHelper.retrieveLatestRevisionDescriptor(destinationUri,
  +                                                                                    
                  destinationRevisionDescriptors);
  +                }
  +                catch( ObjectNotFoundException e ) {}; // can be ignored here!
  +                
  +                ResourceKind destinationResourceKind =
  +                    AbstractResourceKind.determineResourceKind( 
destinationRevisionDescriptor );
  +                
  +                if( !(destinationResourceKind instanceof 
DeltavCompliantUnmappedUrl) ) {
  +                    return new ViolatedPrecondition(C_RESOURCE_MUST_BE_NULL,
  +                                                    WebdavStatus.SC_CONFLICT);
  +                }
  +                if( !destinationUriHandler.isWorkspaceUri() ) {
  +                    return new ViolatedPrecondition(C_WORKSPACE_LOCATION_OK,
  +                                                    WebdavStatus.SC_CONFLICT);
  +                }
  +            }
  +        }
  +        return violatedPrecondition;
  +    }
  +    
       // ------------------------------------------------------ Interface CopyListener
       
       /**
  @@ -260,20 +347,115 @@
        */
       public void afterCopy(String sourceUri, String destinationUri) throws 
SlideException {
           
  -        uriOfAssociatedVR = versioningHelper.getUriOfAssociatedVR(destinationUri);
  +        NodeRevisionDescriptors destinationRevisionDescriptors =
  +            versioningHelper.retrieveRevisionDescriptors(destinationUri);
  +        NodeRevisionDescriptor destinationRevisionDescriptor =
  +            versioningHelper.retrieveLatestRevisionDescriptor(destinationUri, 
destinationRevisionDescriptors);
  +        
  +        // copy DeltaV-specific "0.0" revision if exists
  +        try {
  +            NodeRevisionDescriptor specialRevisionDescriptor = 
content.retrieve(slideToken,
  +                                                                                
destinationRevisionDescriptors,
  +                                                                                new 
NodeRevisionNumber(0, 0));
  +            content.create(slideToken, destinationRevisionDescriptors.getUri(), 
specialRevisionDescriptor.cloneObject(), null);
  +        }
  +        catch (SlideException e) {}
  +        
  +        if( Configuration.useVersionControl() ) {
  +            handleWorkspacePostconditions(destinationRevisionDescriptor, 
destinationUri);
  +            updateCheckoutSets(destinationRevisionDescriptor, destinationUri);
  +        }
  +    }
  +
  +    /**
  +     * Handles the workspace postconditions
  +     * <ul>
  +     * <li>DAV:workspace-moved</li>
  +     * <li>DAV:workspace-member-moved</li>
  +     * </ul>
  +     *
  +     * @param      revisionDescriptor  the NodeRevisionDescriptor of the resource.
  +     * @param      resourceUri         the URI of the resource.
  +     *
  +     * @throws     SlideException
  +     */
  +    private void handleWorkspacePostconditions(NodeRevisionDescriptor 
revisionDescriptor, String resourceUri) throws SlideException {
  +
  +        if (isSourceWorkspace) {
  +            // DAV:workspace-moved
  +            revisionDescriptor.setProperty(new NodeProperty(P_WORKSPACE, 
propertyHelper.createHrefValue(this.destinationUri), true));
  +        }
  +        else {
  +            // DAV:workspace-member-moved
  +            NodeProperty workspaceProperty = null;
  +            ObjectNode object = structure.retrieve(slideToken, resourceUri);
  +            try {
  +                ObjectNode parent = structure.getParent(slideToken, object);
  +                NodeRevisionDescriptors parentDescriptors =
  +                    versioningHelper.retrieveRevisionDescriptors(parent.getUri());
  +                NodeRevisionDescriptor parentDescriptor =
  +                    
versioningHelper.retrieveLatestRevisionDescriptor(parent.getUri(), parentDescriptors);
  +                workspaceProperty = parentDescriptor.getProperty(P_WORKSPACE);
  +            }
  +            catch (SlideException e) {}
  +            if (workspaceProperty != null) {
  +                revisionDescriptor.setProperty(workspaceProperty);
  +            }
  +            else {
  +                revisionDescriptor.removeProperty(P_WORKSPACE);
  +            }
  +        }
  +        content.store(slideToken, resourceUri, revisionDescriptor, null);
  +    }
  +    
  +    /**
  +     * If the resource specified by the given <code>revisionDescriptor</code>
  +     * is a checked-out VCR, its URI will be added to the 
<code>&lt;checkout-set&gt;</code>
  +     * property of the associated VR, and to the 
<code>&lt;workspace-checkout-set&gt;</code>
  +     * of the associated workspace (if there is any).
  +     *
  +     * @param      revisionDescriptor  the NodeRevisionDescriptor of the resource.
  +     * @param      resourceUri         the URI of the resource.
  +     *
  +     * @throws     SlideException
  +     */
  +    private void updateCheckoutSets(NodeRevisionDescriptor revisionDescriptor, 
String resourceUri) throws SlideException {
  +        
  +        ResourceKind resourceKind = 
AbstractResourceKind.determineResourceKind(revisionDescriptor);
  +        if (resourceKind instanceof CheckedOutVersionControlled) {
  +            
  +            uriOfAssociatedVR = versioningHelper.getUriOfAssociatedVR(resourceUri);
           if (uriOfAssociatedVR != null) {
               
               // add the copy to the <checkout-set> of the associated VR
  -            NodeRevisionDescriptors revisionDescriptors =
  +                NodeRevisionDescriptors vrRevisionDescriptors =
                   versioningHelper.retrieveRevisionDescriptors(uriOfAssociatedVR);
  -            NodeRevisionDescriptor revisionDescriptor =
  -                
versioningHelper.retrieveLatestRevisionDescriptor(uriOfAssociatedVR, 
revisionDescriptors);
  +                NodeRevisionDescriptor vrRevisionDescriptor =
  +                    
versioningHelper.retrieveLatestRevisionDescriptor(uriOfAssociatedVR, 
vrRevisionDescriptors);
  +                try {
  +                    PropertyHelper.addHrefToProperty(vrRevisionDescriptor, 
P_CHECKOUT_SET, resourceUri);
  +                    content.store(slideToken, vrRevisionDescriptors.getUri(), 
vrRevisionDescriptor, null);
  +                } catch (JDOMException e) {}
  +            }
  +            
  +            // update <workspace-checkout-set> of workspace
  +            NodeProperty workspaceProperty = 
revisionDescriptor.getProperty(P_WORKSPACE);
  +            if ( (workspaceProperty != null) && (workspaceProperty.getValue() != 
null) ) {
  +                String workspaceUri = 
versioningHelper.getElementValue(workspaceProperty.getValue().toString());
  +                if (workspaceUri != null) {
  +                    
  +                    NodeRevisionDescriptors workspaceRevisionDescriptors =
  +                        versioningHelper.retrieveRevisionDescriptors(workspaceUri);
  +                    NodeRevisionDescriptor workspaceRevisionDescriptor =
  +                        
versioningHelper.retrieveLatestRevisionDescriptor(workspaceUri, 
workspaceRevisionDescriptors);
               try {
  -                PropertyHelper.addHrefToProperty(revisionDescriptor, 
P_CHECKOUT_SET, destinationUri);
  -                content.store(slideToken, revisionDescriptors.getUri(), 
revisionDescriptor, null);
  +                        
PropertyHelper.addHrefToProperty(workspaceRevisionDescriptor, 
P_WORKSPACE_CHECKOUT_SET, resourceUri);
  +                        content.store(slideToken, 
workspaceRevisionDescriptors.getUri(), workspaceRevisionDescriptor, null);
               } catch (JDOMException e) {}
           }
       }
  +        }
  +    }
       
       // ------------------------------------------------------ Interface 
DeleteListener
       
  @@ -290,10 +472,25 @@
        */
       public void beforeDelete(String targetUri) throws SlideException {
           
  +        uriOfAssociatedVR = null;
  +        uriOfAssociatedWorkspace = null;
  +        
  +        NodeRevisionDescriptors revisionDescriptors =
  +            versioningHelper.retrieveRevisionDescriptors(targetUri);
  +        NodeRevisionDescriptor revisionDescriptor =
  +            versioningHelper.retrieveLatestRevisionDescriptor(targetUri, 
revisionDescriptors);
  +        ResourceKind resourceKind = 
AbstractResourceKind.determineResourceKind(revisionDescriptor);
  +        if (resourceKind instanceof CheckedOutVersionControlled) {
  +            
           uriOfAssociatedVR = versioningHelper.getUriOfAssociatedVR(targetUri);
  +            
  +            NodeProperty workspaceProperty = 
revisionDescriptor.getProperty(P_WORKSPACE);
  +            if ( (workspaceProperty != null) && (workspaceProperty.getValue() != 
null) ) {
  +                uriOfAssociatedWorkspace = 
versioningHelper.getElementValue(workspaceProperty.getValue().toString());
  +            }
  +        }
       }
       
  -    
       /**
        * This method is called after deleting the resource associated by
        * the given <code>targetUri</code>.
  @@ -317,6 +514,19 @@
               try {
                   PropertyHelper.removeHrefFromProperty(revisionDescriptor, 
P_CHECKOUT_SET, targetUri);
                   content.store(slideToken, revisionDescriptors.getUri(), 
revisionDescriptor, null);
  +            } catch (JDOMException e) {}
  +        }
  +        
  +        if (uriOfAssociatedWorkspace != null) {
  +            
  +            // update <workspace-checkout-set>
  +            NodeRevisionDescriptors workspaceRevisionDescriptors =
  +                
versioningHelper.retrieveRevisionDescriptors(uriOfAssociatedWorkspace);
  +            NodeRevisionDescriptor workspaceRevisionDescriptor =
  +                
versioningHelper.retrieveLatestRevisionDescriptor(uriOfAssociatedWorkspace, 
workspaceRevisionDescriptors);
  +            try {
  +                PropertyHelper.removeHrefFromProperty(workspaceRevisionDescriptor, 
P_WORKSPACE_CHECKOUT_SET, targetUri);
  +                content.store(slideToken, workspaceRevisionDescriptors.getUri(), 
workspaceRevisionDescriptor, null);
               } catch (JDOMException e) {}
           }
       }
  
  
  

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

Reply via email to