You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@clerezza.apache.org by ha...@apache.org on 2011/02/23 14:36:43 UTC

svn commit: r1073738 - in /incubator/clerezza/trunk/parent/rdf.rdfjson/src: main/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializingProvider.java test/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializerProviderTest.java

Author: hasan
Date: Wed Feb 23 13:36:42 2011
New Revision: 1073738

URL: http://svn.apache.org/viewvc?rev=1073738&view=rev
Log:
CLEREZZA-437: refactored code, added test, fixed bug in serialization of object bnode, and corrected bnode id

Modified:
    incubator/clerezza/trunk/parent/rdf.rdfjson/src/main/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializingProvider.java
    incubator/clerezza/trunk/parent/rdf.rdfjson/src/test/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializerProviderTest.java

Modified: incubator/clerezza/trunk/parent/rdf.rdfjson/src/main/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializingProvider.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/rdf.rdfjson/src/main/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializingProvider.java?rev=1073738&r1=1073737&r2=1073738&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/rdf.rdfjson/src/main/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializingProvider.java (original)
+++ incubator/clerezza/trunk/parent/rdf.rdfjson/src/main/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializingProvider.java Wed Feb 23 13:36:42 2011
@@ -19,8 +19,10 @@ package org.apache.clerezza.rdf.rdfjson.
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.slf4j.Logger;
@@ -35,42 +37,54 @@ import org.apache.clerezza.rdf.core.Type
 import org.apache.clerezza.rdf.core.UriRef;
 import org.apache.clerezza.rdf.core.serializedform.SerializingProvider;
 import org.apache.clerezza.rdf.core.serializedform.SupportedFormat;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Service;
 
 /**
- * A {@link org.apache.clerezza.rdf.core.serializedform.SerializingProvider} for
- * rdf/json
- * 
- * @author tio
- * 
- * @scr.component immediate="true"
- * @scr.service 
- *              interface="org.apache.clerezza.rdf.core.serializedform.SerializingProvider"
+ * A {@link org.apache.clerezza.rdf.core.serializedform.SerializingProvider} for rdf/json
  * 
+ * @author tio, hasan
  */
+@Component(immediate=true)
+@Service(SerializingProvider.class)
 @SupportedFormat(SupportedFormat.RDF_JSON)
 public class RdfJsonSerializingProvider implements SerializingProvider {
 
 	private final Logger logger = LoggerFactory.getLogger(getClass());
 
+	private int bNodeCounter = 0;
+
 	@Override
-	public void serialize(OutputStream serializedGraph, TripleCollection tc,
-			String formatIdentifier) {
+	public void serialize(OutputStream serializedGraph, TripleCollection tc, String formatIdentifier) {
 		JSONObject root = new JSONObject();
 
-		Map<NonLiteral, String> subjectsAsJSONObjects = createSubjectsAsJSONObjects(tc);
-
-		for (NonLiteral subject : subjectsAsJSONObjects.keySet()) {
-			String key = subjectsAsJSONObjects.get(subject);
+		Set<NonLiteral> processedSubject = new HashSet<NonLiteral>();
+		Map<BNode, String> bNodeMap = new HashMap<BNode, String>();
 
-			JSONObject predicatesAsJSONObjects = new JSONObject();
+		NonLiteral subject = null;
+		String subjectStr = null;
+		bNodeCounter = 0;
+		Iterator<Triple> triples = tc.iterator();
+		while (triples.hasNext()) {
+			subject = triples.next().getSubject();
+			if (!processedSubject.contains(subject)) {
+				if (subject instanceof BNode) {
+					subjectStr = getNextBNodeId();
+					bNodeMap.put((BNode)subject, subjectStr);
+				} else { // if (subject instanceof UriRef)
+					subjectStr = ((UriRef)subject).getUnicodeString();
+				}
+				JSONObject predicatesAsJSONObjects = new JSONObject();
+				Iterator<Triple> triplesOfSubject = tc.filter(subject, null, null);
+				while (triplesOfSubject.hasNext()) {
+					UriRef predicate = triplesOfSubject.next().getPredicate();
+					JSONArray jsonValues = addValuesToJSONArray(tc, subject, predicate, bNodeMap);
+					predicatesAsJSONObjects.put(predicate.getUnicodeString(), jsonValues);
+				}
+				root.put(subjectStr, predicatesAsJSONObjects);
 
-			Iterator<Triple> triplesFromSubject = tc.filter(subject, null, null);
-			while (triplesFromSubject.hasNext()) {
-				UriRef predicate = triplesFromSubject.next().getPredicate();
-				JSONArray jsonValues = addValuesToJSONArray(tc, subject, predicate, subjectsAsJSONObjects);
-				predicatesAsJSONObjects.put(predicate.getUnicodeString(), jsonValues);
+				processedSubject.add(subject);
 			}
-			root.put(key, predicatesAsJSONObjects);
 		}
 		try {
 			serializedGraph.write(root.toJSONString().getBytes());
@@ -80,33 +94,18 @@ public class RdfJsonSerializingProvider 
 		}
 	}
 
-	private Map<NonLiteral, String> createSubjectsAsJSONObjects(
-			TripleCollection tc) {
-		Map<NonLiteral, String> subjectsAsJSONObjects = new HashMap<NonLiteral, String>();
-		Iterator<Triple> triples = tc.iterator();
-		int bNodeCounter = 1;
-		while (triples.hasNext()) {
-			NonLiteral subject = triples.next().getSubject();
-			if (!subjectsAsJSONObjects.containsKey(subject)) {
-				if (subject instanceof UriRef) {
-					subjectsAsJSONObjects.put(subject, ((UriRef) subject).getUnicodeString());
-				} else if (subject instanceof BNode) {
-					subjectsAsJSONObjects.put(subject, "_:" + bNodeCounter++);
-				}
-			}
-		}
-		return subjectsAsJSONObjects;
+	private String getNextBNodeId() {
+		return "_:b" + ++bNodeCounter;
 	}
 
-	private JSONArray addValuesToJSONArray(TripleCollection tc,
-			NonLiteral subject, UriRef predicate,
-			Map<NonLiteral, String> subjectsAsJSONObjects) {
+	private JSONArray addValuesToJSONArray(TripleCollection tc, NonLiteral subject, UriRef predicate,
+			Map<BNode, String> bNodeMap) {
 
 		JSONArray jsonValues = new JSONArray();
 
-		Iterator<Triple> objectsFromPredicate = tc.filter(subject, predicate, null);
-		while (objectsFromPredicate.hasNext()) {
-			Resource object = objectsFromPredicate.next().getObject();
+		Iterator<Triple> objectsOfPredicate = tc.filter(subject, predicate, null);
+		while (objectsOfPredicate.hasNext()) {
+			Resource object = objectsOfPredicate.next().getObject();
 			JSONObject objectAsJSONObject = new JSONObject();
 			if (object instanceof PlainLiteral) {
 				PlainLiteral plainLiteral = (PlainLiteral) object;
@@ -121,11 +120,16 @@ public class RdfJsonSerializingProvider 
 				objectAsJSONObject.put("type", "literal");
 				objectAsJSONObject.put("datatype", literal.getDataType().getUnicodeString());
 			} else if (object instanceof UriRef) {
-				UriRef uri = (UriRef) object;
-				objectAsJSONObject.put("value", uri.getUnicodeString());
+				UriRef uriRef = (UriRef) object;
+				objectAsJSONObject.put("value", uriRef.getUnicodeString());
 				objectAsJSONObject.put("type", "uri");
 			} else if (object instanceof BNode) {
-				objectAsJSONObject.put("value", subjectsAsJSONObjects.get(object));
+				String bNodeId = bNodeMap.get((BNode)object);
+				if (bNodeId == null) {
+					bNodeId = getNextBNodeId();
+					bNodeMap.put((BNode)object, bNodeId);
+				}
+				objectAsJSONObject.put("value", bNodeId);
 				objectAsJSONObject.put("type", "bnode");
 			}
 			jsonValues.add(objectAsJSONObject);

Modified: incubator/clerezza/trunk/parent/rdf.rdfjson/src/test/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializerProviderTest.java
URL: http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/rdf.rdfjson/src/test/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializerProviderTest.java?rev=1073738&r1=1073737&r2=1073738&view=diff
==============================================================================
--- incubator/clerezza/trunk/parent/rdf.rdfjson/src/test/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializerProviderTest.java (original)
+++ incubator/clerezza/trunk/parent/rdf.rdfjson/src/test/java/org/apache/clerezza/rdf/rdfjson/serializer/RdfJsonSerializerProviderTest.java Wed Feb 23 13:36:42 2011
@@ -31,50 +31,79 @@ import org.apache.clerezza.rdf.core.impl
 import org.apache.clerezza.rdf.core.serializedform.ParsingProvider;
 import org.apache.clerezza.rdf.core.serializedform.SerializingProvider;
 import org.apache.clerezza.rdf.rdfjson.parser.RdfJsonParsingProvider;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
 
 /**
- * Serializes a Graph to rdf+json
+ * serializes a Graph to rdf+json
  * 
  * see http://n2.talis.com/wiki/RDF_JSON_Specification
  * 
- * @author tio
+ * @author tio, hasan
  */
 public class RdfJsonSerializerProviderTest {
 
 	private MGraph mGraph;
 
-	private void initializeGraph() {
-		String baseUri = "http://base/";
+	@BeforeClass
+	public static void setUpClass() throws Exception {
+	}
+
+	@AfterClass
+	public static void tearDownClass() throws Exception {
+	}
+
+    @Before
+    public void setUp() {
 		mGraph = new SimpleMGraph();
-		mGraph.add(new TripleImpl(new UriRef(baseUri + "root"), new UriRef(baseUri + "propertyA"),
-				new PlainLiteralImpl("A")));
-		mGraph.add(new TripleImpl(new UriRef(baseUri + "root"), new UriRef(baseUri + "resourcePropertyB"),
-				new UriRef(baseUri + "child1")));
-		mGraph.add(new TripleImpl(new UriRef(baseUri + "child1"), new UriRef(baseUri + "propertyB"),
-				new PlainLiteralImpl("B")));
-		BNode bNode = new BNode();
-		mGraph.add(new TripleImpl(bNode, new UriRef(baseUri + "propertyC"), new PlainLiteralImpl("C")));
-		mGraph.add(new TripleImpl(bNode, new UriRef(baseUri + "propertyE"),
-				LiteralFactory.getInstance().createTypedLiteral("E")));
-		mGraph.add(new TripleImpl(new UriRef(baseUri + "root"), new UriRef(baseUri + "resourcePropertyD"), bNode));
+    }
+
+    @After
+    public void tearDown() {
+    }
+
+	@Test
+	public void testSerializationOfBNode() {
+		mGraph.add(new TripleImpl(new UriRef("http://example.org/node1"),
+				new UriRef("http://example.org/prop1"), new BNode()));
+		SerializingProvider provider = new RdfJsonSerializingProvider();
+		ByteArrayOutputStream serializedGraph = new ByteArrayOutputStream();
+		provider.serialize(serializedGraph, mGraph, "application/rdf+json");
+		Assert.assertTrue(serializedGraph.toString().contains("_:"));
 	}
 
 	/*
-	 * Serializes a Graph and parse it.
+	 * serializes a graph and parse it back.
 	 */
 	@Test
 	public void testSerializer() {
 		initializeGraph();
 		SerializingProvider provider = new RdfJsonSerializingProvider();
 		ByteArrayOutputStream serializedGraph = new ByteArrayOutputStream();
-		provider.serialize(serializedGraph, mGraph.getGraph(),
-				"application/rdf+json");
+		provider.serialize(serializedGraph, mGraph, "application/rdf+json");
 		ParsingProvider parsingProvider = new RdfJsonParsingProvider();
 		ByteArrayInputStream jsonIn = new ByteArrayInputStream(serializedGraph.toByteArray());
-		MGraph deserializedMGraph = new SimpleMGraph();
-		parsingProvider.parse(deserializedMGraph, jsonIn, "application/rdf+json", null);
-		Assert.assertEquals(6, deserializedMGraph.size());
-		Assert.assertEquals(mGraph.getGraph(), deserializedMGraph.getGraph());
+		MGraph parsedMGraph = new SimpleMGraph();
+		parsingProvider.parse(parsedMGraph, jsonIn, "application/rdf+json", null);
+
+		Assert.assertEquals(6, parsedMGraph.size());
+		Assert.assertEquals(mGraph.getGraph(), parsedMGraph.getGraph());
+	}
 
+	private void initializeGraph() {
+		String baseUri = "http://base/";
+		mGraph.add(new TripleImpl(new UriRef(baseUri + "root"), new UriRef(baseUri + "propertyA"),
+				new PlainLiteralImpl("A")));
+		mGraph.add(new TripleImpl(new UriRef(baseUri + "root"), new UriRef(baseUri + "resourcePropertyB"),
+				new UriRef(baseUri + "child1")));
+		mGraph.add(new TripleImpl(new UriRef(baseUri + "child1"), new UriRef(baseUri + "propertyB"),
+				new PlainLiteralImpl("B")));
+		BNode bNode = new BNode();
+		mGraph.add(new TripleImpl(bNode, new UriRef(baseUri + "propertyC"), new PlainLiteralImpl("C")));
+		mGraph.add(new TripleImpl(bNode, new UriRef(baseUri + "propertyE"),
+				LiteralFactory.getInstance().createTypedLiteral("E")));
+		mGraph.add(new TripleImpl(new UriRef(baseUri + "root"), new UriRef(baseUri + "resourcePropertyD"), bNode));
 	}
 }