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
23
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 }