package org.ovirt.engine.core.dal;
import java.lang.annotation.Annotation;
import java.util.Iterator;
import java.util.Map;
import javax.enterprise.inject.Instance;
import javax.enterprise.util.TypeLiteral;
import org.ovirt.engine.core.dao.Dao;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
class CdiIntegration implements BeanDefinitionRegistryPostProcessor {
private ConfigurableListableBeanFactory beanFactory;
@Bean
public Instance<Dao> daos() {
// Since the Spring runner doesn't support the CDI @Any annotation - we need to hand it to him manually
Map<String, Dao> daoMap = beanFactory.getBeansOfType(Dao.class);
return new InstanceImpl(daoMap.values());
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
}
private static class InstanceImpl implements Instance<Dao> {
private Iterable<Dao> daos;
public InstanceImpl(Iterable<Dao> daos) {
super();
this.daos = daos;
}
@Override
public Dao get() {
return daos.iterator().next();
}
@Override
public Iterator<Dao> iterator() {
return daos.iterator();
}
@Override
public <U extends Dao> Instance<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
return null;
}
@Override
public <U extends Dao> Instance<U> select(Class<U> subtype, Annotation... qualifiers) {
return null;
}
@Override
public Instance<Dao> select(Annotation... qualifiers) {
return null;
}
@Override
public boolean isUnsatisfied() {
return false;
}
@Override
public boolean isAmbiguous() {
return false;
}
@Override
public void destroy(Dao dao) {
}
}
}