blob: dadc7e20c60abedba2b8739e3f45fb76a487ab69 [file] [log] [blame]
package com.fasterxml.jackson.databind.ser.filter;
import java.util.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.BaseMapTest;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
/**
* Unit tests for ensuring that entries accessible via "any filter"
* can also be filtered with JSON Filter functionality.
*/
public class TestAnyGetterFiltering extends BaseMapTest
{
@JsonFilter("anyFilter")
public static class AnyBean
{
private Map<String, String> properties = new HashMap<String, String>();
{
properties.put("a", "1");
properties.put("b", "2");
}
@JsonAnyGetter
public Map<String, String> anyProperties()
{
return properties;
}
}
public static class AnyBeanWithIgnores
{
private Map<String, String> properties = new LinkedHashMap<String, String>();
{
properties.put("a", "1");
properties.put("bogus", "2");
properties.put("b", "3");
}
@JsonAnyGetter
@JsonIgnoreProperties({ "bogus" })
public Map<String, String> anyProperties()
{
return properties;
}
}
// [databind#1655]
@JsonFilter("CustomFilter")
static class OuterObject {
public int getExplicitProperty() {
return 42;
}
@JsonAnyGetter
public Map<String, Object> getAny() {
Map<String, Object> extra = new HashMap<>();
extra.put("dynamicProperty", "I will not serialize");
return extra;
}
}
static class CustomFilter extends SimpleBeanPropertyFilter {
@Override
public void serializeAsField(Object pojo, JsonGenerator gen, SerializerProvider provider,
PropertyWriter writer) throws Exception
{
if (pojo instanceof OuterObject) {
writer.serializeAsField(pojo, gen, provider);
}
}
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
public void testAnyGetterFiltering() throws Exception
{
FilterProvider prov = new SimpleFilterProvider().addFilter("anyFilter",
SimpleBeanPropertyFilter.filterOutAllExcept("b"));
assertEquals("{\"b\":\"2\"}", MAPPER.writer(prov).writeValueAsString(new AnyBean()));
}
// for [databind#1142]
public void testAnyGetterIgnore() throws Exception
{
assertEquals(aposToQuotes("{'a':'1','b':'3'}"),
MAPPER.writeValueAsString(new AnyBeanWithIgnores()));
}
// [databind#1655]
public void testAnyGetterPojo1655() throws Exception
{
FilterProvider filters = new SimpleFilterProvider().addFilter("CustomFilter", new CustomFilter());
String json = MAPPER.writer(filters).writeValueAsString(new OuterObject());
Map<?,?> stuff = MAPPER.readValue(json, Map.class);
if (stuff.size() != 2) {
fail("Should have 2 properties, got: "+stuff);
}
}
}