1 package com.fasterxml.jackson.databind.ser.impl;
2
3 import com.fasterxml.jackson.core.JsonGenerator;
4
5 import com.fasterxml.jackson.databind.*;
6 import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
7 import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
8 import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
9 import com.fasterxml.jackson.databind.util.NameTransformer;
10
11 import java.io.IOException;
12 import java.util.Set;
13
14 public class UnwrappingBeanSerializer
15     extends BeanSerializerBase
16     implements java.io.Serializable
17 {
18     private static final long serialVersionUID = 1L;
19
20     /**
21      * Transformer used to add prefix and/or suffix for properties
22      * of unwrapped POJO.
23      */

24     protected final NameTransformer _nameTransformer;
25     
26     /*
27     /**********************************************************
28     /* Life-cycle: constructors
29     /**********************************************************
30      */

31
32     /**
33      * Constructor used for creating unwrapping instance of a
34      * standard <code>BeanSerializer</code>
35      */

36     public UnwrappingBeanSerializer(BeanSerializerBase src, NameTransformer transformer) {
37         super(src, transformer);
38         _nameTransformer = transformer;
39     }
40
41     public UnwrappingBeanSerializer(UnwrappingBeanSerializer src,
42             ObjectIdWriter objectIdWriter) {
43         super(src, objectIdWriter);
44         _nameTransformer = src._nameTransformer;
45     }
46
47     public UnwrappingBeanSerializer(UnwrappingBeanSerializer src,
48             ObjectIdWriter objectIdWriter, Object filterId) {
49         super(src, objectIdWriter, filterId);
50         _nameTransformer = src._nameTransformer;
51     }
52
53     protected UnwrappingBeanSerializer(UnwrappingBeanSerializer src, Set<String> toIgnore) {
54         super(src, toIgnore);
55         _nameTransformer = src._nameTransformer;
56     }
57
58     // @since 2.11.1
59     protected UnwrappingBeanSerializer(UnwrappingBeanSerializer src,
60             BeanPropertyWriter[] properties, BeanPropertyWriter[] filteredProperties) {
61         super(src, properties, filteredProperties);
62         _nameTransformer = src._nameTransformer;
63     }
64
65     /*
66     /**********************************************************
67     /* Life-cycle: factory methods, fluent factories
68     /**********************************************************
69      */

70
71     @Override
72     public JsonSerializer<Object> unwrappingSerializer(NameTransformer transformer) {
73         // !!! 23-Jan-2012, tatu: Should we chain transformers?
74         return new UnwrappingBeanSerializer(this, transformer);
75     }
76
77     @Override
78     public boolean isUnwrappingSerializer() {
79         return true// sure is
80     }
81
82     @Override
83     public BeanSerializerBase withObjectIdWriter(ObjectIdWriter objectIdWriter) {
84         return new UnwrappingBeanSerializer(this, objectIdWriter);
85     }
86
87     @Override
88     public BeanSerializerBase withFilterId(Object filterId) {
89         return new UnwrappingBeanSerializer(this, _objectIdWriter, filterId);
90     }
91
92     @Override
93     protected BeanSerializerBase withIgnorals(Set<String> toIgnore) {
94         return new UnwrappingBeanSerializer(this, toIgnore);
95     }
96
97     @Override // @since 2.11.1
98     protected BeanSerializerBase withProperties(BeanPropertyWriter[] properties,
99             BeanPropertyWriter[] filteredProperties) {
100         return new UnwrappingBeanSerializer(this, properties, filteredProperties);
101     }
102
103     /**
104      * JSON Array output cannot be done if unwrapping operation is
105      * requested; so implementation will simply return 'this'.
106      */

107     @Override
108     protected BeanSerializerBase asArraySerializer() {
109         return this;
110     }
111     
112     /*
113     /**********************************************************
114     /* JsonSerializer implementation that differs between impls
115     /**********************************************************
116      */

117
118     /**
119      * Main serialization method that will delegate actual output to
120      * configured
121      * {@link BeanPropertyWriter} instances.
122      */

123     @Override
124     public final void serialize(Object bean, JsonGenerator gen, SerializerProvider provider) throws IOException
125     {
126         gen.setCurrentValue(bean); // [databind#631]
127         if (_objectIdWriter != null) {
128             _serializeWithObjectId(bean, gen, provider, false);
129             return;
130         }
131         if (_propertyFilterId != null) {
132             serializeFieldsFiltered(bean, gen, provider);
133         } else {
134             serializeFields(bean, gen, provider);
135         }
136     }
137     
138     @Override
139     public void serializeWithType(Object bean, JsonGenerator gen, SerializerProvider provider,
140             TypeSerializer typeSer) throws IOException
141     {
142         if (provider.isEnabled(SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS)) {
143             provider.reportBadDefinition(handledType(),
144                     "Unwrapped property requires use of type information: cannot serialize without disabling `SerializationFeature.FAIL_ON_UNWRAPPED_TYPE_IDENTIFIERS`");
145         }
146         gen.setCurrentValue(bean); // [databind#631]
147         if (_objectIdWriter != null) {
148             _serializeWithObjectId(bean, gen, provider, typeSer);
149             return;
150         }
151         if (_propertyFilterId != null) {
152             serializeFieldsFiltered(bean, gen, provider);
153         } else {
154             serializeFields(bean, gen, provider);
155         }
156     }
157
158     /*
159     /**********************************************************
160     /* Standard methods
161     /**********************************************************
162      */

163
164     @Override public String toString() {
165         return "UnwrappingBeanSerializer for "+handledType().getName();
166     }
167 }
168