package io.airlift.jaxrs; import com.google.inject.Binder; import com.google.inject.Key; import com.google.inject.TypeLiteral; import com.google.inject.multibindings.Multibinder; import static com.google.inject.Scopes.SINGLETON; import static com.google.inject.multibindings.Multibinder.newSetBinder; import static java.util.Objects.requireNonNull; public class JaxrsBinder { private final Multibinder<Object> resourceBinder; private final Multibinder<JaxrsBinding> keyBinder; private final Binder binder; private JaxrsBinder(Binder binder) { this.binder = requireNonNull(binder, "binder is null").skipSources(getClass()); this.resourceBinder = newSetBinder(binder, Object.class, JaxrsResource.class).permitDuplicates(); this.keyBinder = newSetBinder(binder, JaxrsBinding.class, JaxrsResource.class).permitDuplicates(); } public static JaxrsBinder jaxrsBinder(Binder binder) { return new JaxrsBinder(binder); } public void bind(Class<?> implementation) { binder.bind(implementation).in(SINGLETON); resourceBinder.addBinding().to(implementation).in(SINGLETON); keyBinder.addBinding().toInstance(new JaxrsBinding(Key.get(implementation))); } public void bind(TypeLiteral<?> implementation) { binder.bind(implementation).in(SINGLETON); resourceBinder.addBinding().to(implementation).in(SINGLETON); registerJaxRsBinding(Key.get(implementation)); } public void bind(Key<?> targetKey) { binder.bind(targetKey).in(SINGLETON); resourceBinder.addBinding().to(targetKey).in(SINGLETON); registerJaxRsBinding(targetKey); } public void bindInstance(Object instance) { resourceBinder.addBinding().toInstance(instance); } public void registerJaxRsBinding(Key<?> key) { keyBinder.addBinding().toInstance(new JaxrsBinding(key)); } }