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