Home | History | Annotate | Download | only in spi
      1 /*
      2  * Copyright (C) 2011 Google Inc.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
      5  * use this file except in compliance with the License. You may obtain a copy of
      6  * the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
     12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
     13  * License for the specific language governing permissions and limitations under
     14  * the License.
     15  */
     16 
     17 package com.google.inject.spi;
     18 
     19 import com.google.inject.Binder;
     20 import com.google.inject.Binding;
     21 import com.google.inject.Injector;
     22 import com.google.inject.internal.util.StackTraceElements;
     23 
     24 import java.lang.reflect.Member;
     25 
     26 /**
     27  * A combination of a {@link Dependency} and the {@link Binding#getSource()
     28  * source} where the dependency was bound.
     29  *
     30  * @author sameb (at) google.com (Sam Berlin)
     31  * @since 4.0
     32  */
     33 public final class DependencyAndSource {
     34   private final Dependency<?> dependency;
     35   private final Object source;
     36 
     37   public DependencyAndSource(Dependency<?> dependency, Object source) {
     38     this.dependency = dependency;
     39     this.source = source;
     40   }
     41 
     42   /**
     43    * Returns the Dependency, if one exists. For anything that can be referenced
     44    * by {@link Injector#getBinding}, a dependency exists. A dependency will not
     45    * exist (and this will return null) for types initialized with
     46    * {@link Binder#requestInjection} or {@link Injector#injectMembers(Object)},
     47    * nor will it exist for objects injected into Providers bound with
     48    * LinkedBindingBuilder#toProvider(Provider).
     49    */
     50   public Dependency<?> getDependency() {
     51     return dependency;
     52   }
     53 
     54   /**
     55    * Returns a string describing where this dependency was bound. If the binding
     56    * was just-in-time, there is no valid binding source, so this describes the
     57    * class in question.
     58    */
     59   public String getBindingSource() {
     60     if (source instanceof Class) {
     61       return StackTraceElements.forType((Class) source).toString();
     62     } else if (source instanceof Member) {
     63       return StackTraceElements.forMember((Member) source).toString();
     64     } else {
     65       return source.toString();
     66     }
     67   }
     68 
     69   @Override
     70   public String toString() {
     71     Dependency<?> dep = getDependency();
     72     Object source = getBindingSource();
     73     if (dep != null) {
     74       return "Dependency: " + dep + ", source: " + source;
     75     } else {
     76       return "Source: " + source;
     77     }
     78   }
     79 }