1 package com.fasterxml.jackson.databind.cfg;
2
3 import com.fasterxml.jackson.databind.ser.*;
4 import com.fasterxml.jackson.databind.util.ArrayBuilders;
5 import com.fasterxml.jackson.databind.util.ArrayIterator;
6
7 /**
8  * Configuration settings container class for
9  * {@link SerializerFactory} implementations.
10  */

11 public final class SerializerFactoryConfig
12     implements java.io.Serializable
13 {
14     private static final long serialVersionUID = 1L;
15     /**
16      * Constant for empty <code>Serializers</code> array (which by definition
17      * is stateless and reusable)
18      */

19     protected final static Serializers[] NO_SERIALIZERS = new Serializers[0];
20
21     protected final static BeanSerializerModifier[] NO_MODIFIERS = new BeanSerializerModifier[0];
22     
23     /**
24      * List of providers for additional serializers, checked before considering default
25      * basic or bean serialializers.
26      */

27     protected final Serializers[] _additionalSerializers;
28
29     /**
30      * List of providers for additional key serializers, checked before considering default
31      * key serialializers.
32      */

33     protected final Serializers[] _additionalKeySerializers;
34     
35     /**
36      * List of modifiers that can change the way {@link BeanSerializer} instances
37      * are configured and constructed.
38      */

39     protected final BeanSerializerModifier[] _modifiers;
40     
41     public SerializerFactoryConfig() {
42         this(nullnullnull);
43     }
44
45     protected SerializerFactoryConfig(Serializers[] allAdditionalSerializers,
46             Serializers[] allAdditionalKeySerializers,
47             BeanSerializerModifier[] modifiers)
48     {
49         _additionalSerializers = (allAdditionalSerializers == null) ?
50                 NO_SERIALIZERS : allAdditionalSerializers;
51         _additionalKeySerializers = (allAdditionalKeySerializers == null) ?
52                 NO_SERIALIZERS : allAdditionalKeySerializers;
53         _modifiers = (modifiers == null) ? NO_MODIFIERS : modifiers;
54     }
55
56     public SerializerFactoryConfig withAdditionalSerializers(Serializers additional)
57     {
58         if (additional == null) {
59             throw new IllegalArgumentException("Cannot pass null Serializers");
60         }
61         Serializers[] all = ArrayBuilders.insertInListNoDup(_additionalSerializers, additional);
62         return new SerializerFactoryConfig(all, _additionalKeySerializers, _modifiers);
63     }
64
65     public SerializerFactoryConfig withAdditionalKeySerializers(Serializers additional)
66     {
67         if (additional == null) {
68             throw new IllegalArgumentException("Cannot pass null Serializers");
69         }
70         Serializers[] all = ArrayBuilders.insertInListNoDup(_additionalKeySerializers, additional);
71         return new SerializerFactoryConfig(_additionalSerializers, all, _modifiers);
72     }
73     
74     public SerializerFactoryConfig withSerializerModifier(BeanSerializerModifier modifier)
75     {
76         if (modifier == null) {
77             throw new IllegalArgumentException("Cannot pass null modifier");
78         }
79         BeanSerializerModifier[] modifiers = ArrayBuilders.insertInListNoDup(_modifiers, modifier);
80         return new SerializerFactoryConfig(_additionalSerializers, _additionalKeySerializers, modifiers);
81     }
82
83     public boolean hasSerializers() { return _additionalSerializers.length > 0; }
84     public boolean hasKeySerializers() { return _additionalKeySerializers.length > 0; }
85     public boolean hasSerializerModifiers() { return _modifiers.length > 0; }
86     public Iterable<Serializers> serializers() { return new ArrayIterator<Serializers>(_additionalSerializers); }
87     public Iterable<Serializers> keySerializers() { return new ArrayIterator<Serializers>(_additionalKeySerializers); }
88     public Iterable<BeanSerializerModifier> serializerModifiers() { return new ArrayIterator<BeanSerializerModifier>(_modifiers); }
89 }
90