draft-ietf-webdav-versioning-00.txt   draft-ietf-webdav-versioning-01.txt 
INTERNET-DRAFT Christopher Kaler, INTERNET-DRAFT Chris Kaler, Microsoft, Editor
draft-ietf-webdav-versioning-00.txt Microsoft draft-ietf-webdav-versioning-01.txt Jim Amsden, IBM
Editor Goeff Clemm, Rational
Bruce Cragun, Novell
David Durand, BU
Bradley Sergeant, Microfocus
Jim Whitehead, UC Irvine
Expires April 26, 1999 Expires June 20, 1999 January 20, 1999
October 26, 1998
Versioning Extensions to WebDAV Versioning Extensions to WebDAV
Status of this Memo Status of this Memo
This document is an Internet draft. Internet drafts are working This document is an Internet draft. Internet drafts are working
documents of the Internet Engineering Task Force (IETF), its areas documents of the Internet Engineering Task Force (IETF), its areas
and its working groups. Note that other groups may also distribute and its working groups. Note that other groups may also distribute
working information as Internet drafts. working information as Internet drafts.
Internet Drafts are draft documents valid for a maximum of six Internet Drafts are draft documents valid for a maximum of six
months and can be updated, replaced or obsoleted by other documents months and can be updated, replaced or obsoleted by other documents
at any time. It is inappropriate to use Internet drafts as at any time. It is inappropriate to use Internet drafts as
skipping to change at page 2, line 11 skipping to change at page 2, line 11
This document specifies a set of methods, headers, and content- This document specifies a set of methods, headers, and content-
types composing DAV Versioning extensions, an application of the types composing DAV Versioning extensions, an application of the
HTTP/1.1 protocol to version DAV resources. HTTP/1.1 protocol to version DAV resources.
Table of Contents Table of Contents
VERSIONING EXTENSIONS TO WEBDAV...........................1 VERSIONING EXTENSIONS TO WEBDAV...........................1
TABLE OF CONTENTS.........................................2 TABLE OF CONTENTS.........................................2
1.INTRODUCTION...........................................4 1. INTRODUCTION ..........................................4
1.1. DAV Versioning......................................4 1.1.DAV Versioning ........................................4
1.2. Relationship to DAV.................................4 1.2.Relationship to DAV ...................................4
1.3. Terms...............................................4 1.3.Terms .................................................4
1.4. Definitions.........................................4 1.4.Definitions ...........................................4
1.5. Notational Conventions..............................5 1.5.Notational Conventions ................................5
2.BASIC VERSIONING.......................................5 2. BASIC VERSIONING ......................................5
2.1. Discovery...........................................5 2.1.Discovery .............................................6
2.2. Immutable and Mutable Properties....................6 2.2.Immutable and Mutable Properties ......................7
2.3. Automatic Versioning................................7 2.3.Versioning a Resource .................................8
2.4. Resource Properties.................................7 2.4.Immutable and Mutable Revisions .......................8
2.5. Basic Versioning Headers............................8 2.5.Versioning and COPY/MOVE ..............................9
2.5.1.Versioning-Support................................8 2.6.Sharing ...............................................9
2.5.2.Revision-Id.......................................8 2.7.Default Revision .....................................10
2.5.3.Merged-From.......................................9 2.8.Collection Versioning ................................11
2.6. Checking Out/In Resources...........................9 2.9.Basic Revision Properties ............................11
2.6.1.Checkout..........................................9 2.10. Basic Versioning Headers ...........................13
2.6.2.Branching Resources..............................11 2.10.1. Revision-Id .....................................13
2.6.3.Checkin..........................................12 2.10.2. Branch-Id .......................................14
2.6.4.Undo Checkout....................................13 2.10.3. Override-Checkin ................................14
2.6.5.Enumeration......................................13 2.10.4. Revision-Path ...................................14
2.7. Default Revision...................................13
2.8. Sharing............................................14
2.9. Collection Versioning..............................15
2.9.1.Default Revisions................................16
2.9.2.Headers..........................................16
2.9.3.Properties.......................................16
2.10.Resource Reports...................................17
2.10.1.Example.........................................17
2.10.2.Default History.................................18
2.10.3.Direct Lineage..................................19
2.10.4.Full Lineage....................................20
3.CONFIGURATIONS........................................21 3. CHECKING OUT/IN RESOURCES ............................15
3.1. Discovery..........................................22 3.1.Checkout .............................................15
3.2. Creating Configurations............................22 3.2.Checkin ..............................................17
3.3. Configuration Properties...........................24 3.3.Cancelling Checkout ..................................17
3.4. Headers............................................25 3.4.Enumeration ..........................................18
3.5. Deleting Configurations............................25
3.6. Managing Configuration Content.....................25
3.6.1.Access Using Configurations......................26
3.6.2.Adding Resources to a Configuration..............26
3.6.3.Removing Resources from a Configuration..........26
3.7. Workspace Configurations...........................27
3.7.1.Default Workspace Configurations.................27
3.7.2.Synchronizing Worksapce Configurations...........27
3.7.3.Condensing Workspace Configurations..............29
3.8. Configuration Reports..............................29
3.8.1.Configuration Derivation.........................30
3.8.2.Configuration Merge Graph........................31
3.9. Resolution Queues..................................31
3.9.1.Discovery........................................32
3.9.2.Obtaining Resolutions............................32
3.9.3.Processing Resolution Items......................32
3.10.Checkin Sets.......................................33
3.10.1.Discovery.......................................33
3.10.2.Usage...........................................34
4.VERSION MAPPING.......................................34 4. BRANCHING RESOURCES ..................................18
4.1. Discovery..........................................35
4.2. Mapping Configurations.............................35
4.3. Mapping Resource Versions..........................36
5.MISCELLANEOUS FUNCTIONS...............................37 5. RESOURCE REPORTS .....................................19
5.1. Destroy............................................37 5.1.Available Reports ....................................20
5.1.1.Discovery........................................37 5.2.Default History ......................................21
5.1.2.Usage............................................37 5.3.Active Checkouts .....................................22
5.1.3.Headers..........................................38 5.4.Direct Lineage .......................................23
5.1.4.Properties.......................................38 5.5.Full Lineage .........................................24
6.THE DAV VERSIONING GRAMMAR............................38 6. CONFIGURATION BASICS .................................26
6.1.Discovery ............................................27
6.2.Creating Configurations ..............................28
6.3.Access Using Configurations ..........................30
6.4.Deleting Configurations ..............................30
6.5.Resolution Queues ....................................30
6.6.Configuration Properties .............................31
6.7.Headers ..............................................32
7.INTERNATIONALIZATION CONSIDERATIONS...................38 7. CONFIGURATION REPORTS ................................33
7.1.Configuration Derivation .............................33
7.2.Configuration Merge Graph ............................34
8.SECURITY CONSIDERATIONS...............................38 8. DYNAMIC CONFIGURATIONS ...............................35
9.SCALABILITY...........................................38 9. WORKSPACE CONFIGURATIONS .............................37
9.1.Managing Configuration Content .......................37
9.2.Default Workspace Configurations .....................38
10. AUTHENTICATION......................................38 10. CHECKIN SETS .........................................38
11. IANA CONSIDERATIONS.................................38 11. VERSION MAPPING ......................................39
11.1. Discovery ..........................................40
11.2. Mapping Configurations .............................41
11.3. Mapping Resource Versions ..........................41
12. COPYRIGHT...........................................39 12. THE DAV VERSIONING GRAMMAR ...........................42
13. INTELLECTUAL PROPERTY...............................39 13. INTERNATIONALIZATION CONSIDERATIONS ..................42
14. REFERENCES..........................................39 14. SECURITY CONSIDERATIONS ..............................43
15. AUTHOR'S ADDRESSES..................................39 15. SCALABILITY ..........................................43
16. OPEN ISSUES.........................................39 16. AUTHENTICATION .......................................43
17. CHANGE HISTORY......................................40 17. IANA CONSIDERATIONS ..................................43
18. COPYRIGHT ............................................43
19. INTELLECTUAL PROPERTY ................................43
20. REFERENCES ...........................................43
21. AUTHOR'S ADDRESSES ...................................44
22. OPEN ISSUES ..........................................44
23. CHANGE HISTORY .......................................45
1. INTRODUCTION 1. INTRODUCTION
1.1. DAV Versioning 1.1. DAV Versioning
This document defines DAV Versioning extensions, an application of This document defines DAV Versioning extensions, an application of
HTTP/1.1 for handling resource versioning in a DAV environment. HTTP/1.1 for handling resource versioning in a DAV environment.
[DAVVERREQ] describes the motivation and requirements for DAV [DAVVERREQ] describes the motivation and requirements for DAV
Versioning. Versioning.
DAV Versioning will minimize the complexity of clients so as to DAV Versioning will minimize the complexity of clients so as to
skipping to change at page 4, line 46 skipping to change at page 4, line 46
This draft uses the terms defined in [RFC2068], [WebDAV], and This draft uses the terms defined in [RFC2068], [WebDAV], and
[DAVVERREQ]. [DAVVERREQ].
1.4. Definitions 1.4. Definitions
The section defines several terms that are used throughout the The section defines several terms that are used throughout the
document specific to DAV versioning. document specific to DAV versioning.
Versioned Resource - This refers to a resource that is subject to Versioned Resource - This refers to a resource that is subject to
versioning versioning (independent of any specific version)
Revision - This refers to a specific version of a versioned Revision - This refers to a specific version of a versioned
resource resource
Revision History - This refers to the set of changes to a versioned Revision History - This refers to the set of changes to a versioned
resource resource
Working Resource - This refers to a resource that is an Working Resource - This refers to a resource that is an
intermediate revision of a versioned resource. That is, the intermediate revision of a versioned resource. That is, the
versioned resource has been "checked out" and this is where changes versioned resource has been "checked out" and this is where changes
are made until it is ready to be "checked in". Note that working are made until it is ready to be "checked in". Note that working
resources are not versioned. resources are not versioned.
Revision Thread - This refers to a sequence of revisions that have
been branched for a specific purpose.
Line of Descent - This refers to the sequence of revisions that
have occurred from the initial revision to a specified revision.
1.5. Notational Conventions 1.5. Notational Conventions
The augmented BNF used by this document to describe protocol The augmented BNF used by this document to describe protocol
elements is exactly the same as the one described in Section 2.1 of elements is exactly the same as the one described in Section 2.1 of
[RFC2068]. Because this augmented BNF uses the basic production [RFC2068]. Because this augmented BNF uses the basic production
rules provided in Section 2.2 of [RFC2068], those rules apply to rules provided in Section 2.2 of [RFC2068], those rules apply to
this document as well. this document as well.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in
skipping to change at page 5, line 32 skipping to change at page 5, line 40
The base level of versioning support defined by this specification The base level of versioning support defined by this specification
includes both automatic versioning and the basic versioning includes both automatic versioning and the basic versioning
properties defined for all resources. To support basic versioning, properties defined for all resources. To support basic versioning,
resources MUST allow for versioning to occur automatically on resources MUST allow for versioning to occur automatically on
selected resources whenever immutable aspects are changed, and selected resources whenever immutable aspects are changed, and
support the properties defined in this section. support the properties defined in this section.
Resources that support DAV:versioning MUST also provide additional Resources that support DAV:versioning MUST also provide additional
versioning semantics for versioning-aware clients. This section versioning semantics for versioning-aware clients. This section
describes these new semantics which include enhancements to describes these new semantics which include enhancements to
existing DAV methods, new headers, and a new versioning-specific existing DAV methods, new headers, and new versioning-specific
method. methods.
Although the semantics can vary, most versioning systems support Although the semantics can vary, most versioning systems support
the notion of indicating intent to modify a document (check-out) the notion of indicating intent to modify a document (check-out)
and then submission of the modified version (check-in). Typically and then submission of the modified version (check-in). Typically
this involves some form of locking (either shared or exclusive). this involves some form of locking (either shared or exclusive).
As well, many systems support the ability to cancel a check-out or As well, many systems support the ability to cancel a check-out or
undo a recent check-in. These options are available to the owner undo a recent check-in. These options are available to the owner
or to the Administrator. or to the Administrator.
Users can generally enumerate the current check-outs although they Users can generally enumerate the current check-outs although they
skipping to change at page 5, line 55 skipping to change at page 6, line 11
users can review check-ins to see the change history. Most systems users can review check-ins to see the change history. Most systems
allow users to select different versions from the change history allow users to select different versions from the change history
and present a comparison of the versions. and present a comparison of the versions.
Note that locks are not covered in this specification as they are Note that locks are not covered in this specification as they are
addressed by [WebDAV]. addressed by [WebDAV].
2.1. Discovery 2.1. Discovery
The OPTIONS method allows the client to discover if a resource The OPTIONS method allows the client to discover if a resource
supports versioning. supports versioning. The presence of Versioning in the response
header indicates support for DAV versioning. This header indicates
the level of support.
The client issues the OPTIONS method against a resource named by The following defines the BNF for the Versioning header:
the Request-URI. This is a normal invocation of OPTIONS defined in
[RFC2068] with an extension. If the client includes the Verify-
Extension header, then the reply includes additional information
beyond that which is defined in [RFC2068].
Using this header with the extension DAV:versioning, clients can Versioning := "Versioning" ":" URI
determine what versioning support is available.
The following defines the BNF for the Verify-Extension header: The valid values of the URI are:
Verify-Extension := "Verify-Extension" ":" URI-list - DAV:basicversioning
URI-list := URI | (URI-list "," URI)
- TBD
This example shows that the /somefolder resource supports This example shows that the /somefolder resource supports
versioning. versioning.
>> Request >> Request
OPTIONS /somefolder/ HTTP/1.1 OPTIONS /somefolder/ HTTP/1.1
Verify-Extension: DAV:versioning
Host: foobar.com Host: foobar.com
Content-Length: 0 Content-Length: 0
>> Response >> Response
HTTP/1.1 200 OK HTTP/1.1 200 OK
Date: Tue, 20 Jan 1998 20:52:29 GMT Date: Tue, 20 Jan 1998 20:52:29 GMT
Connection: close Connection: close
Accept-Ranges: none Accept-Ranges: none
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
CHECKIN,
CHECKOUT, UNCHECKOUT, BRANCH
Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
Verify-Extension: DAV:versioning CHECKIN,
Versioning-Support: DAV:basicversioning CHECKOUT, UNCHECKOUT, BRANCH
Versioning: DAV:basicversioning
Content-Length: 0 Content-Length: 0
The Verify-Extension header in the reply indicates that the server Since some aspects of DAV versioning require clients to know
understood the request with Verify-Extension and that additional information, clients can include a request body that
DAV:versioning is supported. As well, the Versioning-Support specifies that DAV versioning information is desired. The
header indicates the level of versioning support provided. The BNF information is returned in the response body, formatted in XML.
for this header is provided later in this document.
>> Request
OPTIONS /somefolder/ HTTP/1.1
Host: foobar.com
Content-Length: xxx
Content-Type: text/xml
<?xml version="1.0" encoding="utf-8" ?>
<D:options xmlns:D="DAV:">
<D:verinfo/>
</D:options>
>> Response
HTTP/1.1 200 OK
Date: Tue, 20 Jan 1998 20:52:29 GMT
Connection: close
Accept-Ranges: none
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
CHECKIN,
CHECKOUT, UNCHECKOUT, BRANCH
Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
CHECKIN,
CHECKOUT, UNCHECKOUT, BRANCH
Versioning: DAV:basicversioning
Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:options xmlns:D="DAV:">
<D:verinfo>
...
</D:verinfo>
</D:options>
The details of the tags returned are described throughout this
specification.
2.2. Immutable and Mutable Properties 2.2. Immutable and Mutable Properties
An immutable property is defined as a property that, when changed, An immutable property is defined as a property that, when changed,
causes a new revision of a versioned resource to be created. causes a new revision of a versioned resource to be created.
Likewise, a mutable property is a property that can be changed Likewise, a mutable property is a property that can be changed
without having a new revision created. without having a new revision created.
Resources can support both mutable and immutable properties Resources can support both mutable and immutable properties
although there MAY be restrictions that the mutability is although there MAY be restrictions that the mutability is
consistent across all resources. consistent across all resources.
This specification doesnĘt cover the discovery or management of This specification doesn't cover the discovery or management of
property mutability. property mutability.
2.3. Automatic Versioning 2.3. Versioning a Resource
The DAV:autoversion property indicates if a resource is By default, a resource may not be subject to versioning. This can
be discovered by examining the DAV:isversioned property. To place
a non-versioned resource under version control, clients use the
VERSION method and specify the URI of the resource to version.
Note that if the specified resource is a collection, then the Depth
header is used to identify the scope of the operation. A depth of
infinity is assumed by default.
The DAV:isautoversioned property indicates if a resource is
automatically versioned when any immutable aspect of it is changed. automatically versioned when any immutable aspect of it is changed.
Resources with automatic versioning allow HTTP/1.1 clients to have Resources with automatic versioning allow HTTP/1.1 clients to have
changes versioned without explicit versioning commands. changes versioned without explicit versioning commands. This
applies to any method that modifies a resource (e.g., PUT, MKCOL,
COPY, MOVE, DELETE, PROPPATCH, ...)
Automatic versioning includes the following methods: Using the DAV:versioningenabled and DAV:autoversioning tags,
clients can establish the versioning policy.
- Updates via PUT, MKCOL, COPY, MOVE, or DELETE >> Request
- Immutable properties updates via PROPPATCH VERSION /somefolder/ HTTP/1.1
Host: foobar.com
Depth: infinity
Content-Type: text/xml
Content-Length: xxx
2.4. Resource Properties <?xml version="1.0" encoding="utf-8" ?>
<D:versioning xmlns:D="DAV:">
<D:versioningenabled>On</D:versioningenabled>
<D:autoversioning>On</D:autoversioning>
</D:versioning>
>> Response
HTTP/1.1 200 OK
Content-Length: 0
2.4. Immutable and Mutable Revisions
By default, the contents of a revision are immutable. That is,
once a revision is created, it cannot be altered. However, in many
document management systems this is not the case. To address these
scenarios, the THAW/FREEZE methods are introduced. Note that
support for THAW and FREEZE are optional, but these operations MUST
fail if not supported.
The THAW method specifies that the indicated revision should be
made mutable so that subsequent methods can alter the immutable
aspects of the resource. The FREEZE method indicates that all
changes have been made and the revision should be marked immutable
again.
The DAV:canthaw property indicates if a revision can be thawed.
Similarly, the DAV:hasthawed property indicates if a revision has
ever been thawed. Finally, the DAV:isthawed property specifies if
the revision is currently thawed (frozen if not).
The following example shows the use of THAW and FREEZE.
>>Request
THAW /foo/bar.htm HTTP/1.1
Revision-Id: VER:FHF45409
Host: www.foobar.com
Content-Length: 0
...
PUT /foo/bar.htm HTTP/1.1
Revision-Id: VER:FHF45409
Host: www.foobar.com
Content-Length: xxx
...
FREEZE /foo/bar.htm HTTP/1.1
Revision-Id: VER:FHF45409
Host: www.foobar.com
Content-Length: 0
...
2.5. Versioning and COPY/MOVE
When a COPY method is issued against a versioned resource or
revision, only the "current" revision of the versioned resource or
the specified revision is copied to the specified destination.
That is, the entire history is NOT copied.
When a MOVE method is issued against a versioned resource the
"move" SHOULD be represented in the revision history. That is, a
MOVE operation CANNOT be represented as a delete and an add. A
MOVE operation cannot be issued against a specific revision.
2.6. Sharing
Many versioning systems today provide the ability to have a given
resource visible in multiple parts of the namespace. In these
situations, a resource is shared. That is, changes to the resource
are visible to all versions.
The WebDAV Advanced Collections working group addresses this need
with direct referential members. Support for direct referential
members is required for DAV versioning.
2.7. Default Revision
If a Revision-Id (or Branch-Id) header is not specified when
referring to a resource, then the tip (latest) revision (from the
primary branch) is used, unless a default revision has been
identified. To mark a specified revision as the default revision,
clients use the SETDEFAULT method. Note that PUT or CHECKIN will
remove any default version. Also note that branching a resource
has no effect on the default revision of the resource, even if the
default revision is branched. If the default is removed, the
default revision is the tip revision of the initial (primary)
branch of the versioned resource.
Setting the default revision to DAV:none cancels the default
revision.
>>Request
SETDEFAULT /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:setdefault xmlns:D="DAV:">
<D:href>VER:HT58GHDW49</D:href>
</D:setdefault>
>>Response
HTTP/1.1 200 OK
Content-Length: 0
>>Request
SETDEFAULT /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:setdefault xmlns:D="DAV:">
<D:none/>
</D:setdefault>
>>Response
HTTP/1.1 200 OK
Content-Length: 0
If a resource is shared, servers MUST support the ability to set
different default revisions at each point of the share.
Clients can determine the default revision by examining the
DAV:revisionid from the default revision.
>>Request
PROPFIND /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop>
<D:revisionid/>
</D:prop>
</D:propfind>
2.8. Collection Versioning
Collections can be versioned just like non-collection resources,
however, they are only versioned when a direct change is made to
the collection.
It is up to each collection resource to determine if it supports
default versions. If it doesn't, then SETDEFAULT requests MUST
fail.
The Revision-Path header is used to identify specific revisions
that are part of the "path" to the resource. This header servers
as an alternative to "URL munging". This header can be specified
on all methods and qualifies the resource named in the method.
2.9. Basic Revision Properties
For resources that support versioning, they MUST support the For resources that support versioning, they MUST support the
following properties using the "DAV:" namespace. Note that 0/1 is following properties using the "DAV:" namespace. Note that 0/1 is
used as a FALSE (0) / TRUE (1) indicator. used as a FALSE (0) / TRUE (1) indicator.
DAV:isversioned - 0/1 to indicate if the resource is versionable. DAV:isversioned - 0/1 to indicate if the resource is versionable.
Note that this can be implemented as a read-only property. Note that this can be implemented as a read-only property.
DAV:autoversion - 0/1 to indicate if the resource is automatically DAV:autoversion - 0/1 to indicate if the resource is automatically
versioned when modified. Note that this can be implemented this versioned when modified. Note that this can be implemented this as
as a read-only property. a read-only property.
DAV:revisionid - This is a read-only property that returns a server DAV:revisionid - This is a read-only property that returns a server
determined id for this specific revision of the resource. Every determined id for this specific revision of the resource. Every
revision of a resource will have a unique DAV:revisionid. A revision of a resource will have a unique DAV:revisionid. A
revision id may be a URI or it may be an arbitrary server-defined revision id may be a URL or it may be an arbitrary server-defined
string. However, it cannot contain the "," character. Because it string. However, it cannot contain the "," character. Because it
is not required to be a URI, the DAV:revisionuri property is is not required to be a URL, the DAV:revisionurl property is
required to obtain a URI for the specific revision of the resource. required to obtain a URI for the specific revision of the resource.
DAV:vresourceid - This is a read-only property that returns a DAV:vresourceid - This is a read-only property that returns a
server determined id for the versioned resource. That is, all server determined id for the versioned resource. That is, all
revisions of the resource have the same DAV:vresourceid. This MUST revisions of the resource have the same DAV:vresourceid. This MUST
be preserved over MOVE requests. be preserved over MOVE requests and should be globally unique.
DAV:previousversionids - This is a read-only property that returns DAV:previousrevisionids - This is a read-only property that returns
the server defined id for the previous revision of the resource. the server defined id for the previous revision of the resource.
An empty value indicates that there are no previous revisions. An empty value indicates that there are no previous revisions.
Note that there could be multiple previous versions. If there are Note that there could be multiple previous versions. If there are
multiple revisions, they are returned as a comma-separated list. multiple revisions, they are returned as a comma-separated list.
Note that this property returns previous revisions that the server Note that this property returns previous revisions that the server
determines. That is, this does not include user identified merged determines. That is, this does not include user identified merged
revisions. revisions.
DAV:nextversionids - This is a read-only property that returns the DAV:distinguishedpredecessorid - This read-only property indicates
the primary predecessor for a revision in the event they are
multiple predecessors.
DAV:nextrevisionids - This is a read-only property that returns the
server defined id for the next revision of the resource. An empty server defined id for the next revision of the resource. An empty
value indicates that there is no subsequent revision. Note that value indicates that there is no subsequent revision. Note that
there could be multiple next revisions. If there are multiple there could be multiple next revisions. If there are multiple
revisions, they are returned as a comma-separated list. Note that revisions, they are returned as a comma-separated list. Note that
this property returns successor revisions that the server this property returns successor revisions that the server
determines. That is, this does not include user identified merged determines. That is, this does not include user identified merged
revisions. revisions.
DAV:revisionuri - This is a read-only property that returns a URI DAV:revisionurl - This is a read-only property that returns a URL
for this specific revision. for this specific revision.
DAV:revisiondisplayname - This is a read-only property that returns
a string that clients may use to display this revision. This is
often a more user friendly string than DAV:revisionid.
DAV:revisionlabel - This property allows the specification of DAV:revisionlabel - This property allows the specification of
textual names that refer to this version of the resource. If there textual names that refer to this version of the resource. If there
are multiple labels, they are returned as a comma separated list. are multiple labels, they are returned as a comma separated list.
Labels MUST be unique for the versioned resource. That is, no two Labels MUST be unique for the versioned resource. That is, no two
revisions of the same versioned resource can have the same revisions of the same versioned resource can have the same
DAV:revisionlabel. As well, DAV:revisionlabel, DAV:revisionid, and DAV:revisionlabel. As well, DAV:revisionlabel and DAV:revisionid
DAV:vresourceid all share the same namespace and there can be no properties share the same namespace and there can be no duplicates.
duplicates. Servers MAY reserve specific portions of this Servers MAY reserve specific portions of this namespace and return
namespace and return an error if a client uses a reserved name as a an error if a client uses a reserved name as a revision label.
revision label. This property MUST be mutable. This property MUST be mutable.
DAV:mergedfrom - This property specifies a comma separated list of DAV:mergedfrom - This property specifies a comma separated list of
revision ids from which this revision is purported to be derived. revision ids from which this revision is purported to be derived.
This information is provided and managed by the client. This information is provided and managed by the client. This is a
mutable property.
DAV:mergedto - This property specifies a comma separated list of
revision ids from which this revision is purported to be merged
into. This information is provided and managed by the client. This
is a mutable property.
DAV:mergedfromunion - This read-only property specified a comma
separated list of revision ids from which this revision is derived.
This is a union of the DAV:mergedfrom and DAV:previousrevisionids
properties.
DAV:revisioncomment - This property contains a client-defined DAV:revisioncomment - This property contains a client-defined
property associated with the revision. This as a mutable property. property associated with the revision. This as a mutable property.
This is a mutable property.
2.5. Basic Versioning Headers DAV:author - The creator of the revision. This is an arbitrary
string.
The following sub-sections describe the new version headers that DAV:canthaw - This property indicates if the revision can be THAWed
MUST be supported for resources that support DAV:versioning. for modification. Servers MAY implement this as read-only.
2.5.1. Versioning-Support DAV:hasthawed - This read-only property indicates if the revision
has ever been thawed.
The Versioning-Support header specifies the type of versioning that DAV:isthawed - This read-only property indicates if the revision is
is available. The following BNF defines this header. currently thawed (or frozen if not).
Versioning-Support := "Versioning-Support" ":" URI-list DAV:lastcheckin - This read-only property specifies the date this
revision was "checked in" in ISO8601 format.
To support versioning, the URI list MUST include 2.10. Basic Versioning Headers
DAV:basicversioning. Later sections of this document specify other
optional support.
2.5.2. Revision-Id The following sub-sections describe the new version headers that
MUST be supported for resources that support DAV:versioning.
2.10.1. Revision-Id
The Revision-Id header is used to identify a specific revision of a The Revision-Id header is used to identify a specific revision of a
versioned resource. This header can be specified on all methods versioned resource. This header can be specified on all methods
and qualifies the resource named in the method. As well, this and qualifies the resource named in the method. As well, this
header is included in all replies to indicate the revision of the header is included in all replies to indicate the revision of the
versioned resource used or created. versioned resource used or created.
The BNF for this header is as follows. The BNF for this header is as follows.
Revision-Id := "Revision-Id" ":" RID Revision-Id := "Revision-Id" ":" RID
RID := "*" | ANY RID := "*" | Time-Ref | ANY
Clients can specify a DAV:revisionid or any of the Time-Ref := "Time" "(" ISO8601 ")"
DAV:revisionlabel values to refer to a specific revision of the
resource. This property allows the specification of criteria that selects a
specific revision of a resource. This includes a DAV:revisionid or
any of the DAV:revisionlabel values to refer to a specific revision
of the resource. As well, a configuration (described later) can be
referenced here to select the default revision associated with the
configuration.
The use of the Time operator is to select the "current" revision as
of the specified time.
The use of Revision-Id: * is only permitted with PROPFIND to obtain The use of Revision-Id: * is only permitted with PROPFIND to obtain
properties across all revisions of a versioned resource. properties across all revisions of a versioned resource.
2.5.3. Merged-From 2.10.2. Branch-Id
When clients use resource branching, they will likely need to The Branch-Id header is used to identify a branch (revision
perform merge operations. A merge is the process by which changes thread). The BNF for the header is as follows:
from different versions are combined to produce a new version. It
is likely that clients will want to track this semantic
information. When the Merged-From header is specified on a PUT,
UNLOCK, or PROPPATCH method, it indicates the revision (or
revisions) from which the change is derived. The server tracks
this information and makes it available in the DAV:mergedfrom
property.
Merged-Item := ANY Branch-Id := "Branch-Id" ":" ANY
Merged-List := Merged-Item | (Merged-List "," Merged-Item)
Merged-From := "Merged-From" ":" Merged-List
>>Request The Branch-Id can be used anywhere a revision-id is used. When
specified, it indicates that the latest version of the indicated
branch is to be selected as the revision to use for the operation.
PUT /foo/bar HTTP/1.1 2.10.3. Override-Checkin
Host: www.foobar.com
Merged-From: VER:FDHJ43058
Content-Type: text/html
Content-Length: xxxx
... It is possible that the check-in operation will detect a conflict.
For example, version 5 was checked out shared, and before it is
checked back in, version 6 was created. In these situations, the
check-in MUST fail indicating a conflict. Clients can choose to
branch the resource, merge on the client, or overwrite. To
circumvent this check, clients can use the Override-Checkin header.
This specifies that the check-in operation SHOULD NOT fail (either
the client has merged to resolve the conflict, or desires an
overwrite). The BNF is as follows:
>>Response Override-Checkin := "Override-Checkin" ":" ("Yes" | "No")
HTTP/1.1 200 OK 2.10.4. Revision-Path
The Revision-Path header allows clients to identify specific
versions of collections that should be used rather than the default
revisions.
The BNF for this header is as follows.
Revision-Path := "Revision-Path" ":" Path
Path := PItem | (Path PItem)
PItem := "/" ANY Rev
Rev := | (";" RID)
RID := "*" | ANY | "(" ANY ")"
>>Request
GET /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Revision-Path: /foo;VER:HT58GHDW49/bar.htm
Content-Length: 0 Content-Length: 0
2.6. Checking Out/In Resources The use of * for a revision is only permitted with PROPFIND to
obtain properties across all revisions of a versioned resource.
3. CHECKING OUT/IN RESOURCES
For versioning-aware clients, more advanced requests allow them to For versioning-aware clients, more advanced requests allow them to
perform specific versioning operations. These methods are directed perform specific versioning operations. These methods are directed
at a specific URI and the body contains XML indicating the action at a specific URI to alter.
to take.
If a resource supports DAV:versioning then it MUST support the If a resource supports DAV:versioning then it MUST support the
LOCK/UNLOCK extensions defined in this section. methods defined in this section.
2.6.1. Checkout 3.1. Checkout
Using the LOCK method, clients can request resources to be "checked Using the CHECKOUT method, clients can request resources to be
out". This involves creating a working resource that is not "checked out". This involves creating a working resource that is
automatically versioned. Checked out resources must be checked in not automatically versioned. Checked out resources must be checked
or aborted, using the UNLOCK method. The diagram below illustrates in or cancelled. The diagram below illustrates this process:
this process:
Revisions of foo.htm: V1 Revisions of foo.htm: V1
Checkout is performed: V1 Checkout is performed: V1
| |
+-> Working Resource +-> Working Resource
Checkin is performed: V1 -> V2 Checkin is performed: V1 -> V2
The body XML indicates an optional checkout comment, an optional The body XML indicates an optional checkout comment, an optional
user token, and locking actions. Clients specify the checkout lock user token, and locking actions. The response indicates the
in all update operations (e.g., PUT or PROPPATCH) to alter the working resource as well as any requested locks.
working resource.
The working resource will always be DAV:checkout locked. Clients
can choose to make the appropriate scope (DAV:shared,
DAV:exclusive, ...). Optionally, using the DAV:vresoucelockscope
tag, clients can have the versioned resource DAV:checkout locked
for a specified scope (DAV:shared, DAV:exclusive, ...). If a client
requests the versioned resource to be locked, and it cannot be,
then the lock operation MUST fail.
The DAV:checkout lock state is equivalent to the DAV:write lock
state in terms of interoperability with other locks.
Resources SHOULD allow clients to propose a DAV:locktoken in the
LOCK request. If a resource does not accept a clientĘs proposed
lock token, it MUST fail the LOCK request.
>>Request
LOCK /foo/bar HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:lockinfo xmlns:D="DAV:">
<D:locktype><D:checkout/></D:locktype>
<D:comment>checkout comment</D:comment>
<D:owner>client-defined token</D:owner>
<D:lockscope><D:exclusive/></D:lockscope>
<D:vresourcelockscope><D:shared/></D:vresourcelockscope>
</D:lockinfo>
>>Response
HTTP/1.1 201 CREATED
Content-Type: text/xml
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8"?>
<D:prop xmlns:D="DAV:">
<D:lockdiscovery>
<D:activelock>
<D:locktype><D:checkoutlock/></D:locktype>
<D:lockscope><D:exclusive/><D:lockscope>
<D:owner>client-define token</D:owner>
<D:locktoken>
<D:href>opaquelocktoken:rejrei-43343-rereffre</D:href>
</D:locktoken>
</D:activelock>
</D:lockdiscovery>
</D:prop>
2.6.2. Branching Resources
For more sophisticated clients, basic resource branching is
required. Resource branching means that for a given resource, the
history is not linear. That is, there are different lines of
descent. The diagram below illustrates this.
Revision history V1 -> V2 -> V3
Of foo.htm: |
+-> V1.1 -> V1.2
|
+-> V1.1.1
Individual resource branching is common in many versioning systems
today. Project branching (configurations) are described in a later
section. Note that when a collection is branched, the depth of the
branch is infinity. There is no way to change this.
If a resource supports branching, it MUST return The CHECKOUT method causes the creation of the working copy which
DAV:resourcebranching in the Versioning-Support header reply from is specified by the Location header in the response.
OPTIONS.
A resource is branched using the LOCK method and the DAV:checkout Clients can optionally request locks to be taken as part of the
lock type. The resource to be branched is specified as the target CHECKOUT operation. If the locks cannot be obtained, the CHECKOUT
URI for the method. operation MUST fail. The following table identifies the different
lock options:
Clients have a choice of three approaches to branching which are Lock Tags Used Description
specified with specific tags in the request: Target (DAV: assumed)
- perform a branch <DAV:branchresource> working wrlocktype, Limits access to the newly created
resource wrlockscope working resource
- do not branch, error if necessary <DAV:dontbranchresource> revision revisionlockty Blocks CHECKOUT/INs against this
pe, revision
revisionlocksc
ope
branch branchlocktype Blocks CHECKOUT/INs against
, revisions in this branch
branchlockscop
e
- branch if necessary <DAV:branchallowed> versioned vrlocktype, Blocks CHECKOUT/INs against any
resource vrlockscope revision of the versioned
resource.
As well, clients can specify a branch label to identify a created The semantics of the tags match those of DAV:locktype and
branch using the DAV:branchlabel tag. The reply MUST include a DAV:lockscope as specified for the LOCK method.
Branch-Id header specifying a resource defined branch id or the
specified branch label if a branch is created. The label or id can
be specified in a Branch-Id or Revision-Id header to determine the
revision to access.
>>Request >>Request
LOCK /foo/bar.htm HTTP/1.1 CHECKOUT /foo/bar HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Content-Type: text/html Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:lockinfo xmlns:D="DAV:"> <D:checkout xmlns:D="DAV:">
<D:branchresource/>
<D:branchlabel>MyBranch</D:branchlabel>
<D:locktype><D:checkout/></D:locktype>
<D:comment>checkout comment</D:comment> <D:comment>checkout comment</D:comment>
<D:owner>client-defined token</D:owner> <D:owner>client-defined token</D:owner>
<D:lockscope><D:exclusive/></D:lockscope> <D:wrlocktype><D:write/></D:locktype>
<D:vrsourcelockscope><D:shared/></D:vresourcelockscope> <D:wrlockscope><D:exclusive/></D:lockscope>
</D:lockinfo> </D:checkout>
>>Response >>Response
HTTP/1.1 201 CREATED HTTP/1.1 201 CREATED
Branch-Id: MyBranch Location: http://www.foobar.com/tmp/VRJHJWE3493409
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:prop xmlns:D="DAV:"> <D:prop xmlns:D="DAV:">
<D:lockdiscovery> <D:lockdiscovery>
<D:activelock> <D:activelock>
<D:locktype><D:checkoutlock/></D:locktype> <D:wrlocktype><D:write/></D:locktype>
<D:lockscope><D:exclusive/><D:lockscope> <D:wrlockscope><D:exclusive/><D:lockscope>
<D:owner>client-define token</D:owner> <D:owner>client-define token</D:owner>
<D:locktoken> <D:locktoken>
<D:href>opaquelocktoken:rejrei-43343-rereffre</D:href> <D:href>opaquelocktoken:rejrei-43343-rereffre</D:href>
</D:locktoken> </D:locktoken>
</D:activelock> </D:activelock>
</D:lockdiscovery> </D:lockdiscovery>
</D:prop> </D:prop>
When a branch is created, the reply MUST include a Branch-Id Servers MUST fail this operation if a branch is required.
header. The BNF for the header is as follows:
Branch-Id := "Branch-Id" ":" ANY
The Branch-Id can be used anywhere a revision-id is used. When
specified, it indicates that the latest version of the indicated
branch is to be selected as the revision to use for the operation.
2.6.3. Checkin 3.2. Checkin
When the client has completed changes to a resource and wishes it When the client has completed changes to a resource and wishes it
to become part of the revision history, the client must check in to become part of the revision history, the client must check in
the resource. This is performed using the UNLOCK method against the resource. This is performed using the CHECKIN method against
the versioned resource with special body tags and identification of the working copy.
the checkout lock in the header.
The DAV:keepcheckedout tag can be specified to indicate that the
resource should remain checked out. That is, create a new
revision, but leave the working copy checked out.
Using XML tags in the request body, clients can specify optional
checkin information.
>>Request >>Request
UNLOCK /foo/bar.htm HTTP/1.1 CHECKIN /tmp/VRJHJWE3493409 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Lock-Token: <opaquelocktoken:rejrei-43343-rereffre> Lock-Token: <opaquelocktoken:rejrei-43343-rereffre>
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxx Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:unlockinfo xmlns:D="DAV:"> <D:checkin xmlns:D="DAV:">
<D:comment>checkin comment</D:comment> <D:comment>checkin comment</D:comment>
</D:unlockinfo> </D:checkin>
>>Response >>Response
HTTP/1.1 204 CREATED HTTP/1.1 201 CREATED
Revision-Id: VER:FREFRI49349 Revision-Id: VER:FREFRI49349
Content-Length: 0 Content-Length: 0
The reply MUST include the Revision-Id of the newly created The reply MUST include the Revision-Id of the newly created
revision. revision.
2.6.4. Undo Checkout It is possible that the check-in operation will detect a conflict.
Servers MUST fail this operation if a branch is required. The
Override-Checkin header is used to resolve these conflicts.
If a client chooses to cancel a checkout request, the UNLOCK method 3.3. Cancelling Checkout
is used with optional body tags and identification of the checkout
lock. If a client chooses to cancel a checkout request, the UNCHECKOUT
method against the working copy. As well, optional XML body tags
can be used to supply additional information.
>>Request >>Request
UNLOCK /foo/bar.htm HTTP/1.1 UNCHECKOUT /tmp/VRJHJWE3493409 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Lock-Token: <opaquelocktoken:rejrei-43343-rereffre> Lock-Token: <opaquelocktoken:rejrei-43343-rereffre>
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxxx Content-Length: xxxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:unlockinfo xmlns:D="DAV:"> <D:uncheckout xmlns:D="DAV:">
<D:cancelcheckout/>
<D:comment>cancel checkout comment</D:comment> <D:comment>cancel checkout comment</D:comment>
</D:unlockinfo> </D:uncheckout>
>>Response >>Response
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Length: 0 Content-Length: 0
2.6.5. Enumeration 3.4. Enumeration
Clients can enumerate the current checkouts to a resource using the
PROPFIND method and standard lock discovery. All attributes
specified in the lock request (e.g. DAV:comment) MUST be returned
in lock discovery.
2.7. Default Revision
If a Revision-Id (or Branch-Id) header is not specified when Refer to the Resource Reports section for details on check-out
referring to a resource, then the tip (latest) revision (from the enumeration.
primary branch) is used, unless a default revision has been
identified. To mark a specified revision as the default revision,
clients use the PIN method. Note that PUT or checkin will create
new revisions which will be returned unless a PIN is defined. When
a revision is PINned, new revisions can be created with PUT or
checkin, but they will not be returned unless they are referenced
explicitly.
Note that branching a resource has no effect on the default 4. BRANCHING RESOURCES
revision of the resource, even if the default revision is branched.
If unpinned, the default revision is the tip revision of the
initial (primary) branch of the versioned resource.
>>Request For more sophisticated clients, basic resource branching is
required. Resource branching means that for a given resource, the
history is not linear. That is, there are different lines of
descent. The diagram below illustrates this.
PIN /foo/bar.htm HTTP/1.1 Revision history V1 -> V2 -> V3
Host: www.foobar.com Of foo.htm: |
Content-Type: text/xml +-> V1.1 -> V1.2
Content-Length: xxx |
+-> V1.1.1
<?xml version="1.0" encoding="utf-8" ?> Individual resource branching is common in many versioning systems
<D:pin xmlns:D="DAV:">VER:HT58GHDW49</D:pin> today. Project branching (configurations) are described in a later
section. Note that when a collection is branched, the depth of the
branch is infinity. There is no way to change this.
>>Response A revision is branched using the BRANCH method. The resource to be
branched is specified as the target URI for the method.
HTTP/1.1 200 OK As well, clients can specify a branch label to identify a created
Content-Length: 0 branch using the DAV:branchlabel tag. The reply MUST include a
Branch-Id header specifying a resource defined branch id or the
specified branch label if a branch is created. The label or id can
be specified in a Branch-Id or Revision-Id header to determine the
revision to access.
>>Request >>Request
PIN /foo/bar.htm HTTP/1.1 BRANCH VER:FHHR4959 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Content-Type: text/xml Content-Type: text/html
Content-Length: xxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:unpin xmlns:D="DAV:"/> <D:branch xmlns:D="DAV:">
<D:branchlabel>MyBranch</D:branchlabel>
>>Response <D:comment>branch comment</D:comment>
</D:branch>
HTTP/1.1 200 OK
Content-Length: 0
It should be noted that setting a default revision may impact
automatic versioning. If a client performs a PUT operation that is
automatically versioned, it MUST fail if a GET will not return the
new version (possibly because of a PIN).
2.8. Sharing
Many versioning systems today provide the ability to have a given
resource visible in multiple parts of the namespace. In these
situations, a resource is shared. That is, changes to the resource
are visible to all versions.
The WebDAV advanced collections adds support for referential
members, however, this is not sufficient for sharing in a
versioning environment because of the requirement to establish
default revisions. Indirect references cannot map to specific
versions for down-level (e.g. HTTP/1.1) clients and direct
references map directly to the shared resource.
This specification introduces a new type of referential member,
semi-direct. A semi-direct reference is like a direct reference
except that it can have attributes of its own or it can map
directly to the shared resource. By default, when a semi-direct
reference is used in a request, it behaves like a direct reference.
However, if the Pass-Through header is specified on the request
with a value of "*", then the operation is performed against the
semi-direct reference not the object it points to. This is an
extension of the WebDAV advanced collection specification in value
and because the header can be specified with any request against a
semi-direct reference.
In the example below, a semi-direct reference is created.
>>Request
MKREF /bing/bar.htm HTTP/1.1
Host: www.foobar.com
Ref-Target: /foo/bar.htm
Ref-Integrity: DAV:semidirect
Content-Length: 0
>>Response >>Response
HTTP/1.1 201 CREATED HTTP/1.1 201 CREATED
... Branch-Id: MyBranch
Revision-Id: VER:REUU48583
In the example below, a request is made to a semi-direct reference.
The object that the reference refers to is returned.
>>Request
GET /bing/bar.htm HTTP/1.1
Host: www.foobar.com
Content-Length: 0
In the example below, the semi-direct reference is PINned to a
specific revision.
>>Request
PIN /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Pass-Through: *
Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:pin xmlns:D="DAV:">VER:HT58GHDW49</D:pin>
2.9. Collection Versioning
Collections can be versioned just like non-collection resources,
however, there are special situations that must be taken into
account. Collections are versioned in the following ways:
- DonĘt version the collection regardless of the changes.
- Version the collection only if there is a direct change to the
resource.
- Version the collection if there is a change anywhere under the
collection (i.e., bubble of the changes).
Each collection resource MAY choose the behavior it supports. The
behavior is specified through properties, which resources MAY
choose to make read-only.
The DAV:autoversion property indicates if a collection resource
supports versioning when changes are made to it. The
DAV:autocollectionversion property indicates if the collection
resource supports versioning when changes are made anywhere in the
namespace below it.
2.9.1. Default Revisions
It is up to each collection resource to determine if it supports
default versions. If it doesnĘt, then PIN requests MUST fail. If
a collection resource doesnĘt support versioning, then is MUST also
fail PIN requests.
2.9.2. Headers
If collections are versioned, then clients may choose to access
resources that are part of specific revisions. The Revision-Path
header is used to identify specific revisions that are part of the
"path" to the resource. This header servers as an alternative to
"URL munging". This header can be specified on all methods and
qualifies the resource named in the method.
The BNF for this header is as follows.
Revision-Path := "Revision-Path" ":" Path
Path := PItem | (Path PItem)
PItem := "/" ANY Rev
Rev := | (";" RID)
RID := "*" | ANY | "(" ANY ")"
>>Request
GET /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Revision-Path: /foo;VER:HT58GHDW49/bar.htm;VER:HT58GHDW49
Content-Length: 0 Content-Length: 0
The use of * for a revision is only permitted with PROPFIND to When a branch is created, the reply MUST include a Branch-Id
obtain properties across all revisions of a versioned resource. header.
2.9.3. Properties
DAV:autocollectionversion - This propertyĘs value (0/1) specifies
if a collection is automatically versioned when its contents
(anywhere under it) change. That is, if /foo/bar.htm is versioned,
is /foo/ versioned as well. Resources MAY implement this as a
read-only property.
DAV:canautocollectionversion - This propertyĘs value (0/1)
specifies if the resource supports the ability to automatically
version collections when a contained resource changes. This is a
read-only property.
2.10. Resource Reports 5. RESOURCE REPORTS
Revision history graphs and other reports of a resource are Revision history graphs and other reports of a resource are
accessed via PROPFIND. Note that resources MAY support multiple accessed via PROPFIND.
styles of history and reports. To enumerate the supported history
graphs and reports, clients use PROPFIND and the <DAV:enumreport>
property. The results indicate the different reports which can,
themselves, be requested via PROPFIND.
Note that clients can request properties to be included in reports Note that resources MAY support multiple styles of history and
by specifying the desired properties inside the DAV:enumreport tag. reports. To enumerate the supported history graphs and reports,
clients use PROPFIND and the <DAV:availablereports> property. The
results indicate a list of the different reports which can,
themselves, be requested via PROPFIND.
For the examples in this section, assume that the resource /foo.htm For the examples in this section, assume that the resource /foo.htm
has the following revision graph: has the following revision graph:
Revision history V1 -> V2 -> V3 Revision history V1 -> V2 -> V3
Of foo.htm: | Of foo.htm: |
+-> V1.1 -> V1.2 +-> V1.1 -> V1.2
| |
+-> V1.1.1 +-> V1.1.1
skipping to change at page 17, line 61 skipping to change at page 20, line 14
- V2: Test1 - V2: Test1
- V1.1: Test2, Good - V1.1: Test2, Good
- V1.2: Tested - V1.2: Tested
Additionally, when the V1.1 branch was created, it was labeled Additionally, when the V1.1 branch was created, it was labeled
"MyBranch". "MyBranch".
2.10.1. Example 5.1. Available Reports
Clients can obtain the available reports for a resource by
obtaining its DAV:availablereports property.
>>Request >>Request
PROPFIND /foo/bar.htm HTTP/1.1 PROPFIND /foo/bar.htm HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:enumreport/> <D:prop>
<D:availablereports/>
</D:prop>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind> <D:multistatus>
<D:response>
<D:href>http:/www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop> <D:prop>
<D:enumreport> <D:availablereports>
<D:report><D:href>DAV:defaulthistory</D:href></D:report> <D:report>DAV:defaulthistory</D:report>
<D:report><D:href>DAV:directlineage</D:href></D:report> <D:report>DAV:directlineage</D:report>
<D:report><D:href>DAV:fulllineage</D:href></D:report> <D:report>DAV:fulllineage</D:report>
</D:enumreport> </D:availablereports>
</D:prop> </D:prop>
</D:propfind> </D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
... ...
Note that the report styles MUST be specified as DAV:href values. Note that the report styles MUST be specified as DAV:href values.
2.10.2. Default History When clients issue PROPFIND requests to obtain reports, they may
include other properties in the request. These properties are
returned for each report item.
5.2. Default History
Resources MUST support the DAV:defaulthistory report. This Resources MUST support the DAV:defaulthistory report. This
enumerates the historical record of revisions that have been enumerates the historical record of revisions that have been
visible as the default revision of the versioned resource. visible as the default revision.
Clients can specify the limit parameter to limit the number Clients can specify the limit parameter to limit the number
revisions returned. By definition, revisions are returned in revisions returned. By definition, revisions are returned in
reverse chronological order starting with the most recent. reverse chronological order starting with the most recent.
>>Request >>Request
PROPFIND /foo/bar.htm HTTP/1.1 PROPFIND /foo/bar.htm HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:enumreport type="DAV:defaulthistory" limit=20/> <D:defaulthistory limit=20/>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind> <D:multistatus>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop> <D:prop>
<D:enumreport type="DAV:defaulthistory"> <D:revisionid>V3</D:revision>
<D:revision id="V1" vresourceid="VER:FFHJE"> <D:revisioncomment>Update it</D:comment>
<D:revisioncomment>Update it</D:revisioncomment>
</D:revision>
<D:revision id="V2" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
<D:revisionlabel>Test1</D:revisionlabel>
</D:revision>
<D:revision id="V1" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
</D:revision>
<D:revision id="V3" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
</D:revision>
</D:enumreport>
</D:prop> </D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V1</D:revision>
<D:revisioncomment>Update it</D:comment>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V2</D:revision>
<D:revisioncomment>Update it</D:comment>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V1</D:revision>
<D:revisioncomment>Update it</D:comment>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
5.3. Active Checkouts
Clients can obtain a list of the active checkouts against a
resource using PROPFIND and DAV:activecheckouts.
>>Request
PROPFIND /foo/bar.htm HTTP/1.1
Host: www.foobar.com
Revision-Id: VER:FHRJ494059
Depth: 0
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:activecheckouts/>
</D:propfind> </D:propfind>
2.10.3. Direct Lineage >>Response
Resources MUST support the DAV:directlineage report. This HTTP/1.1 207 Multi-Status
enumerates the direct parent revisions of the versioned resource. Content-Type: text/xml
This report is from the default revision or the specified revision. Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:checkout>
<D:owner>user-specified</D:owner>
<D:revisionid>VER:FHER4949</D:revision>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:workingcopy>
<D:href>http://www.foobar.com/tmp/FHFH34949</D:href>
</D:workingcopy>
</D:checkout>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
5.4. Direct Lineage
Resources SHOULD support the DAV:directlineage report. This
enumerates the direct parent revisions of the resource.
Clients can request that a report be based on the namespace entry Clients can request that a report be based on the namespace entry
specified, or the associated DAV:vresourceid. Clients use the specified, or the associated DAV:vresourceid. Clients use the
scope parameter to specify (name or id). scope parameter to specify (name or id).
Clients can specify the limit parameter to limit the number
revisions returned.
>>Request >>Request
PROPFIND /foo/bar.htm HTTP/1.1 PROPFIND /foo/bar.htm HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Revision-Id: V3 Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:enumreport type="DAV:directlineage" scope="name"/> <D:directlineage scope="name"/>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind> <D:multistatus>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop> <D:prop>
<D:enumreport type="DAV:directlineage" scope="name"> <D:revisionid>V1</D:revision>
<D:revision id="V1" vresourceid="VER:FFHJE"> <D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:revisioncomment> <D:revisioncomment>Update it</D:comment>
<D:revision id="V2" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
<D:revisionlabel>Test1</D:revisionlabel>
<D:revision id="V3" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
<D:merge id="V2" vresourceid="VER:FFHJE"/>
<D:merge id="V1.2" vresourceid="VER:FFHJE"/>
</D:revision>
</D:revision>
</D:revision>
</D:enumreport>
</D:prop> </D:prop>
</D:propfind> </D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V2</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V1</D:derivedfrom>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V3</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V3</D:derivedfrom>
<D:revisionlabel>Test1</D:label>
<D:mergedfrom>V2</D:mergedfrom>
<D:mergedfrom>V1.2</D:mergedfrom>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
2.10.4. Full Lineage 5.5. Full Lineage
Resources MUST support the DAV:fulllineage report. This enumerates Resources SHOULD support the DAV:fulllineage report. This
the full graph of revisions for this resource. enumerates the full graph of revisions for this resource.
Clients can request that a report be based on the namespace entry Clients can request that a report be based on the namespace entry
specified, or the associated DAV:vresourceid. Clients use the specified, or the associated DAV:vresourceid. Clients use the
scope parameter to specify (name or id). scope parameter to specify (name or id).
Clients can specify the limit parameter to limit the number
revisions returned.
>>Request >>Request
PROPFIND /foo/bar.htm HTTP/1.1 PROPFIND /foo/bar.htm HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Revision-Id: VER:FHJRH3994 Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:enumreport type="DAV:fulllineage" scope="name"/> <D:fulllineage scope="name"/>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind>
<D:multistatus>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop> <D:prop>
<D:enumreport type="DAV:fulllineage" scope="name"> <D:revisionid>V1</D:revision>
<D:revision id="V1" vresourceid="VER:FFHJE"> <D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:revisioncomment> <D:revisioncomment>Update it</D:comment>
<D:revision id="V2" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
<D:revisionlabel>Test1</D:revisionlabel>
<D:revision id="V3" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
<D:merge id="V2" vresourceid="VER:FFHJE"/>
<D:merge id="V1.2" vresourceid="VER:FFHJE"/>
</D:revision>
<D:revision id="V1.1" vresourceid="VER:FFHJE"
branchid="MyBranch">
<D:revisionlabel>Test2, Good</D:revisionlabel>
<D:revisioncomment>Update it</D:revisioncomment>
<D:revision id="V1.2" vresourceid="VER:FFHJE"
branchid="MyBranch">
<D:revisionlabel>Tested</D:revisionlabel>
<D:revisioncomment>Update it</D:revisioncomment>
<D:merge id="V1.1" vresourceid="VER:FFHJE"/>
<D:merge id="V1.1.1" vresourceid="VER:FFHJE"/>
</D:revision>
<D:revision id="V1.1.1" vresourceid="VER:FFHJE">
<D:revisioncomment>Update it</D:revisioncomment>
</D:revision>
</D:revision>
</D:revision>
</D:revision>
</D:enumreport>
</D:prop> </D:prop>
</D:propfind> </D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V2</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V1</D:derivedfrom>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V3</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V2</D:derivedfrom>
<D:revisionlabel>Test1</D:label>
<D:mergedfrom>V2</D:mergedfrom>
<D:mergedfrom>V1.2</D:mergedfrom>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V1.1</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V1</D:derivedfrom>
<D:revisionlabel>Test2</D:label>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V1.2</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V1.1</D:derivedfrom>
<D:branchid>MyBranch</D:branchid>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http://www.foobar.com/foo/bar.htm</D:href>
<D:propstat>
<D:prop>
<D:revisionid>V1.1.1</D:revision>
<D:vresourceid>VER:FFHJE</D:vresource>
<D:revisioncomment>Update it</D:comment>
<D:derivedfrom>V1.1</D:derivedfrom>
</D:prop>
</D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
3. CONFIGURATIONS 6. CONFIGURATION BASICS
Many clients require more sophisticated management and organization Many clients require more sophisticated management and organization
of their versioned data. For this reason, configuration support is of their versioned data. For this reason, configuration support is
defined as part of this specification. defined as part of this specification.
Configuration management is a large space. This specification Configuration management is a large space. This specification
addresses several types of configurations: addresses several types of configurations:
- Label: A label configuration is a collection of specific - Dynamic: A dynamic configuration is a collection of specific
revisions of selected versioned resources. Changes to the revisions of selected versioned resources based on selection
versioned resources do not effect the contents of the label rules. This can be used for labels, floating labels, etc.
configuration.
- Floating Label: A floating label configuration is a collection of
the default revisions of selected versioned resources. When the
default revision of a selected resource changes, the contents of
the floating label configuration is updated automatically. Note
that when a versioned resource is added to a floating level
configuration, the Branch-Id header can be specified. In this
case, the floating label will contain the tip revision the
specified branch.
- Workspace: A workspace configuration is a collection of multiple - Workspace: A workspace configuration is a mechanism for tracking
revisions of selected versioned resources. As the selected and managing parallel changes to multiple resources.
versioned resources are changed, in the context of the workspace
configuration, the workspace tracks the version history.
Configurations provide a mechanism for organizing resources and Configurations provide a mechanism for organizing resources and
quick access to specific revisions of resources. Clients can quick access to specific revisions of resources. Clients can
access resources in the context of a configuration. By referencing access resources in the context of a configuration. By referencing
a configuration, requests are automatically mapped to the correct a configuration, requests are automatically mapped to the correct
revision of the versioned resource. revision of the versioned resource. This allows configurations to
be used as a reference mechanism without breaking URL hyperlinks.
Note that servers provide a default workspace configuration. This
is were all resources exist. Clients can request other workspace
configurations to be created and have operations performed within
their context if workspace configurations are supported.
A configuration can be derived from another configuration. That A configuration can be derived from another configuration. That
is, the new configuration is based on the versions in the "parent" is, the new configuration is based on the versions in the "parent"
configuration. Optionally, derived configurations can configuration. Optionally, derived configurations can
automatically inherit new versions in the parent configuration automatically inherit new versions in the parent configuration
(assuming there are no conflicts). However, a configuration can be (assuming there are no conflicts). However, a configuration can be
derived from at most one other configuration. derived from at most one other configuration.
Clients can specify configuration ids wherever a revision id can be Clients can specify configuration ids wherever a revision id can be
specified. This requests that the default revision for the specified. This requests that the default revision for the
specified configuration be used. Requests that include both a specified configuration be used. Requests that include both a
revision id and a configuration id MUST fail if the specified revision id and a configuration id MUST fail if the specified
revision is not part of the specified configuration. revision is not part of the specified configuration. Typically
both a revision id and a configuration id are not needed since the
revision URI is unique across all configurations.
3.1. Discovery 6.1. Discovery
Configuration support is optional. This example shows that the Configuration support is optional. This example shows that the
/somefolder resource supports configurations. /somefolder resource supports configurations.
>> Request >> Request
OPTIONS /somefolder/ HTTP/1.1 OPTIONS /somefolder/ HTTP/1.1
Verify-Extension: DAV:versioning Host: www.foobar.com
Host: foobar.com Content-Length: xxx
Content-Length: 0 Content-Type: text/xml
<?xml version="1.0" encoding="utf-8" ?>
<D:options xmlns:D="DAV:">
<D:verinfo/>
</D:options>
>> Response >> Response
HTTP/1.1 200 OK HTTP/1.1 200 OK
Date: Tue, 20 Jan 1998 20:52:29 GMT Date: Tue, 20 Jan 1998 20:52:29 GMT
Connection: close Connection: close
Accept-Ranges: none Accept-Ranges: none
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
CHECKIN,
CHECKOUT, UNCHECKOUT, BRANCH
Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
Verify-Extension: DAV:versioning CHECKIN,
Versioning-Support: DAV:basicversioning, DAV:configurations CHECKOUT, UNCHECKOUT, BRANCH
Configuration-Types: DAV:Label, DAV:Floating, DAV:Workspace Versioning: DAV:basicversioning
Configuration-Root: /cfgs/ Content-Type: text/xml
Content-Length: 0 Content-Length: xxx
The Configuration-Types header in the OPTIONS reply indicates the
types of configurations supported. Presence of this header
indicates support for configurations. The BNF for this header is:
Configuration-Types := "Configuration-Types" ":" Ctypes
CTypes := CType | (CTypes "," CType)
CType := "Label" | "Floating" | "Workspace" |
URI
The Configuration-Root header in the OPTIONS reply indicates the
root of the configuration namespace. Note that there could be
multiple configuration roots. The BNF for this headers is:
Configuration-Root := "Configuration-Root" ":" URI-List
3.2. Creating Configurations <?xml version="1.0" encoding="utf-8" ?>
<D:options xmlns:D="DAV:">
<D:verinfo>
<D:configroot>
<D:href>http://www.foobar.com/cfgs/</D:href>
</D:configroot>
</D:verinfo>
</D:options>
6.2. Creating Configurations
Servers maintain configurations in a private portion of the Servers maintain configurations in a private portion of the
namespace. The root of this namespace is determined by examining namespace. The root of this namespace is determined by examining
the OPTIONS reply. All configurations names MUST be unique on a the OPTIONS extended reply. All configurations names MUST be
server. Using the configuration namespace, clients can create and unique on a server. Using the configuration namespace, clients can
manage configurations. create and manage configurations.
Clients create new configurations by issuing the MKCOL method Clients create new configurations by issuing the MKCONFIG method
against the configuration namespace. This requests the server to against the configuration namespace. This requests the server to
create a new configuration. create a new configuration.
When a configuration is created, special tags can be used to define When a configuration is created, special tags can be used to define
the characteristics and relationships (e.g. derivations) for the the characteristics and relationships (e.g. derivations) for the
configuration. The following table enumerates these tags. configuration. The following table enumerates these tags.
Tag Description Tag Description
<DAV:configurationtype> This tag defines the type <DAV:configurationtype> This tag defines the type
xxx of configuration: of configuration:
</DAV:configurationtype> DAV:Label, DAV:Floating, xxx DAV:Dynamic or
or DAV:Workspace. </DAV:configurationtype> DAV:Workspace.
<DAV:derivedfrom> This tag allows the client <DAV:derivedfrom> This tag allows the client
xxx to specify a URI to "xxx" to specify a URI to
</DAV:derivedfrom> identify another </DAV:derivedfrom> identify another
configuration from which configuration from which
this new configuration is this new configuration is
to be derived. to be derived.
<DAV:inheritancetype> The configuration <DAV:inheritancetype> The configuration
DAV:Auto automatically inherits automatically inherits
</DAV:inheritancetype> changes from its derived- DAV:Auto changes from its derived-
from configuration. </DAV:inheritancetype> from configuration.
Conflicts are recorded in Conflicts are recorded in
resolution queues (see resolution queues (see
later section). later section).
<DAV:inheritancetype> The configuration inherits <DAV:inheritancetype> The configuration inherits
DAV:Manual changes from its derived- changes from its derived-
</DAV:inheritancetype> from configuration, but DAV:Manual from configuration, but
they are not automatically </DAV:inheritancetype> they are not automatically
inserted into the inserted into the
configuration. Instead configuration. Instead
they are recorded in they are recorded in
resolution queues (see resolution queues (see
Tag Description
later section). later section).
<DAV:inheritancetype> The configuration is a <DAV:inheritancetype>
DAV:None snapshot of the current snapshot of the current
</DAV:inheritancetype> versions in the derived- DAV:None versions in the derived-
from configuration. There DAV:inheritancetype> from configuration. There
The configuration is a
is no inheritance of is no inheritance of
changes. This is the changes. This is the
default type if no type is default type if no type is
specified. specified.
<DAV:basetime>"xxx" The configuration is based <DAV:basetime>"xxx" The configuration is based
</DAV:basetime> on the current versions in </DAV:basetime> on the current versions in
the derived-from the derived-from
configuration at the configuration at the
indicated time. Note that indicated time. Note that
use of this tag is use of this tag is
incompatible with DAV:Auto incompatible with DAV:Auto
inheritance types and inheritance types and
usage in this way MUST usage in this way MUST
return an error. return an error.
When a non-derived configuration is created, it contains no When a non-derived configuration is created, it contains no
resources. Configurations that are derived from another resources. Configurations that are derived from another
configuration include the resources in the derived from configuration include the resources in the derived from
configuration. configuration at the specified time or using the default revisions.
The example below illustrates creating a new configuration that is The example below illustrates creating a new configuration that is
derived from, and auto-inherits another configuration. For this derived from, and auto-inherits another configuration. For this
example, the root of the configuration namespace has been example, the root of the configuration namespace has been
determined to be /cfgs. determined to be /cfgs.
>>Request >>Request
MKCOL /cfgs/ HTTP/1.1 MKCONFIG /cfgs/ HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:createconfiguration xmlns:D="DAV:"> <D:createconfiguration xmlns:D="DAV:">
<D:configurationtype>DAV:Workspace</D:configurationtype> <D:configurationtype>DAV:Workspace</D:configurationtype>
<D:derivedfrom>http://www.foobar.com/cfgs/DDEJRJ445
</D:derivedfrom> <D:derivedfrom>http://www.foobar.com/cfgs/DDEJRJ445</D:derivedfrom>
<D:inherit>Auto</D:inherit> <D:inherit>Auto</D:inherit>
</D:createconfiguration> </D:createconfiguration>
>>Response >>Response
HTTP/1.1 201 Created HTTP/1.1 201 Created
Location: http://www.foobar.com/cfgs/RYURUS99009 Location: http://www.foobar.com/cfgs/RYURUS99009
Content-Length: 0 Content-Length: 0
3.3. Configuration Properties 6.3. Access Using Configurations
The standard PROPFIND and PROPPATCH methods can be used on the
configuration resource to get and set properties on a
configuration. Configurations MUST provide configuration
properties if configurations are supported. The following list
identifies pre-defined properties that MUST be supported:
DAV:configurationtype - The type of the configuration.
Configurations can choose to make this a read-only property.
DAV:derivedfrom - The configuration from which the configuration is
derived. Configurations can choose to make this a read-only
property.
DAV:inheritancetype - The type of inheritance for the
configuration. Configurations can choose to make this a read-only
property.
DAV:basetime - The base time used to create the configuration.
Configurations can choose to make this a read-only property.
DAV:configurationame - A user-defined display name for the
configuration.
DAV:defaultconfiguration - This property on the configuration root
identifies the default workspace configuration to use if one is not
specified.
3.4. Headers
To support configurations, two new headers are introduced that can
be used with a variety of the DAV and HTTP methods. The following
list identifies these headers:
Configuration-Id - This header is used to identify the
configuration that is to be used when performing an operation.
For workspace configurations, this can be specified to set default
revisions per-configuration, enumeration of checkouts/checkins
against a specific configuration, or to establish locks specific to
a configuration.
If a configuration is not specified, the default workspace
configuration is used. All servers have a default workspace where
resources reside. The configuration "*" can be specified with
PROPFIND to locate properties irrespective of configuration.
Configuration-Id := "Configuration-Id" ":" (URL | "*")
Note that the configuration id can be used in place of a revision
id. In this case, the revision selected is the default revision of
the versioned resource within the specified configuration.
Target-Configuration - This header is used to specify a target
configuration when dealing with cross-configuration operations.
For example, resources can be copied from one configuration to
another using the Configuration-Id and Target-Configuration headers
with the COPY method.
Target-Configuration := "Target-Configuration" ":" URL
3.5. Deleting Configurations
To delete a configuration, use the location returned from the
configuration creation. Note that configurations SHOULD NOT allow
delete if other configurations are derived from them.
>>Request
DELETE /cfgs/RYURUS99009 HTTP/1.1
Host: www.foobar.com
Content-Length: 0
3.6. Managing Configuration Content
Clients need to be able to access and manage the contents of a
configuration. This is done using the GET, COPY, and DELETE
methods.
3.6.1. Access Using Configurations
Configurations are maintained as a special collection. Configurations are maintained as a special collection.
Configurations maintain referential members to all revisions that Configurations maintain referential members to all revisions that
are part of the configuration. Consequently, one approach to are part of the configuration. Consequently, one approach to
enumerating the contents of a configuration is to use PROPFIND to enumerating the contents of a configuration is to use PROPFIND to
discover the contents of the collection. discover the contents of the collection.
Alternatively, clients can request a specific resource from a Alternatively, clients can request a specific resource from a
configuration. This approach allows clients to use the URL they configuration. This approach allows clients to use the URL they
are familiar with. If a client requests a resource that is not are familiar with. If a client requests a resource that is not
part of a configuration, then an error is returned. part of a configuration, then an error is returned.
>>Request >>Request
GET /foo/bar.htm HTTP/1.1 GET /foo/bar.htm HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Configuration-Id: /cfgs/DFEE2034 Configuration-Id: /cfgs/DFEE2034
Version-Id: VER:JKGRKJ9094
Content-Length: 0 Content-Length: 0
3.6.2. Adding Resources to a Configuration 6.4. Deleting Configurations
Resources are added to a configuration using the COPY method. A To delete a configuration, use the location returned from the
special body tag is used to indicate that the resource is being configuration creation. Note that configurations SHOULD NOT allow
added to the configuration. delete if other configurations are derived from them.
>>Request >>Request
COPY /foo/bar.htm HTTP/1.1 DELETE /cfgs/RYURUS99009 HTTP/1.1
Host: www.foobar.com
Depth: infinity
Configuration-Id: /cfgs/DFEE2034
Target-Configuration: /cfgs/ERRJ3440
Content-Type: text/xml
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:updateconfiguration xmlns:D="DAV:"/>
If a specific revision is not specified, then the default revision
is copied.
Note that clients can also create referential members within the
configuration collection to add them to the collection.
3.6.3. Removing Resources from a Configuration
Resources are removed from a configuration using the DELETE. The
target URI indicates the resource to delete and the Configuration-
Id header to identify the configuration. The Depth header can be
used to remove collection contents. A special tag is used to
indicate that the resource is being removed from the configuration
(not deleted).
>>Request
DELETE /foo/bar.htm HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Depth: infinity Content-Length: 0
Configuration-Id: /cfgs/DFEE2034
Content-Type: text/xml
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:updateconfiguration xmlns:D="DAV:"/>
Note that clients can also delete referential members within the
configuration collection to remove them from the collection.
3.7. Workspace Configurations 6.5. Resolution Queues
Workspace configurations provide the ability to track multiple There are times when an operation cannot be blocked that will
revisions of a resource independent of the resource in other result in a state that requires user action. For example, when
workspace configurations. This section describes aspects of the configurations inherit, there is the potential for conflicts.
protocol specific to workspace configurations. Resolution queues provide a mechanism for discovering these
conditions.
3.7.1. Default Workspace Configurations Configurations track and maintain a list of issues that need to be
resolved as a result of actions. These lists are referred to as
resolution queues. Clients can request the resolution issues and
react accordingly. The configuration will continue to report the
condition until it is resolved.
Clients can establish a default workspace configuration that is to The resolution queue is obtained by obtaining the
be used, for all clients, if they do not specify a workspace DAV:resolutionqueue property from the configuration. This property
configuration. To do this, clients set a property on the contains all of the identified issues.
configuration namespace root collection identifying the default
workspace configuration.
>>Request >>Request
PROPPATCH /cfgs/ HTTP/1.1 PROPFIND /cfgs/FDJE4949 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:set>
<D:prop> <D:prop>
<D:defaultconfiguration>/cfgs/RYURUS99009 <D:resolutionqueue/>
</D:defaultconfiguration>
</D:prop> </D:prop>
</D:set> </D:propfind>
</D:propertyupdate>
3.7.2. Synchronizing Worksapce Configurations
In some scenarios, clients are working on separate workspace
configurations to keep themselves isolated from other team members.
However, they occasionally need to synchronize their workspace
configuration with the derived-from workspace configuration so that
they donĘt get too far out of synchronization. As well, changes
(or entire configurations) can be copied from one workspace
configuration to another. Both operations are performed using the
COPY method and special body tags.
Clients can request that specific resources are copied by including
the resource tag. If no resources are specified, then all
resources are copied. Note that configurations MAY fail requests
that do not fully synchronize.
The example below shows the synchronization of one configuration
against another. All resources are synchronized.
>>Request >>Response
COPY /cfgs/DHFHR99392 HTTP/1.1 HTTP/1.1 207 Multi-Status
Host: www.foobar.com
Destination: http://www.foobar.com/cfgs/RRURU329049
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxx Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:configurationsync xmlns:D="DAV:"/> <D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>http://www.foobar.com/cfgs/FDJE4949</D:href>
<D:propstat>
<D:prop>
<D:resolutionqueue>
<D:resolutionitem xmlns:D="DAV:">
<D:resolutiontype><D:conflict/></D:resolutiontype>
<D:resource>http:/foo/bar.htm</D:resource>
<D:newversion>DAV:FDFEE55544</D:newversion>
</D:resolutionitem>
</D:resolutionqueue>
</D:prop>
</D:propstat>
</D:response>
</D:multistatus>
The example below shows the synchronization of one configuration Once a client has resolved an issue it will automatically be
against another. The specified resources are synchronized to the removed from the resolution queue.
indicated time.
>>Request 6.6. Configuration Properties
COPY /cfgs/DHFHR99392 HTTP/1.1 The standard PROPFIND and PROPPATCH methods can be used on the
Host: www.foobar.com configuration resource to get and set properties on a
Destination: http://www.foobar.com/cfgs/RRURU329049 configuration. Configurations MUST provide configuration
Content-Type: text/xml properties if configurations are supported. The following list
Content-Length: xxx identifies pre-defined properties that MUST be supported:
<?xml version="1.0" encoding="utf-8" ?> DAV:configurationtype - The type of the configuration.
<D:configurationsync xmlns:D="DAV:"> Configurations can choose to make this a read-only property.
<D:resource>/foo/bar.htm</resource>
<D:resource>/bing/bop.htm</resource>
<D:basetime>...</D:basetime>
</D:configurationsync>
A synchronization request could result in conflicts. By default, DAV:derivedfrom - The configuration from which the configuration is
if conflicts exist, the synchronization fails and the conflicts are derived. Configurations can choose to make this a read-only
returned (as shown below). To override, clients should include the property.
<DAV:override/> tag. This tag indicates that the synchronization
should do as much as possible and return any conflicts.
>>Response DAV:inheritancetype - The type of inheritance for the
configuration. Configurations can choose to make this a read-only
property.
TBD - show failure response DAV:basetime - The base time used to create the configuration.
... Configurations can choose to make this a read-only property.
<D:multistatus>
<D:response>
<D:href> http://www.foobar.com/foo/bar.htm</D:href>
<D:conflict>
<D:conflictid>VER:DJHFH443</D:conflictid>
<D:baseversion>VER:DJHFH443</D:baseversion>
<D:newversion>VER:FDFEE55544</D:newversion>
</D:conflict>
<D:response>
...
</D:multistatus>
...
The sample response above shows that each conflict includes an ID DAV:defaultconfiguration - This property on the configuration root
and a reference to the resource in conflict. A configuration MAY identifies the default workspace configuration to use if one is not
choose to restrict operations until conflicts have been resolved. specified.
To inform the configuration that a conflict has been resolved,
clients should include a Conflict-ID header on PUT, PROPPATCH, etc.
methods specifying the ID returned in the synchronization response.
Conflict-ID := "Conflict-ID" ":" URI DAV:resolutionqueue - A list of identified issues that require
client attention.
It is permitted for servers to refuse (fail) synchronization 6.7. Headers
requests that do not originate at the root. That is, arbitrary
resources.
3.7.3. Condensing Workspace Configurations To support configurations, two new headers are introduced that can
be used with a variety of the DAV and HTTP methods. The following
list identifies these headers:
Condensing a configuration means reducing the number of revisions Configuration-Id - This header is used to identify the
in a configuration. That is, collapse the changes into a single configuration that is to be used when performing an operation.
revision. This is performed by extending the DELETE method. In
the example below, all but the latest three versions are condensed
into a single revision.
>>Request For workspace configurations, this can be specified to set default
revisions per-configuration, enumeration of checkouts/checkins
against a specific configuration, or to establish locks specific to
a configuration.
DELETE /cfgs/BHFR59593 HTTP/1.1 If a configuration is not specified, the default workspace
Host: www.foobar.com configuration is used. All servers have a default workspace where
Content-Type: text/xml resources reside. The configuration "*" can be specified with
Content-Length: xxxx PROPFIND to locate properties irrespective of configuration.
<?xml version="1.0" encoding="utf-8" ?> Configuration-Id := "Configuration-Id" ":" (URL | "*")
<D:condense xmlns:D="DAV:">
<D:resource>/foo/bar.htm<D:keep>3</D:keep></D:resource>
</D:condense>
Note that the DAV:maxrevisions property can be used to set the Note that the configuration id can be used in place of a revision
maximum number of revisions that are maintained for a versioned id. In this case, the revision selected is the default revision of
resource. the versioned resource within the specified configuration.
If the DAV:revisionid header is specified, the condensing starts Target-Configuration - This header is used to specify a target
with the specified revision. This means that if a versioned configuration when dealing with cross-configuration operations.
resource has 10 revisions, revisions 3-6 can be condensed. For example, resources can be copied from one configuration to
another using the Configuration-Id and Target-Configuration headers
with the COPY method. Note that resources CANNOT be MOVEd from one
configuration to another.
Servers MUST fail this request if there are dependencies on Target-Configuration := "Target-Configuration" ":" URL
revisions that will be eliminated.
3.8. Configuration Reports 7. CONFIGURATION REPORTS
Revision history and configuration dependency graphs are accessed Revision history and configuration dependency graphs are accessed
via PROPFIND. Note that configurations MAY support multiple styles via PROPFIND. Note that configurations MAY support multiple styles
of history and dependency. To enumerate the supported history of history and dependency. To enumerate the supported history
graphs, clients use PROPFIND and the <DAV:enumreport> property. graphs, clients use PROPFIND and the <DAV:availablereports>
The results indicate the different graphs and reports which can, property. The results indicate the different graphs and reports,
themselves, be requested via PROPFIND. which can, themselves, be requested via PROPFIND.
>>Request >>Request
PROPFIND /cfgs/FHJRH3994 HTTP/1.1 PROPFIND /cfgs/FHJRH3994 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:prop>
<D:enumreport/> <D:enumreport/>
</D:prop>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind> <D:multistatus>
<D:response>
<D:href>http://www.foobar.com/cfgs/FHJRH3994</D:href>
<D:propstat>
<D:prop> <D:prop>
<D:enumreport> <D:enumreport>
<D:report><D:href>DAV:configurationderivation</D:href> <D:report>DAV:configurationderivation</D:report>
</D:report> <D:report>DAV:configurationmerge</D:report>
<D:report><D:href>DAV:configurationmerge</D:href></D:report>
</D:enumreport> </D:enumreport>
</D:prop> </D:prop>
</D:propfind> </D:propstat>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
... ...
Note that the report styles MUST be specified as DAV:href values. When clients issue PROPFIND requests to obtain reports, they may
include other properties in the request. These properties are
returned for each report item.
3.8.1. Configuration Derivation 7.1. Configuration Derivation
Configurations MUST support the DAV:configurationderivation report. Configurations MUST support the DAV:configurationderivation report.
This enumerates the full derivation of a configuraiton. Note that This enumerates the full derivation of a configuraiton. Note that
the limit parameter can be specified to limit the number of items the limit parameter can be specified to limit the number of items
returned. By definition the order of the configurations is returned. By definition the order of the configurations is
immediate predecessor. immediate predecessor.
>>Request >>Request
PROPFIND /cfgs/BHFR59593 HTTP/1.1 PROPFIND /cfgs/BHFR59593 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:enumreport type="DAV:configurationderivation" limit=100/> <D:configurationderivation limit=100/>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind> <D:multistatus>
<D:prop> <D:response>
<D:enumreport type="DAV:configurationderivation" limit=100> <D:href>http:/www.foobar.com/cfgs/234</D:href>
<D:configuration id="VER:KJFJ444"/> <D:status>HTTP/1.1 200 OK</D:status>
<D:configuration id="VER:KJFJ445"/> </D:response>
</D:enumreport> <D:response>
</D:prop> <D:href>http:/www.foobar.com/cfgs/345</D:href>
</D:propfind> <D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
... ...
3.8.2. Configuration Merge Graph 7.2. Configuration Merge Graph
Configurations SHOULD support the DAV:configurationmerge report. Configurations SHOULD support the DAV:configurationmerge report.
This enumerates the derivation of a configuration including merges This enumerates the derivation of a configuration including merges
from one configuration to another. from one configuration to another.
>>Request >>Request
PROPFIND /cfgs/BHFR59593 HTTP/1.1 PROPFIND /cfgs/BHFR59593 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Depth: 0
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:"> <D:propfind xmlns:D="DAV:">
<D:enumreport type="DAV:configurationmerge"/> <D:configurationmerge/>
</D:propfind> </D:propfind>
>>Response >>Response
... ...
<D:propfind>
<D:multistatus>
<D:response>
<D:href>http:/www.foobar.com/cfgs/234</D:href>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
<D:response>
<D:href>http:/www.foobar.com/cfgs/3FF</D:href>
<D:status>HTTP/1.1 200 OK</D:status>
</D:response>
</D:multistatus>
...
8. DYNAMIC CONFIGURATIONS
Dynamic configurations provide a mechanism to identify all
revisions that match specific criteria. For example, "all
revisions that have the label Beta1". The dynamic configuration is
a view onto the resources and is updated automatically as resources
and revisions are created, deleted, and modified.
All dynamic configurations support the DAV:rsrtypes property. This
identifies the different styles of dynamic configurations to be
supported. This specification defines a single common type,
DAV:basicrsr.
>>Request
PROPFIND /cfgs/FHHE49495 HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop> <D:prop>
<D:enumreport type="DAV:configurationmerge"> <D:rsrtypes/>
<D:revision id="V1" vresourceid="VER:FFHJE"
configurationid="VER:FJJR344">
<D:revision id="V2" vresourceid="VER:FFHJE"
configurationid="VER:FJJR344">
<D:revision id="V3" vresourceid="VER:FFHJE"
configurationid="VER:FJJR344">
<D:merge id="V2" vresourceid="VER:FFHJE"
configurationid="VER:FJJR344"/>
<D:merge id="V1.2" vresourceid="VER:FFHJE"
configurationid="VER:FJJR344"/>
</D:revision>
</D:revision>
</D:revision>
</D:enumreport>
</D:prop> </D:prop>
</D:propfind> </D:propfind>
>>Response
HTTP/1.1 207 Multi-Status
Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>http://www.foobar.com/cfgs/FHHE49495</D:href>
<D:propstat>
<D:prop>
<D:rsrtypes>
<D:basicrsr/>
</D:rsrtypes>
</D:prop>
</D:propstat>
</D:response>
</D:multistatus>
Clients establish a selection criteria by setting the
DAV:selectionrule property. Once set, the dynamic configuration
collection contains references to the matching resources.
>>Request
PROPPATCH /cfgs/FHHE49495 HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:propertyupdate xmlns:D="DAV:">
<D:set>
<D:prop>
<D:selectionrule>
<D:basicdynamicconfig>
... ...
</D:basicdynamicconfig>
</D:selectionrule>
</D:prop>
</D:set>
</D:propertyupdate>
3.9. Resolution Queues The DAV:basicrsr tag groups the selection criteria that are used to
populate the dynamic configuration. The selection criteria is
specified as a set of tags where nesting represents the
expressional ordering. The following tags are available:
When configurations inherit, there is the potential for conflicts. - DAV:and - The included tags MUST all be true to select
Configurations have the option to help clients manage these
conflicts. However, if they do not, then configurations MUST
return an error if the operation would result in a conflict.
Configurations that help resolve conflicts track and maintain lists - DAV:or - Any of the included tags MUST be true to select
of issues that need to be resolved as a result of actions. These
lists are referred to as resolution queues. Clients can request
the resolution issues and react accordingly. Note that the
configuration only manages the list. That is, the client is
responsible for resolving the issue (or deciding not to) and then
removing the resolution item.
3.9.1. Discovery - DAV:not - The include tag should be inverted (logically)
Resolution queue support is optional for configurations. Support - DAV:href - The resource URL MUST be the included URL
for resolution queues is determined by examining the
DAV:resolutionqueue property on a configuration. If this property
is not blank, then the configuration supports a resolution queue at
the specified URL. If this property is blank, then it doesnĘt
support resolution queues.
3.9.2. Obtaining Resolutions - DAV:label - A revision MUST have the specified label
Conflicts can arise against any resource, however, they are always - DAV:tip - The "tip" revision is selected
associated with a configuration. Pending resolutions items are
obtained by examining the resolution queue for a configuration.
The resolution queue is actually a configuration-specific
collection in the DAV namespace. The collection resource
identifying the resolution queue for a configuration is obtained
via the DAV:resolutionqueue property on the configuration. To
enumerate the pending resolutions, clients use PROPFIND to obtain
the resources within the collection.
Each resource within the collection represents a separate - DAV:revisionid - The specified revision is selected
resolution queue item and are named such that a standard ANSI sort
on the resource name will ensure correct temporal ordering.
3.9.3. Processing Resolution Items - DAV:configurationid - The configuration MUST be the specified
value
Clients can GET the contents of a resolution item. This is an XML - DAV:branchid - The branch MUST be the specified value
document that describes the action that caused the resolution item
to be created. For example: - DAV:depth - Used with DAV:href to indicate a recursive match
TBD - provide full DTD
The following example illustrates a selection rule that includes
all revisions in the /Foo/Bar folder (and below) that have been
labeled as "Beta1".
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:resolutionitem xmlns:D="DAV:"> <D:basicrsr xmlns:D="DAV:">
<D:resolutionid>http://foobar.com/reso/ZZZZ3493</D:resolutionid> <D:and>
<D:resource>http:/foo/bar.htm</D:resource>
<D:newversion>DAV:FDFEE55544</D:newversion>
</D:resolutionitem>
Once a client has resolved an issue (or decided to ignore it), the <D:href>http:/www.foobar.com/Foo/Bar/<D:depth>infinity</D:depth><
client is responsible for canceling the resolution item. This is /D:href>
done using the DELETE method on the resolution item. <D:label>Beta1</D:label>
</D:and>
</D:basicrsr>
>>Request 9. WORKSPACE CONFIGURATIONS
DELETE http://foobar.com/reso/ZZZZ3493 HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: 0
3.10. Checkin Sets Branching provides a mechanism for parallel changes to a resource.
A workspace configuration is a mechanism for parallel changes of
multiple resources.
Clients may desire the ability to track a set of changes as a unit. For example, /MySite/ might contain all of the Web pages for V1 of
That is, create a grouping of related changes. This is achieved my companies e-commerce site. These have been put in the V1
using the MKCOL method to create a special collection. Clients workspace. A team responsible for developing V2 of the site would
refer to the checkin set on all checkin (or change) requests. The create a new workspace configuration based on V1. The V2 workspace
server automatically creates a "share" to the newly created is populated with the V1 versions, but these resources can be
revision in the identified collection. versioned independently. Essentially all resources have been
"branched" in a coordinated fashion. Since this is a branch, both
the V1 and the V2 revisions refer to the same versioned resource.
This allows history and reports to be generated across workspaces.
3.10.1. Discovery 9.1. Managing Configuration Content
Servers may choose to restrict where checkin sets can be created in Clients need to be able to access and manage the contents of a
the namespace. Clients can discover this using OPTIONS. The configuration. This is done using several different DAV methods.
Checkin-Sets-Root header identifies valid portions in the
namespace. Each header (there can be multiple specified) identify
a root and a depth. The BNF for this header is:
Checkin-Sets-Root:= "Checkin-Sets-Root" ":" URL "," Depth The COPY method can be used to copy a specific revision of a
Depth := "inifinity" | number resource. However, this results in a new versioned resource being
created.
Note that if a resourceĘs parent in the namespace has a defined Resources are added to and removed from workspace configurations
checkin set root, the resource CANNOT define a separate root for using the MKREF and DELREF methods defined by the DAV Advanced
itself. Collections Working Group. Note that direct references are
required.
This example shows how to discover the checkin set root for the Clients can obtain the contents of a configuration using PROPFIND
/somefolder resource. to enumerate the hierarchy under the configuation's collection. As
well, as stated above, clients can use the Configuration-Id header
as described previously.
9.2. Default Workspace Configurations
Clients can establish a default workspace configuration that is to
be used, for all clients, if they do not specify a workspace
configuration. To do this, use the SETDEFAULT method against the
configuration root identifying the default configuration.
>> Request >> Request
OPTIONS /somefolder/ HTTP/1.1 SETDEFAULT /cfgs/ HTTP/1.1
Verify-Extension: DAV:versioning Host: www.foobar.com
Host: foobar.com Content-Type: text/xml
Content-Length: 0 Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:setdefault xmlns:D="DAV:">
<D:href>http://www.foobar.com/cfgs/CHFH49594/</D:href>
</D:setdefault>
>> Response >> Response
HTTP/1.1 200 OK HTTP/1.1 200 OK
Date: Tue, 20 Jan 1998 20:52:29 GMT
Connection: close
Accept-Ranges: none
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF
Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF
Verify-Extension: DAV:versioning
Versioning-Support: DAV:basicversioning, DAV:configurations,
DAV:checkinsets
Checkin-Sets-Root: /, infinity
Content-Length: 0 Content-Length: 0
3.10.2. Usage
Clients create checkin sets using MKCOL and specify a special body 10. CHECKIN SETS
tag to indicate that a checkin set collection is being created.
Clients may desire the ability to track a set of changes as a unit.
That is, create a grouping of related changes. This is achieved
using the MKCHECKINSET method to create a special collection.
Clients refer to the checkin set on all checkin (or change)
requests. The server automatically creates a "share" to the newly
created revision in the identified collection.
Checkin sets are specific to a configuration and are created using
the MKCHECKINSET method. The DAV:checkinsetroot property on a
configuration specifies the URL of a collection where checkin sets
for the configuration exist. This can be used for discovery or
creation. If a configuration doesn't support checkin sets, then
this property will be empty.
Clients create checkin sets using MKCHECKINSET. The response
includes the location of the new checkin set.
>>Request >>Request
MKCOL /cs/244 HTTP/1.1 MKCHECKINSET /cs/244 HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Content-Type: text/xml Content-Length: 0
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:checkinset xmlns:D="DAV:"/>
Clients refer to this checkin set using the Checkin-Set header. >>Response
The BNF for this header is as follows:
Checkin-Set := "Checkin-Set" ":" URI HTTP/1.1 201 CREATED
Host: www.foobar.com
Location: http://www.foobar.com/cs/244
Content-Length: 0
The following example illustrates use of checkin sets. The following example illustrates use of checkin sets.
>>Request >>Request
UNLOCK /foo/bar HTTP/1.1 CHECKIN /foo/bar HTTP/1.1
Host: www.foobar.com Host: www.foobar.com
Lock-Token: <opaquelocktoken:rejrei-43343-rereffre> Lock-Token: <opaquelocktoken:rejrei-43343-rereffre>
Checkin-Set: /cs/244 Checkin-Set: /cs/244
Content-Type: text/html Content-Type: text/html
Content-Length: xxxx Content-Length: xxxx
<D:unlockinfo> <D:checkin>
... ...
</D:unlockinfo> </D:checkin>
The following properties MUST be supported on all checkin set The following properties MUST be supported on all checkin set
collections: collections:
DAV:closed - This is a true (1) / false (0) property that indicates DAV:closed - This is a true (1) / false (0) property that indicates
if this checkin set can be referenced in CHECKIN requests. When a if this checkin set can be referenced in CHECKIN requests. When a
checkin set is created, this property is defaulted to 0. Note that checkin set is created, this property is defaulted to 0. Note that
resources MAY choose to disallow clients from setting this property resources MAY choose to disallow clients from setting this property
to 0 once a client has set it to 1. to 0 once a client has set it to 1.
The following properties MUST be supported on all resources: The following properties MUST be supported on all resources:
DAV:checkinid - This read-only property returns the checkin id DAV:checkinid - This read-only property returns the checkin id
associated with this revision of the resource. associated with this revision of the resource.
4. VERSION MAPPING A checkin that references a checkin set MUST be made to the
configuration associated with the checkin set.
11. VERSION MAPPING
This specification defines headers to specify configurations and This specification defines headers to specify configurations and
resource versions. However, there are times when clients require a resource versions. However, there are times when clients require a
single URI for when working against configurations or versions. single URI for when working against configurations or versions.
Version mapping support allows servers to create namespaces that Version mapping support allows servers to create namespaces that
map to configurations and versions. map to configurations and versions.
Note that mappings are dynamic. That is, as resources are added, Note that mappings are dynamic. That is, as resources are added,
removed, and modified, the changes are reflected in any active removed, and modified, the changes are reflected in any active
maps. maps.
4.1. Discovery To delete a mapping, use DELETE against the URI specified in the
MKMAP request.
Version mapping support is optional. This example shows that the 11.1. Discovery
/cfgs/DFEE2034 configuration supports mapping to the /map/ root in
the namespace. Mapping support is optional and support is discovered using OPTIONS
to verify if the MKMAP method is supported. Using the request body
and the DAV:verinfo tag, clients can obtain the supported map
styles.
This example shows that the /cfgs/DFEE2034 configuration supports
mapping to the /map/ root in the namespace.
>> Request >> Request
OPTIONS /cfgs/DFEE2034 HTTP/1.1 OPTIONS /cfgs/DFEE2034 HTTP/1.1
Verify-Extension: DAV:versioning
Host: foobar.com Host: foobar.com
Content-Length: 0 Content-Type: text/xml
Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?>
<D:options xmlns:D="DAV:">
<D:verinfo/>
</D:options>
>> Response >> Response
HTTP/1.1 200 OK HTTP/1.1 200 OK
Date: Tue, 20 Jan 1998 20:52:29 GMT Date: Tue, 20 Jan 1998 20:52:29 GMT
Connection: close Connection: close
Accept-Ranges: none Accept-Ranges: none
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
CHECKIN,
CHECKOUT, UNCHECKOUT, BRANCH
Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE,
MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, PIN, MKREF MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, MKREF, FREEZE, THAW,
Verify-Extension: DAV:versioning CHECKIN,
Versioning-Support: DAV:basicversioning, DAV:mapping CHECKOUT, UNCHECKOUT, BRANCH
Mapping-Root: /map/ Versioning: DAV:versioning
Mapping-Styles: DAV:detailedmap, DAV:branchmap, DAV:nestedbranch Content-Type: text/xml
Content-Length: 0 Content-Length: xxx
The BNF for this OPTIONS header is as follows:
Mapping-Root := "Mapping-Root" ":" URL
Mapping-Styles := "Mapping-Styles" ":" URL-List
Note that multiple Mapping-Root headers is permitted.
4.2. Mapping Configurations <?xml version="1.0" encoding="utf-8" ?>
<D:options xmlns:D="DAV:">
<D:verinfo>
<D:mapstyles>
<D:mapstyle>DAV:detailedmap </D:mapstyle>
<D:mapstyle>DAV:branchmap </D:mapstyle>
<D:mapstyle>DAV:nestedbranch </D:mapstyle>
</D:mapstyles>
</D:verinfo>
</D:options>
11.2. Mapping Configurations
The MKCOL method is used to create namespaces based on a The MKMAP method is used to create namespaces based on a
configuration. When a configuration is mapped to a new namespace, configuration. When a configuration is mapped to a new namespace,
all elements within the configuration can be directly accessed all elements within the configuration can be directly accessed
within the namespace without requiring the configuration to be within the namespace without requiring the configuration to be
identified in the header. identified in the header.
In the example below, a new namespace is created for accessing the In the example below, a new namespace is created for accessing the
contents of the /cfgs/DFEE2034 configuration. contents of the /cfgs/DFEE2034 configuration.
>> Request >> Request
MKCOL /map/mymap HTTP/1.1 MKMAP /maps/mymap HTTP/1.1
Host: foobar.com Host: foobar.com
Configuration-Id: /cfgs/DFEE2034 Configuration-Id: /cfgs/DFEE2034
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxxx Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:configurationmap xmlns:D="DAV:"/> <D:configurationmap xmlns:D="DAV:"/>
>> Response >> Response
HTTP/1.1 201 CREATED HTTP/1.1 201 CREATED
Context-Length: 0 Context-Length: 0
4.3. Mapping Resource Versions 11.3. Mapping Resource Versions
The MKCOL method is also used to create namespaces based on a The MKMAP method is also used to create namespaces based on a
resourceĘs versions (i.e., its revision graph). When a resource is resource's versions (i.e., its revision graph). When a resource is
mapped, its revision history (revision graph) within the mapped, its revision history (revision graph) within the
configuration is made available without requiring the Revision-Id configuration is made available without requiring the Revision-Id
header. Within the mapped namespace, a hierarchy is created for header. Within the mapped namespace, a hierarchy is created for
the revisions. the revisions.
However, there are different ways to map the history. Consider the However, there are different ways to map the history. Consider the
following revision history of the versioned resource bar.htm: following revision history of the versioned resource bar.htm:
V1 -> V2 -> V3 (primary branch) V1 -> V2 -> V3 (primary branch)
| |
+-> V1.1 -> V1.2 ("test" branch) +-> V1.1 -> V1.2 ("test" branch)
The following diagrams illustrate possible mappings: The following diagrams illustrate possible mappings:
(DAV:detailedmap) (DAV:branchmap) (DAV:nestedbranchmap) (DAV:detailedmap) (DAV:branchmap)
(DAV:nestedbranchmap)
V1 Primary Test Primary V1 Primary Test Primary
| | | | | | | |
+----+--------+ V1 V1.1 +------Test +----+--------+ V1 V1.1 +------Test
| | | | | | | | | | | | | |
V2 bar.htm V1.1 V2 V1.2 V1 V1.1 V2 bar.htm V1.1 V2 V1.2 V1 V1.1
| | | | | | | | | |
+----+ +-----+ V3 V2 V1.2 +----+ +-----+ V3 V2 V1.2
| | | | | | | | | |
V3 bar.htm V1.2 bar.htm V3 V3 bar.htm V1.2 bar.htm V3
| | | |
bar.htm bar.htm bar.htm bar.htm
In the example below, a new namespace is created for accessing the In the example below, a new namespace is created for accessing the
versions of the /foo/bar.htm resource in the /cfgs/DFEE2034 versions of the /foo/bar.htm resource in the /cfgs/DFEE2034
configuration. configuration.
>> Request >> Request
MKCOL /map/mymap2 HTTP/1.1
MKMAP /maps/mymap2 HTTP/1.1
Host: foobar.com Host: foobar.com
Configuration-Id: /cfgs/DFEE2034 Configuration-Id: /cfgs/DFEE2034
Content-Type: text/xml Content-Type: text/xml
Content-Length: xxx Content-Length: xxx
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<D:revisionmap xmlns:D="DAV:"> <D:revisionmap xmlns:D="DAV:">
<D:href>/foo/bar.htm</D:href> <D:href>/foo/bar.htm</D:href>
<D:mapstyle>DAV:detailedmap</D:mapstyle> <D:mapstyle>DAV:detailedmap</D:mapstyle>
</D:revisionmap> </D:revisionmap>
>> Response >> Response
HTTP/1.1 201 CREATED HTTP/1.1 201 CREATED
Context-Length: 0 Context-Length: 0
Note that resources MAY support any mapping styles, however, if Note that resources MAY support any mapping styles, however, if
they support DAV:detailedmap, DAV:branchmap, or they support MKMAP, then it MUST support DAV:detailedmap as
DAV:nestedbranchmap, they must map as illustrated above. illustrated above.
5. MISCELLANEOUS FUNCTIONS
The following sub-sections detail miscellaneous versioning
functions.
5.1. Destroy
Many version management systems use tombstones to note deleted
items. These systems also support the ability to permanently
destroy tombstones for an object. The DESTROY method provides this
functionality and resources SHOULD support it, but resources are
not required to implement it. Resources MUST return an error for
DESTROY requests that are not honored.
5.1.1. Discovery
Discovery of this feature is determined by seeing if the resource
options include the DESTROY method.
5.1.2. Usage
The DESTROY method is used against a specific resource to
permanently remove it. This is a namespace level-operation. That
is, all resources matching the specified URI are destroyed.
>>Request
DESTROY /foo/bar/x.cpp HTTP/1.1
Host: www.foobar.com
Content-Type: text/xml
Content-Length: xxxx
Note that this request can be qualified by a configuration.
Requests to DESTROY resources that are in use by other
configurations MAY fail or delay the destruction until all
references are removed.
5.1.3. Headers
Clients may chose to display deleted but not destroyed objects
however they choose. The header keyword Show-Deleted is used to
indicate if deleted items should be included in the GET request.
By default, they are not. Inclusion of "Show-Deleted: Y" indicates
that deleted resources should be included. Using "Show-Deleted: O"
indicates that only resources that have been deleted should be
returned. Using "Show-Deleted: N" indicates that deleted resources
shouldnĘt be returned.
Show-Deleted := "Show-Deleted" ":" ("Y" | "N" | "O")
5.1.4. Properties
DAV:isdeleted - A 0/1 property where 1 indicates that the resource
has been deleted.
6. THE DAV VERSIONING GRAMMAR 12. THE DAV VERSIONING GRAMMAR
To be supplied - Describe and detail the DTDs To be supplied - Describe and detail the DTDs
7. INTERNATIONALIZATION CONSIDERATIONS 13. INTERNATIONALIZATION CONSIDERATIONS
To be supplied. To be supplied.
8. SECURITY CONSIDERATIONS 14. SECURITY CONSIDERATIONS
To be supplied. To be supplied.
9. SCALABILITY 15. SCALABILITY
To be supplied. To be supplied.
10. AUTHENTICATION 16. AUTHENTICATION
Authentication mechanisms defined in WebDAV will also apply to DAV Authentication mechanisms defined in WebDAV will also apply to DAV
Versioning. Versioning.
11. IANA CONSIDERATIONS 17. IANA CONSIDERATIONS
This document uses the namespace defined by [WebDAV] for XML This document uses the namespace defined by [WebDAV] for XML
elements. All other IANA considerations mentioned in [WebDAV] also elements. All other IANA considerations mentioned in [WebDAV] also
applicable to DAV Versioning. applicable to DAV Versioning.
12. COPYRIGHT 18. COPYRIGHT
To be supplied. To be supplied.
13. INTELLECTUAL PROPERTY 19. INTELLECTUAL PROPERTY
To be supplied. To be supplied.
14. REFERENCES 20. REFERENCES
[DAVVERREQ] TBD, "Requirements for DAV Versioning and Variant [DAVVERREQ] TBD, "Requirements for DAV Versioning and Variant
Authoring", October 1998, work-in-progress, draft-ietf-webdav- Authoring", October 1998, internet-draft, work-in-progress, draft-
versionreqs-00.txt ietf-webdav-versionreqs-00.txt
[Kaler] C. Kaler, "Versioning Extensions for WebDAV", September [Kaler] C. Kaler, "Versioning Extensions for WebDAV", September
1998, internet-draft, work-in-progress, draft-kaler-webdav- 1998, internet-draft, work-in-progress, draft-kaler-webdav-
versioning-00. versioning-00.
[RFC2068] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, and T. [RFC2068] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, and T.
Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2068, Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2068,
U.C. Irvine, DEC, MIT/LCS, January 1997. U.C. Irvine, DEC, MIT/LCS, January 1997.
[RFC2119] S. Bradner, "Key words for use in RFCs to Indicate [RFC2119] S. Bradner, "Key words for use in RFCs to Indicate
Requirement Levels." RFC 2119, BCP 14. Harvard University. March, Requirement Levels." RFC 2119, BCP 14. Harvard University. March,
1997. 1997.
[WebDAV] Y. Goland, E.J. Whitehead, A. Faizi, S.R. Carter, D. [WebDAV] Y. Goland, E.J. Whitehead, A. Faizi, S.R. Carter, D.
Jenson, "Extensions for Distributed Authoring on the World Wide Jenson, "Extensions for Distributed Authoring on the World Wide
Web", October 1998, internet-draft, work-in-progress, draft-ietf- Web", April. 1998, internet-draft, work-in-progress, draft-ietf-
webdav-protocol-09. webdav-protocol-08.
[White] E.J. Whitehead, "A Web Versioning Protocol", June 1998, [White] E.J. Whitehead, "A Web Versioning Protocol", June 1998,
internet-draft, work-in-progress, draft-whitehead-webdav- internet-draft, work-in-progress, draft-whitehead-webdav-
versioning-00. versioning-00.
15. AUTHOR'S ADDRESSES 21. AUTHOR'S ADDRESSES
Christopher Kaler, Editor Christopher Kaler, Editor
Microsoft Microsoft
One Microsoft Way One Microsoft Way
Redmond WA, 9085-6933 Redmond WA, 9085-6933
Email:ckaler@microsoft.com Email:ckaler@microsoft.com
Jim Amsden
IBM
Email: jamsden@us.ibm.com
Geoff Clemm
Rational
Email: gclemm@atria.com
Bruce Cragun
Novell Inc.
1555 N. Technology Way
Orem, UT 84097
Email: bcragun@novell.com
David Durand
Email: dgd@cs.bu.edu
Bradley Sergeant
MicroFocus
Email: bradley_sergeant@intersolv.com
E. James Whitehead, Jr. E. James Whitehead, Jr.
Dept. of Information and Computer Science Dept. of Information and Computer Science
University of California, Irvine University of California, Irvine
Irvine, CA 92697-3425 Irvine, CA 92697-3425
Email: ejw@ics.uci.edu Email: ejw@ics.uci.edu
TBD - list all members of the working group 22. OPEN ISSUES
16. OPEN ISSUES
The following list identifies key open issues against this The following list identifies key open issues against this
document: document:
- Can you checkout a collection? What does it mean? . Can you checkout a collection? What does it mean?
- What tags do we want to use for resource/configuration report . What tags do we want to use for resource/configuration report
results? results?
. What structure do we create for maps?
- What structure do we create for maps? . What additional resource branching support is needed?
- What time format should we use?
- Should PIN be a method or a property?
- What additional resource branching support is needed?
- Schema discovery is an issue. For example, how to . Schema discovery is an issue. For example, how to
discover/change mutable/immutable properties? discover/change mutable/immutable properties?
- There are several missing examples / replies that need to be . There are several missing examples / replies that need to be
specified. specified.
17. CHANGE HISTORY 23. CHANGE HISTORY
Sep 28, 1998 Sep 28, 1998
Initial Draft based on [White] and [Kaler]. Initial Draft based on [White] and [Kaler].
Oct 24, 1998 Oct 24, 1998
Incorporate feedback from October 01-02 working group meeting. Incorporate feedback from October 01-02 working group meeting.
Jan 20, 1999
Incorporate feedback from December 1998 working group meeting.
 End of changes. 

This html diff was produced by rfcdiff 1.23, available from http://www.levkowetz.com/ietf/tools/rfcdiff/