Skip to content

Commit

Permalink
Merge pull request #76 from openEHR/fix_type_parsing
Browse files Browse the repository at this point in the history
Fix parsing of types, backwards compatible with version 0.5.5
  • Loading branch information
pieterbos authored Feb 11, 2019
2 parents e5dded7 + d3710b3 commit 79a4d8c
Show file tree
Hide file tree
Showing 3 changed files with 419 additions and 0 deletions.
20 changes: 20 additions & 0 deletions archie-utils/src/main/java/com/nedap/archie/json/JacksonUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,22 @@

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder;
import com.nedap.archie.base.OpenEHRBase;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import java.io.IOException;

/**
* Class to obtain an ObjectMapper that works with both archie RM and AOM objects, serializing into
* a JSON with openEHR-spec type names.
Expand Down Expand Up @@ -58,14 +65,27 @@ public static void configureObjectMapper(ObjectMapper objectMapper) {

objectMapper.registerModule(new JavaTimeModule());

objectMapper.enable(MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL);

TypeResolverBuilder typeResolverBuilder = new ArchieTypeResolverBuilder()
.init(JsonTypeInfo.Id.NAME, new OpenEHRTypeNaming())
.typeProperty("@type")
.typeIdVisibility(true)
.inclusion(JsonTypeInfo.As.PROPERTY);

//@type is always allowed as an extra property, even if we don't expect it.
objectMapper.addHandler(new DeserializationProblemHandler() {
@Override
public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
if (propertyName.equalsIgnoreCase("@type")) {
return true;
}
return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
}
});

objectMapper.setDefaultTyping(typeResolverBuilder);

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import static org.hamcrest.CoreMatchers.*;

import java.io.InputStream;
import java.net.URI;
import java.time.LocalDate;
import java.time.LocalDateTime;
Expand Down Expand Up @@ -102,5 +103,15 @@ public void composition() throws Exception {

}

/**
* Parse a 0.5.5 archie generated json and make sure it parses
*/
@Test
public void check055BackwardsCompatibility() throws Exception {
InputStream stream = getClass().getResourceAsStream("rm_object.json");
JacksonUtil.getObjectMapper().readValue(stream, RMObject.class);

}


}
Loading

0 comments on commit 79a4d8c

Please sign in to comment.