/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.framework.cache.base; import java.util.Map; import org.elasticsearch.common.collect.Maps; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import com.google.common.collect.ImmutableList; import com.enonic.cms.framework.cache.CacheFacade; import com.enonic.cms.framework.cache.CacheManager; import com.enonic.cms.framework.cache.event.CacheEventHandler; import com.enonic.cms.framework.cache.event.CacheEventHandlerAdapter; import com.enonic.cms.framework.cache.event.CacheEventPublisherAdapter; import com.enonic.cms.core.cluster.ClusterEvent; import com.enonic.cms.core.cluster.ClusterEventListener; import com.enonic.cms.core.cluster.ClusterEventPublisher; import com.enonic.cms.core.cluster.NopClusterEventPublisher; import com.enonic.cms.core.config.ConfigProperties; public abstract class AbstractCacheManager implements CacheManager, ClusterEventListener, CacheEventHandler, InitializingBean { private final Map<String, AbstractCacheFacade> cacheMap; private final CacheEventHandlerAdapter cacheEventHandlerAdapter; private CacheEventPublisherAdapter cacheEventPublisher; private CacheManagerConfig config; public AbstractCacheManager() { this.cacheMap = Maps.newLinkedHashMap(); this.cacheEventHandlerAdapter = new CacheEventHandlerAdapter( this ); this.cacheEventPublisher = new CacheEventPublisherAdapter( new NopClusterEventPublisher() ); } @Override public final Iterable<CacheFacade> getAll() { final ImmutableList.Builder<CacheFacade> builder = ImmutableList.builder(); for ( final CacheFacade facade : this.cacheMap.values() ) { builder.add( facade ); } return builder.build(); } @Override public final void handleEvictByKey( final String cacheName, final String key ) { final AbstractCacheFacade cache = this.cacheMap.get( cacheName ); if ( cache != null ) { cache.doRemove( key ); } } @Override public final void handleEvictByGroup( final String cacheName, final String group ) { final AbstractCacheFacade cache = this.cacheMap.get( cacheName ); if ( cache != null ) { cache.doRemoveGroup( group ); } } @Override public final void handleEvictByPrefix( final String cacheName, final String prefix ) { final AbstractCacheFacade cache = this.cacheMap.get( cacheName ); if ( cache != null ) { cache.doRemoveGroupByPrefix( prefix ); } } @Override public final void handleEvictAll( final String cacheName ) { final AbstractCacheFacade cache = this.cacheMap.get( cacheName ); if ( cache != null ) { cache.doRemoveAll(); } } @Override public final void handle( final ClusterEvent event ) { this.cacheEventHandlerAdapter.handle( event ); } private void createCache( final String name ) { final CacheConfig config = this.config.getCacheConfig( name ); final AbstractCacheFacade facade = doCreateCache( config ); facade.setName( name ); facade.setConfig( config ); facade.setCacheEventPublisher( this.cacheEventPublisher ); this.cacheMap.put( name, facade ); } protected abstract AbstractCacheFacade doCreateCache( CacheConfig config ); @Override public final CacheFacade getCache( final String name ) { return this.cacheMap.get( name ); } @Autowired public final void setProperties( final ConfigProperties properties ) { this.config = new CacheManagerConfig( properties ); } @Autowired(required = false) public final void setClusterEventPublisher( final ClusterEventPublisher clusterEventPublisher ) { this.cacheEventPublisher = new CacheEventPublisherAdapter( clusterEventPublisher ); } @Override public final CacheFacade getEntityCache() { return getCache( "entity" ); } @Override public final CacheFacade getImageCache() { return getCache( "image" ); } @Override public final CacheFacade getLocalizationCache() { return getCache( "localization" ); } @Override public final CacheFacade getPageCache() { return getCache( "page" ); } @Override public final CacheFacade getXsltCache() { return getCache( "xslt" ); } @Override public void afterPropertiesSet() { createCache( "page" ); createCache( "entity" ); createCache( "image" ); createCache( "xslt" ); createCache( "localization" ); } }