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