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 extends Annotation> 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 extends Annotation> 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 extends Annotation> 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 extends Annotation> 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);