package org.infinispan.persistence.factory; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.infinispan.configuration.cache.StoreConfiguration; import org.infinispan.factories.scopes.Scope; import org.infinispan.factories.scopes.Scopes; import org.infinispan.util.logging.Log; import org.infinispan.util.logging.LogFactory; /** * Registry for multiple {@link CacheStoreFactory} objects. * * @author Sebastian Laskawiec * @since 7.2 */ @Scope(Scopes.GLOBAL) public class CacheStoreFactoryRegistry { private static final Log log = LogFactory.getLog(CacheStoreFactoryRegistry.class); private List<CacheStoreFactory> factories = Collections.synchronizedList(new ArrayList<CacheStoreFactory>()); public CacheStoreFactoryRegistry() { factories.add(new LocalClassLoaderCacheStoreFactory()); } /** * Creates new Object based on configuration. * * @param storeConfiguration Cache store configuration. * @return Instance created based on the configuration. * @throws org.infinispan.commons.CacheConfigurationException when the instance couldn't be created. */ public Object createInstance(StoreConfiguration storeConfiguration) { for(CacheStoreFactory factory : factories) { Object instance = factory.createInstance(storeConfiguration); if(instance != null) { return instance; } } throw log.unableToInstantiateClass(storeConfiguration.getClass()); } public StoreConfiguration processStoreConfiguration(StoreConfiguration storeConfiguration) { for(CacheStoreFactory factory : factories) { StoreConfiguration processedConfiguration = factory.processConfiguration(storeConfiguration); if(processedConfiguration != null) { return processedConfiguration; } } return storeConfiguration; } /** * Adds a new factory for processing. * * @param cacheStoreFactory Factory to be added. */ public void addCacheStoreFactory(CacheStoreFactory cacheStoreFactory) { if(cacheStoreFactory == null) { throw log.unableToAddNullCustomStore(); } factories.add(0, cacheStoreFactory); } /** * Removes all factories associated to this registry. */ public void clearFactories() { factories.clear(); } }