Merge pull request #396 from aguibert/backport-pr-395
Backport recent bug fixes to 1.0.X
diff --git a/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java b/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java
index a03674f..432c7fe 100644
--- a/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java
+++ b/src/main/java/org/eclipse/yasson/internal/AnnotationIntrospector.java
@@ -38,6 +38,9 @@
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.OptionalDouble;
+import java.util.OptionalInt;
+import java.util.OptionalLong;
import java.util.Queue;
import java.util.Set;
@@ -70,6 +73,7 @@
import org.eclipse.yasson.internal.model.customization.ClassCustomizationBuilder;
import org.eclipse.yasson.internal.properties.MessageKeys;
import org.eclipse.yasson.internal.properties.Messages;
+import org.eclipse.yasson.internal.serializer.DefaultSerializers;
import org.eclipse.yasson.internal.serializer.JsonbDateFormatter;
import org.eclipse.yasson.internal.serializer.JsonbNumberFormatter;
@@ -351,6 +355,13 @@
if (jsonbNillable != null) {
return jsonbNillable.value();
}
+ Class<?> clazz = clazzElement.getElement();
+ if (clazz == Optional.class
+ || clazz == OptionalDouble.class
+ || clazz == OptionalInt.class
+ || clazz == OptionalLong.class) {
+ return true;
+ }
return jsonbContext.getConfigProperties().getConfigNullable();
}
@@ -748,6 +759,10 @@
*/
public JsonbAnnotatedElement<Class<?>> collectAnnotations(Class<?> clazz) {
JsonbAnnotatedElement<Class<?>> classElement = new JsonbAnnotatedElement<>(clazz);
+
+ if (DefaultSerializers.getInstance().isKnownType(clazz)) {
+ return classElement;
+ }
for (Class<?> ifc : collectInterfaces(clazz)) {
addIfNotPresent(classElement, ifc.getDeclaredAnnotations());
diff --git a/src/main/java/org/eclipse/yasson/internal/MappingContext.java b/src/main/java/org/eclipse/yasson/internal/MappingContext.java
index ef3b257..944736d 100644
--- a/src/main/java/org/eclipse/yasson/internal/MappingContext.java
+++ b/src/main/java/org/eclipse/yasson/internal/MappingContext.java
@@ -22,6 +22,7 @@
import org.eclipse.yasson.internal.model.JsonbAnnotatedElement;
import org.eclipse.yasson.internal.model.customization.ClassCustomization;
import org.eclipse.yasson.internal.serializer.ContainerSerializerProvider;
+import org.eclipse.yasson.internal.serializer.DefaultSerializers;
/**
* JSONB mappingContext. Created once per {@link javax.json.bind.Jsonb} instance. Represents a global scope.
@@ -92,7 +93,9 @@
customization,
parentClassModel,
jsonbContext.getConfigProperties().getPropertyNamingStrategy());
- classParser.parseProperties(newClassModel, clsElement);
+ if (!DefaultSerializers.getInstance().isKnownType(aClass)) {
+ classParser.parseProperties(newClassModel, clsElement);
+ }
return newClassModel;
};
}
diff --git a/src/main/java/org/eclipse/yasson/internal/Marshaller.java b/src/main/java/org/eclipse/yasson/internal/Marshaller.java
index 0416b18..00f44fc 100644
--- a/src/main/java/org/eclipse/yasson/internal/Marshaller.java
+++ b/src/main/java/org/eclipse/yasson/internal/Marshaller.java
@@ -29,7 +29,6 @@
import org.eclipse.yasson.internal.properties.Messages;
import org.eclipse.yasson.internal.serializer.AbstractValueTypeSerializer;
import org.eclipse.yasson.internal.serializer.ContainerSerializerProvider;
-import org.eclipse.yasson.internal.serializer.DefaultSerializers;
import org.eclipse.yasson.internal.serializer.SerializerBuilder;
/**
@@ -159,10 +158,8 @@
.withObjectClass(rootClazz)
.withType(runtimeType);
- if (!DefaultSerializers.getInstance().isKnownType(rootClazz)) {
- ClassModel classModel = getMappingContext().getOrCreateClassModel(rootClazz);
- serializerBuilder.withCustomization(classModel.getClassCustomization());
- }
+ ClassModel classModel = getMappingContext().getOrCreateClassModel(rootClazz);
+ serializerBuilder.withCustomization(classModel.getClassCustomization());
return serializerBuilder.build();
}
diff --git a/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java b/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
index a1d786a..f93cb56 100644
--- a/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
+++ b/src/main/java/org/eclipse/yasson/internal/ReflectionUtils.java
@@ -246,7 +246,7 @@
declaredConstructor.setAccessible(true);
}
return declaredConstructor;
- } catch (NoSuchMethodException e) {
+ } catch (NoSuchMethodException | RuntimeException e) {
if (required) {
throw new JsonbException(Messages.getMessage(MessageKeys.NO_DEFAULT_CONSTRUCTOR, clazz), e);
}
diff --git a/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java b/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java
index a0c824d..047235d 100644
--- a/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java
+++ b/src/main/java/org/eclipse/yasson/internal/Unmarshaller.java
@@ -22,7 +22,6 @@
import org.eclipse.yasson.internal.model.ClassModel;
import org.eclipse.yasson.internal.properties.MessageKeys;
import org.eclipse.yasson.internal.properties.Messages;
-import org.eclipse.yasson.internal.serializer.DefaultSerializers;
import org.eclipse.yasson.internal.serializer.DeserializerBuilder;
/**
@@ -58,11 +57,8 @@
DeserializerBuilder deserializerBuilder = new DeserializerBuilder(getJsonbContext())
.withType(type).withJsonValueType(getRootEvent(parser));
Class<?> rawType = ReflectionUtils.getRawType(type);
- if (!DefaultSerializers.getInstance().isKnownType(rawType)) {
- ClassModel classModel = getMappingContext().getOrCreateClassModel(rawType);
- deserializerBuilder.withCustomization(classModel.getClassCustomization());
- }
-
+ ClassModel classModel = getMappingContext().getOrCreateClassModel(rawType);
+ deserializerBuilder.withCustomization(classModel.getClassCustomization());
return (T) deserializerBuilder.build().deserialize(parser, this, type);
} catch (JsonbException e) {
LOGGER.severe(e.getMessage());
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/BooleanArrayDeserializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/BooleanArrayDeserializer.java
new file mode 100644
index 0000000..3ad774e
--- /dev/null
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/BooleanArrayDeserializer.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016, 2020 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,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+
+package org.eclipse.yasson.internal.serializer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.yasson.internal.Unmarshaller;
+
+/**
+ * Array unmarshaller item implementation for booleans.
+ */
+public class BooleanArrayDeserializer extends AbstractArrayDeserializer<boolean[]> {
+
+ private final List<Boolean> items = new ArrayList<>();
+
+ /**
+ * Creates new instance of boolean array deserializer.
+ *
+ * @param builder deserializer builder
+ */
+ protected BooleanArrayDeserializer(DeserializerBuilder builder) {
+ super(builder);
+ }
+
+ @Override
+ protected List<?> getItems() {
+ return items;
+ }
+
+ @Override
+ public boolean[] getInstance(Unmarshaller unmarshaller) {
+ final int size = items.size();
+ final boolean[] byteArray = new boolean[size];
+ for (int i = 0; i < size; i++) {
+ byteArray[i] = items.get(i);
+ }
+ return byteArray;
+ }
+}
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/BooleanArraySerializer.java b/src/main/java/org/eclipse/yasson/internal/serializer/BooleanArraySerializer.java
new file mode 100644
index 0000000..caa4198
--- /dev/null
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/BooleanArraySerializer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2016, 2020 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,
+ * or the Eclipse Distribution License v. 1.0 which is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
+ */
+
+package org.eclipse.yasson.internal.serializer;
+
+import javax.json.bind.serializer.SerializationContext;
+import javax.json.stream.JsonGenerator;
+
+/**
+ * Serializes byte array as JSON array of booleans.
+ */
+public class BooleanArraySerializer extends AbstractArraySerializer<boolean[]> {
+
+ /**
+ * Creates new instance of boolean array serializer.
+ *
+ * @param builder serializer builder
+ */
+ protected BooleanArraySerializer(SerializerBuilder builder) {
+ super(builder);
+ }
+
+ @Override
+ protected void serializeInternal(boolean[] obj, JsonGenerator generator, SerializationContext ctx) {
+ for (boolean b : obj) {
+ generator.write(b);
+ }
+ }
+
+}
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/DeserializerBuilder.java b/src/main/java/org/eclipse/yasson/internal/serializer/DeserializerBuilder.java
index f6aae84..ad8250e 100644
--- a/src/main/java/org/eclipse/yasson/internal/serializer/DeserializerBuilder.java
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/DeserializerBuilder.java
@@ -287,6 +287,8 @@
return new FloatArrayDeserializer(this);
} else if (componentType == double.class) {
return new DoubleArrayDeserializer(this);
+ } else if (componentType == boolean.class) {
+ return new BooleanArrayDeserializer(this);
} else {
return new ObjectArrayDeserializer(this);
}
diff --git a/src/main/java/org/eclipse/yasson/internal/serializer/SerializerBuilder.java b/src/main/java/org/eclipse/yasson/internal/serializer/SerializerBuilder.java
index e74f5d7..1d6b2fa 100644
--- a/src/main/java/org/eclipse/yasson/internal/serializer/SerializerBuilder.java
+++ b/src/main/java/org/eclipse/yasson/internal/serializer/SerializerBuilder.java
@@ -140,6 +140,8 @@
return new FloatArraySerializer(this);
} else if (componentType == double.class) {
return new DoubleArraySerializer(this);
+ } else if (componentType == boolean.class) {
+ return new BooleanArraySerializer(this);
} else {
return new ObjectArraySerializer<>(this);
}
diff --git a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
index a4aa4ae..e1ec491 100644
--- a/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
+++ b/src/test/java/org/eclipse/yasson/adapters/AdaptersTest.java
@@ -24,6 +24,7 @@
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;
import javax.json.bind.adapter.JsonbAdapter;
+
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.time.Instant;
@@ -554,4 +555,30 @@
afterJson);
assertEquals(1, throwableAdapter.callCount);
}
+
+ public static class StringAdapter implements JsonbAdapter<String, String> {
+ @Override
+ public String adaptToJson(String obj) throws Exception {
+ return obj.toUpperCase();
+ }
+
+ @Override
+ public String adaptFromJson(String obj) throws Exception {
+ return obj.toLowerCase();
+ }
+ }
+
+ /**
+ * Test for: https://github.com/eclipse-ee4j/yasson/issues/346
+ */
+ @Test
+ public void testAdaptedRootType() {
+ Jsonb jsonb = JsonbBuilder.newBuilder()
+ .withConfig(new JsonbConfig().withAdapters(new StringAdapter()))
+ .build();
+
+ String original = "hello world!";
+ assertEquals("\"HELLO WORLD!\"", jsonb.toJson(original));
+ assertEquals(original, jsonb.fromJson("\"HELLO WORLD!\"", String.class));
+ }
}
diff --git a/src/test/java/org/eclipse/yasson/defaultmapping/basic/BooleanTest.java b/src/test/java/org/eclipse/yasson/defaultmapping/basic/BooleanTest.java
index 6b9876a..85d3d36 100644
--- a/src/test/java/org/eclipse/yasson/defaultmapping/basic/BooleanTest.java
+++ b/src/test/java/org/eclipse/yasson/defaultmapping/basic/BooleanTest.java
@@ -57,4 +57,14 @@
assertEquals("true", defaultJsonb.toJson(true, boolean.class));
assertEquals("false", defaultJsonb.toJson(Boolean.FALSE, Boolean.class));
}
+
+ //Fix for issue #390
+ @Test
+ public void testBooleanArrays() {
+ assertArrayEquals(new boolean[] {true, false}, defaultJsonb.fromJson("[true, false]", boolean[].class));
+ assertArrayEquals(new Boolean[] {true, false}, defaultJsonb.fromJson("[true, false]", Boolean[].class));
+
+ assertEquals("[true,false]", defaultJsonb.toJson(new boolean[] {true, false}));
+ assertEquals("[true,false]", defaultJsonb.toJson(new Boolean[] {true, false}));
+ }
}