Hi,

I'm struggling with Workspace's copy method.

http://www.day.com/maven/jsr170/javadocs/jcr-2.0/javax/jcr/Workspace.html#copy%28java.lang.String,%20java.lang.String%29

The way I understand the specification, it should copy the entire sub tree of 
the source node, even if the target node already exists (in this case updating 
any already existing nodes). Or, failing that, it should throw an exception.

But the behaviour I get differs: If the target node does not exist, the source 
sub tree is copied correctly. If the target node exists, it seems to be not 
changed at all. In particular, if the source node has child nodes and the 
target node exists and is empty before the copy call, it is still empty after 
the call finishes (without exceptions).

Is this a bug? It doesn't seem to be, because I've been getting this behaviour 
with Jackrabbit 2.4.2, 2.6.5 and 2.7.5. But if it isn't, what about the 
specification am I not interpreting correctly?

Here's the relevant code from my test method. I'm not providing the full file, 
as it references a couple of project internal convenience classes for setting 
up stuff, but the issue should be clear from this snippet. If required, I can 
create a standalone test class.

@Test
public void testCopy() throws LoginException, RepositoryException, IOException
{
                Node root = session.getRootNode();

                Node dir1 = createFolder(root, "dir1");
                Node file1 = createFile(dir1, "file.txt");
                storeContent(file1, "test1".getBytes());

                Node dir2 = createFolder(root, "dir2");
                Node file2 = createFile(dir2, "file.txt");
                storeContent(file2, "test2".getBytes());

                Node dir3 = createFolder(root, "dir3");

                Assert.assertEquals("test1", new String(readContent(file1)));
                Assert.assertEquals("test2", new String(readContent(file2)));
                session.save();

                session.getWorkspace().copy(dir1.getPath(), dir3.getPath());
//            session.getWorkspace().copy(dir1.getPath(), root.getPath() + 
"dir3/");
                session.save();

//            Node dir3 = root.getNode("dir3");
                Assert.assertEquals(1, getChildren(dir3).size());
                Node file3 = dir3.getNode("file.txt");
                Assert.assertEquals("test1", new String(readContent(file3)));

                session.getWorkspace().copy(dir1.getPath(), dir2.getPath());
                session.save();

                Assert.assertEquals("test1", new String(readContent(file1)));
                Assert.assertEquals("test1", new String(readContent(file2)));
}

This code fails at Assert.assertEquals(1, getChildren(dir3).size());, because 
the existing dir3 node is still empty after the copy().

If I remove the current dir3 assignment and the matching copy() call and 
instead activate the currently commented out lines, the dir3 segment runs 
through and the final assert fails, because file2 was not changed by the second 
copy() call.

Thx,
Marian.

--
DI Marian Schedenig
Senior Developer

[Description: Description: Description: Description: Description: Description: 
cid:[email protected]]

INFINICA - Member of Qualysoft Group
Leonard-Bernstein-Straße 10
A-1220 Wien
Österreich

Tel +43 1 263 12 96
Fax +43 1 4095987-11

www.infinica.at<http://www.infinica.at/>
www.qualysoft.at<http://www.qualysoft.at/>
[email protected]<mailto:[email protected]>

P Please consider the environment before printing this email

Reply via email to