Author: hasan
Date: Thu Feb 24 17:55:23 2011
New Revision: 1074236

URL: http://svn.apache.org/viewvc?rev=1074236&view=rev
Log:
CLEREZZA-440: added missing locks at various places

Modified:
    
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
    
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
    
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java

Modified: 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java?rev=1074236&r1=1074235&r2=1074236&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
 (original)
+++ 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageDescription.java
 Thu Feb 24 17:55:23 2011
@@ -19,10 +19,13 @@
 package org.apache.clerezza.platform.language;
 
 import java.util.Iterator;
+import java.util.concurrent.locks.Lock;
 import org.apache.clerezza.rdf.core.Language;
 import org.apache.clerezza.rdf.core.Literal;
 import org.apache.clerezza.rdf.core.PlainLiteral;
 import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.TripleCollection;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
 import org.apache.clerezza.rdf.ontologies.LINGVOJ;
 import org.apache.clerezza.rdf.ontologies.RDFS;
 import org.apache.clerezza.rdf.utils.GraphNode;
@@ -39,10 +42,22 @@ public class LanguageDescription {
 
        LanguageDescription(GraphNode resource) {
                this.resource = resource;
-               Literal iso1Literal = (Literal) 
resource.getObjects(LINGVOJ.iso1).next();
+               Literal iso1Literal = null;
+               TripleCollection configGraph = resource.getGraph();
+               if (configGraph instanceof LockableMGraph) {
+                       LockableMGraph lockableConfigGraph = 
(LockableMGraph)configGraph;
+                       Lock readLock = 
lockableConfigGraph.getLock().readLock();
+                       readLock.lock();
+                       try {
+                               iso1Literal = (Literal) 
resource.getObjects(LINGVOJ.iso1).next();
+                       } finally {
+                               readLock.unlock();
+                       }
+               } else {
+                       iso1Literal = (Literal) 
resource.getObjects(LINGVOJ.iso1).next();
+               }
                if (iso1Literal == null) {
-                       throw new RuntimeException("No iso1 code for "
-                                       +resource.getNode());
+                       throw new RuntimeException("No iso1 code for " 
+resource.getNode());
                }
                String iso1 = iso1Literal.getLexicalForm();
                this.language = new Language(iso1);
@@ -75,13 +90,26 @@ public class LanguageDescription {
         * @return
         */
        public String getLabel(Language lang) {
-               Iterator<Resource> labels = resource.getObjects(RDFS.label);
-               while (labels.hasNext()) {
-                       PlainLiteral label = (PlainLiteral) labels.next();
-                       if (label.getLanguage().equals(lang)) {
-                               return label.getLexicalForm();
+               Lock readLock = null;
+               TripleCollection configGraph = resource.getGraph();
+               if (configGraph instanceof LockableMGraph) {
+                       LockableMGraph lockableConfigGraph = 
(LockableMGraph)configGraph;
+                       readLock = lockableConfigGraph.getLock().readLock();
+                       readLock.lock();
+               }
+               try {
+                       Iterator<Resource> labels = 
resource.getObjects(RDFS.label);
+                       while (labels.hasNext()) {
+                               PlainLiteral label = (PlainLiteral) 
labels.next();
+                               if (label.getLanguage().equals(lang)) {
+                                       return label.getLexicalForm();
+                               }
+                       }
+                       return null;
+               } finally {
+                       if (readLock != null) {
+                               readLock.unlock();
                        }
                }
-               return null;
        }
 }

Modified: 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java?rev=1074236&r1=1074235&r2=1074236&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
 (original)
+++ 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageService.java
 Thu Feb 24 17:55:23 2011
@@ -114,9 +114,7 @@ public class LanguageService {      
                Iterator<Resource> languages = languageListCache.iterator();
                while (languages.hasNext()) {
                        UriRef language = (UriRef) languages.next();
-                       langList.add(
-                                       new LanguageDescription(new 
GraphNode(language, 
-                                       getConfigGraph())));
+                       langList.add(new LanguageDescription(new 
GraphNode(language, getConfigGraph())));
                }
                return langList;
        }
@@ -160,11 +158,9 @@ public class LanguageService {     
         */
        public UriRef getLanguage(String languageName, Language inLanguage) {
                Graph lingvojGraph = getLingvojGraph();
-               Iterator<Triple> languages = lingvojGraph.filter(null, 
RDFS.isDefinedBy,
-                               null);
+               Iterator<Triple> languages = lingvojGraph.filter(null, 
RDFS.isDefinedBy, null);
                while (languages.hasNext()) {
-                       GraphNode languageNode = new GraphNode((UriRef) 
languages.next().getSubject(),
-                                       lingvojGraph);
+                       GraphNode languageNode = new GraphNode((UriRef) 
languages.next().getSubject(), lingvojGraph);
                        Iterator<Resource> labels = 
languageNode.getObjects(RDFS.label);
                        while (labels.hasNext()) {
                                PlainLiteral label = (PlainLiteral) 
labels.next();
@@ -190,8 +186,15 @@ public class LanguageService {     
         */
        public void addLanguage(UriRef languageUri) {
                if (!languageListCache.contains(languageUri)) {
-                       if(languageList.add(languageUri)) {
-                               addToLanguageConfigGraph(languageUri);
+                       LockableMGraph systemGraph = getSystemGraph();
+                       Lock writeLock = systemGraph.getLock().writeLock();
+                       writeLock.lock();
+                       try {
+                               if (languageList.add(languageUri)) {
+                                       addToLanguageConfigGraph(languageUri);
+                               }
+                       } finally {
+                               writeLock.unlock();
                        }
                        languageListCache.add(languageUri);
                }
@@ -243,8 +246,7 @@ public class LanguageService {      
                }
                try {
                        MGraph lingvojMGraph = new SimpleMGraph();
-                       parser.parse(lingvojMGraph, config.openStream(),
-                                       SupportedFormat.RDF_XML, null);
+                       parser.parse(lingvojMGraph, config.openStream(), 
SupportedFormat.RDF_XML, null);
                        lingvojGraph = lingvojMGraph.getGraph();
                        softLingvojGraph = new 
SoftReference<Graph>(lingvojGraph);
                        return lingvojGraph;
@@ -259,22 +261,31 @@ public class LanguageService {    
         * @param componentContext
         */
        protected void activate(ComponentContext componentContext) {
-               final RdfList rdfList = new RdfList(getListNode(), 
getSystemGraph());
-               languageList = Collections.synchronizedList(rdfList);
-               //access to languages should not require access to system graph,
-               //so copying the resources to an ArrayList
-               languageListCache = Collections.synchronizedList(
-                               new ArrayList<Resource>(rdfList));
-               if (languageListCache.size() == 0) {
-                       addLanguage(new 
UriRef("http://www.lingvoj.org/lang/en";));
+               LockableMGraph systemGraph = getSystemGraph();
+               NonLiteral listNode = getListNode(systemGraph);
+
+               Lock writeLock = systemGraph.getLock().writeLock();
+               writeLock.lock();
+               try {
+                       // the constructor of RdfList might write to the graph! 
=> requires a write lock
+                       final RdfList rdfList = new RdfList(listNode, 
systemGraph);
+                       languageList = Collections.synchronizedList(rdfList);
+                       //access to languages should not require access to 
system graph,
+                       //so copying the resources to an ArrayList
+                       languageListCache = Collections.synchronizedList(
+                                       new ArrayList<Resource>(rdfList));
+                       if (languageListCache.size() == 0) {
+                               addLanguage(new 
UriRef("http://www.lingvoj.org/lang/en";));
+                       }
+                       //this is to make sure the content graph contains the 
relevant data
+                       synchronizeContentGraph();
+               } finally {
+                       writeLock.unlock();
                }
-               //this is to make sure the content graph contains the relevant 
data
-               synchronizeContentGraph();
        }
 
-       private NonLiteral getListNode() {
+       private NonLiteral getListNode(LockableMGraph systemGraph) {
                NonLiteral instance = null;
-               LockableMGraph systemGraph = getSystemGraph();
                Lock readLock = systemGraph.getLock().readLock();
                readLock.lock();
                try {
@@ -292,7 +303,13 @@ public class LanguageService {     
                        readLock.unlock();
                }
                BNode listNode = new BNode();
-               systemGraph.add(new TripleImpl(instance, PLATFORM.languages, 
listNode));
+               Lock writeLock = systemGraph.getLock().writeLock();
+               writeLock.lock();
+               try {
+                       systemGraph.add(new TripleImpl(instance, 
PLATFORM.languages, listNode));
+               } finally {
+                       writeLock.unlock();
+               }
                return listNode;
        }
 }

Modified: 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java?rev=1074236&r1=1074235&r2=1074236&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java
 (original)
+++ 
incubator/clerezza/trunk/parent/platform.language/platform.language.core/src/main/java/org/apache/clerezza/platform/language/LanguageWidget.java
 Thu Feb 24 17:55:23 2011
@@ -25,6 +25,7 @@ import java.security.AccessControlExcept
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.List;
+import java.util.concurrent.locks.Lock;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -44,7 +45,6 @@ import org.apache.clerezza.platform.type
 import org.apache.clerezza.platform.typerendering.UserContextProvider;
 import 
org.apache.clerezza.platform.typerendering.scalaserverpages.ScalaServerPagesRenderlet;
 import org.apache.clerezza.rdf.core.BNode;
-import org.apache.clerezza.rdf.core.MGraph;
 import org.apache.clerezza.rdf.core.NonLiteral;
 import org.apache.clerezza.rdf.core.TripleCollection;
 import org.apache.clerezza.rdf.core.UriRef;
@@ -82,20 +82,18 @@ public class LanguageWidget implements U
        private FileServer fileServer;
 
        @Reference
-       private TcManager TcManager;
+       private TcManager tcManager;
 
        @Reference
        private PlatformConfig platformConfig;
 
        @Reference
        private RenderletManager renderletManager;
+
        @Reference
        private LanguageService languageService;
        
-       protected void activate(ComponentContext context)
-                       throws IOException,
-                       URISyntaxException {
-
+       protected void activate(ComponentContext context) throws IOException, 
URISyntaxException {
                Bundle bundle = context.getBundleContext().getBundle();
                URL resourceDir = getClass().getResource("staticweb");
                PathNode pathNode = new BundlePathNode(bundle, 
resourceDir.getPath());
@@ -111,9 +109,15 @@ public class LanguageWidget implements U
        }
 
        private LockableMGraph getConfigGraph() {
-               return TcManager.getMGraph(Constants.CONFIG_GRAPH_URI);
+               return tcManager.getMGraph(Constants.CONFIG_GRAPH_URI);
        }
 
+       /**
+        *
+        * @param node  The graph of the specified GraphNode will not be 
locked, neither for reading nor writing.
+        *              It is the responsibility of the calling function to set 
the write lock, if necessary.
+        * @return
+        */
        @Override
        public GraphNode addUserContext(final GraphNode node) { 
                final NonLiteral platformInstance = 
AccessController.doPrivileged(
@@ -137,17 +141,23 @@ public class LanguageWidget implements U
                }               
        }
 
-       private GraphNode addLanguages(GraphNode node, NonLiteral 
platformInstance, List<LanguageDescription> languages, boolean copyToNode) {
+       private GraphNode addLanguages(GraphNode node, NonLiteral 
platformInstance, List<LanguageDescription> languages,
+                       boolean copyToNode) {
                TripleCollection graph = node.getGraph();
                BNode listNode = new BNode();           
                RdfList list = new RdfList(listNode, graph);
-               MGraph configGraph = getConfigGraph();
+               LockableMGraph configGraph = getConfigGraph();
+               Lock readLock = configGraph.getLock().readLock();
                for (LanguageDescription languageDescription : languages) {
                        NonLiteral languageUri = (NonLiteral) 
languageDescription.getResource().getNode();
                        list.add(languageUri);
                        if (copyToNode) {
-                       graph.addAll(new GraphNode(languageUri, configGraph).
-                                       getNodeContext());
+                               readLock.lock();
+                               try {
+                                       graph.addAll(new GraphNode(languageUri, 
configGraph).getNodeContext());
+                               } finally {
+                                       readLock.unlock();
+                               }
                        }
                }
                node.addProperty(PLATFORM.instance, platformInstance);


Reply via email to