/**
* Copyright (C) 2012 Ness Computing, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.nesscomputing.jackson;
import java.io.IOException;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.datatype.guava.GuavaModule;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableMultiset;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multiset;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.Scopes;
import com.google.inject.Stage;
import com.google.inject.util.Modules;
import org.junit.Assert;
import org.junit.Test;
import com.nesscomputing.config.ConfigModule;
public class TestNessObjectMapperProvider
{
private ObjectMapper getObjectMapper(final Module module)
{
return getObjectMapper(module, new AbstractModule() { @Override protected void configure() {} });
}
private ObjectMapper getObjectMapper(final Module module, final Module overrides)
{
final Injector injector = Guice.createInjector(Stage.PRODUCTION,
Modules.override(
ConfigModule.forTesting(),
new NessJacksonModule(),
new AbstractModule() {
@Override
public void configure() {
if (module != null) {
install(module);
}
}
}).with(overrides));
return injector.getInstance(ObjectMapper.class);
}
@Test
public void testSimple()
{
final ObjectMapper mapper = getObjectMapper(null);
Assert.assertNotNull(mapper);
}
// This test ensures that the GuavaModule is correctly installed
@Test
public void testMultisetDeserialization() throws Exception {
ObjectMapper mapper = getObjectMapper(new AbstractModule() {
@Override
protected void configure() {
NessObjectMapperBinder.bindJacksonModule(binder()).to(GuavaModule.class).in(Scopes.SINGLETON);
}
});
Multiset<String> set = mapper.readValue("[\"a\",\"a\"]", new TypeReference<HashMultiset<String>>() {});
Assert.assertEquals(ImmutableMultiset.of("a", "a"), set);
Multimap<String, String> map = mapper.readValue("{\"a\":[\"b\",\"c\"]}", new TypeReference<ImmutableMultimap<String, String>>() {});
Assert.assertEquals(ImmutableMultimap.of("a", "b", "a", "c"), map);
}
public static class DummyBean
{
private final String dummyValue;
@JsonCreator
public DummyBean(@JsonProperty final String dummyValue) {
this.dummyValue = dummyValue;
}
public String getDummyValue()
{
return dummyValue;
}
}
public static final class ExtendedDummyBean extends DummyBean
{
@JsonCreator
public ExtendedDummyBean(@JsonProperty final String dummyValue) {
super(dummyValue);
}
}
public static final class DummySerializer extends JsonSerializer<DummyBean>
{
@Override
public void serialize(DummyBean value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException
{
jgen.writeStartObject();
jgen.writeStringField("dummyValue", value.getDummyValue() + "world");
jgen.writeEndObject();
}
}
public static final class DummyDeserializer extends JsonDeserializer<DummyBean>
{
@Override
public DummyBean deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException
{
return new DummyBean("hello, world");
}
}
}