/*
* 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.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.test.AbstractJCRTest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <code>SNSIndexTest</code>...
*/
public class SNSIndexTest extends AbstractJCRTest {
private static Logger log = LoggerFactory.getLogger(SNSIndexTest.class);
private String snsName;
private Node parent;
private Node sns1;
private Node sns2;
private Node sns3;
private Node sns4;
private String snsPath;
@Override
protected void setUp() throws Exception {
super.setUp();
snsName = nodeName2;
parent = testRootNode.addNode(nodeName1, testNodeType);
// create sns-siblings
sns1 = parent.addNode(snsName, testNodeType);
sns2 = parent.addNode(snsName, testNodeType);
sns3 = parent.addNode(snsName, testNodeType);
sns4 = parent.addNode(snsName, testNodeType);
testRootNode.save();
snsPath = testRootNode.getPath() + "/" + nodeName1 + "/" + snsName;
}
@Override
protected void tearDown() throws Exception {
parent = null;
sns1 = null;
sns2 = null;
sns3 = null;
sns4 = null;
super.tearDown();
}
/**
* Test if index of the created nodes are as expected.
*/
public void testIndex() throws RepositoryException {
checkIndex(sns1, Path.INDEX_DEFAULT);
checkIndex(sns2, Path.INDEX_DEFAULT + 1);
checkIndex(sns3, Path.INDEX_DEFAULT + 2);
checkIndex(sns4, Path.INDEX_DEFAULT + 3);
}
/**
* Test if index of the created nodes are as expected if they are accessed
* by another session.
*/
public void testIndexByOtherSession() throws RepositoryException {
Session otherSession = getHelper().getReadOnlySession();
try {
for (int index = Path.INDEX_DEFAULT; index < 4; index++) {
Node sns = (Node) otherSession.getItem(buildPath(index));
checkIndex(sns, index);
}
} finally {
otherSession.logout();
}
}
/**
* Test if passing an bigger index throws exception
*/
public void testNonExistingIndex() throws RepositoryException {
try {
superuser.getItem(buildPath(10));
fail("Accessing item with non-existing index must throw PathNotFoundException.");
} catch (PathNotFoundException e) {
// ok
}
}
/**
* Test if accessing a child node by sns-Name, the node with the default
* index is returned.
*/
public void testDefaultIndex() throws RepositoryException {
Node sns = parent.getNode(snsName);
checkIndex(sns, Path.INDEX_DEFAULT);
}
/**
* Test if index of any node is correctly set, if the node is accessed
* without loading SNSs with lower index before
*/
public void testNodeEntriesFilledCorrectly() throws RepositoryException {
Session otherSession = getHelper().getReadOnlySession();
try {
Node sns = (Node) otherSession.getItem(buildPath(3));
checkIndex(sns, 3);
sns = (Node) otherSession.getItem(buildPath(2));
checkIndex(sns, 2);
sns = (Node) otherSession.getItem(buildPath(4));
checkIndex(sns, 4);
// check 3 again
sns = (Node) otherSession.getItem(buildPath(3));
checkIndex(sns, 3);
// check default
sns = (Node) otherSession.getItem(buildPath(1));
checkIndex(sns, 1);
} finally {
otherSession.logout();
}
}
/**
* Test if accessing the created nodes by name really returns all nodes.
*/
public void testGetNodesByName() throws RepositoryException {
NodeIterator it = parent.getNodes(snsName);
long size = it.getSize();
if (size != -1) {
assertTrue("4 SNSs have been added -> but iterator size is " + size + ".", size == 4);
}
int expectedIndex = 1;
while (it.hasNext()) {
Node sns = it.nextNode();
checkIndex(sns, expectedIndex);
expectedIndex++;
}
assertTrue("4 SNSs have been added -> but iterator size is " + size + ".", size == 4);
}
/**
* Test if accessing the created nodes by name really returns all nodes.
*/
public void testGetNodesByNameByOtherSession() throws RepositoryException {
Session otherSession = getHelper().getReadOnlySession();
try {
NodeIterator it = ((Node) otherSession.getItem(parent.getPath())).getNodes(snsName);
long size = it.getSize();
if (size != -1) {
assertTrue("4 SNSs have been added -> but iterator size is " + size + ".", size == 4);
}
int expectedIndex = 1;
while (it.hasNext()) {
Node sns = it.nextNode();
checkIndex(sns, expectedIndex);
expectedIndex++;
}
assertTrue("4 SNSs have been added -> but iterator size is " + size + ".", size == 4);
} finally {
otherSession.logout();
}
}
private String buildPath(int index) {
return snsPath + "[" + index + "]";
}
private static void checkIndex(Node node, int expectedIndex) throws RepositoryException {
int index = node.getIndex();
if (index != expectedIndex) {
fail("Unexpected index " + index + ". Expected index was " + expectedIndex);
}
}
}