From ded612bf6b42670ddfbe266a5b5095e8e967a64f Mon Sep 17 00:00:00 2001 From: David Kral Date: Fri, 31 Mar 2023 12:29:03 +0200 Subject: [PATCH] Last event method removed Signed-off-by: David Kral --- .../internal/DeserializationContextImpl.java | 33 ++++--------------- .../deserializer/ArrayDeserializer.java | 8 ++--- .../deserializer/CollectionDeserializer.java | 8 ++--- .../deserializer/ContextSwitcher.java | 6 ++-- .../InheritanceInstanceCreator.java | 7 ++-- .../JsonbCreatorDeserializer.java | 10 +++--- .../deserializer/MapDeserializer.java | 8 ++--- .../deserializer/NullCheckDeserializer.java | 4 +-- .../deserializer/ObjectDeserializer.java | 8 ++--- .../deserializer/PositionChecker.java | 9 +++-- .../deserializer/UserDefinedDeserializer.java | 5 ++- .../internal/deserializer/ValueExtractor.java | 4 +-- .../internal/deserializer/YassonParser.java | 24 ++++++-------- .../types/JsonValueDeserializer.java | 4 +-- .../types/ObjectTypeDeserializer.java | 6 ++-- .../types/OptionalDoubleDeserializer.java | 4 +-- .../types/OptionalIntDeserializer.java | 4 +-- .../types/OptionalLongDeserializer.java | 4 +-- .../jsonstructure/JsonStructureIterator.java | 6 ++-- .../JsonStructureToParserAdapter.java | 17 +++++++++- .../jsonpsubstitution/AdaptedJsonParser.java | 7 +++- .../PreinstantiatedJsonpTest.java | 4 ++- 22 files changed, 87 insertions(+), 103 deletions(-) diff --git a/src/main/java/org/eclipse/yasson/internal/DeserializationContextImpl.java b/src/main/java/org/eclipse/yasson/internal/DeserializationContextImpl.java index e568a79d6..c1235172e 100644 --- a/src/main/java/org/eclipse/yasson/internal/DeserializationContextImpl.java +++ b/src/main/java/org/eclipse/yasson/internal/DeserializationContextImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -31,7 +31,6 @@ */ public class DeserializationContextImpl extends ProcessingContext implements DeserializationContext { private final List delayedSetters = new ArrayList<>(); - private JsonParser.Event lastValueEvent; private Customization customization = ClassCustomization.empty(); private Object instance; @@ -51,7 +50,6 @@ public DeserializationContextImpl(JsonbContext jsonbContext) { */ public DeserializationContextImpl(DeserializationContextImpl context) { super(context.getJsonbContext()); - this.lastValueEvent = context.lastValueEvent; } /** @@ -81,24 +79,6 @@ public List getDeferredDeserializers() { return delayedSetters; } - /** - * Return last obtained {@link JsonParser.Event} event. - * - * @return last obtained event - */ - public JsonParser.Event getLastValueEvent() { - return lastValueEvent; - } - - /** - * Set last obtained {@link JsonParser.Event} event. - * - * @param lastValueEvent last obtained event - */ - public void setLastValueEvent(JsonParser.Event lastValueEvent) { - this.lastValueEvent = lastValueEvent; - } - /** * Return customization used by currently processed user defined deserializer. * @@ -130,9 +110,10 @@ public T deserialize(Type type, JsonParser parser) { @SuppressWarnings("unchecked") private T deserializeItem(Type type, JsonParser parser) { try { - if (lastValueEvent == null) { - lastValueEvent = parser.next(); - checkState(); + JsonParser.Event startingEvent = parser.currentEvent(); + if (startingEvent == null || startingEvent == JsonParser.Event.KEY_NAME) { + parser.next(); + checkState(parser); } ModelDeserializer modelDeserializer = getJsonbContext().getChainModelCreator().deserializerChain(type); return (T) modelDeserializer.deserialize(parser, this); @@ -143,8 +124,8 @@ private T deserializeItem(Type type, JsonParser parser) { } } - private void checkState() { - if (lastValueEvent == JsonParser.Event.KEY_NAME) { + private void checkState(JsonParser parser) { + if (parser.currentEvent() == JsonParser.Event.KEY_NAME) { throw new JsonbException("JsonParser has incorrect position as the first event: KEY_NAME"); } } diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/ArrayDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/ArrayDeserializer.java index 2a85c97f4..45f0f5584 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/ArrayDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/ArrayDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -35,9 +35,7 @@ class ArrayDeserializer implements ModelDeserializer { public Object deserialize(JsonParser parser, DeserializationContextImpl context) { Collection collection = new ArrayList<>(); while (parser.hasNext()) { - final JsonParser.Event next = parser.next(); - context.setLastValueEvent(next); - switch (next) { + switch (parser.next()) { case START_OBJECT: case START_ARRAY: case VALUE_STRING: @@ -51,7 +49,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) case END_ARRAY: return collection; default: - throw new JsonbException("Unexpected state: " + next); + throw new JsonbException("Unexpected state: " + parser.currentEvent()); } } return collection; diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/CollectionDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/CollectionDeserializer.java index 53a0dcb8f..b0d0c39d6 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/CollectionDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/CollectionDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -35,9 +35,7 @@ class CollectionDeserializer implements ModelDeserializer { public Object deserialize(JsonParser parser, DeserializationContextImpl context) { Collection collection = (Collection) context.getInstance(); while (parser.hasNext()) { - final JsonParser.Event next = parser.next(); - context.setLastValueEvent(next); - switch (next) { + switch (parser.next()) { case VALUE_NULL: case START_OBJECT: case START_ARRAY: @@ -51,7 +49,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) case END_ARRAY: return collection; default: - throw new JsonbException("Unexpected state: " + next); + throw new JsonbException("Unexpected state: " + parser.currentEvent()); } } return collection; diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/ContextSwitcher.java b/src/main/java/org/eclipse/yasson/internal/deserializer/ContextSwitcher.java index 462da5702..c8b4e0600 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/ContextSwitcher.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/ContextSwitcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -33,8 +33,6 @@ class ContextSwitcher implements ModelDeserializer { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { DeserializationContextImpl ctx = new DeserializationContextImpl(context); - Object returnedValue = delegate.deserialize(modelDeserializer.deserialize(value, ctx), context); - context.setLastValueEvent(ctx.getLastValueEvent()); - return returnedValue; + return delegate.deserialize(modelDeserializer.deserialize(value, ctx), context); } } diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java b/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java index efcc6c54e..bfba87713 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/InheritanceInstanceCreator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -23,8 +23,6 @@ import org.eclipse.yasson.internal.jsonstructure.JsonStructureToParserAdapter; import org.eclipse.yasson.internal.model.customization.TypeInheritanceConfiguration; -import static jakarta.json.stream.JsonParser.Event; - /** * Instance creator following the inheritance structure defined by {@link jakarta.json.bind.annotation.JsonbTypeInfo}. */ @@ -58,8 +56,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) .build(); jsonParser = new JsonStructureToParserAdapter(newJsonObject); //To get to the first event - Event event = jsonParser.next(); - context.setLastValueEvent(event); + jsonParser.next(); Class polymorphicTypeClass; if (alias == null) { return defaultProcessor.deserialize(jsonParser, context); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/JsonbCreatorDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/JsonbCreatorDeserializer.java index e3dab9a4e..9231c5033 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/JsonbCreatorDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/JsonbCreatorDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -68,9 +68,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) String key = null; Map paramValues = new HashMap<>(); while (parser.hasNext()) { - final JsonParser.Event next = parser.next(); - context.setLastValueEvent(next); - switch (next) { + switch (parser.next()) { case KEY_NAME: key = renamer.apply(parser.getString()); break; @@ -94,7 +92,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) throw new JsonbException(Messages.getMessage(MessageKeys.UNKNOWN_JSON_PROPERTY, key, clazz)); } else { //We need to skip the corresponding structure if property key was not found - VALUE_SKIPPERS.getOrDefault(next, NOOP).accept(parser); + VALUE_SKIPPERS.getOrDefault(parser.currentEvent(), NOOP).accept(parser); } break; case END_OBJECT: @@ -112,7 +110,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) context.getDeferredDeserializers().clear(); return context.getInstance(); default: - throw new JsonbException("Unexpected state: " + next); + throw new JsonbException("Unexpected state: " + parser.currentEvent()); } } return context.getInstance(); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/MapDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/MapDeserializer.java index d366fc8fb..55265555d 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/MapDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/MapDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -43,9 +43,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) Mode mode = Mode.NONE; State state = State.NEXT; while (parser.hasNext()) { - final JsonParser.Event next = parser.next(); - context.setLastValueEvent(next); - switch (next) { + switch (parser.next()) { case KEY_NAME: mode = mode == Mode.NONE ? Mode.NORMAL : mode; if (mode == Mode.NORMAL) { @@ -89,7 +87,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) case END_ARRAY: return map; default: - throw new JsonbException("Unexpected state: " + next); + throw new JsonbException("Unexpected state: " + parser.currentEvent()); } } return map; diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/NullCheckDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/NullCheckDeserializer.java index c6310ce15..033ad770e 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/NullCheckDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/NullCheckDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -42,7 +42,7 @@ public NullCheckDeserializer(ModelDeserializer nonNullDeserializer, @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - if (context.getLastValueEvent() != JsonParser.Event.VALUE_NULL) { + if (value.currentEvent() != JsonParser.Event.VALUE_NULL) { return nonNullDeserializer.deserialize(value, context); } return nullDeserializer.deserialize(null, context); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/ObjectDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/ObjectDeserializer.java index fa7d914ac..e5aa5412d 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/ObjectDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/ObjectDeserializer.java @@ -60,9 +60,7 @@ class ObjectDeserializer implements ModelDeserializer { public Object deserialize(JsonParser parser, DeserializationContextImpl context) { String key = null; while (parser.hasNext()) { - final JsonParser.Event next = parser.next(); - context.setLastValueEvent(next); - switch (next) { + switch (parser.next()) { case KEY_NAME: key = renamer.apply(parser.getString()); break; @@ -83,7 +81,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) throw new JsonbException(Messages.getMessage(MessageKeys.UNKNOWN_JSON_PROPERTY, key, rawClass)); } else { //We need to skip the corresponding structure if property key was not found - VALUE_SKIPPERS.getOrDefault(next, NOOP).accept(parser); + VALUE_SKIPPERS.getOrDefault(parser.currentEvent(), NOOP).accept(parser); } break; case END_ARRAY: @@ -91,7 +89,7 @@ public Object deserialize(JsonParser parser, DeserializationContextImpl context) case END_OBJECT: return context.getInstance(); default: - throw new JsonbException("Unexpected state: " + next); + throw new JsonbException("Unexpected state: " + parser.currentEvent()); } } return context.getInstance(); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/PositionChecker.java b/src/main/java/org/eclipse/yasson/internal/deserializer/PositionChecker.java index 61e4cb514..166839569 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/PositionChecker.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/PositionChecker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -71,11 +71,10 @@ private PositionChecker(Set expectedEvents, @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - Event original = context.getLastValueEvent(); + Event original = value.currentEvent(); Event startEvent = original; if (!expectedEvents.contains(startEvent)) { startEvent = value.next(); - context.setLastValueEvent(startEvent); if (!expectedEvents.contains(startEvent)) { throw new JsonbException("Incorrect position for processing type: " + rType + ". " + "Received event: " + original + " " @@ -84,10 +83,10 @@ public Object deserialize(JsonParser value, DeserializationContextImpl context) } Object o = delegate.deserialize(value, context); if (CLOSING_EVENTS.containsKey(startEvent) - && CLOSING_EVENTS.get(startEvent) != context.getLastValueEvent()) { + && CLOSING_EVENTS.get(startEvent) != value.currentEvent()) { throw new JsonbException("Incorrect parser position after processing of the type: " + rType + ". " + "Start event: " + startEvent + " " - + "After processing event: " + context.getLastValueEvent()); + + "After processing event: " + value.currentEvent()); } return o; } diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/UserDefinedDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/UserDefinedDeserializer.java index 70ec44014..2170cd42c 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/UserDefinedDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/UserDefinedDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -65,10 +65,9 @@ public Object deserialize(JsonParser value, DeserializationContextImpl context) // return exactType.deserialize(value, newContext); // } // newContext.getUserProcessorChain().add(userDefinedDeserializer.getClass()); - YassonParser yassonParser = new YassonParser(value, context.getLastValueEvent(), newContext); + YassonParser yassonParser = new YassonParser(value, value.currentEvent()); Object object = userDefinedDeserializer.deserialize(yassonParser, newContext, rType); yassonParser.skipRemaining(); - context.setLastValueEvent(newContext.getLastValueEvent()); return delegate.deserialize(object, context); } diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/ValueExtractor.java b/src/main/java/org/eclipse/yasson/internal/deserializer/ValueExtractor.java index f55c0494b..852561f56 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/ValueExtractor.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/ValueExtractor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -36,7 +36,7 @@ public ValueExtractor(TypeDeserializer delegate) { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - JsonParser.Event last = context.getLastValueEvent(); + JsonParser.Event last = value.currentEvent(); switch (last) { case VALUE_TRUE: return delegate.deserialize(Boolean.TRUE, context); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java b/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java index c17f6ff56..91f7992c0 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/YassonParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -23,8 +23,6 @@ import jakarta.json.stream.JsonLocation; import jakarta.json.stream.JsonParser; -import org.eclipse.yasson.internal.DeserializationContextImpl; - /** * Yasson {@link YassonParser} parser wrapper. *
@@ -33,12 +31,10 @@ class YassonParser implements JsonParser { private final JsonParser delegate; - private final DeserializationContextImpl context; private int level; - YassonParser(JsonParser delegate, Event firstEvent, DeserializationContextImpl context) { + YassonParser(JsonParser delegate, Event firstEvent) { this.delegate = delegate; - this.context = context; this.level = determineLevelValue(firstEvent); } @@ -66,11 +62,15 @@ public boolean hasNext() { return delegate.hasNext(); } + @Override + public Event currentEvent() { + return delegate.currentEvent(); + } + @Override public Event next() { validate(); Event next = delegate.next(); - context.setLastValueEvent(next); switch (next) { case START_OBJECT: case START_ARRAY: @@ -120,14 +120,12 @@ public JsonLocation getLocation() { public JsonObject getObject() { validate(); level--; - JsonObject jsonObject = delegate.getObject(); - context.setLastValueEvent(Event.END_OBJECT); - return jsonObject; + return delegate.getObject(); } @Override public JsonValue getValue() { - final Event currentLevel = context.getLastValueEvent(); + final Event currentLevel = delegate.currentEvent(); switch (currentLevel) { case START_ARRAY: return getArray(); @@ -142,9 +140,7 @@ public JsonValue getValue() { public JsonArray getArray() { validate(); level--; - JsonArray array = delegate.getArray(); - context.setLastValueEvent(Event.END_ARRAY); - return array; + return delegate.getArray(); } @Override diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/types/JsonValueDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/types/JsonValueDeserializer.java index ea97c4262..5820098f0 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/types/JsonValueDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/types/JsonValueDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -36,7 +36,7 @@ class JsonValueDeserializer implements ModelDeserializer { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - JsonParser.Event last = context.getLastValueEvent(); + JsonParser.Event last = value.currentEvent(); return delegate.deserialize(deserializeValue(last, value), context); } diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/types/ObjectTypeDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/types/ObjectTypeDeserializer.java index 3f3d7aa3b..4706a9fc8 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/types/ObjectTypeDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/types/ObjectTypeDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -40,7 +40,7 @@ class ObjectTypeDeserializer implements ModelDeserializer { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { Object toSet; - switch (context.getLastValueEvent()) { + switch (value.currentEvent()) { case VALUE_TRUE: toSet = Boolean.TRUE; break; @@ -63,7 +63,7 @@ public Object deserialize(JsonParser value, DeserializationContextImpl context) toSet = newContext1.deserialize(LIST, value); break; default: - throw new JsonbException("Unexpected event: " + context.getLastValueEvent()); + throw new JsonbException("Unexpected event: " + value.currentEvent()); } return delegate.deserialize(toSet, context); } diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalDoubleDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalDoubleDeserializer.java index d898a434c..6a92da229 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalDoubleDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalDoubleDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -34,7 +34,7 @@ class OptionalDoubleDeserializer implements ModelDeserializer { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - if (context.getLastValueEvent() == JsonParser.Event.VALUE_NULL) { + if (value.currentEvent() == JsonParser.Event.VALUE_NULL) { return nullValueDelegate.deserialize(OptionalDouble.empty(), context); } OptionalDouble optional = OptionalDouble.of((Double) extractor.deserialize(value, context)); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalIntDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalIntDeserializer.java index 261d8c69d..93586dcd3 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalIntDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalIntDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -34,7 +34,7 @@ class OptionalIntDeserializer implements ModelDeserializer { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - if (context.getLastValueEvent() == JsonParser.Event.VALUE_NULL) { + if (value.currentEvent() == JsonParser.Event.VALUE_NULL) { return delegate.deserialize(OptionalInt.empty(), context); } OptionalInt optional = OptionalInt.of((Integer) extractor.deserialize(value, context)); diff --git a/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalLongDeserializer.java b/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalLongDeserializer.java index 1501cca1a..15a9d91d1 100644 --- a/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalLongDeserializer.java +++ b/src/main/java/org/eclipse/yasson/internal/deserializer/types/OptionalLongDeserializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2021, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -34,7 +34,7 @@ class OptionalLongDeserializer implements ModelDeserializer { @Override public Object deserialize(JsonParser value, DeserializationContextImpl context) { - if (context.getLastValueEvent() == JsonParser.Event.VALUE_NULL) { + if (value.currentEvent() == JsonParser.Event.VALUE_NULL) { return nullValueDelegate.deserialize(OptionalLong.empty(), context); } OptionalLong optional = OptionalLong.of((Long) extractor.deserialize(value, context)); diff --git a/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureIterator.java b/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureIterator.java index 1e402b57d..70bcd3619 100644 --- a/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureIterator.java +++ b/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -67,9 +67,11 @@ JsonParser.Event getValueEvent(JsonValue value) { case NUMBER: return JsonParser.Event.VALUE_NUMBER; case STRING: + return JsonParser.Event.VALUE_STRING; case TRUE: + return JsonParser.Event.VALUE_TRUE; case FALSE: - return JsonParser.Event.VALUE_STRING; + return JsonParser.Event.VALUE_FALSE; case OBJECT: return JsonParser.Event.START_OBJECT; case ARRAY: diff --git a/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java b/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java index dfa9d64f4..7dc2827b2 100644 --- a/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java +++ b/src/main/java/org/eclipse/yasson/internal/jsonstructure/JsonStructureToParserAdapter.java @@ -40,6 +40,7 @@ public class JsonStructureToParserAdapter implements JsonParser { private Deque iterators = new ArrayDeque<>(); private final JsonStructure rootStructure; + private JsonParser.Event currentEvent; /** * Creates new {@link JsonStructure} parser. @@ -55,8 +56,18 @@ public boolean hasNext() { return iterators.peek().hasNext(); } + @Override + public Event currentEvent() { + return currentEvent; + } + @Override public Event next() { + currentEvent = nextInternal(); + return currentEvent; + } + + private Event nextInternal() { if (iterators.isEmpty()) { if (rootStructure instanceof JsonObject) { iterators.push(new JsonObjectIterator((JsonObject) rootStructure)); @@ -80,7 +91,9 @@ public Event next() { @Override public String getString() { - return iterators.peek().getString(); + String string = iterators.peek().getString(); + currentEvent = Event.VALUE_STRING; + return string; } @Override @@ -109,6 +122,7 @@ public JsonObject getObject() { if (current instanceof JsonObjectIterator) { //Remove child iterator as getObject() method contract says iterators.pop(); + currentEvent = Event.END_OBJECT; return current.getValue().asJsonObject(); } else { throw new JsonbException(Messages.getMessage(MessageKeys.INTERNAL_ERROR, "Outside of object context")); @@ -121,6 +135,7 @@ private JsonNumber getJsonNumberValue() { if (value.getValueType() != JsonValue.ValueType.NUMBER) { throw iterator.createIncompatibleValueError(); } + currentEvent = iterator.getValueEvent(value); return (JsonNumber) value; } diff --git a/src/test/java/org/eclipse/yasson/jsonpsubstitution/AdaptedJsonParser.java b/src/test/java/org/eclipse/yasson/jsonpsubstitution/AdaptedJsonParser.java index 3edd5c3c1..8b7187fff 100644 --- a/src/test/java/org/eclipse/yasson/jsonpsubstitution/AdaptedJsonParser.java +++ b/src/test/java/org/eclipse/yasson/jsonpsubstitution/AdaptedJsonParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -51,6 +51,11 @@ public Event next() { return jsonParser.next(); } + @Override + public Event currentEvent() { + return jsonParser.currentEvent(); + } + @Override public String getString() { return adapter.adaptStringValue(jsonParser.getString()); diff --git a/src/test/java/org/eclipse/yasson/jsonpsubstitution/PreinstantiatedJsonpTest.java b/src/test/java/org/eclipse/yasson/jsonpsubstitution/PreinstantiatedJsonpTest.java index 93c02bb40..434d2c781 100644 --- a/src/test/java/org/eclipse/yasson/jsonpsubstitution/PreinstantiatedJsonpTest.java +++ b/src/test/java/org/eclipse/yasson/jsonpsubstitution/PreinstantiatedJsonpTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2022 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2023 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0 which is available at @@ -125,6 +125,8 @@ public void testGeneratorWrappedWithUserInteraction() { assertEquals(WRAPPED_JSON, new String(out.toByteArray())); } + @Disabled("JsonParser now provides access to current event. " + + "This test passes since Yasson 3.0.0 due to addition of JsonParser.currentEvent()") @Test public void testInvalidJsonParserAdvancedToCustomPosition() { ByteArrayInputStream in = new ByteArrayInputStream(WRAPPED_JSON.getBytes());