Guest User

Untitled

a guest
Jun 21st, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.48 KB | None | 0 0
  1. import java.lang.annotation.Annotation;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Type;
  4.  
  5. import javax.ws.rs.core.Context;
  6. import javax.ws.rs.core.HttpHeaders;
  7. import javax.ws.rs.core.MediaType;
  8. import javax.ws.rs.core.Request;
  9. import javax.ws.rs.core.SecurityContext;
  10. import javax.ws.rs.core.UriBuilder;
  11. import javax.ws.rs.core.UriInfo;
  12. import javax.ws.rs.ext.ContextResolver;
  13. import javax.ws.rs.ext.ExceptionMapper;
  14. import javax.ws.rs.ext.MessageBodyReader;
  15. import javax.ws.rs.ext.MessageBodyWriter;
  16. import javax.ws.rs.ext.Providers;
  17.  
  18. import com.google.inject.AbstractModule;
  19. import com.google.inject.MembersInjector;
  20. import com.google.inject.Provider;
  21. import com.google.inject.Provides;
  22. import com.google.inject.ProvisionException;
  23. import com.google.inject.Scopes;
  24. import com.google.inject.TypeLiteral;
  25. import com.google.inject.matcher.Matchers;
  26. import com.google.inject.spi.TypeEncounter;
  27. import com.google.inject.spi.TypeListener;
  28. import com.sun.jersey.api.core.HttpContext;
  29. import com.sun.jersey.api.core.HttpRequestContext;
  30. import com.sun.jersey.server.impl.application.WebApplicationImpl;
  31. import com.sun.jersey.spi.container.WebApplication;
  32.  
  33. public class JerseyModule extends AbstractModule {
  34. @Override
  35. protected void configure() {
  36. bind(WebApplication.class).to(WebApplicationImpl.class).in(Scopes.SINGLETON);
  37.  
  38. bindListener(Matchers.any(), new Jsr311TypeListener());
  39. }
  40.  
  41. @Provides public HttpContext httpContext(WebApplication webApplication) {
  42. return webApplication.getThreadLocalHttpContext();
  43. }
  44.  
  45. @Provides public UriInfo uriInfo(HttpContext httpContext) {
  46. return httpContext.getUriInfo();
  47. }
  48.  
  49. @Provides public HttpRequestContext requestContext(HttpContext httpContext) {
  50. return httpContext.getRequest();
  51. }
  52.  
  53. @Provides public HttpHeaders httpHeaders(HttpContext httpContext) {
  54. return httpContext.getRequest();
  55. }
  56.  
  57. @Provides public Request request(HttpContext httpContext) {
  58. return httpContext.getRequest();
  59. }
  60.  
  61. @Provides public SecurityContext securityContext(HttpContext httpContext) {
  62. return httpContext.getRequest();
  63. }
  64.  
  65. @Provides public Providers providers(final WebApplication webApplication) {
  66. return new Providers() {
  67.  
  68. public <T> ContextResolver<T> getContextResolver(Class<T> contextType, MediaType mediaType) {
  69. return null;
  70. }
  71.  
  72. public <T extends Throwable> ExceptionMapper<T> getExceptionMapper(Class<T> type) {
  73. return null;
  74. }
  75.  
  76. public <T> MessageBodyReader<T> getMessageBodyReader(Class<T> type, Type genericType,
  77. Annotation[] annotations, MediaType mediaType) {
  78. return webApplication.getMessageBodyWorkers().getMessageBodyReader(type, genericType, annotations, mediaType);
  79. }
  80.  
  81. public <T> MessageBodyWriter<T> getMessageBodyWriter(Class<T> type, Type genericType,
  82. Annotation[] annotations, MediaType mediaType) {
  83. return webApplication.getMessageBodyWorkers().getMessageBodyWriter(type, genericType, annotations, mediaType);
  84. }
  85. };
  86. }
  87.  
  88. @Provides public UriBuilder uriBuilder(UriInfo uriInfo) {
  89. return uriInfo.getRequestUriBuilder();
  90. }
  91.  
  92. private static class Jsr311TypeListener implements TypeListener {
  93. public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
  94. for (Field field : type.getRawType().getDeclaredFields()) {
  95. if (field.isAnnotationPresent(Context.class)) {
  96. encounter.register(new ContextMembersInjector<I>(field, encounter.getProvider(field.getType())));
  97. }
  98. }
  99. }
  100. }
  101.  
  102. private static class ContextMembersInjector<I> implements MembersInjector<I> {
  103. private final Field field;
  104. private final Provider<?> provider;
  105.  
  106. public ContextMembersInjector(Field field, Provider<?> provider) {
  107. this.field = field;
  108. this.provider = provider;
  109. }
  110.  
  111. public void injectMembers(I instance) {
  112. try {
  113. field.set(instance, provider.get());
  114. } catch (IllegalAccessException e) {
  115. throw new ProvisionException("Failed to inject " + instance.getClass().getName() + "." + field.getName(), e);
  116. }
  117. }
  118. }
  119. }
Add Comment
Please, Sign In to add comment