Author: yonik
Date: Thu Feb 10 21:41:43 2011
New Revision: 1069578

URL: http://svn.apache.org/viewvc?rev=1069578&view=rev
Log:
merge TextSerializer into TextWriter, add better support for serializing common 
objects, fix an infinite recursion bug when serializing Object[]

Removed:
    labs/noggit/src/main/java/org/apache/noggit/TextSerializer.java
Modified:
    labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java
    labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java
    labs/noggit/src/main/java/org/apache/noggit/TextWriter.java
    labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java

Modified: labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java
URL: 
http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/JSONUtil.java Thu Feb 10 
21:41:43 2011
@@ -35,18 +35,24 @@ public class JSONUtil {
   public static final char ARRAY_END = ']';
 
   public static String toJSON(Object o) {
-       CharArr out = new CharArr();
-    new TextSerializer().serialize(new JSONWriter(out), o);
+    CharArr out = new CharArr();
+    new JSONWriter(out).write(o);
     return out.toString();
-
   }
 
 
+  public static void writeNumber(int number, CharArr out) {
+    out.write(Integer.toString(number));
+  }
 
   public static void writeNumber(long number, CharArr out) {
     out.write(Long.toString(number));
   }
 
+  public static void writeNumber(float number, CharArr out) {
+    out.write(Float.toString(number));
+  }
+
   public static void writeNumber(double number, CharArr out) {
     out.write(Double.toString(number));
   }

Modified: labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java
URL: 
http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java Thu Feb 10 
21:41:43 2011
@@ -70,14 +70,27 @@ public class JSONWriter extends TextWrit
     JSONUtil.writeNumber(number,out);
   }
 
+  public void write(int number) {
+    JSONUtil.writeNumber(number,out);
+  }
+
   public void write(double number) {
     JSONUtil.writeNumber(number,out);
   }
 
+  public void write(float number) {
+    JSONUtil.writeNumber(number,out);
+  }
+
   public void write(boolean bool) {
     JSONUtil.writeBoolean(bool,out);
   }
 
+  @Override
+  public void write(char[] val) {
+    JSONUtil.writeString(val, 0, val.length, out);
+  }
+
   public void writeNumber(CharArr digits) {
     out.write(digits);
   }

Modified: labs/noggit/src/main/java/org/apache/noggit/TextWriter.java
URL: 
http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/TextWriter.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/TextWriter.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/TextWriter.java Thu Feb 10 
21:41:43 2011
@@ -35,11 +35,21 @@ public abstract class TextWriter {
   public abstract void writeStringEnd();
 
   public abstract void write(long number);
+  public abstract void write(int number);
+  public void write(short number) { write ((int)number); }
+  public void write(byte number) { write((int)number); }
 
   public abstract void write(double number);
+  public abstract void write(float number);
 
   public abstract void write(boolean bool);
 
+
+  /** A char[] may be either be a string, or a list of characters.
+   * It's up to the implementation to decide.
+   */
+  public abstract void write(char[] val);
+
   public abstract void writeNumber(CharArr digits);
   
   public abstract void writePartialNumber(CharArr digits);
@@ -56,6 +66,180 @@ public abstract class TextWriter {
 
   public abstract void writeNameSeparator();
 
-  // void writeNameValue(String name, Object val)?
+  public void write(Object o) {
+    if (o == null) {
+      writeNull();
+    } else if (o instanceof CharSequence) {
+      writeString((CharSequence)o);
+    } else if (o instanceof Number) {
+      if (o instanceof Integer || o instanceof Long) {
+        write(((Number)o).longValue());
+      } else if (o instanceof Float || o instanceof Double) {
+        write(((Number)o).doubleValue());
+      } else {
+        CharArr arr = new CharArr();
+        arr.write(o.toString());
+        writeNumber(arr);
+      }
+    } else if (o instanceof Map) {
+      write((Map)o);
+    } else if (o instanceof Collection) {
+      write((Collection)o);
+    } else if (o instanceof Object[]) {
+      write(Arrays.asList((Object[])o));
+    } else if (o instanceof Boolean) {
+      write(((Boolean)o).booleanValue());
+    } else if (o instanceof int[]) {
+      write((int[])o);
+    } else if (o instanceof float[]) {
+      write((float[])o);
+    } else if (o instanceof long[]) {
+      write((long[])o);
+    } else if (o instanceof double[]) {
+      write((double[])o);
+    } else if (o instanceof short[]) {
+      write((short[])o);
+    } else if (o instanceof boolean[]) {
+      write((boolean[])o);
+    } else if (o instanceof char[]) {
+      write((char[])o);
+    } else if (o instanceof byte[]) {
+      write((byte[])o);
+    } else {
+      writeString(o.toString());
+    }
+  }
+
+  public void write(Map val) {
+    startObject();
+    boolean first = true;
+    for (Map.Entry entry : (Set<Map.Entry>)val.entrySet()) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      writeString(entry.getKey().toString());
+      writeNameSeparator();
+      write(entry.getValue());
+    }
+    endObject();
+  }
+
+  public void write(Collection val) {
+    startArray();
+    boolean first = true;
+    for (Object o : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(o);
+    }
+    endArray();
+  }
+
+  /** A byte[] may be either a single logical value, or a list of small 
integers.
+   * It's up to the implementation to decide.
+   */
+  public void write(byte[] val) {
+    startArray();
+    boolean first = true;
+    for (short v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
+  public void write(short[] val) {
+    startArray();
+    boolean first = true;
+    for (short v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
+  public void write(int[] val) {
+    startArray();
+    boolean first = true;
+    for (int v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
+  public void write(long[] val) {
+    startArray();
+    boolean first = true;
+    for (long v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
+  public void write(float[] val) {
+    startArray();
+    boolean first = true;
+    for (float v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
+  public void write(double[] val) {
+    startArray();
+    boolean first = true;
+    for (double v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
+  public void write(boolean[] val) {
+    startArray();
+    boolean first = true;
+    for (boolean v : val) {
+      if (first) {
+        first = false;
+      } else {
+        writeValueSeparator();
+      }
+      write(v);
+    }
+    endArray();
+  }
+
 }
 

Modified: labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java
URL: 
http://svn.apache.org/viewvc/labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java?rev=1069578&r1=1069577&r2=1069578&view=diff
==============================================================================
--- labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java 
(original)
+++ labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java Thu Feb 
10 21:41:43 2011
@@ -30,8 +30,7 @@ public class TestObjectBuilder extends T
 
   public void test(String val, Object expected) throws IOException {
     val = val.replace('\'','"');
-    JSONParser p = TestJSONParser.getParser(val);
-    Object v = ObjectBuilder.getVal(p);
+    Object v = ObjectBuilder.fromJSON(val);
 
     String s1 = JSONUtil.toJSON(v);
     String s2 = JSONUtil.toJSON(expected);
@@ -44,9 +43,12 @@ public class TestObjectBuilder extends T
     assertEquals(s1, s3);
   }
 
-  public static List A(Object... lst) {
+  public static List L(Object... lst) {
      return Arrays.asList(lst);
   }
+  public static Object[] A(Object... lst) {
+     return lst;
+  }
   public static Map O(Object... lst) {
     LinkedHashMap map = new LinkedHashMap();
     for (int i=0; i<lst.length; i+=2) {
@@ -56,21 +58,33 @@ public class TestObjectBuilder extends T
   }
 
   public void testVariations(String str, Object expected) throws IOException {
-    test("["+str+"]", A(expected));
-    test("["+str+","+str+"]", A(expected,expected));
+    test("["+str+"]", L(expected));
+    test("["+str+","+str+"]", L(expected, expected));
+    test("["+str+","+str+"]", A(expected, expected));
     test("{'foo':"+str+"}", O("foo",expected));
-    test("{'foo':"+str+",'bar':{'a':"+str+"},'baz':["+str+"]}",
-            O("foo",expected,"bar",O("a",expected),"baz",A(expected)));
+    test("{'foo':"+str+",'bar':{'a':"+str+"},'baz':["+str+"],'zzz':["+str+"]}",
+            O("foo",expected,"bar",O("a",expected),"baz", L(expected), "zzz", 
A(expected)));
 
   }
 
   public void testBuilder() throws IOException {
-    testVariations("[]", A());
-    testVariations("[]", A());
+    testVariations("[]", L());
+    testVariations("[]", L());
     testVariations("{}", O());
-    testVariations("[[]]", A(A()));
+    testVariations("[[]]", L(L()));
     testVariations("{'foo':{}}", O("foo",O()));
-    testVariations("[false,true,1,1.4,null,'hi']", 
A(false,true,1,1.4,null,"hi"));
+    testVariations("[false,true,1,1.4,null,'hi']", L(false, true, 1, 1.4, 
null, "hi"));
+    testVariations("'hello'", "hello".toCharArray());
+
+    // test array types
+    testVariations("[[10,20],['a','b']]", L(A(10,20),A("a","b")));
+    testVariations("[1,2,3]", new int[]{1,2,3});
+    testVariations("[1,2,3]", new long[]{1,2,3});
+    testVariations("[1.0,2.0,3.0]", new float[]{1,2,3});
+    testVariations("[1.0,2.0,3.0]", new double[]{1,2,3});
+    testVariations("[1,2,3]", new short[]{1,2,3});
+    testVariations("[1,2,3]", new byte[]{1,2,3});
+    testVariations("[false,true,false]", new boolean[]{false,true,false});
   }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to