/*
 * Copyright (C) 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.inject.internal;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Binding;
import com.google.inject.Key;
import com.google.inject.Scope;
import com.google.inject.TypeLiteral;
import com.google.inject.spi.InjectionRequest;
import com.google.inject.spi.MembersInjectorLookup;
import com.google.inject.spi.ModuleAnnotatedMethodScannerBinding;
import com.google.inject.spi.ProviderLookup;
import com.google.inject.spi.ProvisionListenerBinding;
import com.google.inject.spi.ScopeBinding;
import com.google.inject.spi.StaticInjectionRequest;
import com.google.inject.spi.TypeConverterBinding;
import com.google.inject.spi.TypeListenerBinding;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

The inheritable data within an injector. This class is intended to allow parent and local injector data to be accessed as a unit.
Author:jessewilson@google.com (Jesse Wilson)
/** * The inheritable data within an injector. This class is intended to allow parent and local * injector data to be accessed as a unit. * * @author jessewilson@google.com (Jesse Wilson) */
interface State { static final State NONE = new State() { @Override public State parent() { throw new UnsupportedOperationException(); } @Override public <T> BindingImpl<T> getExplicitBinding(Key<T> key) { return null; } @Override public Map<Key<?>, Binding<?>> getExplicitBindingsThisLevel() { throw new UnsupportedOperationException(); } @Override public void putBinding(Key<?> key, BindingImpl<?> binding) { throw new UnsupportedOperationException(); } @Override public void putProviderLookup(ProviderLookup<?> lookup) { throw new UnsupportedOperationException(); } @Override public Set<ProviderLookup<?>> getProviderLookupsThisLevel() { throw new UnsupportedOperationException(); } @Override public void putStaticInjectionRequest(StaticInjectionRequest staticInjectionRequest) { throw new UnsupportedOperationException(); } @Override public Set<StaticInjectionRequest> getStaticInjectionRequestsThisLevel() { throw new UnsupportedOperationException(); } @Override public Set<InjectionRequest<?>> getInjectionRequestsThisLevel() { throw new UnsupportedOperationException(); } @Override public Set<MembersInjectorLookup<?>> getMembersInjectorLookupsThisLevel() { throw new UnsupportedOperationException(); } @Override public void putInjectionRequest(InjectionRequest<?> injectionRequest) { throw new UnsupportedOperationException(); } @Override public void putMembersInjectorLookup(MembersInjectorLookup<?> membersInjectorLookup) { throw new UnsupportedOperationException(); } @Override public ScopeBinding getScopeBinding(Class<? extends Annotation> scopingAnnotation) { return null; } @Override public void putScopeBinding( Class<? extends Annotation> annotationType, ScopeBinding scope) { throw new UnsupportedOperationException(); } @Override public void addConverter(TypeConverterBinding typeConverterBinding) { throw new UnsupportedOperationException(); } @Override public TypeConverterBinding getConverter( String stringValue, TypeLiteral<?> type, Errors errors, Object source) { throw new UnsupportedOperationException(); } @Override public Iterable<TypeConverterBinding> getConvertersThisLevel() { return ImmutableSet.of(); } /*if[AOP]*/ @Override public void addMethodAspect(MethodAspect methodAspect) { throw new UnsupportedOperationException(); } @Override public ImmutableList<MethodAspect> getMethodAspects() { return ImmutableList.of(); } /*end[AOP]*/ @Override public void addTypeListener(TypeListenerBinding typeListenerBinding) { throw new UnsupportedOperationException(); } @Override public List<TypeListenerBinding> getTypeListenerBindings() { return ImmutableList.of(); } @Override public void addProvisionListener(ProvisionListenerBinding provisionListenerBinding) { throw new UnsupportedOperationException(); } @Override public List<ProvisionListenerBinding> getProvisionListenerBindings() { return ImmutableList.of(); } @Override public void addScanner(ModuleAnnotatedMethodScannerBinding scanner) { throw new UnsupportedOperationException(); } @Override public List<ModuleAnnotatedMethodScannerBinding> getScannerBindings() { return ImmutableList.of(); } @Override public void blacklist(Key<?> key, State state, Object source) {} @Override public boolean isBlacklisted(Key<?> key) { return true; } @Override public Set<Object> getSourcesForBlacklistedKey(Key<?> key) { throw new UnsupportedOperationException(); } @Override public Object lock() { throw new UnsupportedOperationException(); } @Override public Map<Class<? extends Annotation>, Scope> getScopes() { return ImmutableMap.of(); } @Override public List<ScopeBinding> getScopeBindingsThisLevel() { throw new UnsupportedOperationException(); } @Override public List<TypeListenerBinding> getTypeListenerBindingsThisLevel() { throw new UnsupportedOperationException(); } @Override public List<ProvisionListenerBinding> getProvisionListenerBindingsThisLevel() { throw new UnsupportedOperationException(); } @Override public List<ModuleAnnotatedMethodScannerBinding> getScannerBindingsThisLevel() { throw new UnsupportedOperationException(); } }; State parent();
Gets a binding which was specified explicitly in a module, or null.
/** Gets a binding which was specified explicitly in a module, or null. */
<T> BindingImpl<T> getExplicitBinding(Key<T> key);
Returns the explicit bindings at this level only.
/** Returns the explicit bindings at this level only. */
Map<Key<?>, Binding<?>> getExplicitBindingsThisLevel(); void putBinding(Key<?> key, BindingImpl<?> binding); void putProviderLookup(ProviderLookup<?> lookup); Set<ProviderLookup<?>> getProviderLookupsThisLevel(); void putStaticInjectionRequest(StaticInjectionRequest staticInjectionRequest); Set<StaticInjectionRequest> getStaticInjectionRequestsThisLevel(); ScopeBinding getScopeBinding(Class<? extends Annotation> scopingAnnotation); void putInjectionRequest(InjectionRequest<?> injectionRequest); Set<InjectionRequest<?>> getInjectionRequestsThisLevel(); void putMembersInjectorLookup(MembersInjectorLookup<?> membersInjectorLookup); Set<MembersInjectorLookup<?>> getMembersInjectorLookupsThisLevel(); void putScopeBinding(Class<? extends Annotation> annotationType, ScopeBinding scope); Collection<ScopeBinding> getScopeBindingsThisLevel(); void addConverter(TypeConverterBinding typeConverterBinding);
Returns the matching converter for type, or null if none match.
/** Returns the matching converter for {@code type}, or null if none match. */
TypeConverterBinding getConverter( String stringValue, TypeLiteral<?> type, Errors errors, Object source);
Returns all converters at this level only.
/** Returns all converters at this level only. */
Iterable<TypeConverterBinding> getConvertersThisLevel(); /*if[AOP]*/ void addMethodAspect(MethodAspect methodAspect); ImmutableList<MethodAspect> getMethodAspects(); /*end[AOP]*/ void addTypeListener(TypeListenerBinding typeListenerBinding); List<TypeListenerBinding> getTypeListenerBindings(); List<TypeListenerBinding> getTypeListenerBindingsThisLevel(); void addProvisionListener(ProvisionListenerBinding provisionListenerBinding); List<ProvisionListenerBinding> getProvisionListenerBindings(); List<ProvisionListenerBinding> getProvisionListenerBindingsThisLevel(); void addScanner(ModuleAnnotatedMethodScannerBinding scanner); List<ModuleAnnotatedMethodScannerBinding> getScannerBindings(); List<ModuleAnnotatedMethodScannerBinding> getScannerBindingsThisLevel();
Forbids the corresponding injector from creating a binding to key. Child injectors blacklist their bound keys on their parent injectors to prevent just-in-time bindings on the parent injector that would conflict and pass along their state to control the lifetimes.
/** * Forbids the corresponding injector from creating a binding to {@code key}. Child injectors * blacklist their bound keys on their parent injectors to prevent just-in-time bindings on the * parent injector that would conflict and pass along their state to control the lifetimes. */
void blacklist(Key<?> key, State state, Object source);
Returns true if key is forbidden from being bound in this injector. This indicates that one of this injector's descendent's has bound the key.
/** * Returns true if {@code key} is forbidden from being bound in this injector. This indicates that * one of this injector's descendent's has bound the key. */
boolean isBlacklisted(Key<?> key);
Returns the source of a blacklisted key.
/** Returns the source of a blacklisted key. */
Set<Object> getSourcesForBlacklistedKey(Key<?> key);
Returns the shared lock for all injector data. This is a low-granularity, high-contention lock to be used when reading mutable data (ie. just-in-time bindings, and binding blacklists).
/** * Returns the shared lock for all injector data. This is a low-granularity, high-contention lock * to be used when reading mutable data (ie. just-in-time bindings, and binding blacklists). */
Object lock();
Returns all the scope bindings at this level and parent levels.
/** Returns all the scope bindings at this level and parent levels. */
Map<Class<? extends Annotation>, Scope> getScopes(); }