You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by Ard Schrijvers <a....@onehippo.com> on 2010/07/26 17:25:35 UTC

Workspace clone jackrabbit 2.1 not in line with jsr-283

Hello,

perhaps already noticed, but afaics, Jackrabbit 2.1 contains some
inconsistencies with the spec for Workspace#clone(...)

It happens when cloning an existing non-shareable node to the same parent:

suppose we have:

jcr:root
     ` a1
          ` b1

1) when 'b' is not referenceable, you get:
javax.jcr.RepositoryException: Cloning inside a workspace is only
allowed for shareable nodes.  (this is not according spec afaik)
2) when 'b' is referenceable, and you use

workspace.clone(workspace.getName(), b1.getPath(), a1.getPath() + "/b2", true);

you get:

javax.jcr.RepositoryException: default: illegal workspace (same as current)

However, b1 should be moved to b2 afaics
	
3) when 'b' is referenceable, and you use

workspace.clone(workspace.getName(), b1.getPath(), a1.getPath() + "/b2", false);

you get:

jcr:root
     ` a1
          ` b2

This is wrong according spec.

Afaics, *all* three outcomes are not according the spec/api. It even
looks like the  'boolean removeExisting' logic is implemented
reversed. Furthermore, the different behaviour for referenceable nodes
is not completely clear to me either. Below is a unit test showing
issue (3). When changing 'removeExisting = true', it is a test for (2)
.

Thx for any feedback,

Regards Ard

/////////////////////////////////////////////////

public void testIssueWspClone() throws Exception {
        // setup parent nodes and first child
        Node a1 = testRootNode.addNode("a1");
        Node a2 = testRootNode.addNode("a2");
        Node b1 = a1.addNode("b1");
        testRootNode.save();

        // add mixin
        b1.addMixin("mix:referenceable");
        b1.save();

        // clone
        Workspace workspace = b1.getSession().getWorkspace();
        try {
          workspace.clone(workspace.getName(),
b1.getPath(),a1.getPath() + "/b2", false);
          fail("We shouldn't get here as 'removeExisting = false' and
the node is not shareable");
        } catch(ItemExistsException e) {
          // We should get here...but we don't
        }

    }