|
1 | 1 | package com.fasterxml.jackson.dataformat.csv;
|
2 | 2 |
|
3 | 3 | import com.fasterxml.jackson.databind.*;
|
| 4 | +import com.fasterxml.jackson.databind.introspect.AnnotatedMember; |
4 | 5 | import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
|
| 6 | +import com.fasterxml.jackson.databind.util.NameTransformer; |
5 | 7 | import com.fasterxml.jackson.core.type.TypeReference;
|
6 | 8 |
|
7 | 9 | import com.fasterxml.jackson.dataformat.csv.impl.LRUMap;
|
@@ -190,34 +192,59 @@ public ObjectReader readerWithTypedSchemaFor(Class<?> pojoType)
|
190 | 192 | /**********************************************************************
|
191 | 193 | */
|
192 | 194 |
|
193 |
| - protected CsvSchema _schemaFor(JavaType pojoType, LRUMap<JavaType,CsvSchema> schemas, boolean typed) |
| 195 | + protected CsvSchema _schemaFor(JavaType pojoType, LRUMap<JavaType,CsvSchema> schemas, |
| 196 | + boolean typed) |
194 | 197 | {
|
195 | 198 | synchronized (schemas) {
|
196 | 199 | CsvSchema s = schemas.get(pojoType);
|
197 | 200 | if (s != null) {
|
198 | 201 | return s;
|
199 | 202 | }
|
200 | 203 | }
|
201 |
| - BeanDescription beanDesc = getSerializationConfig().introspect(pojoType); |
| 204 | + final AnnotationIntrospector intr = _deserializationConfig.getAnnotationIntrospector(); |
202 | 205 | CsvSchema.Builder builder = CsvSchema.builder();
|
| 206 | + _addSchemaProperties(builder, intr, typed, pojoType, null); |
| 207 | + CsvSchema result = builder.build(); |
| 208 | + synchronized (schemas) { |
| 209 | + schemas.put(pojoType, result); |
| 210 | + } |
| 211 | + return result; |
| 212 | + } |
| 213 | + |
| 214 | + protected void _addSchemaProperties(CsvSchema.Builder builder, AnnotationIntrospector intr, |
| 215 | + boolean typed, |
| 216 | + JavaType pojoType, NameTransformer unwrapper) |
| 217 | + { |
| 218 | + BeanDescription beanDesc = getSerializationConfig().introspect(pojoType); |
203 | 219 | for (BeanPropertyDefinition prop : beanDesc.findProperties()) {
|
204 | 220 | // ignore setter-only properties:
|
205 | 221 | if (!prop.couldSerialize()) {
|
206 | 222 | continue;
|
207 | 223 | }
|
208 |
| - // TODO: [Issue#15]: need to handle unwrapped props? |
209 |
| - |
210 |
| - if (typed) { |
211 |
| - builder.addColumn(prop.getName(), _determineType(prop.getAccessor().getRawType())); |
| 224 | + // [Issue#15]: handle unwrapped props |
| 225 | + AnnotatedMember m = prop.getPrimaryMember(); |
| 226 | + if (m != null) { |
| 227 | + NameTransformer nextUnwrapper = intr.findUnwrappingNameTransformer(prop.getPrimaryMember()); |
| 228 | + if (nextUnwrapper != null) { |
| 229 | + if (unwrapper != null) { |
| 230 | + nextUnwrapper = NameTransformer.chainedTransformer(unwrapper, nextUnwrapper); |
| 231 | + } |
| 232 | + JavaType nextType = m.getType(beanDesc.bindingsForBeanType()); |
| 233 | + _addSchemaProperties(builder, intr, typed, nextType, nextUnwrapper); |
| 234 | + continue; |
| 235 | + } |
| 236 | + } |
| 237 | + // Then name wrapping/unwrapping |
| 238 | + String name = prop.getName(); |
| 239 | + if (unwrapper != null) { |
| 240 | + name = unwrapper.transform(name); |
| 241 | + } |
| 242 | + if (typed && m != null) { |
| 243 | + builder.addColumn(name, _determineType(m.getRawType())); |
212 | 244 | } else {
|
213 |
| - builder.addColumn(prop.getName()); |
| 245 | + builder.addColumn(name); |
214 | 246 | }
|
215 | 247 | }
|
216 |
| - CsvSchema result = builder.build(); |
217 |
| - synchronized (schemas) { |
218 |
| - schemas.put(pojoType, result); |
219 |
| - } |
220 |
| - return result; |
221 | 248 | }
|
222 | 249 |
|
223 | 250 | // should not be null since couldSerialize() returned true, so:
|
|
0 commit comments