package org.activityinfo.server.util.jaxrs;
import com.bedatadriven.geojson.GeoJsonModule;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
/**
* Wraps the JacksonJsonProvider to refine the ObjectMapper and
* to ensure that the Content-Type header always includes the
* charset=UTF-8 fragment
*/
public class Utf8JacksonJsonProvider extends JacksonJsonProvider {
public Utf8JacksonJsonProvider() {
super(createObjectMapper());
}
@Override
public void writeTo(Object value,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException {
httpHeaders.putSingle(HttpHeaders.CONTENT_TYPE, mediaType.toString() + ";charset=UTF-8");
super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream);
}
private static ObjectMapper createObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.registerModule(new GeoJsonModule());
return mapper;
}
}