diff --git a/java-client/src/main/java/co/elastic/clients/json/BuildFunctionDeserializer.java b/java-client/src/main/java/co/elastic/clients/json/BuildFunctionDeserializer.java index e9b824a54..53247e226 100644 --- a/java-client/src/main/java/co/elastic/clients/json/BuildFunctionDeserializer.java +++ b/java-client/src/main/java/co/elastic/clients/json/BuildFunctionDeserializer.java @@ -45,12 +45,12 @@ protected JsonpDeserializer unwrap() { @Override public T deserialize(JsonParser parser, JsonpMapper mapper) { B builder = builderDeserializer.deserialize(parser, mapper); - return build.apply(builder); + return builder == null ? null : build.apply(builder); } @Override public T deserialize(JsonParser parser, JsonpMapper mapper, JsonParser.Event event) { B builder = builderDeserializer.deserialize(parser, mapper, event); - return build.apply(builder); + return builder == null ? null : build.apply(builder); } } diff --git a/java-client/src/main/java/co/elastic/clients/json/JsonpDeserializerBase.java b/java-client/src/main/java/co/elastic/clients/json/JsonpDeserializerBase.java index bd9b9485c..fb9bd88e7 100644 --- a/java-client/src/main/java/co/elastic/clients/json/JsonpDeserializerBase.java +++ b/java-client/src/main/java/co/elastic/clients/json/JsonpDeserializerBase.java @@ -295,11 +295,13 @@ public EnumSet nativeEvents() { public EnumSet acceptedEvents() { // Accepted events is computed lazily // no need for double-checked lock, we don't care about computing it several times - if (acceptedEvents == null) { - acceptedEvents = EnumSet.of(Event.START_ARRAY); - acceptedEvents.addAll(itemDeserializer.acceptedEvents()); + EnumSet events = acceptedEvents; + if (events == null) { + events = EnumSet.of(Event.START_ARRAY); + events.addAll(itemDeserializer.acceptedEvents()); + acceptedEvents = events; } - return acceptedEvents; + return events; } @Override diff --git a/java-client/src/main/java/co/elastic/clients/json/LazyDeserializer.java b/java-client/src/main/java/co/elastic/clients/json/LazyDeserializer.java index 61a770327..9b935a2c0 100644 --- a/java-client/src/main/java/co/elastic/clients/json/LazyDeserializer.java +++ b/java-client/src/main/java/co/elastic/clients/json/LazyDeserializer.java @@ -29,12 +29,12 @@ * @see JsonpDeserializable * @see Initialization of Classes and Interfaces */ -class LazyDeserializer extends DelegatingDeserializer.SameType { +public class LazyDeserializer extends DelegatingDeserializer.SameType { private final Supplier> ctor; private volatile JsonpDeserializer deserializer = null; - LazyDeserializer(Supplier> ctor) { + public LazyDeserializer(Supplier> ctor) { this.ctor = ctor; } diff --git a/java-client/src/main/java/co/elastic/clients/json/ObjectBuilderDeserializer.java b/java-client/src/main/java/co/elastic/clients/json/ObjectBuilderDeserializer.java index e2a41910a..126daa3ff 100644 --- a/java-client/src/main/java/co/elastic/clients/json/ObjectBuilderDeserializer.java +++ b/java-client/src/main/java/co/elastic/clients/json/ObjectBuilderDeserializer.java @@ -77,12 +77,12 @@ protected JsonpDeserializer unwrap() { @Override public T deserialize(JsonParser parser, JsonpMapper mapper) { ObjectBuilder builder = builderDeserializer.deserialize(parser, mapper); - return builder.build(); + return builder == null ? null : builder.build(); } @Override public T deserialize(JsonParser parser, JsonpMapper mapper, JsonParser.Event event) { ObjectBuilder builder = builderDeserializer.deserialize(parser, mapper, event); - return builder.build(); + return builder == null ? null : builder.build(); } } diff --git a/java-client/src/main/java/co/elastic/clients/json/ObjectDeserializer.java b/java-client/src/main/java/co/elastic/clients/json/ObjectDeserializer.java index 5ed1d1a00..8f60b23a8 100644 --- a/java-client/src/main/java/co/elastic/clients/json/ObjectDeserializer.java +++ b/java-client/src/main/java/co/elastic/clients/json/ObjectDeserializer.java @@ -44,6 +44,8 @@ public FieldDeserializer(String name) { this.name = name; } + public abstract EnumSet acceptedEvents(); + public abstract void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName, ObjectType object); public abstract void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName, ObjectType object, Event event); @@ -67,6 +69,11 @@ public String name() { return this.name; } + @Override + public EnumSet acceptedEvents() { + return deserializer.acceptedEvents(); + } + public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName, ObjectType object) { FieldType fieldValue = deserializer.deserialize(parser, mapper); setter.accept(object, fieldValue); @@ -90,6 +97,11 @@ public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName, public void deserialize(JsonParser parser, JsonpMapper mapper, String fieldName, Object object, Event event) { JsonpUtils.skipValue(parser, event); } + + @Override + public EnumSet acceptedEvents() { + return EnumSet.allOf(Event.class); + } }; //--------------------------------------------------------------------------------------------- @@ -242,6 +254,8 @@ public void shortcutProperty(String name) { throw new NoSuchElementException("No deserializer was setup for '" + name + "'"); } + //acceptedEvents = EnumSet.copyOf(acceptedEvents); + //acceptedEvents.addAll(shortcutProperty.acceptedEvents()); acceptedEvents = EventSetObjectAndString; } diff --git a/java-client/src/test/java/co/elastic/clients/json/JsonpDeserializerBaseTest.java b/java-client/src/test/java/co/elastic/clients/json/JsonpDeserializerBaseTest.java new file mode 100644 index 000000000..11bb1c460 --- /dev/null +++ b/java-client/src/test/java/co/elastic/clients/json/JsonpDeserializerBaseTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. 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 co.elastic.clients.json; + +import co.elastic.clients.elasticsearch.model.ModelTestCase; +import jakarta.json.stream.JsonParser; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class JsonpDeserializerBaseTest extends ModelTestCase { + + @Test + public void testArrayDeserializer() { + + JsonpDeserializer> deser = + JsonpDeserializer.arrayDeserializer(JsonpDeserializer.integerDeserializer()); + + assertFalse(deser.nativeEvents().contains(JsonParser.Event.VALUE_NUMBER)); + assertTrue(deser.acceptedEvents().contains(JsonParser.Event.VALUE_NUMBER)); + + List values = fromJson("[ 42, 43 ]", deser); + assertEquals(2, values.size()); + assertEquals(42, values.get(0)); + assertEquals(43, values.get(1)); + + // Single value representation + values = fromJson("42", deser); + assertEquals(1, values.size()); + assertEquals(42, values.get(0)); + + } +} diff --git a/java-client/src/test/java/co/elastic/clients/json/ObjectBuilderDeserializerTest.java b/java-client/src/test/java/co/elastic/clients/json/ObjectBuilderDeserializerTest.java new file mode 100644 index 000000000..1be205252 --- /dev/null +++ b/java-client/src/test/java/co/elastic/clients/json/ObjectBuilderDeserializerTest.java @@ -0,0 +1,50 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. 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 co.elastic.clients.json; + +import co.elastic.clients.elasticsearch._types.mapping.TextProperty; +import co.elastic.clients.elasticsearch.model.ModelTestCase; +import co.elastic.clients.elasticsearch.transform.UpdateTransformRequest; +import org.junit.jupiter.api.Test; + +import java.io.StringReader; + +public class ObjectBuilderDeserializerTest extends ModelTestCase { + + @Test + public void testNullObjectValue() { + // Should also accept null for optional values + String json = "{ \"index_prefixes\": null }"; + fromJson(json, TextProperty.class); + } + + @Test + public void testNullObjectValueInFunctionBuilder() { + String json = "{\n" + + " \"retention_policy\": null\n" + + " }"; + + UpdateTransformRequest.Builder builder = new UpdateTransformRequest.Builder(); + builder.transformId("foo"); + builder.withJson(new StringReader(json)); + builder.build(); + } + +}