pnever 02/03/01 08:49:04
Modified: src/webdav/server/org/apache/slide/webdav/util
VersioningHelper.java
Log:
Added checkin functionality
Revision Changes Path
1.3 +240 -70
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.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- VersioningHelper.java 28 Feb 2002 12:39:01 -0000 1.2
+++ VersioningHelper.java 1 Mar 2002 16:49:04 -0000 1.3
@@ -1,7 +1,7 @@
/*
- * $Header:
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
1.2 2002/02/28 12:39:01 pnever Exp $
- * $Revision: 1.2 $
- * $Date: 2002/02/28 12:39:01 $
+ * $Header:
/home/cvs/jakarta-slide/src/webdav/server/org/apache/slide/webdav/util/VersioningHelper.java,v
1.3 2002/03/01 16:49:04 pnever Exp $
+ * $Revision: 1.3 $
+ * $Date: 2002/03/01 16:49:04 $
*
* ====================================================================
*
@@ -66,6 +66,7 @@
import java.io.*;
import java.util.*;
+import org.jdom.Element;
import org.jdom.JDOMException;
import javax.servlet.http.HttpServletRequest;
@@ -118,6 +119,7 @@
private HttpServletRequest req = null;
private HttpServletResponse resp = null;
private WebdavServletConfig sConf = null;
+ private PropertyHelper pHelp = null;
/**
* Protected contructor
@@ -130,32 +132,71 @@
this.sConf = sConf;
this.content = nsaToken.getContentHelper();
this.structure = nsaToken.getStructureHelper();
+ this.pHelp = PropertyHelper.getPropertyHelper( sToken,nsaToken );
+ }
+
+ /**
+ * Retrieve the DeltaV-compliant NRDS instance for the specified resource path.
+ */
+ public NodeRevisionDescriptors
+ retrieveRevisionDescriptors( String resourcePath ) throws SlideException {
+
+ NodeRevisionDescriptors rNrds = null;
+ UriHandler rUh = UriHandler.getUriHandler( nsaToken, resourcePath );
+
+ if( rUh.isVersionUri() )
+ rNrds = content.retrieve( sToken, rUh.getAssociatedHistoryUri() );
+ else
+ rNrds = content.retrieve( sToken, resourcePath );
+
+ return rNrds;
+ }
+
+ /**
+ * Retrieve the latest DeltaV-compliant NRD instance for the specified
+ * resource path and associated to the specified NRDS instance.
+ */
+ public NodeRevisionDescriptor
+ retrieveLatestRevisionDescriptor( String resourcePath, NodeRevisionDescriptors
rNrds ) throws SlideException {
+
+ NodeRevisionDescriptor rNrd = null;
+ UriHandler rUh = UriHandler.getUriHandler( nsaToken, resourcePath );
+
+ if( rUh.isHistoryUri() ) {
+ rNrd = content.retrieve( sToken, rNrds,
+ new NodeRevisionNumber(0, 0) );
+ }
+ else if( rUh.isVersionUri() ) {
+ rNrd = content.retrieve( sToken, rNrds,
+ new NodeRevisionNumber(rUh.getVersionName()) );
+ }
+ else {
+ rNrd = content.retrieve( sToken, rNrds );
+ }
+
+ return rNrd;
}
/**
* Set the specified resource under version control
*/
public void versionControl( String resourcePath ) throws SlideException {
- UriHandler uh = UriHandler.getUriHandler( nsaToken, resourcePath );
- PropertyHelper ph = PropertyHelper.getPropertyHelper( sToken,nsaToken );
+ UriHandler rUh = UriHandler.getUriHandler( nsaToken, resourcePath );
Iterator i;
+ Enumeration j;
- String realPath = resourcePath;
- if( uh.isVersionUri() )
- realPath = uh.getAssociatedHistoryUri();
-
- NodeRevisionDescriptors vcrNrds = content.retrieve( sToken, realPath );
- NodeRevisionDescriptor vcrNrd = content.retrieve( sToken, vcrNrds );
- NodeRevisionContent vcrNrc = content.retrieve( sToken, vcrNrds, vcrNrd );
- ResourceKind resourceKind = AbstractResourceKind.determineResourceKind(
vcrNrd );
+ NodeRevisionDescriptors rNrds = retrieveRevisionDescriptors( resourcePath );
+ NodeRevisionDescriptor rNrd = retrieveLatestRevisionDescriptor(
resourcePath, rNrds );
+ NodeRevisionContent rNrc = content.retrieve( sToken, rNrds, rNrd );
+ ResourceKind rRk = AbstractResourceKind.determineResourceKind( rNrd );
- if( !resourceKind.isSupportedMethod(req.getMethod()) ) {
+ if( !rRk.isSupportedMethod(req.getMethod()) ) {
resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
return;
}
- // Check for resourceKind = K_VERSION_CONTROLLED*
- if( resourceKind instanceof VersionControlled ) {
+ // Check for rRk = K_VERSION_CONTROLLED*
+ if( rRk instanceof VersionControlled ) {
// nothing to do
resp.setStatus(WebdavStatus.SC_OK);
return;
@@ -164,10 +205,20 @@
// Set initial VR properties
NodeRevisionDescriptor vrNrd =
new NodeRevisionDescriptor(req.getContentLength());
- i = ph.createInitialProperties(VersionImpl.getInstance()).iterator();
+ i = pHelp.createInitialProperties(VersionImpl.getInstance()).iterator();
while( i.hasNext() )
vrNrd.setProperty( (NodeProperty)i.next() );
+ // Copy dead properties VCR -> VR
+ j = rNrd.enumerateProperties();
+ while( j.hasMoreElements() ) {
+ NodeProperty p = (NodeProperty)j.nextElement();
+ if( rRk.isSupportedLiveProperty(p.getName()) )
+ continue;
+ if( !vrNrd.exists(p.getName()) )
+ vrNrd.setProperty( p );
+ }
+
// Set initial VHR properties
NodeRevisionNumber vhrNrn = new NodeRevisionNumber( 0, 0 ); //major=0;
minor=0
Vector vhrLabels = new Vector();
@@ -175,50 +226,47 @@
String vhrBranch = NodeRevisionDescriptors.MAIN_BRANCH;
NodeRevisionDescriptor vhrNrd =
new NodeRevisionDescriptor( vhrNrn, vhrBranch, vhrLabels, vhrProps );
- i = ph.createInitialProperties(VersionHistoryImpl.getInstance()).iterator();
+ i =
pHelp.createInitialProperties(VersionHistoryImpl.getInstance()).iterator();
while( i.hasNext() )
vhrNrd.setProperty( (NodeProperty)i.next() );
// Set initial VCR properties (do not overwrite existing!!)
- i =
ph.createInitialProperties(VersionControlledImpl.getInstance()).iterator();
+ i =
pHelp.createInitialProperties(VersionControlledImpl.getInstance()).iterator();
while( i.hasNext() ) {
NodeProperty p = (NodeProperty)i.next();
- if( !vcrNrd.exists(p.getName()) )
- vcrNrd.setProperty( p );
+ if( !rNrd.exists(p.getName()) )
+ rNrd.setProperty( p );
}
// Create VHR/VR
- UriHandler vhrUri = UriHandler.createNextHistoryUri( sToken, nsaToken );
- String vhrUriStr = String.valueOf( vhrUri );
+ UriHandler vhrUh = UriHandler.createNextHistoryUri( sToken, nsaToken );
+ String vhrUri = String.valueOf( vhrUh );
SubjectNode vhrNode = new SubjectNode();
- structure.create( sToken, vhrNode, String.valueOf(vhrUri) );
- content.create( sToken, vhrUriStr, true ); //isVersioned=true
- content.create( sToken, vhrUriStr, vrNrd, vcrNrc );
+ structure.create( sToken, vhrNode, String.valueOf(vhrUh) );
+ content.create( sToken, vhrUri, true ); //isVersioned=true
+ content.create( sToken, vhrUri, vrNrd, rNrc );
NodeRevisionDescriptors vhrNrds =
- content.retrieve( sToken, vhrUriStr );
+ retrieveRevisionDescriptors( vhrUri );
content.create(
- sToken, vhrUriStr, null, vhrNrd, null ); //branch=null,
revisionContent=null
+ sToken, vhrUri, null, vhrNrd, null ); //branch=null,
revisionContent=null
// Create VR node
NodeRevisionNumber vrVersion = vrNrd.getRevisionNumber();
SubjectNode vrNode = new SubjectNode();
- UriHandler vrUri =
- UriHandler.createVersionUri( nsaToken, vhrUri,
String.valueOf(vrVersion) );
- String vrUriStr = String.valueOf( vrUri );
- structure.create( sToken, vrNode, String.valueOf(vrUri) );
+ UriHandler vrUh =
+ UriHandler.createVersionUri( nsaToken, vhrUh, String.valueOf(vrVersion)
);
+ String vrUri = String.valueOf( vrUh );
+ structure.create( sToken, vrNode, String.valueOf(vrUh) );
// Set specific properties
- // First VCR ...
- vcrNrd.setProperty(
- new NodeProperty(P_CHECKED_IN, ph.createHrefValue(vrUriStr)) );
- // ... then VHR ...
- vhrNrd.setETag( vhrUriStr.hashCode()+"_" ); // P_GETETAG
+ rNrd.setProperty(
+ new NodeProperty(P_CHECKED_IN, pHelp.createHrefValue(vrUri)) );
+ vhrNrd.setETag( vhrUri.hashCode()+"_" ); // P_GETETAG
vhrNrd.setLastModified( new Date() ); // P_GETLASTMODIFIED
vhrNrd.setContentLength( 0 ); // P_GETCONTENTLENGTH
- vhrNrd.setName( vhrUri.getHistoryName() ); // P_DISPLAYNAME
+ vhrNrd.setName( (String)pHelp.createCdataValue(vhrUh.getHistoryName()) );
// P_DISPLAYNAME
vhrNrd.setProperty(
- new NodeProperty(P_VERSION_SET, ph.createHrefValue(vrUriStr)) );
- // ... and finally VR ...
+ new NodeProperty(P_VERSION_SET, pHelp.createHrefValue(vrUri)) );
/* Content Type --start-- */
String contentType = req.getContentType();
if (contentType == null) {
@@ -230,43 +278,42 @@
}
vrNrd.setContentType(contentType); // P_GETCONTENTTYPE
/* Content Type --end-- */
- vrNrd.setName( vrUri.getVersionName() ); // P_DISPLAYNAME
- vrNrd.setContentLanguage( "en" ); // P_GETCONTENTLANGUAGE
- vrNrd.setETag( vrUriStr.hashCode()+"_"+req.getContentLength() ); //
P_GETETAG
+ vrNrd.setName( (String)pHelp.createCdataValue(vrUh.getVersionName()) ); //
P_DISPLAYNAME
+ vrNrd.setETag( vrUri.hashCode()+"_"+req.getContentLength() ); // P_GETETAG
vrNrd.setCreationDate( new Date() ); // P_CREATIONDATE
vrNrd.setProperty(
- new NodeProperty(P_VERSION_HISTORY, ph.createHrefValue(vhrUriStr)) );
- vrNrd.setProperty(
- new NodeProperty(P_VERSION_NAME, vrUri.getVersionName()) );
+ new NodeProperty(P_VERSION_NAME, vrUh.getVersionName()) );
// Store changes
- content.store( sToken, resourcePath, vcrNrd, null ); //revisionContent=null
- content.store( sToken, vhrUriStr, vhrNrd, null ); //revisionContent=null
- content.store( sToken, vhrUriStr, vrNrd, null ); //revisionContent=null
+ content.store( sToken, resourcePath, rNrd, null ); //revisionContent=null
+ content.store( sToken, vhrUri, vhrNrd, null ); //revisionContent=null
+ content.store( sToken, vhrUri, vrNrd, null ); //revisionContent=null
}
/**
* Checkout the specified resource
*/
public void checkout( String resourcePath, boolean forkOk, boolean
applyToVersion )
- throws SlideException, JDOMException {
+ throws SlideException {
- UriHandler uh = UriHandler.getUriHandler( nsaToken, resourcePath );
- PropertyHelper ph = PropertyHelper.getPropertyHelper( sToken,nsaToken );
- Iterator i;
+ NodeRevisionDescriptors rNrds = retrieveRevisionDescriptors( resourcePath );
+ NodeRevisionDescriptor rNrd = retrieveLatestRevisionDescriptor(
resourcePath, rNrds );
+ checkout( rNrds, rNrd, forkOk, applyToVersion );
+ }
+
+ /**
+ * Checkout the specified resource
+ */
+ public void checkout( NodeRevisionDescriptors rNrds,
+ NodeRevisionDescriptor rNrd, boolean forkOk, boolean applyToVersion )
+ throws SlideException {
- String realPath = resourcePath;
- if( uh.isVersionUri() )
- realPath = uh.getAssociatedHistoryUri();
-
- NodeRevisionDescriptors vcrNrds = content.retrieve( sToken, realPath );
- NodeRevisionDescriptor vcrNrd = content.retrieve( sToken, vcrNrds );
- ResourceKind resourceKind = AbstractResourceKind.determineResourceKind(
vcrNrd );
+ Iterator i;
+ ResourceKind rRk = AbstractResourceKind.determineResourceKind( rNrd );
- if( !resourceKind.isSupportedMethod(req.getMethod()) ) {
+ if( !rRk.isSupportedMethod(req.getMethod()) ) {
// check precondition C_MUST_BE_CHECKED_IN
- if( resourceKind instanceof CheckedOut )
- {
+ if( rRk instanceof CheckedOut ) {
resp.setStatus(WebdavStatus.SC_CONFLICT);
// TODO: set response error element
return;
@@ -275,28 +322,151 @@
return;
}
- if( resourceKind instanceof CheckedInVersionControlled ) {
- NodeProperty cinProp = vcrNrd.getProperty( P_CHECKED_IN );
+ if( rRk instanceof CheckedInVersionControlled ) {
+ NodeProperty cinProp = rNrd.getProperty( P_CHECKED_IN );
+
// TODO: check precondition
C_CHECKOUT_OF_VERSION_WITH_DESCENDANT_IS_FORBIDDEN
// TODO: check precondition
C_CHECKOUT_OF_VERSION_WITH_DESCENDANT_IS_DISCOURAGED
// TODO: check precondition
C_CHECKOUT_OF_CHECKED_OUT_VERSION_IS_FORBIDDEN
// TODO: check precondition
C_CHECKOUT_OF_CHECKED_OUT_VERSION_IS_DISCOURAGED
// do the checkout
- vcrNrd.removeProperty( cinProp );
- vcrNrd.setProperty(
+ rNrd.removeProperty( cinProp );
+ rNrd.setProperty(
new NodeProperty(P_CHECKED_OUT, cinProp.getValue()) );
- vcrNrd.setProperty(
+ rNrd.setProperty(
new NodeProperty(P_PREDECESSOR_SET, cinProp.getValue()) );
+
+ // Store changes
+ content.store( sToken, rNrds.getUri(), rNrd, null );
//revisionContent=null
}
- else if( resourceKind instanceof Version ) {
+ else if( rRk instanceof Version ) {
Domain.info(
"Working resource feature NOT YET IMPLEMENTED" );
}
else {
Domain.warn(
- "Do not know how to checkout a '"+resourceKind+"' resource" );
+ "Do not know how to checkout a '"+rRk+"' resource" );
+ resp.setStatus(WebdavStatus.SC_CONFLICT);
+ return;
+ }
+ }
+
+ /**
+ * Checkin the specified resource
+ */
+ public void checkin( String resourcePath, boolean forkOk, boolean
keepCheckedOut )
+ throws SlideException, JDOMException {
+
+ NodeRevisionDescriptors rNrds = retrieveRevisionDescriptors( resourcePath );
+ NodeRevisionDescriptor rNrd = retrieveLatestRevisionDescriptor(
resourcePath, rNrds );
+ checkin( rNrds, rNrd, forkOk, keepCheckedOut );
+ }
+
+ /**
+ * Checkin the specified resource
+ */
+ public void checkin( NodeRevisionDescriptors rNrds,
+ NodeRevisionDescriptor rNrd, boolean forkOk, boolean keepCheckedOut )
+ throws SlideException, JDOMException {
+
+ Iterator i;
+ Enumeration j;
+ NodeRevisionContent rNrc = content.retrieve( sToken, rNrds, rNrd );
+ ResourceKind rRk = AbstractResourceKind.determineResourceKind( rNrd );
+
+ if( !rRk.isSupportedMethod(req.getMethod()) ) {
+ // check precondition C_MUST_BE_CHECKED_OUT
+ if( !(rRk instanceof CheckedOut) ) {
+ resp.setStatus(WebdavStatus.SC_CONFLICT);
+ // TODO: set response error element
+ return;
+ }
resp.setStatus(WebdavStatus.SC_BAD_REQUEST);
+ return;
+ }
+
+ if( rRk instanceof CheckedOutVersionControlled ) {
+ 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();
+ UriHandler vrUhOld = new UriHandler( nsaToken.getName(), vrUriOld );
+ String vhrUri = vrUhOld.getAssociatedHistoryUri();
+ NodeRevisionDescriptors vhrNrds = retrieveRevisionDescriptors( vhrUri );
+ NodeRevisionDescriptor vhrNrd = retrieveLatestRevisionDescriptor(
vhrUri, vhrNrds );
+ NodeProperty vSetProp = vhrNrd.getProperty( P_VERSION_SET );
+
+ // Retrieve old VR
+ NodeRevisionDescriptor vrNrdOld =
+ retrieveLatestRevisionDescriptor( vrUriOld, vhrNrds );
+
+ // Create new VR in the MAIN branch
+ NodeRevisionDescriptor vrNrdNew =
+ new NodeRevisionDescriptor(req.getContentLength());
+ i = pHelp.createInitialProperties(VersionImpl.getInstance()).iterator();
+ while( i.hasNext() )
+ vrNrdNew.setProperty( (NodeProperty)i.next() );
+ // Copy dead properties VCR --> VR-new
+ j = rNrd.enumerateProperties();
+ while( j.hasMoreElements() ) {
+ NodeProperty p = (NodeProperty)j.nextElement();
+ if( rRk.isSupportedLiveProperty(p.getName()) )
+ continue;
+ if( !vrNrdNew.exists(p.getName()) )
+ vrNrdNew.setProperty( p );
+ }
+ content.create( sToken, vhrUri, vrNrdNew, rNrc );
+ String vrUriNew = vhrUri+"/"+vrNrdNew.getRevisionNumber().toString();
+ UriHandler vrUhNew = new UriHandler( nsaToken.getName(), vrUriNew );
+ SubjectNode vrNodeNew = new SubjectNode();
+ structure.create( sToken, vrNodeNew, vrUriNew );
+
+ // set specific properties
+ rNrd.removeProperty( coutProp );
+ rNrd.setProperty(
+ new NodeProperty(P_CHECKED_IN, pHelp.createHrefValue(vrUriNew)) );
+ vhrNrd.setLastModified( new Date() ); // P_GETLASTMODIFIED
+ vhrNrd.setProperty( new NodeProperty(
+ P_VERSION_SET,
((String)vSetProp.getValue())+pHelp.createHrefValue(vrUriNew)) );
+ /* Content Type --start-- */
+ String contentType = req.getContentType();
+ if (contentType == null) {
+ contentType = sConf.getServletContext()
+ .getMimeType(rNrds.getUri());
+ }
+ if (contentType == null) {
+ contentType = sConf.getDefaultMimeType();
+ }
+ vrNrdNew.setContentType(contentType); // P_GETCONTENTTYPE
+ /* Content Type --end-- */
+ vrNrdNew.setName(
(String)pHelp.createCdataValue(vrUhNew.getVersionName()) ); // P_DISPLAYNAME
+ vrNrdNew.setETag( vrUriNew.hashCode()+"_"+req.getContentLength() ); //
P_GETETAG
+ vrNrdNew.setCreationDate( new Date() ); // P_CREATIONDATE
+ vrNrdNew.setProperty(
+ new NodeProperty(P_VERSION_NAME, vrUhNew.getVersionName()) );
+ vrNrdNew.setProperty(
+ new NodeProperty(P_PREDECESSOR_SET, predSetProp.getValue()) );
+
+ // Store changes
+ content.store( sToken, rNrds.getUri(), rNrd, null );
//revisionContent=null
+ content.store( sToken, vhrUri, vhrNrd, null ); //revisionContent=null
+ content.store( sToken, vhrUri, vrNrdNew, null ); //revisionContent=null
+ }
+ else if( rRk instanceof Working ) {
+ Domain.info(
+ "Working resource feature NOT YET IMPLEMENTED" );
+ }
+ else {
+ Domain.warn(
+ "Do not know how to checkout a '"+rRk+"' resource" );
+ resp.setStatus(WebdavStatus.SC_CONFLICT);
return;
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>