/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.portal.cache;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import com.enonic.cms.framework.cache.CacheManager;
import com.enonic.cms.core.structure.SiteKey;
import com.enonic.cms.core.structure.SiteProperties;
import com.enonic.cms.core.structure.SitePropertiesListener;
import com.enonic.cms.core.structure.SitePropertiesService;
@Component("pageCacheService")
public class PageCacheServiceImpl
implements PageCacheService, SitePropertiesListener
{
private static final Logger LOG = LoggerFactory.getLogger( PageCacheServiceImpl.class );
private Map<SiteKey, PageCache> pageCaches = new LinkedHashMap<SiteKey, PageCache>();
private SitePropertiesService sitePropertiesService;
private CacheManager cacheManager;
@PostConstruct
public void postConstruct()
{
sitePropertiesService.registerSitePropertiesListener( this );
}
public synchronized void setUpPageCache( final SiteKey siteKey )
{
doSetupPageCache( siteKey );
}
private void doSetupPageCache( final SiteKey siteKey )
{
PageCache pageCache = pageCaches.get( siteKey );
if ( pageCache == null )
{
pageCache = createPageCache( siteKey );
pageCaches.put( siteKey, pageCache );
LOG.info( "Page cache is set up for site " + siteKey );
}
else
{
final SiteProperties siteProperties = sitePropertiesService.getSiteProperties( siteKey );
pageCache.setEnabled( siteProperties.getPageCacheEnabled() );
pageCache.setDefaultTimeToLive( siteProperties.getPageCacheTimeToLive() );
}
}
@Override
public void sitePropertiesLoaded( final SiteProperties siteProperties )
{
// nothing
}
@Override
public void sitePropertiesReloaded( final SiteProperties siteProperties )
{
final PageCache pageCache = pageCaches.get( siteProperties.getSiteKey() );
if ( pageCache != null )
{
pageCache.setEnabled( siteProperties.getPageCacheEnabled() );
pageCache.setDefaultTimeToLive( siteProperties.getPageCacheTimeToLive() );
}
}
private PageCache createPageCache( final SiteKey siteKey )
{
final PageCache pageCache = new PageCache( siteKey, cacheManager.getPageCache() );
final SiteProperties siteProperties = sitePropertiesService.getSiteProperties( siteKey );
pageCache.setDefaultTimeToLive( siteProperties.getPageCacheTimeToLive() );
pageCache.setEnabled( siteProperties.getPageCacheEnabled() );
return pageCache;
}
public synchronized PageCache getPageCacheService( final SiteKey siteKey )
{
Assert.notNull( siteKey, "Given siteKey cannot be null" );
PageCache cacheService = pageCaches.get( siteKey );
if ( cacheService == null )
{
doSetupPageCache( siteKey );
cacheService = pageCaches.get( siteKey );
}
return cacheService;
}
public synchronized void tearDownPageCache( final SiteKey siteKey )
{
pageCaches.remove( siteKey );
LOG.info( "Page cache is teared down for site " + siteKey );
}
@Autowired
public void setSitePropertiesService( SitePropertiesService value )
{
this.sitePropertiesService = value;
}
@Autowired
public void setCacheManager( CacheManager value )
{
this.cacheManager = value;
}
}