JSONRestReader#end() should skip remaining attributes/entries

If the current object has more unread attributes, or the current
array has more unread entries, JSONRestReader#end() should skip
them instead of failing with an IllegalStateException.

Change-Id: Ia132a3925a335f24063b606eb77d909dcb6b64dd
Signed-off-by: Michael Ochmann <michael.ochmann@sap.com>
diff --git a/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java b/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java
index b440796..53c6e4c 100644
--- a/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java
+++ b/org.eclipse.skalli.core.test/src/main/java/org/eclipse/skalli/core/rest/JSONRestReaderTest.java
@@ -267,6 +267,23 @@
         json.end();
     }
 
+    @Test
+    public void testSkipUnreadObjectAttributesAtEnd() throws Exception {
+        JSONRestReader json = getRestReader("{\"a\":\"string\",\"b\":\"string\"}");
+        json.object();
+            assertEquals("a", json.key());
+            assertEquals("string", json.valueString());
+        json.end(); // must not fail!
+    }
+
+    @Test
+    public void testSkipUnreadArrayEntriesAtEnd() throws Exception {
+        JSONRestReader json = getRestReader("[\"a\",\"b\"]");
+        json.array();
+            assertEquals("a", json.valueString());
+        json.end(); // must not fail!
+    }
+
     @Test(expected=IllegalStateException.class)
     public void testUnexpectedEnd() throws Exception {
         JSONRestReader json = getRestReader("{\"a\":\"string\"}");
diff --git a/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java b/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java
index a6f543d..36f5eed 100644
--- a/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java
+++ b/org.eclipse.skalli.core/src/main/java/org/eclipse/skalli/core/rest/JSONRestReader.java
@@ -351,8 +351,10 @@
         }
         state = states.pop();
         if (state == STATE_ARRAY) {
+            skipMore();
             json.endArray();
         } else if (state == STATE_OBJECT) {
+            skipMore();
             json.endObject();
         } else if (state == STATE_INITIAL) {
             throw new IllegalStateException("Still in initial state");
@@ -392,4 +394,10 @@
             json.skipValue();
         }
     }
+
+    private void skipMore() throws IOException {
+        while (hasMore()) {
+            skip();
+        }
+    }
 }