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