1e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin/**
2e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * Copyright (C) 2011 Google Inc.
3e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin *
4e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * Licensed under the Apache License, Version 2.0 (the "License");
5e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * you may not use this file except in compliance with the License.
6e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * You may obtain a copy of the License at
7e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin *
8e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * http://www.apache.org/licenses/LICENSE-2.0
9e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin *
10e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * Unless required by applicable law or agreed to in writing, software
11e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * distributed under the License is distributed on an "AS IS" BASIS,
12e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * See the License for the specific language governing permissions and
14e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * limitations under the License.
15e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin */
16e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
17e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlinpackage com.google.inject.internal;
18e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
19d9c913acca55023ef5d76a32c3d4a51ee6b420cbsberlinimport static com.google.common.base.Preconditions.checkNotNull;
20b7a02b02d81c830d148355c90bc309bcd66fb592sberlin
21e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlinimport com.google.inject.spi.Dependency;
22e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlinimport com.google.inject.spi.ProviderInstanceBinding;
23e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
24e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin/**
25e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * Adapts {@link ProviderInstanceBinding} providers, ensuring circular proxies
26e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * fail (or proxy) properly.
27e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin *
28e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin * @author sameb@google.com (Sam Berlin)
29e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin*/
30e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlinfinal class InternalFactoryToInitializableAdapter<T> extends ProviderInternalFactory<T> {
31e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
32d51292d5a4a788b1275eb9ad55cf612e68640bbfSam Berlin  private final ProvisionListenerStackCallback<T> provisionCallback;
338ad60eb50961e000c89099bb767489cf551d995bSam Berlin  private final Initializable<? extends javax.inject.Provider<? extends T>> initializable;
34e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
35e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin  public InternalFactoryToInitializableAdapter(
368ad60eb50961e000c89099bb767489cf551d995bSam Berlin      Initializable<? extends javax.inject.Provider<? extends T>> initializable,
375e6c93348c4250012801b6e41753789d760f06e4timofeyb      Object source, ProvisionListenerStackCallback<T> provisionCallback) {
385e6c93348c4250012801b6e41753789d760f06e4timofeyb    super(source);
39d51292d5a4a788b1275eb9ad55cf612e68640bbfSam Berlin    this.provisionCallback = checkNotNull(provisionCallback, "provisionCallback");
40e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin    this.initializable = checkNotNull(initializable, "provider");
41e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin  }
42e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
43e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin  public T get(Errors errors, InternalContext context, Dependency<?> dependency, boolean linked)
44e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin      throws ErrorsException {
455e6c93348c4250012801b6e41753789d760f06e4timofeyb    return circularGet(initializable.get(errors), errors, context, dependency,
46d51292d5a4a788b1275eb9ad55cf612e68640bbfSam Berlin        provisionCallback);
47132a5db7c643b8f367eb5f09024cf13ea37c9831sberlin  }
48132a5db7c643b8f367eb5f09024cf13ea37c9831sberlin
49132a5db7c643b8f367eb5f09024cf13ea37c9831sberlin  @Override
50132a5db7c643b8f367eb5f09024cf13ea37c9831sberlin  protected T provision(javax.inject.Provider<? extends T> provider, Errors errors,
51132a5db7c643b8f367eb5f09024cf13ea37c9831sberlin      Dependency<?> dependency, ConstructionContext<T> constructionContext) throws ErrorsException {
52e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin    try {
53132a5db7c643b8f367eb5f09024cf13ea37c9831sberlin      return super.provision(provider, errors, dependency, constructionContext);
54e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin    } catch(RuntimeException userException) {
55e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin      throw errors.withSource(source).errorInProvider(userException).toException();
56e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin    }
57e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin  }
58e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin
59e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin  @Override public String toString() {
60e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin    return initializable.toString();
61e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin  }
62e6ce1886f5f8f700cea00bafefd093ccbbe8addfsberlin}
63