/**
 * 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;

import com.google.inject.internal.Errors;
import com.google.inject.spi.Element;
import com.google.inject.spi.ElementVisitor;
import com.google.inject.spi.InjectionRequest;
import com.google.inject.spi.Message;
import com.google.inject.spi.PrivateElements;
import com.google.inject.spi.ProviderLookup;
import com.google.inject.spi.ScopeBinding;
import com.google.inject.spi.StaticInjectionRequest;
import com.google.inject.spi.TypeConverterBinding;
import com.google.inject.spi.MembersInjectorLookup;
import com.google.inject.spi.InjectableTypeListenerBinding;
import java.util.Iterator;
import java.util.List;

/**
 * Abstract base class for creating an injector from module elements.
 *
 * <p>Extending classes must return {@code true} from any overridden
 * {@code visit*()} methods, in order for the element processor to remove the
 * handled element.
 *
 * @author jessewilson@google.com (Jesse Wilson)
 */
abstract class AbstractProcessor implements ElementVisitor<Boolean> {

  protected Errors errors;
  protected InjectorImpl injector;

  protected AbstractProcessor(Errors errors) {
    this.errors = errors;
  }

  public void process(Iterable<InjectorShell> isolatedInjectorBuilders) {
    for (InjectorShell injectorShell : isolatedInjectorBuilders) {
      process(injectorShell.getInjector(), injectorShell.getElements());
    }
  }

  public void process(InjectorImpl injector, List<Element> elements) {
    Errors errorsAnyElement = this.errors;
    this.injector = injector;
    try {
      for (Iterator<Element> i = elements.iterator(); i.hasNext(); ) {
        Element element = i.next();
        this.errors = errorsAnyElement.withSource(element.getSource());
        Boolean allDone = element.acceptVisitor(this);
        if (allDone) {
          i.remove();
        }
      }
    } finally {
      this.errors = errorsAnyElement;
      this.injector = null;
    }
  }

  public Boolean visit(Message message) {
    return false;
  }

  /*if[AOP]*/
  public Boolean visit(
      com.google.inject.spi.InterceptorBinding interceptorBinding) {
    return false;
  }
  /*end[AOP]*/

  public Boolean visit(ScopeBinding scopeBinding) {
    return false;
  }

  public Boolean visit(InjectionRequest injectionRequest) {
    return false;
  }

  public Boolean visit(StaticInjectionRequest staticInjectionRequest) {
    return false;
  }

  public Boolean visit(TypeConverterBinding typeConverterBinding) {
    return false;
  }

  public <T> Boolean visit(Binding<T> binding) {
    return false;
  }

  public <T> Boolean visit(ProviderLookup<T> providerLookup) {
    return false;
  }

  public Boolean visit(PrivateElements privateElements) {
    return false;
  }

  public <T> Boolean visit(MembersInjectorLookup<T> lookup) {
    return false;
  }

  public Boolean visit(InjectableTypeListenerBinding binding) {
    return false;
  }
}
