Author: chetanm
Date: Wed Jan 6 04:49:09 2016
New Revision: 1723227
URL: http://svn.apache.org/viewvc?rev=1723227&view=rev
Log:
OAK-3830 - Provide size for properties for PropertyItearator returned in
Node#getProperties(namePattern)
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java?rev=1723227&r1=1723226&r2=1723227&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
Wed Jan 6 04:49:09 2016
@@ -659,16 +659,19 @@ public class NodeImpl<T extends NodeDele
@Nonnull
@Override
public PropertyIterator perform() throws RepositoryException {
- Iterator<PropertyDelegate> properties = Iterators.filter(
- node.getProperties(),
- new Predicate<PropertyDelegate>() {
- @Override
- public boolean apply(PropertyDelegate entry) {
- // TODO: use Oak names
- return
ItemNameMatcher.matches(toJcrPath(entry.getName()), namePattern);
- }
- });
- return new
PropertyIteratorAdapter(propertyIterator(properties));
+ final PropertyIteratorDelegate delegate = new
PropertyIteratorDelegate(node, new Predicate<PropertyDelegate>() {
+ @Override
+ public boolean apply(PropertyDelegate entry) {
+ // TODO: use Oak names
+ return
ItemNameMatcher.matches(toJcrPath(entry.getName()), namePattern);
+ }
+ });
+ return new
PropertyIteratorAdapter(propertyIterator(delegate.iterator())){
+ @Override
+ public long getSize() {
+ return delegate.getSize();
+ }
+ };
}
});
}
@@ -680,16 +683,19 @@ public class NodeImpl<T extends NodeDele
@Nonnull
@Override
public PropertyIterator perform() throws RepositoryException {
- Iterator<PropertyDelegate> propertyNames = Iterators.filter(
- node.getProperties(),
- new Predicate<PropertyDelegate>() {
- @Override
- public boolean apply(PropertyDelegate entry) {
- // TODO: use Oak names
- return
ItemNameMatcher.matches(toJcrPath(entry.getName()), nameGlobs);
- }
- });
- return new
PropertyIteratorAdapter(propertyIterator(propertyNames));
+ final PropertyIteratorDelegate delegate = new
PropertyIteratorDelegate(node, new Predicate<PropertyDelegate>() {
+ @Override
+ public boolean apply(PropertyDelegate entry) {
+ // TODO: use Oak names
+ return
ItemNameMatcher.matches(toJcrPath(entry.getName()), nameGlobs);
+ }
+ });
+ return new
PropertyIteratorAdapter(propertyIterator(delegate.iterator())){
+ @Override
+ public long getSize() {
+ return delegate.getSize();
+ }
+ };
}
});
}
@@ -1582,4 +1588,28 @@ public class NodeImpl<T extends NodeDele
}
});
}
+
+ private static class PropertyIteratorDelegate {
+ private final NodeDelegate node;
+ private final Predicate<PropertyDelegate> predicate;
+
+ PropertyIteratorDelegate(NodeDelegate node,
Predicate<PropertyDelegate> predicate) {
+ this.node = node;
+ this.predicate = predicate;
+ }
+
+ public Iterator<PropertyDelegate> iterator() throws
InvalidItemStateException {
+ return Iterators.filter(node.getProperties(), predicate);
+ }
+
+ public long getSize() {
+ try {
+ return Iterators.size(iterator());
+ } catch (InvalidItemStateException e) {
+ throw new IllegalStateException(
+ "This iterator is no longer valid", e);
+ }
+ }
+
+ }
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java?rev=1723227&r1=1723226&r2=1723227&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
Wed Jan 6 04:49:09 2016
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.jcr;
import javax.jcr.Node;
import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.Value;
import javax.jcr.ValueFormatException;
@@ -26,6 +27,7 @@ import javax.jcr.nodetype.NodeTypeTempla
import javax.jcr.nodetype.PropertyDefinition;
import javax.jcr.nodetype.PropertyDefinitionTemplate;
+import com.google.common.collect.Iterators;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.test.AbstractJCRTest;
@@ -250,4 +252,26 @@ public class PropertyTest extends Abstra
// success
}
}
+
+ public void testPropertyIteratorSize() throws Exception{
+ Node n = testRootNode.addNode("unstructured",
JcrConstants.NT_UNSTRUCTURED);
+ n.setProperty("foo", "a");
+ n.setProperty("foo-1", "b");
+ n.setProperty("bar", "b");
+ n.setProperty("cat", "c");
+ superuser.save();
+
+ //Extra 1 for jcr:primaryType
+ PropertyIterator pitr = n.getProperties();
+ assertEquals(4 + 1, pitr.getSize());
+ assertEquals(4 + 1, Iterators.size(pitr));
+
+ pitr = n.getProperties("foo*");
+ assertEquals(2, pitr.getSize());
+ assertEquals(2, Iterators.size(pitr));
+
+ pitr = n.getProperties(new String[] {"foo*", "cat*"});
+ assertEquals(3, pitr.getSize());
+ assertEquals(3, Iterators.size(pitr));
+ }
}
\ No newline at end of file