View Javadoc

1   package com.atlassian.asap.core.server.jersey;
2   
3   import com.atlassian.asap.api.Jwt;
4   import org.glassfish.hk2.api.Factory;
5   import org.glassfish.hk2.api.InjectionResolver;
6   import org.glassfish.hk2.api.ServiceLocator;
7   import org.glassfish.hk2.api.TypeLiteral;
8   import org.glassfish.hk2.utilities.binding.AbstractBinder;
9   import org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory;
10  import org.glassfish.jersey.server.internal.inject.AbstractValueFactoryProvider;
11  import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
12  import org.glassfish.jersey.server.internal.inject.ParamInjectionResolver;
13  import org.glassfish.jersey.server.model.Parameter;
14  import org.glassfish.jersey.server.spi.internal.ValueFactoryProvider;
15  
16  import javax.inject.Inject;
17  import javax.inject.Singleton;
18  
19  import static com.atlassian.asap.core.server.filter.AbstractRequestAuthenticationFilter.AUTHENTIC_JWT_REQUEST_ATTRIBUTE;
20  
21  /**
22   * JwtParamBinder can be registered with Jersey to provide a JwtParam to Jwt token binding on resource methods.  Requires
23   * the {@link AuthorizationRequestFilter} to be installed.
24   */
25  public class JwtParamBinder extends AbstractBinder {
26  
27      @Override
28      protected void configure() {
29          bind(JwtParamInjectResolver.class)
30                  .to(new TypeLiteral<InjectionResolver<JwtParam>>() {
31                  })
32                  .in(Singleton.class);
33          bind(JwtValueProvider.class)
34                  .to(ValueFactoryProvider.class)
35                  .in(Singleton.class);
36      }
37  
38      private static class JwtParamInjectResolver extends ParamInjectionResolver<JwtParam> {
39          @SuppressWarnings("checkstyle:RedundantModifier")
40          public JwtParamInjectResolver() {
41              super(JwtValueProvider.class);
42          }
43      }
44  
45      private static class JwtValueFactory extends AbstractContainerRequestValueFactory<Jwt> {
46          @Override
47          public Jwt provide() {
48              Object obj = getContainerRequest().getProperty(AUTHENTIC_JWT_REQUEST_ATTRIBUTE);
49              return obj instanceof Jwt ? (Jwt) obj : null;
50          }
51  
52          @Override
53          public void dispose(Jwt instance) {
54          }
55      }
56  
57      private static class JwtValueProvider extends AbstractValueFactoryProvider {
58          @SuppressWarnings("checkstyle:RedundantModifier")
59          @Inject
60          public JwtValueProvider(MultivaluedParameterExtractorProvider extractorProvider, ServiceLocator locator) {
61              super(extractorProvider, locator, Parameter.Source.UNKNOWN);
62          }
63  
64          @Override
65          protected Factory<?> createValueFactory(Parameter parameter) {
66              if (!parameter.isAnnotationPresent(JwtParam.class) || !Jwt.class.equals(parameter.getRawType())) {
67                  return null;
68              }
69              return new JwtValueFactory();
70          }
71      }
72  }