You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by mi...@apache.org on 2010/10/04 18:10:59 UTC

svn commit: r1004304 - /incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/

Author: mir
Date: Mon Oct  4 16:10:59 2010
New Revision: 1004304

URL: http://svn.apache.org/viewvc?rev=1004304&view=rev
Log:
CLEREZZA-313: added missing locks

Modified:
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/AbstractDiscobitsHandler.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/ContentPostSupport.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/DiscobitsTypeHandler.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java
    incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/WebDavUtils.java

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/AbstractDiscobitsHandler.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/AbstractDiscobitsHandler.java?rev=1004304&r1=1004303&r2=1004304&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/AbstractDiscobitsHandler.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/AbstractDiscobitsHandler.java Mon Oct  4 16:10:59 2010
@@ -23,6 +23,7 @@ import java.util.HashSet;
 import java.util.Iterator;
 
 import java.util.Set;
+import java.util.concurrent.locks.Lock;
 import javax.ws.rs.core.MediaType;
 import org.apache.clerezza.platform.content.collections.CollectionCreator;
 
@@ -32,6 +33,7 @@ import org.apache.clerezza.rdf.core.NonL
 import org.apache.clerezza.rdf.core.Triple;
 import org.apache.clerezza.rdf.core.TypedLiteral;
 import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
 import org.apache.clerezza.rdf.ontologies.DISCOBITS;
 import org.apache.clerezza.rdf.ontologies.RDF;
 import org.apache.clerezza.rdf.utils.GraphNode;
@@ -66,17 +68,23 @@ public abstract class AbstractDiscobitsH
 			byte[] data) {
 
 		GraphNode infoDiscoBitNode;
-		final MGraph mGraph = getMGraph();
+		final LockableMGraph mGraph = (LockableMGraph) getMGraph();
 		infoDiscoBitNode = new GraphNode(infoDiscoBitUri, mGraph);
 		CollectionCreator collectionCreator = new CollectionCreator(mGraph);
 		collectionCreator.createContainingCollections(infoDiscoBitUri);
-		infoDiscoBitNode.addProperty(RDF.type, DISCOBITS.InfoDiscoBit);
-		TypedLiteral dataLiteral = LiteralFactory.getInstance().createTypedLiteral(data);
-		infoDiscoBitNode.deleteProperties(DISCOBITS.infoBit);
-		infoDiscoBitNode.addProperty(DISCOBITS.infoBit, dataLiteral);
-		TypedLiteral mediaTypeLiteral = LiteralFactory.getInstance().createTypedLiteral(mediaType.toString());
-		infoDiscoBitNode.deleteProperties(DISCOBITS.mediaType);
-		infoDiscoBitNode.addProperty(DISCOBITS.mediaType,mediaTypeLiteral);
+		Lock writeLock = mGraph.getLock().writeLock();
+		writeLock.lock();
+		try {
+			infoDiscoBitNode.addProperty(RDF.type, DISCOBITS.InfoDiscoBit);
+			TypedLiteral dataLiteral = LiteralFactory.getInstance().createTypedLiteral(data);
+			infoDiscoBitNode.deleteProperties(DISCOBITS.infoBit);
+			infoDiscoBitNode.addProperty(DISCOBITS.infoBit, dataLiteral);
+			TypedLiteral mediaTypeLiteral = LiteralFactory.getInstance().createTypedLiteral(mediaType.toString());
+			infoDiscoBitNode.deleteProperties(DISCOBITS.mediaType);
+			infoDiscoBitNode.addProperty(DISCOBITS.mediaType,mediaTypeLiteral);
+		} finally {
+			writeLock.unlock();
+		}
 		Set<MetaDataGenerator> metaDataGenerators = getMetaDataGenerators();
 		synchronized(metaDataGenerators) {
 			for(MetaDataGenerator generator : metaDataGenerators) {

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/ContentPostSupport.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/ContentPostSupport.java?rev=1004304&r1=1004303&r2=1004304&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/ContentPostSupport.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/ContentPostSupport.java Mon Oct  4 16:10:59 2010
@@ -20,6 +20,7 @@ package org.apache.clerezza.platform.con
 
 
 import java.net.URI;
+import java.util.concurrent.locks.Lock;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -30,6 +31,7 @@ import org.apache.clerezza.jaxrs.utils.f
 import org.apache.clerezza.jaxrs.utils.form.MultiPartBody;
 import org.apache.clerezza.platform.graphprovider.content.ContentGraphProvider;
 import org.apache.clerezza.rdf.core.UriRef;
+import org.apache.clerezza.rdf.core.access.LockableMGraph;
 import org.apache.clerezza.rdf.ontologies.RDF;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Property;
@@ -77,10 +79,17 @@ public class ContentPostSupport {
 			return Response.status(400).entity("Required form field is missing").
 					type(MediaType.TEXT_PLAIN_TYPE).build();
 		}
-		if (cgProvider.getContentGraph().filter(new UriRef(uri), RDF.type, null).hasNext()) {
-			return Response.status(Response.Status.CONFLICT).
-					entity("A resource with the specified URI already exists").
-					type(MediaType.TEXT_PLAIN_TYPE).build();
+		LockableMGraph contentGraph = cgProvider.getContentGraph();
+		Lock readLock = contentGraph.getLock().readLock();
+		readLock.lock();
+		try {
+			if (contentGraph.filter(new UriRef(uri), RDF.type, null).hasNext()) {
+				return Response.status(Response.Status.CONFLICT).
+						entity("A resource with the specified URI already exists").
+						type(MediaType.TEXT_PLAIN_TYPE).build();
+			}
+		} finally {
+			readLock.unlock();
 		}
 		handler.put(new UriRef(uri), formFile.getMediaType(), content);
 		return Response.created(URI.create(uri)).build();

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/DiscobitsTypeHandler.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/DiscobitsTypeHandler.java?rev=1004304&r1=1004303&r2=1004304&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/DiscobitsTypeHandler.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/DiscobitsTypeHandler.java Mon Oct  4 16:10:59 2010
@@ -142,7 +142,6 @@ public class DiscobitsTypeHandler extend
 	@GET
 	@Produces({"*/*"})
 	public Object getResource(@Context UriInfo uriInfo) {
-		final MGraph mGraph = cgProvider.getContentGraph();
 		final UriRef uri = new UriRef(uriInfo.getAbsolutePath().toString());
 		final GraphNode graphNode = getResourceAsGraphNode(uriInfo);
 		if (graphNode == null) {
@@ -418,7 +417,13 @@ public class DiscobitsTypeHandler extend
 				logger.error("more than one parent statement: "+oldParentTripleIter.next());
 				oldParentTripleIter.remove();
 			}
-			node.replaceWith(targetUri);
+			Lock writeLock = node.writeLock();
+			writeLock.lock();
+			try {
+				node.replaceWith(targetUri);
+			} finally {
+				writeLock.unlock();
+			}
 			new CollectionCreator(mGraph).createContainingCollections(targetUri);
 			try {
 				return Response.created(new java.net.URI(targetUri.getUnicodeString())).build();
@@ -492,7 +497,7 @@ public class DiscobitsTypeHandler extend
 				}
 				builder.header(HeaderName.ALLOW.toString(), buffer.toString());
 			}
-			return builder.build();
+		return builder.build();
 	}
 
 	protected void bindMetaDataGenerator(MetaDataGenerator generator) {
@@ -516,9 +521,15 @@ public class DiscobitsTypeHandler extend
 	
 
 	private boolean nodeAtUriExists(UriRef nodeUri) {
-		MGraph mGraph = getMGraph();
-		return mGraph.filter(nodeUri, null, null).hasNext()
-				|| mGraph.filter(null, null, nodeUri).hasNext();
+		LockableMGraph mGraph = (LockableMGraph) getMGraph();
+		Lock readLock = mGraph.getLock().readLock();
+		readLock.lock();
+		try {
+			return mGraph.filter(nodeUri, null, null).hasNext()
+					|| mGraph.filter(null, null, nodeUri).hasNext();
+		} finally {
+			readLock.unlock();
+		}
 	}
 
 	private Response resourceUnavailable(UriRef nodeUri,

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java?rev=1004304&r1=1004303&r2=1004304&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/InfoDiscobit.java Mon Oct  4 16:10:59 2010
@@ -65,24 +65,35 @@ public class InfoDiscobit {
 	}
 
 	public String getContentType() {
-		Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.mediaType);
-		if (mediaTypeLits.hasNext()) {
-			return mediaTypeLits.next().getLexicalForm();
+		Lock readLock = infoBit.readLock();
+		readLock.lock();
+		try {
+			Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.mediaType);
+			if (mediaTypeLits.hasNext()) {
+				return mediaTypeLits.next().getLexicalForm();
+			}
+		} finally {
+			readLock.unlock();
 		}
 		return null;
 	}
 	
 	public byte[] getData() {
 		byte[] result = null;
-		Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.infoBit);
-		if (mediaTypeLits.hasNext()) {
-			final Literal literalValue = mediaTypeLits.next();
-			if (literalValue instanceof TypedLiteral) {
-				result = LiteralFactory.getInstance().createObject(
-						(new byte[0]).getClass(),(TypedLiteral)literalValue);
+		Lock readLock = infoBit.readLock();
+		readLock.lock();
+		try {
+			Iterator<Literal> mediaTypeLits = infoBit.getLiterals(DISCOBITS.infoBit);
+			if (mediaTypeLits.hasNext()) {
+				final Literal literalValue = mediaTypeLits.next();
+				if (literalValue instanceof TypedLiteral) {
+					result = LiteralFactory.getInstance().createObject(
+							(new byte[0]).getClass(), (TypedLiteral) literalValue);
+				}
 			}
-		}
-		
+		} finally {
+			readLock.unlock();
+		}		
 		return result;	
 	};
 

Modified: incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/WebDavUtils.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/WebDavUtils.java?rev=1004304&r1=1004303&r2=1004304&view=diff
==============================================================================
--- incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/WebDavUtils.java (original)
+++ incubator/clerezza/trunk/org.apache.clerezza.parent/org.apache.clerezza.platform.content/src/main/java/org/apache/clerezza/platform/content/WebDavUtils.java Mon Oct  4 16:10:59 2010
@@ -29,6 +29,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.locks.Lock;
 import javax.ws.rs.HttpMethod;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
@@ -43,6 +44,7 @@ import javax.xml.transform.dom.DOMResult
 import org.apache.clerezza.rdf.core.Literal;
 import org.apache.clerezza.rdf.core.LiteralFactory;
 import org.apache.clerezza.rdf.core.Resource;
+import org.apache.clerezza.rdf.core.Triple;
 import org.apache.clerezza.rdf.core.TripleCollection;
 import org.apache.clerezza.rdf.core.UriRef;
 import org.apache.clerezza.rdf.core.impl.TripleImpl;
@@ -370,7 +372,14 @@ class WebDavUtils {
 
 	private static void addUserProps(GraphNode node, PropertyMap propertyMap,
 			List<Property> requestedProps) {
-		Iterator<UriRef> userPropsIter = node.getProperties();
+		Iterator<UriRef> userPropsIter;
+		Lock readLock = node.readLock();
+		readLock.lock(); 
+		try {
+			userPropsIter = node.getProperties();
+		} finally {
+			readLock.unlock();
+		}
 		Set<UriRef> userProps = new HashSet<UriRef>();
 		while (userPropsIter.hasNext()) {
 			userProps.add(userPropsIter.next());
@@ -380,11 +389,16 @@ class WebDavUtils {
 			for (Property requestedProp : requestedProps) {
 				UriRef predicate = new UriRef(requestedProp.value());
 				if (userProps.contains(predicate)) {
-					Iterator<Resource> value = node.getObjects(predicate);
-					if (value.hasNext()) {
-						propertyMap.put(requestedProp, getValue(value.next()));
-					} else {
-						propertyMap.put(requestedProp, "");
+					readLock.lock();
+					try {
+						Iterator<Resource> value = node.getObjects(predicate);
+						if (value.hasNext()) {
+							propertyMap.put(requestedProp, getValue(value.next()));
+						} else {
+							propertyMap.put(requestedProp, "");
+						}
+					} finally {
+						readLock.unlock();
 					}
 				} else {
 					propertyMap.put(requestedProp, null);
@@ -401,10 +415,15 @@ class WebDavUtils {
 						userProp.substring(index + 1));
 
 				Iterator<Resource> value = node.getObjects(uri);
-				if (value.hasNext()) {
-					propertyMap.put(property, getValue(value.next()));
-				} else {
-					propertyMap.put(property, "");
+				readLock.lock();
+				try {
+					if (value.hasNext()) {
+						propertyMap.put(property, getValue(value.next()));
+					} else {
+						propertyMap.put(property, "");
+					}
+				} finally {
+					readLock.unlock();
 				}
 			}
 		}
@@ -412,7 +431,14 @@ class WebDavUtils {
 
 	private static void addUserPropsWithoutValues(GraphNode node,
 			PropertyMap propertyMap) {
-		Iterator<UriRef> userPropsIter = node.getProperties();
+		Iterator<UriRef> userPropsIter;
+		Lock readLock = node.readLock();
+		readLock.lock();
+		try {
+			userPropsIter = node.getProperties();
+		} finally {
+			readLock.unlock();
+		}
 		Set<UriRef> userProps = new HashSet<UriRef>();
 		while (userPropsIter.hasNext()) {
 			userProps.add(userPropsIter.next());
@@ -465,28 +491,46 @@ class WebDavUtils {
 						propertyMap.put(property, "");
 					}
 				} else if(property.prop.equalsIgnoreCase(creationdate)){
-					Iterator<Resource> date = node.getObjects(DCTERMS.dateSubmitted);
-					if(date.hasNext()){
-						String st = getValue(date.next());
-						propertyMap.put(property, st);
-					}else{
-						propertyMap.put(property, "");
+					Lock readLock = node.readLock();
+					readLock.lock();
+					try {
+						Iterator<Resource> date = node.getObjects(DCTERMS.dateSubmitted);
+						if (date.hasNext()) {
+							String st = getValue(date.next());
+							propertyMap.put(property, st);
+						} else {
+							propertyMap.put(property, "");
+						}
+					} finally {
+						readLock.unlock();
 					}
 				} else if(property.prop.equalsIgnoreCase(getlastmodified)){
-					Iterator<Resource> date = node.getObjects(DCTERMS.modified);
-					if(date.hasNext()){
-						String st = getValue(date.next());
-						propertyMap.put(property, st);
-					}else{
-						propertyMap.put(property, "");
+					Lock readLock = node.readLock();
+					readLock.lock();
+					try {
+						Iterator<Resource> date = node.getObjects(DCTERMS.modified);
+						if (date.hasNext()) {
+							String st = getValue(date.next());
+							propertyMap.put(property, st);
+						} else {
+							propertyMap.put(property, "");
+						}
+					} finally {
+						readLock.unlock();
 					}
 				} else if(property.prop.equalsIgnoreCase(getcontenttype)){
-					Iterator<Resource> mediaType = node.getObjects(DCTERMS.MediaType);
-					if(mediaType.hasNext()){
-						String st = getValue(mediaType.next());
-						propertyMap.put(property, st);
-					}else{
-						propertyMap.put(property, "");
+					Lock readLock = node.readLock();
+					readLock.lock();
+					try {
+						Iterator<Resource> mediaType = node.getObjects(DCTERMS.MediaType);
+						if (mediaType.hasNext()) {
+							String st = getValue(mediaType.next());
+							propertyMap.put(property, st);
+						} else {
+							propertyMap.put(property, "");
+						}
+					} finally {
+						readLock.unlock();
 					}
 				} else {
 					propertyMap.put(property, "");
@@ -534,15 +578,26 @@ class WebDavUtils {
 							.createElementNS(davUri, property.prop));
 				} else {
 					UriRef predicate = new UriRef(property.value());
-					Iterator<Resource> valIter = hierarchyNode.getObjects(predicate);
-					replaceProp(subject, predicate, valIter, contentGraph, entry);
+					Lock writeLock = hierarchyNode.writeLock();
+					writeLock.lock();
+					try {
+						Iterator<Resource> valIter = hierarchyNode.getObjects(predicate);
+						replaceProp(subject, predicate, valIter, contentGraph, entry);
+					} finally {
+						writeLock.unlock();
+					}
 					propOk.appendChild(responseDoc.createElementNS(davUri, property.prop));
 				}
-			}else{
-				
+			} else {
 				UriRef predicate = new UriRef(property.value());
-				Iterator<Resource> valIter = hierarchyNode.getObjects(predicate);
-				replaceProp(subject, predicate, valIter, contentGraph, entry);
+				Lock writeLock = hierarchyNode.writeLock();
+				writeLock.lock();
+				try {
+					Iterator<Resource> valIter = hierarchyNode.getObjects(predicate);
+					replaceProp(subject, predicate, valIter, contentGraph, entry);
+				} finally {
+					writeLock.unlock();
+				}
 				propOk.appendChild(responseDoc.createElementNS(property.ns, "R:" + property.prop));
 			}
 		}
@@ -554,9 +609,17 @@ class WebDavUtils {
 							.createElementNS(davUri, property.prop));
 			} else {
 				UriRef predicate = new UriRef(property.value());
-				Iterator<Resource> valIter = hierarchyNode.getObjects(predicate);
-				while(valIter.hasNext()){
-					contentGraph.remove(new TripleImpl(subject, predicate, valIter.next()));
+				Lock writeLock = hierarchyNode.writeLock();
+				writeLock.lock();
+				try {
+					Iterator<Resource> valIter = hierarchyNode.getObjects(predicate);
+					Set<Triple> triplesToBeRemoved = new HashSet<Triple>();
+					while (valIter.hasNext()) {
+						triplesToBeRemoved.add(new TripleImpl(subject, predicate, valIter.next()));
+					}
+					contentGraph.removeAll(triplesToBeRemoved);
+				} finally {
+					writeLock.unlock();
 				}
 				propOk.appendChild(responseDoc.createElementNS(property.ns, property.prop));
 
@@ -603,9 +666,11 @@ class WebDavUtils {
 			Iterator<Resource> valIter, TripleCollection contentGraph,
 			Map.Entry<Property, String> entry) {
 		LiteralFactory fac = LiteralFactory.getInstance();
+		Set<Triple> triplesToBeRemoved = new HashSet<Triple>();
 		if (valIter.hasNext()) {
-			contentGraph.remove(new TripleImpl(subject, predicate, valIter.next()));
+			triplesToBeRemoved.add(new TripleImpl(subject, predicate, valIter.next()));
 		}
+		contentGraph.removeAll(triplesToBeRemoved);
 		contentGraph.add(new TripleImpl(subject, predicate,
 				fac.createTypedLiteral(entry.getValue())));
 	}