OSDN Git Service

JSONPullParser
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Mon, 1 Jun 2009 08:26:08 +0000 (08:26 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Mon, 1 Jun 2009 08:26:08 +0000 (08:26 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@3346 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

src/main/java/org/xerial/json/JSONPullParser.java
src/test/java/org/xerial/json/JSONStreamReaderTest.java

index 13e8623..d9e9bd8 100644 (file)
@@ -27,13 +27,14 @@ package org.xerial.json;
 import java.io.IOException;\r
 import java.io.InputStream;\r
 import java.io.Reader;\r
-import java.util.LinkedList;\r
 \r
 import org.antlr.runtime.ANTLRInputStream;\r
 import org.antlr.runtime.ANTLRReaderStream;\r
 import org.antlr.runtime.ANTLRStringStream;\r
+import org.antlr.runtime.CharStream;\r
 import org.antlr.runtime.Token;\r
 import org.xerial.json.impl.JSONLexer;\r
+import org.xerial.util.ArrayDeque;\r
 import org.xerial.util.log.Logger;\r
 \r
 /**\r
@@ -49,35 +50,65 @@ public class JSONPullParser
     }\r
 \r
     private static Logger _logger = Logger.getLogger(JSONPullParser.class);\r
-    private JSONLexer _lexer;\r
-    private LinkedList<ParseState> parseStateStack = new LinkedList<ParseState>();\r
+    private JSONLexer _lexer = new JSONLexer();\r
+\r
+    private ArrayDeque<ParseState> parseStateStack = new ArrayDeque<ParseState>();\r
+    private ArrayDeque<String> keyStack = new ArrayDeque<String>();\r
+\r
     private JSONPullParserEvent lastReportedEvent = null;\r
-    private LinkedList<String> keyStack = new LinkedList<String>();\r
     private int currentDepth = 0;\r
 \r
     public JSONPullParser(String jsonString)\r
     {\r
-        this(new JSONLexer(new ANTLRStringStream(jsonString)));\r
+        reset(jsonString);\r
     }\r
 \r
     public JSONPullParser(JSONObject jsonObject)\r
     {\r
-        this(new JSONLexer(new ANTLRStringStream(jsonObject.toJSONString())));\r
+        reset(jsonObject);\r
     }\r
 \r
     public JSONPullParser(InputStream jsonStream) throws IOException\r
     {\r
-        this(new JSONLexer(new ANTLRInputStream(jsonStream)));\r
+        reset(jsonStream);\r
     }\r
 \r
     public JSONPullParser(Reader reader) throws IOException\r
     {\r
-        this(new JSONLexer(new ANTLRReaderStream(reader)));\r
+        reset(reader);\r
+    }\r
+\r
+    public void reset(String jsonString)\r
+    {\r
+        reset(new ANTLRStringStream(jsonString));\r
     }\r
 \r
-    protected JSONPullParser(JSONLexer lexer)\r
+    public void reset(JSONObject jsonObject)\r
     {\r
-        _lexer = lexer;\r
+        reset(new ANTLRStringStream(jsonObject.toJSONString()));\r
+    }\r
+\r
+    public void reset(InputStream jsonStream) throws IOException\r
+    {\r
+        reset(new ANTLRInputStream(jsonStream));\r
+    }\r
+\r
+    public void reset(Reader reader) throws IOException\r
+    {\r
+        reset(new ANTLRReaderStream(reader));\r
+    }\r
+\r
+    private void reset(CharStream newStream)\r
+    {\r
+        _lexer.reset();\r
+        _lexer.setCharStream(newStream);\r
+\r
+        parseStateStack.clear();\r
+        keyStack.clear();\r
+\r
+        lastReportedEvent = null;\r
+        currentDepth = 0;\r
+\r
         parseStateStack.addLast(ParseState.Root);\r
     }\r
 \r
@@ -116,7 +147,7 @@ public class JSONPullParser
         // _logger.trace("pop : " + StringUtil.join(parseStateStack, ", "));\r
     }\r
 \r
-    private void keyedValueTest()\r
+    private void valueWithKeyTest()\r
     {\r
         if (getCurrentParseState() == ParseState.Key)\r
             pushParseState(ParseState.KeyedValue);\r
@@ -259,7 +290,7 @@ public class JSONPullParser
             switch (tokenType)\r
             {\r
             case JSONLexer.LBrace:\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 currentDepth++;\r
                 pushParseState(ParseState.InObject);\r
                 return reportEvent(token, JSONEvent.StartObject);\r
@@ -270,7 +301,7 @@ public class JSONPullParser
                 popKeyStack();\r
                 return reportEvent(token, JSONEvent.EndObject);\r
             case JSONLexer.LBracket:\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 currentDepth++;\r
                 pushParseState(ParseState.InArray);\r
                 return reportEvent(token, JSONEvent.StartArray);\r
@@ -295,20 +326,20 @@ public class JSONPullParser
                     keyStack.addLast(removeDoubleQuotation(token.getText()));\r
                     continue;\r
                 }\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 return reportEvent(token, JSONEvent.String);\r
             case JSONLexer.Integer:\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 return reportEvent(token, JSONEvent.Integer);\r
             case JSONLexer.Double:\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 return reportEvent(token, JSONEvent.Double);\r
             case JSONLexer.TRUE:\r
             case JSONLexer.FALSE:\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 return reportEvent(token, JSONEvent.Boolean);\r
             case JSONLexer.NULL:\r
-                keyedValueTest();\r
+                valueWithKeyTest();\r
                 return reportEvent(token, JSONEvent.Null);\r
             }\r
         }\r
index 4564011..b9485a5 100644 (file)
@@ -26,8 +26,6 @@ package org.xerial.json;
 
 import static org.junit.Assert.*;
 
-import java.io.StringReader;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -111,12 +109,13 @@ public class JSONStreamReaderTest
 
         StopWatch timer = new StopWatch();
 
+        JSONPullParser parser = new JSONPullParser(json);
         for (int n = 0; n < 500; n++)
         {
-            JSONStreamReader reader = new JSONStreamReader(new StringReader(json));
+            parser.reset(json);
 
-            TreeEvent e;
-            while ((e = reader.next()) != null)
+            JSONEvent e;
+            while ((e = parser.next()) != JSONEvent.EndJSON)
             {}
 
         }