package flapjack.conf;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.aopalliance.intercept.MethodInterceptor;
import org.glassfish.hk2.api.InterceptionService;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.mvc.MvcFeature;
import org.jvnet.hk2.guice.bridge.api.GuiceBridge;
import org.jvnet.hk2.guice.bridge.api.GuiceIntoHK2Bridge;
import org.jvnet.hk2.guice.bridge.api.HK2IntoGuiceBridge;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import com.google.inject.Injector;
import com.google.inject.Module;
import flapjack.auth.AuthInterceptor;
import flapjack.auth.AuthService;
/**
* Configuration for Jersey 2.x
*
* @author ray
*/
public class JerseyConfig extends ResourceConfig {
private static Logger log = LoggerFactory.getLogger(JerseyConfig.class);
@Inject
public JerseyConfig(ServiceLocator serviceLocator) {
log.info("Registering jersey injectables...");
property(MvcFeature.TEMPLATE_BASE_PATH, "META-INF/resources/templates/");
registerProviders();
createBiDirectionalGuiceBridge(serviceLocator, GuiceConfig.getAllModulesAsArray());
}
private void registerProviders() {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(Include.NON_NULL);
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(mapper);
register(provider);
register(new AbstractBinder() {
@Override
protected void configure() {
bind(AuthInterceptor.class).to(MethodInterceptor.class).in(Singleton.class);
bind(AuthService.class).to(InterceptionService.class).in(Singleton.class);
}
});
}
public Injector createBiDirectionalGuiceBridge(ServiceLocator serviceLocator, Module... applicationModules) {
Module[] allModules = new Module[applicationModules.length + 1];
allModules[0] = new HK2IntoGuiceBridge(serviceLocator);
for (int lcv = 0; lcv < applicationModules.length; lcv++) {
allModules[lcv + 1] = applicationModules[lcv];
}
Injector injector = GuiceConfig.getInjectorInstance();
GuiceBridge.getGuiceBridge().initializeGuiceBridge(serviceLocator);
GuiceIntoHK2Bridge g2h = serviceLocator.getService(GuiceIntoHK2Bridge.class);
g2h.bridgeGuiceInjector(injector);
return injector;
}
}