/**
 * Copyright (C) 2006 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;

import com.google.inject.BindCommandProcessor.CreationListener;

/**
 * Delegates to a custom factory which is also bound in the injector.
 */
class BoundProviderFactory<T>
    implements InternalFactory<T>, CreationListener {

  final Key<? extends Provider<? extends T>> providerKey;
  final Object source;
  private InternalFactory<? extends Provider<? extends T>> providerFactory;

  BoundProviderFactory(
      Key<? extends Provider<? extends T>> providerKey,
      Object source) {
    this.providerKey = providerKey;
    this.source = source;
  }

  BoundProviderFactory(
      Key<? extends Provider<? extends T>> providerKey,
      InternalFactory<? extends Provider<? extends T>> providerFactory,
      Object source) {
    this.providerKey = providerKey;
    this.providerFactory = providerFactory;
    this.source = source;
  }

  public void notify(final InjectorImpl injector) {
    injector.withDefaultSource(source, new Runnable() {
      public void run() {
        providerFactory = injector.getInternalFactory(providerKey);
      }
    });
  }

  public String toString() {
    return providerKey.toString();
  }

  public T get(InternalContext context, InjectionPoint<?> injectionPoint) {
    Provider<? extends T> provider = providerFactory.get(context, injectionPoint);
    try {
      return injectionPoint.checkForNull(provider.get(), source);
    } catch(ProvisionException e) {
      throw e;
    } catch(RuntimeException e) {
      throw new ProvisionException(e, ErrorMessages.ERROR_IN_PROVIDER);
    }
  }
}
