18d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit/**
28d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * Copyright (C) 2009 Google Inc.
38d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit *
48d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * Licensed under the Apache License, Version 2.0 (the "License");
58d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * you may not use this file except in compliance with the License.
68d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * You may obtain a copy of the License at
78d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit *
88d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * http://www.apache.org/licenses/LICENSE-2.0
98d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit *
108d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * Unless required by applicable law or agreed to in writing, software
118d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * distributed under the License is distributed on an "AS IS" BASIS,
128d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * See the License for the specific language governing permissions and
148d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * limitations under the License.
158d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit */
168d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
175ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitpackage com.google.inject.internal;
188d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
19b7a02b02d81c830d148355c90bc309bcd66fb592sberlinimport com.google.common.collect.Lists;
205ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitimport com.google.inject.Key;
215ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitimport com.google.inject.MembersInjector;
225ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitimport com.google.inject.Provider;
235ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitimport com.google.inject.TypeLiteral;
248d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkitimport com.google.inject.spi.Element;
258d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkitimport com.google.inject.spi.MembersInjectorLookup;
268d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkitimport com.google.inject.spi.ProviderLookup;
27b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
288d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkitimport java.util.List;
298d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
308d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit/**
318d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * Returns providers and members injectors that haven't yet been initialized. As a part of injector
328d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * creation it's necessary to {@link #initialize initialize} these lookups.
338d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit *
348d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit * @author jessewilson@google.com (Jesse Wilson)
358d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit */
365ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitfinal class DeferredLookups implements Lookups {
378d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  private final InjectorImpl injector;
388d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  private final List<Element> lookups = Lists.newArrayList();
398d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
405ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkit  DeferredLookups(InjectorImpl injector) {
418d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    this.injector = injector;
428d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  }
438d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
448d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  /**
458d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit   * Initialize the specified lookups, either immediately or when the injector is created.
468d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit   */
475ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkit  void initialize(Errors errors) {
488d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    injector.lookups = injector;
498d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    new LookupProcessor(errors).process(injector, lookups);
508d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  }
518d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
528d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  public <T> Provider<T> getProvider(Key<T> key) {
538d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    ProviderLookup<T> lookup = new ProviderLookup<T>(key, key);
548d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    lookups.add(lookup);
558d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    return lookup.getProvider();
568d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  }
578d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit
588d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  public <T> MembersInjector<T> getMembersInjector(TypeLiteral<T> type) {
598d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    MembersInjectorLookup<T> lookup = new MembersInjectorLookup<T>(type, type);
608d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    lookups.add(lookup);
618d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit    return lookup.getMembersInjector();
628d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit  }
638d62075e136d207b8fb8ea98d3fd7ec051bdee3climpbizkit}
64