package ilarkesto.di;
import ilarkesto.base.Str;
import ilarkesto.core.logging.Log;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
* A bean provider which wrapps other bean providers.
*
* @author wko
*/
public final class MultiBeanProvider extends ABeanProvider {
private static final Log LOG = Log.get(MultiBeanProvider.class);
private Set<BeanProvider> beanProviders = new HashSet<BeanProvider>();
private Map<String, BeanProvider> beanToBeanProvider = new HashMap<String, BeanProvider>();
public synchronized void addBeanProvider(Object object) {
if (object == null) throw new IllegalArgumentException("object == null");
// identify object and create beanProvider
BeanProvider beanProvider;
if (object instanceof BeanProvider) {
beanProvider = (BeanProvider) object;
} else {
if (object instanceof Map) {
beanProvider = new BeanContainer((Map<String, Object>) object);
} else {
beanProvider = new ReflectionBeanProvider(object);
}
}
// get objectStringMapper from beanProvider
if (objectStringMapper == null && beanProvider instanceof ABeanProvider)
objectStringMapper = ((ABeanProvider) beanProvider).objectStringMapper;
// register beanProvider for its beans
for (String beanName : beanProvider.beanNames()) {
if ("beanProvider".equals(beanName)) throw new RuntimeException("Forbidden bean: beanProvider");
beanToBeanProvider.put(beanName, beanProvider);
}
// add beanProvider
beanProviders.add(beanProvider);
}
public Set<String> beanNames() {
return beanToBeanProvider.keySet();
}
public <T> Object getBean(String beanName) {
BeanProvider provider = beanToBeanProvider.get(beanName);
if (provider == null) throw new BeanDoesNotExisException(beanName);
return provider.getBean(beanName);
}
public Class getBeanType(String beanName) {
BeanProvider provider = beanToBeanProvider.get(beanName);
if (provider == null) throw new BeanDoesNotExisException(beanName);
return provider.getBeanType(beanName);
}
@Override
public String toString() {
return "(" + Str.concat(beanProviders, ", ") + ")";
}
// --- dependencies ---
}