/* * (c) Copyright Reserved EVRYTHNG Limited 2016. All rights reserved. * Use of this material is subject to license. * Copying and unauthorised use of this material strictly prohibited. */ package com.evrythng.java.wrapper.mapping; import com.evrythng.thng.resource.model.store.geojson.GeoJson; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.ObjectCodec; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import java.io.IOException; /** * GeoJSON deserializer. * **/ public class GeoJsonDeserializerImpl extends TypeMapDeserializer<GeoJson> implements GeoJsonDeserializer { private static final long serialVersionUID = 1L; GeoJsonDeserializerImpl() { super(GeoJson.class, GeoJson.FIELD_TYPE); } /** * {@inheritDoc} */ @Override public <T extends GeoJson> String getGeoJsonType(Class<T> geoJsonClass) { return getObjectType(geoJsonClass); } @Override public GeoJson deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { ObjectCodec codec = jp.getCodec(); ObjectMapper mapper = (ObjectMapper) codec; ObjectNode root = (ObjectNode) mapper.readTree(jp); JsonNode type = root.get(getTypeFieldName()); if (type == null) { throw new IllegalArgumentException(this.getValueClass().getSimpleName() + " type cannot be empty."); } String sType = type.textValue(); if (sType == null || sType.isEmpty()) { throw new IllegalArgumentException(this.getValueClass().getSimpleName() + " type cannot be empty."); } Class<GeoJson> clazz = (Class<GeoJson>) resolveClass(sType); GeoJson obj = codec.treeToValue(root, clazz); if (obj == null) { throw new IllegalArgumentException(this.getValueClass().getSimpleName() + " type deserialised as null: " + root.toString()); } return obj; } }