package org.limewire.inject; import java.lang.annotation.Annotation; import com.google.inject.Binding; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.Provider; import com.google.inject.Scope; import com.google.inject.Scopes; import com.google.inject.internal.LinkedBindingImpl; import com.google.inject.spi.BindingScopingVisitor; /** * Extensions to the default Guice Scoping. */ public class MoreScopes { /** * Returns the scope of the binding, or the scope of the linked binding if * it was linked. */ public static Scope getLinkedScope(Binding<?> binding) { BindingScopingVisitor<Scope> scoper = new BindingScopingVisitor<Scope>() { public Scope visitNoScoping() { return Scopes.NO_SCOPE; } public Scope visitScopeAnnotation(Class<? extends Annotation> scopeAnnotation) { throw new IllegalStateException("no annotations allowed here"); } public Scope visitScope(Scope scope) { return scope; } public Scope visitEagerSingleton() { return EAGER_SINGLETON; } }; do { Scope scope = binding.acceptScopingVisitor(scoper); if (scope != Scopes.NO_SCOPE) { return scope; } if (binding instanceof LinkedBindingImpl) { LinkedBindingImpl<?> linkedBinding = (LinkedBindingImpl) binding; Injector injector = linkedBinding.getInjector(); if (injector != null) { binding = injector.getBinding(linkedBinding.getLinkedKey()); continue; } } return Scopes.NO_SCOPE; } while (true); } /** * A singleton that will never be eager, in contrast to * {@link Scopes#SINGLETON}, which Guice eagerly creates sometimes. */ public static final Scope LAZY_SINGLETON = new Scope() { public <T> Provider<T> scope(Key<T> key, Provider<T> creator) { return Scopes.SINGLETON.scope(key, creator); } @Override public String toString() { return "MoreScopes.LAZY_SINGLETON"; } }; /** * A singleton that will be eagerly loaded. A class with * an EagerSingleton annotation will be created at startup. */ public static final Scope EAGER_SINGLETON = new Scope() { @Override public <T> Provider<T> scope(Key<T> key, Provider<T> unscoped) { return Scopes.SINGLETON.scope(key, unscoped); } @Override public String toString() { return "MoreScopes.EAGER_SINGLETON"; } }; }