package ameba.message.jackson.internal;
import ameba.core.Application;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.jaxrs.json.JsonEndpointConfig;
import org.glassfish.jersey.message.filtering.spi.ObjectProvider;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
/**
* <p>FilteringJacksonJsonProvider class.</p>
*
* @author icode
* @since 0.1.6e
*
*/
@Singleton
public class FilteringJacksonJsonProvider extends JacksonJsonProvider {
@Inject
private Provider<ObjectProvider<FilterProvider>> provider;
@Context
private UriInfo uriInfo;
@Inject
private Application.Mode mode;
/**
* {@inheritDoc}
*/
@Override
protected JsonGenerator _createGenerator(ObjectWriter writer, OutputStream rawStream, JsonEncoding enc) throws IOException {
JsonGenerator generator = super._createGenerator(writer, rawStream, enc);
JacksonUtils.configureGenerator(uriInfo, generator, mode.isDev());
return generator;
}
/** {@inheritDoc} */
@Override
protected JsonEndpointConfig _configForWriting(final ObjectMapper mapper, final Annotation[] annotations,
final Class<?> defaultView) {
return super._configForWriting(
JacksonUtils.configFilterIntrospector(mapper)
, annotations, defaultView);
}
/** {@inheritDoc} */
@Override
public void writeTo(final Object value,
final Class<?> type,
final Type genericType,
final Annotation[] annotations,
final javax.ws.rs.core.MediaType mediaType,
final MultivaluedMap<String, Object> httpHeaders,
final OutputStream entityStream) throws IOException {
JacksonUtils.setObjectWriterInjector(provider, genericType, annotations);
super.writeTo(value, type, genericType, annotations, mediaType, httpHeaders, entityStream);
}
}