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><checkout-set></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]>