/* * 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 org.apache.jackrabbit.test.AbstractJCRTest; import org.apache.jackrabbit.test.NotExecutableException; import javax.jcr.RepositoryException; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.Property; import javax.jcr.NodeIterator; /** * <code>AccessByRelativePathTest</code>... */ public class AccessByRelativePathTest extends AbstractJCRTest { private static String DOT = "."; private static String DOTDOT = ".."; /** * <code>Node.hasNode(".") </code> applied to the root node must return * <code>true</code>. * * @throws RepositoryException */ public void testRootHasNodeDot() throws RepositoryException { Node root = superuser.getRootNode(); assertTrue("Node.hasNode(\".\") must return true.", root.hasNode(DOT)); } /** * <code>Node.getNode(".") </code> applied to the root node must return * the same <code>Node</code> again. * * @throws RepositoryException */ public void testRootGetNodeDot() throws RepositoryException { Node root = superuser.getRootNode(); assertTrue("Node.getNode(\".\") must return the same node", root.getNode(DOT).isSame(root)); } /** * <code>Node.getNode("..") </code> applied to the root node must throw * <code>PathNotFoundException</code>. * * @throws RepositoryException */ public void testRootGetNodeDotDot() throws RepositoryException { Node root = superuser.getRootNode(); try { root.getNode(DOTDOT); fail("Root does not have a parent node. <root>.getNode(\"..\") must fail."); } catch (RepositoryException e) { // ok. } } /** * <code>Node.hasNode(".") </code> applied to any test node must return * <code>true</code>. * * @throws RepositoryException */ public void testHasNodeDot() throws RepositoryException { assertTrue("Node.hasNode(\".\") must return true.", testRootNode.hasNode(DOT)); } /** * <code>Node.getNode(".") </code> applied to any test node must return * the same <code>Node</code> again. * * @throws RepositoryException */ public void GetNodeDot() throws RepositoryException { assertTrue("Node.getNode(\".\") must return the same node.", testRootNode.getNode(DOT).isSame(testRootNode)); } /** * <code>Node.getNode("..") </code> applied to any test node must the same * node as {@link Node#getParent()}. * * @throws RepositoryException * @throws NotExecutableException if the parent node cannot be retrieved * with {@link Node#getParent()}. */ public void testGetNodeDotDot() throws RepositoryException, NotExecutableException { Node parent; try { parent = testRootNode.getParent(); } catch (Exception e) { throw new NotExecutableException(); } assertTrue("Node.getNode(\"..\") must return the parent.", testRootNode.getNode(DOTDOT).isSame(parent)); } /** * <code>Node.hasProperty(".") </code> applied to any test node must return * <code>false</code>. * * @throws RepositoryException */ public void testHasPropertyDot() throws RepositoryException { assertFalse("Node.hasProperty(\".\") must return false.", testRootNode.hasProperty(DOT)); } /** * <code>Node.getProperty(".") </code> applied to any test node must throw * <code>PathNotFoundException</code>. * * @throws RepositoryException */ public void testGetPropertyDot() throws RepositoryException { try { testRootNode.getProperty(DOT); fail("A node must never have a property \".\"."); } catch (PathNotFoundException e) { // ok. } } /** * <code>Node.hasProperty("..") </code> applied to any test node must return * <code>false</code>. * * @throws RepositoryException */ public void testHasPropertyDotDot() throws RepositoryException { assertFalse("Node.hasProperty(\"..\") must return false.", testRootNode.hasProperty(DOTDOT)); } /** * <code>Node.getProperty("..") </code> applied to any test node must throw * <code>PathNotFoundException</code>. * * @throws RepositoryException */ public void testGetPropertyDotDot() throws RepositoryException { try { testRootNode.getProperty(DOTDOT); fail("A node must never have a property \"..\"."); } catch (PathNotFoundException e) { // ok. } } /** * <code>Node.getNode("./testNodeName") </code> applied to the parent * of any node with name 'testNodeName' must return the same node. * * @throws RepositoryException * @throws NotExecutableException if the parent cannot be retrieved or if * the parent has more than 1 node with the given name. */ public void testGetNodeDotSlashName() throws RepositoryException, NotExecutableException { Node parent; try { parent = testRootNode.getParent(); NodeIterator it = parent.getNodes(testRootNode.getName()); int cnt = 0; while (it.hasNext() && cnt <= 1) { it.nextNode(); cnt++; } if (cnt > 1) { throw new NotExecutableException(); } } catch (Exception e) { throw new NotExecutableException(); } String otherRelPath = DOT + "/" + testRootNode.getName(); assertTrue(testRootNode.isSame(parent.getNode(otherRelPath))); } /** * <code>Node.getNode("../" + Node.getName()) </code> applied to any test * node must return the test node. * * @throws RepositoryException */ public void testGetNodeDotDotSlashName() throws RepositoryException, NotExecutableException { String otherRelPath = DOTDOT + "/" + testRootNode.getName(); if (testRootNode.getIndex() > 1) { otherRelPath = otherRelPath + "[" + testRootNode.getIndex() + "]"; } assertTrue(testRootNode.isSame(testRootNode.getNode(otherRelPath))); } /** * <code>Node.getProperty("./jcr:primaryType") </code> applied to any * test node must return the same Property as * {@link Node#getProperty(String) Node.getProperty("jcr:primaryType")}. * * @throws RepositoryException */ public void testGetPropertyDotSlashName() throws RepositoryException { Property pt = testRootNode.getProperty(jcrPrimaryType); String otherRelPath = DOT + "/" + jcrPrimaryType; assertTrue(pt.isSame(testRootNode.getProperty(otherRelPath))); } /** * <code>Node.getProperty("../jcr:primaryType") </code> applied to any * test node must return the same Property as * {@link Node#getProperty(String) Node.getParent().getProperty("jcr:primaryType")}. * * @throws RepositoryException * @throws NotExecutableException if the parent cannot be retrieved. */ public void testGetPropertyDotDotSlashName() throws RepositoryException, NotExecutableException { Node parent; try { parent = testRootNode.getParent(); } catch (Exception e) { throw new NotExecutableException(); } Property pt = parent.getProperty(jcrPrimaryType); String otherRelPath = DOTDOT + "/" + jcrPrimaryType; assertTrue(pt.isSame(testRootNode.getProperty(otherRelPath))); } }