From 0a6ffdb7193ab2b673af06e51fea795d0e84188a Mon Sep 17 00:00:00 2001 From: David Kral Date: Thu, 22 Jul 2021 15:13:20 +0200 Subject: [PATCH 01/12] 3rd party class customization Signed-off-by: David Kral --- .../java/jakarta/json/bind/JsonbConfig.java | 23 +- .../bind/decorator/BuilderProviderLoader.java | 52 ++++ .../json/bind/decorator/CommonDecorator.java | 69 +++++ .../decorator/CommonDecoratorBuilder.java | 128 +++++++++ .../json/bind/decorator/CreatorDecorator.java | 63 +++++ .../decorator/CreatorDecoratorBuilder.java | 89 ++++++ .../json/bind/decorator/ParamDecorator.java | 72 +++++ .../bind/decorator/ParamDecoratorBuilder.java | 24 ++ .../bind/decorator/PropertyDecorator.java | 56 ++++ .../decorator/PropertyDecoratorBuilder.java | 260 ++++++++++++++++++ .../jakarta/json/bind/decorator/Scope.java | 38 +++ .../bind/decorator/SerializerDecorator.java | 36 +++ .../decorator/SerializerDecoratorBuilder.java | 34 +++ .../json/bind/decorator/TypeDecorator.java | 70 +++++ .../bind/decorator/TypeDecoratorBuilder.java | 123 +++++++++ .../json/bind/decorator/package-info.java | 25 ++ .../bind/spi/DecoratorBuilderProvider.java | 69 +++++ api/src/main/java/module-info.java | 4 +- 18 files changed, 1233 insertions(+), 2 deletions(-) create mode 100644 api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/Scope.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java create mode 100644 api/src/main/java/jakarta/json/bind/decorator/package-info.java create mode 100644 api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java diff --git a/api/src/main/java/jakarta/json/bind/JsonbConfig.java b/api/src/main/java/jakarta/json/bind/JsonbConfig.java index 4ed66427..4917eb87 100644 --- a/api/src/main/java/jakarta/json/bind/JsonbConfig.java +++ b/api/src/main/java/jakarta/json/bind/JsonbConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2021 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 @@ -21,6 +21,7 @@ import jakarta.json.bind.config.PropertyNamingStrategy; import jakarta.json.bind.config.PropertyVisibilityStrategy; +import jakarta.json.bind.decorator.TypeDecorator; import jakarta.json.bind.serializer.JsonbDeserializer; import jakarta.json.bind.serializer.JsonbSerializer; @@ -126,6 +127,11 @@ public class JsonbConfig { */ public static final String DESERIALIZERS = "jsonb.derializers"; + /** + * Property used to specify custom deserializers. + */ + public static final String TYPE_DECORATORS = "jsonb.type-decorators"; + /** * Property used to specify custom binary data strategy. */ @@ -360,6 +366,21 @@ public final JsonbConfig withDeserializers(final JsonbDeserializer... deserializ return this; } + /** + * Property used to specify custom type decorators. + * + * Configures value of {@link #TYPE_DECORATORS} property. + * + * Calling withTypeDecorators more than once will merge the type decorators with previous value. + * + * @param typeDecorators Custom type decorators which affects deserialization and serialization of the decorated types. + * @return This JsonbConfig instance. + */ + public final JsonbConfig withTypeDecorators(final TypeDecorator... typeDecorators) { + mergeProperties(TYPE_DECORATORS, typeDecorators, TypeDecorator.class); + return this; + } + /** * Property used to specify custom binary data strategy. * diff --git a/api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java b/api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java new file mode 100644 index 00000000..a477de95 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.ServiceLoader; + +import jakarta.json.bind.spi.DecoratorBuilderProvider; + +/** + * SPI loader of the {@link DecoratorBuilderProvider}. + */ +class BuilderProviderLoader { + + private static DecoratorBuilderProvider instance = null; + + private BuilderProviderLoader() { + throw new IllegalStateException("This class cannot be instantiated"); + } + + static DecoratorBuilderProvider provider() { + if (instance == null) { + synchronized (DecoratorBuilderProvider.class) { + if (instance != null) { + return instance; + } + PrivilegedAction loader = () -> + ServiceLoader.load(DecoratorBuilderProvider.class) + .findFirst() + .orElseThrow(() -> new IllegalStateException("Could not find any BuilderProvider implementation")); + instance = AccessController.doPrivileged(loader); + } + } + return instance; + } + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java new file mode 100644 index 00000000..f2099463 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Optional; + +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.serializer.JsonbDeserializer; + +/** + * Common interface for all of the decorators. + */ +public interface CommonDecorator { + + /** + * Return {@link NumberFormat} specified to the required {@link Scope}. + * + * @param scope required scope + * @return specified {@link NumberFormat} instance, otherwise empty + */ + Optional numberFormat(Scope scope); + + /** + * Return {@link DateFormat} specified to the required {@link Scope}. + * + * @param scope required scope + * @return specified {@link DateFormat} instance, otherwise empty + */ + Optional dateFormat(Scope scope); + + /** + * Return {@link JsonbDeserializer} of the component. + * + * @return component deserializer instance, otherwise empty + */ + Optional> deserializer(); + + /** + * Return {@link JsonbAdapter} of the component. + * + * @return component adapter instance, otherwise empty + */ + Optional> adapter(); + + /** + * Return if the component can be nillable in the given {@link Scope}. + * + * @param scope required scope + * @return property nillable state, otherwise empty + */ + Optional nillable(Scope scope); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java new file mode 100644 index 00000000..a21de240 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java @@ -0,0 +1,128 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Locale; + +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.serializer.JsonbDeserializer; + +/** + * Common interface for all decorator builders. + */ +public interface CommonDecoratorBuilder, B> { + + /** + * Whether this component can be nillable. + * + * @param nillable nillable component + * @return updated builder instance + */ + T nillable(boolean nillable); + + /** + * Set {@link JsonbDeserializer} which should be used. + * + * @param deserializer component deserializer + * @return updated builder instance + */ + T deserializer(JsonbDeserializer deserializer); + + /** + * Set {@link JsonbAdapter} which should be used. + * + * @param adapter component adapter + * @return updated builder instance + */ + T adapter(JsonbAdapter adapter); + + /** + * Set number format and locale which should be used. + * + * @param numberFormat number format + * @param locale locale + * @return updated builder instance + */ + T numberFormat(String numberFormat, Locale locale); + + /** + * Set number format which should be used. + * + * @param numberFormat number format + * @return updated builder instance + */ + T numberFormat(String numberFormat); + + /** + * Set locale which should be used. + * + * @param locale locale + * @return updated builder instance + */ + T numberFormat(Locale locale); + + /** + * Set {@link NumberFormat} instance which should be used. + * + * @param numberFormat pre created NumberFormat instance + * @return updated builder instance + */ + T numberFormat(NumberFormat numberFormat); + + /** + * Set date format and locale which should be used. + * + * @param dateFormat date format + * @param locale locale + * @return updated builder instance + */ + T dateFormat(String dateFormat, Locale locale); + + /** + * Set date format which should be used. + * + * @param dateFormat date format + * @return updated builder instance + */ + T dateFormat(String dateFormat); + + /** + * Set locale which should be used. + * + * @param locale locale + * @return updated builder instance + */ + T dateFormat(Locale locale); + + /** + * Set {@link DateFormat} instance which should be used. + * + * @param dateFormat pre created DateFormat instance + * @return updated builder instance + */ + T dateFormat(DateFormat dateFormat); + + /** + * Build the new instance from this builder. + * + * @return new instance + */ + B build(); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java new file mode 100644 index 00000000..616e963e --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.List; +import java.util.Optional; + +/** + * Decorated creator customization. + */ +public interface CreatorDecorator { + + /** + * Create new {@link CreatorDecoratorBuilder} instance. + * + * Builder created via this method targets constructors of the class it is bound to. + * + * @return new creator decorator builder instance + */ + static CreatorDecoratorBuilder builder() { + return BuilderProviderLoader.provider().newCreatorDecoratorBuilder(); + } + + /** + * Create new {@link CreatorDecoratorBuilder} instance based on creator method name. + * + * @return new creator decorator builder instance + */ + static CreatorDecoratorBuilder builder(String methodName) { + return BuilderProviderLoader.provider().newCreatorDecoratorBuilder(methodName); + } + + /** + * Return creator method name if has been specified. + * If the name is empty, it is handled as if it is null. + * + * @return specified creator method name, otherwise empty + */ + Optional factoryMethodName(); + + /** + * Return {@link List} of the registered parameters. The order of the parameters needs to be the same as they were added. + * If no parameters were added, empty {@link List} is returned. + * + * @return creator parameters + */ + List params(); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java new file mode 100644 index 00000000..9b16224c --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.function.Consumer; + +/** + * Builder of the {@link CreatorDecorator} instance. + * + * When no creator method name is specified, it is assumed that creator is constructor. + */ +public interface CreatorDecoratorBuilder { + + /** + * Add {@link ParamDecorator} instance. + * + * All creator parameters are required to be added in exact order as they are on decorated factory method/constructor. + * + * @param creatorParam creator parameter + * @return updated builder instance + */ + CreatorDecoratorBuilder addParameter(ParamDecorator creatorParam); + + /** + * Add new {@link ParamDecorator} of the property. + *
+ * Shortcut method to the {@link #addParameter(ParamDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * since this method will create {@link ParamDecorator} based on the provided parameter class and json name and by calling + * {@link ParamDecorator#create(Class, String)} method. No further customizations will be applied. + *
+ * All creator parameters are required to be added in exact order as they are on decorated factory method/constructor. + * + * @param parameterClass class of the parameter + * @param jsonName json name of the parameter + * @return updated builder instance + */ + default CreatorDecoratorBuilder addParameter(Class parameterClass, String jsonName) { + return addParameter(ParamDecorator.create(parameterClass, jsonName)); + } + + /** + * Add new {@link PropertyDecorator} of the property. + *
+ * Shortcut method to the {@link #addParameter(ParamDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * since this method will create is based on the provided parameter class and json name. Created builder is provided over + * the paramBuilder. + *
+ * All creator parameters are required to be added in exact order as they are on decorated factory method/constructor. + *
+ * Example usage: + *
{@code
+     * creatorBuilder.addParameter(String.class, "jsonName", paramBuilder -> paramBuilder.nillable(true));
+     * }
+ * + * @param parameterClass class of the parameter + * @param jsonName json name of the parameter + * @param paramBuilder builder used to customize parameter + * @return updated builder instance + */ + default CreatorDecoratorBuilder addParameter(Class parameterClass, + String jsonName, + Consumer paramBuilder) { + ParamDecoratorBuilder builder = ParamDecorator.builder(parameterClass, jsonName); + paramBuilder.accept(builder); + return addParameter(builder.build()); + } + + /** + * Build the new instance of the {@link CreatorDecorator}. + * + * @return new {@link CreatorDecorator} instance + */ + CreatorDecorator build(); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java new file mode 100644 index 00000000..23dcad85 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.Objects; + +/** + * Decorated parameter customization. + */ +public interface ParamDecorator extends CommonDecorator { + + /** + * Create new {@link ParamDecoratorBuilder} instance base on parameter class and its json name. + * Both parameter class and json name are required to be non-null or empty. + * + * @param paramClass parameter class + * @param jsonName parameter json name + * @return new param decorator builder instance + */ + static ParamDecoratorBuilder builder(Class paramClass, String jsonName) { + Objects.requireNonNull(paramClass, "Parameter class cannot be null"); + if (jsonName == null || jsonName.isBlank()) { + throw new IllegalStateException("Json name cannot be null or empty"); + } + return BuilderProviderLoader.provider().newCreatorParamBuilder(paramClass, jsonName); + } + + /** + * Create new instance of {@link ParamDecorator} base on parameter class and its json name. + * Both parameter class and json name are required to be non-null or empty. + * + * @param paramClass parameter class + * @param jsonName parameter json name + * @return new parameter decorator instance + */ + static ParamDecorator create(Class paramClass, String jsonName) { + Objects.requireNonNull(paramClass, "Parameter class cannot be null"); + if (jsonName == null || jsonName.isBlank()) { + throw new IllegalStateException("Json name cannot be null or empty"); + } + return builder(paramClass, jsonName).build(); + } + + /** + * Return parameter json name. + * + * @return parameter json name + */ + String jsonName(); + + /** + * Return parameter class. + * + * @return parameter class + */ + Class parameterClass(); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java new file mode 100644 index 00000000..c82bdc47 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +/** + * Builder of the {@link ParamDecorator} instance. + */ +public interface ParamDecoratorBuilder extends CommonDecoratorBuilder { + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java new file mode 100644 index 00000000..8540a5f7 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.Optional; + +/** + * Decorated property customization. + */ +public interface PropertyDecorator extends SerializerDecorator { + + /** + * Create new {@link PropertyDecoratorBuilder} instance base on property name. + * Property name is required to be non-null or empty. + * + * @param propertyName name of the decorated property + * @return new property decorator builder instance + */ + static PropertyDecoratorBuilder builder(String propertyName) { + if (propertyName == null || propertyName.isBlank()) { + throw new IllegalStateException("Property name cannot be null or empty"); + } + return BuilderProviderLoader.provider().newPropertyDecoratorBuilder(propertyName); + } + + /** + * Return if the property is transient in the given {@link Scope}. + * + * @param scope required scope + * @return property transient state, otherwise empty + */ + Optional transientProperty(Scope scope); + + /** + * Return custom property name in the given {@link Scope}. + * + * @param scope required scope + * @return property custom name, otherwise empty + */ + Optional name(Scope scope); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java new file mode 100644 index 00000000..6c57b94f --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java @@ -0,0 +1,260 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Locale; + +import jakarta.json.bind.annotation.JsonbDateFormat; + +/** + * Builder of the specific class property customization. + *
+ * Customization of the property accessor methods is done over the methods with the {@link Scope} + * parameter. Methods without any specific {@link Scope} parameter are setting required customization + * to the deserialization and serialization. + *

+ * For example having getter method with custom name like this + *

{@code
+ * @JsonbProperty("customName")
+ * public String getExample() { .... }
+ * }
+ * is effectively the same as having it set like this using the builder + *
{@code
+ * builder.name("customName", Scope.DESERIALIZATION);
+ * }
+ *

+ */ +public interface PropertyDecoratorBuilder extends SerializerDecoratorBuilder { + + /** + * Set custom property name for serialization and deserialization. + * + * @param name custom property name + * @return updated builder instance + */ + default PropertyDecoratorBuilder name(String name) { + return name(name, Scope.BOTH); + } + + /** + * Set custom property name bound to the selected {@link Scope}. + * + * @param name custom property name + * @param scope scope to which this name is bound + * @return updated builder instance + */ + PropertyDecoratorBuilder name(String name, Scope scope); + + /** + * Set number format which should be used. + * + * This number format is used for serialization and deserialization of the property. + * + * @param numberFormat number format + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder numberFormat(String numberFormat) { + return numberFormat(numberFormat, Scope.BOTH); + } + + /** + * Set number format locale which should be used. + * + * This locale is used for serialization and deserialization of the property. + * + * @param locale locale + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder numberFormat(Locale locale) { + return numberFormat(locale, Scope.BOTH); + } + + /** + * Set number format and locale which should be used. + * + * Both number format and locale are used for serialization and deserialization of the property. + * + * @param numberFormat number format + * @param locale locale + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder numberFormat(String numberFormat, Locale locale) { + return numberFormat(numberFormat, locale, Scope.BOTH); + } + + /** + * Set {@link NumberFormat} instance which should be used. + * + * This {@link NumberFormat} instance is used for serialization and deserialization of the property. + * + * @param numberFormat pre created NumberFormat instance + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder numberFormat(NumberFormat numberFormat) { + return numberFormat(numberFormat, Scope.BOTH); + } + + /** + * Set number format and locale which should be used in the given {@link Scope}. + * + * @param numberFormat number format + * @param locale number format locale + * @param scope scope of the format + * @return updated builder instance + */ + PropertyDecoratorBuilder numberFormat(String numberFormat, Locale locale, Scope scope); + + /** + * Set {@link NumberFormat} instance which should be used in the given {@link Scope}. + * + * @param numberFormat pre created NumberFormat instance + * @param scope scope of the format + * @return updated builder instance + */ + PropertyDecoratorBuilder numberFormat(NumberFormat numberFormat, Scope scope); + + /** + * Set number format which should be used in the given {@link Scope}. + * + * @param numberFormat number format + * @param scope scope of the format + * @return updated builder instance + */ + default PropertyDecoratorBuilder numberFormat(String numberFormat, Scope scope) { + return numberFormat(numberFormat, Locale.getDefault(), scope); + } + + /** + * Set number format locale which should be used in the given {@link Scope}. + * + * @param locale number format locale + * @param scope scope of the format + * @return updated builder instance + */ + default PropertyDecoratorBuilder numberFormat(Locale locale, Scope scope) { + return numberFormat("", locale, scope); + } + + /** + * Set date format and locale which should be used. + * + * Both date format and locale are used for serialization and deserialization of the property. + * + * @param dateFormat date format + * @param locale locale + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder dateFormat(String dateFormat, Locale locale) { + return dateFormat(dateFormat, locale, Scope.BOTH); + } + + /** + * Set date format which should be used. + * + * This date format is used for serialization and deserialization of the property. + * + * @param dateFormat date format + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder dateFormat(String dateFormat) { + return dateFormat(dateFormat, Locale.getDefault(), Scope.BOTH); + } + + + /** + * Set date format locale which should be used. + * + * This date format locale is used for serialization and deserialization of the property. + * + * @param locale locale + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder dateFormat(Locale locale) { + return dateFormat(JsonbDateFormat.DEFAULT_FORMAT, locale, Scope.BOTH); + } + + /** + * Set {@link DateFormat} instance which should be used. + * + * This {@link DateFormat} instance is used for serialization and deserialization of the property. + * + * @param dateFormat pre created DateFormat instance + * @return updated builder instance + */ + @Override + default PropertyDecoratorBuilder dateFormat(DateFormat dateFormat) { + return dateFormat(dateFormat, Scope.BOTH); + } + + /** + * Set date format and locale which should be used in the given {@link Scope}. + * + * @param dateFormat date format + * @param locale date format locale + * @param scope scope of the format + * @return updated builder instance + */ + PropertyDecoratorBuilder dateFormat(String dateFormat, Locale locale, Scope scope); + + /** + * Set {@link DateFormat} instance which should be used in the given {@link Scope}. + * + * @param dateFormat pre created DateFormat instance + * @return updated builder instance + */ + PropertyDecoratorBuilder dateFormat(DateFormat dateFormat, Scope scope); + + /** + * Set date format which should be used in the given {@link Scope}. + * + * @param dateFormat date format + * @param scope scope of the format + * @return updated builder instance + */ + default PropertyDecoratorBuilder dateFormat(String dateFormat, Scope scope) { + return dateFormat(dateFormat, Locale.getDefault(), scope); + } + + /** + * Set date format locale which should be used in the given {@link Scope}. + * + * @param locale date format locale + * @param scope scope of the format + * @return updated builder instance + */ + default PropertyDecoratorBuilder dateFormat(Locale locale, Scope scope) { + return dateFormat(JsonbDateFormat.DEFAULT_FORMAT, locale, scope); + } + + /** + * Whether the property is transient. + * + * @param isTransient transient property + * @return updated builder instance + */ + PropertyDecoratorBuilder transientProperty(boolean isTransient, Scope scope); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/Scope.java b/api/src/main/java/jakarta/json/bind/decorator/Scope.java new file mode 100644 index 00000000..735db865 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/Scope.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +/** + * Scope of upon which the customization should be used. + */ +public enum Scope { + + /** + * Transformation from JSON to the Java object. + */ + SERIALIZATION, + + /** + * Transformation from Java object to the JSON. + */ + DESERIALIZATION, + + /** + * Applied to the both {@link #SERIALIZATION} and {@link #DESERIALIZATION}. + */ + BOTH +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java new file mode 100644 index 00000000..2becaad6 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.Optional; + +import jakarta.json.bind.serializer.JsonbDeserializer; +import jakarta.json.bind.serializer.JsonbSerializer; + +/** + * Extension of the {@link CommonDecorator} over the serialization specific methods. + */ +public interface SerializerDecorator extends CommonDecorator { + + /** + * Return {@link JsonbSerializer} of the component. + * + * @return component serializer instance, otherwise empty + */ + Optional> serializer(); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java new file mode 100644 index 00000000..2a532bfa --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import jakarta.json.bind.serializer.JsonbSerializer; + +/** + * Extension of the {@link CommonDecoratorBuilder} over the serialization specific methods. + */ +public interface SerializerDecoratorBuilder, B> extends CommonDecoratorBuilder { + + /** + * Set {@link JsonbSerializer} which should be used for this component. + * + * @param serializer component deserializer + * @return updated builder instance + */ + T serializer(JsonbSerializer serializer); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java new file mode 100644 index 00000000..d121d60f --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.Map; +import java.util.Optional; + +import jakarta.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.config.PropertyVisibilityStrategy; + +/** + * Decorated type customization. + */ +public interface TypeDecorator extends SerializerDecorator { + + /** + * Create new {@link TypeDecoratorBuilder} instance base on type class. + * Parameter typeClass is required to be non-null. + * + * @param typeClass type class + * @return new type decorator builder instance + */ + static TypeDecoratorBuilder builder(Class typeClass) { + return BuilderProviderLoader.provider().newTypeDecoratorBuilder(typeClass); + } + + /** + * Return {@link PropertyOrderStrategy} of the decorated type. + * + * @return property order strategy instance, otherwise empty + */ + Optional propertyOrderStrategy(); + + /** + * Return {@link PropertyVisibilityStrategy} of the decorated type. + * + * @return property visibility strategy instance, otherwise empty + */ + Optional propertyVisibilityStrategy(); + + /** + * Return registered property decorators. + * If no property is registered, empty {@link Map} is returned. + * + * @return map of the registered property decorators, otherwise empty map + */ + Map properties(); + + /** + * Return {@link CreatorDecorator} of the decorated type. + * + * @return creator decorator instance, otherwise empty + */ + Optional creator(); + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java new file mode 100644 index 00000000..778facc8 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.decorator; + +import java.util.Objects; +import java.util.function.Consumer; + +import jakarta.json.bind.config.PropertyOrderStrategy; +import jakarta.json.bind.config.PropertyVisibilityStrategy; + +/** + * Builder of the specific type customization. + */ +public interface TypeDecoratorBuilder extends SerializerDecoratorBuilder { + + /** + * Set {@link PropertyOrderStrategy} which should be used. + * + * @param strategy property order strategy + * @return updated builder instance + */ + TypeDecoratorBuilder propertyOrder(PropertyOrderStrategy strategy); + + /** + * Set {@link PropertyVisibilityStrategy} which should be used. + * + * @param strategy property visibility strategy + * @return updated builder instance + */ + TypeDecoratorBuilder visibilityStrategy(PropertyVisibilityStrategy strategy); + + /** + * Add new {@link PropertyDecorator} of the property. + * + * @param propertyDecorator property decorator + * @return updated builder instance + */ + TypeDecoratorBuilder property(PropertyDecorator propertyDecorator); + + /** + * Add new {@link PropertyDecorator} of the property. + *
+ * Shortcut method to the {@link #property(PropertyDecorator)}. It is not required to create {@link PropertyDecoratorBuilder} + * since this method will create it based on the provided property name and expose it over the propertyBuilder parameter. + *
+ * Example usage: + *
{@code
+     * typeBuilder.property("exampleProperty", propertyBuilder -> propertyBuilder.nillable(true));
+     * }
+ * @param propertyName name of the class property + * @param propertyBuilder builder used to customize property + * @return updated builder instance + */ + default TypeDecoratorBuilder property(String propertyName, Consumer propertyBuilder) { + PropertyDecoratorBuilder builder = PropertyDecorator.builder(Objects.requireNonNull(propertyName)); + propertyBuilder.accept(builder); + return property(builder.build()); + } + + /** + * Add new {@link CreatorDecorator} of the type. + * + * @param creatorDecorator creator decorator + * @return updated builder instance + */ + TypeDecoratorBuilder creator(CreatorDecorator creatorDecorator); + + /** + * Add new {@link CreatorDecorator} of the type. + *
+ * Shortcut method to the {@link #creator(CreatorDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * since this method will create it based on the creator method name and expose it over the creatorBuilder parameter. + *
+ * Example usage: + *
{@code
+     * typeBuilder.creator("factoryMethodName",
+     *                     creatorBuilder -> creatorBuilder.addParameter(String.class, "firstParameter"));
+     * }
+ * @param creatorMethodName creator method name + * @param creatorBuilder creator builder instance consumer + * @return updated builder instance + */ + default TypeDecoratorBuilder creator(String creatorMethodName, Consumer creatorBuilder) { + CreatorDecoratorBuilder builder = CreatorDecorator.builder(creatorMethodName); + creatorBuilder.accept(builder); + return creator(builder.build()); + } + + /** + * Add new {@link CreatorDecorator} of the type. + *
+ * Shortcut method to the {@link #creator(CreatorDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * since this method will create it and expose it over the creatorBuilder parameter. Since no factory method name is + * provided, this creator builder is targeting constructors. + *
+ * Example usage: + *
{@code
+     * typeBuilder.creator(creatorBuilder -> creatorBuilder.addParameter(String.class, "firstParameter"));
+     * }
+ * @param creatorBuilder creator builder instance consumer + * @return updated builder instance + */ + default TypeDecoratorBuilder creator(Consumer creatorBuilder) { + CreatorDecoratorBuilder builder = CreatorDecorator.builder(); + creatorBuilder.accept(builder); + return creator(builder.build()); + } + +} diff --git a/api/src/main/java/jakarta/json/bind/decorator/package-info.java b/api/src/main/java/jakarta/json/bind/decorator/package-info.java new file mode 100644 index 00000000..d2540add --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/decorator/package-info.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +/** + *

+ * Defines decorators for different components to provide runtime customization with the same possibility as + * annotation approach. + *

+ * + * @since JSON Binding 2.1 + */ +package jakarta.json.bind.decorator; diff --git a/api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java b/api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java new file mode 100644 index 00000000..16407a7f --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.spi; + +import jakarta.json.bind.decorator.CreatorDecoratorBuilder; +import jakarta.json.bind.decorator.ParamDecoratorBuilder; +import jakarta.json.bind.decorator.PropertyDecoratorBuilder; +import jakarta.json.bind.decorator.TypeDecoratorBuilder; + +/** + * Service provider for decorator builders. + */ +public interface DecoratorBuilderProvider { + + /** + * Return new {@link TypeDecoratorBuilder} instance based on decorated type class. + * + * @param decoratedType decorated type class + * @return new builder instance + */ + TypeDecoratorBuilder newTypeDecoratorBuilder(Class decoratedType); + + /** + * Return new {@link PropertyDecoratorBuilder} instance based on decorated property name. + * + * @param propertyName decorated property name + * @return new builder instance + */ + PropertyDecoratorBuilder newPropertyDecoratorBuilder(String propertyName); + + /** + * Return new {@link CreatorDecoratorBuilder}. + * + * @return new builder instance + */ + CreatorDecoratorBuilder newCreatorDecoratorBuilder(); + + /** + * Return new {@link CreatorDecoratorBuilder} instance based on creator method name. + * + * @param methodName decorated creator method name + * @return new builder instance + */ + CreatorDecoratorBuilder newCreatorDecoratorBuilder(String methodName); + + /** + * Return new {@link ParamDecoratorBuilder} instance based on parameter class and its name in JSON document. + * + * @param paramClass decorated parameter class + * @param jsonName decorated parameter json name + * @return new builder instance + */ + ParamDecoratorBuilder newCreatorParamBuilder(Class paramClass, String jsonName); + +} diff --git a/api/src/main/java/module-info.java b/api/src/main/java/module-info.java index 521faf9a..b36dba97 100644 --- a/api/src/main/java/module-info.java +++ b/api/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2021 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 @@ -19,6 +19,7 @@ exports jakarta.json.bind.adapter; exports jakarta.json.bind.annotation; exports jakarta.json.bind.config; + exports jakarta.json.bind.decorator; exports jakarta.json.bind.serializer; exports jakarta.json.bind.spi; @@ -26,4 +27,5 @@ requires java.logging; uses jakarta.json.bind.spi.JsonbProvider; + uses jakarta.json.bind.spi.DecoratorBuilderProvider; } From 9c6782abd6a498a27c8847aff397c51294f91bdd Mon Sep 17 00:00:00 2001 From: David Kral Date: Mon, 26 Jul 2021 10:26:18 +0200 Subject: [PATCH 02/12] 3rd party class customization Signed-off-by: David Kral --- .../decorator/{CommonDecorator.java => JsonbDecorator.java} | 2 +- ...ommonDecoratorBuilder.java => JsonbDecoratorBuilder.java} | 2 +- .../java/jakarta/json/bind/decorator/ParamDecorator.java | 2 +- .../jakarta/json/bind/decorator/ParamDecoratorBuilder.java | 2 +- .../jakarta/json/bind/decorator/SerializerDecorator.java | 5 ++--- .../json/bind/decorator/SerializerDecoratorBuilder.java | 4 ++-- 6 files changed, 8 insertions(+), 9 deletions(-) rename api/src/main/java/jakarta/json/bind/decorator/{CommonDecorator.java => JsonbDecorator.java} (98%) rename api/src/main/java/jakarta/json/bind/decorator/{CommonDecoratorBuilder.java => JsonbDecoratorBuilder.java} (97%) diff --git a/api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/JsonbDecorator.java similarity index 98% rename from api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java rename to api/src/main/java/jakarta/json/bind/decorator/JsonbDecorator.java index f2099463..34f048ee 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/CommonDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/JsonbDecorator.java @@ -26,7 +26,7 @@ /** * Common interface for all of the decorators. */ -public interface CommonDecorator { +public interface JsonbDecorator { /** * Return {@link NumberFormat} specified to the required {@link Scope}. diff --git a/api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/JsonbDecoratorBuilder.java similarity index 97% rename from api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java rename to api/src/main/java/jakarta/json/bind/decorator/JsonbDecoratorBuilder.java index a21de240..fb12efad 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/CommonDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/decorator/JsonbDecoratorBuilder.java @@ -26,7 +26,7 @@ /** * Common interface for all decorator builders. */ -public interface CommonDecoratorBuilder, B> { +public interface JsonbDecoratorBuilder, B> { /** * Whether this component can be nillable. diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java index 23dcad85..6f62a014 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java @@ -21,7 +21,7 @@ /** * Decorated parameter customization. */ -public interface ParamDecorator extends CommonDecorator { +public interface ParamDecorator extends JsonbDecorator { /** * Create new {@link ParamDecoratorBuilder} instance base on parameter class and its json name. diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java index c82bdc47..7936c81a 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java @@ -19,6 +19,6 @@ /** * Builder of the {@link ParamDecorator} instance. */ -public interface ParamDecoratorBuilder extends CommonDecoratorBuilder { +public interface ParamDecoratorBuilder extends JsonbDecoratorBuilder { } diff --git a/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java index 2becaad6..b88bce64 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecorator.java @@ -18,13 +18,12 @@ import java.util.Optional; -import jakarta.json.bind.serializer.JsonbDeserializer; import jakarta.json.bind.serializer.JsonbSerializer; /** - * Extension of the {@link CommonDecorator} over the serialization specific methods. + * Extension of the {@link JsonbDecorator} over the serialization specific methods. */ -public interface SerializerDecorator extends CommonDecorator { +public interface SerializerDecorator extends JsonbDecorator { /** * Return {@link JsonbSerializer} of the component. diff --git a/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java index 2a532bfa..e2ac199c 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/decorator/SerializerDecoratorBuilder.java @@ -19,9 +19,9 @@ import jakarta.json.bind.serializer.JsonbSerializer; /** - * Extension of the {@link CommonDecoratorBuilder} over the serialization specific methods. + * Extension of the {@link JsonbDecoratorBuilder} over the serialization specific methods. */ -public interface SerializerDecoratorBuilder, B> extends CommonDecoratorBuilder { +public interface SerializerDecoratorBuilder, B> extends JsonbDecoratorBuilder { /** * Set {@link JsonbSerializer} which should be used for this component. From 4a072f2f1bd55fee26ac2d09be7913c4064e5174 Mon Sep 17 00:00:00 2001 From: David Kral Date: Wed, 28 Jul 2021 15:03:08 +0200 Subject: [PATCH 03/12] DecoratorBuilderProvider removed Signed-off-by: David Kral --- .../bind/decorator/BuilderProviderLoader.java | 52 -------------- .../json/bind/decorator/CreatorDecorator.java | 6 +- .../json/bind/decorator/ParamDecorator.java | 4 +- .../bind/decorator/PropertyDecorator.java | 4 +- .../json/bind/decorator/TypeDecorator.java | 3 +- .../bind/spi/DecoratorBuilderProvider.java | 69 ------------------- .../jakarta/json/bind/spi/JsonbProvider.java | 44 ++++++++++++ api/src/main/java/module-info.java | 1 - 8 files changed, 56 insertions(+), 127 deletions(-) delete mode 100644 api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java delete mode 100644 api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java diff --git a/api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java b/api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java deleted file mode 100644 index a477de95..00000000 --- a/api/src/main/java/jakarta/json/bind/decorator/BuilderProviderLoader.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2021 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 - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the - * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, - * version 2 with the GNU Classpath Exception, which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - */ - -package jakarta.json.bind.decorator; - -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.ServiceLoader; - -import jakarta.json.bind.spi.DecoratorBuilderProvider; - -/** - * SPI loader of the {@link DecoratorBuilderProvider}. - */ -class BuilderProviderLoader { - - private static DecoratorBuilderProvider instance = null; - - private BuilderProviderLoader() { - throw new IllegalStateException("This class cannot be instantiated"); - } - - static DecoratorBuilderProvider provider() { - if (instance == null) { - synchronized (DecoratorBuilderProvider.class) { - if (instance != null) { - return instance; - } - PrivilegedAction loader = () -> - ServiceLoader.load(DecoratorBuilderProvider.class) - .findFirst() - .orElseThrow(() -> new IllegalStateException("Could not find any BuilderProvider implementation")); - instance = AccessController.doPrivileged(loader); - } - } - return instance; - } - -} diff --git a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java index 616e963e..4f59c3cf 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java @@ -19,6 +19,8 @@ import java.util.List; import java.util.Optional; +import jakarta.json.bind.spi.JsonbProvider; + /** * Decorated creator customization. */ @@ -32,7 +34,7 @@ public interface CreatorDecorator { * @return new creator decorator builder instance */ static CreatorDecoratorBuilder builder() { - return BuilderProviderLoader.provider().newCreatorDecoratorBuilder(); + return JsonbProvider.provider().newCreatorDecoratorBuilder(); } /** @@ -41,7 +43,7 @@ static CreatorDecoratorBuilder builder() { * @return new creator decorator builder instance */ static CreatorDecoratorBuilder builder(String methodName) { - return BuilderProviderLoader.provider().newCreatorDecoratorBuilder(methodName); + return JsonbProvider.provider().newCreatorDecoratorBuilder(methodName); } /** diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java index 6f62a014..cad6d0f9 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java @@ -18,6 +18,8 @@ import java.util.Objects; +import jakarta.json.bind.spi.JsonbProvider; + /** * Decorated parameter customization. */ @@ -36,7 +38,7 @@ static ParamDecoratorBuilder builder(Class paramClass, String jsonName) { if (jsonName == null || jsonName.isBlank()) { throw new IllegalStateException("Json name cannot be null or empty"); } - return BuilderProviderLoader.provider().newCreatorParamBuilder(paramClass, jsonName); + return JsonbProvider.provider().newCreatorParamBuilder(paramClass, jsonName); } /** diff --git a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java index 8540a5f7..76fc6094 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java @@ -18,6 +18,8 @@ import java.util.Optional; +import jakarta.json.bind.spi.JsonbProvider; + /** * Decorated property customization. */ @@ -34,7 +36,7 @@ static PropertyDecoratorBuilder builder(String propertyName) { if (propertyName == null || propertyName.isBlank()) { throw new IllegalStateException("Property name cannot be null or empty"); } - return BuilderProviderLoader.provider().newPropertyDecoratorBuilder(propertyName); + return JsonbProvider.provider().newPropertyDecoratorBuilder(propertyName); } /** diff --git a/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java b/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java index d121d60f..fc421f9d 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java +++ b/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java @@ -21,6 +21,7 @@ import jakarta.json.bind.config.PropertyOrderStrategy; import jakarta.json.bind.config.PropertyVisibilityStrategy; +import jakarta.json.bind.spi.JsonbProvider; /** * Decorated type customization. @@ -35,7 +36,7 @@ public interface TypeDecorator extends SerializerDecorator { * @return new type decorator builder instance */ static TypeDecoratorBuilder builder(Class typeClass) { - return BuilderProviderLoader.provider().newTypeDecoratorBuilder(typeClass); + return JsonbProvider.provider().newTypeDecoratorBuilder(typeClass); } /** diff --git a/api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java b/api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java deleted file mode 100644 index 16407a7f..00000000 --- a/api/src/main/java/jakarta/json/bind/spi/DecoratorBuilderProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2021 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 - * http://www.eclipse.org/legal/epl-2.0. - * - * This Source Code may also be made available under the following Secondary - * Licenses when the conditions for such availability set forth in the - * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, - * version 2 with the GNU Classpath Exception, which is available at - * https://www.gnu.org/software/classpath/license.html. - * - * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 - */ - -package jakarta.json.bind.spi; - -import jakarta.json.bind.decorator.CreatorDecoratorBuilder; -import jakarta.json.bind.decorator.ParamDecoratorBuilder; -import jakarta.json.bind.decorator.PropertyDecoratorBuilder; -import jakarta.json.bind.decorator.TypeDecoratorBuilder; - -/** - * Service provider for decorator builders. - */ -public interface DecoratorBuilderProvider { - - /** - * Return new {@link TypeDecoratorBuilder} instance based on decorated type class. - * - * @param decoratedType decorated type class - * @return new builder instance - */ - TypeDecoratorBuilder newTypeDecoratorBuilder(Class decoratedType); - - /** - * Return new {@link PropertyDecoratorBuilder} instance based on decorated property name. - * - * @param propertyName decorated property name - * @return new builder instance - */ - PropertyDecoratorBuilder newPropertyDecoratorBuilder(String propertyName); - - /** - * Return new {@link CreatorDecoratorBuilder}. - * - * @return new builder instance - */ - CreatorDecoratorBuilder newCreatorDecoratorBuilder(); - - /** - * Return new {@link CreatorDecoratorBuilder} instance based on creator method name. - * - * @param methodName decorated creator method name - * @return new builder instance - */ - CreatorDecoratorBuilder newCreatorDecoratorBuilder(String methodName); - - /** - * Return new {@link ParamDecoratorBuilder} instance based on parameter class and its name in JSON document. - * - * @param paramClass decorated parameter class - * @param jsonName decorated parameter json name - * @return new builder instance - */ - ParamDecoratorBuilder newCreatorParamBuilder(Class paramClass, String jsonName); - -} diff --git a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java index 250a478c..77bb7685 100644 --- a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java +++ b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java @@ -18,6 +18,10 @@ import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbException; +import jakarta.json.bind.decorator.CreatorDecoratorBuilder; +import jakarta.json.bind.decorator.ParamDecoratorBuilder; +import jakarta.json.bind.decorator.PropertyDecoratorBuilder; +import jakarta.json.bind.decorator.TypeDecoratorBuilder; import java.util.Iterator; import java.util.ServiceLoader; @@ -157,4 +161,44 @@ public static JsonbProvider provider(final String providerName) { */ public abstract JsonbBuilder create(); + /** + * Return new {@link TypeDecoratorBuilder} instance based on decorated type class. + * + * @param decoratedType decorated type class + * @return new builder instance + */ + public abstract TypeDecoratorBuilder newTypeDecoratorBuilder(Class decoratedType); + + /** + * Return new {@link PropertyDecoratorBuilder} instance based on decorated property name. + * + * @param propertyName decorated property name + * @return new builder instance + */ + public abstract PropertyDecoratorBuilder newPropertyDecoratorBuilder(String propertyName); + + /** + * Return new {@link CreatorDecoratorBuilder}. + * + * @return new builder instance + */ + public abstract CreatorDecoratorBuilder newCreatorDecoratorBuilder(); + + /** + * Return new {@link CreatorDecoratorBuilder} instance based on creator method name. + * + * @param methodName decorated creator method name + * @return new builder instance + */ + public abstract CreatorDecoratorBuilder newCreatorDecoratorBuilder(String methodName); + + /** + * Return new {@link ParamDecoratorBuilder} instance based on parameter class and its name in JSON document. + * + * @param paramClass decorated parameter class + * @param jsonName decorated parameter json name + * @return new builder instance + */ + public abstract ParamDecoratorBuilder newCreatorParamBuilder(Class paramClass, String jsonName); + } diff --git a/api/src/main/java/module-info.java b/api/src/main/java/module-info.java index b36dba97..c567aa66 100644 --- a/api/src/main/java/module-info.java +++ b/api/src/main/java/module-info.java @@ -27,5 +27,4 @@ requires java.logging; uses jakarta.json.bind.spi.JsonbProvider; - uses jakarta.json.bind.spi.DecoratorBuilderProvider; } From 88a18e74863c1e1c23cdb70f75a08c1c9c27c8cd Mon Sep 17 00:00:00 2001 From: David Kral Date: Thu, 29 Jul 2021 13:52:37 +0200 Subject: [PATCH 04/12] JsonbProvider SPI searching reworked Signed-off-by: David Kral --- .../jakarta/json/bind/spi/JsonbProvider.java | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java index 77bb7685..1d329e6f 100644 --- a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java +++ b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2021 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,6 +65,7 @@ public abstract class JsonbProvider { */ private static final String DEFAULT_PROVIDER = "org.eclipse.yasson.JsonBindingProvider"; + private static JsonbProvider instance = null; /** * Protected constructor. */ @@ -88,21 +89,28 @@ protected JsonbProvider() { */ @SuppressWarnings("UseSpecificCatch") public static JsonbProvider provider() { - ServiceLoader loader = ServiceLoader.load(JsonbProvider.class); - Iterator it = loader.iterator(); - if (it.hasNext()) { - return it.next(); - } - - try { - Class clazz = Class.forName(DEFAULT_PROVIDER); - return (JsonbProvider) clazz.newInstance(); - } catch (ClassNotFoundException x) { - throw new JsonbException("JSON Binding provider " + DEFAULT_PROVIDER + " not found", x); - } catch (Exception x) { - throw new JsonbException("JSON Binding provider " + DEFAULT_PROVIDER - + " could not be instantiated: " + x, x); + if (instance == null) { + synchronized (JsonbProvider.class) { + if (instance == null) { + ServiceLoader loader = ServiceLoader.load(JsonbProvider.class); + Iterator it = loader.iterator(); + if (it.hasNext()) { + instance = it.next(); + } else { + try { + Class clazz = Class.forName(DEFAULT_PROVIDER); + instance = (JsonbProvider) clazz.newInstance(); + } catch (ClassNotFoundException x) { + throw new JsonbException("JSON Binding provider " + DEFAULT_PROVIDER + " not found", x); + } catch (Exception x) { + throw new JsonbException("JSON Binding provider " + DEFAULT_PROVIDER + + " could not be instantiated: " + x, x); + } + } + } + } } + return instance; } /** @@ -129,11 +137,11 @@ public static JsonbProvider provider() { public static JsonbProvider provider(final String providerName) { if (providerName == null) { throw new IllegalArgumentException(); + } else if (instance != null && providerName.equals(instance.getClass().getName())) { + return instance; } ServiceLoader loader = ServiceLoader.load(JsonbProvider.class); - Iterator it = loader.iterator(); - while (it.hasNext()) { - JsonbProvider provider = it.next(); + for (JsonbProvider provider : loader) { if (providerName.equals(provider.getClass().getName())) { return provider; } From a4d3c513583b5fe52280e4e44de1b558931ba93e Mon Sep 17 00:00:00 2001 From: David Kral Date: Thu, 29 Jul 2021 16:35:13 +0200 Subject: [PATCH 05/12] instance changed to volatile Signed-off-by: David Kral --- api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java index 1d329e6f..bdef1b1c 100644 --- a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java +++ b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java @@ -65,7 +65,7 @@ public abstract class JsonbProvider { */ private static final String DEFAULT_PROVIDER = "org.eclipse.yasson.JsonBindingProvider"; - private static JsonbProvider instance = null; + private static volatile JsonbProvider instance = null; /** * Protected constructor. */ From 52ef94a1e07169e3072527de9ba3a92cd390b893 Mon Sep 17 00:00:00 2001 From: David Kral Date: Mon, 16 Aug 2021 17:30:55 +0200 Subject: [PATCH 06/12] Javadoc wording updated Signed-off-by: David Kral --- api/src/main/java/jakarta/json/bind/JsonbConfig.java | 2 +- api/src/main/java/jakarta/json/bind/decorator/Scope.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/jakarta/json/bind/JsonbConfig.java b/api/src/main/java/jakarta/json/bind/JsonbConfig.java index 4917eb87..2be475d8 100644 --- a/api/src/main/java/jakarta/json/bind/JsonbConfig.java +++ b/api/src/main/java/jakarta/json/bind/JsonbConfig.java @@ -128,7 +128,7 @@ public class JsonbConfig { public static final String DESERIALIZERS = "jsonb.derializers"; /** - * Property used to specify custom deserializers. + * Property used to specify type decorators. */ public static final String TYPE_DECORATORS = "jsonb.type-decorators"; diff --git a/api/src/main/java/jakarta/json/bind/decorator/Scope.java b/api/src/main/java/jakarta/json/bind/decorator/Scope.java index 735db865..385ab6cf 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/Scope.java +++ b/api/src/main/java/jakarta/json/bind/decorator/Scope.java @@ -22,12 +22,12 @@ public enum Scope { /** - * Transformation from JSON to the Java object. + * Transformation from Java object to the JSON. */ SERIALIZATION, /** - * Transformation from Java object to the JSON. + * Transformation from JSON to the Java object. */ DESERIALIZATION, From fb62caa31b40852dadeee2ad1535d78d3702db6e Mon Sep 17 00:00:00 2001 From: David Kral Date: Tue, 17 Aug 2021 13:11:29 +0200 Subject: [PATCH 07/12] Name refactored to customization Signed-off-by: David Kral --- .../java/jakarta/json/bind/JsonbConfig.java | 18 ++++---- .../CreatorCustomization.java} | 22 +++++----- .../CreatorCustomizationBuilder.java} | 40 ++++++++--------- .../JsonbCustomization.java} | 6 +-- .../JsonbCustomizationBuilder.java} | 6 +-- .../ParamCustomization.java} | 16 +++---- .../ParamCustomizationBuilder.java} | 6 +-- .../PropertyCustomization.java} | 12 ++--- .../PropertyCustomizationBuilder.java} | 43 +++++++++--------- .../{decorator => customization}/Scope.java | 2 +- .../SerializerCustomization.java} | 6 +-- .../SerializerCustomizationBuilder.java} | 7 +-- .../TypeCustomization.java} | 24 +++++----- .../TypeCustomizationBuilder.java} | 44 +++++++++---------- .../package-info.java | 4 +- .../jakarta/json/bind/spi/JsonbProvider.java | 38 ++++++++-------- api/src/main/java/module-info.java | 2 +- 17 files changed, 149 insertions(+), 147 deletions(-) rename api/src/main/java/jakarta/json/bind/{decorator/CreatorDecorator.java => customization/CreatorCustomization.java} (69%) rename api/src/main/java/jakarta/json/bind/{decorator/CreatorDecoratorBuilder.java => customization/CreatorCustomizationBuilder.java} (58%) rename api/src/main/java/jakarta/json/bind/{decorator/JsonbDecorator.java => customization/JsonbCustomization.java} (94%) rename api/src/main/java/jakarta/json/bind/{decorator/JsonbDecoratorBuilder.java => customization/JsonbCustomizationBuilder.java} (94%) rename api/src/main/java/jakarta/json/bind/{decorator/ParamDecorator.java => customization/ParamCustomization.java} (79%) rename api/src/main/java/jakarta/json/bind/{decorator/ParamDecoratorBuilder.java => customization/ParamCustomizationBuilder.java} (76%) rename api/src/main/java/jakarta/json/bind/{decorator/PropertyDecorator.java => customization/PropertyCustomization.java} (79%) rename api/src/main/java/jakarta/json/bind/{decorator/PropertyDecoratorBuilder.java => customization/PropertyCustomizationBuilder.java} (81%) rename api/src/main/java/jakarta/json/bind/{decorator => customization}/Scope.java (96%) rename api/src/main/java/jakarta/json/bind/{decorator/SerializerDecorator.java => customization/SerializerCustomization.java} (83%) rename api/src/main/java/jakarta/json/bind/{decorator/SerializerDecoratorBuilder.java => customization/SerializerCustomizationBuilder.java} (72%) rename api/src/main/java/jakarta/json/bind/{decorator/TypeDecorator.java => customization/TypeCustomization.java} (68%) rename api/src/main/java/jakarta/json/bind/{decorator/TypeDecoratorBuilder.java => customization/TypeCustomizationBuilder.java} (61%) rename api/src/main/java/jakarta/json/bind/{decorator => customization}/package-info.java (83%) diff --git a/api/src/main/java/jakarta/json/bind/JsonbConfig.java b/api/src/main/java/jakarta/json/bind/JsonbConfig.java index 2be475d8..2c2a6e90 100644 --- a/api/src/main/java/jakarta/json/bind/JsonbConfig.java +++ b/api/src/main/java/jakarta/json/bind/JsonbConfig.java @@ -21,7 +21,7 @@ import jakarta.json.bind.config.PropertyNamingStrategy; import jakarta.json.bind.config.PropertyVisibilityStrategy; -import jakarta.json.bind.decorator.TypeDecorator; +import jakarta.json.bind.customization.TypeCustomization; import jakarta.json.bind.serializer.JsonbDeserializer; import jakarta.json.bind.serializer.JsonbSerializer; @@ -128,9 +128,9 @@ public class JsonbConfig { public static final String DESERIALIZERS = "jsonb.derializers"; /** - * Property used to specify type decorators. + * Property used to specify runtime type customizations. */ - public static final String TYPE_DECORATORS = "jsonb.type-decorators"; + public static final String TYPE_CUSTOMIZATIONS = "jsonb.type-customizations"; /** * Property used to specify custom binary data strategy. @@ -367,17 +367,17 @@ public final JsonbConfig withDeserializers(final JsonbDeserializer... deserializ } /** - * Property used to specify custom type decorators. + * Property used to specify custom runtime type customizations. * - * Configures value of {@link #TYPE_DECORATORS} property. + * Configures value of {@link #TYPE_CUSTOMIZATIONS} property. * - * Calling withTypeDecorators more than once will merge the type decorators with previous value. + * Calling withTypeCustomizations more than once will merge the type customizations with previous value. * - * @param typeDecorators Custom type decorators which affects deserialization and serialization of the decorated types. + * @param typeCustomizations Type customizations which affects deserialization and serialization of the customized types. * @return This JsonbConfig instance. */ - public final JsonbConfig withTypeDecorators(final TypeDecorator... typeDecorators) { - mergeProperties(TYPE_DECORATORS, typeDecorators, TypeDecorator.class); + public final JsonbConfig withTypeCustomizations(final TypeCustomization... typeCustomizations) { + mergeProperties(TYPE_CUSTOMIZATIONS, typeCustomizations, TypeCustomization.class); return this; } diff --git a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java similarity index 69% rename from api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java rename to api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java index 4f59c3cf..47d2159a 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecorator.java +++ b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.util.List; import java.util.Optional; @@ -24,26 +24,26 @@ /** * Decorated creator customization. */ -public interface CreatorDecorator { +public interface CreatorCustomization { /** - * Create new {@link CreatorDecoratorBuilder} instance. + * Create new {@link CreatorCustomizationBuilder} instance. * * Builder created via this method targets constructors of the class it is bound to. * - * @return new creator decorator builder instance + * @return new creator customization builder instance */ - static CreatorDecoratorBuilder builder() { - return JsonbProvider.provider().newCreatorDecoratorBuilder(); + static CreatorCustomizationBuilder builder() { + return JsonbProvider.provider().newCreatorCustomizationBuilder(); } /** - * Create new {@link CreatorDecoratorBuilder} instance based on creator method name. + * Create new {@link CreatorCustomizationBuilder} instance based on creator method name. * - * @return new creator decorator builder instance + * @return new creator customization builder instance */ - static CreatorDecoratorBuilder builder(String methodName) { - return JsonbProvider.provider().newCreatorDecoratorBuilder(methodName); + static CreatorCustomizationBuilder builder(String methodName) { + return JsonbProvider.provider().newCreatorCustomizationBuilder(methodName); } /** @@ -60,6 +60,6 @@ static CreatorDecoratorBuilder builder(String methodName) { * * @return creator parameters */ - List params(); + List params(); } diff --git a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java similarity index 58% rename from api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java rename to api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java index 9b16224c..d56424e9 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/CreatorDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java @@ -14,33 +14,33 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.util.function.Consumer; /** - * Builder of the {@link CreatorDecorator} instance. + * Builder of the {@link CreatorCustomization} instance. * * When no creator method name is specified, it is assumed that creator is constructor. */ -public interface CreatorDecoratorBuilder { +public interface CreatorCustomizationBuilder { /** - * Add {@link ParamDecorator} instance. + * Add {@link ParamCustomization} instance. * * All creator parameters are required to be added in exact order as they are on decorated factory method/constructor. * * @param creatorParam creator parameter * @return updated builder instance */ - CreatorDecoratorBuilder addParameter(ParamDecorator creatorParam); + CreatorCustomizationBuilder addParameter(ParamCustomization creatorParam); /** - * Add new {@link ParamDecorator} of the property. + * Add new {@link ParamCustomization} of the property. *
- * Shortcut method to the {@link #addParameter(ParamDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} - * since this method will create {@link ParamDecorator} based on the provided parameter class and json name and by calling - * {@link ParamDecorator#create(Class, String)} method. No further customizations will be applied. + * Shortcut method to the {@link #addParameter(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} + * since this method will create {@link ParamCustomization} based on the provided parameter class and json name and by calling + * {@link ParamCustomization#create(Class, String)} method. No further customizations will be applied. *
* All creator parameters are required to be added in exact order as they are on decorated factory method/constructor. * @@ -48,14 +48,14 @@ public interface CreatorDecoratorBuilder { * @param jsonName json name of the parameter * @return updated builder instance */ - default CreatorDecoratorBuilder addParameter(Class parameterClass, String jsonName) { - return addParameter(ParamDecorator.create(parameterClass, jsonName)); + default CreatorCustomizationBuilder addParameter(Class parameterClass, String jsonName) { + return addParameter(ParamCustomization.create(parameterClass, jsonName)); } /** - * Add new {@link PropertyDecorator} of the property. + * Add new {@link PropertyCustomization} of the property. *
- * Shortcut method to the {@link #addParameter(ParamDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * Shortcut method to the {@link #addParameter(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} * since this method will create is based on the provided parameter class and json name. Created builder is provided over * the paramBuilder. *
@@ -71,19 +71,19 @@ default CreatorDecoratorBuilder addParameter(Class parameterClass, String jso * @param paramBuilder builder used to customize parameter * @return updated builder instance */ - default CreatorDecoratorBuilder addParameter(Class parameterClass, - String jsonName, - Consumer paramBuilder) { - ParamDecoratorBuilder builder = ParamDecorator.builder(parameterClass, jsonName); + default CreatorCustomizationBuilder addParameter(Class parameterClass, + String jsonName, + Consumer paramBuilder) { + ParamCustomizationBuilder builder = ParamCustomization.builder(parameterClass, jsonName); paramBuilder.accept(builder); return addParameter(builder.build()); } /** - * Build the new instance of the {@link CreatorDecorator}. + * Build the new instance of the {@link CreatorCustomization}. * - * @return new {@link CreatorDecorator} instance + * @return new {@link CreatorCustomization} instance */ - CreatorDecorator build(); + CreatorCustomization build(); } diff --git a/api/src/main/java/jakarta/json/bind/decorator/JsonbDecorator.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java similarity index 94% rename from api/src/main/java/jakarta/json/bind/decorator/JsonbDecorator.java rename to api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java index 34f048ee..9e769180 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/JsonbDecorator.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.text.DateFormat; import java.text.NumberFormat; @@ -24,9 +24,9 @@ import jakarta.json.bind.serializer.JsonbDeserializer; /** - * Common interface for all of the decorators. + * Common interface for all the customizations. */ -public interface JsonbDecorator { +public interface JsonbCustomization { /** * Return {@link NumberFormat} specified to the required {@link Scope}. diff --git a/api/src/main/java/jakarta/json/bind/decorator/JsonbDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java similarity index 94% rename from api/src/main/java/jakarta/json/bind/decorator/JsonbDecoratorBuilder.java rename to api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java index fb12efad..280448ab 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/JsonbDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.text.DateFormat; import java.text.NumberFormat; @@ -24,9 +24,9 @@ import jakarta.json.bind.serializer.JsonbDeserializer; /** - * Common interface for all decorator builders. + * Common interface for all customization builders. */ -public interface JsonbDecoratorBuilder, B> { +public interface JsonbCustomizationBuilder, B> { /** * Whether this component can be nillable. diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java similarity index 79% rename from api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java rename to api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java index cad6d0f9..847fe15f 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/ParamDecorator.java +++ b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.util.Objects; @@ -23,17 +23,17 @@ /** * Decorated parameter customization. */ -public interface ParamDecorator extends JsonbDecorator { +public interface ParamCustomization extends JsonbCustomization { /** - * Create new {@link ParamDecoratorBuilder} instance base on parameter class and its json name. + * Create new {@link ParamCustomizationBuilder} instance base on parameter class and its json name. * Both parameter class and json name are required to be non-null or empty. * * @param paramClass parameter class * @param jsonName parameter json name - * @return new param decorator builder instance + * @return new parameter customization builder instance */ - static ParamDecoratorBuilder builder(Class paramClass, String jsonName) { + static ParamCustomizationBuilder builder(Class paramClass, String jsonName) { Objects.requireNonNull(paramClass, "Parameter class cannot be null"); if (jsonName == null || jsonName.isBlank()) { throw new IllegalStateException("Json name cannot be null or empty"); @@ -42,14 +42,14 @@ static ParamDecoratorBuilder builder(Class paramClass, String jsonName) { } /** - * Create new instance of {@link ParamDecorator} base on parameter class and its json name. + * Create new instance of {@link ParamCustomization} base on parameter class and its json name. * Both parameter class and json name are required to be non-null or empty. * * @param paramClass parameter class * @param jsonName parameter json name - * @return new parameter decorator instance + * @return new parameter customization instance */ - static ParamDecorator create(Class paramClass, String jsonName) { + static ParamCustomization create(Class paramClass, String jsonName) { Objects.requireNonNull(paramClass, "Parameter class cannot be null"); if (jsonName == null || jsonName.isBlank()) { throw new IllegalStateException("Json name cannot be null or empty"); diff --git a/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/customization/ParamCustomizationBuilder.java similarity index 76% rename from api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java rename to api/src/main/java/jakarta/json/bind/customization/ParamCustomizationBuilder.java index 7936c81a..4b529523 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/ParamDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/ParamCustomizationBuilder.java @@ -14,11 +14,11 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; /** - * Builder of the {@link ParamDecorator} instance. + * Builder of the {@link ParamCustomization} instance. */ -public interface ParamDecoratorBuilder extends JsonbDecoratorBuilder { +public interface ParamCustomizationBuilder extends JsonbCustomizationBuilder { } diff --git a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java similarity index 79% rename from api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java rename to api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java index 76fc6094..d8053828 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecorator.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.util.Optional; @@ -23,20 +23,20 @@ /** * Decorated property customization. */ -public interface PropertyDecorator extends SerializerDecorator { +public interface PropertyCustomization extends SerializerCustomization { /** - * Create new {@link PropertyDecoratorBuilder} instance base on property name. + * Create new {@link PropertyCustomizationBuilder} instance base on property name. * Property name is required to be non-null or empty. * * @param propertyName name of the decorated property - * @return new property decorator builder instance + * @return new property customization builder instance */ - static PropertyDecoratorBuilder builder(String propertyName) { + static PropertyCustomizationBuilder builder(String propertyName) { if (propertyName == null || propertyName.isBlank()) { throw new IllegalStateException("Property name cannot be null or empty"); } - return JsonbProvider.provider().newPropertyDecoratorBuilder(propertyName); + return JsonbProvider.provider().newPropertyCustomizationBuilder(propertyName); } /** diff --git a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java similarity index 81% rename from api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java rename to api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java index 6c57b94f..90101d25 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/PropertyDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.text.DateFormat; import java.text.NumberFormat; @@ -40,7 +40,8 @@ * } *

*/ -public interface PropertyDecoratorBuilder extends SerializerDecoratorBuilder { +public interface PropertyCustomizationBuilder + extends SerializerCustomizationBuilder { /** * Set custom property name for serialization and deserialization. @@ -48,7 +49,7 @@ public interface PropertyDecoratorBuilder extends SerializerDecoratorBuilder, B> extends JsonbDecoratorBuilder { +public interface SerializerCustomizationBuilder, B> extends + JsonbCustomizationBuilder { /** * Set {@link JsonbSerializer} which should be used for this component. diff --git a/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java b/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java similarity index 68% rename from api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java rename to api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java index fc421f9d..3a84c0a2 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/TypeDecorator.java +++ b/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.util.Map; import java.util.Optional; @@ -26,17 +26,17 @@ /** * Decorated type customization. */ -public interface TypeDecorator extends SerializerDecorator { +public interface TypeCustomization extends SerializerCustomization { /** - * Create new {@link TypeDecoratorBuilder} instance base on type class. + * Create new {@link TypeCustomizationBuilder} instance base on type class. * Parameter typeClass is required to be non-null. * * @param typeClass type class - * @return new type decorator builder instance + * @return new type customization builder instance */ - static TypeDecoratorBuilder builder(Class typeClass) { - return JsonbProvider.provider().newTypeDecoratorBuilder(typeClass); + static TypeCustomizationBuilder builder(Class typeClass) { + return JsonbProvider.provider().newTypeCustomizationBuilder(typeClass); } /** @@ -54,18 +54,18 @@ static TypeDecoratorBuilder builder(Class typeClass) { Optional propertyVisibilityStrategy(); /** - * Return registered property decorators. + * Return registered property customizations. * If no property is registered, empty {@link Map} is returned. * - * @return map of the registered property decorators, otherwise empty map + * @return map of the registered property customizations, otherwise empty map */ - Map properties(); + Map properties(); /** - * Return {@link CreatorDecorator} of the decorated type. + * Return {@link CreatorCustomization} of the decorated type. * - * @return creator decorator instance, otherwise empty + * @return creator customization instance, otherwise empty */ - Optional creator(); + Optional creator(); } diff --git a/api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java b/api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java similarity index 61% rename from api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java rename to api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java index 778facc8..655eabba 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/TypeDecoratorBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java @@ -14,7 +14,7 @@ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; import java.util.Objects; import java.util.function.Consumer; @@ -25,7 +25,7 @@ /** * Builder of the specific type customization. */ -public interface TypeDecoratorBuilder extends SerializerDecoratorBuilder { +public interface TypeCustomizationBuilder extends SerializerCustomizationBuilder { /** * Set {@link PropertyOrderStrategy} which should be used. @@ -33,7 +33,7 @@ public interface TypeDecoratorBuilder extends SerializerDecoratorBuilder - * Shortcut method to the {@link #property(PropertyDecorator)}. It is not required to create {@link PropertyDecoratorBuilder} + * Shortcut method to the {@link #property(PropertyCustomization)}. It is not required to create {@link PropertyCustomizationBuilder} * since this method will create it based on the provided property name and expose it over the propertyBuilder parameter. *
* Example usage: @@ -65,24 +65,24 @@ public interface TypeDecoratorBuilder extends SerializerDecoratorBuilder propertyBuilder) { - PropertyDecoratorBuilder builder = PropertyDecorator.builder(Objects.requireNonNull(propertyName)); + default TypeCustomizationBuilder property(String propertyName, Consumer propertyBuilder) { + PropertyCustomizationBuilder builder = PropertyCustomization.builder(Objects.requireNonNull(propertyName)); propertyBuilder.accept(builder); return property(builder.build()); } /** - * Add new {@link CreatorDecorator} of the type. + * Add new {@link CreatorCustomization} of the type. * - * @param creatorDecorator creator decorator + * @param creatorCustomization creator customization * @return updated builder instance */ - TypeDecoratorBuilder creator(CreatorDecorator creatorDecorator); + TypeCustomizationBuilder creator(CreatorCustomization creatorCustomization); /** - * Add new {@link CreatorDecorator} of the type. + * Add new {@link CreatorCustomization} of the type. *
- * Shortcut method to the {@link #creator(CreatorDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * Shortcut method to the {@link #creator(CreatorCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} * since this method will create it based on the creator method name and expose it over the creatorBuilder parameter. *
* Example usage: @@ -94,16 +94,16 @@ default TypeDecoratorBuilder property(String propertyName, Consumer creatorBuilder) { - CreatorDecoratorBuilder builder = CreatorDecorator.builder(creatorMethodName); + default TypeCustomizationBuilder creator(String creatorMethodName, Consumer creatorBuilder) { + CreatorCustomizationBuilder builder = CreatorCustomization.builder(creatorMethodName); creatorBuilder.accept(builder); return creator(builder.build()); } /** - * Add new {@link CreatorDecorator} of the type. + * Add new {@link CreatorCustomization} of the type. *
- * Shortcut method to the {@link #creator(CreatorDecorator)}. It is not required to create {@link CreatorDecoratorBuilder} + * Shortcut method to the {@link #creator(CreatorCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} * since this method will create it and expose it over the creatorBuilder parameter. Since no factory method name is * provided, this creator builder is targeting constructors. *
@@ -114,8 +114,8 @@ default TypeDecoratorBuilder creator(String creatorMethodName, Consumer creatorBuilder) { - CreatorDecoratorBuilder builder = CreatorDecorator.builder(); + default TypeCustomizationBuilder creator(Consumer creatorBuilder) { + CreatorCustomizationBuilder builder = CreatorCustomization.builder(); creatorBuilder.accept(builder); return creator(builder.build()); } diff --git a/api/src/main/java/jakarta/json/bind/decorator/package-info.java b/api/src/main/java/jakarta/json/bind/customization/package-info.java similarity index 83% rename from api/src/main/java/jakarta/json/bind/decorator/package-info.java rename to api/src/main/java/jakarta/json/bind/customization/package-info.java index d2540add..52bc11bb 100644 --- a/api/src/main/java/jakarta/json/bind/decorator/package-info.java +++ b/api/src/main/java/jakarta/json/bind/customization/package-info.java @@ -16,10 +16,10 @@ /** *

- * Defines decorators for different components to provide runtime customization with the same possibility as + * Defines customizations for different components to provide runtime customization with the same possibility as * annotation approach. *

* * @since JSON Binding 2.1 */ -package jakarta.json.bind.decorator; +package jakarta.json.bind.customization; diff --git a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java index bdef1b1c..703e463d 100644 --- a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java +++ b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java @@ -18,10 +18,10 @@ import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbException; -import jakarta.json.bind.decorator.CreatorDecoratorBuilder; -import jakarta.json.bind.decorator.ParamDecoratorBuilder; -import jakarta.json.bind.decorator.PropertyDecoratorBuilder; -import jakarta.json.bind.decorator.TypeDecoratorBuilder; +import jakarta.json.bind.customization.CreatorCustomizationBuilder; +import jakarta.json.bind.customization.ParamCustomizationBuilder; +import jakarta.json.bind.customization.PropertyCustomizationBuilder; +import jakarta.json.bind.customization.TypeCustomizationBuilder; import java.util.Iterator; import java.util.ServiceLoader; @@ -170,43 +170,43 @@ public static JsonbProvider provider(final String providerName) { public abstract JsonbBuilder create(); /** - * Return new {@link TypeDecoratorBuilder} instance based on decorated type class. + * Return new {@link TypeCustomizationBuilder} instance based on customized type class. * - * @param decoratedType decorated type class + * @param decoratedType customized type class * @return new builder instance */ - public abstract TypeDecoratorBuilder newTypeDecoratorBuilder(Class decoratedType); + public abstract TypeCustomizationBuilder newTypeCustomizationBuilder(Class decoratedType); /** - * Return new {@link PropertyDecoratorBuilder} instance based on decorated property name. + * Return new {@link PropertyCustomizationBuilder} instance based on customized property name. * - * @param propertyName decorated property name + * @param propertyName customized property name * @return new builder instance */ - public abstract PropertyDecoratorBuilder newPropertyDecoratorBuilder(String propertyName); + public abstract PropertyCustomizationBuilder newPropertyCustomizationBuilder(String propertyName); /** - * Return new {@link CreatorDecoratorBuilder}. + * Return new {@link CreatorCustomizationBuilder}. * * @return new builder instance */ - public abstract CreatorDecoratorBuilder newCreatorDecoratorBuilder(); + public abstract CreatorCustomizationBuilder newCreatorCustomizationBuilder(); /** - * Return new {@link CreatorDecoratorBuilder} instance based on creator method name. + * Return new {@link CreatorCustomizationBuilder} instance based on creator method name. * - * @param methodName decorated creator method name + * @param methodName customized creator method name * @return new builder instance */ - public abstract CreatorDecoratorBuilder newCreatorDecoratorBuilder(String methodName); + public abstract CreatorCustomizationBuilder newCreatorCustomizationBuilder(String methodName); /** - * Return new {@link ParamDecoratorBuilder} instance based on parameter class and its name in JSON document. + * Return new {@link ParamCustomizationBuilder} instance based on parameter class and its name in JSON document. * - * @param paramClass decorated parameter class - * @param jsonName decorated parameter json name + * @param paramClass customized parameter class + * @param jsonName customized parameter json name * @return new builder instance */ - public abstract ParamDecoratorBuilder newCreatorParamBuilder(Class paramClass, String jsonName); + public abstract ParamCustomizationBuilder newCreatorParamBuilder(Class paramClass, String jsonName); } diff --git a/api/src/main/java/module-info.java b/api/src/main/java/module-info.java index c567aa66..5edeb677 100644 --- a/api/src/main/java/module-info.java +++ b/api/src/main/java/module-info.java @@ -19,7 +19,7 @@ exports jakarta.json.bind.adapter; exports jakarta.json.bind.annotation; exports jakarta.json.bind.config; - exports jakarta.json.bind.decorator; + exports jakarta.json.bind.customization; exports jakarta.json.bind.serializer; exports jakarta.json.bind.spi; From 37336006fdfbf8d610827ca0b0f589a610511158 Mon Sep 17 00:00:00 2001 From: David Kral Date: Tue, 17 Aug 2021 15:32:53 +0200 Subject: [PATCH 08/12] Jan's suggestions implemented Signed-off-by: David Kral --- .../customization/CreatorCustomization.java | 2 +- .../CreatorCustomizationBuilder.java | 18 +++++++-------- .../JsonbCustomizationBuilder.java | 2 +- .../customization/ParamCustomization.java | 4 ++-- .../PropertyCustomizationBuilder.java | 22 +++++++++++++++++++ .../SerializerCustomizationBuilder.java | 4 ++-- .../jakarta/json/bind/spi/JsonbProvider.java | 2 +- 7 files changed, 38 insertions(+), 16 deletions(-) diff --git a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java index 47d2159a..107981f7 100644 --- a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java @@ -55,7 +55,7 @@ static CreatorCustomizationBuilder builder(String methodName) { Optional factoryMethodName(); /** - * Return {@link List} of the registered parameters. The order of the parameters needs to be the same as they were added. + * Return immutable {@link List} of the registered parameters. The order of the parameters needs to be the same as they were added. * If no parameters were added, empty {@link List} is returned. * * @return creator parameters diff --git a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java index d56424e9..484e72e1 100644 --- a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java @@ -33,12 +33,12 @@ public interface CreatorCustomizationBuilder { * @param creatorParam creator parameter * @return updated builder instance */ - CreatorCustomizationBuilder addParameter(ParamCustomization creatorParam); + CreatorCustomizationBuilder addParam(ParamCustomization creatorParam); /** * Add new {@link ParamCustomization} of the property. *
- * Shortcut method to the {@link #addParameter(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} + * Shortcut method to the {@link #addParam(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} * since this method will create {@link ParamCustomization} based on the provided parameter class and json name and by calling * {@link ParamCustomization#create(Class, String)} method. No further customizations will be applied. *
@@ -48,14 +48,14 @@ public interface CreatorCustomizationBuilder { * @param jsonName json name of the parameter * @return updated builder instance */ - default CreatorCustomizationBuilder addParameter(Class parameterClass, String jsonName) { - return addParameter(ParamCustomization.create(parameterClass, jsonName)); + default CreatorCustomizationBuilder addParam(Class parameterClass, String jsonName) { + return addParam(ParamCustomization.create(parameterClass, jsonName)); } /** * Add new {@link PropertyCustomization} of the property. *
- * Shortcut method to the {@link #addParameter(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} + * Shortcut method to the {@link #addParam(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} * since this method will create is based on the provided parameter class and json name. Created builder is provided over * the paramBuilder. *
@@ -71,12 +71,12 @@ default CreatorCustomizationBuilder addParameter(Class parameterClass, String * @param paramBuilder builder used to customize parameter * @return updated builder instance */ - default CreatorCustomizationBuilder addParameter(Class parameterClass, - String jsonName, - Consumer paramBuilder) { + default CreatorCustomizationBuilder addParam(Class parameterClass, + String jsonName, + Consumer paramBuilder) { ParamCustomizationBuilder builder = ParamCustomization.builder(parameterClass, jsonName); paramBuilder.accept(builder); - return addParameter(builder.build()); + return addParam(builder.build()); } /** diff --git a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java index 280448ab..a4a965de 100644 --- a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java @@ -26,7 +26,7 @@ /** * Common interface for all customization builders. */ -public interface JsonbCustomizationBuilder, B> { +public interface JsonbCustomizationBuilder, B extends JsonbCustomization> { /** * Whether this component can be nillable. diff --git a/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java index 847fe15f..11c941a6 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java @@ -27,7 +27,7 @@ public interface ParamCustomization extends JsonbCustomization { /** * Create new {@link ParamCustomizationBuilder} instance base on parameter class and its json name. - * Both parameter class and json name are required to be non-null or empty. + * Both class and json name are required to be non-null or empty. * * @param paramClass parameter class * @param jsonName parameter json name @@ -38,7 +38,7 @@ static ParamCustomizationBuilder builder(Class paramClass, String jsonName) { if (jsonName == null || jsonName.isBlank()) { throw new IllegalStateException("Json name cannot be null or empty"); } - return JsonbProvider.provider().newCreatorParamBuilder(paramClass, jsonName); + return JsonbProvider.provider().newParamCustomizationBuilder(paramClass, jsonName); } /** diff --git a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java index 90101d25..74527c6d 100644 --- a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java @@ -62,6 +62,28 @@ default PropertyCustomizationBuilder name(String name) { */ PropertyCustomizationBuilder name(String name, Scope scope); + /** + * Whether this component can be nillable. + * + * This number format is used for serialization and deserialization of the property. + * + * @param nillable nillable component + * @return updated builder instance + */ + @Override + default PropertyCustomizationBuilder nillable(boolean nillable) { + return nillable(nillable, Scope.BOTH); + } + + /** + * Whether this component should be nillable in the given {@link Scope}. + * + * @param nillable nillable component + * @param scope scope of the nillable + * @return updated builder instance + */ + PropertyCustomizationBuilder nillable(boolean nillable, Scope scope); + /** * Set number format which should be used. * diff --git a/api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java index b51c44ed..5e1d148c 100644 --- a/api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java @@ -21,8 +21,8 @@ /** * Extension of the {@link JsonbCustomizationBuilder} over the serialization specific methods. */ -public interface SerializerCustomizationBuilder, B> extends - JsonbCustomizationBuilder { +public interface SerializerCustomizationBuilder, B extends JsonbCustomization> + extends JsonbCustomizationBuilder { /** * Set {@link JsonbSerializer} which should be used for this component. diff --git a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java index 703e463d..2c594904 100644 --- a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java +++ b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java @@ -207,6 +207,6 @@ public static JsonbProvider provider(final String providerName) { * @param jsonName customized parameter json name * @return new builder instance */ - public abstract ParamCustomizationBuilder newCreatorParamBuilder(Class paramClass, String jsonName); + public abstract ParamCustomizationBuilder newParamCustomizationBuilder(Class paramClass, String jsonName); } From 351b92e04f2b00f6816dd0d0c1d4e8f137aeddbb Mon Sep 17 00:00:00 2001 From: David Kral Date: Tue, 17 Aug 2021 15:48:46 +0200 Subject: [PATCH 09/12] Daniels suggestions implemented Signed-off-by: David Kral --- .../json/bind/customization/CreatorCustomizationBuilder.java | 4 ++-- .../java/jakarta/json/bind/customization/package-info.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java index 484e72e1..0e5678ac 100644 --- a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomizationBuilder.java @@ -56,8 +56,8 @@ default CreatorCustomizationBuilder addParam(Class parameterClass, String jso * Add new {@link PropertyCustomization} of the property. *
* Shortcut method to the {@link #addParam(ParamCustomization)}. It is not required to create {@link CreatorCustomizationBuilder} - * since this method will create is based on the provided parameter class and json name. Created builder is provided over - * the paramBuilder. + * since this method will create {@link CreatorCustomizationBuilder} based on the provided parameter class and json name. + * Created builder is provided over the paramBuilder. *
* All creator parameters are required to be added in exact order as they are on decorated factory method/constructor. *
diff --git a/api/src/main/java/jakarta/json/bind/customization/package-info.java b/api/src/main/java/jakarta/json/bind/customization/package-info.java index 52bc11bb..c046db25 100644 --- a/api/src/main/java/jakarta/json/bind/customization/package-info.java +++ b/api/src/main/java/jakarta/json/bind/customization/package-info.java @@ -16,7 +16,7 @@ /** *

- * Defines customizations for different components to provide runtime customization with the same possibility as + * Defines customizations for different components to provide runtime customization with the same capability as * annotation approach. *

* From eda10e1ab600f46237655dacb6c58dae87743dcd Mon Sep 17 00:00:00 2001 From: David Kral Date: Tue, 17 Aug 2021 17:59:15 +0200 Subject: [PATCH 10/12] Both scope removed Signed-off-by: David Kral --- .../customization/JsonbCustomization.java | 26 --------- .../customization/ParamCustomization.java | 2 +- .../customization/PropertyCustomization.java | 2 +- .../PropertyCustomizationBuilder.java | 22 ++++---- .../json/bind/customization/Scope.java | 4 -- .../customization/ScopedCustomization.java | 55 +++++++++++++++++++ .../customization/ScopelessCustomization.java | 50 +++++++++++++++++ .../bind/customization/TypeCustomization.java | 2 +- 8 files changed, 120 insertions(+), 43 deletions(-) create mode 100644 api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java create mode 100644 api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java diff --git a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java index 9e769180..0246ae37 100644 --- a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java @@ -16,8 +16,6 @@ package jakarta.json.bind.customization; -import java.text.DateFormat; -import java.text.NumberFormat; import java.util.Optional; import jakarta.json.bind.adapter.JsonbAdapter; @@ -28,22 +26,6 @@ */ public interface JsonbCustomization { - /** - * Return {@link NumberFormat} specified to the required {@link Scope}. - * - * @param scope required scope - * @return specified {@link NumberFormat} instance, otherwise empty - */ - Optional numberFormat(Scope scope); - - /** - * Return {@link DateFormat} specified to the required {@link Scope}. - * - * @param scope required scope - * @return specified {@link DateFormat} instance, otherwise empty - */ - Optional dateFormat(Scope scope); - /** * Return {@link JsonbDeserializer} of the component. * @@ -58,12 +40,4 @@ public interface JsonbCustomization { */ Optional> adapter(); - /** - * Return if the component can be nillable in the given {@link Scope}. - * - * @param scope required scope - * @return property nillable state, otherwise empty - */ - Optional nillable(Scope scope); - } diff --git a/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java index 11c941a6..c69affba 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java @@ -23,7 +23,7 @@ /** * Decorated parameter customization. */ -public interface ParamCustomization extends JsonbCustomization { +public interface ParamCustomization extends JsonbCustomization, ScopelessCustomization { /** * Create new {@link ParamCustomizationBuilder} instance base on parameter class and its json name. diff --git a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java index d8053828..c0872b4f 100644 --- a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java @@ -23,7 +23,7 @@ /** * Decorated property customization. */ -public interface PropertyCustomization extends SerializerCustomization { +public interface PropertyCustomization extends ScopedCustomization { /** * Create new {@link PropertyCustomizationBuilder} instance base on property name. diff --git a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java index 74527c6d..2bd7d06f 100644 --- a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java @@ -50,7 +50,7 @@ public interface PropertyCustomizationBuilder * @return updated builder instance */ default PropertyCustomizationBuilder name(String name) { - return name(name, Scope.BOTH); + return name(name, Scope.SERIALIZATION).name(name, Scope.DESERIALIZATION); } /** @@ -72,7 +72,7 @@ default PropertyCustomizationBuilder name(String name) { */ @Override default PropertyCustomizationBuilder nillable(boolean nillable) { - return nillable(nillable, Scope.BOTH); + return nillable(nillable, Scope.SERIALIZATION).nillable(nillable, Scope.DESERIALIZATION); } /** @@ -94,7 +94,7 @@ default PropertyCustomizationBuilder nillable(boolean nillable) { */ @Override default PropertyCustomizationBuilder numberFormat(String numberFormat) { - return numberFormat(numberFormat, Scope.BOTH); + return numberFormat(numberFormat, Scope.SERIALIZATION).numberFormat(numberFormat, Scope.DESERIALIZATION); } /** @@ -107,7 +107,7 @@ default PropertyCustomizationBuilder numberFormat(String numberFormat) { */ @Override default PropertyCustomizationBuilder numberFormat(Locale locale) { - return numberFormat(locale, Scope.BOTH); + return numberFormat(locale, Scope.SERIALIZATION).numberFormat(locale, Scope.DESERIALIZATION); } /** @@ -121,7 +121,7 @@ default PropertyCustomizationBuilder numberFormat(Locale locale) { */ @Override default PropertyCustomizationBuilder numberFormat(String numberFormat, Locale locale) { - return numberFormat(numberFormat, locale, Scope.BOTH); + return numberFormat(numberFormat, locale, Scope.SERIALIZATION).numberFormat(numberFormat, locale, Scope.DESERIALIZATION); } /** @@ -134,7 +134,7 @@ default PropertyCustomizationBuilder numberFormat(String numberFormat, Locale lo */ @Override default PropertyCustomizationBuilder numberFormat(NumberFormat numberFormat) { - return numberFormat(numberFormat, Scope.BOTH); + return numberFormat(numberFormat, Scope.SERIALIZATION).numberFormat(numberFormat, Scope.DESERIALIZATION); } /** @@ -189,7 +189,7 @@ default PropertyCustomizationBuilder numberFormat(Locale locale, Scope scope) { */ @Override default PropertyCustomizationBuilder dateFormat(String dateFormat, Locale locale) { - return dateFormat(dateFormat, locale, Scope.BOTH); + return dateFormat(dateFormat, locale, Scope.SERIALIZATION).dateFormat(dateFormat, locale, Scope.DESERIALIZATION); } /** @@ -202,7 +202,8 @@ default PropertyCustomizationBuilder dateFormat(String dateFormat, Locale locale */ @Override default PropertyCustomizationBuilder dateFormat(String dateFormat) { - return dateFormat(dateFormat, Locale.getDefault(), Scope.BOTH); + return dateFormat(dateFormat, Locale.getDefault(), Scope.SERIALIZATION) + .dateFormat(dateFormat, Locale.getDefault(), Scope.DESERIALIZATION); } @@ -216,7 +217,8 @@ default PropertyCustomizationBuilder dateFormat(String dateFormat) { */ @Override default PropertyCustomizationBuilder dateFormat(Locale locale) { - return dateFormat(JsonbDateFormat.DEFAULT_FORMAT, locale, Scope.BOTH); + return dateFormat(JsonbDateFormat.DEFAULT_FORMAT, locale, Scope.SERIALIZATION) + .dateFormat(JsonbDateFormat.DEFAULT_FORMAT, locale, Scope.DESERIALIZATION); } /** @@ -229,7 +231,7 @@ default PropertyCustomizationBuilder dateFormat(Locale locale) { */ @Override default PropertyCustomizationBuilder dateFormat(DateFormat dateFormat) { - return dateFormat(dateFormat, Scope.BOTH); + return dateFormat(dateFormat, Scope.SERIALIZATION).dateFormat(dateFormat, Scope.DESERIALIZATION); } /** diff --git a/api/src/main/java/jakarta/json/bind/customization/Scope.java b/api/src/main/java/jakarta/json/bind/customization/Scope.java index bdfdc9ea..2247d8a5 100644 --- a/api/src/main/java/jakarta/json/bind/customization/Scope.java +++ b/api/src/main/java/jakarta/json/bind/customization/Scope.java @@ -31,8 +31,4 @@ public enum Scope { */ DESERIALIZATION, - /** - * Applied to the both {@link #SERIALIZATION} and {@link #DESERIALIZATION}. - */ - BOTH } diff --git a/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java new file mode 100644 index 00000000..87a0dd2d --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.customization; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Optional; + +import jakarta.json.bind.adapter.JsonbAdapter; +import jakarta.json.bind.serializer.JsonbDeserializer; + +/** + * Customization methods with the scope. + */ +public interface ScopedCustomization extends SerializerCustomization { + + /** + * Return {@link NumberFormat} specified to the required {@link Scope}. + * + * @param scope required scope + * @return specified {@link NumberFormat} instance, otherwise empty + */ + Optional numberFormat(Scope scope); + + /** + * Return {@link DateFormat} specified to the required {@link Scope}. + * + * @param scope required scope + * @return specified {@link DateFormat} instance, otherwise empty + */ + Optional dateFormat(Scope scope); + + /** + * Return if the component can be nillable in the given {@link Scope}. + * + * @param scope required scope + * @return property nillable state, otherwise empty + */ + Optional nillable(Scope scope); + +} diff --git a/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java new file mode 100644 index 00000000..91e821f2 --- /dev/null +++ b/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2021 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 + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.json.bind.customization; + +import java.text.DateFormat; +import java.text.NumberFormat; +import java.util.Optional; + +/** + * Customization methods without the scope. + */ +public interface ScopelessCustomization extends JsonbCustomization { + + /** + * Return specified {@link NumberFormat}. + * + * @return specified {@link NumberFormat} instance, otherwise empty + */ + Optional numberFormat(); + + /** + * Return {@link DateFormat}. + * + * @return specified {@link DateFormat} instance, otherwise empty + */ + Optional dateFormat(); + + /** + * Return if the component can be nillable. + * + * @return property nillable state, otherwise empty + */ + Optional nillable(); + + +} diff --git a/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java b/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java index 3a84c0a2..d2446ead 100644 --- a/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java @@ -26,7 +26,7 @@ /** * Decorated type customization. */ -public interface TypeCustomization extends SerializerCustomization { +public interface TypeCustomization extends SerializerCustomization, ScopelessCustomization { /** * Create new {@link TypeCustomizationBuilder} instance base on type class. From 0950a50e72d9bd4aab7704afb86bad5e463d1500 Mon Sep 17 00:00:00 2001 From: David Kral Date: Tue, 17 Aug 2021 20:03:48 +0200 Subject: [PATCH 11/12] Ignored annotation option added, nillable method wording changed Signed-off-by: David Kral --- .../JsonbCustomizationBuilder.java | 9 ++++++++ .../PropertyCustomizationBuilder.java | 21 +++++++++++++++++++ .../customization/ScopedCustomization.java | 5 +++-- .../customization/ScopelessCustomization.java | 5 +++-- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java index a4a965de..a1b821ff 100644 --- a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java @@ -16,6 +16,7 @@ package jakarta.json.bind.customization; +import java.lang.annotation.Annotation; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Locale; @@ -118,6 +119,14 @@ public interface JsonbCustomizationBuilder ignoredAnnotation); + /** * Build the new instance from this builder. * diff --git a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java index 2bd7d06f..4781b890 100644 --- a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java @@ -16,6 +16,7 @@ package jakarta.json.bind.customization; +import java.lang.annotation.Annotation; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Locale; @@ -282,4 +283,24 @@ default PropertyCustomizationBuilder dateFormat(Locale locale, Scope scope) { */ PropertyCustomizationBuilder transientProperty(boolean isTransient, Scope scope); + /** + * Ignore selected annotation in the given {@link Scope}. + * + * @param ignoredAnnotation annotation to be ignored + * @return updated builder instance + */ + @Override + default PropertyCustomizationBuilder ignoreAnnotation(Class ignoredAnnotation) { + return ignoreAnnotation(ignoredAnnotation, Scope.SERIALIZATION) + .ignoreAnnotation(ignoredAnnotation, Scope.DESERIALIZATION); + } + + /** + * Ignore selected annotation on the property/accessor method depending on the scope. + * + * @param ignoredAnnotation annotation to be ignored + * @return updated builder instance + */ + PropertyCustomizationBuilder ignoreAnnotation(Class ignoredAnnotation, Scope scope); + } diff --git a/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java index 87a0dd2d..f15b6466 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java @@ -45,10 +45,11 @@ public interface ScopedCustomization extends SerializerCustomization { Optional dateFormat(Scope scope); /** - * Return if the component can be nillable in the given {@link Scope}. + * Return whether the component can be nillable in the given {@link Scope}. + * If no explicit value has been set, empty optional is returned. * * @param scope required scope - * @return property nillable state, otherwise empty + * @return property nillable state, if not explicitly set empty is returned */ Optional nillable(Scope scope); diff --git a/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java index 91e821f2..72d8ca19 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java @@ -40,9 +40,10 @@ public interface ScopelessCustomization extends JsonbCustomization { Optional dateFormat(); /** - * Return if the component can be nillable. + * Return whether this component can be nillable. + * If no explicit value has been set, empty optional is returned. * - * @return property nillable state, otherwise empty + * @return property nillable state, if not explicitly set empty is returned */ Optional nillable(); From bcf0ad4759c4ae7a6091a4ae35270eeb00a33774 Mon Sep 17 00:00:00 2001 From: David Kral Date: Thu, 16 Sep 2021 18:34:00 +0200 Subject: [PATCH 12/12] Naming changed to the get format and remaining ignore methods added Signed-off-by: David Kral --- .../customization/CreatorCustomization.java | 4 +- .../customization/JsonbCustomization.java | 4 +- .../JsonbCustomizationBuilder.java | 41 ++++++- .../customization/ParamCustomization.java | 4 +- .../customization/PropertyCustomization.java | 28 ++++- .../PropertyCustomizationBuilder.java | 110 ++++++++++++++++-- .../customization/ScopedCustomization.java | 11 +- .../customization/ScopelessCustomization.java | 6 +- ...n.java => SerializationCustomization.java} | 4 +- ...=> SerializationCustomizationBuilder.java} | 9 +- .../bind/customization/TypeCustomization.java | 39 ++++++- .../TypeCustomizationBuilder.java | 18 ++- .../jakarta/json/bind/spi/JsonbProvider.java | 6 +- 13 files changed, 237 insertions(+), 47 deletions(-) rename api/src/main/java/jakarta/json/bind/customization/{SerializerCustomization.java => SerializationCustomization.java} (89%) rename api/src/main/java/jakarta/json/bind/customization/{SerializerCustomizationBuilder.java => SerializationCustomizationBuilder.java} (81%) diff --git a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java index 107981f7..68976e0b 100644 --- a/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/CreatorCustomization.java @@ -52,7 +52,7 @@ static CreatorCustomizationBuilder builder(String methodName) { * * @return specified creator method name, otherwise empty */ - Optional factoryMethodName(); + Optional getFactoryMethodName(); /** * Return immutable {@link List} of the registered parameters. The order of the parameters needs to be the same as they were added. @@ -60,6 +60,6 @@ static CreatorCustomizationBuilder builder(String methodName) { * * @return creator parameters */ - List params(); + List getParams(); } diff --git a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java index 0246ae37..00ed7bdd 100644 --- a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomization.java @@ -31,13 +31,13 @@ public interface JsonbCustomization { * * @return component deserializer instance, otherwise empty */ - Optional> deserializer(); + Optional> getDeserializer(); /** * Return {@link JsonbAdapter} of the component. * * @return component adapter instance, otherwise empty */ - Optional> adapter(); + Optional> getAdapter(); } diff --git a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java index a1b821ff..d64c03be 100644 --- a/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/JsonbCustomizationBuilder.java @@ -16,7 +16,6 @@ package jakarta.json.bind.customization; -import java.lang.annotation.Annotation; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Locale; @@ -37,6 +36,13 @@ public interface JsonbCustomizationBuilder deserializer); + /** + * Ignore deserializer of this component. + * + * @return updated builder instance + */ + T ignoreDeserializer(); + /** * Set {@link JsonbAdapter} which should be used. * @@ -53,6 +66,13 @@ public interface JsonbCustomizationBuilder adapter); + /** + * Ignore adapter of this component. + * + * @return updated builder instance + */ + T ignoreAdapter(); + /** * Set number format and locale which should be used. * @@ -86,6 +106,13 @@ public interface JsonbCustomizationBuilder ignoredAnnotation); + T ignoreAllCustomizations(); /** * Build the new instance from this builder. diff --git a/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java index c69affba..770ef246 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ParamCustomization.java @@ -62,13 +62,13 @@ static ParamCustomization create(Class paramClass, String jsonName) { * * @return parameter json name */ - String jsonName(); + String getJsonName(); /** * Return parameter class. * * @return parameter class */ - Class parameterClass(); + Class getParameterClass(); } diff --git a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java index c0872b4f..8c493958 100644 --- a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomization.java @@ -16,6 +16,7 @@ package jakarta.json.bind.customization; +import java.util.Arrays; import java.util.Optional; import jakarta.json.bind.spi.JsonbProvider; @@ -39,13 +40,20 @@ static PropertyCustomizationBuilder builder(String propertyName) { return JsonbProvider.provider().newPropertyCustomizationBuilder(propertyName); } + /** + * Return the original property name. + * + * @return property name + */ + String getPropertyName(); + /** * Return if the property is transient in the given {@link Scope}. * * @param scope required scope * @return property transient state, otherwise empty */ - Optional transientProperty(Scope scope); + Optional getTransientProperty(Scope scope); /** * Return custom property name in the given {@link Scope}. @@ -53,6 +61,22 @@ static PropertyCustomizationBuilder builder(String propertyName) { * @param scope required scope * @return property custom name, otherwise empty */ - Optional name(Scope scope); + Optional getName(Scope scope); + + default PropertyCustomizationBuilder toBuilder() { + PropertyCustomizationBuilder builder = builder(getPropertyName()); + getAdapter().ifPresent(builder::adapter); + getDeserializer().ifPresent(builder::deserializer); + getSerializer().ifPresent(builder::serializer); + Arrays.stream(Scope.values()) + .forEach(scope -> { + getTransientProperty(scope).ifPresent(value -> builder.transientProperty(value, scope)); + getDateFormat(scope).ifPresent(value -> builder.dateFormat(value, scope)); + getName(scope).ifPresent(value -> builder.name(value, scope)); + getNillable(scope).ifPresent(value -> builder.nillable(value, scope)); + getNumberFormat(scope).ifPresent(value -> builder.numberFormat(value, scope)); + }); + return builder; + } } diff --git a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java index 4781b890..3e7c6c57 100644 --- a/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/PropertyCustomizationBuilder.java @@ -16,7 +16,6 @@ package jakarta.json.bind.customization; -import java.lang.annotation.Annotation; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Locale; @@ -42,7 +41,7 @@ *

*/ public interface PropertyCustomizationBuilder - extends SerializerCustomizationBuilder { + extends SerializationCustomizationBuilder { /** * Set custom property name for serialization and deserialization. @@ -63,6 +62,24 @@ default PropertyCustomizationBuilder name(String name) { */ PropertyCustomizationBuilder name(String name, Scope scope); + /** + * Ignore custom property name. + * + * Custom property name will be ignored for serialization and deserialization. + * + * @return updated builder instance + */ + default PropertyCustomizationBuilder ignoreName() { + return ignoreName(Scope.SERIALIZATION).ignoreName(Scope.DESERIALIZATION); + } + + /** + * Ignore custom property name in the given {@link Scope}. + * + * @return updated builder instance + */ + PropertyCustomizationBuilder ignoreName(Scope scope); + /** * Whether this component can be nillable. * @@ -85,6 +102,26 @@ default PropertyCustomizationBuilder nillable(boolean nillable) { */ PropertyCustomizationBuilder nillable(boolean nillable, Scope scope); + /** + * Ignore nillable customization of this component. + * + * Nillable customization will be ignored for both serialization and deserialization. + * + * @return updated builder instance + */ + @Override + default PropertyCustomizationBuilder ignoreNillable() { + return ignoreNillable(Scope.SERIALIZATION).ignoreNillable(Scope.DESERIALIZATION); + } + + /** + * Ignore nillable customization of this component in the given {@link Scope}. + * + * @param scope ignored scope + * @return updated builder instance + */ + PropertyCustomizationBuilder ignoreNillable(Scope scope); + /** * Set number format which should be used. * @@ -179,6 +216,26 @@ default PropertyCustomizationBuilder numberFormat(Locale locale, Scope scope) { return numberFormat("", locale, scope); } + /** + * Ignore number format and locale customization of this property. + * + * Both number format and locale will be ignored for serialization and deserialization of the property. + * + * @return updated builder instance + */ + @Override + default PropertyCustomizationBuilder ignoreNumberFormat() { + return ignoreNumberFormat(Scope.SERIALIZATION).ignoreTransient(Scope.DESERIALIZATION); + } + + /** + * Ignore number format customization of this property in the given {@link Scope}. + * + * @param scope ignored scope + * @return updated builder instance + */ + PropertyCustomizationBuilder ignoreNumberFormat(Scope scope); + /** * Set date format and locale which should be used. * @@ -275,32 +332,63 @@ default PropertyCustomizationBuilder dateFormat(Locale locale, Scope scope) { return dateFormat(JsonbDateFormat.DEFAULT_FORMAT, locale, scope); } + /** + * Ignore date format customization of this property. + * + * The date format is ignored for serialization and deserialization of the property. + * + * @return updated builder instance + */ + @Override + default PropertyCustomizationBuilder ignoreDateFormat() { + return ignoreDateFormat(Scope.SERIALIZATION).ignoreDateFormat(Scope.DESERIALIZATION); + } + + /** + * Ignore date format customization of this property in the given {@link Scope}. + * + * @return updated builder instance + */ + PropertyCustomizationBuilder ignoreDateFormat(Scope scope); + /** * Whether the property is transient. * + * This value of the property will be set for serialization and deserialization. + * * @param isTransient transient property * @return updated builder instance */ + default PropertyCustomizationBuilder transientProperty(boolean isTransient) { + return transientProperty(isTransient, Scope.SERIALIZATION).transientProperty(isTransient, Scope.DESERIALIZATION); + } + + /** + * Whether the property is transient in the given {@link Scope}. + * + * @param isTransient transient property + * @param scope transient scope + * @return updated builder instance + */ PropertyCustomizationBuilder transientProperty(boolean isTransient, Scope scope); /** - * Ignore selected annotation in the given {@link Scope}. + * Ignore transient status of this property. + * + * Transient will be ignored for serialization and deserialization. * - * @param ignoredAnnotation annotation to be ignored * @return updated builder instance */ - @Override - default PropertyCustomizationBuilder ignoreAnnotation(Class ignoredAnnotation) { - return ignoreAnnotation(ignoredAnnotation, Scope.SERIALIZATION) - .ignoreAnnotation(ignoredAnnotation, Scope.DESERIALIZATION); + default PropertyCustomizationBuilder ignoreTransient() { + return ignoreTransient(Scope.SERIALIZATION).ignoreTransient(Scope.DESERIALIZATION); } /** - * Ignore selected annotation on the property/accessor method depending on the scope. + * Ignore transient status of this property in the given {@link Scope}. * - * @param ignoredAnnotation annotation to be ignored + * @param scope transient ignore scope * @return updated builder instance */ - PropertyCustomizationBuilder ignoreAnnotation(Class ignoredAnnotation, Scope scope); + PropertyCustomizationBuilder ignoreTransient(Scope scope); } diff --git a/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java index f15b6466..684e4bde 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ScopedCustomization.java @@ -20,13 +20,10 @@ import java.text.NumberFormat; import java.util.Optional; -import jakarta.json.bind.adapter.JsonbAdapter; -import jakarta.json.bind.serializer.JsonbDeserializer; - /** * Customization methods with the scope. */ -public interface ScopedCustomization extends SerializerCustomization { +public interface ScopedCustomization extends SerializationCustomization { /** * Return {@link NumberFormat} specified to the required {@link Scope}. @@ -34,7 +31,7 @@ public interface ScopedCustomization extends SerializerCustomization { * @param scope required scope * @return specified {@link NumberFormat} instance, otherwise empty */ - Optional numberFormat(Scope scope); + Optional getNumberFormat(Scope scope); /** * Return {@link DateFormat} specified to the required {@link Scope}. @@ -42,7 +39,7 @@ public interface ScopedCustomization extends SerializerCustomization { * @param scope required scope * @return specified {@link DateFormat} instance, otherwise empty */ - Optional dateFormat(Scope scope); + Optional getDateFormat(Scope scope); /** * Return whether the component can be nillable in the given {@link Scope}. @@ -51,6 +48,6 @@ public interface ScopedCustomization extends SerializerCustomization { * @param scope required scope * @return property nillable state, if not explicitly set empty is returned */ - Optional nillable(Scope scope); + Optional getNillable(Scope scope); } diff --git a/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java b/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java index 72d8ca19..82dac7dc 100644 --- a/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/ScopelessCustomization.java @@ -30,14 +30,14 @@ public interface ScopelessCustomization extends JsonbCustomization { * * @return specified {@link NumberFormat} instance, otherwise empty */ - Optional numberFormat(); + Optional getNumberFormat(); /** * Return {@link DateFormat}. * * @return specified {@link DateFormat} instance, otherwise empty */ - Optional dateFormat(); + Optional getDateFormat(); /** * Return whether this component can be nillable. @@ -45,7 +45,7 @@ public interface ScopelessCustomization extends JsonbCustomization { * * @return property nillable state, if not explicitly set empty is returned */ - Optional nillable(); + Optional getNillable(); } diff --git a/api/src/main/java/jakarta/json/bind/customization/SerializerCustomization.java b/api/src/main/java/jakarta/json/bind/customization/SerializationCustomization.java similarity index 89% rename from api/src/main/java/jakarta/json/bind/customization/SerializerCustomization.java rename to api/src/main/java/jakarta/json/bind/customization/SerializationCustomization.java index a96d5364..1b151770 100644 --- a/api/src/main/java/jakarta/json/bind/customization/SerializerCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/SerializationCustomization.java @@ -23,13 +23,13 @@ /** * Extension of the {@link JsonbCustomization} over the serialization specific methods. */ -public interface SerializerCustomization extends JsonbCustomization { +public interface SerializationCustomization extends JsonbCustomization { /** * Return {@link JsonbSerializer} of the component. * * @return component serializer instance, otherwise empty */ - Optional> serializer(); + Optional> getSerializer(); } diff --git a/api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/SerializationCustomizationBuilder.java similarity index 81% rename from api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java rename to api/src/main/java/jakarta/json/bind/customization/SerializationCustomizationBuilder.java index 5e1d148c..c840e87d 100644 --- a/api/src/main/java/jakarta/json/bind/customization/SerializerCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/SerializationCustomizationBuilder.java @@ -21,7 +21,7 @@ /** * Extension of the {@link JsonbCustomizationBuilder} over the serialization specific methods. */ -public interface SerializerCustomizationBuilder, B extends JsonbCustomization> +public interface SerializationCustomizationBuilder, B extends JsonbCustomization> extends JsonbCustomizationBuilder { /** @@ -32,4 +32,11 @@ public interface SerializerCustomizationBuilder serializer); + /** + * Ignore serializer of this component. + * + * @return updated builder instance + */ + T ignoreSerializer(); + } diff --git a/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java b/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java index d2446ead..e12fbbbe 100644 --- a/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java +++ b/api/src/main/java/jakarta/json/bind/customization/TypeCustomization.java @@ -24,9 +24,9 @@ import jakarta.json.bind.spi.JsonbProvider; /** - * Decorated type customization. + * Type customization. */ -public interface TypeCustomization extends SerializerCustomization, ScopelessCustomization { +public interface TypeCustomization extends SerializationCustomization, ScopelessCustomization { /** * Create new {@link TypeCustomizationBuilder} instance base on type class. @@ -39,19 +39,26 @@ static TypeCustomizationBuilder builder(Class typeClass) { return JsonbProvider.provider().newTypeCustomizationBuilder(typeClass); } + /** + * Return type which is this customization bound to. + * + * @return type which is this customization bound to + */ + Class getType(); + /** * Return {@link PropertyOrderStrategy} of the decorated type. * * @return property order strategy instance, otherwise empty */ - Optional propertyOrderStrategy(); + Optional getPropertyOrderStrategy(); /** * Return {@link PropertyVisibilityStrategy} of the decorated type. * * @return property visibility strategy instance, otherwise empty */ - Optional propertyVisibilityStrategy(); + Optional getPropertyVisibilityStrategy(); /** * Return registered property customizations. @@ -59,13 +66,33 @@ static TypeCustomizationBuilder builder(Class typeClass) { * * @return map of the registered property customizations, otherwise empty map */ - Map properties(); + Map getProperties(); /** * Return {@link CreatorCustomization} of the decorated type. * * @return creator customization instance, otherwise empty */ - Optional creator(); + Optional getCreator(); + + /** + * Convert {@link TypeCustomization} to the {@link TypeCustomizationBuilder} with prefilled values from original object. + * + * @return new {@link TypeCustomizationBuilder} instance + */ + default TypeCustomizationBuilder toBuilder() { + TypeCustomizationBuilder builder = builder(getType()); + getNillable().ifPresent(builder::nillable); + getDeserializer().ifPresent(builder::deserializer); + getSerializer().ifPresent(builder::serializer); + getAdapter().ifPresent(builder::adapter); + getNumberFormat().ifPresent(builder::numberFormat); + getDateFormat().ifPresent(builder::dateFormat); + getCreator().ifPresent(builder::creator); + getPropertyOrderStrategy().ifPresent(builder::propertyOrderStrategy); + getPropertyVisibilityStrategy().ifPresent(builder::visibilityStrategy); + getProperties().values().forEach(builder::property); + return builder; + } } diff --git a/api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java b/api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java index 655eabba..26215161 100644 --- a/api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java +++ b/api/src/main/java/jakarta/json/bind/customization/TypeCustomizationBuilder.java @@ -25,7 +25,7 @@ /** * Builder of the specific type customization. */ -public interface TypeCustomizationBuilder extends SerializerCustomizationBuilder { +public interface TypeCustomizationBuilder extends SerializationCustomizationBuilder { /** * Set {@link PropertyOrderStrategy} which should be used. @@ -33,7 +33,14 @@ public interface TypeCustomizationBuilder extends SerializerCustomizationBuilder * @param strategy property order strategy * @return updated builder instance */ - TypeCustomizationBuilder propertyOrder(PropertyOrderStrategy strategy); + TypeCustomizationBuilder propertyOrderStrategy(PropertyOrderStrategy strategy); + + /** + * Ignore property order strategy. + * + * @return updated builder instance + */ + TypeCustomizationBuilder ignorePropertyOrderStrategy(); /** * Set {@link PropertyVisibilityStrategy} which should be used. @@ -43,6 +50,13 @@ public interface TypeCustomizationBuilder extends SerializerCustomizationBuilder */ TypeCustomizationBuilder visibilityStrategy(PropertyVisibilityStrategy strategy); + /** + * Ignore visibility strategy. + * + * @return updated builder instance + */ + TypeCustomizationBuilder ignoreVisibilityStrategy(); + /** * Add new {@link PropertyCustomization} of the property. * diff --git a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java index 2c594904..56ffe34f 100644 --- a/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java +++ b/api/src/main/java/jakarta/json/bind/spi/JsonbProvider.java @@ -24,6 +24,7 @@ import jakarta.json.bind.customization.TypeCustomizationBuilder; import java.util.Iterator; +import java.util.Objects; import java.util.ServiceLoader; /** @@ -135,9 +136,8 @@ public static JsonbProvider provider() { */ @SuppressWarnings("UseSpecificCatch") public static JsonbProvider provider(final String providerName) { - if (providerName == null) { - throw new IllegalArgumentException(); - } else if (instance != null && providerName.equals(instance.getClass().getName())) { + Objects.requireNonNull(providerName, "providerName is required"); + if (instance != null && providerName.equals(instance.getClass().getName())) { return instance; } ServiceLoader loader = ServiceLoader.load(JsonbProvider.class);