package com.englishtown.vertx.guice;
import com.englishtown.vertx.jersey.*;
import com.englishtown.vertx.jersey.impl.DefaultJerseyHandler;
import com.englishtown.vertx.jersey.impl.DefaultJerseyOptions;
import com.englishtown.vertx.jersey.impl.DefaultVertxContainer;
import com.englishtown.vertx.jersey.impl.WriteStreamBodyWriter;
import com.englishtown.vertx.jersey.inject.ContainerResponseWriterProvider;
import com.englishtown.vertx.jersey.inject.VertxPostResponseProcessor;
import com.englishtown.vertx.jersey.inject.VertxRequestProcessor;
import com.englishtown.vertx.jersey.inject.VertxResponseProcessor;
import com.englishtown.vertx.jersey.inject.impl.VertxResponseWriterProvider;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.util.Providers;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.api.ServiceLocatorFactory;
import org.glassfish.jersey.server.model.ModelProcessor;
import org.glassfish.jersey.server.monitoring.ApplicationEventListener;
import org.glassfish.jersey.server.spi.ContainerLifecycleListener;
import javax.inject.Singleton;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.WriterInterceptor;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* Guice Jersey binder
*/
public class GuiceJerseyBinder extends AbstractModule {
/**
* Configures a {@link com.google.inject.Binder} via the exposed methods.
*/
@Override
protected void configure() {
// Create HK2 service locator and bind jersey injections
ServiceLocator locator = ServiceLocatorFactory.getInstance().create(null);
bind(ServiceLocator.class).toInstance(locator);
bind(VertxContainer.class).to(DefaultVertxContainer.class);
bind(JerseyServer.class).to(GuiceJerseyServer.class);
bind(JerseyHandler.class).to(DefaultJerseyHandler.class);
bind(JerseyOptions.class).to(DefaultJerseyOptions.class);
bind(JerseyServerOptions.class).to(DefaultJerseyOptions.class);
bind(ContainerResponseWriterProvider.class).to(VertxResponseWriterProvider.class);
bind(MessageBodyWriter.class).to(WriteStreamBodyWriter.class).in(Singleton.class);
bind(ApplicationConfigurator.class).toProvider(Providers.of(null));
Multibinder.newSetBinder(binder(), VertxRequestProcessor.class);
Multibinder.newSetBinder(binder(), VertxResponseProcessor.class);
Multibinder.newSetBinder(binder(), VertxPostResponseProcessor.class);
Multibinder.newSetBinder(binder(), ContainerRequestFilter.class);
Multibinder.newSetBinder(binder(), ContainerResponseFilter.class);
Multibinder.newSetBinder(binder(), ReaderInterceptor.class);
Multibinder.newSetBinder(binder(), WriterInterceptor.class);
Multibinder.newSetBinder(binder(), ModelProcessor.class);
Multibinder.newSetBinder(binder(), ContainerLifecycleListener.class);
Multibinder.newSetBinder(binder(), ApplicationEventListener.class);
Multibinder.newSetBinder(binder(), ExceptionMapper.class);
}
@Provides
List<VertxRequestProcessor> provideVertxRequestProcessorList(Set<VertxRequestProcessor> processors) {
return new ArrayList<>(processors);
}
@Provides
List<VertxResponseProcessor> provideVertxResponseProcessorList(Set<VertxResponseProcessor> processors) {
return new ArrayList<>(processors);
}
@Provides
List<VertxPostResponseProcessor> provideVertxPostResponseProcessorList(Set<VertxPostResponseProcessor> processors) {
return new ArrayList<>(processors);
}
}