/*
* 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.jcr2spi;
import javax.jcr.ItemExistsException;
import javax.jcr.Property;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import org.apache.jackrabbit.test.NotExecutableException;
/**
* <code>WorkspaceMoveTest</code>...
*/
public class WorkspaceMoveTest extends MoveTest {
@Override
protected void setUp() throws Exception {
super.setUp();
}
@Override
protected boolean isSessionMove() {
return false;
}
/**
* Tries to move a node using to a location where a property already exists
* with same name.
* <br/> <br/>
* With JCR 1.0 this should throw an <code>{@link javax.jcr.ItemExistsException}</code>.
* With JCR 2.0 the support for same-named property and node is optional and
* the expected behaviour depends on the
* {@link Repository#OPTION_NODE_AND_PROPERTY_WITH_SAME_NAME_SUPPORTED} descriptor.
*/
@Override
public void testMovePropertyExists() throws RepositoryException, NotExecutableException {
// try to create a property with the name of the node to be moved
// to the destination parent
Property destProperty;
try {
destProperty = destParentNode.setProperty(nodeName2, "anyString");
destParentNode.save();
} catch (RepositoryException e) {
throw new NotExecutableException("Cannot create property with name '" +nodeName2+ "' and value 'anyString' at move destination.");
}
// TODO: fix 2.0 behaviour according to the OPTION_NODE_AND_PROPERTY_WITH_SAME_NAME_SUPPORTED descriptor
if ("1.0".equals(getHelper().getRepository().getDescriptor(Repository.SPEC_VERSION_DESC))) {
try {
// move the node
doMove(moveNode.getPath(), destProperty.getPath());
fail("Moving a node to a location where a property exists must throw ItemExistsException");
} catch (ItemExistsException e) {
// ok, works as expected
}
} else {
// JCR 2.0 move the node: same name property and node must be supported
doMove(moveNode.getPath(), destProperty.getPath());
}
}
public void testMoveTransientPropertyExists() throws RepositoryException, NotExecutableException {
// try to create a property with the name of the node to be moved
// to the destination parent
Property destProperty;
try {
destProperty = destParentNode.setProperty(nodeName2, "anyString");
} catch (RepositoryException e) {
throw new NotExecutableException("Cannot create property with name '" +nodeName2+ "' and value 'anyString' at move destination.");
}
// TODO: fix 2.0 behaviour according to the OPTION_NODE_AND_PROPERTY_WITH_SAME_NAME_SUPPORTED descriptor
// workspace-move the node (must succeed)
doMove(moveNode.getPath(), destProperty.getPath());
if ("1.0".equals(getHelper().getRepository().getDescriptor(Repository.SPEC_VERSION_DESC))) {
try {
// saving transient new property must fail
destParentNode.save();
fail("Saving new transient property must fail");
} catch (RepositoryException e) {
// ok.
}
} else {
// JCR 2.0: saving must succeed.
destParentNode.save();
}
}
}