1 package com.fasterxml.jackson.datatype.jdk8;
2
3 import com.fasterxml.jackson.databind.*;
4 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
5 import com.fasterxml.jackson.databind.ser.Serializers;
6 import com.fasterxml.jackson.databind.type.ReferenceType;
7 import com.fasterxml.jackson.databind.type.TypeFactory;
8
9 import java.util.Optional;
10 import java.util.OptionalDouble;
11 import java.util.OptionalInt;
12 import java.util.OptionalLong;
13 import java.util.stream.DoubleStream;
14 import java.util.stream.IntStream;
15 import java.util.stream.LongStream;
16 import java.util.stream.Stream;
17
18 public class Jdk8Serializers extends Serializers.Base
19 implements java.io.Serializable
20 {
21 private static final long serialVersionUID = 1L;
22
23 @Override
24 public JsonSerializer<?> findReferenceSerializer(SerializationConfig config,
25 ReferenceType refType, BeanDescription beanDesc,
26 TypeSerializer contentTypeSerializer, JsonSerializer<Object> contentValueSerializer)
27 {
28 final Class<?> raw = refType.getRawClass();
29 if (Optional.class.isAssignableFrom(raw)) {
30 boolean staticTyping = (contentTypeSerializer == null)
31 && config.isEnabled(MapperFeature.USE_STATIC_TYPING);
32 return new OptionalSerializer(refType, staticTyping,
33 contentTypeSerializer, contentValueSerializer);
34 }
35 if (OptionalInt.class.isAssignableFrom(raw)) {
36 return OptionalIntSerializer.INSTANCE;
37 }
38 if (OptionalLong.class.isAssignableFrom(raw)) {
39 return OptionalLongSerializer.INSTANCE;
40 }
41 if (OptionalDouble.class.isAssignableFrom(raw)) {
42 return OptionalDoubleSerializer.INSTANCE;
43 }
44 return null;
45 }
46
47 @Override
48 public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type,
49 BeanDescription beanDesc)
50 {
51 Class<?> raw = type.getRawClass();
52 if (LongStream.class.isAssignableFrom(raw)) {
53 return LongStreamSerializer.INSTANCE;
54 }
55 if (IntStream.class.isAssignableFrom(raw)) {
56 return IntStreamSerializer.INSTANCE;
57 }
58 if (DoubleStream.class.isAssignableFrom(raw)) {
59 return DoubleStreamSerializer.INSTANCE;
60 }
61 if (Stream.class.isAssignableFrom(raw)) {
62 JavaType[] params = config.getTypeFactory().findTypeParameters(type, Stream.class);
63 JavaType vt = (params == null || params.length != 1) ? TypeFactory.unknownType() : params[0];
64 return new StreamSerializer(config.getTypeFactory().constructParametricType(Stream.class, vt), vt);
65 }
66 return null;
67 }
68 }
69