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 2015/12/22 18:34:50 UTC

[4/4] jena git commit: Move CharSpace to jena-base. Clean up string escape processing.

Move CharSpace to jena-base.  Clean up string escape processing.

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

Branch: refs/heads/master
Commit: af171371bc723f830060345dd9a4758b4ebf8d6f
Parents: 8e615f1
Author: Andy Seaborne <an...@apache.org>
Authored: Sun Dec 20 17:31:55 2015 +0000
Committer: Andy Seaborne <an...@apache.org>
Committed: Tue Dec 22 17:32:00 2015 +0000

----------------------------------------------------------------------
 .../org/apache/jena/riot/RDFWriterRegistry.java |   2 +-
 .../org/apache/jena/riot/lang/RiotParsers.java  |   7 +-
 .../org/apache/jena/riot/out/CharSpace.java     |  22 ---
 .../org/apache/jena/riot/out/EscapeProc.java    |  49 ------
 .../apache/jena/riot/system/StreamRDFLib.java   |   2 +-
 .../jena/riot/system/StreamRDFWriter.java       |   2 +-
 .../apache/jena/riot/writer/NQuadsWriter.java   |   2 +-
 .../apache/jena/riot/writer/NTriplesWriter.java |   6 +-
 .../jena/riot/writer/WriterStreamRDFPlain.java  |   2 +-
 .../apache/jena/riot/lang/TestLangNTriples.java |   7 +-
 .../apache/jena/riot/lang/TestLangNTuples.java  |  18 +--
 .../org/apache/jena/riot/out/TestNodeFmt.java   |  13 ++
 .../org/apache/jena/atlas/lib/CharSpace.java    |  28 ++++
 .../org/apache/jena/atlas/lib/EscapeStr.java    | 149 +++++++++++--------
 .../java/org/apache/jena/atlas/lib/TS_Lib.java  |   2 +-
 .../apache/jena/atlas/lib/TestEscapeStr.java    |  40 +++++
 16 files changed, 195 insertions(+), 156 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/RDFWriterRegistry.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/RDFWriterRegistry.java b/jena-arq/src/main/java/org/apache/jena/riot/RDFWriterRegistry.java
index 101b459..918d03f 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/RDFWriterRegistry.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/RDFWriterRegistry.java
@@ -20,8 +20,8 @@ package org.apache.jena.riot;
 
 import java.util.* ;
 
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.n3.N3JenaWriter ;
-import org.apache.jena.riot.out.CharSpace ;
 import org.apache.jena.riot.out.JsonLDWriter ;
 import org.apache.jena.riot.system.RiotLib ;
 import org.apache.jena.riot.thrift.WriterDatasetThrift ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/lang/RiotParsers.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/lang/RiotParsers.java b/jena-arq/src/main/java/org/apache/jena/riot/lang/RiotParsers.java
index 6953df9..8f5ccda 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/lang/RiotParsers.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/lang/RiotParsers.java
@@ -32,9 +32,12 @@ import java.io.Reader ;
 
 import org.apache.jena.atlas.io.PeekReader ;
 import org.apache.jena.atlas.json.io.parser.TokenizerJSON ;
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.riot.* ;
-import org.apache.jena.riot.out.CharSpace ;
-import org.apache.jena.riot.system.* ;
+import org.apache.jena.riot.system.ErrorHandlerFactory ;
+import org.apache.jena.riot.system.ParserProfile ;
+import org.apache.jena.riot.system.RiotLib ;
+import org.apache.jena.riot.system.StreamRDF ;
 import org.apache.jena.riot.tokens.Tokenizer ;
 import org.apache.jena.riot.tokens.TokenizerFactory ;
 

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/out/CharSpace.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/out/CharSpace.java b/jena-arq/src/main/java/org/apache/jena/riot/out/CharSpace.java
deleted file mode 100644
index bff34be..0000000
--- a/jena-arq/src/main/java/org/apache/jena/riot/out/CharSpace.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.riot.out;
-
-/** rather write 'true' or 'false', use this enum */ 
-public enum CharSpace{ ASCII, UTF8 }

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/out/EscapeProc.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/out/EscapeProc.java b/jena-arq/src/main/java/org/apache/jena/riot/out/EscapeProc.java
deleted file mode 100644
index ae6386a..0000000
--- a/jena-arq/src/main/java/org/apache/jena/riot/out/EscapeProc.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.jena.riot.out;
-
-import org.apache.jena.atlas.io.AWriter ;
-import org.apache.jena.atlas.lib.EscapeStr ;
-
-public class EscapeProc {
-    private final boolean ascii ;
-
-    public EscapeProc(CharSpace charSpace) {
-        this.ascii = ( charSpace == CharSpace.ASCII ) ; 
-    } 
-
-    public void writeURI(AWriter w, String s) {
-        if ( ascii )
-            EscapeStr.stringEsc(w, s, true, ascii) ;
-        else
-            // It's a URI - assume legal.
-            w.print(s) ;
-    }
-
-    public void writeStr(AWriter w, String s) {
-        EscapeStr.stringEsc(w, s, true, ascii) ;
-    }
-
-    public void writeStrMultiLine(AWriter w, String s) {
-        // N-Triples does not have """
-        EscapeStr.stringEsc(w, s, false, ascii) ;
-    }
-
-}
-

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
index 92aa8a8..9f6ecb1 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFLib.java
@@ -23,12 +23,12 @@ import java.io.Writer ;
 
 import org.apache.jena.atlas.io.AWriter ;
 import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.atlas.lib.Sink ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.riot.lang.StreamRDFCounting ;
-import org.apache.jena.riot.out.CharSpace ;
 import org.apache.jena.riot.writer.WriterStreamRDFPlain ;
 import org.apache.jena.shared.JenaException ;
 import org.apache.jena.shared.PrefixMapping ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFWriter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFWriter.java b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFWriter.java
index 6448e42..b70dbf8 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFWriter.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/system/StreamRDFWriter.java
@@ -26,10 +26,10 @@ import java.util.Map ;
 
 import org.apache.jena.atlas.io.AWriter ;
 import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.riot.* ;
-import org.apache.jena.riot.out.CharSpace ;
 import org.apache.jena.riot.thrift.BinRDF ;
 import org.apache.jena.riot.writer.StreamWriterTriX ;
 import org.apache.jena.riot.writer.WriterStreamRDFBlocks ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/writer/NQuadsWriter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/writer/NQuadsWriter.java b/jena-arq/src/main/java/org/apache/jena/riot/writer/NQuadsWriter.java
index 3a74bcf..56e30a0 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/writer/NQuadsWriter.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/writer/NQuadsWriter.java
@@ -22,8 +22,8 @@ import java.io.OutputStream ;
 import java.io.Writer ;
 import java.util.Iterator ;
 
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.out.CharSpace ;
 import org.apache.jena.riot.system.PrefixMap ;
 import org.apache.jena.riot.system.StreamOps ;
 import org.apache.jena.riot.system.StreamRDF ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/writer/NTriplesWriter.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/writer/NTriplesWriter.java b/jena-arq/src/main/java/org/apache/jena/riot/writer/NTriplesWriter.java
index f6d3047..491611a 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/writer/NTriplesWriter.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/writer/NTriplesWriter.java
@@ -18,18 +18,16 @@
 
 package org.apache.jena.riot.writer;
 
-import static org.apache.jena.riot.out.CharSpace.ASCII ;
-import static org.apache.jena.riot.out.CharSpace.UTF8 ;
-
 import java.io.OutputStream ;
 import java.io.Writer ;
 import java.util.Iterator ;
 
 import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.lib.CharSpace ;
+import static org.apache.jena.atlas.lib.CharSpace.* ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.graph.Triple ;
 import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.out.CharSpace ;
 import org.apache.jena.riot.system.PrefixMap ;
 import org.apache.jena.riot.system.StreamOps ;
 import org.apache.jena.riot.system.StreamRDF ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/main/java/org/apache/jena/riot/writer/WriterStreamRDFPlain.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/main/java/org/apache/jena/riot/writer/WriterStreamRDFPlain.java b/jena-arq/src/main/java/org/apache/jena/riot/writer/WriterStreamRDFPlain.java
index 13401f0..7147789 100644
--- a/jena-arq/src/main/java/org/apache/jena/riot/writer/WriterStreamRDFPlain.java
+++ b/jena-arq/src/main/java/org/apache/jena/riot/writer/WriterStreamRDFPlain.java
@@ -20,9 +20,9 @@ package org.apache.jena.riot.writer ;
 
 import org.apache.jena.atlas.io.AWriter ;
 import org.apache.jena.atlas.io.IO ;
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.graph.Triple ;
-import org.apache.jena.riot.out.CharSpace ;
 import org.apache.jena.riot.out.NodeFormatter ;
 import org.apache.jena.riot.out.NodeFormatterNT ;
 import org.apache.jena.riot.system.StreamRDF ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTriples.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTriples.java b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTriples.java
index 8306786..18112fb 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTriples.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTriples.java
@@ -20,14 +20,17 @@ package org.apache.jena.riot.lang;
 
 import java.io.StringReader ;
 
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.atlas.lib.StrUtils ;
 import org.apache.jena.graph.Graph ;
 import org.apache.jena.rdf.model.Model ;
 import org.apache.jena.rdf.model.ModelFactory ;
-import org.apache.jena.riot.* ;
 import org.apache.jena.riot.ErrorHandlerTestLib.ErrorHandlerEx ;
 import org.apache.jena.riot.ErrorHandlerTestLib.ExFatal ;
-import org.apache.jena.riot.out.CharSpace;
+import org.apache.jena.riot.Lang ;
+import org.apache.jena.riot.RDFDataMgr ;
+import org.apache.jena.riot.RDFLanguages ;
+import org.apache.jena.riot.RiotException ;
 import org.apache.jena.riot.system.StreamRDFLib ;
 import org.apache.jena.riot.tokens.Tokenizer ;
 import org.apache.jena.sparql.sse.SSE ;

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTuples.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTuples.java b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTuples.java
index ced99bd..d06047f 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTuples.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/lang/TestLangNTuples.java
@@ -18,16 +18,20 @@
 
 package org.apache.jena.riot.lang;
 
+import static org.apache.jena.riot.system.ErrorHandlerFactory.errorHandlerNoLogging ;
+import static org.apache.jena.riot.system.ErrorHandlerFactory.getDefaultErrorHandler ;
+import static org.apache.jena.riot.system.ErrorHandlerFactory.setDefaultErrorHandler ;
+
 import java.io.ByteArrayInputStream ;
 
 import org.apache.jena.atlas.junit.BaseTest ;
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.atlas.lib.StrUtils ;
 import org.apache.jena.riot.ErrorHandlerTestLib.ErrorHandlerEx;
 import org.apache.jena.riot.ErrorHandlerTestLib.ExError;
 import org.apache.jena.riot.ErrorHandlerTestLib.ExFatal;
 import org.apache.jena.riot.ErrorHandlerTestLib.ExWarning;
 import org.apache.jena.riot.Lang ;
-import org.apache.jena.riot.out.CharSpace;
 import org.apache.jena.riot.system.ErrorHandler ;
 import org.apache.jena.riot.system.RiotLib ;
 import org.apache.jena.riot.system.StreamRDFLib ;
@@ -36,9 +40,6 @@ import org.apache.jena.riot.tokens.TokenizerFactory ;
 import org.junit.AfterClass ;
 import org.junit.BeforeClass ;
 import org.junit.Test ;
-import static org.apache.jena.riot.system.ErrorHandlerFactory.errorHandlerNoLogging ;
-import static org.apache.jena.riot.system.ErrorHandlerFactory.getDefaultErrorHandler ;
-import static org.apache.jena.riot.system.ErrorHandlerFactory.setDefaultErrorHandler ;
 /** Test of syntax by a tuples parser (does not include node validitiy checking) */ 
 
 abstract public class TestLangNTuples extends BaseTest
@@ -178,7 +179,7 @@ abstract public class TestLangNTuples extends BaseTest
         Tokenizer tokenizer = charSpace == CharSpace.ASCII ? TokenizerFactory.makeTokenizerASCII(in) : TokenizerFactory.makeTokenizerUTF8(in) ;
         return tokenizer ;
     }
-//    
+    
     static protected Tokenizer tokenizer(String string)
     {
         // UTF-8
@@ -198,15 +199,10 @@ abstract public class TestLangNTuples extends BaseTest
         x.setProfile(RiotLib.profile(null, false, true, new ErrorHandlerEx())) ;
         x.parse() ;
     }
-//    
+    
     protected abstract Lang getLang() ;
     
     protected long parseCount(String... strings) {
         return ParserTestBaseLib.parseCount(getLang(), strings) ;
     }
-    
-//    protected void parseCheck(String... strings) {
-//        ParserTestBaseLib.parseCount(getLang(), strings) ;
-//    }
-
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmt.java
----------------------------------------------------------------------
diff --git a/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmt.java b/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmt.java
index 97db092..8f917ee 100644
--- a/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmt.java
+++ b/jena-arq/src/test/java/org/apache/jena/riot/out/TestNodeFmt.java
@@ -21,6 +21,7 @@ package org.apache.jena.riot.out;
 import org.apache.jena.JenaRuntime ;
 import org.apache.jena.atlas.io.StringWriterI ;
 import org.apache.jena.atlas.junit.BaseTest ;
+import org.apache.jena.atlas.lib.CharSpace ;
 import org.apache.jena.graph.Node ;
 import org.apache.jena.riot.system.PrefixMap ;
 import org.apache.jena.riot.system.PrefixMapFactory ;
@@ -184,4 +185,16 @@ public class TestNodeFmt extends BaseTest
     @Test public void nodefmt_ttl_74()  { test(nodeFormatterTTL, "'False'^^<http://www.w3.org/2001/XMLSchema#boolean>", "\"False\"^^<http://www.w3.org/2001/XMLSchema#boolean>") ; }
     @Test public void nodefmt_ttl_75()  { test(nodeFormatterTTL, "'True'^^<http://www.w3.org/2001/XMLSchema#boolean>", "\"True\"^^<http://www.w3.org/2001/XMLSchema#boolean>") ; }
     
+    private static String QuoteDouble3 = "\"\"\"" ;
+    private static String QuoteSingle3 = "'''" ;
+
+    // Multiline
+    
+    private static NodeFormatter nodeFormatterTTL_ML = new NodeFormatterTTL_MultiLine(base, prefixMap) ;
+    
+    @Test public void nodefmt_ttl_ML_01()  { test(nodeFormatterTTL_ML, "'A\\nB'", QuoteDouble3+"A\nB"+QuoteDouble3) ; }
+    @Test public void nodefmt_ttl_ML_02()  { test(nodeFormatterTTL_ML, "'A\\nB'@en", QuoteDouble3+"A\nB"+QuoteDouble3+"@en") ; }
+    @Test public void nodefmt_ttl_ML_03()  { test(nodeFormatterTTL_ML, "'A\\nB'^^:ex\\/datatype", QuoteDouble3+"A\nB"+QuoteDouble3+"^^ex:datatype") ; }
+
+    
 }

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-base/src/main/java/org/apache/jena/atlas/lib/CharSpace.java
----------------------------------------------------------------------
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/CharSpace.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/CharSpace.java
new file mode 100644
index 0000000..8268aa3
--- /dev/null
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/CharSpace.java
@@ -0,0 +1,28 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.atlas.lib;
+
+/** rather write 'true' or 'false', use this enum */ 
+public enum CharSpace {
+    ASCII, UTF8;
+
+    public static boolean isAscii(CharSpace charSpace) {
+        return charSpace == ASCII;
+    }
+}

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
----------------------------------------------------------------------
diff --git a/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java b/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
index fb5edf9..593c019 100644
--- a/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
+++ b/jena-base/src/main/java/org/apache/jena/atlas/lib/EscapeStr.java
@@ -20,86 +20,115 @@ package org.apache.jena.atlas.lib;
 
 import org.apache.jena.atlas.AtlasException ;
 import org.apache.jena.atlas.io.AWriter ;
-import org.apache.jena.atlas.io.IndentedLineBuffer ;
 import org.apache.jena.atlas.io.OutputUtils ;
+import org.apache.jena.atlas.io.StringWriterI ;
 
+/** String escape utilities */
 public class EscapeStr
 {
-    // Tests: TestOutput
-    // See also OutputLangUtils.outputEsc.
-//    private final boolean ascii ;
-//
-//    public EscapeStr(CharSpace charSpace) { this.ascii = ( charSpace == CharSpace.ASCII ) ; } 
-//
-//    public void writeURI(AWriter w, String s)
-//    {
-//        if ( ascii )
-//            stringEsc(w, s, true, ascii) ;
-//        else
-//            // It's a URI - assume legal.
-//            w.print(s) ;
-//    }
-//
-//    public void writeStr(AWriter w, String s) 
-//    {
-//        stringEsc(w, s, true, ascii) ;
-//    }
-//
-//    public void writeStrMultiLine(AWriter w, String s) 
-//    {
-//        // N-Triples does not have """
-//        stringEsc(w, s, false, ascii) ;
-//    }
-//
-    // Utility
     /*
      * Escape characters in a string according to Turtle rules. 
      */
-    public static String stringEsc(String s)
-    { return stringEsc(s, true, false) ; }
-
-    private static String stringEsc(String s, boolean singleLineString, boolean asciiOnly)
-    {
-        IndentedLineBuffer sb = new IndentedLineBuffer() ;
-        stringEsc(sb, s, singleLineString, asciiOnly) ;
-        return sb.toString() ;
+    public static String stringEsc(String s) {
+        AWriter w = new StringWriterI() ;
+        stringEsc(w, s, Chars.CH_QUOTE2, true, CharSpace.UTF8) ;
+        return w.toString() ;
     }
 
-    public static void stringEsc(AWriter out, String s, boolean singleLineString, boolean asciiOnly)
-    {
+    /** Write a string - basic escaping, no quote escaping. */
+    public static void stringEsc(AWriter out, String s, boolean asciiOnly) {
         int len = s.length() ;
         for (int i = 0; i < len; i++) {
             char c = s.charAt(i);
-
             // \\ Escape always possible.
-            if (c == '\\') 
-            {
+            if (c == '\\') {
                 out.print('\\') ;
                 out.print(c) ;
                 continue ;
             }
-            if ( singleLineString )
-            {
-                if ( c == '"' )         { out.print("\\\""); continue ; }
-                else if (c == '\n')     { out.print("\\n");  continue ; }
-                else if (c == '\t')     { out.print("\\t");  continue ; }
-                else if (c == '\r')     { out.print("\\r");  continue ; }
-                else if (c == '\f')     { out.print("\\f");  continue ; }
+            switch(c) {
+                case '\n':  out.print("\\n"); continue; 
+                case '\t':  out.print("\\t"); continue; 
+                case '\r':  out.print("\\r"); continue; 
+                case '\f':  out.print("\\f"); continue; 
+                default:    // Drop through
             }
-            // Not \-style esacpe. 
-            if ( c >= 32 && c < 127 )
-                out.print(c);
-            else if ( !asciiOnly )
+            if ( !asciiOnly )
                 out.print(c);
-            else
-            {
-                // Outside the charset range.
-                // Does not cover beyond 16 bits codepoints directly
-                // (i.e. \U escapes) but Java keeps these as surrogate
-                // pairs and will print as characters
-                out.print( "\\u") ;
-                OutputUtils.printHex(out, c, 4) ;
+            else 
+                writeCharAsASCII(out, c) ;
+        }
+    }
+    
+    public static void stringEsc(AWriter out, String s, char quoteChar, boolean singleLineString) {
+        stringEsc(out, s, quoteChar, singleLineString, CharSpace.UTF8);
+    }
+    
+    public static void stringEsc(AWriter out, String s, char quoteChar, boolean singleLineString, CharSpace charSpace) {
+        boolean ascii = ( CharSpace.ASCII == charSpace ) ;
+        int len = s.length() ;
+        int quotesInARow = 0 ;
+        for (int i = 0; i < len; i++) {
+            char c = s.charAt(i);
+            // \\ Escape always possible.
+            if (c == '\\') {
+                out.print('\\') ;
+                out.print(c) ;
+                continue ;
+            }
+            if ( ! singleLineString ) {
+                // Multiline string.
+                if ( c == quoteChar ) {
+                    quotesInARow++ ;
+                    if ( quotesInARow == 3 ) {
+                        out.print("\\");
+                        out.print(quoteChar);
+                        quotesInARow = 0; 
+                        continue;
+                    }
+                } else {
+                    quotesInARow = 0 ;
+                }
+            } else {
+                if ( c == quoteChar ) {
+                    out.print("\\"); out.print(c) ; continue ;
+                }
+                switch(c) {
+                    case '\n':  out.print("\\n"); continue; 
+                    case '\t':  out.print("\\t"); continue; 
+                    case '\r':  out.print("\\r"); continue; 
+                    case '\f':  out.print("\\f"); continue; 
+                    default:    // Drop through
+                }
             }
+
+            if ( !ascii )
+                out.print(c);
+            else 
+                writeCharAsASCII(out, c) ;
+        }
+    }
+
+    /** Write a string with Unicode to ASCII conversion using \-u escapes */  
+    public static void writeASCII(AWriter out, String s) {
+        int len = s.length() ;
+        for (int i = 0; i < len; i++) {
+            char c = s.charAt(i);
+            writeCharAsASCII(out, c);
+        }
+    }
+
+    /** Write a character with Unicode to ASCII conversion using \-u escapes */
+    public static void writeCharAsASCII(AWriter out, char c) {
+        if ( c >= 32 && c < 127 )
+            out.print(c);
+        else {
+            // Outside the charset range.
+            // Does not cover beyond 16 bits codepoints directly
+            // (i.e. \U escapes) but Java keeps these as surrogate
+            // pairs and will print as characters
+            out.print("\\u") ;
+            OutputUtils.printHex(out, c, 4) ;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
----------------------------------------------------------------------
diff --git a/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
index a67532b..bd3d027 100644
--- a/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
+++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/TS_Lib.java
@@ -25,7 +25,6 @@ import org.junit.runners.Suite ;
 
 /**
  * Tests for the Atlas lib package
- *
  */
 @RunWith(Suite.class)
 @Suite.SuiteClasses( {
@@ -33,6 +32,7 @@ import org.junit.runners.Suite ;
     , TestBitsLong.class
     , TestBitsInt.class
     , TestBytes.class
+    , TestEscapeStr.class
     , TestHex.class
     , TestListUtils.class
     , TestSetUtils.class

http://git-wip-us.apache.org/repos/asf/jena/blob/af171371/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java
----------------------------------------------------------------------
diff --git a/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java
new file mode 100644
index 0000000..7f4ab95
--- /dev/null
+++ b/jena-base/src/test/java/org/apache/jena/atlas/lib/TestEscapeStr.java
@@ -0,0 +1,40 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jena.atlas.lib;
+
+import org.junit.Assert ;
+import org.junit.Test ;
+
+// Testing is a bit light here but the RDF term output and 
+// the language level output covers the ground as well.
+// See TestQuotedString in ARQ.
+
+public class TestEscapeStr {
+    
+    @Test public void escape_str_01()   { test("", "") ; }
+    @Test public void escape_str_02()   { test("A", "A") ; }
+    @Test public void escape_str_03()   { test("\n", "\\n") ; }
+    @Test public void escape_str_04()   { test("A\tB", "A\\tB") ; }
+    @Test public void escape_str_05()   { test("\"", "\\\"") ; }
+
+    private void test(String input, String expected) {
+        String output = EscapeStr.stringEsc(input) ;
+        Assert.assertEquals(expected, output);
+    }
+}