package com.fasterxml.jackson.databind.contextual; import java.io.IOException; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; public class TestContextAttributeWithDeser extends BaseMapTest { final static String KEY = "foobar"; @SuppressWarnings("serial") static class PrefixStringDeserializer extends StdScalarDeserializer<String> { protected PrefixStringDeserializer() { super(String.class); } @Override public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { Integer I = (Integer) ctxt.getAttribute(KEY); if (I == null) { I = Integer.valueOf(0); } int i = I.intValue(); ctxt.setAttribute(KEY, Integer.valueOf(i + 1)); return jp.getText()+"/"+i; } } static class TestPOJO { @JsonDeserialize(using=PrefixStringDeserializer.class) public String value; } /* /********************************************************** /* Test methods /********************************************************** */ final ObjectMapper MAPPER = objectMapper(); public void testSimplePerCall() throws Exception { final String INPUT = aposToQuotes("[{'value':'a'},{'value':'b'}]"); TestPOJO[] pojos = MAPPER.readerFor(TestPOJO[].class).readValue(INPUT); assertEquals(2, pojos.length); assertEquals("a/0", pojos[0].value); assertEquals("b/1", pojos[1].value); // and verify that state does not linger TestPOJO[] pojos2 = MAPPER.readerFor(TestPOJO[].class).readValue(INPUT); assertEquals(2, pojos2.length); assertEquals("a/0", pojos2[0].value); assertEquals("b/1", pojos2[1].value); } public void testSimpleDefaults() throws Exception { final String INPUT = aposToQuotes("{'value':'x'}"); TestPOJO pojo = MAPPER.readerFor(TestPOJO.class) .withAttribute(KEY, Integer.valueOf(3)) .readValue(INPUT); assertEquals("x/3", pojo.value); // as above, should not carry on state TestPOJO pojo2 = MAPPER.readerFor(TestPOJO.class) .withAttribute(KEY, Integer.valueOf(5)) .readValue(INPUT); assertEquals("x/5", pojo2.value); } public void testHierarchic() throws Exception { final String INPUT = aposToQuotes("[{'value':'x'},{'value':'y'}]"); ObjectReader r = MAPPER.readerFor(TestPOJO[].class).withAttribute(KEY, Integer.valueOf(2)); TestPOJO[] pojos = r.readValue(INPUT); assertEquals(2, pojos.length); assertEquals("x/2", pojos[0].value); assertEquals("y/3", pojos[1].value); // and once more to verify transiency of per-call state TestPOJO[] pojos2 = r.readValue(INPUT); assertEquals(2, pojos2.length); assertEquals("x/2", pojos2[0].value); assertEquals("y/3", pojos2[1].value); } }