/*
* Copyright (C) 2013 Intel Corporation
* All rights reserved.
*/
package com.intel.mtwilson.jaxrs2.provider;
import com.fasterxml.jackson.annotation.JsonInclude;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
//import org.codehaus.jackson.map.ObjectMapper;
//import org.codehaus.jackson.map.SerializationConfig.Feature;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.intel.mtwilson.jackson.bouncycastle.BouncyCastleModule;
import com.intel.mtwilson.jaxrs2.mediatype.CryptoMediaType;
import com.intel.mtwilson.jaxrs2.mediatype.DataMediaType;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* A hypothetical example JSON output using the default ObjectMapper settings
* might look like this (notice camelCase on connectionUrl and biosMLE):
*
{"hosts":[{"id":"093b4663-ca45-4d3e-8a3a-f1f584996a6b","name":"hostabc","connectionUrl":"http://1.2.3.4","description":"test host","biosMLE":"bios-4.3.2"}]}
*
* But the same example object when this provider is on the classpath will
* look like this (notice the underscores connection_url and bios_mle):
*
{"hosts":[{"id":"093b4663-ca45-4d3e-8a3a-f1f584996a6b","name":"hostabc","connection_url":"http://1.2.3.4","description":"test host","bios_mle":"bios-4.3.2"}]}
*
*
* @author jbuhacoff
*/
@Provider
@Produces({MediaType.APPLICATION_JSON,DataMediaType.APPLICATION_RELATIONAL_PATCH_JSON,DataMediaType.APPLICATION_VND_API_JSON,DataMediaType.APPLICATION_JSON_PATCH})
public class JacksonObjectMapperProvider implements ContextResolver<ObjectMapper> {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(JacksonObjectMapperProvider.class);
private final ObjectMapper defaultObjectMapper;
public JacksonObjectMapperProvider() {
log.debug("JacksonObjectMapperProvider constructor");
defaultObjectMapper = createDefaultMapper();
}
@Override
public ObjectMapper getContext(Class<?> type) {
log.debug("JacksonObjectMapperProvider getContext");
return defaultObjectMapper;
}
public ObjectMapper createDefaultMapper() {
log.debug("JacksonObjectMapperProvider createDefaultMapper");
JsonFactory jsonFactory = new JsonFactory();
jsonFactory.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
ObjectMapper mapper = new ObjectMapper(jsonFactory);
mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy());
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerModule(new BouncyCastleModule()); // this is a good spot for an extension point
return mapper;
}
}