You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by yo...@apache.org on 2007/10/10 18:53:03 UTC

svn commit: r583538 - in /labs/noggit: ./ src/main/java/org/apache/noggit/ src/test/java/org/apache/noggit/

Author: yonik
Date: Wed Oct 10 09:53:02 2007
New Revision: 583538

URL: http://svn.apache.org/viewvc?rev=583538&view=rev
Log:
ability to get last parser event, prelim object builder, java5 support

Added:
    labs/noggit/src/main/java/org/apache/noggit/ObjectBuilder.java
    labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java
Modified:
    labs/noggit/pom.xml
    labs/noggit/src/main/java/org/apache/noggit/CharArr.java
    labs/noggit/src/main/java/org/apache/noggit/JSONParser.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/TestJSONParser.java

Modified: labs/noggit/pom.xml
URL: http://svn.apache.org/viewvc/labs/noggit/pom.xml?rev=583538&r1=583537&r2=583538&view=diff
==============================================================================
--- labs/noggit/pom.xml (original)
+++ labs/noggit/pom.xml Wed Oct 10 09:53:02 2007
@@ -16,7 +16,6 @@
     </dependency>
   </dependencies>
 
-  <!-- uncomment for Java5 support
   <build>
     <plugins>
       <plugin>
@@ -29,7 +28,6 @@
       </plugin>
     </plugins>
   </build>
-  -->
 
 </project>
 

Modified: labs/noggit/src/main/java/org/apache/noggit/CharArr.java
URL: http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/CharArr.java?rev=583538&r1=583537&r2=583538&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/CharArr.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/CharArr.java Wed Oct 10 09:53:02 2007
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.Writer;
 import java.nio.CharBuffer;
 
 // CharArr origins
@@ -33,11 +34,12 @@
 // Java5 version could look like the following:
 // public class CharArr implements CharSequence, Appendable, Readable, Closeable {
 
+
 /**
  * @author yonik
  * @version $Id$
  */
-public class CharArr {
+public class CharArr implements CharSequence, Appendable {
   protected char[] buf;
   protected int start;
   protected int end;
@@ -75,7 +77,7 @@
   }
 
   public CharArr subSequence(int start, int end) {
-    return new CharArr(buf, start, end);
+    return new CharArr(buf, this.start+start, this.start+end);
   }
 
   public int read() throws IOException {
@@ -83,12 +85,11 @@
     return buf[start++];
   }
 
-  public int read(char cbuf[], int off, int len) throws IOException {
-//TODO
+  public int read(char cbuf[], int off, int len) {
+   //TODO
     return 0;
   }
 
-
   public void unsafeWrite(char b) {
     buf[end++] = b;
   }
@@ -117,7 +118,7 @@
     unsafeWrite(b);
   }
 
-  public void write(int b) { write((char)b); }
+  public final void write(int b) { write((char)b); }
 
   public final void write(char[] b) {
     write(b,0,b.length);
@@ -132,23 +133,26 @@
     write(arr.buf, start, end-start);
   }
 
-  public void write(String s) {
-    reserve(s.length());
-    s.getChars(0,s.length(),buf,end);
-    end+=s.length();
+  public final void write(String s) {
+    write(s, 0, s.length());
+  }
+
+  public void write(String s, int stringOffset, int len) {
+    reserve(len);
+    s.getChars(stringOffset, len, buf, end);
+    end += len;
   }
 
   public void flush() {
   }
 
   public final void reset() {
-    start=end=0;
+    start = end = 0;
   }
 
-  public void close() throws IOException {
+  public void close() {
   }
 
-
   public char[] toCharArray() {
     char newbuf[] = new char[size()];
     System.arraycopy(buf, start, newbuf, 0, size());
@@ -187,13 +191,26 @@
     return 0;  // or -1?
   }
 
+  //////////////// Appendable methods /////////////
+  public final Appendable append(CharSequence csq) throws IOException {
+    return append(csq, 0, csq.length());
+  }
+
+  public Appendable append(CharSequence csq, int start, int end) throws IOException {
+    write(csq.subSequence(start, end).toString());
+    return null;
+  }
 
+  public final Appendable append(char c) throws IOException {
+    write(c);
+    return this;
+  }
 }
 
 
 class NullCharArr extends CharArr {
   public NullCharArr() {
-    super(null,0,0);
+    super(new char[1],0,0);
   }
   public void unsafeWrite(char b) {}
 
@@ -203,15 +220,22 @@
 
   public void write(char b) {}
 
-  public void write(String s) {}
-
   public void write(char b[], int off, int len) {}
 
-  public void write(int b) {}
-
   public void reserve(int num) {}
 
   protected void resize(int len) {}
+
+  public Appendable append(CharSequence csq, int start, int end) throws IOException {
+    return this;
+  }
+
+  public char charAt(int index) {
+    return 0;
+  }
+
+  public void write(String s, int stringOffset, int len) {
+  }
 }
 
 
@@ -261,3 +285,71 @@
   }
 
 }
+
+
+
+class CharArrWriter extends CharArr {
+  protected Writer sink;
+
+  @Override
+  public void flush() {
+    try {
+      sink.write(buf, start, end-start);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    start = end = 0;
+  }
+
+  @Override
+  public void write(char b) {
+   if (end >= buf.length) {
+     flush();
+   }
+   unsafeWrite(b);
+ }
+
+  @Override
+  public void write(char b[], int off, int len) {
+    int space = buf.length - end;
+    if (len < space) {
+      unsafeWrite(b, off, len);
+    } else if (len < buf.length) {
+      unsafeWrite(b, off, space);
+      flush();
+      unsafeWrite(b, off+space, len-space);
+    } else {
+      flush();
+      try {
+        sink.write(b, off, len);
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  @Override
+  public void write(String s, int stringOffset, int len) {
+    int space = buf.length - end;
+    if (len < space) {
+      s.getChars(stringOffset, stringOffset+len, buf, end);
+      end += len;
+    } else if (len < buf.length) {
+      // if the data to write is small enough, buffer it.
+      s.getChars(stringOffset, stringOffset+space, buf, end);
+      flush();
+      s.getChars(stringOffset+space, stringOffset+len, buf, 0);
+      end = len-space;
+    } else {
+      flush();
+      // don't buffer, just write to sink
+      try {
+        sink.write(s, stringOffset, len);
+      } catch (IOException e) {
+        throw new RuntimeException(e);
+      }
+
+    }
+  }
+}
+

Modified: labs/noggit/src/main/java/org/apache/noggit/JSONParser.java
URL: http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/JSONParser.java?rev=583538&r1=583537&r2=583538&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/JSONParser.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/JSONParser.java Wed Oct 10 09:53:02 2007
@@ -68,6 +68,7 @@
   boolean eof=false; // true if the end of the stream was reached.
   int gpos;          // global position = gpos + start
 
+  int event;         // last event read
 
   public JSONParser(Reader in) {
     this(in, new char[8192]);
@@ -96,6 +97,8 @@
 
   public JSONParser(String data, int start, int end) {
     this.in = null;
+    this.start = start;
+    this.end = end;
     this.buf = new char[end-start];
     data.getChars(start,end,buf,0);
   }
@@ -576,31 +579,31 @@
     int ch;   // TODO: factor out getCharNWS() to here and check speed
     switch (state) {
       case 0:
-        return next(getCharNWS());
+        return event = next(getCharNWS());
       case DID_OBJSTART:
         ch = getCharNWS();
         if (ch=='}') {
           pop();
-          return OBJECT_END;
+          return event = OBJECT_END;
         }
         if (ch != '"') {
           throw err("Expected string");
         }
         state = DID_MEMNAME;
         valstate = STRING;
-        return STRING;
+        return event = STRING;
       case DID_MEMNAME:
         ch = getCharNWS();
         if (ch!=':') {
           throw err("Expected key,value separator ':'");
         }
         state = DID_MEMVAL;  // set state first because it might be pushed...
-        return next(getChar());
+        return event = next(getChar());
       case DID_MEMVAL:
         ch = getCharNWS();
         if (ch=='}') {
           pop();
-          return OBJECT_END;
+          return event = OBJECT_END;
         } else if (ch!=',') {
           throw err("Expected ',' or '}'");
         }
@@ -610,27 +613,31 @@
         }
         state = DID_MEMNAME;
         valstate = STRING;
-        return STRING;
+        return event = STRING;
       case DID_ARRSTART:
         ch = getCharNWS();
         if (ch==']') {
           pop();
-          return ARRAY_END;
+          return event = ARRAY_END;
         }
         state = DID_ARRELEM;  // set state first, might be pushed...
-        return next(ch);
+        return event = next(ch);
       case DID_ARRELEM:
         ch = getCharNWS();
         if (ch==']') {
           pop();
-          return ARRAY_END;
+          return event = ARRAY_END;
         } else if (ch!=',') {
           throw err("Expected ',' or ']'");
         }
         // state = DID_ARRELEM;
-        return next(getChar());
+        return event = next(getChar());
     }
     return 0;
+  }
+
+  public int lastEvent() {
+    return event;
   }
 
 

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=583538&r1=583537&r2=583538&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/JSONWriter.java Wed Oct 10 09:53:02 2007
@@ -17,6 +17,8 @@
 
 package org.apache.noggit;
 
+import java.util.HashMap;
+
 /**
  * @author yonik
  * @version $Id$
@@ -52,6 +54,15 @@
     JSONUtil.writeString(str,out);
   }
 
+  public void writeStringStart() {
+  }
+
+  public void writeStringChars(CharArr partialStr) {
+  }
+
+  public void writeStringEnd() {
+  }
+
   public void write(long number) {
     JSONUtil.writeNumber(number,out);
   }
@@ -68,6 +79,9 @@
     out.write(digits);
   }
 
+  public void writePartialNumber(CharArr digits) {
+  }
+
   public void startObject() {
     out.write('{');
   }
@@ -94,4 +108,61 @@
 
 }
 
+/***
+class JSONSerializer {
+  private static final HashMap map = new HashMap();
+
+  public abstract static class Handler {
+    public abstract void handle(JSONSerializer serializer, Object val);
+  }
+
+  static {
+    map.put(String.class, new Handler() {
+      public void handle(JSONSerializer serializer, Object val) {
+        serializer.writeString((String)val);
+      }
+    } );
+
+
+  }
+
+
+  public static void toJSON(Object o) {
+  }
+
+  public void write(Object o) {
+
+
+  }
+
+
+}
+***/
+
+class JSONSerializer2 {
+  // need any interaction with parser??
+  // does this need to be a class, or is a static method fine?
+
+  // JS.toJSON(myObj)
+  //
+  // Simple methods...
+  // JSON.toJSON(myObj)
+  // JSON.toObj(String json)
+  //
 
+
+  protected final TextWriter writer;
+  public JSONSerializer2(TextWriter writer) {
+    this.writer = writer;
+  }
+
+  public static void toJSON(Object o) {
+  }
+
+  public void write(Object o) {
+
+
+  }
+
+
+}

Added: labs/noggit/src/main/java/org/apache/noggit/ObjectBuilder.java
URL: http://svn.apache.org/viewvc/labs/noggit/src/main/java/org/apache/noggit/ObjectBuilder.java?rev=583538&view=auto
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/ObjectBuilder.java (added)
+++ labs/noggit/src/main/java/org/apache/noggit/ObjectBuilder.java Wed Oct 10 09:53:02 2007
@@ -0,0 +1,155 @@
+/**
+ * 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.noggit;
+
+import java.util.*;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+public class ObjectBuilder {
+
+  public static Object fromJSON(String json) throws IOException {
+    JSONParser p = new JSONParser(json);
+    return getVal(p);
+  }
+
+  public static Object getVal(JSONParser parser) throws IOException {
+    return new ObjectBuilder(parser).getVal();
+  }
+
+  final JSONParser parser;
+  
+  public ObjectBuilder(JSONParser parser) throws IOException {
+    this.parser = parser;
+    if (parser.lastEvent()==0) parser.nextEvent();
+  }
+
+
+  public Object getVal() throws IOException {
+    int ev = parser.lastEvent();
+    switch(ev) {
+      case JSONParser.STRING: return getString();
+      case JSONParser.LONG: return getLong();
+      case JSONParser.NUMBER: return getNumber();
+      case JSONParser.BIGNUMBER: return getBigNumber();
+      case JSONParser.BOOLEAN: return getBoolean();
+      case JSONParser.NULL: return getNull();
+      case JSONParser.OBJECT_START: return getObject();
+      case JSONParser.OBJECT_END: return null; // OR ERROR?
+      case JSONParser.ARRAY_START: return getArray();
+      case JSONParser.ARRAY_END: return  null; // OR ERROR?
+      case JSONParser.EOF: return null; // OR ERROR?
+      default: return null; // OR ERROR?
+    }
+  }
+
+
+  public Object getString() throws IOException {
+    return parser.getString();    
+  }
+
+  public Object getLong() throws IOException {
+    return Long.valueOf(parser.getLong());    
+  }
+
+  public Object getNumber() throws IOException {
+    CharArr num = parser.getNumberChars();
+    String numstr = num.toString();
+    double d = Double.parseDouble(numstr);
+    if (!Double.isInfinite(d)) return Double.valueOf(d);
+    // TODO: use more efficient constructor in Java5
+    return new BigDecimal(numstr);
+  }
+
+  public Object getBigNumber() throws IOException {
+    CharArr num = parser.getNumberChars();
+    String numstr = num.toString();
+    for(int ch; (ch=num.read())!=-1;) {
+      if (ch=='.' || ch=='e' || ch=='E') return new BigDecimal(numstr);
+    }
+    return new BigInteger(numstr);
+  }
+
+  public Object getBoolean() throws IOException {
+    parser.getNull();
+    return null;
+  }
+
+  public Object getNull() throws IOException {
+    parser.getNull();
+    return null;
+  }
+
+  public Object newObject() throws IOException {
+    return new LinkedHashMap();
+  }
+
+  public Object getKey() throws IOException {
+    return parser.getString();
+  }
+
+  public void addKeyVal(Object map, Object key, Object val) throws IOException {
+    Object prev = ((Map)map).put(key,val);
+    // TODO: test for repeated value?
+  }
+
+  public Object objectEnd(Object obj) {
+    return obj;
+  }
+
+
+  public Object getObject() throws IOException {
+    Object m = newObject();
+    for(;;) {
+      int ev = parser.nextEvent();
+      if (ev==JSONParser.OBJECT_END) return objectEnd(m);
+      Object key = getKey();
+      ev = parser.nextEvent();      
+      Object val = getVal();
+      addKeyVal(m, key, val);
+    }
+  }
+
+  public Object newArray() {
+    return new ArrayList();
+  }
+
+  public void addArrayVal(Object arr, Object val) throws IOException {
+    ((List)arr).add(val);
+  }
+
+  public Object endArray(Object arr) {
+    return arr;
+  }
+  
+  public Object getArray() throws IOException {
+    Object arr = newArray();
+    for(;;) {
+      int ev = parser.nextEvent();
+      if (ev==JSONParser.ARRAY_END) return endArray(arr);
+      Object val = getVal();
+      addArrayVal(arr, val);
+    }
+  }
+
+}

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=583538&r1=583537&r2=583538&view=diff
==============================================================================
--- labs/noggit/src/main/java/org/apache/noggit/TextWriter.java (original)
+++ labs/noggit/src/main/java/org/apache/noggit/TextWriter.java Wed Oct 10 09:53:02 2007
@@ -32,6 +32,10 @@
 
   public abstract void writeString(CharArr str);
 
+  public abstract void writeStringStart();
+  public abstract void writeStringChars(CharArr partialStr);
+  public abstract void writeStringEnd();
+
   public abstract void write(long number);
 
   public abstract void write(double number);
@@ -39,6 +43,8 @@
   public abstract void write(boolean bool);
 
   public abstract void writeNumber(CharArr digits);
+
+  public abstract void writePartialNumber(CharArr digits);
 
   public abstract void startObject();
 

Modified: labs/noggit/src/test/java/org/apache/noggit/TestJSONParser.java
URL: http://svn.apache.org/viewvc/labs/noggit/src/test/java/org/apache/noggit/TestJSONParser.java?rev=583538&r1=583537&r2=583538&view=diff
==============================================================================
--- labs/noggit/src/test/java/org/apache/noggit/TestJSONParser.java (original)
+++ labs/noggit/src/test/java/org/apache/noggit/TestJSONParser.java Wed Oct 10 09:53:02 2007
@@ -393,4 +393,15 @@
   }
 
 
+
+  public void testAPI() throws IOException {
+    JSONParser p = new JSONParser("[1,2]");
+    assertEquals(JSONParser.ARRAY_START, p.nextEvent());
+    // no nextEvent for the next objects...
+    assertEquals(1,p.getLong());
+    assertEquals(2,p.getLong());
+    
+
+  }
+
 }

Added: 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=583538&view=auto
==============================================================================
--- labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java (added)
+++ labs/noggit/src/test/java/org/apache/noggit/TestObjectBuilder.java Wed Oct 10 09:53:02 2007
@@ -0,0 +1,68 @@
+/**
+ * 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.noggit;
+
+import junit.framework.TestCase;
+
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * @author yonik
+ * @version $Id$
+ */
+public class TestObjectBuilder extends TestCase {
+
+  public void test(String val, Object expected) throws IOException {
+    val = val.replace('\'','"');
+    JSONParser p = TestJSONParser.getParser(val);
+    Object v = ObjectBuilder.getVal(p);
+    assertEquals(expected,v);
+  }
+
+  public static List A(Object... lst) {
+     return Arrays.asList(lst);
+  }
+  public static Map O(Object... lst) {
+    LinkedHashMap map = new LinkedHashMap();
+    for (int i=0; i<lst.length; i+=2) {
+      map.put(lst[i].toString(), lst[i+1]);
+    }
+    return map;
+  }
+
+  public void testVariations(String str, Object expected) throws IOException {
+    test("["+str+"]", A(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)));
+
+  }
+
+  public void testBuilder() throws IOException {
+    testVariations("[]", A());
+    testVariations("[]", A());
+    testVariations("{}", O());
+    testVariations("[[]]", A(A()));
+    testVariations("{'foo':{}}", O("foo",O()));
+
+
+  }
+
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org