Coverage Report - org.apache.commons.inject.impl.DefaultInjectorBuilder
 
Classes in this File Line Coverage Branch Coverage Complexity
DefaultInjectorBuilder
74%
35/47
64%
9/14
1,889
DefaultInjectorBuilder$1
50%
2/4
N/A
1,889
DefaultInjectorBuilder$2
50%
1/2
N/A
1,889
DefaultInjectorBuilder$3
68%
13/19
50%
3/6
1,889
 
 1  
 /**
 2  
  Licensed to the Apache Software Foundation (ASF) under one or more
 3  
  contributor license agreements.  See the NOTICE file distributed with
 4  
  this work for additional information regarding copyright ownership.
 5  
  The ASF licenses this file to You under the Apache License, Version 2.0
 6  
  (the "License"); you may not use this file except in compliance with
 7  
  the License.  You may obtain a copy of the License at
 8  
 
 9  
       http://www.apache.org/licenses/LICENSE-2.0
 10  
 
 11  
  Unless required by applicable law or agreed to in writing, software
 12  
  distributed under the License is distributed on an "AS IS" BASIS,
 13  
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 14  
  See the License for the specific language governing permissions and
 15  
  limitations under the License.
 16  
 */
 17  
 package org.apache.commons.inject.impl;
 18  
 
 19  
 import java.util.ArrayList;
 20  
 import java.util.Arrays;
 21  
 import java.util.Collection;
 22  
 import java.util.List;
 23  
 
 24  
 import org.apache.commons.inject.api.IBinding;
 25  
 import org.apache.commons.inject.api.IInjector;
 26  
 import org.apache.commons.inject.api.IInjectorBuilder;
 27  
 import org.apache.commons.inject.api.IKey;
 28  
 import org.apache.commons.inject.api.IPoint;
 29  
 import org.apache.commons.inject.api.IProvider;
 30  
 import org.apache.commons.inject.api.Key;
 31  
 import org.apache.commons.inject.api.bind.IAnnotatedBindingBuilder;
 32  
 import org.apache.commons.inject.api.bind.IBinder;
 33  
 import org.apache.commons.inject.api.bind.ILinkedBindingBuilder;
 34  
 import org.apache.commons.inject.api.bind.IModule;
 35  
 import org.apache.commons.inject.api.bind.IBinder.IInjectionListener;
 36  
 import org.apache.commons.inject.api.bind.IBinder.IInjectionParticipator;
 37  
 import org.apache.commons.inject.api.bind.IBinder.IInjectorBuildListener;
 38  
 import org.apache.commons.inject.impl.bind.DefaultBinding;
 39  
 import org.apache.commons.inject.impl.bind.DefaultBindingBuilder;
 40  
 
 41  5
 public class DefaultInjectorBuilder implements IInjectorBuilder {
 42  
         private final Collection<IModule> modules;
 43  9
         private final List<IInjectionListener> injectionListeners = new ArrayList<IInjectionListener>();
 44  9
         private final List<IInjectionParticipator> injectionParticipators = new ArrayList<IInjectionParticipator>();
 45  9
         private final List<IInjectorBuildListener> injectorBuildListeners = new ArrayList<IInjectorBuildListener>();
 46  
 
 47  9
         public DefaultInjectorBuilder(Collection<IModule> pModules) {
 48  9
                 modules = pModules;
 49  9
         }
 50  
 
 51  0
         public DefaultInjectorBuilder() {
 52  0
                 modules = new ArrayList<IModule>();
 53  0
         }
 54  
 
 55  
         public IInjector build() {
 56  9
                 final MutableBindingSet mutableBindings = new MutableBindingSet();
 57  9
                 configure(mutableBindings);
 58  9
                 final IKey<IInjector> key = new Key<IInjector>(IInjector.class);
 59  9
                 final BindingProxy<IInjector> bindingProxy = (BindingProxy<IInjector>) mutableBindings.requireBinding(key, "to create an automatic binding for an injector.");
 60  9
                 bindingProxy.setResolvedLater(true);
 61  9
                 final ResolvableBindingSet resolvableBindings = new ResolvableBindingSet(mutableBindings);
 62  9
                 resolve(resolvableBindings);
 63  9
                 final ImmutableBindingSet immutableBindings = new ImmutableBindingSet(resolvableBindings);
 64  9
                 final DefaultInjector injector = new DefaultInjector(immutableBindings);
 65  9
                 final IProvider<IInjector> provider = new IProvider<IInjector>(){
 66  
                         @Override
 67  
                         public IInjector get() {
 68  1
                                 return injector;
 69  
                         }
 70  
 
 71  
                         @Override
 72  
                         public Class<? extends IInjector> getType() {
 73  0
                                 return injector.getClass();
 74  
                         }
 75  
 
 76  
                         @Override
 77  
                         public IInjector get(IInjector pInjector) {
 78  0
                                 return get();
 79  
                         }
 80  
                 };
 81  9
                 final IPoint<IInjector> point = new IPoint<IInjector>(){
 82  
                         @Override
 83  
                         public void injectTo(IInjector pInstance, IInjector pInjector) {
 84  
                                 // Does nothing.
 85  0
                         }
 86  
                 };
 87  9
                 bindingProxy.setBinding(new DefaultBinding<IInjector>(provider, point));
 88  9
                 for (IBinding<?> binding : immutableBindings.getAllBindings()) {
 89  59
                         if (binding instanceof IInjectorAware) {
 90  59
                                 ((IInjectorAware) binding).init(injector);
 91  
                         } else {
 92  0
                                 throw new IllegalStateException("No InjectorAware: " + binding);
 93  
                         }
 94  
                 }
 95  9
                 for (IInjectorBuildListener listener : injectorBuildListeners) {
 96  1
                         listener.created(injector);
 97  
                 }
 98  9
                 return injector;
 99  
         }
 100  
 
 101  
         protected void resolve(ResolvableBindingSet pBindings) {
 102  9
                 pBindings.resolve();
 103  9
         }
 104  
         
 105  
         protected void configure(final MutableBindingSet mutableBindings) {
 106  9
                 final List<DefaultBindingBuilder<?>> builders = new ArrayList<DefaultBindingBuilder<?>>();
 107  9
                 final IBinder binder = newBinder(builders);
 108  9
                 for (IModule module : modules) {
 109  12
                         module.configure(binder);
 110  
                 }
 111  9
                 for (DefaultBindingBuilder<?> builder : builders) {
 112  36
                         builder.build(mutableBindings, injectionListeners, injectionParticipators);
 113  
                 }
 114  9
         }
 115  
 
 116  
         private IBinder newBinder(final List<DefaultBindingBuilder<?>> builders) {
 117  9
                 return new IBinder(){
 118  
                         @Override
 119  
                         public <T> IAnnotatedBindingBuilder<T> bind(Class<T> pType) {
 120  20
                                 final DefaultBindingBuilder<T> builder = new DefaultBindingBuilder<T>(pType);
 121  20
                                 builders.add(builder);
 122  20
                                 return builder;
 123  
                         }
 124  
 
 125  
                         @Override
 126  
                         public <T> IAnnotatedBindingBuilder<T> bind(Class<T> pType,
 127  
                                         String pName) {
 128  16
                                 final DefaultBindingBuilder<T> builder = new DefaultBindingBuilder<T>(pType, pName);
 129  16
                                 builders.add(builder);
 130  16
                                 return builder;
 131  
                         }
 132  
 
 133  
                         @Override
 134  
                         public <T> ILinkedBindingBuilder<T> bind(IKey<T> pKey) {
 135  0
                                 final DefaultBindingBuilder<T> builder = new DefaultBindingBuilder<T>(pKey);
 136  0
                                 builders.add(builder);
 137  0
                                 return builder;
 138  
                         }
 139  
 
 140  
                         @Override
 141  
                         public boolean add(IInjectionParticipator pParticipator) {
 142  1
                                 if (pParticipator == null) {
 143  0
                                         throw new NullPointerException("The participator must not be null.");
 144  
                                 }
 145  1
                                 return injectionParticipators.add(pParticipator);
 146  
                         }
 147  
 
 148  
                         @Override
 149  
                         public boolean add(IInjectionListener pListener) {
 150  3
                                 if (pListener == null) {
 151  0
                                         throw new NullPointerException("The listener must not be null.");
 152  
                                 }
 153  3
                                 return injectionListeners.add(pListener);
 154  
                         }
 155  
 
 156  
                         @Override
 157  
                         public boolean add(IInjectorBuildListener pListener) {
 158  1
                                 if (pListener == null) {
 159  0
                                         throw new NullPointerException("The listener must not be null.");
 160  
                                 }
 161  1
                                 return injectorBuildListeners.add(pListener);
 162  
                         }
 163  
                 };
 164  
         }
 165  
 
 166  
         @Override
 167  
         public IInjectorBuilder modules(IModule... pModules) {
 168  0
                 if (pModules == null) {
 169  0
                         throw new NullPointerException("The module list must not be null.");
 170  
                 }
 171  0
                 modules.addAll(Arrays.asList(pModules));
 172  0
                 return this;
 173  
         }
 174  
 
 175  
         @Override
 176  
         public IInjectorBuilder modules(Collection<IModule> pModules) {
 177  0
                 if (pModules == null) {
 178  0
                         throw new NullPointerException("The module list must not be null.");
 179  
                 }
 180  0
                 modules.addAll(pModules);
 181  0
                 return this;
 182  
         }
 183  
 }