Author: reto
Date: Tue Sep 21 07:27:35 2010
New Revision: 999256

URL: http://svn.apache.org/viewvc?rev=999256&view=rev
Log:
CLEREZZA-306: CollectedIter now instantiated with () => Iterator rather than 
Iterator, if a ConcurrentModificationException occurs the base colluction is 
expanded further in a read-locked section

Modified:
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/CollectedIter.scala
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/RichGraphNode.scala

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/CollectedIter.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/CollectedIter.scala?rev=999256&r1=999255&r2=999256&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/CollectedIter.scala
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/CollectedIter.scala
 Tue Sep 21 07:27:35 2010
@@ -18,15 +18,17 @@
  */
 package org.apache.clerezza.rdf.scala.utils
 
+import java.util.ConcurrentModificationException
 import java.util.Iterator
 import _root_.scala.collection
 import collection.mutable._
 import collection.immutable
 import _root_.scala.collection.JavaConversions._
+import java.util.concurrent.locks.Lock
 
-class CollectedIter[T](iter: Iterator[T]) extends immutable.Seq[T] {
+class CollectedIter[T](iterCreator: () => Iterator[T], readLock: Lock) extends 
immutable.Seq[T] {
 
-       def this(jList : java.util.List[T]) = this(jList.iterator())
+       def this(jList : java.util.List[T], readLock: Lock) = this(() => 
jList.iterator(), readLock)
        
 
        private val collectedElems = new ArrayBuffer[T]()
@@ -41,22 +43,49 @@ class CollectedIter[T](iter: Iterator[T]
 
 
        /**
-       * returns a new fully expanded and sorted CollectedIter
+       * returns a new fully expanded and sorted CollectediterCreator
        */
        def sort(lt : (T,T) => Boolean) = {
                val sortedElems = iterator.toList.sortWith(lt)
-               new CollectedIter[T](sortedElems)
+               //TODO this re-expands everything, return sorted-list directly
+               new CollectedIter[T](sortedElems, readLock)
+
        }
 
     /**
-    * Operator style synatx to access a position.
+    * Operator style syntax to access a position.
     */
     def %(pos: Int) = apply(pos)
 
     private def ensureReadTill(pos: Int) {
-        while (iter.hasNext && (collectedElems.length-1 <= pos)) {
-               collectedElems += iter.next()
-        }
+               try {
+                       val iter = iterCreator()
+                       while (iter.hasNext && (collectedElems.length-1 <= 
pos)) {
+                               collectedElems += iter.next()
+                       }
+               } catch {
+                       case e: ConcurrentModificationException => {
+                                       readLock.lock()
+                                       try {
+                                               val iter = iterCreator()
+                                               //going beyond pos, do reduce 
chance we have to aquire another lock
+                                               val biggerPos = if (pos < 
(Integer.MAX_VALUE - 100)) {
+                                                       pos + 100
+                                               } else {
+                                                       Integer.MAX_VALUE
+                                               }
+                                               while (iter.hasNext && 
(collectedElems.length-1 <= biggerPos)) {
+                                                       val next = iter.next()
+                                                       if 
(!collectedElems.contains(next)) {
+                                                               collectedElems 
+= next
+                                                       }
+                                               }
+                                       } finally {
+                                               readLock.unlock()
+                                       }
+                       }
+                       case e => throw e
+               }
     }
 
     override def length : Int = {
@@ -65,7 +94,7 @@ class CollectedIter[T](iter: Iterator[T]
 
     /**
     * The value returned is same or less than the length of the collection,
-    * the underlying iterator isn't expanded till more than <code>max</code>. 
If
+    * the underlying Iterator isn't expanded till more than <code>max</code>. 
If
     * the result is smaller than max it is the length of the collection.
     */
     def length(max: Int) : Int = {

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/RichGraphNode.scala
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/RichGraphNode.scala?rev=999256&r1=999255&r2=999256&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/RichGraphNode.scala
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.scala.utils/src/main/scala/org/apache/clerezza/rdf/scala/utils/RichGraphNode.scala
 Tue Sep 21 07:27:35 2010
@@ -30,14 +30,14 @@ class RichGraphNode(node: GraphNode) ext
      * Operator syntax shortcut to get all objects as 
<code>RichGraphNode</code>s
      */
     def /(property: UriRef) = {
-       new CollectedIter(new GraphNodeIter(node.getObjects(property)))
+       new CollectedIter(() => new GraphNodeIter(node.getObjects(property)), 
readLock)
        }
 
     /**
      * Operator syntax shortcut to get all subjects as 
<code>RichGraphNode</code>s
      */
     def /-(property: UriRef) = {
-       new CollectedIter(new GraphNodeIter(node.getSubjects(property)))
+       new CollectedIter(() => new GraphNodeIter(node.getSubjects(property)), 
readLock)
     }
 
     /**


Reply via email to