You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2012/07/12 12:23:28 UTC
svn commit: r1360617 - in /jackrabbit/oak/trunk/oak-jcr/src:
main/java/org/apache/jackrabbit/oak/jcr/
test/java/org/apache/jackrabbit/oak/jcr/
test/java/org/apache/jackrabbit/oak/jcr/query/
Author: jukka
Date: Thu Jul 12 10:23:27 2012
New Revision: 1360617
URL: http://svn.apache.org/viewvc?rev=1360617&view=rev
Log:
OAK-167: Support orderable nodes
Add initial support for iterating over explicitly ordered nodes.
Simplify AbstractRepositoryTest
Added:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/OrderableNodesTest.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/AbstractRepositoryTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CompatibilityIssuesTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java?rev=1360617&r1=1360616&r2=1360617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeDelegate.java Thu Jul 12 10:23:27 2012
@@ -16,13 +16,21 @@
*/
package org.apache.jackrabbit.oak.jcr;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.jcr.InvalidItemStateException;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.FilterIterator;
+import org.apache.commons.collections.iterators.IteratorChain;
import org.apache.jackrabbit.oak.api.CoreValue;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
@@ -162,12 +170,71 @@ public class NodeDelegate extends ItemDe
}
/**
- * Get child nodes
+ * Returns an iterator for traversing all the children of this node.
+ * If the node is orderable (there is an "<code>oak:childOrder</code>"
+ * property) then the iterator will return child nodes in the specified
+ * order. Otherwise the ordering of the iterator is undefined.
+ *
* @return child nodes of the node
*/
+ @SuppressWarnings("unchecked")
@Nonnull
public Iterator<NodeDelegate> getChildren() throws InvalidItemStateException {
- return nodeDelegateIterator(getTree().getChildren().iterator());
+ Tree tree = getTree();
+ long count = tree.getChildrenCount();
+ if (count == 0) {
+ // Optimise the most common case
+ return Collections.<NodeDelegate>emptySet().iterator();
+ } else if (count == 1) {
+ // Optimise another typical case
+ Tree child = tree.getChildren().iterator().next();
+ NodeDelegate delegate = new NodeDelegate(sessionDelegate, child);
+ return Collections.singleton(delegate).iterator();
+ } else {
+ // TODO: Use a proper namespace for this property?
+ PropertyState order = tree.getProperty("childOrder");
+ if (order == null || !order.isArray()) {
+ // No specified ordering
+ return nodeDelegateIterator(tree.getChildren().iterator());
+ } else {
+ // Collect child nodes in the specified order
+ final Map<String, NodeDelegate> ordered =
+ new LinkedHashMap<String, NodeDelegate>();
+
+ for (CoreValue value : order.getValues()) {
+ String name = value.getString();
+ Tree child = tree.getChild(name);
+ if (child != null) {
+ ordered.put(name, new NodeDelegate(sessionDelegate, child));
+ }
+ }
+
+ if (ordered.size() == count) {
+ // We have all the child nodes
+ return ordered.values().iterator();
+ } else {
+ // The specified ordering didn't cover all the children,
+ // so return a combined iterator that first iterates
+ // through the ordered subset and then all the remaining
+ // children in an undefined order
+ Predicate predicate = new Predicate() {
+ @Override
+ public boolean evaluate(Object object) {
+ if (object instanceof Tree) {
+ Tree tree = (Tree) object;
+ return !ordered.containsKey(tree.getName());
+ } else {
+ return false;
+ }
+ }
+ };
+ return new IteratorChain(
+ ordered.values().iterator(),
+ nodeDelegateIterator(new FilterIterator(
+ tree.getChildren().iterator(), predicate)));
+ }
+ }
+ }
}
/**
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/AbstractRepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/AbstractRepositoryTest.java?rev=1360617&r1=1360616&r2=1360617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/AbstractRepositoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/AbstractRepositoryTest.java Thu Jul 12 10:23:27 2012
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.oak.jcr;
import org.apache.jackrabbit.commons.JcrUtils;
+import org.junit.After;
import javax.jcr.GuestCredentials;
import javax.jcr.Node;
@@ -34,35 +35,24 @@ import javax.jcr.Session;
* this instance and clean up the repository when done.
*/
public abstract class AbstractRepositoryTest {
- private Repository repository;
- private Session session;
+ private Repository repository = null;
+ private Session session = null;
+ @After
public void logout() throws RepositoryException {
- Session cleanupSession = createAnonymousSession();
- try {
- Node root = cleanupSession.getRootNode();
- NodeIterator ns = root.getNodes();
- while (ns.hasNext()) {
- ns.nextNode().remove();
- }
- cleanupSession.save();
- }
- finally {
- cleanupSession.logout();
- }
-
// release session field
if (session != null) {
session.logout();
session = null;
}
+ // release repository field
+ repository = null;
}
protected Repository getRepository() throws RepositoryException {
if (repository == null) {
- repository = JcrUtils.getRepository("jcr-oak://inmemory/CRUDTest");
+ repository = new RepositoryImpl();
}
-
return repository;
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java?rev=1360617&r1=1360616&r2=1360617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CRUDTest.java Thu Jul 12 10:23:27 2012
@@ -16,12 +16,9 @@
*/
package org.apache.jackrabbit.oak.jcr;
-import org.junit.After;
import org.junit.Test;
-import javax.jcr.GuestCredentials;
import javax.jcr.Node;
-import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
@@ -30,14 +27,8 @@ import static junit.framework.Assert.ass
public class CRUDTest extends AbstractRepositoryTest {
- @After
- public void tearDown() throws RepositoryException {
- logout();
- }
-
@Test
public void testCRUD() throws RepositoryException {
- Repository repository = getRepository();
Session session = createAnonymousSession();
try {
// Create
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CompatibilityIssuesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CompatibilityIssuesTest.java?rev=1360617&r1=1360616&r2=1360617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CompatibilityIssuesTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/CompatibilityIssuesTest.java Thu Jul 12 10:23:27 2012
@@ -31,11 +31,6 @@ import static org.junit.Assert.fail;
*/
public class CompatibilityIssuesTest extends AbstractRepositoryTest {
- @After
- public void tearDown() throws RepositoryException {
- logout();
- }
-
/**
* Trans-session isolation differs from Jackrabbit 2. Snapshot isolation can
* result in write skew as this test demonstrates: the check method enforces
Added: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/OrderableNodesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/OrderableNodesTest.java?rev=1360617&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/OrderableNodesTest.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/OrderableNodesTest.java Thu Jul 12 10:23:27 2012
@@ -0,0 +1,64 @@
+/*
+ * 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 org.junit.Test;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+
+public class OrderableNodesTest extends AbstractRepositoryTest {
+
+ @Test
+ public void testSimpleOrdering() throws RepositoryException {
+ Session session = getSession();
+ Node root = session.getRootNode().addNode("test");
+
+ root.addNode("a");
+ root.addNode("b");
+ root.addNode("c");
+
+ NodeIterator iterator;
+
+ root.setProperty("childOrder", "abc".split(""));
+ iterator = root.getNodes();
+ assertEquals("a", iterator.nextNode().getName());
+ assertEquals("b", iterator.nextNode().getName());
+ assertEquals("c", iterator.nextNode().getName());
+ assertFalse(iterator.hasNext());
+
+ root.setProperty("childOrder", "cab".split(""));
+ iterator = root.getNodes();
+ assertEquals("c", iterator.nextNode().getName());
+ assertEquals("a", iterator.nextNode().getName());
+ assertEquals("b", iterator.nextNode().getName());
+ assertFalse(iterator.hasNext());
+
+ root.setProperty("childOrder", "bc".split(""));
+ iterator = root.getNodes();
+ assertEquals("b", iterator.nextNode().getName());
+ assertEquals("c", iterator.nextNode().getName());
+ assertEquals("a", iterator.nextNode().getName());
+ assertFalse(iterator.hasNext());
+ }
+
+}
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java?rev=1360617&r1=1360616&r2=1360617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/RepositoryTest.java Thu Jul 12 10:23:27 2012
@@ -62,7 +62,6 @@ import javax.jcr.observation.EventListen
import javax.jcr.observation.ObservationManager;
import org.apache.jackrabbit.JcrConstants;
-import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -103,11 +102,6 @@ public class RepositoryTest extends Abst
}
}
- @After
- public void tearDown() throws RepositoryException {
- logout();
- }
-
@Test
public void createRepository() throws RepositoryException {
Repository repository = getRepository();
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java?rev=1360617&r1=1360616&r2=1360617&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/query/QueryTest.java Thu Jul 12 10:23:27 2012
@@ -32,7 +32,6 @@ import javax.jcr.query.QueryResult;
import javax.jcr.query.Row;
import javax.jcr.query.RowIterator;
import org.apache.jackrabbit.oak.jcr.AbstractRepositoryTest;
-import org.junit.After;
import org.junit.Test;
/**
@@ -40,11 +39,6 @@ import org.junit.Test;
*/
public class QueryTest extends AbstractRepositoryTest {
- @After
- public void tearDown() throws RepositoryException {
- logout();
- }
-
@SuppressWarnings("deprecation")
@Test
public void simple() throws RepositoryException {