Skip to content

Commit

Permalink
[Upd] Update dependencies, add support for registering custom deseria…
Browse files Browse the repository at this point in the history
…lizers.
  • Loading branch information
ledsoft committed Mar 27, 2022
1 parent 2330565 commit f289ba7
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 27 deletions.
17 changes: 8 additions & 9 deletions pom.xml
Expand Up @@ -6,7 +6,7 @@

<groupId>cz.cvut.kbss.jsonld</groupId>
<artifactId>jb4jsonld-jackson</artifactId>
<version>0.8.9</version>
<version>0.9.0-SNAPSHOT</version>
<name>JB4JSON-LD-Jackson</name>
<description>JB4JSON-LD integration for Jackson.</description>
<url>https://github.com/kbss-cvut/jb4jsonld-jackson</url>
Expand All @@ -16,11 +16,11 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<cz.cvut.kbss.jb4jsonld.version>0.8.9</cz.cvut.kbss.jb4jsonld.version>
<cz.cvut.kbss.jb4jsonld.version>0.9.0-SNAPSHOT</cz.cvut.kbss.jb4jsonld.version>
<org.junit.jupiter.version>5.8.2</org.junit.jupiter.version>
<org.mockito.version>4.2.0</org.mockito.version>
<ch.qos.logback.version>1.2.10</ch.qos.logback.version>
<com.fasterxml.jackson.version>2.13.1</com.fasterxml.jackson.version>
<org.mockito.version>4.3.1</org.mockito.version>
<ch.qos.logback.version>1.2.11</ch.qos.logback.version>
<com.fasterxml.jackson.version>2.13.2</com.fasterxml.jackson.version>
<com.github.jsonld-java.version>0.13.4</com.github.jsonld-java.version>
<org.eclipse.rdf4j.version>3.7.4</org.eclipse.rdf4j.version>
</properties>
Expand Down Expand Up @@ -188,7 +188,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<version>0.8.7</version>
<executions>
<execution>
<goals>
Expand Down Expand Up @@ -236,18 +236,17 @@
<developer>
<name>Martin Ledvinka</name>
<email>martin.ledvinka@fel.cvut.cz</email>
<!--<url>http://cyber.felk.cvut.cz/people</url>-->
<organization>Czech Technical University in Prague, Knowledge Based and Software Systems Group
</organization>
<organizationUrl>http://kbss.felk.cvut.cz</organizationUrl>
<organizationUrl>https://kbss.felk.cvut.cz</organizationUrl>
<roles>
</roles>
</developer>
</developers>

<organization>
<name>Czech Technical University in Prague, Knowledge Based and Software Systems Group</name>
<url>http://kbss.felk.cvut.cz</url>
<url>https://kbss.felk.cvut.cz</url>
</organization>

<scm>
Expand Down
21 changes: 20 additions & 1 deletion src/main/java/cz/cvut/kbss/jsonld/jackson/JsonLdModule.java
Expand Up @@ -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;
Expand All @@ -35,6 +36,7 @@ public class JsonLdModule extends SimpleModule {
private final Configuration configuration = new Configuration();

private final Map<Class<?>, ValueSerializer<?>> commonSerializers = new HashMap<>();
private final Map<Class<?>, ValueDeserializer<?>> commonDeserializers = new HashMap<>();

public JsonLdModule() {
init();
Expand All @@ -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));
}

/**
Expand All @@ -68,7 +70,24 @@ public JsonLdModule configure(ConfigParam param, String value) {
* @return This instance
*/
public <T> JsonLdModule registerSerializer(Class<T> forType, ValueSerializer<T> 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 <T> Type
* @return This instance
*/
public <T> JsonLdModule registerDeserializer(Class<T> forType, ValueDeserializer<T> deserializer) {
Objects.requireNonNull(forType);
Objects.requireNonNull(deserializer);
commonDeserializers.put(forType, deserializer);
return this;
}
}
Expand Up @@ -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;
Expand All @@ -42,15 +43,19 @@ public class JacksonJsonLdDeserializer extends DelegatingDeserializer {

private final Class<?> resultType;

public JacksonJsonLdDeserializer(JsonDeserializer<?> delegatee, Class<?> resultType, Configuration configuration) {
private final Map<Class<?>, ValueDeserializer<?>> commonDeserializers;

public JacksonJsonLdDeserializer(JsonDeserializer<?> delegatee, Class<?> resultType, Configuration configuration,
Map<Class<?>, 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
Expand All @@ -59,6 +64,7 @@ public Object deserialize(JsonParser jp, DeserializationContext ctx) throws IOEx
final Object input = parseJsonObject(jp);
final List<Object> 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);
Expand Down Expand Up @@ -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);
}
}
Expand Up @@ -21,21 +21,29 @@
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<Class<?>, ValueDeserializer<?>> commonDeserializers;

public JsonLdDeserializerModifier(Configuration configuration, PropertyAccessResolver propertyAccessResolver,
Map<Class<?>, ValueDeserializer<?>> commonDeserializers) {
this.configuration = configuration;
this.commonDeserializers = commonDeserializers;
BeanAnnotationProcessor.setPropertyAccessResolver(propertyAccessResolver);
}

@Override
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;
}
Expand Down
@@ -1,23 +1,23 @@
/**
* 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 <http://www.gnu.org/licenses/>.
* <p>
* 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.
* <p>
* 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
* <http://www.gnu.org/licenses/>.
*/
package cz.cvut.kbss.jsonld.jackson.deserialization;

import com.fasterxml.jackson.core.type.TypeReference;
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;
Expand All @@ -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 {

Expand Down Expand Up @@ -150,4 +154,22 @@ void deserializationSkipsPropertiesMappedToFieldsWithReadOnlyAccess() throws Exc
assertNotNull(result);
assertNull(result.getEmployeeCount());
}

@Test
void deserializationSupportsCustomDeserializers() throws Exception {
final ValueDeserializer<Boolean> 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<Boolean> {
@Override
public Boolean deserialize(Map<?, ?> map, DeserializationContext<Boolean> deserializationContext) {
return null;
}
}
}

0 comments on commit f289ba7

Please sign in to comment.