package support.security.auth;
import java.security.Principal;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.glassfish.hk2.api.Factory;
import org.glassfish.hk2.api.InjectionResolver;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.api.TypeLiteral;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.internal.inject.AbstractValueFactoryProvider;
import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
import org.glassfish.jersey.server.internal.inject.ParamInjectionResolver;
import org.glassfish.jersey.server.model.Parameter;
import org.glassfish.jersey.server.spi.internal.ValueFactoryProvider;
import support.security.annotation.Auth;
/**
*
* @author nikku
*/
@Singleton
class AuthFactoryProvider<P extends Principal> extends AbstractValueFactoryProvider {
private final AuthFactory<P> factory;
@Inject
public AuthFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider,
final AuthFactory<P> factory,
final ServiceLocator injector) {
super(extractorProvider, injector, Parameter.Source.UNKNOWN);
this.factory = factory;
}
@Override
protected Factory<?> createValueFactory(final Parameter parameter) {
final Class<?> classType = parameter.getRawType();
final Auth auth = parameter.getAnnotation(Auth.class);
if (auth != null && classType.isAssignableFrom(factory.getPrincipalClass())) {
return factory;
} else {
return null;
}
}
public static class AuthInjectionResolver extends ParamInjectionResolver<Auth> {
public AuthInjectionResolver() {
super(AuthFactoryProvider.class);
}
}
public static class Binder<P extends Principal> extends AbstractBinder {
private final AuthFactory<P> factory;
public Binder(AuthFactory<P> factory) {
this.factory = factory;
}
@Override
protected void configure() {
bind(this.factory).to(AuthFactory.class);
bind(AuthFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
bind(AuthInjectionResolver.class).to(
new TypeLiteral<InjectionResolver<Auth>>() { }
).in(Singleton.class);
}
}
}