14e11457f34addf5d10fe0c31cefd54c75c37b540sberlin/** 24e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * Copyright (C) 2011 Google Inc. 34e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * 44e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * Licensed under the Apache License, Version 2.0 (the "License"); 54e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * you may not use this file except in compliance with the License. 64e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * You may obtain a copy of the License at 74e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * 84e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * http://www.apache.org/licenses/LICENSE-2.0 94e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * 104e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * Unless required by applicable law or agreed to in writing, software 114e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * distributed under the License is distributed on an "AS IS" BASIS, 124e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * See the License for the specific language governing permissions and 144e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * limitations under the License. 154e11457f34addf5d10fe0c31cefd54c75c37b540sberlin */ 164e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 174e11457f34addf5d10fe0c31cefd54c75c37b540sberlinpackage com.google.inject.internal; 184e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 194e11457f34addf5d10fe0c31cefd54c75c37b540sberlinimport com.google.inject.Binding; 204e11457f34addf5d10fe0c31cefd54c75c37b540sberlinimport com.google.inject.spi.UntargettedBinding; 214e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 224e11457f34addf5d10fe0c31cefd54c75c37b540sberlin/** 234e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * Processes just UntargettedBindings. 244e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * 254e11457f34addf5d10fe0c31cefd54c75c37b540sberlin * @author sameb@google.com (Sam Berlin) 264e11457f34addf5d10fe0c31cefd54c75c37b540sberlin */ 274e11457f34addf5d10fe0c31cefd54c75c37b540sberlinclass UntargettedBindingProcessor extends AbstractBindingProcessor { 284e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 294e11457f34addf5d10fe0c31cefd54c75c37b540sberlin UntargettedBindingProcessor(Errors errors, ProcessedBindingData bindingData) { 304e11457f34addf5d10fe0c31cefd54c75c37b540sberlin super(errors, bindingData); 314e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } 324e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 334e11457f34addf5d10fe0c31cefd54c75c37b540sberlin @Override 344e11457f34addf5d10fe0c31cefd54c75c37b540sberlin public <T> Boolean visit(Binding<T> binding) { 354e11457f34addf5d10fe0c31cefd54c75c37b540sberlin return binding.acceptTargetVisitor(new Processor<T, Boolean>((BindingImpl<T>)binding) { 364e11457f34addf5d10fe0c31cefd54c75c37b540sberlin public Boolean visit(UntargettedBinding<? extends T> untargetted) { 374e11457f34addf5d10fe0c31cefd54c75c37b540sberlin prepareBinding(); 384e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 394e11457f34addf5d10fe0c31cefd54c75c37b540sberlin // Error: Missing implementation. 404e11457f34addf5d10fe0c31cefd54c75c37b540sberlin // Example: bind(Date.class).annotatedWith(Red.class); 414e11457f34addf5d10fe0c31cefd54c75c37b540sberlin // We can't assume abstract types aren't injectable. They may have an 424e11457f34addf5d10fe0c31cefd54c75c37b540sberlin // @ImplementedBy annotation or something. 434e11457f34addf5d10fe0c31cefd54c75c37b540sberlin if (key.getAnnotationType() != null) { 444e11457f34addf5d10fe0c31cefd54c75c37b540sberlin errors.missingImplementation(key); 454e11457f34addf5d10fe0c31cefd54c75c37b540sberlin putBinding(invalidBinding(injector, key, source)); 464e11457f34addf5d10fe0c31cefd54c75c37b540sberlin return true; 474e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } 484e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 494e11457f34addf5d10fe0c31cefd54c75c37b540sberlin // This cast is safe after the preceeding check. 504e11457f34addf5d10fe0c31cefd54c75c37b540sberlin try { 514e11457f34addf5d10fe0c31cefd54c75c37b540sberlin BindingImpl<T> binding = injector.createUninitializedBinding( 524e11457f34addf5d10fe0c31cefd54c75c37b540sberlin key, scoping, source, errors, false); 534e11457f34addf5d10fe0c31cefd54c75c37b540sberlin scheduleInitialization(binding); 544e11457f34addf5d10fe0c31cefd54c75c37b540sberlin putBinding(binding); 554e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } catch (ErrorsException e) { 564e11457f34addf5d10fe0c31cefd54c75c37b540sberlin errors.merge(e.getErrors()); 574e11457f34addf5d10fe0c31cefd54c75c37b540sberlin putBinding(invalidBinding(injector, key, source)); 584e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } 594e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 604e11457f34addf5d10fe0c31cefd54c75c37b540sberlin return true; 614e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } 624e11457f34addf5d10fe0c31cefd54c75c37b540sberlin 634e11457f34addf5d10fe0c31cefd54c75c37b540sberlin @Override 644e11457f34addf5d10fe0c31cefd54c75c37b540sberlin protected Boolean visitOther(Binding<? extends T> binding) { 654e11457f34addf5d10fe0c31cefd54c75c37b540sberlin return false; 664e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } 674e11457f34addf5d10fe0c31cefd54c75c37b540sberlin }); 684e11457f34addf5d10fe0c31cefd54c75c37b540sberlin } 694e11457f34addf5d10fe0c31cefd54c75c37b540sberlin} 70