From f4f596ec3daee1cb1890d4655c7f7ca15b557df3 Mon Sep 17 00:00:00 2001 From: Inderjeet Singh Date: Wed, 12 Aug 2009 21:01:42 +0000 Subject: [PATCH] Made JsonParser implement Iterator --- .../java/com/google/gson/JsonParserAsync.java | 31 ++++++++++++++++--- .../com/google/gson/JsonParserAsyncTest.java | 16 ++++++++-- .../gson/functional/ReadersWritersTest.java | 11 ++++--- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/gson/src/main/java/com/google/gson/JsonParserAsync.java b/gson/src/main/java/com/google/gson/JsonParserAsync.java index ef4015b6..62e2b2a7 100644 --- a/gson/src/main/java/com/google/gson/JsonParserAsync.java +++ b/gson/src/main/java/com/google/gson/JsonParserAsync.java @@ -18,18 +18,21 @@ package com.google.gson; import java.io.EOFException; import java.io.Reader; import java.io.StringReader; +import java.util.Iterator; /** * A parser that allows reading of multiple {@link JsonElement}s from the specified reader - * asynchronously. + * asynchronously. This class is not thread-safe. * * @author Inderjeet Singh * @author Joel Leitch * @since 1.4 */ -public final class JsonParserAsync { +public final class JsonParserAsync implements Iterator { private final JsonParserJavacc parser; + private boolean eof; + private JsonElement nextElement; /** * @param json The string containing JSON elements concatenated to each other. @@ -45,6 +48,8 @@ public final class JsonParserAsync { */ public JsonParserAsync(Reader reader) { parser = new JsonParserJavacc(reader); + eof = false; + nextElement = null; } /** @@ -54,7 +59,15 @@ public final class JsonParserAsync { * @throws JsonParseException if the incoming stream is malformed JSON. * @since 1.4 */ - public JsonElement nextElement() throws JsonParseException { + public JsonElement next() throws JsonParseException { + if (eof) { + return null; + } + if (nextElement != null) { + JsonElement returnValue = nextElement; + nextElement = null; + return returnValue; + } try { JsonElement element = parser.parse(); return element; @@ -68,10 +81,20 @@ public final class JsonParserAsync { throw new JsonParseException("Failed parsing JSON source to Json", e); } catch (JsonParseException e) { if (e.getCause() instanceof EOFException) { + eof = true; return null; } else { throw e; } } - } + } + + public boolean hasNext() { + nextElement = next(); + return nextElement != null; + } + + public void remove() { + throw new UnsupportedOperationException(); + } } diff --git a/gson/src/test/java/com/google/gson/JsonParserAsyncTest.java b/gson/src/test/java/com/google/gson/JsonParserAsyncTest.java index 648400e0..cc615286 100644 --- a/gson/src/test/java/com/google/gson/JsonParserAsyncTest.java +++ b/gson/src/test/java/com/google/gson/JsonParserAsyncTest.java @@ -1,5 +1,8 @@ package com.google.gson; +import java.util.Enumeration; +import java.util.Iterator; + import junit.framework.TestCase; /** @@ -11,9 +14,18 @@ public class JsonParserAsyncTest extends TestCase { public void testParseTwoStrings() { JsonParserAsync parser = new JsonParserAsync("'one' 'two'"); - String actualOne = parser.nextElement().getAsString(); + String actualOne = parser.next().getAsString(); assertEquals("one", actualOne); - String actualTwo = parser.nextElement().getAsString(); + String actualTwo = parser.next().getAsString(); assertEquals("two", actualTwo); } + + public void testIterator() { + Iterator parser = new JsonParserAsync("'one' 'two'"); + assertTrue(parser.hasNext()); + assertEquals("one", parser.next().getAsString()); + assertTrue(parser.hasNext()); + assertEquals("two", parser.next().getAsString()); + assertFalse(parser.hasNext()); + } } diff --git a/gson/src/test/java/com/google/gson/functional/ReadersWritersTest.java b/gson/src/test/java/com/google/gson/functional/ReadersWritersTest.java index cd06a736..9b925802 100644 --- a/gson/src/test/java/com/google/gson/functional/ReadersWritersTest.java +++ b/gson/src/test/java/com/google/gson/functional/ReadersWritersTest.java @@ -93,9 +93,9 @@ public class ReadersWritersTest extends TestCase { writer.write(gson.toJson("two").toCharArray()); CharArrayReader reader = new CharArrayReader(writer.toCharArray()); JsonParserAsync parser = new JsonParserAsync(reader); - String actualOne = gson.fromJson(parser.nextElement(), String.class); + String actualOne = gson.fromJson(parser.next(), String.class); assertEquals("one", actualOne); - String actualTwo = gson.fromJson(parser.nextElement(), String.class); + String actualTwo = gson.fromJson(parser.next(), String.class); assertEquals("two", actualTwo); } @@ -108,10 +108,11 @@ public class ReadersWritersTest extends TestCase { writer.write(gson.toJson(expectedTwo).toCharArray()); CharArrayReader reader = new CharArrayReader(writer.toCharArray()); JsonParserAsync parser = new JsonParserAsync(reader); - BagOfPrimitives actualOne = gson.fromJson(parser.nextElement(), BagOfPrimitives.class); + BagOfPrimitives actualOne = gson.fromJson(parser.next(), BagOfPrimitives.class); assertEquals("one", actualOne.stringValue); - BagOfPrimitives actualTwo = gson.fromJson(parser.nextElement(), BagOfPrimitives.class); + BagOfPrimitives actualTwo = gson.fromJson(parser.next(), BagOfPrimitives.class); assertEquals("two", actualTwo.stringValue); - JsonElement jsonElement = parser.nextElement(); + JsonElement jsonElement = parser.next(); + assertNull(jsonElement); } }