diff --git a/pom.xml b/pom.xml index 0db224f..d8a38ba 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ cz.cvut.kbss.jsonld jb4jsonld-jackson - 0.8.9 + 0.9.0-SNAPSHOT JB4JSON-LD-Jackson JB4JSON-LD integration for Jackson. https://github.com/kbss-cvut/jb4jsonld-jackson @@ -16,11 +16,11 @@ 1.8 1.8 - 0.8.9 + 0.9.0-SNAPSHOT 5.8.2 - 4.2.0 - 1.2.10 - 2.13.1 + 4.3.1 + 1.2.11 + 2.13.2 0.13.4 3.7.4 @@ -188,7 +188,7 @@ org.jacoco jacoco-maven-plugin - 0.8.6 + 0.8.7 @@ -236,10 +236,9 @@ Martin Ledvinka martin.ledvinka@fel.cvut.cz - Czech Technical University in Prague, Knowledge Based and Software Systems Group - http://kbss.felk.cvut.cz + https://kbss.felk.cvut.cz @@ -247,7 +246,7 @@ Czech Technical University in Prague, Knowledge Based and Software Systems Group - http://kbss.felk.cvut.cz + https://kbss.felk.cvut.cz diff --git a/src/main/java/cz/cvut/kbss/jsonld/jackson/JsonLdModule.java b/src/main/java/cz/cvut/kbss/jsonld/jackson/JsonLdModule.java index e4e2a4c..d69c1e1 100644 --- a/src/main/java/cz/cvut/kbss/jsonld/jackson/JsonLdModule.java +++ b/src/main/java/cz/cvut/kbss/jsonld/jackson/JsonLdModule.java @@ -18,6 +18,7 @@ import cz.cvut.kbss.jsonld.ConfigParam; import cz.cvut.kbss.jsonld.Configuration; import cz.cvut.kbss.jsonld.common.PropertyAccessResolver; +import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer; import cz.cvut.kbss.jsonld.jackson.common.JsonPropertyAccessResolver; import cz.cvut.kbss.jsonld.jackson.deserialization.JsonLdDeserializerModifier; import cz.cvut.kbss.jsonld.jackson.serialization.JsonLdSerializerModifier; @@ -35,6 +36,7 @@ public class JsonLdModule extends SimpleModule { private final Configuration configuration = new Configuration(); private final Map, ValueSerializer> commonSerializers = new HashMap<>(); + private final Map, ValueDeserializer> commonDeserializers = new HashMap<>(); public JsonLdModule() { init(); @@ -43,7 +45,7 @@ public JsonLdModule() { private void init() { final PropertyAccessResolver accessResolver = new JsonPropertyAccessResolver(); setSerializerModifier(new JsonLdSerializerModifier(configuration, accessResolver, commonSerializers)); - setDeserializerModifier(new JsonLdDeserializerModifier(configuration, accessResolver)); + setDeserializerModifier(new JsonLdDeserializerModifier(configuration, accessResolver, commonDeserializers)); } /** @@ -68,7 +70,24 @@ public JsonLdModule configure(ConfigParam param, String value) { * @return This instance */ public JsonLdModule registerSerializer(Class forType, ValueSerializer serializer) { + Objects.requireNonNull(forType); + Objects.requireNonNull(serializer); commonSerializers.put(forType, serializer); return this; } + + /** + * Registers the specified deserializer for the specified type. + * + * @param forType Type to register the deserializer for + * @param deserializer Value deserializer being registered + * @param Type + * @return This instance + */ + public JsonLdModule registerDeserializer(Class forType, ValueDeserializer deserializer) { + Objects.requireNonNull(forType); + Objects.requireNonNull(deserializer); + commonDeserializers.put(forType, deserializer); + return this; + } } diff --git a/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JacksonJsonLdDeserializer.java b/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JacksonJsonLdDeserializer.java index bf1d169..432338a 100644 --- a/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JacksonJsonLdDeserializer.java +++ b/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JacksonJsonLdDeserializer.java @@ -28,6 +28,7 @@ import cz.cvut.kbss.jsonld.ConfigParam; import cz.cvut.kbss.jsonld.Configuration; import cz.cvut.kbss.jsonld.deserialization.JsonLdDeserializer; +import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer; import cz.cvut.kbss.jsonld.exception.JsonLdDeserializationException; import java.io.IOException; @@ -42,15 +43,19 @@ public class JacksonJsonLdDeserializer extends DelegatingDeserializer { private final Class resultType; - public JacksonJsonLdDeserializer(JsonDeserializer delegatee, Class resultType, Configuration configuration) { + private final Map, ValueDeserializer> commonDeserializers; + + public JacksonJsonLdDeserializer(JsonDeserializer delegatee, Class resultType, Configuration configuration, + Map, ValueDeserializer> commonDeserializers) { super(delegatee); this.resultType = resultType; this.configuration = configuration; + this.commonDeserializers = commonDeserializers; } @Override protected JsonDeserializer newDelegatingInstance(JsonDeserializer newDelegatee) { - return new JacksonJsonLdDeserializer(newDelegatee, resultType, configuration); + return new JacksonJsonLdDeserializer(newDelegatee, resultType, configuration, commonDeserializers); } @Override @@ -59,6 +64,7 @@ public Object deserialize(JsonParser jp, DeserializationContext ctx) throws IOEx final Object input = parseJsonObject(jp); final List expanded = JsonLdProcessor.expand(input); final JsonLdDeserializer deserializer = JsonLdDeserializer.createExpandedDeserializer(configure(ctx)); + commonDeserializers.forEach((t, d) -> deserializer.registerDeserializer((Class) t, (ValueDeserializer) d)); return deserializer.deserialize(expanded, resultType); } catch (JsonLdError e) { throw new JsonLdDeserializationException("Unable to expand the input JSON.", e); @@ -94,8 +100,8 @@ private Configuration configure(DeserializationContext context) { } @Override - public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, + public Object deserializeWithType(JsonParser jp, DeserializationContext ctx, TypeDeserializer typeDeserializer) throws IOException { - return deserialize(jp, ctxt); + return deserialize(jp, ctx); } } diff --git a/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializerModifier.java b/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializerModifier.java index e15a57e..8344c65 100644 --- a/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializerModifier.java +++ b/src/main/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializerModifier.java @@ -21,13 +21,20 @@ import cz.cvut.kbss.jsonld.Configuration; import cz.cvut.kbss.jsonld.common.BeanAnnotationProcessor; import cz.cvut.kbss.jsonld.common.PropertyAccessResolver; +import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer; + +import java.util.Map; public class JsonLdDeserializerModifier extends BeanDeserializerModifier { private final Configuration configuration; - public JsonLdDeserializerModifier(Configuration configuration, PropertyAccessResolver propertyAccessResolver) { + private final Map, ValueDeserializer> commonDeserializers; + + public JsonLdDeserializerModifier(Configuration configuration, PropertyAccessResolver propertyAccessResolver, + Map, ValueDeserializer> commonDeserializers) { this.configuration = configuration; + this.commonDeserializers = commonDeserializers; BeanAnnotationProcessor.setPropertyAccessResolver(propertyAccessResolver); } @@ -35,7 +42,8 @@ public JsonLdDeserializerModifier(Configuration configuration, PropertyAccessRes public JsonDeserializer modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer deserializer) { if (BeanAnnotationProcessor.isOwlClassEntity(beanDesc.getBeanClass())) { - return new JacksonJsonLdDeserializer(deserializer, beanDesc.getBeanClass(), configuration); + return new JacksonJsonLdDeserializer(deserializer, beanDesc.getBeanClass(), configuration, + commonDeserializers); } return deserializer; } diff --git a/src/test/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializationTest.java b/src/test/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializationTest.java index 40d60ed..2eb1d95 100644 --- a/src/test/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializationTest.java +++ b/src/test/java/cz/cvut/kbss/jsonld/jackson/deserialization/JsonLdDeserializationTest.java @@ -1,16 +1,14 @@ /** * Copyright (C) 2022 Czech Technical University in Prague - * - * This program is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation, either version 3 of the License, or (at your option) any - * later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. You should have received a copy of the GNU General Public License - * along with this program. If not, see . + *

+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later + * version. + *

+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. You should have received a copy of the GNU General Public License along with this program. If not, see + * . */ package cz.cvut.kbss.jsonld.jackson.deserialization; @@ -18,6 +16,8 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import cz.cvut.kbss.jsonld.ConfigParam; +import cz.cvut.kbss.jsonld.deserialization.DeserializationContext; +import cz.cvut.kbss.jsonld.deserialization.ValueDeserializer; import cz.cvut.kbss.jsonld.jackson.JsonLdModule; import cz.cvut.kbss.jsonld.jackson.environment.Environment; import cz.cvut.kbss.jsonld.jackson.environment.model.Employee; @@ -34,6 +34,10 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; class JsonLdDeserializationTest { @@ -150,4 +154,22 @@ void deserializationSkipsPropertiesMappedToFieldsWithReadOnlyAccess() throws Exc assertNotNull(result); assertNull(result.getEmployeeCount()); } + + @Test + void deserializationSupportsCustomDeserializers() throws Exception { + final ValueDeserializer deserializer = spy(new CustomDeserializer()); + jsonLdModule.registerDeserializer(Boolean.class, deserializer); + final String input = Environment.readData("objectWithDataProperties.json"); + final User result = objectMapper.readValue(input, User.class); + assertNotNull(result); + assertNull(result.getAdmin()); + verify(deserializer).deserialize(anyMap(), any(DeserializationContext.class)); + } + + static class CustomDeserializer implements ValueDeserializer { + @Override + public Boolean deserialize(Map map, DeserializationContext deserializationContext) { + return null; + } + } }