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><code>DAV:resource-must-be-null</code></li>
+ * <li><code>DAV:workspace-location-ok</code></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><checkout-set></code>
+ * property of the associated VR, and to the
<code><workspace-checkout-set></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]>