You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by md...@apache.org on 2012/03/12 19:50:28 UTC
svn commit: r1299781 - in
/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit:
state/TransientNodeState.java utils/Iterators.java
Author: mduerig
Date: Mon Mar 12 18:50:27 2012
New Revision: 1299781
URL: http://svn.apache.org/viewvc?rev=1299781&view=rev
Log:
Microkernel based prototype of JCR implementation (WIP)
- avoid concurrent modification exception on transient modifications from within item iterators
Modified:
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/TransientNodeState.java
jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Iterators.java
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/TransientNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/TransientNodeState.java?rev=1299781&r1=1299780&r2=1299781&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/TransientNodeState.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/state/TransientNodeState.java Mon Mar 12 18:50:27 2012
@@ -27,8 +27,8 @@ import org.apache.jackrabbit.oak.model.C
import org.apache.jackrabbit.oak.model.NodeState;
import org.apache.jackrabbit.oak.model.PropertyState;
import org.apache.jackrabbit.state.ChangeTree.NodeDelta;
-import org.apache.jackrabbit.utils.PagedIterator;
import org.apache.jackrabbit.utils.Function1;
+import org.apache.jackrabbit.utils.PagedIterator;
import org.apache.jackrabbit.utils.Predicate;
import javax.jcr.ItemExistsException;
@@ -40,6 +40,7 @@ import static org.apache.jackrabbit.util
import static org.apache.jackrabbit.utils.Iterators.filter;
import static org.apache.jackrabbit.utils.Iterators.flatten;
import static org.apache.jackrabbit.utils.Iterators.map;
+import static org.apache.jackrabbit.utils.Iterators.toIterable;
/**
* A {@code TransientNodeState} instance uses a {@code TransientSpace} to record changes
@@ -161,30 +162,29 @@ public class TransientNodeState {
final NodeDelta delta = getNodeDelta();
- // fixme: this is not safe against concurrent modifications. Either copy delta or make NodeDelta immutable
Iterator<ChildNodeEntry> unmodifiedEntries = filter(persistedEntries,
- new Predicate<ChildNodeEntry>() {
- @Override
- public boolean evaluate(ChildNodeEntry entry) {
- return !delta.isNodeModified(entry.getName());
- }
- });
+ new Predicate<ChildNodeEntry>() {
+ @Override
+ public boolean evaluate(ChildNodeEntry entry) {
+ return !delta.isNodeModified(entry.getName());
+ }
+ });
Iterator<TransientNodeState> unmodifiedStates = map(unmodifiedEntries,
- new Function1<ChildNodeEntry, TransientNodeState>() {
- @Override
- public TransientNodeState apply(ChildNodeEntry entry) {
- return getNodeState(delta.getNode(entry.getName()));
- }
- });
+ new Function1<ChildNodeEntry, TransientNodeState>() {
+ @Override
+ public TransientNodeState apply(ChildNodeEntry entry) {
+ return getNodeState(delta.getNode(entry.getName()));
+ }
+ });
- Iterator<TransientNodeState> modifiedStates = map(delta.getNodes(),
- new Function1<NodeDelta, TransientNodeState>() {
- @Override
- public TransientNodeState apply(NodeDelta delta) {
- return getNodeState(delta);
- }
- });
+ Iterator<TransientNodeState> modifiedStates = map(toIterable(delta.getNodes()).iterator(),
+ new Function1<NodeDelta, TransientNodeState>() {
+ @Override
+ public TransientNodeState apply(NodeDelta delta) {
+ return getNodeState(delta);
+ }
+ });
return chain(unmodifiedStates, modifiedStates);
}
@@ -203,17 +203,17 @@ public class TransientNodeState {
Iterable<? extends PropertyState> propertyStates = getPersistentNodeState().getProperties();
final NodeDelta delta = getNodeDelta();
- // fixme: this is not safe against concurrent modifications. Either copy delta or make NodeDelta immutable
Iterator<PropertyState> propertyEntries =
filter(propertyStates.iterator(),
- new Predicate<PropertyState>() {
- @Override
- public boolean evaluate(PropertyState state) {
- return !state.getName().startsWith(":") && !delta.hasProperty(state.getName());
- }
- });
+ new Predicate<PropertyState>() {
+ @Override
+ public boolean evaluate(PropertyState state) {
+ return !state.getName().startsWith(":") && !delta.hasProperty(state.getName());
+ }
+ });
- return chain(propertyEntries, delta.getPropertyStates());
+ Iterator<PropertyState> modifiedProperties = delta.getPropertyStates();
+ return chain(propertyEntries, toIterable(modifiedProperties).iterator());
}
/**
Modified: jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Iterators.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Iterators.java?rev=1299781&r1=1299780&r2=1299781&view=diff
==============================================================================
--- jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Iterators.java (original)
+++ jackrabbit/sandbox/jackrabbit-microkernel/src/main/java/org/apache/jackrabbit/utils/Iterators.java Mon Mar 12 18:50:27 2012
@@ -23,8 +23,10 @@ import org.apache.commons.collections.it
import org.apache.commons.collections.iterators.SingletonIterator;
import org.apache.commons.collections.iterators.TransformIterator;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.List;
import java.util.NoSuchElementException;
/**
@@ -156,6 +158,34 @@ public final class Iterators {
}
/**
+ * Spool an iterator into an iterable
+ * @param iterator
+ * @param <T>
+ * @return iterable containing the values from {@code iterator}
+ */
+ public static <T> Iterable<T> toIterable(final Iterator<T> iterator) {
+ return new Iterable<T>() {
+ private List<T> copy;
+
+ @Override
+ public Iterator<T> iterator() {
+ if (copy == null) {
+ copy = spool(iterator);
+ }
+ return copy.iterator();
+ }
+
+ private List<T> spool(Iterator<T> iterator) {
+ List<T> list = new ArrayList<T>();
+ while (iterator.hasNext()) {
+ list.add(iterator.next());
+ }
+ return list;
+ }
+ };
+ }
+
+ /**
* Flattens an iterator of iterators into a single iterator.
* @param iterators
* @param <T>