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 2011/09/22 21:45:35 UTC

svn commit: r1174346 - in /incubator/jena/Jena2/ARQ/trunk: src-dev/dev/ src-test/com/hp/hpl/jena/sparql/core/ src-test/org/openjena/riot/out/ src/com/hp/hpl/jena/sparql/util/ src/org/openjena/riot/out/

Author: andy
Date: Thu Sep 22 19:45:35 2011
New Revision: 1174346

URL: http://svn.apache.org/viewvc?rev=1174346&view=rev
Log:
NodeFmtUtils

Modified:
    incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java
    incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/core/TestEsc.java
    incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/out/TestNodeFmtLib.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/util/FmtUtils.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/EscapeStr.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFmtLib.java
    incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFormatterNT.java

Modified: incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-dev/dev/DevARQ.java Thu Sep 22 19:45:35 2011
@@ -3,8 +3,7 @@ package dev ;
 
 public class DevARQ
 {
-    // NodeFmtLib to use a NodeFormatter.
-    // BIO: RS = vars list and the bindings.
+    // BIO: Table = vars list and the bindings.
     
     // Assembly configuration: <appendAssemblyId>false</appendAssemblyId>
     

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/core/TestEsc.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/core/TestEsc.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/core/TestEsc.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/core/TestEsc.java Thu Sep 22 19:45:35 2011
@@ -56,8 +56,6 @@ public class TestEsc extends TestCase
     @Test public void testEscUni17() { execTest("x\\tx\\nx\\r", "x\tx\nx\r") ; }
     @Test public void testEscUni18() { execTest("x\\t\\n\\r", "x\t\n\r") ; }
     
-    
-    
     private void execTestFail(String input)
     {
         try {

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/out/TestNodeFmtLib.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/out/TestNodeFmtLib.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/out/TestNodeFmtLib.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/org/openjena/riot/out/TestNodeFmtLib.java Thu Sep 22 19:45:35 2011
@@ -6,6 +6,10 @@
 
 package org.openjena.riot.out;
 
+import com.hp.hpl.jena.graph.Node ;
+import com.hp.hpl.jena.sparql.util.NodeFactory ;
+import com.hp.hpl.jena.vocabulary.RDF ;
+
 import org.junit.Test ;
 import org.openjena.atlas.junit.BaseTest ;
 
@@ -14,6 +18,8 @@ public class TestNodeFmtLib extends Base
     // : is 3A 
     // - is 2D
     
+    // BNode labels.
+    
     @Test public void encode_01() { testenc("abc", "Babc") ; }
     @Test public void encode_02() { testenc("-", "BX2D") ; }
     @Test public void encode_03() { testenc("abc:def-ghi", "BabcX3AdefX2Dghi") ; }
@@ -28,6 +34,7 @@ public class TestNodeFmtLib extends Base
     @Test public void rt_06() {  testencdec("X-") ; }
     @Test public void rt_07() {  testencdec("-123:456:xyz") ; }
 
+    
     private void testenc(String input, String expected)
     {
         String x = NodeFmtLib.encodeBNodeLabel(input) ;
@@ -40,6 +47,20 @@ public class TestNodeFmtLib extends Base
         String y = NodeFmtLib.decodeBNodeLabel(x) ;
         assertEquals(input, y) ;
     }
+
+    @Test public void fmtNode_01() { test ("<a>", "<a>") ; }
+    @Test public void fmtNode_02() { test ("<"+RDF.getURI()+"type>", "rdf:type") ; }
+    @Test public void fmtNode_03() { test ("'123'^^xsd:integer", "123") ; }
+    @Test public void fmtNode_04() { test ("'abc'^^xsd:integer", "\"abc\"^^xsd:integer") ; }
+    
+    private static void test(String node, String output)
+    { test(NodeFactory.parseNode(node) , output) ; }
+    
+    private static void test(Node node, String output)
+    {
+        String x = NodeFmtLib.str(node) ;
+        assertEquals(output, x) ;
+    }
 }
 
 /*

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/util/FmtUtils.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/util/FmtUtils.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/util/FmtUtils.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/util/FmtUtils.java Thu Sep 22 19:45:35 2011
@@ -34,6 +34,8 @@ import com.hp.hpl.jena.vocabulary.XSD ;
 
 public class FmtUtils
 {
+    // OLD CODE - being replaces by riot.NodeFmtLib 
+    
     // Consider withdrawing non-serialzation context forms of this.
     // Or a temporary SerialzationContext does not abbreviate bNodes.
     static final String indentPrefix = "  " ;

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/EscapeStr.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/EscapeStr.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/EscapeStr.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/EscapeStr.java Thu Sep 22 19:45:35 2011
@@ -22,6 +22,8 @@ import java.io.IOException ;
 import java.io.StringWriter ;
 import java.io.Writer ;
 
+import com.hp.hpl.jena.sparql.lang.ParserBase ;
+
 import org.openjena.atlas.io.IO ;
 import org.openjena.atlas.io.OutputUtils ;
 
@@ -116,4 +118,16 @@ public class EscapeStr
             }
         }
     }
+    
+    // Utilities to remove escapes
+    
+    public static String unescapeStr(String s)
+    { return unescape(s, '\\') ; }
+    
+    // Worker function
+    public static String unescape(String s, char escape)
+    {
+        return ParserBase.unescape(s, escape, false,  -1, -1) ;
+        
+    }
 }

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFmtLib.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFmtLib.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFmtLib.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFmtLib.java Thu Sep 22 19:45:35 2011
@@ -7,115 +7,91 @@
 
 package org.openjena.riot.out;
 
+import java.io.StringWriter ;
+import java.io.Writer ;
+import java.net.MalformedURLException ;
+import java.util.Map ;
+
 import org.openjena.atlas.lib.Bytes ;
 import org.openjena.atlas.lib.Chars ;
-import org.openjena.riot.RiotException ;
 import org.openjena.riot.system.PrefixMap ;
 import org.openjena.riot.system.Prologue ;
 import org.openjena.riot.system.RiotChars ;
 
 import com.hp.hpl.jena.graph.Node ;
-import com.hp.hpl.jena.graph.Node_Literal ;
 import com.hp.hpl.jena.graph.Triple ;
-import com.hp.hpl.jena.rdf.model.RDFNode ;
+import com.hp.hpl.jena.iri.IRI ;
+import com.hp.hpl.jena.iri.IRIFactory ;
+import com.hp.hpl.jena.iri.IRIRelativize ;
 import com.hp.hpl.jena.shared.PrefixMapping ;
+import com.hp.hpl.jena.sparql.ARQConstants ;
 import com.hp.hpl.jena.sparql.core.Quad ;
-import com.hp.hpl.jena.sparql.util.FmtUtils ;
 
+/** Presentation utilitiles for Nodes, Triples, Quads and more */ 
 public class NodeFmtLib
 {
-    // TODO Switch to using NodeFormatter.
-    
-    
-    // FmtUtils: This writes abbreviated bnodes (_:b0 etc)
-    // These utilities are lower level and reflect the bNodes label.
-    
+    // See OutputLangUtils.
+    // See and use EscapeStr
     
+    static PrefixMap dftPrefixMap = new PrefixMap() ;
+    static {
+        PrefixMapping pm = ARQConstants.getGlobalPrefixMap() ;
+        Map<String, String> map = pm.getNsPrefixMap() ;
+        for ( Map.Entry<String, String> e : map.entrySet() )
+            dftPrefixMap.add(e.getKey(), e.getValue() ) ;
+    }
+
     public static String str(Triple t)
     {
-        return 
-            serialize(t.getSubject()) + " " +
-            serialize(t.getPredicate()) + " " +
-            serialize(t.getObject()) ; 
+        return str(t.getSubject(), t.getPredicate(),t.getObject()) ;
     }
 
     public static String str(Quad q)
     {
-        return 
-            serialize(q.getGraph()) + " " +
-            serialize(q.getSubject()) + " " +
-            serialize(q.getPredicate()) + " " +
-            serialize(q.getObject()) ; 
+        return str(q.getGraph(), q.getSubject(), q.getPredicate(), q.getObject()) ;
     }
+    
 
-    private static final boolean onlySafeBNodeLabels = false ;
+    // Worker
+    public static String str(Node ... nodes)
+    {
+        StringWriter sw = new StringWriter() ;
+        boolean first = true ;
+        for ( Node n : nodes ) 
+        {
+            if ( ! first )
+            {
+                sw.append(" ") ;
+                first = false ;
+            }
+            str(sw, n) ;
+        }
+        return sw.toString() ; 
+    }
 
-    public static String displayStr(Node n) { return FmtUtils.stringForNode(n) ; }
+    //public static String str(Node n)
 
-    public static String serialize(Node n)
-    { return serialize(n, null, null) ; }
+    private static final boolean onlySafeBNodeLabels = true ;
 
-    public static String serialize(Node n, Prologue prologue)
-    { return serialize(n, prologue.getBaseURI(), prologue.getPrefixMap()) ; }
+    //public static String displayStr(Node n) { return serialize(n) ; }
 
-    
-    /** Encoding of a node so it can be reconstructed */ 
-    public static String serialize(Node n, String base, PrefixMap prefixMap)
-    {
-        // See also Nodec.
-        // See also OutputLangUtils - merge and this is a buffering call.
-        
-        if ( n == null )
-            return "<<null>>" ;
-        
-        if ( n.isBlank() )
-        {
-            String str = n.getBlankNodeLabel() ;
-            // c.f. OutputLangUtils
-            if ( onlySafeBNodeLabels )
-                str = encodeBNodeLabel(str) ;
-            return "_:"+str ;
-        }
-        
-        if ( n.isLiteral() )
-            return FmtUtils.stringForLiteral((Node_Literal)n, null) ;
+    public static void str(Writer w, Node n)
+    { serialize(w, n, null, null) ; }
 
-        if ( n.isURI() )
-        {
-            String uri = n.getURI() ;
-            return stringForURI(uri, base, prefixMap) ;
-        }
-        
-        // Safe name?
-        if ( n.isVariable() )
-            return "?"+n.getName() ;
-//        
-//        if ( n.equals(Node.ANY) )
-//            return "ANY" ;
-
-        throw new RiotException("Failed to turn a node into a string: "+n) ;
-        //return null ;
-    }
-    
-    // c.f. FmtUtils.stringForURI
-    // Uses PrefixMap, not PrefixMapping
-    static String stringForURI(String uri, String base, PrefixMap mapping)
+    public static void serialize(Writer w, Node n, Prologue prologue)
+    { serialize(w, n, prologue.getBaseURI(), prologue.getPrefixMap()) ; }
+
+    
+    public static void serialize(Writer w, Node n, String base, PrefixMap prefixMap)
     {
-        if ( mapping != null )
-        {
-            String pname = mapping.abbreviate(uri) ;
-            if ( pname != null )
-                return pname ;
-        }
-        if ( base != null )
-        {
-            String x = FmtUtils.abbrevByBase(uri, base) ;
-            if ( x != null ) 
-                return "<"+x+">" ;
-        }
-        return FmtUtils.stringForURI(uri) ; 
+        if ( prefixMap == null )
+            prefixMap = dftPrefixMap ;
+        NodeFormatter formatter = new NodeFormatterTTL(base, prefixMap) ;
+        formatter.format(w, n) ;
     }
     
+    // ---- Blank node labels.
+    
     // Strict N-triples only allows [A-Za-z][A-Za-z0-9]
     static char encodeMarkerChar = 'X' ;
 
@@ -193,32 +169,108 @@ public class NodeFmtLib
 
         return buffer.toString() ;
     }
-
     
-    //public static String safeBNodeLabel(String label)
+    // ---- Relative URIs.
     
-    public static String displayStr(Triple t, PrefixMapping prefixMapping)
+    static private int relFlags = IRIRelativize.SAMEDOCUMENT | IRIRelativize.CHILD ;
+    static public String abbrevByBase(String uri, String base)
     {
-        return FmtUtils.stringForTriple(t, prefixMapping) ;
+        if ( base == null )
+            return null ;
+        IRI baseIRI = IRIFactory.jenaImplementation().construct(base) ;
+        IRI rel = baseIRI.relativize(uri, relFlags) ;
+        String r = null ;
+        try { r = rel.toASCIIString() ; }
+        catch (MalformedURLException  ex) { r = rel.toString() ; }
+        return r ;
     }
 
-    public static String displayStr(RDFNode obj)
+    // ---- Escaping.
+    
+    static boolean applyUnicodeEscapes = false ;
+    
+    static EscapeStr escaper = new EscapeStr(false) ; 
+    
+    // take a string and make it safe for writing.
+    public static String stringEsc(String s)
+    { 
+        return stringEsc(s, true) ;
+    }
+    
+    public static String stringEsc(String s, boolean singleLineString)
     {
-        return FmtUtils.stringForRDFNode(obj) ;
+        StringWriter sw = new StringWriter() ;
+        if ( singleLineString )
+            escaper.writeStr(sw, s) ;
+        else
+            escaper.writeStrMultiLine(sw, s) ;
+        return sw.toString() ;
     }
     
-    //public static String str(Quad quad) {}
+    public static void stringEsc(StringBuilder sbuff, String s)
+    { stringEsc( sbuff,  s, true ) ; }
+
+    public static void stringEsc(StringBuilder sbuff, String s, boolean singleLineString)
+    {
+        int len = s.length() ;
+        for (int i = 0; i < len; i++) {
+            char c = s.charAt(i);
+
+            // Escape escapes and quotes
+            if (c == '\\' || c == '"' )
+            {
+                sbuff.append('\\') ;
+                sbuff.append(c) ;
+                continue ;
+            }
+            
+            // Characters to literally output.
+            // This would generate 7-bit safe files 
+//            if (c >= 32 && c < 127)
+//            {
+//                sbuff.append(c) ;
+//                continue;
+//            }    
+
+            // Whitespace
+            if ( singleLineString && ( c == '\n' || c == '\r' || c == '\f' ) )
+            {
+                if (c == '\n') sbuff.append("\\n");
+                if (c == '\t') sbuff.append("\\t");
+                if (c == '\r') sbuff.append("\\r");
+                if (c == '\f') sbuff.append("\\f");
+                continue ;
+            }
+            
+            // Output as is (subject to UTF-8 encoding on output that is)
+            
+            if ( ! applyUnicodeEscapes )
+                sbuff.append(c) ;
+            else
+            {
+                // Unicode escapes
+                // c < 32, c >= 127, not whitespace or other specials
+                if ( c >= 32 && c < 127 )
+                {
+                    sbuff.append(c) ;
+                }
+                else
+                {
+                    String hexstr = Integer.toHexString(c).toUpperCase();
+                    int pad = 4 - hexstr.length();
+                    sbuff.append("\\u");
+                    for (; pad > 0; pad--)
+                        sbuff.append("0");
+                    sbuff.append(hexstr);
+                }
+            }
+        }
+    }
     
 //    public static String stringEsc(String s)    { return FmtUtils.stringEsc(s) ; }
 //    
 //    public static String stringEsc(String s, boolean singleLineString)
 //    { return FmtUtils.stringEsc(s, singleLineString) ; }
-//    
-//    public static void stringEsc(StringBuilder sbuff, String s)
-//    { FmtUtils.stringEsc(sbuff, s) ; }
-//
-//    public static void stringEsc(StringBuilder sbuff, String s, boolean singleLineString)
-//    { FmtUtils.stringEsc(sbuff, s, singleLineString) ; }
 //
 //    public static String unescapeStr(String s)    { return ParserBase.unescapeStr(s) ; }
     

Modified: incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFormatterNT.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFormatterNT.java?rev=1174346&r1=1174345&r2=1174346&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFormatterNT.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/org/openjena/riot/out/NodeFormatterNT.java Thu Sep 22 19:45:35 2011
@@ -67,7 +67,7 @@ public class NodeFormatterNT extends Nod
         } catch (IOException ex) { IO.exception(ex) ; }
     }
 
-    private void writeEscaped(Writer w,String lex) throws IOException
+    private void writeEscaped(Writer w, String lex) throws IOException
     {
         w.write('"') ;
         w.write(lex) ;  // DO BETTER