You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by an...@apache.org on 2014/12/01 22:37:41 UTC

[3/4] jena git commit: JENA-816 : Adapt for RDF 1.0/RDF 1.1.

JENA-816 : Adapt for RDF 1.0/RDF 1.1.

Project: http://git-wip-us.apache.org/repos/asf/jena/repo
Commit: http://git-wip-us.apache.org/repos/asf/jena/commit/fdc666e0
Tree: http://git-wip-us.apache.org/repos/asf/jena/tree/fdc666e0
Diff: http://git-wip-us.apache.org/repos/asf/jena/diff/fdc666e0

Branch: refs/heads/master
Commit: fdc666e031095786f47ae29264bac8e860cf54a6
Parents: 0189468
Author: Andy Seaborne <an...@apache.org>
Authored: Mon Dec 1 20:51:39 2014 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Mon Dec 1 20:51:39 2014 +0000

----------------------------------------------------------------------
 .../apache/jena/riot/writer/RDFJSONWriter.java  | 114 ++++++++++++++-----
 1 file changed, 87 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/fdc666e0/jena-arq/src/main/java/org/apache/jena/riot/writer/RDFJSONWriter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/writer/RDFJSONWriter.java b/jena-arq/src/main/java/org/apache/jena/riot/writer/RDFJSONWriter.java
index dc62df0..400fcbe 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/writer/RDFJSONWriter.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/writer/RDFJSONWriter.java
@@ -25,18 +25,19 @@ import java.util.HashSet ;
 import java.util.Map ;
 import java.util.Set ;
 
+import org.apache.jena.atlas.io.IndentedWriter ;
+import org.apache.jena.atlas.json.io.JSWriter ;
 import org.apache.jena.atlas.lib.Pair ;
-import org.apache.jena.atlas.lib.Sink ;
 import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RiotException ;
 import org.apache.jena.riot.system.PrefixMap ;
-import org.apache.jena.riot.system.Prologue ;
-import org.apache.jena.riot.system.SyntaxLabels ;
 
 import com.hp.hpl.jena.graph.Graph ;
 import com.hp.hpl.jena.graph.GraphUtil ;
 import com.hp.hpl.jena.graph.Node ;
 import com.hp.hpl.jena.graph.Triple ;
 import com.hp.hpl.jena.sparql.util.Context ;
+import com.hp.hpl.jena.sparql.util.NodeUtils ;
 import com.hp.hpl.jena.util.iterator.ExtendedIterator ;
 
 public class RDFJSONWriter extends WriterGraphRIOTBase
@@ -44,18 +45,35 @@ public class RDFJSONWriter extends WriterGraphRIOTBase
     public RDFJSONWriter() {}
     
 	public static void output(OutputStream out, Graph graph) {
-        Prologue prologue = Prologue.create(null, null) ; // (null, graph.getPrefixMapping()) ;
-		Sink<Pair<Node, Map<Node, Set<Node>>>> sink = new SinkEntityOutput(out, prologue, SyntaxLabels.createNodeToLabel()) ;
-		output( sink, graph ) ;
+		output(new JSWriter(out), graph ) ;
 	}
 	
 	public static void output(Writer out, Graph graph) {
-        Prologue prologue = Prologue.create(null, null) ; // (null, graph.getPrefixMapping()) ;
-		Sink<Pair<Node, Map<Node, Set<Node>>>> sink = new SinkEntityOutput(out, prologue, SyntaxLabels.createNodeToLabel()) ;
-		output( sink, graph ) ;
+		output(new JSWriter(new IndentedWriterEx(out)), graph ) ;
 	}
 
-	private static void output(Sink<Pair<Node, Map<Node, Set<Node>>>> sink, Graph graph) {
+	@Override
+    public Lang getLang()
+    {
+        return Lang.RDFJSON ;
+    }
+
+    @Override
+    public void write(Writer out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
+    {
+        output(out, graph) ;
+    }
+
+    @Override
+    public void write(OutputStream out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
+    {
+        output(out, graph) ;
+    }
+
+    private static void output(JSWriter out, Graph graph) {
+	    out.startOutput() ;
+	    out.startObject();
+	    
 		ExtendedIterator<Node> subjects = GraphUtil.listSubjects(graph, Node.ANY, Node.ANY) ;
 		try {
 			Map<Node, Set<Node>> predicates = new HashMap<>() ;
@@ -77,31 +95,73 @@ public class RDFJSONWriter extends WriterGraphRIOTBase
 				} finally {
 					if ( triples != null ) triples.close() ;
 				}
-				sink.send(new Pair<>(subject, predicates)) ;
+				send(out, new Pair<>(subject, predicates)) ;
 				predicates.clear() ;
 			}			
 		} finally {
 			if ( subjects != null ) subjects.close() ;
-			sink.close() ;
+			out.finishObject();
+			out.finishOutput() ;
 		}
 	}
 
-    @Override
-    public Lang getLang()
-    {
-        return Lang.RDFJSON ;
-    }
-
-    @Override
-    public void write(Writer out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
-    {
-        output(out, graph) ;
-    }
+    private static void send(JSWriter out, Pair<Node, Map<Node, Set<Node>>> item) {
+        Node s = item.getLeft() ;
+        if ( s.isBlank() ) {
+            out.key("_:" + s.getBlankNodeLabel()) ;
+        } else if ( s.isURI() ) {
+            out.key(s.getURI()) ;
+        } else {
+            throw new RiotException ("Only URIs or blank nodes are legal subjects.") ;
+        }
 
-    @Override
-    public void write(OutputStream out, Graph graph, PrefixMap prefixMap, String baseURI, Context context)
-    {
-        output(out, graph) ;
+        out.startObject() ;
+        // out.pair(key, value) ;
+        Map<Node, Set<Node>> predicates = item.getRight() ;
+        for (Node p : predicates.keySet() ) {
+            out.key(p.getURI()) ;
+            out.startArray() ;
+            Set<Node> objects = predicates.get(p) ;
+            int i = 0;
+            for ( Node o : objects ) {
+                out.startObject() ;
+                if ( o.isBlank() ) {
+                    out.pair("type", "bnode") ;
+                    out.pair("value", "_:" + o.getBlankNodeLabel()) ;
+                } else if ( o.isURI() ) {
+                    out.pair("type", "uri") ;
+                    out.pair("value", o.getURI()) ;                 
+                } else if ( o.isLiteral() ) {
+                    String lex = o.getLiteralLexicalForm() ;
+                    out.pair("type", "literal") ;
+                    out.pair("value", lex) ;
+                    
+                    if ( NodeUtils.isSimpleString(o) ) {
+                        // No-op.
+                    } else if ( NodeUtils.isLangString(o) ) {
+                        String lang = o.getLiteralLanguage() ;    
+                        out.pair("lang", lang) ;
+                    } else {
+                        // Datatype, nothing special.
+                        String dt = o.getLiteralDatatypeURI() ;
+                        out.pair("datatype", dt) ;
+                    }
+                }
+                out.finishObject() ;
+                if (i < objects.size() - 1)
+                {
+                    out.arraySep();
+                }
+                i++;
+            }
+            out.finishArray() ;
+        }
+        out.finishObject() ;
     }
 	
+    private static class IndentedWriterEx extends IndentedWriter {
+        public IndentedWriterEx(Writer writer) {
+            super(writer);
+        }
+    }
 }