/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.jboss.as.ejb3.cache.distributable; import org.jboss.as.ejb3.cache.Cache; import org.jboss.as.ejb3.cache.CacheFactory; import org.jboss.as.ejb3.cache.Contextual; import org.jboss.as.ejb3.cache.Identifiable; import org.jboss.as.ejb3.cache.StatefulObjectFactory; import org.jboss.msc.service.ServiceBuilder; import org.jboss.msc.service.ServiceName; import org.jboss.msc.service.ServiceTarget; import org.jboss.msc.service.ValueService; import org.jboss.msc.value.InjectedValue; import org.jboss.msc.value.Value; import org.wildfly.clustering.ee.Batch; import org.wildfly.clustering.ejb.BeanManager; import org.wildfly.clustering.ejb.BeanManagerFactory; import org.wildfly.clustering.ejb.IdentifierFactory; import org.wildfly.clustering.ejb.PassivationListener; import org.wildfly.clustering.service.Builder; /** * Service that provides a distributable {@link CacheFactory}. * * @author Paul Ferraro * @param <K> the cache key type * @param <V> the cache value type */ public class DistributableCacheFactoryService<K, V extends Identifiable<K> & Contextual<Batch>> implements Builder<CacheFactory<K, V>>, Value<CacheFactory<K, V>>, CacheFactory<K, V> { private final ServiceName name; private final Builder<? extends BeanManagerFactory<K, V, Batch>> builder; @SuppressWarnings("rawtypes") private final InjectedValue<BeanManagerFactory> factory = new InjectedValue<>(); public DistributableCacheFactoryService(ServiceName name, Builder<? extends BeanManagerFactory<K, V, Batch>> builder) { this.name = name; this.builder = builder; } @Override public ServiceName getServiceName() { return this.name; } @Override public ServiceBuilder<CacheFactory<K, V>> build(ServiceTarget target) { this.builder.build(target).install(); return target.addService(this.name, new ValueService<>(this)) .addDependency(this.builder.getServiceName(), BeanManagerFactory.class, this.factory) ; } @Override public CacheFactory<K, V> getValue() { return this; } @Override public Cache<K, V> createCache(IdentifierFactory<K> identifierFactory, StatefulObjectFactory<V> factory, PassivationListener<V> passivationListener) { BeanManager<K, V, Batch> manager = this.factory.getValue().createBeanManager(identifierFactory, passivationListener, new RemoveListenerAdapter<>(factory)); return new DistributableCache<>(manager, factory); } }