trivial flat support of 15869JohnzonJsonb
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/GeneratedJohnzonJsonb.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/GeneratedJohnzonJsonb.java
index df3b42d..305cfc0 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/GeneratedJohnzonJsonb.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/GeneratedJohnzonJsonb.java
@@ -20,6 +20,9 @@
 
 import org.apache.johnzon.jsonb.JohnzonJsonb;
 
+import javax.json.JsonNumber;
+import javax.json.JsonString;
+import javax.json.JsonValue;
 import java.io.Reader;
 import java.io.Writer;
 
@@ -33,4 +36,24 @@
     public abstract <T> T fromJson(Reader reader);
 
     public abstract void toJson(Object object, Writer writer);
+
+    protected static String json2String(final JsonValue value) {
+        switch (value.getValueType()) {
+            case STRING:
+                return JsonString.class.cast(value).getString();
+            case NULL:
+                return null;
+            default:
+                throw new IllegalArgumentException("expected a string, got " + value.getValueType());
+        }
+    }
+
+    protected static int json2Int(final JsonValue value) {
+        switch (value.getValueType()) {
+            case NUMBER:
+                return JsonNumber.class.cast(value).intValue();
+            default:
+                throw new IllegalArgumentException("expected an int, got " + value.getValueType());
+        }
+    }
 }
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/JsonbMapperGenerator.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/JsonbMapperGenerator.java
index ad0917e..04e51b2 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/JsonbMapperGenerator.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/generator/JsonbMapperGenerator.java
@@ -29,9 +29,13 @@
 import java.io.IOException;
 import java.io.Writer;
 import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collection;
+import java.util.Map;
 import java.util.function.Supplier;
 import java.util.logging.Logger;
 import java.util.stream.Stream;
@@ -95,18 +99,14 @@
                     out.append("                    final ").append(clazz.getSimpleName()).append(suffix).append(" instance = new ")
                             .append(clazz.getSimpleName()).append(suffix).append("();\n");
                     out.append(mapping.setters.entrySet().stream()
+                            .sorted(Map.Entry.comparingByKey())
                             .map(setter -> toSetter(setter.getValue(), setter.getKey()))
                             .collect(joining("\n", "", "\n")));
-                    out.append("                    return null;\n");
+                    out.append("                    return instance;\n");
                     out.append("                }\n");
                     out.append("                case NULL:\n");
-                    out.append("                case ARRAY:\n");
-                    out.append("                case STRING:\n");
-                    out.append("                case NUMBER:\n");
-                    out.append("                case TRUE:\n");
-                    out.append("                case FALSE:\n");
+                    out.append("                    return null;\n");
                     out.append("                default:\n");
-                    // todo: check if there is an adapter or alike
                     out.append("                    throw new IllegalStateException(\"invalid value type: '\" + value.getValueType() + \"'\");\n");
                     out.append("            }\n");
                     out.append("        }\n");
@@ -115,8 +115,17 @@
                 out.append("\n");
                 out.append("    @Override\n");
                 out.append("    public void toJson(final Object object, final Writer writer) {\n");
-                // todo: use mappings.setters and expose with getters jsonb.getMapper().getJsongeneratorFactory()
-                out.append("        // TBD\n");
+                if (mapping.getters.isEmpty()) { // will always be empty
+                    out.append("        writer.write(\"{}\");\n");
+                } else {
+                    out.append("        try (final JsonGenerator generator = root.getDelegate().getGeneratorFactory().createGenerator(writer)) {\n");
+                    out.append(mapping.getters.entrySet().stream()
+                            .sorted(Map.Entry.comparingByKey())
+                            .map(setter -> toGetter(setter.getValue(), setter.getKey()))
+                            .collect(joining("\n", "", "\n")));
+                    out.append("        }\n");
+                }
+                // root.getDelegate().getGeneratorFactory().createGenerator()
                 out.append("    }\n");
                 out.append("}\n\n");
 
@@ -152,7 +161,7 @@
         }
     }
 
-    private String toGetter(final Mappings.Getter value) {
+    private String toGetter(final Mappings.Getter value, final String name) {
         try {
             final Field reader = value.getClass().getDeclaredField("reader");
             if (!reader.isAccessible()) {
@@ -168,24 +177,35 @@
                     })
                     .findFirst()
                     .orElseThrow(() -> new IllegalStateException("No finalReader field in " + wrapped));
-            return toGetter(AccessMode.Reader.class.cast(finalReader.get(wrapped)));
+            return toGetter(AccessMode.Reader.class.cast(finalReader.get(wrapped)), name);
         } catch (final IllegalAccessException | NoSuchFieldException nsfe) {
             throw new IllegalArgumentException("Unsupported getter: " + value, nsfe);
         }
     }
 
-    private String toGetter(final MethodAccessMode.MethodReader reader) {
-        return "instance." + reader.getMethod().getName() + "();";
+    private String toGetter(final MethodAccessMode.MethodReader reader, final String name) {
+        final Type type = reader.getType();
+        if (type == String.class || type == int.class || type == long.class || type == boolean.class || type == double.class
+                || type == BigDecimal.class || type == BigInteger.class) {
+            return "" +
+                    "            {\n" +
+                    "                final " + Class.class.cast(type).getSimpleName() + " value = instance." + reader.getMethod().getName() + "();\n" +
+                    "                if (value != null) {\n" +
+                    "                    generator.write(\"" + name + "\", value);\n" +
+                    "                }\n" +
+                    "            }" +
+                    "";
+        }
+        throw new IllegalArgumentException("Unsupported type: " + type);
     }
 
-    private String toGetter(final AccessMode.Reader reader) {
+    private String toGetter(final AccessMode.Reader reader, final String name) {
         if (FieldAndMethodAccessMode.CompositeReader.class.isInstance(reader)) {
             final MethodAccessMode.MethodReader mr = MethodAccessMode.MethodReader.class.cast(
-                    FieldAndMethodAccessMode.CompositeReader.class.cast(reader).getType2());
-            return toGetter(mr);
+                    FieldAndMethodAccessMode.CompositeReader.class.cast(reader).getType1());
+            return toGetter(mr, name);
         } else if (MethodAccessMode.MethodReader.class.isInstance(reader)) {
-            final MethodAccessMode.MethodReader mr = MethodAccessMode.MethodReader.class.cast(reader);
-            return toGetter(mr);
+            return toGetter(MethodAccessMode.MethodReader.class.cast(reader), name);
         }
         throw new IllegalArgumentException("Unsupported reader: " + reader);
     }
@@ -194,23 +214,32 @@
     private String toSetter(final MethodAccessMode.MethodWriter reader, final String name) {
         return "" +
                 "                    {\n" +
-                "                        final JsonValue value = instance.get(\""+name+"\");\n" +
+                "                        final JsonValue value = instance.get(\"" + name + "\");\n" +
                 "                        if (value != null) {\n" +
-                "                            final Object coerced = coerce(value);\n" +
-                "                            instance." + reader.getMethod().getName() + "(coerced);\n" +
+                "                            instance." + reader.getMethod().getName() + "(" +
+                coerceFunction(reader.getMethod().getGenericParameterTypes()[0]) + "(value));\n" +
                 "                        }\n" +
                 "                    }" +
                 "";
     }
 
+    private String coerceFunction(final Type type) {
+        if (type == String.class) {
+            return "json2String";
+        }
+        if (type == int.class) {
+            return "json2Int";
+        }
+        throw new IllegalArgumentException("Unsupported type: " + type);
+    }
+
     private String toSetter(final AccessMode.Writer writer, final String setter) {
         if (FieldAndMethodAccessMode.CompositeWriter.class.isInstance(writer)) {
             final MethodAccessMode.MethodWriter mr = MethodAccessMode.MethodWriter.class.cast(
                     FieldAndMethodAccessMode.CompositeWriter.class.cast(writer).getType1());
             return toSetter(mr, setter);
         } else if (MethodAccessMode.MethodWriter.class.isInstance(writer)) {
-            final MethodAccessMode.MethodWriter mr = MethodAccessMode.MethodWriter.class.cast(writer);
-            return toSetter(mr, setter);
+            return toSetter(MethodAccessMode.MethodWriter.class.cast(writer), setter);
         }
         throw new IllegalArgumentException("Unsupported writer: " + writer);
     }
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/generator/GeneratedJsonbTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/generator/GeneratedJsonbTest.java
index 05a23b7..a6f18f7 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/generator/GeneratedJsonbTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/generator/GeneratedJsonbTest.java
@@ -45,7 +45,30 @@
         final Path result = output.resolve("org/apache/johnzon/jsonb/generator/GeneratedJsonbTest$Empty$$JohnzonJsonb.class");
         assertTrue(Files.exists(result));
         assertEquals("" +
-                "" +
+                "package org.apache.johnzon.jsonb.generator;\n" +
+                "\n" +
+                "import org.apache.johnzon.jsonb.generator.GeneratedJohnzonJsonb;\n" +
+                "import org.apache.johnzon.jsonb.JohnzonJsonb;\n" +
+                "import javax.json.JsonGenerator;\n" +
+                "import javax.json.JsonReader;\n" +
+                "import javax.json.JsonValue;\n" +
+                "\n" +
+                "public class Empty$$JohnzonJsonb implements GeneratedJohnzonJsonb {\n" +
+                "    public Empty$$JohnzonJsonb(final JohnzonJsonb root) {\n" +
+                "        super(root);\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public <T> T fromJson(final Reader reader) {\n" +
+                "        return JsonValue.EMPTY_JSON_OBJECT;\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public void toJson(final Object object, final Writer writer) {\n" +
+                "        writer.write(\"{}\");\n" +
+                "    }\n" +
+                "}\n" +
+                "\n" +
                 "", new String(Files.readAllBytes(result), UTF_8));
     }
 
@@ -59,7 +82,67 @@
         final Path result = output.resolve("org/apache/johnzon/jsonb/generator/GeneratedJsonbTest$Simple$$JohnzonJsonb.class");
         assertTrue(Files.exists(result));
         assertEquals("" +
-                "" +
+                "package org.apache.johnzon.jsonb.generator;\n" +
+                "\n" +
+                "import org.apache.johnzon.jsonb.generator.GeneratedJohnzonJsonb;\n" +
+                "import org.apache.johnzon.jsonb.JohnzonJsonb;\n" +
+                "import javax.json.JsonGenerator;\n" +
+                "import javax.json.JsonReader;\n" +
+                "import javax.json.JsonValue;\n" +
+                "\n" +
+                "public class Simple$$JohnzonJsonb implements GeneratedJohnzonJsonb {\n" +
+                "    public Simple$$JohnzonJsonb(final JohnzonJsonb root) {\n" +
+                "        super(root);\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public <T> T fromJson(final Reader reader) {\n" +
+                "        try (final JsonReader reader = root.getMapper().getReaderFactory().createReader(reader)) {\n" +
+                "            final JsonValue value = reader.readValue();\n" +
+                "            switch (value.getValueType()) {\n" +
+                "                case OBJECT: {\n" +
+                "                    final Simple$$JohnzonJsonb instance = new Simple$$JohnzonJsonb();\n" +
+                "                    {\n" +
+                "                        final JsonValue value = instance.get(\"age\");\n" +
+                "                        if (value != null) {\n" +
+                "                            instance.setAge(json2Int(value));\n" +
+                "                        }\n" +
+                "                    }\n" +
+                "                    {\n" +
+                "                        final JsonValue value = instance.get(\"name\");\n" +
+                "                        if (value != null) {\n" +
+                "                            instance.setName(json2String(value));\n" +
+                "                        }\n" +
+                "                    }\n" +
+                "                    return instance;\n" +
+                "                }\n" +
+                "                case NULL:\n" +
+                "                    return null;\n" +
+                "                default:\n" +
+                "                    throw new IllegalStateException(\"invalid value type: '\" + value.getValueType() + \"'\");\n" +
+                "            }\n" +
+                "        }\n" +
+                "    }\n" +
+                "\n" +
+                "    @Override\n" +
+                "    public void toJson(final Object object, final Writer writer) {\n" +
+                "        try (final JsonGenerator generator = root.getDelegate().getGeneratorFactory().createGenerator(writer)) {\n" +
+                "            {\n" +
+                "                final int value = instance.getAge();\n" +
+                "                if (value != null) {\n" +
+                "                    generator.write(\"age\", value);\n" +
+                "                }\n" +
+                "            }\n" +
+                "            {\n" +
+                "                final String value = instance.getName();\n" +
+                "                if (value != null) {\n" +
+                "                    generator.write(\"name\", value);\n" +
+                "                }\n" +
+                "            }\n" +
+                "        }\n" +
+                "    }\n" +
+                "}\n" +
+                "\n" +
                 "", new String(Files.readAllBytes(result), UTF_8));
     }