... yet more incremental work for efficient JSON String token handling
diff --git a/src/java/org/codehaus/jackson/JsonFactory.java b/src/java/org/codehaus/jackson/JsonFactory.java index 34e2dbf..10b845e 100644 --- a/src/java/org/codehaus/jackson/JsonFactory.java +++ b/src/java/org/codehaus/jackson/JsonFactory.java
@@ -577,9 +577,7 @@ if (br == null) { br = new BufferRecycler(); - if (ref == null) { - _recyclerRef.set(new SoftReference<BufferRecycler>(br)); - } + _recyclerRef.set(new SoftReference<BufferRecycler>(br)); } return br; }
diff --git a/src/java/org/codehaus/jackson/io/JsonStringEncoder.java b/src/java/org/codehaus/jackson/io/JsonStringEncoder.java new file mode 100644 index 0000000..6788629 --- /dev/null +++ b/src/java/org/codehaus/jackson/io/JsonStringEncoder.java
@@ -0,0 +1,89 @@ +package org.codehaus.jackson.io; + +import java.lang.ref.SoftReference; + +import org.codehaus.jackson.util.BufferRecycler; + +/** + * Helper class used for efficient encoding of JSON String values (including + * JSON field names) into Strings or UTF-8 byte arrays. + * + * @since 1.6 + */ +public final class JsonStringEncoder +{ + /** + * This <code>ThreadLocal</code> contains a {@link java.lang.ref.SoftRerefence} + * to a {@link BufferRecycler} used to provide a low-cost + * buffer recycling between reader and writer instances. + */ + final protected static ThreadLocal<SoftReference<JsonStringEncoder>> _threadEncoder + = new ThreadLocal<SoftReference<JsonStringEncoder>>(); + + /* + /********************************************************** + /* Construction, instance access + /********************************************************** + */ + + public JsonStringEncoder() { } + + /** + * Factory method for getting an instance; this is either recycled per-thread instance, + * or a newly constructed one. + */ + public static JsonStringEncoder getInstance() + { + SoftReference<JsonStringEncoder> ref = _threadEncoder.get(); + JsonStringEncoder enc = (ref == null) ? null : ref.get(); + + if (enc == null) { + enc = new JsonStringEncoder(); + _threadEncoder.set(new SoftReference<JsonStringEncoder>(enc)); + } + return enc; + } + + /* + /********************************************************** + /* Public API + /********************************************************** + */ + + /** + * Method that will quote text contents using JSON standard quoting, + * and return results as a character array + */ + public char[] quoteAsString(String text) + { + // !!! TBI + return null; + } + + /** + * Will quote given JSON String value using standard quoting, encode + * results as UTF-8, and return result as a byte array. + */ + public byte[] quoteAsUTF8(String text) + { + // !!! TBI + return null; + } + + /** + * Will encode given String as UTF-8 (without any quoting), return + * resulting byte array. + */ + public byte[] encodeAsUTF8(String text) + { + // !!! TBI + return null; + } + + /* + /********************************************************** + /* Internal methods + /********************************************************** + */ + +}
diff --git a/src/java/org/codehaus/jackson/io/SerializedString.java b/src/java/org/codehaus/jackson/io/SerializedString.java index 13b1481..d89208b 100644 --- a/src/java/org/codehaus/jackson/io/SerializedString.java +++ b/src/java/org/codehaus/jackson/io/SerializedString.java
@@ -42,7 +42,7 @@ { char[] result = _quotedChars; if (result == null) { - // !!! TBI + result = JsonStringEncoder.getInstance().quoteAsString(_value); _quotedChars = result; } return null; @@ -56,7 +56,7 @@ { byte[] result = _unquotedUTF8Ref.get(); if (result == null) { - // !!! TBI + JsonStringEncoder.getInstance().encodeAsUTF8(_value); _unquotedUTF8Ref.set(result); } return null; @@ -70,7 +70,7 @@ { byte[] result = _quotedUTF8Ref.get(); if (result == null) { - // !!! TBI + JsonStringEncoder.getInstance().quoteAsUTF8(_value); _quotedUTF8Ref.set(result); } return null;