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}));
+    }
 }