Skip to content

Commit 298bca6

Browse files
committed
Adds schema creating csv schema with View
1 parent a6eb9ab commit 298bca6

File tree

2 files changed

+97
-20
lines changed

2 files changed

+97
-20
lines changed

csv/src/main/java/com/fasterxml/jackson/dataformat/csv/CsvMapper.java

+54-15
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package com.fasterxml.jackson.dataformat.csv;
22

3-
import java.util.Collection;
4-
53
import com.fasterxml.jackson.core.type.TypeReference;
6-
7-
import com.fasterxml.jackson.databind.*;
4+
import com.fasterxml.jackson.databind.AnnotationIntrospector;
5+
import com.fasterxml.jackson.databind.BeanDescription;
6+
import com.fasterxml.jackson.databind.JavaType;
7+
import com.fasterxml.jackson.databind.ObjectMapper;
8+
import com.fasterxml.jackson.databind.ObjectReader;
9+
import com.fasterxml.jackson.databind.ObjectWriter;
10+
import com.fasterxml.jackson.databind.SerializerProvider;
811
import com.fasterxml.jackson.databind.cfg.MapperBuilder;
912
import com.fasterxml.jackson.databind.cfg.MapperBuilderState;
1013
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
1114
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
1215
import com.fasterxml.jackson.databind.util.NameTransformer;
1316
import com.fasterxml.jackson.databind.util.SimpleLookupCache;
17+
import java.util.Collection;
1418

1519
/**
1620
* Specialized {@link ObjectMapper}, with extended functionality to
@@ -364,15 +368,27 @@ public CsvSchema schema() {
364368
* just defined to be exposed as String tokens).
365369
*/
366370
public CsvSchema schemaFor(JavaType pojoType) {
367-
return _schemaFor(pojoType, _untypedSchemas, false);
371+
return _schemaFor(pojoType, _untypedSchemas, false, null);
372+
}
373+
374+
public CsvSchema schemaForWithView(JavaType pojoType, Class<?> view) {
375+
return _schemaFor(pojoType, _untypedSchemas, false, view);
368376
}
369377

370378
public final CsvSchema schemaFor(Class<?> pojoType) {
371-
return _schemaFor(constructType(pojoType), _untypedSchemas, false);
379+
return _schemaFor(constructType(pojoType), _untypedSchemas, false, null);
380+
}
381+
382+
public final CsvSchema schemaForWithView(Class<?> pojoType, Class<?> view) {
383+
return _schemaFor(constructType(pojoType), _untypedSchemas, false, view);
372384
}
373385

374386
public final CsvSchema schemaFor(TypeReference<?> pojoTypeRef) {
375-
return _schemaFor(constructType(pojoTypeRef.getType()), _untypedSchemas, false);
387+
return _schemaFor(constructType(pojoTypeRef.getType()), _untypedSchemas, false, null);
388+
}
389+
390+
public final CsvSchema schemaForWithView(TypeReference<?> pojoTypeRef, Class<?> view) {
391+
return _schemaFor(constructType(pojoTypeRef.getType()), _untypedSchemas, false, view);
376392
}
377393

378394
/**
@@ -383,15 +399,27 @@ public final CsvSchema schemaFor(TypeReference<?> pojoTypeRef) {
383399
* (especially for numeric types like java.lang.Integer).
384400
*/
385401
public CsvSchema typedSchemaFor(JavaType pojoType) {
386-
return _schemaFor(pojoType, _typedSchemas, true);
402+
return _schemaFor(pojoType, _typedSchemas, true, null);
403+
}
404+
405+
public CsvSchema typedSchemaForWithView(JavaType pojoType, Class<?> view) {
406+
return _schemaFor(pojoType, _typedSchemas, true, view);
387407
}
388408

389409
public final CsvSchema typedSchemaFor(Class<?> pojoType) {
390-
return _schemaFor(constructType(pojoType), _typedSchemas, true);
410+
return _schemaFor(constructType(pojoType), _typedSchemas, true, null);
411+
}
412+
413+
public final CsvSchema typedSchemaForWithView(Class<?> pojoType, Class<?> view) {
414+
return _schemaFor(constructType(pojoType), _typedSchemas, true, view);
391415
}
392416

393417
public final CsvSchema typedSchemaFor(TypeReference<?> pojoTypeRef) {
394-
return _schemaFor(constructType(pojoTypeRef.getType()), _typedSchemas, true);
418+
return _schemaFor(constructType(pojoTypeRef.getType()), _typedSchemas, true, null);
419+
}
420+
421+
public final CsvSchema typedSchemaForWithView(TypeReference<?> pojoTypeRef, Class<?> view) {
422+
return _schemaFor(constructType(pojoTypeRef.getType()), _typedSchemas, true, view);
395423
}
396424

397425
/*
@@ -401,7 +429,7 @@ public final CsvSchema typedSchemaFor(TypeReference<?> pojoTypeRef) {
401429
*/
402430

403431
protected CsvSchema _schemaFor(JavaType pojoType, SimpleLookupCache<JavaType,CsvSchema> schemas,
404-
boolean typed)
432+
boolean typed, Class<?> view)
405433
{
406434
synchronized (schemas) {
407435
CsvSchema s = schemas.get(pojoType);
@@ -412,7 +440,7 @@ protected CsvSchema _schemaFor(JavaType pojoType, SimpleLookupCache<JavaType,Csv
412440
// 15-Oct-2019, tatu: Since 3.0, need context for introspection
413441
final SerializerProvider ctxt = _serializerProvider();
414442
CsvSchema.Builder builder = CsvSchema.builder();
415-
_addSchemaProperties(ctxt, builder, typed, pojoType, null);
443+
_addSchemaProperties(ctxt, builder, typed, pojoType, null, view);
416444
CsvSchema result = builder.build();
417445
synchronized (schemas) {
418446
schemas.put(pojoType, result);
@@ -449,8 +477,7 @@ protected boolean _nonPojoType(JavaType t)
449477
}
450478

451479
protected void _addSchemaProperties(SerializerProvider ctxt, CsvSchema.Builder builder,
452-
boolean typed,
453-
JavaType pojoType, NameTransformer unwrapper)
480+
boolean typed, JavaType pojoType, NameTransformer unwrapper, Class<?> view)
454481
{
455482
// 09-Aug-2015, tatu: From [dataformat-csv#87], realized that one can not have
456483
// real schemas for primitive/wrapper
@@ -460,6 +487,18 @@ protected void _addSchemaProperties(SerializerProvider ctxt, CsvSchema.Builder b
460487
BeanDescription beanDesc = ctxt.introspectBeanDescription(pojoType);
461488
final AnnotationIntrospector intr = ctxt.getAnnotationIntrospector();
462489
for (BeanPropertyDefinition prop : beanDesc.findProperties()) {
490+
if (view != null) {
491+
boolean viewVisible = false;
492+
for(Class<?> propView : prop.findViews()) {
493+
if (propView.equals(view)) {
494+
viewVisible = true;
495+
break;
496+
}
497+
}
498+
if (!viewVisible) {
499+
continue;
500+
}
501+
}
463502
// ignore setter-only properties:
464503
if (!prop.couldSerialize()) {
465504
continue;
@@ -474,7 +513,7 @@ protected void _addSchemaProperties(SerializerProvider ctxt, CsvSchema.Builder b
474513
nextUnwrapper = NameTransformer.chainedTransformer(unwrapper, nextUnwrapper);
475514
}
476515
JavaType nextType = m.getType();
477-
_addSchemaProperties(ctxt, builder, typed, nextType, nextUnwrapper);
516+
_addSchemaProperties(ctxt, builder, typed, nextType, nextUnwrapper, view);
478517
continue;
479518
}
480519
}

csv/src/test/java/com/fasterxml/jackson/dataformat/csv/deser/TestFiltering.java

+43-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package com.fasterxml.jackson.dataformat.csv.deser;
22

3-
import java.io.BufferedReader;
4-
import java.io.StringReader;
5-
import java.util.*;
6-
7-
import com.fasterxml.jackson.annotation.*;
3+
import com.fasterxml.jackson.annotation.JsonFilter;
4+
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
5+
import com.fasterxml.jackson.annotation.JsonView;
86
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter.FilterExceptFilter;
97
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
108
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
9+
import com.fasterxml.jackson.dataformat.csv.CsvMappingException;
1110
import com.fasterxml.jackson.dataformat.csv.CsvSchema;
1211
import com.fasterxml.jackson.dataformat.csv.ModuleTestBase;
12+
import java.io.BufferedReader;
13+
import java.io.StringReader;
14+
import java.util.Arrays;
15+
import java.util.List;
1316

1417
public class TestFiltering extends ModuleTestBase
1518
{
@@ -76,6 +79,41 @@ public void testWithJsonView() throws Exception
7679
assertEquals("2", result.aa);
7780
assertEquals("7", result.b);
7881
}
82+
83+
public void testSchemaWithJsonViewSerialization() throws Exception
84+
{
85+
CsvSchema schema = MAPPER.schemaForWithView(Bean.class, ViewB.class).withLineSeparator("\n").withHeader();
86+
String actual = MAPPER.writer(schema).withView(ViewB.class).writeValueAsString(new Bean());
87+
MAPPER.writer(schema).withView(ViewB.class);
88+
89+
BufferedReader br = new BufferedReader(new StringReader(actual.trim()));
90+
assertEquals("a,b", br.readLine());
91+
assertEquals("1,3", br.readLine());
92+
assertNull(br.readLine());
93+
}
94+
95+
public void testSchemaWithJsonViewDeserialization() throws Exception
96+
{
97+
CsvSchema schema = MAPPER.schemaForWithView(Bean.class, ViewB.class).withLineSeparator("\n").withHeader();
98+
final String input = "a,b\n5,7\n";
99+
Bean result = MAPPER.readerFor(Bean.class).with(schema).withView(ViewB.class).readValue(input);
100+
101+
assertEquals("5", result.a);
102+
// due to filtering, ought to use default
103+
assertEquals("2", result.aa);
104+
assertEquals("7", result.b);
105+
}
106+
107+
public void testSchemaWithJsonViewDeserializationFail() throws Exception
108+
{
109+
CsvSchema schema = MAPPER.schemaForWithView(Bean.class, ViewB.class).withLineSeparator("\n").withHeader();
110+
final String input = "a,aa,b\n5,6,7\n";
111+
try {
112+
MAPPER.readerFor(Bean.class).with(schema).withView(ViewB.class).readValue(input);
113+
fail();
114+
} catch (CsvMappingException ignore) {
115+
}
116+
}
79117

80118
public void testWithJsonFilter() throws Exception
81119
{

0 commit comments

Comments
 (0)