This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new b25243b2 [JOHNZON-390] ensure jsonb creator/constructor parameters
respect naming strategy
b25243b2 is described below
commit b25243b23f36f257e47d8fce9b914bb5c882889c
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Thu Dec 8 11:39:58 2022 +0100
[JOHNZON-390] ensure jsonb creator/constructor parameters respect naming
strategy
---
.../org/apache/johnzon/jsonb/JsonbAccessMode.java | 6 +--
.../java/org/apache/johnzon/jsonb/NamingTest.java | 61 ++++++++++++++++++++++
.../org/apache/johnzon/jsonb/test/JsonbRule.java | 5 ++
.../jsonschema/JsonSchemaValidatorFactory.java | 15 +++---
.../jsonschema/JsonSchemaValidatorTest.java | 29 ++++++++++
pom.xml | 1 +
6 files changed, 108 insertions(+), 9 deletions(-)
diff --git
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
index a0d0d8c6..49411f56 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JsonbAccessMode.java
@@ -252,13 +252,13 @@ public class JsonbAccessMode implements AccessMode,
Closeable, Cleanable<Class<?
int i = 0;
for (final Parameter parameter : (finalConstructor == null ?
finalFactory : finalConstructor).getParameters()) {
final JsonbProperty property = getAnnotation(parameter,
JsonbProperty.class);
- params[i] = property != null ?
+ params[i] = property != null && !property.value().isEmpty() ?
property.value() :
(record ?
ofNullable(parameter.getAnnotation(JohnzonRecord.Name.class))
.map(JohnzonRecord.Name::value)
- .orElseGet(parameter::getName) :
- parameter.getName());
+ .orElseGet(() ->
naming.translateName(parameter.getName())) :
+ naming.translateName(parameter.getName()));
final JsonbTypeAdapter adapter = getAnnotation(parameter,
JsonbTypeAdapter.class);
final JsonbDateFormat dateFormat = getAnnotation(parameter,
JsonbDateFormat.class);
diff --git
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/NamingTest.java
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/NamingTest.java
new file mode 100644
index 00000000..715523af
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/NamingTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.johnzon.jsonb;
+
+import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.junit.Rule;
+import org.junit.Test;
+
+import javax.json.bind.annotation.JsonbCreator;
+import javax.json.bind.config.PropertyNamingStrategy;
+import java.util.StringJoiner;
+
+import static org.junit.Assert.assertEquals;
+
+public class NamingTest {
+ @Rule
+ public final JsonbRule jsonb = new JsonbRule()
+
.withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_UNDERSCORES);
+
+ @Test
+ public void lower() {
+ assertEquals("{\"first_name\":\"test\"}", jsonb.toJson(new
Model("test")));
+ assertEquals("Model[firstName='test']",
jsonb.fromJson("{\"first_name\":\"test\"}", Model.class).toString());
+ }
+
+ public static class Model {
+ public final String firstName;
+
+ private Model(final String firstName) {
+ this.firstName = firstName;
+ }
+
+ @Override
+ public String toString() {
+ return new StringJoiner(", ", Model.class.getSimpleName() + "[",
"]")
+ .add("firstName='" + firstName + "'")
+ .toString();
+ }
+
+ @JsonbCreator
+ public static Model create(final String firstName) {
+ return new Model(firstName);
+ }
+ }
+}
diff --git
a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
index 62779863..f617fe1e 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/test/JsonbRule.java
@@ -47,6 +47,11 @@ public class JsonbRule implements TestRule, Jsonb,
JsonbExtension {
return this;
}
+ public JsonbRule withPropertyNamingStrategy(final String
propertyorderstrategy) {
+ config.withPropertyNamingStrategy(propertyorderstrategy);
+ return this;
+ }
+
public JsonbRule withFormatting(final boolean format) {
config.withFormatting(format);
return this;
diff --git
a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java
b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java
index 14103bc6..d62752fc 100644
---
a/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java
+++
b/johnzon-jsonschema/src/main/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorFactory.java
@@ -197,17 +197,20 @@ public class JsonSchemaValidatorFactory implements
AutoCloseable {
final Predicate<CharSequence> pattern =
regexFactory.get().apply(obj.getKey());
final JsonObject currentSchema =
obj.getValue().asJsonObject();
// no cache cause otherwise it could be in
properties
- return (Function<JsonValue,
Stream<ValidationResult.ValidationError>>) validable -> {
+ return (Function<JsonValue,
Stream<ValidationResult.ValidationError>>) root -> {
+ final JsonValue validable =
Optional.ofNullable(valueProvider)
+ .map(provider -> provider.apply(root))
+ .orElse(root);
if (validable.getValueType() !=
JsonValue.ValueType.OBJECT) {
return Stream.empty();
}
return
validable.asJsonObject().entrySet().stream()
.filter(e -> pattern.test(e.getKey()))
- .flatMap(e -> {
- final String[] subPath =
Stream.concat(Stream.of(path), Stream.of(e.getKey())).toArray(String[]::new);
- final Function<JsonValue,
JsonValue> provider = new ChainedValueAccessor(valueProvider, e.getKey());
- return buildValidator(subPath,
currentSchema, provider).apply(validable);
- });
+ .flatMap(e -> buildValidator(
+ Stream.concat(Stream.of(path),
Stream.of(e.getKey())).toArray(String[]::new),
+ currentSchema,
+ o ->
o.asJsonObject().get(e.getKey()))
+ .apply(validable));
};
})
.collect(toList()))
diff --git
a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
index 3331ed38..adae7ae8 100644
---
a/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
+++
b/johnzon-jsonschema/src/test/java/org/apache/johnzon/jsonschema/JsonSchemaValidatorTest.java
@@ -49,6 +49,35 @@ public class JsonSchemaValidatorTest {
factory.close();
}
+ @Test
+ public void patternPropertiesNested() {
+ try (final JsonSchemaValidator validator =
factory.newInstance(jsonFactory.createObjectBuilder()
+ .add("type", "object")
+ .add("properties", jsonFactory.createObjectBuilder()
+ .add("nested", jsonFactory.createObjectBuilder()
+ .add("type", "object")
+ .add("patternProperties",
jsonFactory.createObjectBuilder()
+ .add("[0-9]+",
jsonFactory.createObjectBuilder().add("type", "number"))
+ .build())))
+ .build())) {
+
+
assertTrue(validator.apply(jsonFactory.createObjectBuilder().build()).isSuccess());
+ assertTrue(validator.apply(jsonFactory.createObjectBuilder()
+ .add("nested", jsonFactory.createObjectBuilder()
+ .add("1", 1)
+ .build())
+ .build())
+ .isSuccess());
+
+ final ValidationResult result =
validator.apply(jsonFactory.createObjectBuilder()
+ .add("nested", jsonFactory.createObjectBuilder()
+ .add("1", "test")
+ .build())
+ .build());
+ assertFalse(result.toString(), result.isSuccess());
+ }
+ }
+
@Test
public void rootRequired() {
final JsonSchemaValidator validator =
factory.newInstance(jsonFactory.createObjectBuilder()
diff --git a/pom.xml b/pom.xml
index 13dfe016..1a43bed4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -277,6 +277,7 @@
<encoding>${project.build.sourceEncoding}</encoding>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
+ <parameters>true</parameters>
</configuration>
</plugin>