You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@johnzon.apache.org by rm...@apache.org on 2018/09/14 14:22:05 UTC

johnzon git commit: JOHNZON-187 ensure user adapters can override default adapters

Repository: johnzon
Updated Branches:
  refs/heads/master 919fa53da -> df0560a11


JOHNZON-187 ensure user adapters can override default adapters


Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo
Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/df0560a1
Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/df0560a1
Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/df0560a1

Branch: refs/heads/master
Commit: df0560a116be4e0ffc86e6c8e00b06831e94479c
Parents: 919fa53
Author: Romain Manni-Bucau <rm...@gmail.com>
Authored: Fri Sep 14 16:21:55 2018 +0200
Committer: Romain Manni-Bucau <rm...@gmail.com>
Committed: Fri Sep 14 16:21:55 2018 +0200

----------------------------------------------------------------------
 .../apache/johnzon/jsonb/JohnzonBuilder.java    |  8 ++-
 .../jsonb/OverrideDefaultAdaptersTest.java      | 74 ++++++++++++++++++++
 2 files changed, 79 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/johnzon/blob/df0560a1/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
index 40ec155..495e7b7 100644
--- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
+++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/JohnzonBuilder.java
@@ -235,6 +235,7 @@ public class JohnzonBuilder implements JsonbBuilder {
             }
             throw new IllegalArgumentException("Unsupported factory: " + val);
         }).orElseGet(this::findFactory);
+
         final AccessMode accessMode = config.getProperty("johnzon.accessMode")
                 .map(this::toAccessMode)
                 .orElseGet(() -> new JsonbAccessMode(
@@ -247,17 +248,18 @@ public class JohnzonBuilder implements JsonbBuilder {
                                 .orElseGet(() -> new FieldAndMethodAccessMode(true, true, false))));
         builder.setAccessMode(accessMode);
 
-
         // user adapters
         config.getProperty(JsonbConfig.ADAPTERS).ifPresent(adapters -> Stream.of(JsonbAdapter[].class.cast(adapters)).forEach(adapter -> {
             final ParameterizedType pt = ParameterizedType.class.cast(
                     Stream.of(adapter.getClass().getGenericInterfaces())
-                            .filter(i -> ParameterizedType.class.isInstance(i) && ParameterizedType.class.cast(i).getRawType() == JsonbAdapter.class).findFirst().orElse(null));
+                          .filter(i -> ParameterizedType.class.isInstance(i) && ParameterizedType.class.cast(i).getRawType() == JsonbAdapter.class).findFirst().orElse(null));
             if (pt == null) {
                 throw new IllegalArgumentException(adapter + " doesn't implement JsonbAdapter");
             }
             final Type[] args = pt.getActualTypeArguments();
-            builder.addAdapter(args[0], args[1], new JohnzonJsonbAdapter(adapter, args[0], args[1]));
+            final JohnzonJsonbAdapter johnzonJsonbAdapter = new JohnzonJsonbAdapter(adapter, args[0], args[1]);
+            builder.addAdapter(args[0], args[1], johnzonJsonbAdapter);
+            defaultConverters.put(new AdapterKey(args[0], args[1]), johnzonJsonbAdapter);
         }));
 
         config.getProperty(JsonbConfig.STRICT_IJSON).map(Boolean.class::cast).ifPresent(ijson -> {

http://git-wip-us.apache.org/repos/asf/johnzon/blob/df0560a1/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OverrideDefaultAdaptersTest.java
----------------------------------------------------------------------
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OverrideDefaultAdaptersTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OverrideDefaultAdaptersTest.java
new file mode 100644
index 0000000..a7118c5
--- /dev/null
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/OverrideDefaultAdaptersTest.java
@@ -0,0 +1,74 @@
+/**
+ * Copyright (C) 2006-2018 Talend Inc. - www.talend.com
+ * <p>
+ * Licensed 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.Date;
+
+import javax.json.bind.Jsonb;
+import javax.json.bind.JsonbBuilder;
+import javax.json.bind.JsonbConfig;
+import javax.json.bind.JsonbException;
+import javax.json.bind.adapter.JsonbAdapter;
+
+import org.junit.Test;
+
+public class OverrideDefaultAdaptersTest {
+    @Test
+    public void run() throws Exception {
+        final ZonedDateTime zdtString = ZonedDateTime.ofInstant(new Date(0).toInstant(), ZoneId.of("UTC"));
+        try (final Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withAdapters(new ZonedDateTimeFallbackDateAdapter()))) {
+            final DateHolder holder = jsonb.fromJson("{\"date\":\"" + zdtString + "\"}", DateHolder.class);
+            assertEquals(new Date(0).getTime(), holder.date.getTime());
+        }
+        try (final Jsonb jsonb = JsonbBuilder.create()) {
+            jsonb.fromJson("{\"date\":\"" + zdtString + "\"}", DateHolder.class);
+            fail();
+        } catch (final JsonbException je) {
+            // expected
+        }
+    }
+
+    public static class DateHolder {
+
+        public Date date;
+    }
+
+    public static class ZonedDateTimeFallbackDateAdapter implements JsonbAdapter<Date, String> {
+        private static final ZoneId UTC = ZoneId.of("UTC");
+
+        @Override
+        public Date adaptFromJson(final String obj) {
+            try {
+                return Date.from(LocalDateTime.parse(obj).toInstant(ZoneOffset.UTC));
+            } catch (final DateTimeParseException pe) {
+                return new Date(ZonedDateTime.parse(obj).toInstant().toEpochMilli());
+            }
+        }
+
+        @Override
+        public String adaptToJson(final Date obj) {
+            return LocalDateTime.ofInstant(obj.toInstant(), UTC).toString();
+        }
+    }
+}