Jukka, Tobias, and all.
you guys are the best "documentation" and I very much appreciate your help
and patience!
I found about the empty frozen node sentinel (the hard way from debugging
8-).
I found out what was wrong. When I created the first version of the
node/document, I did not check it in,
because I did not know I should do it. Even the example
http://www.artima.com/lejava/articles/contentrepository3.html
misses that. But then I downloaded the example source code and voila!
Anyway I now create the new versionable document like (see the
document.checkin() at the end):
Node root = session.getRootNode();
document = root.addNode(instanceName, "nt:file");
document.addMixin("mix:versionable"); // Make document referencable
and versionable
Node content = document.addNode("jcr:content", "nt:resource");
content.setProperty("jcr:mimeType", "application/zip");
content.setProperty("jcr:data", new
ByteArrayInputStream(zipContents));
content.setProperty("jcr:lastModified", Calendar.getInstance());
this.session.save();
document.checkin();
And then iterate over versions like:
Node document = this.session.getNodeByUUID(documentId);
VersionHistory history = document.getVersionHistory();
VersionIterator ito = history.getAllVersions();
while (ito.hasNext()) {
Version v = ito.nextVersion();
//The version node will have a "frozen" child node that contains
//the corresponding version's node data
NodeIterator it = v.getNodes("jcr:frozenNode");
if (it.hasNext()) {
Node no = it.nextNode();
if (no.hasNode("jcr:content"))
...
}
}
This seems to be working well, and the versions are sorted from current to
oldest.
Thanks to Tobias, you, and Frank Sommers for the help. Lubos
On 3/15/07, Jukka Zitting <[EMAIL PROTECTED]> wrote:
Hi,
On 3/15/07, Lubos and Alena Pochman <[EMAIL PROTECTED]> wrote:
> thanks for the response. My question is, why is the predecessor empty?
When you create a mix:versionable node, an empty "root version" get's
created in the version storage as a sentinel that acts as the
predecessor of the first actual version that you checkin().
> Didn't I created new version with the document.checkin(),
document.checkout()?
> The modification worked, when I retrieve the modified data by using the
modified
> document node directly, the new data are there. But where is the
previous version?
> When I repeat the process I still get only predecessors.length == 1. So
I
> must be doing something wrong in trying to create new version it the
code:
>
> document.checkout();
> Node content = (Node)document.getPrimaryItem();
> content.setProperty("jcr:data", new
> ByteArrayInputStream(zipContents));
> content.setProperty("jcr:lastModified", Calendar.getInstance());
> this.session.save();
> document.checkin();
>
> It looks like I am updating the current node without creating a new
version?
> And why in this case predecessors.length == 1? Shouldn't it be 0?
It depends on what you did before the document.checkout() call. If you
just created the document node, then the results you describe are
correct. The base version you get using document.getBaseVersion() is
the one checked in with the document.checkin() call, and the one
predecessor is the root version that got created when the versionable
document node was first saved.
You can create new versions of the document node and increase the
predecessors list by repeating the document.checout() ...
document.checkin() cycle.
> To be honest, even after re-reading the JSR-170 spec several times on
> versioning, it is hard for me to get my head around it. Is there any
tutorial
> and or book I can use to learn more about the versioning topic?
I feel your pain. Unfortunately there isn't yet very much introductory
material on JCR.
PS. I will be giving a JCR tutorial in ApacheCon EU in early May, see
http://www.eu.apachecon.com/ for the details. The tutorial materials
will sooner or later after the ApacheCon find their way also onto the
Jackrabbit web site.
BR,
Jukka Zitting