package com.fasterxml.jackson.databind.ser;
import java.io.IOException;
import java.util.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
public class AnyGetterTest extends BaseMapTest
{
static class Bean
{
final static Map<String,Boolean> extra = new HashMap<String,Boolean>();
static {
extra.put("a", Boolean.TRUE);
}
public int getX() { return 3; }
@JsonAnyGetter
public Map<String,Boolean> getExtra() { return extra; }
}
static class AnyOnlyBean
{
@JsonAnyGetter
public Map<String,Integer> any() {
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put("a", 3);
return map;
}
}
// For [databind#1376]: allow disabling any-getter
static class NotEvenAnyBean extends AnyOnlyBean
{
@JsonAnyGetter(enabled=false)
@Override
public Map<String,Integer> any() {
throw new RuntimeException("Should not get called!)");
}
public int getValue() { return 42; }
}
static class MapAsAny
{
protected Map<String,Object> stuff = new LinkedHashMap<String,Object>();
@JsonAnyGetter
public Map<String,Object> any() {
return stuff;
}
public void add(String key, Object value) {
stuff.put(key, value);
}
}
static class Issue705Bean
{
protected Map<String,String> stuff;
public Issue705Bean(String key, String value) {
stuff = new LinkedHashMap<String,String>();
stuff.put(key, value);
}
@JsonSerialize(using = Issue705Serializer.class)
// @JsonSerialize(converter = MyConverter.class)
@JsonAnyGetter
public Map<String, String> getParameters(){
return stuff;
}
}
@SuppressWarnings("serial")
static class Issue705Serializer extends StdSerializer<Object>
{
public Issue705Serializer() {
super(Map.class, false);
}
@Override
public void serialize(Object value, JsonGenerator jgen,
SerializerProvider provider) throws IOException
{
StringBuilder sb = new StringBuilder();
for (Map.Entry<?,?> entry : ((Map<?,?>) value).entrySet()) {
sb.append('[').append(entry.getKey()).append('/').append(entry.getValue()).append(']');
}
jgen.writeStringField("stuff", sb.toString());
}
}
// [databind#1124]
static class Bean1124
{
protected Map<String,String> additionalProperties;
public void addAdditionalProperty(String key, String value) {
if (additionalProperties == null) {
additionalProperties = new HashMap<String,String>();
}
additionalProperties.put(key,value);
}
public void setAdditionalProperties(Map<String, String> additionalProperties) {
this.additionalProperties = additionalProperties;
}
@JsonAnyGetter
@JsonSerialize(contentUsing=MyUCSerializer.class)
public Map<String,String> getAdditionalProperties() { return additionalProperties; }
}
// [databind#1124]
@SuppressWarnings("serial")
static class MyUCSerializer extends StdScalarSerializer<String>
{
public MyUCSerializer() { super(String.class); }
@Override
public void serialize(String value, JsonGenerator gen,
SerializerProvider provider) throws IOException {
gen.writeString(value.toUpperCase());
}
}
/*
/**********************************************************
/* Test methods
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
public void testSimpleAnyBean() throws Exception
{
String json = MAPPER.writeValueAsString(new Bean());
Map<?,?> map = MAPPER.readValue(json, Map.class);
assertEquals(2, map.size());
assertEquals(Integer.valueOf(3), map.get("x"));
assertEquals(Boolean.TRUE, map.get("a"));
}
public void testAnyOnly() throws Exception
{
ObjectMapper m;
// First, with normal fail settings:
m = new ObjectMapper();
m.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true);
String json = serializeAsString(m, new AnyOnlyBean());
assertEquals("{\"a\":3}", json);
// then without fail
m = new ObjectMapper();
m.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
json = serializeAsString(m, new AnyOnlyBean());
assertEquals("{\"a\":3}", json);
}
public void testAnyDisabling() throws Exception
{
String json = MAPPER.writeValueAsString(new NotEvenAnyBean());
assertEquals(aposToQuotes("{'value':42}"), json);
}
// Trying to repro [databind#577]
public void testAnyWithNull() throws Exception
{
MapAsAny input = new MapAsAny();
input.add("bar", null);
assertEquals(aposToQuotes("{'bar':null}"),
MAPPER.writeValueAsString(input));
}
public void testIssue705() throws Exception
{
Issue705Bean input = new Issue705Bean("key", "value");
String json = MAPPER.writeValueAsString(input);
assertEquals("{\"stuff\":\"[key/value]\"}", json);
}
// [databind#1124]
public void testAnyGetterWithValueSerializer() throws Exception
{
ObjectMapper mapper = new ObjectMapper();
Bean1124 input = new Bean1124();
input.addAdditionalProperty("key", "value");
String json = mapper.writeValueAsString(input);
assertEquals("{\"key\":\"VALUE\"}", json);
}
}