package ameba.message.jackson.internal; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.ser.BeanPropertyFilter; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.PropertyFilter; import com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase; import com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier; import javax.ws.rs.core.MultivaluedMap; import java.io.IOException; /** * <p>FilteringObjectWriterModifier class.</p> * * @author icode * @since 0.1.6e * */ public class FilteringObjectWriterModifier extends ObjectWriterModifier { private final ObjectWriterModifier original; private final FilterProvider filterProvider; /** * <p>Constructor for FilteringObjectWriterModifier.</p> * * @param filterProvider a {@link com.fasterxml.jackson.databind.ser.FilterProvider} object. * @param original a {@link com.fasterxml.jackson.jaxrs.cfg.ObjectWriterModifier} object. */ public FilteringObjectWriterModifier(final FilterProvider filterProvider, final ObjectWriterModifier original) { this.original = original; this.filterProvider = filterProvider; } /** * {@inheritDoc} */ @Override public ObjectWriter modify(final EndpointConfigBase<?> endpoint, final MultivaluedMap<String, Object> responseHeaders, final Object valueToWrite, final ObjectWriter w, final JsonGenerator g) throws IOException { final ObjectWriter writer = original == null ? w : original.modify(endpoint, responseHeaders, valueToWrite, w, g); final FilterProvider customFilterProvider = writer.getConfig().getFilterProvider(); // Try the custom (user) filter provider first. return customFilterProvider == null ? writer.with(filterProvider) : writer.with(new FilterProvider() { @Override public BeanPropertyFilter findFilter(final Object filterId) { return customFilterProvider.findFilter(filterId); } @Override public PropertyFilter findPropertyFilter(final Object filterId, final Object valueToFilter) { final PropertyFilter filter = customFilterProvider.findPropertyFilter(filterId, valueToFilter); if (filter != null) { return filter; } return filterProvider.findPropertyFilter(filterId, valueToFilter); } }); } }