1 package com.fasterxml.jackson.dataformat.xml.ser;
2
3 import java.io.IOException;
4 import java.util.Set;
5
6 import com.fasterxml.jackson.core.JsonGenerator;
7 import com.fasterxml.jackson.databind.JsonSerializer;
8 import com.fasterxml.jackson.databind.SerializerProvider;
9 import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
10 import com.fasterxml.jackson.databind.ser.BeanSerializer;
11 import com.fasterxml.jackson.databind.ser.impl.BeanAsArraySerializer;
12 import com.fasterxml.jackson.databind.ser.impl.ObjectIdWriter;
13 import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
14 import com.fasterxml.jackson.databind.util.NameTransformer;
15
16 /**
17  * Variant of {@link BeanSerializer} for XML handling.
18  * 
19  * @author Pascal GĂ©linas
20  */

21 public class XmlBeanSerializer extends XmlBeanSerializerBase
22 {
23     private static final long serialVersionUID = 1L;
24
25     /*
26     /**********************************************************
27     /* Life-cycle: constructors
28     /**********************************************************
29      */

30     public XmlBeanSerializer(BeanSerializerBase src) {
31         super(src);
32     }
33
34     public XmlBeanSerializer(XmlBeanSerializerBase src, ObjectIdWriter objectIdWriter, Object filterId) {
35         super(src, objectIdWriter, filterId);
36     }
37
38     public XmlBeanSerializer(XmlBeanSerializerBase src, ObjectIdWriter objectIdWriter) {
39         super(src, objectIdWriter);
40     }
41
42     public XmlBeanSerializer(XmlBeanSerializerBase src, Set<String> toIgnore) {
43         super(src, toIgnore);
44     }
45
46     protected XmlBeanSerializer(XmlBeanSerializerBase src,
47             BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties)
48     {
49         super(src, properties, filteredProperties);
50     }
51
52     /*
53     /**********************************************************
54     /* Life-cycle: factory methods, fluent factories
55     /**********************************************************
56      */

57
58     @Override
59     public JsonSerializer<Object> unwrappingSerializer(NameTransformer unwrapper) {
60         return new UnwrappingXmlBeanSerializer(this, unwrapper);
61     }
62     
63     @Override
64     public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) {
65         return new XmlBeanSerializer(this, objectIdWriter, _propertyFilterId);
66     }
67
68     @Override
69     public BeanSerializerBase withFilterId(Object filterId) {
70         return new XmlBeanSerializer(this, _objectIdWriter, filterId);
71     }
72
73     @Override
74     protected BeanSerializerBase withIgnorals(Set<String> toIgnore) {
75         return new XmlBeanSerializer(this, toIgnore);
76     }
77
78     @Override // since 2.11.1
79     protected BeanSerializerBase withProperties(BeanPropertyWriter[] properties,
80             BeanPropertyWriter[] filteredProperties) {
81         return new XmlBeanSerializer(this, properties, filteredProperties);
82     }
83
84     /**
85      * Implementation has to check whether as-array serialization
86      * is possible reliably; if (and only if) so, will construct
87      * a {@link BeanAsArraySerializer}, otherwise will return this
88      * serializer as is.
89      */

90     @Override
91     protected BeanSerializerBase asArraySerializer()
92     {
93         /* Can not:
94          * 
95          * - have Object Id (may be allowed in future)
96          * - have any getter
97          */

98         if ((_objectIdWriter == null)
99                 && (_anyGetterWriter == null)
100                 && (_propertyFilterId == null)
101                 ) {
102             return new BeanAsArraySerializer(this);
103         }
104         // already is one, so:
105         return this;
106     }
107
108     /*
109     /**********************************************************
110     /* JsonSerializer implementation that differs between impls
111     /**********************************************************
112      */

113
114     /**
115      * Main serialization method that will delegate actual output to configured
116      * {@link BeanPropertyWriter} instances.
117      */

118     @Override
119     public void serialize(Object bean, JsonGenerator g, SerializerProvider provider) throws IOException
120     {
121         if (_objectIdWriter != null) {
122             _serializeWithObjectId(bean, g, provider, true);
123             return;
124         }
125         g.writeStartObject();
126         if (_propertyFilterId != null) {
127             serializeFieldsFiltered(bean, g, provider);
128         } else {
129             serializeFields(bean, g, provider);
130         }
131         g.writeEndObject();
132     }
133
134     /*
135     /**********************************************************
136     /* Standard methods
137     /**********************************************************
138      */

139
140     @Override
141     public String toString() {
142         return "XmlBeanSerializer for " + handledType().getName();
143     }
144 }
145