MATSIM
IdDeSerializationModule.java
Go to the documentation of this file.
1 package org.matsim.api.core.v01;
2 
3 import java.io.IOException;
4 import java.util.HashMap;
5 import java.util.Map;
6 
7 import com.fasterxml.jackson.core.Version;
8 import com.fasterxml.jackson.databind.BeanDescription;
9 import com.fasterxml.jackson.databind.DeserializationConfig;
10 import com.fasterxml.jackson.databind.DeserializationContext;
11 import com.fasterxml.jackson.databind.JavaType;
12 import com.fasterxml.jackson.databind.JsonDeserializer;
13 import com.fasterxml.jackson.databind.JsonMappingException;
14 import com.fasterxml.jackson.databind.JsonSerializer;
15 import com.fasterxml.jackson.databind.KeyDeserializer;
16 import com.fasterxml.jackson.databind.Module;
17 import com.fasterxml.jackson.databind.ObjectMapper;
18 import com.fasterxml.jackson.databind.SerializationConfig;
19 import com.fasterxml.jackson.databind.deser.Deserializers;
20 import com.fasterxml.jackson.databind.deser.KeyDeserializers;
21 import com.fasterxml.jackson.databind.ser.Serializers;
22 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
23 
29 public class IdDeSerializationModule extends Module {
30 
31  private static final String NAME = IdDeSerializationModule.class.getSimpleName();
32  private static final Version VERSION = new Version(0, 1, 0, null, "org.matsim", "api.core.v01");
33 
34  private static Module instance = null;
35 
37  // nothing to do here
38  }
39 
40  public static Module getInstance() {
41  if (instance == null) {
42  instance = new IdDeSerializationModule();
43  }
44  return instance;
45  }
46 
47  @Override
48  public String getModuleName() {
49  return NAME;
50  }
51 
52  @Override
53  public Version version() {
54  return VERSION;
55  }
56 
57  @Override
58  public void setupModule(SetupContext context) {
59  context.addSerializers(new IdSerializers());
60  context.addDeserializers(new IdDeserializers());
61  context.addKeyDeserializers(new IdKeyDeserializers());
62  }
63 
64  private static final StdSerializer<?> SERIALIZER = new IdAnnotations.JsonIdSerializer<>(Id.class);
65  private static final Map<Class<?>, KeyDeserializer> KEY_DESERIALIZER_CACHE = new HashMap<>();
66 
67  private static final class IdSerializers extends Serializers.Base {
68 
69  @Override
70  public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type,
71  BeanDescription beanDesc) {
72  if (type.getRawClass().equals(Id.class) && type.containedTypeCount() == 1) {
73  return SERIALIZER;
74  }
75  return null;
76  }
77 
78  }
79 
80  private static final class IdDeserializers extends Deserializers.Base {
81 
82  @Override
83  public JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config,
84  BeanDescription beanDesc) throws JsonMappingException {
85  if (type.getRawClass().equals(Id.class) && type.containedTypeCount() == 1) {
86  return IdAnnotations.JsonIdDeserializer.getInstance(type.containedType(0).getRawClass());
87  }
88  return null;
89  }
90 
91  }
92 
93  private static final class IdKeyDeserializers implements KeyDeserializers {
94 
95  @Override
96  public KeyDeserializer findKeyDeserializer(JavaType type, DeserializationConfig config,
97  BeanDescription beanDesc) throws JsonMappingException {
98  if (type.getRawClass().equals(Id.class) && type.containedTypeCount() == 1) {
99  return KEY_DESERIALIZER_CACHE.computeIfAbsent(type.containedType(0).getRawClass(),
100  k -> new KeyDeserializer() {
101 
102  @Override
103  public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException {
104  return Id.create(key, k);
105  }
106 
107  });
108  }
109  return null;
110  }
111 
112  }
113 
114 }
static< T > Id< T > create(final long key, final Class< T > type)
Definition: Id.java:68
JsonDeserializer<?> findBeanDeserializer(JavaType type, DeserializationConfig config, BeanDescription beanDesc)
static final Map< Class<?>, KeyDeserializer > KEY_DESERIALIZER_CACHE
static JsonIdDeserializer<?> getInstance(Class<?> clazz)
KeyDeserializer findKeyDeserializer(JavaType type, DeserializationConfig config, BeanDescription beanDesc)
JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc)