You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2019/07/01 12:33:55 UTC

[johnzon] branch master updated: completing previous commit, some missed case

This is an automated email from the ASF dual-hosted git repository.

rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git


The following commit(s) were added to refs/heads/master by this push:
     new 440300a  completing previous commit, some missed case
440300a is described below

commit 440300a32f7a7c96dc4f07ce08846315e60ecbc9
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Mon Jul 1 14:33:45 2019 +0200

    completing previous commit, some missed case
---
 .../johnzon/jsonb/JsonValueParserAdapter.java      |  12 +-
 .../serializer/JohnzonDeserializationContext.java  |  33 +-----
 .../johnzon/mapper/jsonp/RewindableJsonParser.java | 127 +++++++++++++++++++++
 3 files changed, 142 insertions(+), 30 deletions(-)

diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonValueParserAdapter.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonValueParserAdapter.java
index 803f679..97effb9 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonValueParserAdapter.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonValueParserAdapter.java
@@ -28,6 +28,8 @@ import javax.json.stream.JsonLocation;
 import javax.json.stream.JsonParser;
 import javax.json.stream.JsonParserFactory;
 
+import org.apache.johnzon.mapper.jsonp.RewindableJsonParser;
+
 class JsonValueParserAdapter<T extends JsonValue> implements JsonParser {
     
     private static class JsonStringParserAdapter extends JsonValueParserAdapter<JsonString> {
@@ -69,7 +71,13 @@ class JsonValueParserAdapter<T extends JsonValue> implements JsonParser {
         }
     }
     
-    public static JsonParser createFor(JsonValue jsonValue, Supplier<JsonParserFactory> parserFactoryProvider) {
+    public static JsonParser createFor(final JsonValue jsonValue,
+                                       final Supplier<JsonParserFactory> parserFactoryProvider) {
+        return new RewindableJsonParser(doCreate(jsonValue, parserFactoryProvider));
+    }
+
+    private static JsonParser doCreate(final JsonValue jsonValue,
+                                       final Supplier<JsonParserFactory> parserFactoryProvider) {
         switch (jsonValue.getValueType()) {
             case OBJECT: return parserFactoryProvider.get().createParser(jsonValue.asJsonObject());
             case ARRAY: return parserFactoryProvider.get().createParser(jsonValue.asJsonArray());
@@ -78,7 +86,7 @@ class JsonValueParserAdapter<T extends JsonValue> implements JsonParser {
             default: return new JsonValueParserAdapter<>(jsonValue);
         }
     }
-    
+
     private final T jsonValue;
     
     JsonValueParserAdapter(T jsonValue) {
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
index 3620f4f..65b1595 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/serializer/JohnzonDeserializationContext.java
@@ -22,9 +22,7 @@ import java.lang.reflect.Type;
 
 import javax.json.JsonArrayBuilder;
 import javax.json.JsonBuilderFactory;
-import javax.json.JsonNumber;
 import javax.json.JsonObjectBuilder;
-import javax.json.JsonString;
 import javax.json.JsonValue;
 import javax.json.bind.serializer.DeserializationContext;
 import javax.json.spi.JsonProvider;
@@ -32,6 +30,7 @@ import javax.json.stream.JsonParser;
 import javax.json.stream.JsonParsingException;
 
 import org.apache.johnzon.mapper.MappingParser;
+import org.apache.johnzon.mapper.jsonp.RewindableJsonParser;
 
 public class JohnzonDeserializationContext implements DeserializationContext {
     private final MappingParser runtime;
@@ -57,49 +56,27 @@ public class JohnzonDeserializationContext implements DeserializationContext {
     }
 
     private JsonValue read(final JsonParser parser) {
-        final JsonParser.Event next = parser.next();
+        final JsonParser.Event next = RewindableJsonParser.class.isInstance(parser) ?
+                RewindableJsonParser.class.cast(parser).getLast() : parser.next();
         switch (next) {
             case START_OBJECT:
                 final JsonObjectBuilder objectBuilder = builderFactory.createObjectBuilder();
                 parseObject(parser, objectBuilder);
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
                 return objectBuilder.build();
             case START_ARRAY:
                 final JsonArrayBuilder arrayBuilder = builderFactory.createArrayBuilder();
                 parseArray(parser, arrayBuilder);
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
                 return arrayBuilder.build();
             case VALUE_STRING:
-                final JsonString string = jsonp.createValue(parser.getString());
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
-                return string;
+                return jsonp.createValue(parser.getString());
             case VALUE_FALSE:
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
                 return JsonValue.FALSE;
             case VALUE_TRUE:
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
                 return JsonValue.TRUE;
             case VALUE_NULL:
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
                 return JsonValue.NULL;
             case VALUE_NUMBER:
-                final JsonNumber number = jsonp.createValue(parser.getBigDecimal());
-                if (parser.hasNext()) {
-                    throw new JsonParsingException("Expected end of file", parser.getLocation());
-                }
-                return number;
+                return jsonp.createValue(parser.getBigDecimal());
             default:
                 throw new JsonParsingException("Unknown structure: " + next, parser.getLocation());
         }
diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/jsonp/RewindableJsonParser.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/jsonp/RewindableJsonParser.java
new file mode 100644
index 0000000..051e776
--- /dev/null
+++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/jsonp/RewindableJsonParser.java
@@ -0,0 +1,127 @@
+/*
+ * 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.johnzon.mapper.jsonp;
+
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import javax.json.JsonArray;
+import javax.json.JsonObject;
+import javax.json.JsonValue;
+import javax.json.stream.JsonLocation;
+import javax.json.stream.JsonParser;
+
+public class RewindableJsonParser implements JsonParser {
+    private final JsonParser delegate;
+    private Event last;
+
+    public RewindableJsonParser(final JsonParser delegate) {
+        this.delegate = delegate;
+    }
+
+    public Event getLast() {
+        return last;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return delegate.hasNext();
+    }
+
+    @Override
+    public Event next() {
+        return last = delegate.next();
+    }
+
+    @Override
+    public String getString() {
+        return delegate.getString();
+    }
+
+    @Override
+    public boolean isIntegralNumber() {
+        return delegate.isIntegralNumber();
+    }
+
+    @Override
+    public int getInt() {
+        return delegate.getInt();
+    }
+
+    @Override
+    public long getLong() {
+        return delegate.getLong();
+    }
+
+    @Override
+    public BigDecimal getBigDecimal() {
+        return delegate.getBigDecimal();
+    }
+
+    @Override
+    public JsonLocation getLocation() {
+        return delegate.getLocation();
+    }
+
+    @Override
+    public void close() {
+        delegate.close();
+    }
+
+    @Override
+    public JsonObject getObject() {
+        return delegate.getObject();
+    }
+
+    @Override
+    public JsonValue getValue() {
+        return delegate.getValue();
+    }
+
+    @Override
+    public JsonArray getArray() {
+        return delegate.getArray();
+    }
+
+    @Override
+    public Stream<JsonValue> getArrayStream() {
+        return delegate.getArrayStream();
+    }
+
+    @Override
+    public Stream<Map.Entry<String, JsonValue>> getObjectStream() {
+        return delegate.getObjectStream();
+    }
+
+    @Override
+    public Stream<JsonValue> getValueStream() {
+        return delegate.getValueStream();
+    }
+
+    @Override
+    public void skipArray() {
+        delegate.skipArray();
+    }
+
+    @Override
+    public void skipObject() {
+        delegate.skipObject();
+    }
+}