blob: dcaa3fc699d79efe5329f42b7e12be702457227a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.oak.jcr;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.version.Version;
import javax.jcr.version.VersionException;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.fixture.NodeStoreFixture;
import org.apache.jackrabbit.oak.spi.version.VersionConstants;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class CopyTest extends AbstractRepositoryTest {
private static final String TEST_NODE = "test_node";
private static final String TEST_PATH = '/' + TEST_NODE;
private Node testNode;
public CopyTest(NodeStoreFixture fixture) {
super(fixture);
}
@Before
public void setup() throws RepositoryException {
Session session = getAdminSession();
Node root = session.getRootNode();
testNode = root.addNode(TEST_NODE);
testNode.addNode("source").addNode("node");
testNode.addNode("target");
session.save();
}
@After
public void tearDown() throws RepositoryException {
Session s = testNode.getSession();
s.removeItem(TEST_PATH);
s.save();
}
@Test
public void testCopyNode() throws RepositoryException {
Session session = getAdminSession();
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
assertTrue(testNode.hasNode("source/node"));
assertTrue(testNode.hasNode("target/copied"));
}
@Test
public void testCopyReferenceableNode() throws Exception {
Session session = getAdminSession();
Node toCopy = session.getNode(TEST_PATH + "/source/node");
toCopy.addMixin(JcrConstants.MIX_REFERENCEABLE);
session.save();
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
assertTrue(testNode.hasNode("source/node"));
assertTrue(testNode.hasNode("target/copied"));
Node copy = testNode.getNode("target/copied");
assertTrue(copy.isNodeType(JcrConstants.MIX_REFERENCEABLE));
assertFalse(copy.getUUID().equals(testNode.getNode("source/node").getUUID()));
}
@Test
public void testCopyReferenceableChildNode() throws Exception {
Session session = getAdminSession();
session.getNode(TEST_PATH + "/source/node").addNode("child").addMixin(JcrConstants.MIX_REFERENCEABLE);
session.save();
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
assertTrue(testNode.hasNode("source/node"));
assertTrue(testNode.hasNode("target/copied"));
Node childCopy = testNode.getNode("target/copied/child");
assertTrue(childCopy.isNodeType(JcrConstants.MIX_REFERENCEABLE));
assertFalse(childCopy.getUUID().equals(testNode.getNode("source/node/child").getUUID()));
}
@Test
public void testCopyVersionableNode() throws Exception {
Session session = getAdminSession();
Node toCopy = session.getNode(TEST_PATH + "/source/node");
toCopy.addMixin(JcrConstants.MIX_VERSIONABLE);
session.save();
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
assertTrue(testNode.hasNode("source/node"));
assertTrue(testNode.hasNode("target/copied"));
Node copy = testNode.getNode("target/copied");
assertTrue(copy.isNodeType(JcrConstants.MIX_VERSIONABLE));
assertFalse(copy.getVersionHistory().isSame(toCopy.getVersionHistory()));
}
@Test
public void testCopyVersionableNodeClearsVersions() throws Exception {
Session session = getAdminSession();
Node toCopy = session.getNode(TEST_PATH + "/source/node");
toCopy.addMixin(JcrConstants.MIX_VERSIONABLE);
session.save();
Version v1 = toCopy.checkin();
toCopy.checkout();
Version v2 = toCopy.checkin();
toCopy.checkout();
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
Node copy = testNode.getNode("target/copied");
VersionHistory vh = copy.getVersionHistory();
Version rootV = vh.getRootVersion();
assertEquals(0, rootV.getSuccessors().length);
VersionIterator vItr = vh.getAllVersions();
while (vItr.hasNext()) {
if (!rootV.isSame(vItr.nextVersion())) {
fail("Unexpected version in version history of copied node.");
}
}
try {
vh.getVersion(v1.getName());
fail("Unexpected version in version history of copied node.");
} catch (VersionException e) {
// success
}
try {
vh.getVersion(v2.getName());
fail("Unexpected version in version history of copied node.");
} catch (VersionException e) {
// success
}
}
@Test
public void testCopyVersionableNodeCreatesJcrCopiedFrom() throws Exception {
Session session = getAdminSession();
Node toCopy = session.getNode(TEST_PATH + "/source/node");
toCopy.addMixin(JcrConstants.MIX_VERSIONABLE);
session.save();
Version baseV = toCopy.getBaseVersion();
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
Node copy = testNode.getNode("target/copied");
VersionHistory copiedVh = copy.getVersionHistory();
assertTrue(copiedVh.hasProperty(VersionConstants.JCR_COPIED_FROM));
Property prop = copiedVh.getProperty(VersionConstants.JCR_COPIED_FROM);
assertEquals(PropertyType.WEAKREFERENCE, prop.getType());
Node copiedFrom = prop.getNode();
assertTrue(baseV.isSame(copiedFrom));
}
@Test
public void testCopyLockedNode() throws Exception {
assumeTrue(getRepository().getDescriptorValue(Repository.OPTION_LOCKING_SUPPORTED).getBoolean());
Session session = getAdminSession();
Node toCopy = session.getNode(TEST_PATH + "/source/node");
toCopy.addMixin(JcrConstants.MIX_LOCKABLE);
session.save();
session.getWorkspace().getLockManager().lock(toCopy.getPath(), true, true, Long.MAX_VALUE, "my");
assertTrue(toCopy.isLocked());
assertTrue(toCopy.hasProperty(JcrConstants.JCR_LOCKISDEEP));
assertTrue(toCopy.hasProperty(JcrConstants.JCR_LOCKOWNER));
session.getWorkspace().copy(TEST_PATH + "/source/node", TEST_PATH + "/target/copied");
assertTrue(testNode.hasNode("source/node"));
assertTrue(testNode.hasNode("target/copied"));
Node copy = testNode.getNode("target/copied");
assertTrue(copy.isNodeType(JcrConstants.MIX_LOCKABLE));
assertFalse(copy.isLocked());
assertFalse(copy.hasProperty(JcrConstants.JCR_LOCKISDEEP));
assertFalse(copy.hasProperty(JcrConstants.JCR_LOCKOWNER));
}
}