Skip to content

Commit

Permalink
[0.3.1] Upgraded to core v. 0.3.1, which adds support for polymorphic…
Browse files Browse the repository at this point in the history
… deserialization. Also modified the JsonLdModule API so that additional configuration can be passed to it.
  • Loading branch information
ledsoft committed Mar 25, 2018
1 parent ccccccb commit 64ee396
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 16 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Expand Up @@ -6,7 +6,7 @@

<groupId>cz.cvut.kbss.jsonld</groupId>
<artifactId>jb4jsonld-jackson</artifactId>
<version>0.2.1</version>
<version>0.3.1</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,7 +16,7 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<cz.cvut.kbss.jb4jsonld.version>0.2.1</cz.cvut.kbss.jb4jsonld.version>
<cz.cvut.kbss.jb4jsonld.version>0.3.1</cz.cvut.kbss.jb4jsonld.version>
<junit.version>4.12</junit.version>
<org.mockito.version>1.10.19</org.mockito.version>
<ch.qos.logback.version>1.1.6</ch.qos.logback.version>
Expand Down
27 changes: 23 additions & 4 deletions src/main/java/cz/cvut/kbss/jsonld/jackson/JsonLdModule.java
@@ -1,11 +1,11 @@
/**
* Copyright (C) 2017 Czech Technical University in Prague
*
* <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
Expand All @@ -15,20 +15,39 @@
package cz.cvut.kbss.jsonld.jackson;

import com.fasterxml.jackson.databind.module.SimpleModule;
import cz.cvut.kbss.jsonld.ConfigParam;
import cz.cvut.kbss.jsonld.Configuration;
import cz.cvut.kbss.jsonld.jackson.deserialization.JsonLdDeserializerModifier;
import cz.cvut.kbss.jsonld.jackson.serialization.JsonLdSerializerModifier;

import java.util.Objects;

/**
* Simple module with pre-configured serializer and deserializer modifier.
*/
public class JsonLdModule extends SimpleModule {

private final Configuration configuration = new Configuration();

public JsonLdModule() {
init();
}

private void init() {
setSerializerModifier(new JsonLdSerializerModifier());
setDeserializerModifier(new JsonLdDeserializerModifier());
setSerializerModifier(new JsonLdSerializerModifier(configuration));
setDeserializerModifier(new JsonLdDeserializerModifier(configuration));
}

/**
* Configure this module with additional parameters.
*
* @param param Parameter to set
* @param value New value of the parameter
* @return This instance
*/
public JsonLdModule configure(ConfigParam param, String value) {
Objects.requireNonNull(param);
configuration.set(param, value);
return this;
}
}
Expand Up @@ -38,17 +38,19 @@ public class JacksonJsonLdDeserializer extends DelegatingDeserializer {

private ObjectMapper mapper = new ObjectMapper();

private final Configuration configuration;

private final Class<?> resultType;

public JacksonJsonLdDeserializer(JsonDeserializer<?> delegatee, Class<?> resultType) {
public JacksonJsonLdDeserializer(JsonDeserializer<?> delegatee, Class<?> resultType, Configuration configuration) {
super(delegatee);
this.resultType = resultType;
this.configuration = configuration;
}

@Override
protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee) {
// TODO Is the null ok? Perhaps we should use a different base class, we are not delegating deserialization to anything else anyway
return new JacksonJsonLdDeserializer(newDelegatee, null);
return new JacksonJsonLdDeserializer(newDelegatee, resultType, configuration);
}

@Override
Expand Down Expand Up @@ -86,7 +88,7 @@ private Object parseJsonObject(JsonParser parser) throws IOException {
}

private Configuration configure(DeserializationContext context) {
final Configuration config = new Configuration();
final Configuration config = new Configuration(configuration);
if (!context.isEnabled(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)) {
config.set(ConfigParam.IGNORE_UNKNOWN_PROPERTIES, Boolean.TRUE.toString());
}
Expand Down
Expand Up @@ -18,15 +18,22 @@
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
import cz.cvut.kbss.jsonld.Configuration;
import cz.cvut.kbss.jsonld.common.BeanAnnotationProcessor;

public class JsonLdDeserializerModifier extends BeanDeserializerModifier {

private final Configuration configuration;

public JsonLdDeserializerModifier(Configuration configuration) {
this.configuration = configuration;
}

@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc,
JsonDeserializer<?> deserializer) {
if (BeanAnnotationProcessor.isOwlClassEntity(beanDesc.getBeanClass())) {
return new JacksonJsonLdDeserializer(deserializer, beanDesc.getBeanClass());
return new JacksonJsonLdDeserializer(deserializer, beanDesc.getBeanClass(), configuration);
}
return deserializer;
}
Expand Down
Expand Up @@ -18,14 +18,22 @@
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import cz.cvut.kbss.jsonld.Configuration;
import cz.cvut.kbss.jsonld.serialization.JsonLdSerializer;

class JacksonJsonLdSerializer<T> extends JsonSerializer<T> {

private final Configuration configuration;

JacksonJsonLdSerializer(Configuration configuration) {
this.configuration = configuration;
}

@Override
public void serialize(T value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
final cz.cvut.kbss.jsonld.serialization.JsonGenerator writer = new JacksonJsonWriter(jsonGenerator);
final JsonLdSerializer serializer = JsonLdSerializer.createCompactedJsonLdSerializer(writer);
final JsonLdSerializer serializer =
JsonLdSerializer.createCompactedJsonLdSerializer(writer, new Configuration(configuration));
serializer.serialize(value);
}

Expand Down
Expand Up @@ -18,18 +18,25 @@
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import cz.cvut.kbss.jsonld.Configuration;
import cz.cvut.kbss.jsonld.common.BeanAnnotationProcessor;

/**
* Main point of integration of the JSON-LD serialization implementation into Jackson.
*/
public class JsonLdSerializerModifier extends BeanSerializerModifier {

private final Configuration configuration;

public JsonLdSerializerModifier(Configuration configuration) {
this.configuration = configuration;
}

@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc,
JsonSerializer<?> serializer) {
if (BeanAnnotationProcessor.isOwlClassEntity(beanDesc.getBeanClass())) {
return new JacksonJsonLdSerializer<>();
return new JacksonJsonLdSerializer<>(configuration);
}
return serializer;
}
Expand Down
@@ -1,11 +1,11 @@
/**
* Copyright (C) 2017 Czech Technical University in Prague
*
* <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
Expand All @@ -17,10 +17,12 @@
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.jackson.JsonLdModule;
import cz.cvut.kbss.jsonld.jackson.environment.Environment;
import cz.cvut.kbss.jsonld.jackson.environment.model.Employee;
import cz.cvut.kbss.jsonld.jackson.environment.model.Organization;
import cz.cvut.kbss.jsonld.jackson.environment.model.Person;
import cz.cvut.kbss.jsonld.jackson.environment.model.User;
import cz.cvut.kbss.jsonld.jackson.serialization.JsonLdSerializationTest;
import org.junit.Before;
Expand Down Expand Up @@ -49,6 +51,7 @@ public class JsonLdDeserializationTest {
private static final String[] ORG_BRANDS = {"Spartan-II", "Mjolnir IV"};

private ObjectMapper objectMapper;
private JsonLdModule jsonLdModule;

private static Map<URI, User> initUsers() {
final Map<URI, User> map = new HashMap<>();
Expand All @@ -61,7 +64,8 @@ private static Map<URI, User> initUsers() {
@Before
public void setUp() {
this.objectMapper = new ObjectMapper();
objectMapper.registerModule(new JsonLdModule());
this.jsonLdModule = new JsonLdModule();
objectMapper.registerModule(jsonLdModule);
}

@Test
Expand Down Expand Up @@ -130,4 +134,12 @@ public void deserializationIgnoresJsonTypeInfo() throws Exception {
final Employee result = objectMapper.readValue(input, Employee.class);
assertNotNull(result);
}

@Test
public void deserializationSupportsPolymorphism() throws Exception {
jsonLdModule.configure(ConfigParam.SCAN_PACKAGE, "cz.cvut.kbss.jsonld.jackson.environment.model");
final String input = Environment.readData("objectWithSingularReference.json");
final Person result = objectMapper.readValue(input, Person.class);
assertTrue(result instanceof Employee);
}
}

0 comments on commit 64ee396

Please sign in to comment.