/**
 * 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.MembersInjectorLookup;
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.TypeListenerBinding;
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(TypeListenerBinding binding) {
    return false;
  }
}
