Author: reto
Date: Thu May  6 12:16:02 2010
New Revision: 941688

URL: http://svn.apache.org/viewvc?rev=941688&view=rev
Log:
CLEREZZA-208: properly locking in rdf-list constructor

Modified:
    
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java

Modified: 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java?rev=941688&r1=941687&r2=941688&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
 (original)
+++ 
incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.rdf.utils/src/main/java/org/apache/clerezza/rdf/utils/RdfList.java
 Thu May  6 12:16:02 2010
@@ -24,11 +24,13 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.locks.Lock;
 import org.apache.clerezza.rdf.core.BNode;
 import org.apache.clerezza.rdf.core.NonLiteral;
 import org.apache.clerezza.rdf.core.Resource;
 import org.apache.clerezza.rdf.core.TripleCollection;
 import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
 import org.apache.clerezza.rdf.core.impl.TripleImpl;
 import org.apache.clerezza.rdf.ontologies.OWL;
 import org.apache.clerezza.rdf.ontologies.RDF;
@@ -74,12 +76,31 @@ public class RdfList extends AbstractLis
        public RdfList(NonLiteral listResource, TripleCollection tc) {
                firstList = listResource;
                this.tc = tc;
+               boolean addNilStmt;
+               if (tc instanceof LockableMGraph) {
+                       LockableMGraph lg = (LockableMGraph) tc;
+                       final Lock readLock = lg.getLock().readLock();
+                       readLock.lock();
+                       try {
+                               addNilStmt = listIncomplete(listResource);
+                       } finally {
+                               readLock.unlock();
+                       }
+               } else {
+                       addNilStmt = listIncomplete(listResource);
+               }
+               if (addNilStmt) {
+                       tc.add(new TripleImpl(listResource, OWL.sameAs, 
RDF_NIL));
+               }
+       }
+
+       private boolean listIncomplete(NonLiteral listResource) {
                if (!tc.filter(listResource, RDF.first, null).hasNext()) {
                        if (!tc.filter(listResource, OWL.sameAs, 
RDF_NIL).hasNext()) {
-                               tc.add(new TripleImpl(listResource, OWL.sameAs, 
RDF_NIL));
+                               return true;
                        }
                }
-
+               return false;
        }
 
        /**


Reply via email to