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]>