/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.xslt.portal; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.enonic.cms.framework.cache.CacheFacade; import com.enonic.cms.core.resource.FileResource; import com.enonic.cms.core.resource.FileResourceName; import com.enonic.cms.core.resource.FileResourceService; final class XsltTemplatesCache { private final static Logger LOG = LoggerFactory.getLogger( XsltTemplatesCache.class ); private final CacheFacade cacheFacade; private final FileResourceService resourceService; private final long checkInterval; public XsltTemplatesCache( final CacheFacade cacheFacade, final FileResourceService resourceService, final long checkInterval ) { this.cacheFacade = cacheFacade; this.resourceService = resourceService; this.checkInterval = checkInterval; } public XsltTemplatesCacheEntry get( final FileResourceName name ) { final XsltTemplatesCacheEntry entry = (XsltTemplatesCacheEntry) this.cacheFacade.get( null, name.toString() ); if ( entry == null ) { return null; } if ( isValid( entry ) ) { return entry; } else { this.cacheFacade.remove( null, name.toString() ); return null; } } public void put( final XsltTemplatesCacheEntry entry ) { this.cacheFacade.put( null, entry.getName().toString(), entry ); } public boolean isValid( final XsltTemplatesCacheEntry entry ) { final long now = System.currentTimeMillis(); if ( ( now - entry.getLastValidated() ) < this.checkInterval ) { return true; } entry.setLastValidated( now ); final boolean flag = isModifiedAfter( entry ); LOG.debug( "XsltTemplatesCacheEntry validation took " + ( System.currentTimeMillis() - now ) + " ms and checked " + entry.getResourceSet().size() + " resources for modifications." ); return flag; } private boolean isModifiedAfter( final XsltTemplatesCacheEntry entry ) { for ( final FileResourceName name : entry.getResourceSet() ) { if ( isModifiedAfter( name, entry.getCompileTimestamp() ) ) { return false; } } return true; } private boolean isModifiedAfter( final FileResourceName name, final long timestamp ) { final FileResource resource = this.resourceService.getResource( name ); return ( resource == null ) || ( resource.getLastModified().getMillis() > timestamp ); } }