| package com.fasterxml.jackson.databind.deser.std; |
| |
| import com.fasterxml.jackson.core.JsonLocation; |
| import com.fasterxml.jackson.databind.DeserializationConfig; |
| import com.fasterxml.jackson.databind.DeserializationContext; |
| import com.fasterxml.jackson.databind.JavaType; |
| import com.fasterxml.jackson.databind.PropertyMetadata; |
| import com.fasterxml.jackson.databind.PropertyName; |
| import com.fasterxml.jackson.databind.deser.CreatorProperty; |
| import com.fasterxml.jackson.databind.deser.ValueInstantiator; |
| |
| /** |
| * For {@link JsonLocation}, we should be able to just implement |
| * {@link ValueInstantiator} (not that explicit one would be very |
| * hard but...) |
| */ |
| public class JsonLocationInstantiator extends ValueInstantiator |
| { |
| public final static JsonLocationInstantiator instance = new JsonLocationInstantiator(); |
| |
| @Override |
| public String getValueTypeDesc() { |
| return JsonLocation.class.getName(); |
| } |
| |
| @Override |
| public boolean canCreateFromObjectWith() { return true; } |
| |
| @Override |
| public CreatorProperty[] getFromObjectArguments(DeserializationConfig config) { |
| JavaType intType = config.constructType(Integer.TYPE); |
| JavaType longType = config.constructType(Long.TYPE); |
| return new CreatorProperty[] { |
| creatorProp("sourceRef", config.constructType(Object.class), 0), |
| creatorProp("byteOffset", longType, 1), |
| creatorProp("charOffset", longType, 2), |
| creatorProp("lineNr", intType, 3), |
| creatorProp("columnNr", intType, 4) |
| }; |
| } |
| |
| private static CreatorProperty creatorProp(String name, JavaType type, int index) { |
| return new CreatorProperty(new PropertyName(name), type, null, |
| null, null, null, index, null, PropertyMetadata.STD_REQUIRED); |
| } |
| |
| @Override |
| public Object createFromObjectWith(DeserializationContext ctxt, Object[] args) { |
| return new JsonLocation(args[0], _long(args[1]), _long(args[2]), |
| _int(args[3]), _int(args[4])); |
| } |
| |
| private final static long _long(Object o) { |
| return (o == null) ? 0L : ((Number) o).longValue(); |
| } |
| private final static int _int(Object o) { |
| return (o == null) ? 0 : ((Number) o).intValue(); |
| } |
| } |