package org.infinispan.cdi.embedded;
import java.lang.annotation.Annotation;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Inject;
import org.infinispan.AdvancedCache;
import org.infinispan.Cache;
import org.infinispan.cdi.common.util.Reflections;
import org.infinispan.cdi.embedded.event.cache.CacheEventBridge;
import org.infinispan.cdi.embedded.event.cachemanager.CacheManagerEventBridge;
import org.infinispan.manager.CacheContainer;
import org.infinispan.manager.EmbeddedCacheManager;
/**
* This class is responsible to produce the {@link Cache} and {@link AdvancedCache}. This class use the
* <a href="http://docs.jboss.org/seam/3/solder/latest/reference/en-US/html_single/#genericbeans">Generic Beans</a>
* mechanism provided by Seam Solder.
*
* @author Pete Muir
* @author Kevin Pollet <kevin.pollet@serli.com> (C) 2011 SERLI
*/
@ApplicationScoped
public class AdvancedCacheProducer {
@Inject
private EmbeddedCacheManager defaultCacheContainer;
@Inject
private CacheEventBridge cacheEventBridge;
@Inject
private InfinispanExtensionEmbedded infinispanExtension;
@Inject @Any
private Instance<EmbeddedCacheManager> cacheManagers;
@Inject
private BeanManager beanManager;
@Inject
private CacheManagerEventBridge eventBridge;
private CacheContainer getCacheContainer(Set<Annotation> qualifiers) {
Instance<EmbeddedCacheManager> cacheContainer = cacheManagers.select(qualifiers.toArray(Reflections.EMPTY_ANNOTATION_ARRAY));
if (cacheContainer.isUnsatisfied()) {
return defaultCacheContainer;
} else {
return cacheContainer.get();
}
}
public <K, V> AdvancedCache<K, V> getAdvancedCache(String name, Set<Annotation> qualifiers) {
// lazy register stuff
infinispanExtension.registerCacheConfigurations(eventBridge, cacheManagers, beanManager);
Cache<K, V> cache;
CacheContainer container = getCacheContainer(qualifiers);
if (name.isEmpty()) {
cache = container.getCache();
} else {
cache = container.getCache(name);
}
cacheEventBridge.registerObservers(
qualifiers,
cache
);
return cache.getAdvancedCache();
}
}