AbstractProcessor.java revision 5ae41eb77073b47e75c2dcf3766137f2352fbaf9
100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit/**
200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Copyright (C) 2008 Google Inc.
300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit *
400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Licensed under the Apache License, Version 2.0 (the "License");
500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * you may not use this file except in compliance with the License.
600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * You may obtain a copy of the License at
700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit *
800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * http://www.apache.org/licenses/LICENSE-2.0
900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit *
1000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Unless required by applicable law or agreed to in writing, software
1100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * distributed under the License is distributed on an "AS IS" BASIS,
1200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * See the License for the specific language governing permissions and
1400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * limitations under the License.
1500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit */
1600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
175ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitpackage com.google.inject.internal;
1800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
195ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkitimport com.google.inject.Binding;
2000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.Element;
21afa4b5dd2056a8427657186d1804313c3f34fbfelimpbizkitimport com.google.inject.spi.ElementVisitor;
2200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.InjectionRequest;
23ee79246d47f0e4a0a4f86543809135620487332dlimpbizkitimport com.google.inject.spi.MembersInjectorLookup;
2400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.Message;
25c3f928404a91cf837d809dcc465ba43442bc1198limpbizkitimport com.google.inject.spi.PrivateElements;
2600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.ProviderLookup;
2700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.ScopeBinding;
2800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.StaticInjectionRequest;
2900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport com.google.inject.spi.TypeConverterBinding;
30ee79246d47f0e4a0a4f86543809135620487332dlimpbizkitimport com.google.inject.spi.TypeListenerBinding;
3100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport java.util.Iterator;
3200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkitimport java.util.List;
3300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
3400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit/**
3500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * Abstract base class for creating an injector from module elements.
3600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit *
3700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * <p>Extending classes must return {@code true} from any overridden
3800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * {@code visit*()} methods, in order for the element processor to remove the
3900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * handled element.
4000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit *
4100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit * @author jessewilson@google.com (Jesse Wilson)
4200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit */
43afa4b5dd2056a8427657186d1804313c3f34fbfelimpbizkitabstract class AbstractProcessor implements ElementVisitor<Boolean> {
4400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
4500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  protected Errors errors;
46fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit  protected InjectorImpl injector;
4700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
4800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  protected AbstractProcessor(Errors errors) {
4900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    this.errors = errors;
5000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
5100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
52fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit  public void process(Iterable<InjectorShell> isolatedInjectorBuilders) {
53fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit    for (InjectorShell injectorShell : isolatedInjectorBuilders) {
54fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit      process(injectorShell.getInjector(), injectorShell.getElements());
55fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit    }
56fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit  }
57fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit
58fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit  public void process(InjectorImpl injector, List<Element> elements) {
5900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    Errors errorsAnyElement = this.errors;
60fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit    this.injector = injector;
6100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    try {
6200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit      for (Iterator<Element> i = elements.iterator(); i.hasNext(); ) {
6300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit        Element element = i.next();
6400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit        this.errors = errorsAnyElement.withSource(element.getSource());
6500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit        Boolean allDone = element.acceptVisitor(this);
6600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit        if (allDone) {
6700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit          i.remove();
6800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit        }
6900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit      }
7000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    } finally {
7100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit      this.errors = errorsAnyElement;
72fcbdf999a15039ecad6157c1bf44a835df826a27limpbizkit      this.injector = null;
7300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    }
7400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
7500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
7603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Boolean visit(Message message) {
7700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
7800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
7900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
80bf0d876bb767f45c5cfbed3929e2cf6acd7d061alimpbizkit  /*if[AOP]*/
8103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Boolean visit(
824f6274aa4a306efa727f9b37ad16ea3d331d22f0limpbizkit      com.google.inject.spi.InterceptorBinding interceptorBinding) {
8300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
8400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
85bf0d876bb767f45c5cfbed3929e2cf6acd7d061alimpbizkit  /*end[AOP]*/
8600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
8703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Boolean visit(ScopeBinding scopeBinding) {
8800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
8900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
9000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
915ae41eb77073b47e75c2dcf3766137f2352fbaf9limpbizkit  public Boolean visit(InjectionRequest<?> injectionRequest) {
9200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
9300ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
9400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
9503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Boolean visit(StaticInjectionRequest staticInjectionRequest) {
9600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
9700ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
9800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
9903b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Boolean visit(TypeConverterBinding typeConverterBinding) {
10000ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
10100ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
10200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
10303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public <T> Boolean visit(Binding<T> binding) {
10400ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
10500ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
10600ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit
10703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public <T> Boolean visit(ProviderLookup<T> providerLookup) {
10800ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit    return false;
10900ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit  }
1105ea4ab2bca518a3ac24dc5c0713326e8699d3fadlimpbizkit
11103b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public Boolean visit(PrivateElements privateElements) {
11203b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return false;
11303b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
11403b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
11503b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  public <T> Boolean visit(MembersInjectorLookup<T> lookup) {
11603b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit    return false;
11703b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit  }
11803b81a6b931a06c7697e422b218e3734a7f262cclimpbizkit
119ee79246d47f0e4a0a4f86543809135620487332dlimpbizkit  public Boolean visit(TypeListenerBinding binding) {
1205ea4ab2bca518a3ac24dc5c0713326e8699d3fadlimpbizkit    return false;
1215ea4ab2bca518a3ac24dc5c0713326e8699d3fadlimpbizkit  }
12200ca9f749aa80383ee7d85ad25e1535a79fe5718limpbizkit}
123