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);