package com.hubspot.blazar;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.MultivaluedMap;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.jaxrs.cfg.EndpointConfigBase;
import com.fasterxml.jackson.jaxrs.cfg.ObjectReaderInjector;
import com.fasterxml.jackson.jaxrs.cfg.ObjectReaderModifier;
import com.google.inject.Inject;
import com.hubspot.blazar.github.GitHubProtos;
public class GitHubNamingFilter implements ContainerRequestFilter {
private final Set<Class<?>> gitHubClasses;
@Inject
public GitHubNamingFilter() {
this.gitHubClasses = new HashSet<>(Arrays.asList(GitHubProtos.class.getClasses()));
}
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
ObjectReaderInjector.set(new ObjectReaderModifier() {
@Override
public ObjectReader modify(EndpointConfigBase<?> endpoint,
MultivaluedMap<String, String> httpHeaders,
JavaType resultType,
ObjectReader r,
JsonParser p) throws IOException {
if (gitHubClasses.contains(resultType.getRawClass())) {
return r.with(r.getConfig().with(PropertyNamingStrategy.SNAKE_CASE));
} else {
return r;
}
}
});
}
}