📄 cmsflexcache.java
字号:
case I_CmsEventListener.EVENT_PUBLISH_PROJECT:
case I_CmsEventListener.EVENT_CLEAR_CACHES:
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCACHE_RECEIVED_EVENT_CLEAR_CACHE_0));
}
clear();
break;
case I_CmsEventListener.EVENT_FLEX_PURGE_JSP_REPOSITORY:
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCACHE_RECEIVED_EVENT_PURGE_REPOSITORY_0));
}
purgeJspRepository();
break;
case I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR:
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXCACHE_RECEIVED_EVENT_CLEAR_CACHE_PARTIALLY_0));
}
Map m = event.getData();
if (m == null) {
break;
}
Integer it = null;
try {
it = (Integer)m.get("action");
} catch (Exception e) {
// it will be null
}
if (it == null) {
break;
}
int i = it.intValue();
switch (i) {
case CLEAR_ALL:
clear();
break;
case CLEAR_ENTRIES:
clearEntries();
break;
case CLEAR_ONLINE_ALL:
clearOnline();
break;
case CLEAR_ONLINE_ENTRIES:
clearOnlineEntries();
break;
case CLEAR_OFFLINE_ALL:
clearOffline();
break;
case CLEAR_OFFLINE_ENTRIES:
clearOfflineEntries();
break;
default:
// no operation
}
default:
// no operation
}
}
/**
* Returns the CmsFlexCacheKey data structure for a given
* key (i.e. resource name).<p>
*
* Usefull if you want to show the cache key for a resources,
* like on the FlexCache administration page.<p>
*
* Only users with administrator permissions are allowed
* to perform this operation.<p>
*
* @param key the resource name for which to look up the variation for
* @param cms the CmsObject used for user authorization
* @return the CmsFlexCacheKey data structure found for the resource
*/
public CmsFlexCacheKey getCachedKey(String key, CmsObject cms) {
if (!isEnabled() || !cms.hasRole(CmsRole.WORKPLACE_MANAGER)) {
return null;
}
Object o = m_keyCache.get(key);
if (o != null) {
return ((CmsFlexCacheVariation)o).m_key;
}
return null;
}
/**
* Returns a set of all cached resource names.
* Usefull if you want to show a list of all cached resources,
* like on the FlexCache administration page.<p>
*
* Only users with administrator permissions are allowed
* to perform this operation.<p>
*
* @param cms the CmsObject used for user authorization
* @return a Set of cached resource names (which are of type String)
*/
public Set getCachedResources(CmsObject cms) {
if (!isEnabled() || !cms.hasRole(CmsRole.WORKPLACE_MANAGER)) {
return null;
}
return m_keyCache.keySet();
}
/**
* Returns all variations in the cache for a given resource name.
* The variations are of type String.<p>
*
* Usefull if you want to show a list of all cached entry - variations,
* like on the FlexCache administration page.<p>
*
* Only users with administrator permissions are allowed
* to perform this operation.<p>
*
* @param key the resource name for which to look up the variations for
* @param cms the CmsObject used for user authorization
* @return a Set of cached variations (which are of type String)
*/
public Set getCachedVariations(String key, CmsObject cms) {
if (!isEnabled() || !cms.hasRole(CmsRole.WORKPLACE_MANAGER)) {
return null;
}
Object o = m_keyCache.get(key);
if (o != null) {
return ((CmsFlexCacheVariation)o).m_map.keySet();
}
return null;
}
/**
* Returns the LRU cache where the CacheEntries are cached.<p>
*
* @return the LRU cache where the CacheEntries are cached
*/
public CmsLruCache getEntryLruCache() {
return m_variationCache;
}
/**
* Indicates if the cache is enabled (i.e. actually
* caching entries) or not.<p>
*
* @return true if the cache is enabled, false if not
*/
public boolean isEnabled() {
return m_enabled;
}
/**
* Returns the total number of cached resource keys.
*
* @return the number of resource keys in the cache
*/
public int keySize() {
if (!isEnabled()) {
return 0;
}
return m_keyCache.size();
}
/**
* Returns the total number of entries in the cache.<p>
*
* @return the number of entries in the cache
*/
public int size() {
return m_variationCache.size();
}
/**
* Clears the cache for finalization.<p>
* @throws Throwable if something goes wrong
*/
protected void finalize() throws Throwable {
try {
clear();
m_variationCache = null;
m_keyCache = null;
} catch (Throwable t) {
// ignore
}
super.finalize();
}
/**
* Looks up a specific entry in the cache.<p>
*
* In case a found entry has a timeout set, it will be checked upon lookup.
* In case the timeout of the entry has been reached, it will be removed from
* the cache (and null will be returned in this case).<p>
*
* @param key The key to look for in the cache
* @return the entry found for the key, or null if key is not in the cache
*/
CmsFlexCacheEntry get(CmsFlexRequestKey key) {
if (!isEnabled()) {
// cache is disabled
return null;
}
Object o = m_keyCache.get(key.getResource());
if (o != null) {
// found a matching key in the cache
CmsFlexCacheVariation v = (CmsFlexCacheVariation)o;
String variation = v.m_key.matchRequestKey(key);
if (CmsStringUtil.isEmpty(variation)) {
// requested resource is not cacheable
return null;
}
CmsFlexCacheEntry entry = (CmsFlexCacheEntry)v.m_map.get(variation);
if (entry == null) {
// no cache entry available for variation
return null;
}
if (entry.getDateExpires() < System.currentTimeMillis()) {
// cache entry avaiable but expired, remove entry
m_variationCache.remove(entry);
return null;
}
// return the found cache entry
return entry;
} else {
return null;
}
}
/**
* Returns the CmsFlexCacheKey data structure for a given resource name.<p>
*
* @param resource the resource name for which to look up the key for
* @return the CmsFlexCacheKey data structure found for the resource
*/
CmsFlexCacheKey getKey(String resource) {
if (!isEnabled()) {
return null;
}
Object o = m_keyCache.get(resource);
if (o != null) {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCACHEKEY_FOUND_1, resource));
}
return ((CmsFlexCacheVariation)o).m_key;
} else {
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCACHEKEY_NOT_FOUND_1, resource));
}
return null;
}
}
/**
* Checks if the cache is empty or if at last one element is contained.<p>
*
* @return true if the cache is empty, false otherwise
*/
boolean isEmpty() {
if (!isEnabled()) {
return true;
}
return m_keyCache.isEmpty();
}
/**
* This method adds new entries to the cache.<p>
*
* The key describes the conditions under which the value can be cached.
* Usually the key belongs to the response.
* The variation describes the conditions under which the
* entry was created. This is usually calculated from the request.
* If the variation is != null, the entry is cachable.<p>
*
* @param key the key for the new value entry
* @param entry the CmsFlexCacheEntry to store in the cache
* @param variation the pre-calculated variation for the entry
* @return true if the value was added to the cache, false otherwise
*/
boolean put(CmsFlexCacheKey key, CmsFlexCacheEntry entry, String variation) {
if (!isEnabled()) {
return false;
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_FLEXCACHE_ADD_ENTRY_1, key.getResource()));
}
if (variation != null) {
// This is a cachable result
key.setVariation(variation);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_FLEXCACHE_ADD_ENTRY_WITH_VARIATION_2,
key.getResource(),
key.getVariation()));
}
put(key, entry);
// Note that duplicates are NOT checked, it it assumed that this is done beforehand,
// while checking if the entry is already in the cache or not.
return true;
} else {
// Result is not cachable
if (LOG.isDebugEnabled()) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -