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();
+ }
+}