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


Reply via email to