- From: Clemm, Geoff <gclemm@rational.com>
- Date: Tue, 26 Jun 2001 13:18:22 -0400
- To: DeltaV <ietf-dav-versioning@w3.org>
I agree with Tim's responses ... just adding a few details.
From: Alan Kent [mailto:ajk@mds.rmit.edu.au]
My understanding is DeltaV supports versioning of all resources,
including collections. So if a MOVE is performed to change
/foo/a to /foo/b where /foo is a versioned resource, it is
possible to check in the new collection resource bound to /foo
and have /foo/b present in it instead of /foo/a.
Yes. As a minor terminology point, we would call /foo a
version-controlled resource (we have found the term "versioned
resource" to be often misunderstood). As a more significant
terminology point, a collection resource is not bound to
/foo, but rather a new collection version is created that
identifies in its DAV:version-controlled-binding-set property
the current bindings of the version-controlled collection
at /foo.
Or put another way, the URI bindings to members of a collection are
a part of the parent collection and so are versioned with the member
collection.
To be precise, it is better to not describe them as "URI bindings",
since that is easily confused with a "URI mapping" (i.e. a mapping
from a URI to a resource). A binding maps a URI segment (not a URI)
to a resource. In particular, a binding in /foo is the pair
<"b", some_resource>. Calling them just "bindings" should be fine.
Also, note that bindings only define the internal members,
not all the members of a collection.
The member itself (the resource identified by /foo/a)
does not need to be versioned at all since it is not changed.
Yes. (When you say "does not need to be versioned", I assume you mean
"does not need to have a new version created for it".)
The reason I ask is I am looking at how to relate the DMA concept
of 'containers' to WebDAV/DeltaV 'collections'. In DMA, there is a
'relationship' object that is created to link a member of a
container (that is, a 'containee') to the parent container. The
'relationship' objet is therefore like a binding in WebDAV. I think
there is however a difference in that in DMA the parent container
does not hold the bindings (relationships). The binding objects
(changing over to DeltaV terminology) are independent to both the
container and member. The binding object holds the name, a pointer
to the parent collection, and a pointer to the member resource.
In WebDAV, you need to be able to map a URL to a particular resource.
The URL gives you the names of a sequence of nested collections in
addition to the name of the resource, i.e. /x/y/z identifies 4
resources: /, /x, /x/y, and /x/y/z. So when resources are put under
version control, the "bindings" information needs to be stored in
these resources (i.e. the binding information needs to be bundled
in with these resources, since those are the only resources identified
by the URL).
The impact of this is that to rename /foo/a to /foo/b does not require
the collection /foo to be versioned. Instead, the binding can be
versioned instead.
As indicated above, in WebDAV the binding information has to be modeled
in either the child resource, the parent resource, or both.
Storing it in both is the worst ... you would have to check out
both the parent and the child to do a move. The reason DeltaV
chose to model the bindings as part of the state of the collection
is that this allows you to "reuse" a resource (i.e. create a
binding to it) without changing the state of that resource.
The parent collection remains unchanged. The resource
also remains unchanged. I believe this is not the DeltaV model.
Correct. WebDAV requires that the binding information be
modeled either in the child or the parent, since there is no
way to annotate the URL to identify which of the independent
"binding" objects are to be used when a URL is being mapped
to a resource.
I
believe that it is required to version the collection because bindings
are a part of the parent collection.
Correct.
A picture might help. In WebDAV/DeltaV I think bindings are stored in
the parent collection object as follows. This means to change a binding
means the collection must be versioned.
Or more precisely, in order to change the binding in a version-controlled
collection to a version-controlled member, the version-controlled
collection must be checked out. If either the collection or the member
is not under version control, no checkout is required.
In DMA, bindings are stored as separate additional objects. Collections
are pretty boring really. They main exist to be pointed at. The pointers
are in the binding objects which point at the parent collection and the
member.
The nice thing about the DMA approach is that /foo/a can be moved to
/bar/baz/other/a with the versioning of only one binding object.
So with a URL like /foo/a, how do you know which of the many possible
bindings named "a" between /foo and some other resource are to be used?
Unfortunately, the "independent binding" model breaks down in the
presence of versioning.
The DeltaV approach in my understanding would require the /foo
collection and the /bar/baz/other collection both having new versions
created.
But note that /foo would have to be checked out only if both /foo and
/foo/a are under version control. /bar/baz/other would have to be
checked out only if /foo/a and /bar/baz/other are under version
control. (I used "checked out" instead of "versioned", because the
protocol doesn't require you to "version" things to change them, only
that you "check them out").
My question is have I understood things correctly above in terms of
DeltaV? Since bindings are not resources in DeltaV I could see no
way to associate things like version numbers to them.
That is correct. We could have made bindings independent resources,
but that would have required allocating a URL space for them, and
defining their functionality under MOVE's and DELETE's of the parents
and children they refer to. And we would have had to bundle them
into either the parent or child anyway, so the benefit of modeling
them as separate resources was felt to be outweighed by the
resulting complexity.
ps: Another model we had played around with was to represent the
entire directory tree as effectively a single 'configuration
resource'. We could represent this as a single XML document. Then
for every change to the directory structure, we would create a
complete new version of the XML document. There were problems with
this in terms of merging different people's changes, but it saved
creating lots of little persistent objects all over the place.
That is certainly a reasonable approach, and is why the "baseline"
feature is defined independently of the "version-controlled collection"
feature.
From: Alan Kent [mailto:ajk@mds.rmit.edu.au]
An interesting follow on is that to check out a collection, I always
get out all the members. I cannot get partial subtrees.
I'm not sure what you mean by "get out" here. A collection has
members. When that collection is under version control, you have to
check the collection out in order to change the membership of that
collection. The membership of the collection is not changed by
checking it out (or checking it in), it is changed by MOVE, COPY,
UPDATE, etc.
("I want to check out /foo and /foo/a/..., but not /foo/b" is not
possible since the container /foo will contain the "b" binding
so "b" will be visible).
Visibility is independent of whether or not something is checked out.
When you check out /foo and /foo/a, then those two resources are
checked out, and no others.
I guess "b" does not have to be in the
"checked-out" mode or something - ie, read only (??).
I don't know if this is important.
Yes, it is important (it tells you what is currently checked out
and therefore what is modifiable.
Hmmm, another question. What do bindings identify? A particular version
of a collection? The latest version of a collection?
No, the bindings of a version-controlled collection are
to other version-controlled (and non-version-controlled) resources.
The version of a collection member is identified by the URL in the
DAV:checked-in or DAV:checked-out property of that member.
Note that a collection version is not itself a collection, but rather
captures the bindings to version-controlled members in its
DAV:version-controlled-binding-set property.
So the protocol defines no collection whose bindings identify
particular versions.
If I check in
a new version of a collection, does the parent collection need to be
modified to point to the new version?
No, the version-controlled collection keeps track of what was
the last version checked in (in its DAV:checked-in property).
The parent collection is not affected by changing the DAV:checked-in
property of its members.
Does checking in the parent
collection in turn require the check in of its parent, all the way
up to the root of the configuration? Does this mean adding a new
file to a configuration always results in a versioning riple from
that resource's parent collection up to the root collection?
No, because each version-controlled resource keeps track of its
current version (i.e. a collection does not track what versions
its members select).
Ok, I think this means I don't understand how collection versioning
works because I don't know how a binding in a collection identifies
the member. Does it identify a version history, a particular version,
or what?
Neither. A binding in a version-controlled collection is to
another version-controlled resource, or to a non-version-controlled
resource, but not to a version history or to a particular version.
What semantic information does a version of a collection hold?
Look at section 14.2. It has a DAV:version-controlled-binding-set
property, identifying the names and version histories of the resources
at the time the collection version was created.
Cheers,
Geoff
Received on Tuesday, 26 June 2001 13:11:58 UTC