/* =============================================================================== * * Part of the InfoGlue Content Management Platform (www.infoglue.org) * * =============================================================================== * * Copyright (C) * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 2, as published by the * Free Software Foundation. See the file LICENSE.html for more information. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc. / 59 Temple * Place, Suite 330 / Boston, MA 02111-1307 / USA. * * =============================================================================== */ package org.infoglue.deliver.util; import java.io.File; import java.io.IOException; import java.io.StringReader; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.pluto.portalImpl.services.ServiceManager; import org.apache.pluto.portalImpl.services.portletentityregistry.PortletEntityRegistry; import org.exolab.castor.jdo.CacheManager; import org.exolab.castor.jdo.Database; import org.exolab.castor.jdo.ObjectNotFoundException; import org.infoglue.cms.applications.common.VisualFormatter; import org.infoglue.cms.controllers.kernel.impl.simple.AccessRightController; import org.infoglue.cms.controllers.kernel.impl.simple.CastorDatabaseService; import org.infoglue.cms.controllers.kernel.impl.simple.ComponentController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentCategoryController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentTypeDefinitionController; import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController; import org.infoglue.cms.controllers.kernel.impl.simple.DigitalAssetController; import org.infoglue.cms.controllers.kernel.impl.simple.GroupPropertiesController; import org.infoglue.cms.controllers.kernel.impl.simple.InterceptionPointController; import org.infoglue.cms.controllers.kernel.impl.simple.PropertiesCategoryController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeController; import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionController; import org.infoglue.cms.entities.content.ContentCategoryVO; import org.infoglue.cms.entities.content.ContentVO; import org.infoglue.cms.entities.content.ContentVersionVO; import org.infoglue.cms.entities.content.SmallestContentVersionVO; import org.infoglue.cms.entities.content.impl.simple.ContentCategoryImpl; import org.infoglue.cms.entities.content.impl.simple.ContentImpl; import org.infoglue.cms.entities.content.impl.simple.ContentRelationImpl; import org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.DigitalAssetImpl; import org.infoglue.cms.entities.content.impl.simple.MediumContentImpl; import org.infoglue.cms.entities.content.impl.simple.MediumDigitalAssetImpl; import org.infoglue.cms.entities.content.impl.simple.SmallContentImpl; import org.infoglue.cms.entities.content.impl.simple.SmallContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.SmallDigitalAssetImpl; import org.infoglue.cms.entities.content.impl.simple.SmallestContentVersionImpl; import org.infoglue.cms.entities.content.impl.simple.SmallishContentImpl; import org.infoglue.cms.entities.management.AccessRightVO; import org.infoglue.cms.entities.management.ContentTypeDefinitionVO; import org.infoglue.cms.entities.management.InterceptionPointVO; import org.infoglue.cms.entities.management.impl.simple.AccessRightGroupImpl; import org.infoglue.cms.entities.management.impl.simple.AccessRightImpl; import org.infoglue.cms.entities.management.impl.simple.AccessRightRoleImpl; import org.infoglue.cms.entities.management.impl.simple.AccessRightUserImpl; import org.infoglue.cms.entities.management.impl.simple.AvailableServiceBindingImpl; import org.infoglue.cms.entities.management.impl.simple.CategoryImpl; import org.infoglue.cms.entities.management.impl.simple.ContentTypeDefinitionImpl; import org.infoglue.cms.entities.management.impl.simple.FormEntryImpl; import org.infoglue.cms.entities.management.impl.simple.FormEntryValueImpl; import org.infoglue.cms.entities.management.impl.simple.GroupContentTypeDefinitionImpl; import org.infoglue.cms.entities.management.impl.simple.GroupImpl; import org.infoglue.cms.entities.management.impl.simple.GroupPropertiesImpl; import org.infoglue.cms.entities.management.impl.simple.InterceptionPointImpl; import org.infoglue.cms.entities.management.impl.simple.InterceptorImpl; import org.infoglue.cms.entities.management.impl.simple.LanguageImpl; import org.infoglue.cms.entities.management.impl.simple.PropertiesCategoryImpl; import org.infoglue.cms.entities.management.impl.simple.RedirectImpl; import org.infoglue.cms.entities.management.impl.simple.RegistryImpl; import org.infoglue.cms.entities.management.impl.simple.RepositoryImpl; import org.infoglue.cms.entities.management.impl.simple.RepositoryLanguageImpl; import org.infoglue.cms.entities.management.impl.simple.RoleContentTypeDefinitionImpl; import org.infoglue.cms.entities.management.impl.simple.RoleImpl; import org.infoglue.cms.entities.management.impl.simple.RolePropertiesImpl; import org.infoglue.cms.entities.management.impl.simple.ServerNodeImpl; import org.infoglue.cms.entities.management.impl.simple.ServiceDefinitionImpl; import org.infoglue.cms.entities.management.impl.simple.SiteNodeTypeDefinitionImpl; import org.infoglue.cms.entities.management.impl.simple.SmallAvailableServiceBindingImpl; import org.infoglue.cms.entities.management.impl.simple.SmallGroupImpl; import org.infoglue.cms.entities.management.impl.simple.SmallRepositoryImpl; import org.infoglue.cms.entities.management.impl.simple.SmallRoleImpl; import org.infoglue.cms.entities.management.impl.simple.SmallSystemUserImpl; import org.infoglue.cms.entities.management.impl.simple.SubscriptionImpl; import org.infoglue.cms.entities.management.impl.simple.SystemUserGroupImpl; import org.infoglue.cms.entities.management.impl.simple.SystemUserImpl; import org.infoglue.cms.entities.management.impl.simple.SystemUserRoleImpl; import org.infoglue.cms.entities.management.impl.simple.UserContentTypeDefinitionImpl; import org.infoglue.cms.entities.management.impl.simple.UserPropertiesImpl; import org.infoglue.cms.entities.publishing.impl.simple.PublicationImpl; import org.infoglue.cms.entities.structure.SiteNodeVO; import org.infoglue.cms.entities.structure.SiteNodeVersionVO; import org.infoglue.cms.entities.structure.impl.simple.PureSiteNodeImpl; import org.infoglue.cms.entities.structure.impl.simple.QualifyerImpl; import org.infoglue.cms.entities.structure.impl.simple.ServiceBindingImpl; import org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl; import org.infoglue.cms.entities.structure.impl.simple.SiteNodeVersionImpl; import org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeImpl; import org.infoglue.cms.entities.structure.impl.simple.SmallSiteNodeVersionImpl; import org.infoglue.cms.entities.workflow.impl.simple.ActionDefinitionImpl; import org.infoglue.cms.entities.workflow.impl.simple.ActionImpl; import org.infoglue.cms.entities.workflow.impl.simple.ActorImpl; import org.infoglue.cms.entities.workflow.impl.simple.ConsequenceDefinitionImpl; import org.infoglue.cms.entities.workflow.impl.simple.ConsequenceImpl; import org.infoglue.cms.entities.workflow.impl.simple.EventImpl; import org.infoglue.cms.entities.workflow.impl.simple.WorkflowDefinitionImpl; import org.infoglue.cms.entities.workflow.impl.simple.WorkflowImpl; import org.infoglue.cms.exception.Bug; import org.infoglue.cms.exception.SystemException; import org.infoglue.cms.io.FileHelper; import org.infoglue.cms.security.InfoGlueAuthenticationFilter; import org.infoglue.cms.util.CmsPropertyHandler; import org.infoglue.cms.util.sorters.CacheComparator; import org.infoglue.cms.util.workflow.InfoGlueJDBCPropertySet; import org.infoglue.deliver.applications.actions.InfoGlueComponent; import org.infoglue.deliver.applications.databeans.CacheEvictionBean; import org.infoglue.deliver.applications.databeans.DatabaseWrapper; import org.infoglue.deliver.cache.PageCacheHelper; import org.infoglue.deliver.invokers.PageInvoker; import org.infoglue.deliver.portal.ServletConfigContainer; import org.xmlpull.v1.builder.XmlDocument; import org.xmlpull.v1.builder.XmlElement; import org.xmlpull.v1.builder.XmlInfosetBuilder; import org.xmlpull.v1.builder.xpath.Xb1XPath; import com.opensymphony.oscache.base.AbstractCacheAdministrator; import com.opensymphony.oscache.base.CacheEntry; import com.opensymphony.oscache.base.NeedsRefreshException; import com.opensymphony.oscache.base.algorithm.ImprovedLRUCache; import com.opensymphony.oscache.base.events.CacheEntryEventListener; import com.opensymphony.oscache.base.events.CacheMapAccessEventListener; import com.opensymphony.oscache.extra.CacheEntryEventListenerImpl; import com.opensymphony.oscache.extra.CacheMapAccessEventListenerImpl; import com.opensymphony.oscache.general.GeneralCacheAdministrator; public class CacheController extends Thread { private static long readLockTimeout = 5; private static long writeLockTimeout = 50; public final static Logger logger = Logger.getLogger(CacheController.class.getName()); private static VisualFormatter formatter = new VisualFormatter(); public static final String SETTINGSPROPERTIESCACHENAME = "serverNodePropertiesCache"; public static final String SETTINGSPROPERTIESDOCUMENTCACHENAME = "serverNodePropertiesDocumentCache"; public static List notifications = Collections.synchronizedList(new ArrayList()); private static Map eventListeners = new HashMap(); //private static Map caches = new HashMap(); private static ConcurrentMap caches = new ConcurrentHashMap(); //private static Map caches = Collections.synchronizedMap(new HashMap()); private boolean expireCacheAutomatically = false; private int cacheExpireInterval = 1800000; private boolean continueRunning = true; public static Pattern pattern = null; public static Date expireDateTime = null; public static Date publishDateTime = null; private static Map<Integer, Integer> assetContentIdMapping = new HashMap<Integer, Integer>(); private static CompressionHelper compressionHelper = new CompressionHelper(); private static AtomicInteger numberOfPageCacheFiles = new AtomicInteger(0); //Force mode only happens when a cache eviction has to wait to long. Then we switch to force mode private static class ThreadLocalCacheEvictionMode extends ThreadLocal { public Object initialValue() { return false; } } //boolean forcedCacheEvictionMode = false; private static ThreadLocalCacheEvictionMode cem = new ThreadLocalCacheEvictionMode(); public static Boolean getForcedCacheEvictionMode() { return (Boolean) cem.get(); } public static void setForcedCacheEvictionMode(Boolean cemValue) { if(logger.isInfoEnabled()) logger.info("Forcing quick cache eviction..."); cem.set(cemValue); } //Force defeatCaches-mode private static class ThreadLocalDefeatCacheMode extends ThreadLocal<DefeatCacheParameters> { public DefeatCacheParameters initialValue() { return new DefeatCacheParameters(); } } private static ThreadLocalDefeatCacheMode defeatCaches = new ThreadLocalDefeatCacheMode(); public static DefeatCacheParameters getDefeatCaches() { return (DefeatCacheParameters) defeatCaches.get(); } public static void setDefeatCaches(boolean defeatCache, Map<Class, List<Object>> entities) { DefeatCacheParameters defeatCachesValue = new DefeatCacheParameters(); defeatCachesValue.setDefeatCache(defeatCache); if(entities != null) defeatCachesValue.getEntities().putAll(entities); if(logger.isInfoEnabled()) logger.info("Forcing defeatCaches..."); defeatCaches.set(defeatCachesValue); boolean skipClearCastor = false; if(defeatCaches.get().getEntities() == null || defeatCaches.get().getEntities().size() == 0) skipClearCastor = true; if(defeatCache && defeatCaches.get() != null && !skipClearCastor) { try { clearCastorCaches(defeatCaches.get()); } catch (Exception e) { logger.error("Error setting defeatCaches:" + e.getMessage(), e); } } else if(defeatCache && skipClearCastor) { logger.info("Skipping clearCastorCaches as entities was null"); } } //Store extra info private static class ThreadLocalNotificationExtraInformation extends ThreadLocal<Map<String,Map<String,String>>> { public Map<String,Map<String,String>> initialValue() { return new HashMap<String,Map<String,String>>(); } } private static ThreadLocalNotificationExtraInformation extraInfo = new ThreadLocalNotificationExtraInformation(); public static Map<String, String> getExtraInfo(String entityClassName, String entityId) { Map<String, Map<String,String>> allExtra = (Map<String, Map<String,String>>) extraInfo.get(); //System.out.println("Returning allExtra for: " + entityClassName + "_" + entityId + ":" + allExtra.get(entityClassName + "_" + entityId)); return allExtra.get(entityClassName + "_" + entityId); } public static void setExtraInfo(String entityClassName, String entityId, Map<String,String> extraInfoMap) { //System.out.println("Adding extraInfoMap:" + extraInfoMap + " TO " + entityClassName + "_" + entityId); Map<String, Map<String,String>> allExtra = (Map<String, Map<String,String>>) extraInfo.get(); //System.out.println("Adding allExtra for: " + entityClassName + "_" + entityId + ":" + allExtra); Map existingMap = getExtraInfo(entityClassName, entityId); if(existingMap == null) allExtra.put(entityClassName + "_" + entityId, extraInfoMap); else existingMap.putAll(extraInfoMap); } private static StringPool stringPool = new StringPool(); public static String getPooledString(Integer type, Object id) { if(type == null || id == null) { logger.info("Broken was returned from pool:" + type + ":" + id); return "broken"; } return stringPool.getCanonicalVersion(type, id.toString()); } public static String getPooledString(int hashCode) { return stringPool.getCanonicalVersion(hashCode); } public static Integer getPooledStringSize() { return stringPool.getPoolSize(); } public static Integer getPooledStringHits() { return stringPool.getHits(); } public static void clearPooledString() { stringPool.clearPool(); } public CacheController() { super(); } public static void preCacheCMSEntities() throws Exception { Timer t = new Timer(); ContentTypeDefinitionController.getController().getContentTypeDefinitionVOList(); logger.warn("pre cache content types took:" + t.getElapsedTime()); ComponentController.getController().preCacheComponents(-1); logger.warn("preCacheComponents took:" + t.getElapsedTime()); List<SiteNodeVO> snVOList = SiteNodeController.getController().getSiteNodeVOList(false, 0, 30000); logger.warn("snVOList:" + snVOList.size() + " fetched and precached in " + t.getElapsedTime() + " ms"); List<ContentVO> cList = ContentController.getContentController().getContentVOList(10000); logger.warn("cList:" + snVOList.size() + " fetched and precached in " + t.getElapsedTime() + " ms"); /* List<SiteNodeVO> snVOList = SiteNodeController.getController().getSiteNodeVOList(false, 0, 10000); logger.info("snVOList:" + snVOList.size() + " fetched and precached"); List<SiteNodeVersionVO> snvVOList = SiteNodeController.getController().getSiteNodeVersionVOList(false, 0, 10000); logger.info("snvVOList:" + snvVOList.size() + " fetched and precached"); List<ContentVO> cList = ContentController.getContentController().getContentVOList(false, 10000); logger.info("cList:" + cList.size() + " fetched and precached"); List<ContentVersionVO> cvList = ContentVersionController.getContentVersionController().getContentVersionVOList(null, false, 0); logger.info("cvList:" + cvList.size() + " fetched and precached"); */ } public static void preCacheDeliverEntities() throws Exception { Timer t = new Timer(); class PreCacheGroupPropertiesTask implements Runnable { PreCacheGroupPropertiesTask() { } public void run() { try { Timer t = new Timer(); Database db = CastorDatabaseService.getDatabase(); try { beginTransaction(db); GroupPropertiesController.getController().preCacheAllGroupProperties(db); logger.warn("preCacheAllGroupProperties took: " + t.getElapsedTime()); commitTransaction(db); } catch (Exception e) { logger.error("Error precaching all group properties: " + e.getMessage(), e); rollbackTransaction(db); } } catch (Exception e) { logger.error("Could not start PreCacheTask:" + e.getMessage(), e); } finally { GroupPropertiesController.inCacheProgress.set(false); } } } if(GroupPropertiesController.inCacheProgress.compareAndSet(false, true)) { Thread thread = new Thread(new PreCacheGroupPropertiesTask()); thread.start(); } if(CacheController.getCacheSize("propertiesCategoryCache") == 0 && GroupPropertiesController.preCacheInProgress.compareAndSet(false, true)) { try { PropertiesCategoryController.getController().preCacheAllPropertiesCategoryVOList(); } finally { GroupPropertiesController.preCacheInProgress.set(false); } logger.warn("preCacheAllPropertiesCategoryVOList took: " + t.getElapsedTime()); } ContentTypeDefinitionController.getController().getContentTypeDefinitionVOList(); logger.warn("pre cache content types took:" + t.getElapsedTime()); ComponentController.getController().preCacheComponents(-1); logger.warn("preCacheComponents took:" + t.getElapsedTime()); List<SiteNodeVO> snVOList = SiteNodeController.getController().getSiteNodeVOList(false, new Integer(CmsPropertyHandler.getOperatingMode()), 30000); logger.warn("snVOList:" + snVOList.size() + " fetched and precached in " + t.getElapsedTime() + " ms"); List<ContentVO> cList = ContentController.getContentController().getContentVOList(10000); logger.warn("cList:" + snVOList.size() + " fetched and precached in " + t.getElapsedTime() + " ms"); /* FileInputStream fis = new FileInputStream(CmsPropertyHandler.getDigitalAssetPath() + File.separator + "startupCache.txt"); ObjectInputStream ois = new ObjectInputStream(fis); Map<Integer,Integer> mostUsedContentId = (Map<Integer,Integer>) ois.readObject(); ois.close(); */ /* List<SiteNodeVO> snVOList = SiteNodeController.getController().getSiteNodeVOList(false, 0, 100000); logger.info("snVOList:" + snVOList.size() + " fetched and precached"); List<SiteNodeVersionVO> snvVOList = SiteNodeController.getController().getSiteNodeVersionVOList(false, 0, 100000); logger.info("snvVOList:" + snvVOList.size() + " fetched and precached"); List<ContentVO> cList = ContentController.getContentController().getContentVOList(false, 100000); logger.info("cList:" + cList.size() + " fetched and precached"); List<ContentVersionVO> cvList = ContentVersionController.getContentVersionController().getContentVersionVOList(null, false, 0, 100000); logger.info("cvList:" + cvList.size() + " fetched and precached"); */ } public void setCacheExpireInterval(int cacheExpireInterval) { this.cacheExpireInterval = cacheExpireInterval; } public static void renameCache(String cacheName, String newCacheName) { //synchronized(caches) //{ Object cacheInstance = caches.get(cacheName); if(cacheInstance != null) { synchronized(cacheInstance) { caches.put(newCacheName, cacheInstance); //locksCache.put(newCacheName, new ReentrantReadWriteLock()); caches.remove(cacheName); } } //} } public static void clearServerNodeProperty(boolean reCache) { if(reCache) InfoGlueJDBCPropertySet.reCache(); else InfoGlueJDBCPropertySet.clearCaches(); clearCache("serverNodePropertiesCache"); clearCache("encodedStringsCache"); clearCache("principalToolPropertiesCache"); CmsPropertyHandler.resetHardCachedSettings(); } public static void cacheObject(String cacheName, Object key, Object value) { if(cacheName == null || key == null || value == null) return; //synchronized(caches) //{ if(caches.get(cacheName) == null) caches.put(cacheName, new HashMap()); //} //synchronized(caches) //{ Map cacheInstance = (Map)caches.get(cacheName); if(cacheInstance != null && key != null && value != null) { if(CmsPropertyHandler.getUseSynchronizationOnCaches()) { synchronized(cacheInstance) { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheInstance.put("" + key.hashCode(), value); else cacheInstance.put(key, value); } } else { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheInstance.put("" + key.hashCode(), value); else cacheInstance.put(key, value); } } //} } public static Object getCachedObject(String cacheName, Object key) { if(cacheName == null || key == null) return null; if(getDefeatCaches() != null && getDefeatCaches().getDefeatCache("" + cacheName + "_" + key)) { if(!cacheName.equals("serverNodePropertiesCache") && !cacheName.equals("contentTypeDefinitionCache") ) { if (logger.isInfoEnabled()) { logger.info("Missed cache: " + cacheName + " because of defeat caches. Cache.key: " + key); } return null; } } //synchronized(caches) //{ Map cacheInstance = (Map)caches.get(cacheName); if(cacheInstance != null) { //TODO if(CmsPropertyHandler.getUseSynchronizationOnCaches()) { synchronized(cacheInstance) { if(CmsPropertyHandler.getUseHashCodeInCaches()) return cacheInstance.get("" + key.hashCode()); else return cacheInstance.get(key); } } else { if(CmsPropertyHandler.getUseHashCodeInCaches()) return cacheInstance.get("" + key.hashCode()); else return cacheInstance.get(key); } } //} return null; } public static void cacheObjectInAdvancedCacheWithGroupsAsSet(String cacheName, Object key, Object value, Set<String> groupsAsList, boolean useGroups) { String[] groups = groupsAsList.toArray(new String[0]); cacheObjectInAdvancedCache(cacheName, key, value, groups, useGroups); } public static void cacheObjectInAdvancedCache(String cacheName, Object key, Object value) { cacheObjectInAdvancedCache(cacheName, key, value, null, false); } public static void cacheObjectInAdvancedCache(String cacheName, Object key, Object value, boolean useFileCacheFallback, String fileCacheCharEncoding) { cacheObjectInAdvancedCache(cacheName, key, value, null, false, useFileCacheFallback, true, fileCacheCharEncoding); } public static void cacheObjectInAdvancedCache(String cacheName, Object key, Object value, String[] groups, boolean useGroups) { cacheObjectInAdvancedCache(cacheName, key, value, groups, useGroups, false, true, null); } public static void cacheObjectInAdvancedCache(String cacheName, Object key, Object value, String[] groups, boolean useGroups, boolean useFileCacheFallback, boolean useMemoryCache, String fileCacheCharEncoding) { if(cacheName == null || key == null || value == null || key.toString().length() == 0) return; if(defeatCaches.get().getDefeatCache()) defeatCaches.get().setDefeatedKey("" + cacheName + "_" + key.toString()); /* if(cacheName.equalsIgnoreCase("pageCacheExtra")) System.out.println("key pageCacheExtra: " + key); if(cacheName.equalsIgnoreCase("pageCache")) System.out.println("key pageCache: " + key); */ if(logger.isInfoEnabled() && cacheName.equalsIgnoreCase("pageCacheExtra")) { logger.info("cacheName: " + cacheName); logger.info("key: " + key); logger.info("useGroups: " + useGroups); logger.info("useFileCacheFallback: " + useFileCacheFallback); logger.info("useMemoryCache: "+ useMemoryCache); logger.info("groups: " + (groups == null ? "null" : groups.length)); if(groups != null) { for(String group : groups) logger.info(group + ","); } } if(useMemoryCache) { if(!caches.containsKey(cacheName)) { GeneralCacheAdministrator cacheAdministrator = null; Map cacheSettings = (Map)getCachedObject("serverNodePropertiesCacheSettings", "cacheSettings"); if(cacheSettings == null) { cacheSettings = CmsPropertyHandler.getCacheSettings(); cacheObject("serverNodePropertiesCacheSettings", "cacheSettings", cacheSettings); } String cacheCapacity = (String)cacheSettings.get("CACHE_CAPACITY_" + cacheName); if(cacheCapacity == null || !cacheCapacity.equals("")) cacheCapacity = "15000"; if(cacheName != null && cacheName.startsWith("contentAttributeCache")) cacheCapacity = "50000"; if(cacheName != null && cacheName.startsWith("metaInfoContentAttributeCache")) cacheCapacity = "40000"; //else if(cacheName != null && cacheName.startsWith("contentAttributeCache")) // cacheCapacity = "1000"; String pageCacheSize = "100"; String pageCacheExtraSize = "300"; if(CmsPropertyHandler.getOperatingMode().equals("3")) { pageCacheSize = "10000"; pageCacheExtraSize = "30000"; } if(cacheName != null && cacheName.startsWith("pageCache")) cacheCapacity = pageCacheSize; if(cacheName != null && cacheName.startsWith("pageCacheExtra")) cacheCapacity = pageCacheExtraSize; if(cacheName != null && cacheName.equalsIgnoreCase("encodedStringsCache")) cacheCapacity = "2000"; if(cacheName != null && cacheName.equalsIgnoreCase("assetUrlCacheWithGroups")) cacheCapacity = "10000"; if(cacheName != null && cacheName.equalsIgnoreCase("importTagResultCache")) cacheCapacity = "500"; if(cacheName != null && cacheName.equalsIgnoreCase("componentPropertyCache")) cacheCapacity = "10000"; if(cacheName != null && cacheName.equalsIgnoreCase("componentPropertyVersionIdCache")) cacheCapacity = "10000"; if(cacheName != null && cacheName.equalsIgnoreCase("componentPropertyCacheRepoGroups")) cacheCapacity = "5000"; if(cacheName != null && cacheName.equalsIgnoreCase("componentPropertyVersionIdCacheRepoGroups")) cacheCapacity = "5000"; if(cacheName != null && cacheName.equalsIgnoreCase("componentEditorCache")) cacheCapacity = "3000"; if(cacheName != null && cacheName.equalsIgnoreCase("componentEditorVersionIdCache")) cacheCapacity = "3000"; if(cacheName != null && cacheName.equalsIgnoreCase("contentVersionIdCache")) cacheCapacity = "30000"; if(cacheName != null && cacheName.equalsIgnoreCase("contentVersionCache")) cacheCapacity = "30000"; if(cacheName != null && cacheName.equalsIgnoreCase("pageComponentsCache")) cacheCapacity = "10000"; if(cacheName != null && cacheName.equalsIgnoreCase("boundContentCache")) cacheCapacity = "5000"; if(cacheName != null && cacheName.equalsIgnoreCase("childSiteNodesCache")) cacheCapacity = "20000"; if(cacheName != null && cacheName.equalsIgnoreCase("childPagesCache")) cacheCapacity = "20000"; if(cacheName != null && cacheName.equalsIgnoreCase("siteNodeCache")) cacheCapacity = "20000"; if(cacheName != null && cacheName.equalsIgnoreCase("contentCache")) cacheCapacity = "20000"; if(cacheName != null && cacheName.equalsIgnoreCase("latestSiteNodeVersionCache")) cacheCapacity = "20000"; if(cacheName != null && cacheName.equalsIgnoreCase("pageDeliveryMetaDataCache")) cacheCapacity = "50000"; /* if(cacheCapacity.length() > 4) cacheCapacity = "10000"; */ /* if(cacheName != null && (cacheName.equalsIgnoreCase("contentAttributeCache_Title") || cacheName.equalsIgnoreCase("contentAttributeCache_NavigationTitle") || cacheName.equalsIgnoreCase("contentAttributeCache_hideInNavigation") || cacheName.equalsIgnoreCase("contentAttributeCache_SortOrder"))) { cacheCapacity = "100000"; } */ if(cacheCapacity != null && !cacheCapacity.equals("")) { Properties p = new Properties(); String cacheAlgorithm = (String)cacheSettings.get("CACHE_ALGORITHM_" + cacheName); if(cacheAlgorithm == null || cacheAlgorithm.equals("")) p.setProperty(AbstractCacheAdministrator.CACHE_ALGORITHM_KEY, "com.opensymphony.oscache.base.algorithm.ImprovedLRUCache"); else p.setProperty(AbstractCacheAdministrator.CACHE_ALGORITHM_KEY, cacheAlgorithm); //p.setProperty(AbstractCacheAdministrator.CACHE_ALGORITHM_KEY, "com.opensymphony.oscache.base.algorithm.LRUCache"); p.setProperty(AbstractCacheAdministrator.CACHE_CAPACITY_KEY, cacheCapacity); cacheAdministrator = new GeneralCacheAdministrator(p); } else { cacheAdministrator = new GeneralCacheAdministrator(); } CacheEntryEventListenerImpl cacheEntryEventListener = new ExtendedCacheEntryEventListenerImpl(); CacheMapAccessEventListenerImpl cacheMapAccessEventListener = new CacheMapAccessEventListenerImpl(); cacheAdministrator.getCache().addCacheEventListener(cacheEntryEventListener, CacheEntryEventListener.class); cacheAdministrator.getCache().addCacheEventListener(cacheMapAccessEventListener, CacheMapAccessEventListener.class); caches.put(cacheName, cacheAdministrator); //locksCache.put(cacheName, new ReentrantReadWriteLock()); } GeneralCacheAdministrator cacheAdministrator = (GeneralCacheAdministrator)caches.get(cacheName); //if(cacheName.startsWith("contentAttribute")/* || cacheName.startsWith("contentVersionIdCache")*/) // useGroups = false; //boolean containsSelectiveCacheUpdateNonApplicable = false; if(groups != null) { List<String> groupCandidateListStandard = new ArrayList<String>(); List<String> groupCandidateListSpecial = new ArrayList<String>(); for(int i=0; i<groups.length; i++) { if(groups[i].startsWith("content") || groups[i].startsWith("siteNode")) groupCandidateListStandard.add(groups[i]); else groupCandidateListSpecial.add(groups[i]); } if(!groupCandidateListSpecial.contains("selectiveCacheUpdateNonApplicable")) { groupCandidateListSpecial.addAll(groupCandidateListStandard); } String[] newGroups = new String[groupCandidateListSpecial.size()]; groups = groupCandidateListSpecial.toArray(newGroups); } if(logger.isInfoEnabled() && cacheName.equalsIgnoreCase("pageCacheExtra")) { logger.info("real groups: " + (groups == null ? "null" : groups.length)); if(groups != null) { for(String group : groups) logger.info(group + ","); } } //Kanske tillbaka om minnet sticker if(cacheName.equals("componentPropertyCache") || cacheName.equals("componentPropertyVersionIdCache")) { //logger.error("Skipping useGroups on " + cacheName + ". Groups was:" + groups.length + " for " + key); useGroups = false; } /* if(cacheName.equals("componentPropertyCache") || cacheName.equals("componentPropertyVersionIdCache")) { //logger.error("Skipping useGroups on " + cacheName + ". Groups was:" + groups.length + " for " + key); useGroups = false; } */ /* if(cacheName.startsWith("pageCache")) { //logger.error("Skipping useGroups on pageCache. Groups was:" + groups.length + " for " + key); useGroups = false; } */ //TODO if(CmsPropertyHandler.getUseSynchronizationOnCaches()) { synchronized(cacheAdministrator) //Back { try { if(useGroups) { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value, groups); else cacheAdministrator.putInCache(key.toString(), value, groups); } else { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value); else cacheAdministrator.putInCache(key.toString(), value); } } catch (Exception e) { logger.warn("Error putting in cache:" + e.getMessage()); } //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Putting object in " + cacheName, t.getElapsedTime()); } } else { try { if(useGroups) { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value, groups); else cacheAdministrator.putInCache(key.toString(), value, groups); } else { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value); else cacheAdministrator.putInCache(key.toString(), value); } } catch (Exception e) { logger.warn("Error putting in cache:" + e.getMessage(), e); } } } // logger.info("numberOfPageCacheFiles:" + numberOfPageCacheFiles.get()); if(cacheName.equals("pageCache") && numberOfPageCacheFiles.get() > 30000) { if(logger.isInfoEnabled()) logger.info("Skipping file cache as to many files were allready there"); useFileCacheFallback = false; } //if(cacheName.equals("pageCache")) // logger.info("useFileCacheFallback:" + useFileCacheFallback + " - useGroups:" + useGroups); if(useFileCacheFallback && !useGroups) { if(logger.isInfoEnabled()) logger.info("Caching value to disk also"); String compressPageCache = CmsPropertyHandler.getCompressPageCache(); //System.out.println("Caching in file...:" + value.toString()); if(cacheName.equals("pageCache") && compressPageCache != null && compressPageCache.equals("true")) putCachedCompressedContentInFile(cacheName, key.toString(), (byte[])value); else putCachedContentInFile(cacheName, key.toString(), value.toString(), fileCacheCharEncoding); } //logger.info("Done cacheObjectInAdvancedCache"); } /* public static void printLockDebug(ReentrantReadWriteLock rwl) { System.out.println("CurrentThread hasLock: " + rwl.writeLock().isHeldByCurrentThread()); System.out.println("CurrentThread getWriteHoldCount: " + rwl.getWriteHoldCount()); System.out.println("CurrentThread getWriteHoldCount: " + rwl.getReadLockCount()); System.out.println("CurrentThread getQueueLength: " + rwl.getQueueLength()); System.out.println("CurrentThread hasQueuedThreads: " + rwl.hasQueuedThreads()); System.out.println("CurrentThread isWriteLocked: " + rwl.isWriteLocked()); } */ public static void cacheObjectInAdvancedCache(String cacheName, Object key, Object value, boolean useFileCacheFallback, boolean useMemoryCache, String fileCacheCharEncoding, Integer memoryCacheSize, boolean unlimitedDiskCache) { cacheObjectInAdvancedCache(cacheName, key, value, null, false, useFileCacheFallback, useMemoryCache, fileCacheCharEncoding, memoryCacheSize, unlimitedDiskCache, false); } public static void cacheObjectInAdvancedCache(String cacheName, Object key, Object value, String[] groups, boolean useGroups, boolean useFileCacheFallback, boolean useMemoryCache, String fileCacheCharEncoding, Integer memoryCacheSize, boolean unlimitedDiskCache, boolean persistentCachesBetweenRestarts) { if(cacheName == null || key == null || value == null || key.toString().length() == 0) return; if(defeatCaches.get().getDefeatCache()) defeatCaches.get().setDefeatedKey("" + cacheName + "_" + key.toString()); if(logger.isInfoEnabled()) { logger.info("cacheName: " + cacheName); logger.info("key: " + key); logger.info("useFileCacheFallback: " + useFileCacheFallback); logger.info("useMemoryCache: "+ useMemoryCache); logger.info("fileCacheCharEncoding: "+ fileCacheCharEncoding); logger.info("memoryCacheSize: "+ memoryCacheSize); logger.info("unlimitedDiskCache: "+ unlimitedDiskCache); logger.info("persistentCachesBetweenRestarts: "+ persistentCachesBetweenRestarts); } if(!caches.containsKey(cacheName)) { GeneralCacheAdministrator cacheAdministrator = null; Properties p = new Properties(); p.setProperty(AbstractCacheAdministrator.CACHE_MEMORY_KEY, Boolean.toString(useMemoryCache)); p.setProperty(AbstractCacheAdministrator.CACHE_DISK_UNLIMITED_KEY, Boolean.toString(unlimitedDiskCache)); p.setProperty(AbstractCacheAdministrator.CACHE_CAPACITY_KEY, "" + memoryCacheSize); p.setProperty(AbstractCacheAdministrator.CACHE_PERSISTENCE_OVERFLOW_KEY, Boolean.toString(useFileCacheFallback)); p.setProperty(AbstractCacheAdministrator.CACHE_ALGORITHM_KEY, "com.opensymphony.oscache.base.algorithm.ImprovedLRUCache"); p.setProperty("cache.persistence.class", "com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener"); p.setProperty("cache.path", CmsPropertyHandler.getDigitalAssetPath() + File.separator + (persistentCachesBetweenRestarts ? "persistentCaches" : "caches") + File.separator + cacheName); cacheAdministrator = new GeneralCacheAdministrator(p); //Adding one entry just to get the disk cache active if(useFileCacheFallback && memoryCacheSize == 1) cacheAdministrator.putInCache("dummy", "value"); //CacheEntryEventListenerImpl cacheEntryEventListener = new ExtendedCacheEntryEventListenerImpl(); //CacheMapAccessEventListenerImpl cacheMapAccessEventListener = new CacheMapAccessEventListenerImpl(); //cacheAdministrator.getCache().addCacheEventListener(cacheEntryEventListener, CacheEntryEventListener.class); //cacheAdministrator.getCache().addCacheEventListener(cacheMapAccessEventListener, CacheMapAccessEventListener.class); caches.put(cacheName, cacheAdministrator); //locksCache.put(cacheName, new ReentrantReadWriteLock()); //eventListeners.put(cacheName + "_cacheEntryEventListener", cacheEntryEventListener); //eventListeners.put(cacheName + "_cacheMapAccessEventListener", cacheMapAccessEventListener); } GeneralCacheAdministrator cacheAdministrator = (GeneralCacheAdministrator)caches.get(cacheName); if(groups != null) { List<String> groupCandidateListStandard = new ArrayList<String>(); List<String> groupCandidateListSpecial = new ArrayList<String>(); for(int i=0; i<groups.length; i++) { if(groups[i].startsWith("content") || groups[i].startsWith("siteNode")) groupCandidateListStandard.add(groups[i]); else groupCandidateListSpecial.add(groups[i]); } if(!groupCandidateListSpecial.contains("selectiveCacheUpdateNonApplicable")) { groupCandidateListSpecial.addAll(groupCandidateListStandard); } String[] newGroups = new String[groupCandidateListSpecial.size()]; groups = groupCandidateListSpecial.toArray(newGroups); } if(CmsPropertyHandler.getUseSynchronizationOnCaches()) { synchronized(cacheAdministrator) //Back { try { if(useGroups) { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value, groups); else cacheAdministrator.putInCache(key.toString(), value, groups); } else { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value); else cacheAdministrator.putInCache(key.toString(), value); } } catch (Exception e) { logger.warn("Error putting in cache:" + e.getMessage()); } } } else { try { if(useGroups) { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value, groups); else cacheAdministrator.putInCache(key.toString(), value, groups); } else { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.putInCache("" + key.toString().hashCode(), value); else cacheAdministrator.putInCache(key.toString(), value); } } catch (Exception e) { logger.warn("Error putting in cache:" + e.getMessage(), e); } } //logger.info("Done cacheObjectInAdvancedCache"); } public static Object getCachedObjectFromAdvancedCache(String cacheName, String key) { return getCachedObjectFromAdvancedCache(cacheName, key, false, "UTF-8", false); } public static Object getCachedObjectFromAdvancedCache(String cacheName, String key, boolean useFileCacheFallback, String fileCacheCharEncoding, boolean cacheFileResultInMemory) { if(cacheName == null || key == null || key.length() == 0) return null; if(getDefeatCaches().getDefeatCache("" + cacheName + "_" + key)) return null; Object value = null; boolean stopUseFileCacheFallback = false; //synchronized(caches) //{ GeneralCacheAdministrator cacheAdministrator = (GeneralCacheAdministrator)caches.get(cacheName); if(cacheAdministrator != null) { //TODO if(CmsPropertyHandler.getUseSynchronizationOnCaches()) { synchronized(cacheAdministrator) //Back { try { if(CmsPropertyHandler.getUseHashCodeInCaches()) value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache("" + key.hashCode(), CacheEntry.INDEFINITE_EXPIRY); else value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache(key, CacheEntry.INDEFINITE_EXPIRY); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting from cache on " + cacheName, t.getElapsedTime()); } catch (NeedsRefreshException nre) { if(useFileCacheFallback && nre.getCacheContent() != null) { stopUseFileCacheFallback = true; } try { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.cancelUpdate("" + key.hashCode()); else cacheAdministrator.cancelUpdate(key); } catch (Exception e) { logger.error("Error:" + e.getMessage()); } //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting object 3 part 2 from " + cacheName, t.getElapsedTime()); } } } else { try { if(CmsPropertyHandler.getUseHashCodeInCaches()) value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache("" + key.hashCode(), CacheEntry.INDEFINITE_EXPIRY); else value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache(key, CacheEntry.INDEFINITE_EXPIRY); } catch (NeedsRefreshException nre) { if(useFileCacheFallback && nre.getCacheContent() != null) { stopUseFileCacheFallback = true; } try { if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.cancelUpdate("" + key.hashCode()); else cacheAdministrator.cancelUpdate(key); } catch (Exception e) { logger.error("Error:" + e.getMessage()); } } } } if(value == null && useFileCacheFallback && !stopUseFileCacheFallback) { Timer t = new Timer(); if(logger.isInfoEnabled()) logger.info("Getting cache content from file.."); value = getCachedContentFromFile(cacheName, key, fileCacheCharEncoding); if(value != null && cacheFileResultInMemory) { if(logger.isInfoEnabled()) logger.info("Got cached content from file as it did not exist in memory...:" + value.toString().length()); if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheObjectInAdvancedCache(cacheName, "" + key.hashCode(), value); else cacheObjectInAdvancedCache(cacheName, key, value); } RequestAnalyser.getRequestAnalyser().registerComponentStatistics("File cache", t.getElapsedTime()); } //} return value; } public static Object getCachedObjectFromAdvancedCache(String cacheName, String key, boolean useFileCacheFallback, String fileCacheCharEncoding, boolean cacheFileResultInMemory, Object o, Method m, Object[] args, PageInvoker pageInvoker) throws Exception { if(cacheName == null || key == null || key.length() == 0) return null; Object value = null; String pageKey = key; //if(CmsPropertyHandler.getUseHashCodeInCaches()) // pageKey = "" + key.hashCode(); GeneralCacheAdministrator cacheAdministrator = (GeneralCacheAdministrator)caches.get(cacheName); if(cacheAdministrator == null) { Map cacheSettings = (Map)getCachedObject("serverNodePropertiesCacheSettings", "cacheSettings"); if(cacheSettings == null) { cacheSettings = CmsPropertyHandler.getCacheSettings(); cacheObject("serverNodePropertiesCacheSettings", "cacheSettings", cacheSettings); } String cacheCapacity = "20000"; String cacheCapacityProperty = (String)cacheSettings.get("CACHE_CAPACITY_" + cacheName); if(cacheCapacityProperty != null && !cacheCapacityProperty.equals("")) cacheCapacity = cacheCapacityProperty; if(cacheCapacity != null && !cacheCapacity.equals("")) { Properties p = new Properties(); logger.info("Creating cache " + cacheName + " with:" + cacheCapacity); p.setProperty(AbstractCacheAdministrator.CACHE_ALGORITHM_KEY, "com.opensymphony.oscache.base.algorithm.ImprovedLRUCache"); p.setProperty(AbstractCacheAdministrator.CACHE_CAPACITY_KEY, cacheCapacity); cacheAdministrator = new GeneralCacheAdministrator(p); } else { cacheAdministrator = new GeneralCacheAdministrator(); logger.info("Creating cache without limit" + cacheName); } if(cacheAdministrator.getCache().cacheMap instanceof ImprovedLRUCache) ((ImprovedLRUCache)cacheAdministrator.getCache().cacheMap).setIsPageCache(true); CacheEntryEventListenerImpl cacheEntryEventListener = new ExtendedCacheEntryEventListenerImpl(); CacheMapAccessEventListenerImpl cacheMapAccessEventListener = new CacheMapAccessEventListenerImpl(); cacheAdministrator.getCache().addCacheEventListener(cacheEntryEventListener, CacheEntryEventListener.class); cacheAdministrator.getCache().addCacheEventListener(cacheMapAccessEventListener, CacheMapAccessEventListener.class); caches.put(cacheName, cacheAdministrator); //locksCache.put(cacheName, new ReentrantReadWriteLock()); } if(logger.isInfoEnabled()) logger.info("Getting from file: " + pageKey); Object pageCacheFileName = getCachedObjectFromAdvancedCache(cacheName, pageKey, CacheEntry.INDEFINITE_EXPIRY); if(logger.isInfoEnabled()) logger.info("pageCacheFileName:" + pageCacheFileName + " from " + cacheName + " and key: " + pageKey); if(pageCacheFileName != null && !pageCacheFileName.equals("")) value = PageCacheHelper.getInstance().getCachedPageString(pageKey, new File(pageCacheFileName.toString())); else logger.info("No page file name in memory cache:" + pageKey); //System.out.println("value:" + value); //value = getCachedObjectFromAdvancedCache(cacheName, pageKey, CacheEntry.INDEFINITE_EXPIRY); if(value == null) { logger.info("Invoking:" + cacheName); String result = (String)m.invoke(o, args); logger.info("result:" + (result == null ? "null" : result.length())); value = result; if(result != null) { cacheNewResult(pageInvoker, cacheAdministrator, pageKey, result); } value = result; } if(value != null && value instanceof byte[]) value = compressionHelper.decompress((byte[])value); return value; } public static Map<String,Object> getCachedObjectsFromAdvancedCacheFilteredOnKeyEnd(String cacheName, String keyNameFilter) { if(cacheName == null) return null; if(getDefeatCaches().getDefeatCache()) return null; Map<String,Object> cachedValues = new HashMap<String,Object>(); GeneralCacheAdministrator cacheAdministrator = (GeneralCacheAdministrator)caches.get(cacheName); if(cacheAdministrator != null) { synchronized(cacheAdministrator) //Back { try { if(cacheAdministrator != null) { for(String key : (Set<String>)cacheAdministrator.getCache().cacheMap.keySet()) { if(key.toString().endsWith(keyNameFilter)) { try { cachedValues.put(key, cacheAdministrator.getCache().getFromCache(key)); } catch (NeedsRefreshException nre) { logger.info("Stale cache entry"); cacheAdministrator.cancelUpdate(key); } } } } } catch (Exception e) { logger.error("Problem getting all cache keys and values:" + e.getMessage(), e); } } } return cachedValues; } private static boolean cacheNewResult(PageInvoker pageInvoker, GeneralCacheAdministrator cacheAdministrator, String pageKey, String value) { /* int argumentCount = StringUtils.countMatches(pageKey, "&"); if(argumentCount > 4) { logger.error("Skipping caching as we don't cache url:s with more than 3 params:" + pageKey); return false; } argumentCount = StringUtils.countMatches(pageKey, "/"); if(argumentCount > 7) { logger.error("Skipping caching as we don't cache url:s with more than 7 slashes:" + pageKey); return false; } */ boolean isCached = false; String pageCacheExtraName = "pageCacheExtra"; if(!pageInvoker.getTemplateController().getIsPageCacheDisabled() && !pageInvoker.getDeliveryContext().getDisablePageCache()) //Caching page if not disabled { Integer newPageCacheTimeout = pageInvoker.getDeliveryContext().getPageCacheTimeout(); if(newPageCacheTimeout == null) newPageCacheTimeout = pageInvoker.getTemplateController().getPageCacheTimeout(); //String[] allUsedEntitiesCopy = pageInvoker.getDeliveryContext().getAllUsedEntities().clone(); List<String> allUsedEntitiesSet = pageInvoker.getDeliveryContext().getAllUsedEntitiesAsSet(); //String[] allUsedEntitiesCopy = allUsedEntitiesSet.toArray(new String[0]); //System.out.println("allUsedEntitiesSet:" + allUsedEntitiesSet.size()); String pageCacheExclusionsRegexp = null; Integer pageCacheMaxGroups = 500; try { Map cacheSettings = CmsPropertyHandler.getCacheSettings(); //System.out.println("cacheSettings:" + cacheSettings); if(cacheSettings != null) { pageCacheExclusionsRegexp = (String)cacheSettings.get("PAGE_CACHE_EXCLUSIONS"); String pageCacheMaxGroupsString = (String)cacheSettings.get("PAGE_CACHE_MAX_GROUPS"); if(pageCacheMaxGroupsString != null) pageCacheMaxGroups = new Integer(pageCacheMaxGroupsString); if(pageCacheExclusionsRegexp != null && !pageCacheExclusionsRegexp.equals("")) pattern = Pattern.compile(pageCacheExclusionsRegexp); } } catch (Exception e) { logger.warn("cacheSettings was null:" + e.getMessage(), e); } if(logger.isInfoEnabled()) { logger.info("pageCacheExclusionsRegexp:" + pageCacheExclusionsRegexp); logger.info("pageCacheMaxGroups:" + pageCacheMaxGroups); } boolean detailedRelations = true; if(allUsedEntitiesSet.size() > pageCacheMaxGroups) detailedRelations = false; //System.out.println("detailedRelations:" + detailedRelations); //System.out.println("allUsedEntitiesSet:" + allUsedEntitiesSet.size()); Object extraData = pageInvoker.getDeliveryContext().getExtraData(); List<String> allUsedEntitiesFilteredCopy = new ArrayList<String>(); for(String s : allUsedEntitiesSet) { if(detailedRelations) { if(s.startsWith("content_") && s.indexOf("_", 8) > -1) { //allUsedEntitiesFilteredCopy.add(getPooledString(s.hashCode())); allUsedEntitiesFilteredCopy.add(s); //(getPooledString(s.hashCode())); //System.out.println("Added: " + s); } else if(s.startsWith("siteNode_")) allUsedEntitiesFilteredCopy.add(s); else if(s.startsWith("selectiveCacheUpdateNonApplicable")) allUsedEntitiesFilteredCopy.add(s); } else { if(s.startsWith("content_") && s.indexOf("_", 8) == -1) { allUsedEntitiesFilteredCopy.add(s); //allUsedEntitiesFilteredCopy.add(s); //getPooledString(s.hashCode())); //System.out.println("Added: " + s); } else if(s.startsWith("siteNode_")) allUsedEntitiesFilteredCopy.add(s); else if(s.startsWith("selectiveCacheUpdateNonApplicable")) allUsedEntitiesFilteredCopy.add(s); } } //System.out.println("allUsedEntitiesFilteredCopy:" + allUsedEntitiesFilteredCopy.size()); try { logger.info("pageCacheExclusionsRegexp:" + pageCacheExclusionsRegexp); logger.info("pageCacheMaxGroups:" + pageCacheMaxGroups); if(pattern != null) { Matcher matcher = pattern.matcher(pageKey); if(matcher.find()) { logger.info("Skipping caching key 1:" + pageKey); return false; } if(pageCacheMaxGroups != null && !pageCacheMaxGroups.equals("") && allUsedEntitiesFilteredCopy.size() > pageCacheMaxGroups) { logger.info("Skipping caching key 2:" + pageKey); return false; } matcher.reset(); } } catch (Exception e) { logger.warn("cacheSettings was null:" + e.getMessage(), e); } String[] allUsedEntitiesCopy = allUsedEntitiesFilteredCopy.toArray(new String[0]); //System.out.println("allUsedEntitiesCopy:" + allUsedEntitiesCopy.length); logger.info("allUsedEntitiesCopy:" + allUsedEntitiesCopy.length); logger.info("Caching:" + pageKey); synchronized (cacheAdministrator) { byte[] compressedData = compressionHelper.compress(value); //logger.info("Compressing page for pageCache took " + (System.currentTimeMillis() - startCompression) + " with a compressionFactor of " + (this.pageString.length() / compressedData.length)); if(pageInvoker.getTemplateController().getOperatingMode().intValue() == 3 && !CmsPropertyHandler.getLivePublicationThreadClass().equalsIgnoreCase("org.infoglue.deliver.util.SelectiveLivePublicationThread")) { PageCacheHelper.getInstance().cachePageString(pageKey, compressedData); //cacheAdministrator.putInCache(pageKey, compressedData, allUsedEntitiesCopy); isCached = true; //CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey, extraData, allUsedEntitiesCopy, false); //CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey + "_pageCacheTimeout", newPageCacheTimeout, allUsedEntitiesCopy, false); } else { //FIX THE part above as well //System.out.println("Caching in pageCache"); PageCacheHelper.getInstance().cachePageString(pageKey, compressedData); //cacheAdministrator.putInCache(pageKey, compressedData, allUsedEntitiesCopy); isCached = true; /* if(pageInvoker.getTemplateController().getHttpServletRequest().getParameter("listMostUsed") != null) { System.out.println("These contents were used before:" + ContentDeliveryController.mostUsedContentIds.size()); Map<Integer,Integer> contentIds = ContentDeliveryController.mostUsedContentIds; for(Integer contentId : contentIds.keySet()) { if(contentIds.get(contentId) > 3) System.out.println("" + contentId + ":" + contentIds.get(contentId)); } } */ if(pageInvoker.getTemplateController().getHttpServletRequest().getParameter("listEntities") != null) { List<String> debug = Arrays.asList(allUsedEntitiesCopy); Collections.sort(debug); for(String s : debug) { System.out.println("s:" + s); } } CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey, extraData, null, false); CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey + "_pageCacheTimeout", newPageCacheTimeout, null, false); //CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey + "_entities", allUsedEntitiesCopy, null, false); String allUsedEntitiesCopyAsString = StringUtils.join(allUsedEntitiesCopy, "|"); if(logger.isInfoEnabled()) { logger.info("pageKey:" + pageKey); logger.info("allUsedEntitiesCopyAsString:" + allUsedEntitiesCopyAsString); } if(CmsPropertyHandler.getOperatingMode().equals("0")) { CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey + "_entitiesAsByte", allUsedEntitiesCopyAsString); } else { byte[] compressedAllUsedEntitiesCopyAsString = compressionHelper.compress(allUsedEntitiesCopyAsString); CacheController.cacheObjectInAdvancedCache(pageCacheExtraName, pageKey + "_entitiesAsByte", compressedAllUsedEntitiesCopyAsString); } } } } else { if(logger.isInfoEnabled()) logger.info("Page caching was disabled for the page " + pageInvoker.getDeliveryContext().getSiteNodeId() + " with pageKey " + pageInvoker.getDeliveryContext().getPageKey() + " - modifying the logic to enable page caching would boast performance."); } return isCached; } public static Object getCachedObjectFromAdvancedCache(String cacheName, String key, int updateInterval) { return getCachedObjectFromAdvancedCache(cacheName, key, updateInterval, false, "UTF-8", false); } public static Object getCachedObjectFromAdvancedCache(String cacheName, String key, int updateInterval, boolean useFileCacheFallback, String fileCacheCharEncoding, boolean cacheFileResultInMemory) { if(cacheName == null || key == null) return null; if(getDefeatCaches().getDefeatCache("" + cacheName + "_" + key)) return null; //logger.info("getCachedObjectFromAdvancedCache start:" + cacheName + ":" + key + ":" + updateInterval); //return getCachedObject(cacheName, key); Object value = null; boolean stopUseFileCacheFallback = false; //synchronized(caches) //{ GeneralCacheAdministrator cacheAdministrator = (GeneralCacheAdministrator)caches.get(cacheName); if(cacheAdministrator != null) { //TODO if(CmsPropertyHandler.getUseSynchronizationOnCaches()) { try { if(CmsPropertyHandler.getUseHashCodeInCaches()) value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache("" + key.hashCode(), updateInterval); else value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache(key, updateInterval); } catch (NeedsRefreshException nre) { if(useFileCacheFallback && nre.getCacheContent() != null) { stopUseFileCacheFallback = true; } if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.cancelUpdate("" + key.hashCode()); else cacheAdministrator.cancelUpdate(key); } } else { try { if(CmsPropertyHandler.getUseHashCodeInCaches()) value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache("" + key.hashCode(), updateInterval); else value = (cacheAdministrator == null) ? null : cacheAdministrator.getFromCache(key, updateInterval); } catch (NeedsRefreshException nre) { if(useFileCacheFallback && nre.getCacheContent() != null) { stopUseFileCacheFallback = true; } if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheAdministrator.cancelUpdate("" + key.hashCode()); else cacheAdministrator.cancelUpdate(key); } } if(useFileCacheFallback && !stopUseFileCacheFallback) { if(logger.isInfoEnabled()) logger.info("Getting cache content from file.."); value = getCachedContentFromFile(cacheName, key, updateInterval, fileCacheCharEncoding); if(value != null && cacheFileResultInMemory) { if(logger.isInfoEnabled()) logger.info("Got cached content from file as it did not exist in memory...:" + value.toString().length()); if(CmsPropertyHandler.getUseHashCodeInCaches()) cacheObjectInAdvancedCache(cacheName, "" + key.hashCode(), value); else cacheObjectInAdvancedCache(cacheName, key, value); } } } //} return value; } /** * This method let's you get a list of caches and entries in which the given entity is located. * @param entityName * @param entityId * @throws Exception */ public static String debugCache(String entityName, String entityId, String cacheNamesToDebug, String forceClear) throws Exception { StringBuffer debug = new StringBuffer(); if(entityName.equalsIgnoreCase("content")) entityName = "content"; if(entityName.equalsIgnoreCase("sitenode")) entityName = "siteNode"; logger.error("Debugging " + entityName + "=" + entityId + " (" + cacheNamesToDebug + ")" + " - forceClear:" + forceClear); /* Boolean isEntityPublicationProcessed = false; try { isEntityPublicationProcessed = PublicationController.getController().getIsEntityPublicationProcessed(entityName, entityId); System.out.println("isEntityPublicationProcessed: " + isEntityPublicationProcessed); } catch (Exception e) { e.printStackTrace(); } */ if(cacheNamesToDebug == null || cacheNamesToDebug.equals("")) cacheNamesToDebug = "contentVersionCache,contentVersionIdCache,contentCache,matchingContentsCache,pageCache,pageCacheExtra"; logger.info("cacheNamesToDebug:" + cacheNamesToDebug); Set<String> pageCacheNotifications = new HashSet<String>(); List<String[]> entriesToClear = new ArrayList<String[]>(); String[] cacheNamesToDebugArray = cacheNamesToDebug.split(","); List<String> cacheNamesToDebugList = Arrays.asList(cacheNamesToDebugArray); synchronized(caches) { for (Iterator i = caches.entrySet().iterator(); i.hasNext(); ) { Map.Entry e = (Map.Entry) i.next(); String cachName = (String)e.getKey(); //System.out.println("Cache: " + cachName); if(cacheNamesToDebugList.contains(cachName)) { //debug.append("Checked: " + cachName + ","); Object object = e.getValue(); if(object instanceof Map) { Map cacheInstance = (Map)e.getValue(); synchronized(cacheInstance) { Set<Map.Entry<String,Object>> entrySet = cacheInstance.entrySet(); logger.info("entrySet:" + entrySet.size()); Iterator<Map.Entry<String,Object>> entrySetIterator = entrySet.iterator(); while(entrySetIterator.hasNext()) { Map.Entry<String,Object> entry = entrySetIterator.next(); if(entry.getKey().toLowerCase().contains(entityName.toLowerCase()) || entry.getKey().contains("selectiveCacheUpdateNonApplicable")) { debug.append("" + cachName + "=" + entry.getKey() + ","); entriesToClear.add(new String[]{cachName, entry.getKey()}); } } } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)e.getValue(); synchronized(cacheInstance) { pageCacheNotifications.add(entityName + "_" + entityId); Set<String> entries = cacheInstance.getCache().getGroup(entityName + "_" + entityId); logger.info("entries:" + entries.size()); for(String entry : entries) { //debug.append("" + cachName + "=" + entry + ","); entriesToClear.add(new String[]{cachName, entry}); } try { pageCacheNotifications.add("selectiveCacheUpdateNonApplicable"); if(entityName.toLowerCase().equals("content")) { List<ContentTypeDefinitionVO> contentTypeDefinitionVOList = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOList(); for(ContentTypeDefinitionVO ctdVO : contentTypeDefinitionVOList) { //System.out.println("Group:" + "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + ctdVO.getId()); Set<String> selectiveCacheUpdateNonApplicableEntries = cacheInstance.getCache().getGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + ctdVO.getId()); for(String entry : selectiveCacheUpdateNonApplicableEntries) { //debug.append("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + ctdVO.getId() + "/" + cachName + "=" + entry + ","); //debug.append("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + ctdVO.getId() + ","); entriesToClear.add(new String[]{cachName, entry}); pageCacheNotifications.add("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + ctdVO.getId()); } } } Set<String> selectiveCacheUpdateNonApplicableEntries = cacheInstance.getCache().getGroup("selectiveCacheUpdateNonApplicable"); for(String entry : selectiveCacheUpdateNonApplicableEntries) { //debug.append("selectiveCacheUpdateNonApplicable: " + cachName + "=" + entry + ","); entriesToClear.add(new String[]{cachName, entry}); pageCacheNotifications.add("selectiveCacheUpdateNonApplicable"); } } catch (Exception e2) { e2.printStackTrace(); } } } } else logger.info("Skipping cache:" + cachName); } } if(forceClear != null && forceClear.equalsIgnoreCase("true")) { logger.info("********** Clearing caches *********"); String entityNameFull = ContentImpl.class.getName(); if(entityName.toLowerCase().contains("sitenode")) entityNameFull = SiteNodeImpl.class.getName(); CacheController.clearCaches(entityNameFull, entityId, null); } for(String[] clearEntries : entriesToClear) { debug.append("" + clearEntries[0] + "=" + clearEntries[1] + ","); if(forceClear != null && forceClear.equalsIgnoreCase("true")) { clearCacheHard(clearEntries[0], clearEntries[1]); } } for(String pageCacheNotification : pageCacheNotifications) { logger.info("Asking page cache to clear on: " + pageCacheNotification); debug.append("PageCache: " + pageCacheNotification + ","); if(forceClear != null && forceClear.equalsIgnoreCase("true")) PageCacheHelper.getInstance().notify(pageCacheNotification); } if(forceClear != null && forceClear.equalsIgnoreCase("true")) System.out.println("************************************"); if(entityName.contains("siteNode")) { SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(entityId)); if(siteNodeVO != null && siteNodeVO.getMetaInfoContentId() != null) { debug.append(debugCache("Content", siteNodeVO.getMetaInfoContentId().toString(), cacheNamesToDebug, forceClear)); } } return debug.toString(); } public static void clearCachesStartingWith(String cacheNamePrefix) { Set keySet = new HashSet(); keySet.addAll(caches.keySet()); Iterator cachesIterator = keySet.iterator(); while(cachesIterator.hasNext()) { String cacheName = (String)cachesIterator.next(); if(cacheName.startsWith(cacheNamePrefix)) clearCache(cacheName); } } public static void clearUserAccessCache(String accessRightKey) { if(caches.containsKey("userAccessCache")) { Object object = caches.get("userAccessCache"); Map cacheInstance = (Map)object; synchronized(cacheInstance) { for(Object personalCache : cacheInstance.values()) { //System.out.println("personalCache:" + personalCache); if(personalCache instanceof Map) { //System.out.println("personalCache contains:" + ((Map)personalCache).containsKey(accessRightKey)); //((Map) personalCache).remove(accessRightKey); ((Map) personalCache).put(accessRightKey, -1); //System.out.println("personalCache contains after:" + ((Map)personalCache).containsKey(accessRightKey)); } } } logger.info("clearCache stop..."); } } public static int getCacheSize(String cacheName) { int cacheSize = 0; synchronized(caches) { if(caches.containsKey(cacheName)) { Object object = caches.get(cacheName); if(object instanceof Map) { Map cacheInstance = (Map)object; synchronized(cacheInstance) { cacheSize = cacheInstance.size(); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)object; synchronized(cacheInstance) //Back { /* Timer t = new Timer(); ReentrantReadWriteLock rwl = locksCache.get(cacheName); boolean lockSuccess = false; try { System.out.println("YAAAAAAAAAAAAA 2"); lockSuccess = rwl.readLock().tryLock(readLockTimeout, TimeUnit.SECONDS); } catch (InterruptedException e1) { RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Error getting lock in getCacheSize on " + cacheName, t.getElapsedTime()); printLockDebug(rwl); return 0; } //rwl.readLock().lock(); try { if(!lockSuccess) { RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Timeout getting lock in getCacheSize on " + cacheName, t.getElapsedTime()); return 0; } */ cacheSize = cacheInstance.getCache().getSize(); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting getCacheSize on " + cacheName, t.getElapsedTime()); } /* finally { if(lockSuccess) rwl.readLock().unlock(); } */ } } } return cacheSize; } public static void clearCache(String cacheName) { logger.info("Clearing the cache called " + cacheName); synchronized(caches) { if(caches.containsKey(cacheName)) { Object object = caches.get(cacheName); if(object instanceof Map) { Map cacheInstance = (Map)object; synchronized(cacheInstance) { cacheInstance.clear(); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)object; synchronized(cacheInstance) //Back { /* Timer t = new Timer(); ReentrantReadWriteLock rwl = locksCache.get(cacheName); boolean lockSuccess = false; try { lockSuccess = rwl.writeLock().tryLock(writeLockTimeout, TimeUnit.SECONDS); printLockDebug(rwl); } catch (InterruptedException e1) { return; } //rwl.writeLock().lock(); try { if(!lockSuccess) { printLockDebug(rwl); return; } RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting lock for flushing " + cacheName, t.getElapsedTime()); */ cacheInstance.flushAll(); cacheInstance.destroy(); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Flushing " + cacheName, t.getElapsedTime()); } /* finally { if(lockSuccess) rwl.writeLock().unlock(); } */ } caches.remove(cacheName); logger.info("clearCache stop..."); } } } public static void flushCache(String cacheName) { logger.info("Flushing the cache called " + cacheName); synchronized(caches) { if(caches.containsKey(cacheName)) { Object object = caches.get(cacheName); if(object instanceof Map) { Map cacheInstance = (Map)object; synchronized(cacheInstance) { cacheInstance.clear(); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)object; synchronized(cacheInstance) //Back { /* Timer t = new Timer(); ReentrantReadWriteLock rwl = locksCache.get(cacheName); boolean lockSuccess = false; try { System.out.println("ddddddddddddddddddd"); lockSuccess = rwl.writeLock().tryLock(writeLockTimeout, TimeUnit.SECONDS); } catch (InterruptedException e1) { printLockDebug(rwl); return; } //rwl.writeLock().lock(); try { if(!lockSuccess) { printLockDebug(rwl); return; } RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting lock for flushing " + cacheName, t.getElapsedTime()); */ cacheInstance.flushAll(); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Flushing " + cacheName, t.getElapsedTime()); } /* finally { if(lockSuccess) rwl.writeLock().unlock(); } */ } //caches.remove(cacheName); //eventListeners.remove(cacheName + "_cacheEntryEventListener"); //eventListeners.remove(cacheName + "_cacheMapAccessEventListener"); logger.info("clearCache stop..."); } } } public static void clearCache(String cacheName, String key) { //synchronized(caches) //{ if(caches.containsKey(cacheName)) { Object object = caches.get(cacheName); if(object instanceof Map) { Map cacheInstance = (Map)object; synchronized(cacheInstance) { cacheInstance.remove(key); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)object; synchronized(cacheInstance) //Back { cacheInstance.flushEntry(key); } } } //} } public static void clearCacheHard(String cacheName, String key) { if(caches.containsKey(cacheName)) { Object object = caches.get(cacheName); if(object instanceof Map) { Map cacheInstance = (Map)object; synchronized(cacheInstance) { cacheInstance.remove(key); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)object; synchronized(cacheInstance) //Back { //cacheInstance.flushEntry(key); cacheInstance.removeEntry(key); } } } } /** * This method clears part of a cache. * @param cacheName * @param groups */ public static void clearCacheForGroup(String cacheName, String group) { /* if(cacheName.indexOf("pageCache") > -1) Thread.dumpStack(); */ synchronized(caches) { if(caches.containsKey(cacheName)) { Object object = caches.get(cacheName); if(object instanceof Map) { Map cacheInstance = (Map)object; synchronized(cacheInstance) { cacheInstance.clear(); logger.info("Clearing full cache:" + cacheName + " - the call wanted partly clear for [" + group + "] but the cache was a Map."); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)object; synchronized(cacheInstance) //Back { /* Timer t = new Timer(); ReentrantReadWriteLock rwl = locksCache.get(cacheName); boolean lockSuccess = false; try { System.out.println("YEEEEEEEEEEEEEEEEEAAAAAAH"); lockSuccess = rwl.writeLock().tryLock(writeLockTimeout, TimeUnit.SECONDS); printLockDebug(rwl); } catch (InterruptedException e1) { return; } //rwl.writeLock().lock(); try { if(!lockSuccess) { return; } RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting lock for flushGroup in " + cacheName, t.getElapsedTime()); */ cacheInstance.flushGroup(group); // RequestAnalyser.getRequestAnalyser().registerComponentStatistics("FlushGroup on " + cacheName, t.getElapsedTime()); } /* finally { if(lockSuccess) rwl.writeLock().unlock(); } */ } } } } /** * This method clears part of a cache. * @param cacheName * @param groups */ /* public static void clearFileCacheForGroup(GeneralCacheAdministrator cacheInstance, String groupName) throws Exception { Set groupEntries = cacheInstance.getCache().cacheMap.getGroup(groupName); if(logger.isInfoEnabled()) { if(groupEntries != null) logger.info("groupEntries for " + groupName + ":" + groupEntries.size() + " in cacheInstance:" + cacheInstance); else logger.info("no groupEntries for " + groupName + " in cacheInstance:" + cacheInstance); } if (groupEntries != null) { Iterator groupEntriesIterator = groupEntries.iterator(); while (groupEntriesIterator.hasNext()) { String key = (String) groupEntriesIterator.next(); CacheEntry entry = (CacheEntry) cacheInstance.getCache().cacheMap.get(key); if(logger.isInfoEnabled()) logger.info("Removing file with key:" + key); removeCachedContentInFile("pageCache", key); numberOfPageCacheFiles.decrementAndGet(); } } } */ public static void clearCaches(String entity, String entityId, String[] cachesToSkip) throws Exception { clearCaches(entity, entityId, null, cachesToSkip, false); } public static void clearCaches(String entity, String entityId, Map<String,String> extraInformation, String[] cachesToSkip) throws Exception { clearCaches(entity, entityId, extraInformation, cachesToSkip, false); } public static void clearCaches(String entity, String entityId, Map<String,String> extraInformation, String[] cachesToSkip, boolean forceClear) throws Exception { Timer t = new Timer(); //t.setActive(false); if(CmsPropertyHandler.getOperatingMode().equals("3")) { long wait = 0; //while(true && !getForcedCacheEvictionMode()) while(!forceClear && !getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getNumberOfActiveRequests() > 0) { logger.warn("Number of requests: " + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests() + " was more than 0 - lets wait a bit."); if(wait > 1000) { logger.warn("The clearCache method waited over " + ((wait * 10) / 1000) + " seconds but there seems to be " + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests() + " requests blocking all the time. Continuing anyway."); //printThreads(); break; } if(wait > 100) setForcedCacheEvictionMode(true); Thread.sleep(10); wait++; } } logger.info("clearCaches start in " + CmsPropertyHandler.getContextRootPath()); if(entity == null) { logger.info("Clearing the caches"); //synchronized(caches) //{ for (Iterator i = caches.entrySet().iterator(); i.hasNext(); ) { Map.Entry e = (Map.Entry) i.next(); logger.info("e:" + e.getKey()); boolean skip = false; if(cachesToSkip != null) { for(int index=0; index<cachesToSkip.length; index++) { if(e.getKey().equals(cachesToSkip[index])) { skip = true; break; } } } if(!skip) { Object object = e.getValue(); if(object instanceof Map) { Map cacheInstance = (Map)e.getValue(); synchronized(cacheInstance) { cacheInstance.clear(); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)e.getValue(); synchronized(cacheInstance) { cacheInstance.flushAll(); } } logger.info("Cleared cache:" + e.getKey()); i.remove(); } } //} } else if(entity.equalsIgnoreCase("CacheNames")) { String[] cacheNames = entityId.split(","); for(int i=0; i<cacheNames.length; i++) { String cacheName = cacheNames[i]; CacheController.clearCache(cacheName); } } else { logger.info("Clearing some caches"); logger.info("entity:" + entity); String useSelectivePageCacheUpdateString = CmsPropertyHandler.getUseSelectivePageCacheUpdate(); boolean useSelectivePageCacheUpdate = false; if(useSelectivePageCacheUpdateString != null && useSelectivePageCacheUpdateString.equalsIgnoreCase("true")) useSelectivePageCacheUpdate = true; String operatingMode = CmsPropertyHandler.getOperatingMode(); TreeMap<String, Object> orderedCaches = new TreeMap<String,Object>(new CacheComparator()); orderedCaches.putAll(caches); /* for (String key : orderedCaches.keySet()) { System.out.println("key:" + key); } */ //t.printElapsedTime("Start cache eviction"); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Start cache eviction", t.getElapsedTime()); //t.printElapsedTime("START cachesLoop:" + entity + ":" + entityId); //synchronized(caches) //{ //for (Iterator i = caches.entrySet().iterator(); i.hasNext(); ) cachesLoop:for (Iterator i = orderedCaches.entrySet().iterator(); i.hasNext(); ) { RequestAnalyser.getRequestAnalyser().registerComponentStatistics("cache iteration top", t.getElapsedTime()); Map.Entry e = (Map.Entry) i.next(); logger.info("e:" + e.getKey()); boolean clear = false; boolean selectiveCacheUpdate = false; String cacheName = e.getKey().toString(); if(cachesToSkip != null) { for(int index=0; index<cachesToSkip.length; index++) { if(cacheName.equals(cachesToSkip[index])) { continue cachesLoop; } } } //t.printElapsedTime("clearCaches 3"); if(cacheName.equalsIgnoreCase("serviceDefinitionCache") && entity.indexOf("ServiceBinding") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("qualifyerListCache") && (entity.indexOf("Qualifyer") > 0 || entity.indexOf("ServiceBinding") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("availableServiceBindingCache") && entity.indexOf("AvailableServiceBinding") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("categoriesCache") && entity.indexOf("Category") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("repositoryCache") && entity.indexOf("Repository") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("languageCache") && entity.indexOf("Language") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("localeCache") && entity.indexOf("Language") > 0) { clear = true; } if((cacheName.equalsIgnoreCase("latestSiteNodeVersionCache") || cacheName.equalsIgnoreCase("pageCacheLatestSiteNodeVersions") || cacheName.equalsIgnoreCase("pageCacheSiteNodeTypeDefinition")) && entity.indexOf("SiteNode") > 0) { clear = true; selectiveCacheUpdate = true; } if((cacheName.equalsIgnoreCase("parentSiteNodeCache") || cacheName.equalsIgnoreCase("pageCacheParentSiteNodeCache")) && entity.indexOf("SiteNode") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("NavigationCache") && (entity.indexOf("SiteNode") > 0 || entity.indexOf("Content") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("pagePathCache") && (entity.indexOf("SiteNode") > 0 || entity.indexOf("Content") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("componentEditorCache") && (entity.indexOf("SiteNode") > 0 || entity.indexOf("Content") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("componentEditorVersionIdCache") && (entity.indexOf("SiteNode") > 0 || entity.indexOf("Content") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("masterLanguageCache") && (entity.indexOf("Repository") > 0 || entity.indexOf("Language") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("parentRepository") && entity.indexOf("Repository") > 0) { clear = true; } if(cacheName.startsWith("contentAttributeCache") && (entity.indexOf("Content") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.startsWith("metaInfoContentAttributeCache") && entity.indexOf("Content") > -1) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("contentVersionCache") && (entity.indexOf("Content") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.startsWith("contentVersionIdCache") && (entity.indexOf("Content") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("referencingPagesCache") && (entity.indexOf("ContentVersion") > -1 || entity.indexOf("Qualifyer") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("boundSiteNodeCache") && (entity.indexOf("ServiceBinding") > 0 || entity.indexOf("Qualifyer") > 0 || entity.indexOf("SiteNodeVersion") > 0 || entity.indexOf("SiteNodeVersion") > 0 || entity.indexOf("SiteNode") > 0 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("boundContentCache") && (entity.indexOf("ServiceBinding") > 0 || entity.indexOf("Qualifyer") > 0 || entity.indexOf("SiteNodeVersion") > 0 || entity.indexOf("ContentVersion") > 0 || entity.indexOf("Content") > 0 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; } if(cacheName.startsWith("pageCache") && entity.indexOf("Registry") == -1) { clear = true; selectiveCacheUpdate = true; } if(cacheName.startsWith("pageCacheExtra") && entity.indexOf("Registry") == -1) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("componentCache") && entity.indexOf("Registry") == -1) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("componentPropertyCache") && (entity.indexOf("SiteNode") > -1 || entity.indexOf("ContentVersion") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; //selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("componentPropertyVersionIdCache") && (entity.indexOf("SiteNode") > -1 || entity.indexOf("ContentVersion") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; //selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("componentPropertyCacheRepoGroups") && (entity.indexOf("SiteNode") > -1 || entity.indexOf("ContentVersion") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; if(entity.indexOf("SiteNode") > -1 || entity.indexOf("ContentVersion") > -1) selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("componentPropertyVersionIdCacheRepoGroups") && (entity.indexOf("SiteNode") > -1 || entity.indexOf("ContentVersion") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; if(entity.indexOf("SiteNode") > -1 || entity.indexOf("ContentVersion") > -1) selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("pageComponentsCache") && (entity.indexOf("ContentVersion") > -1 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; //selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("includeCache")) { clear = true; } if(cacheName.equalsIgnoreCase("authorizationCache") && (entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0 || entity.indexOf("Intercept") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("personalAuthorizationCache") && (entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0 || entity.indexOf("Intercept") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("componentPaletteDivCache") && (entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("userCache") && (entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("principalCache") && (entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; } if((cacheName.equalsIgnoreCase("assetUrlCache") || cacheName.equalsIgnoreCase("assetUrlCacheWithGroups") || cacheName.equalsIgnoreCase("assetThumbnailUrlCache")) && (entity.indexOf("DigitalAsset") > 0 || entity.indexOf("ContentVersion") > 0 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; if(cacheName.equalsIgnoreCase("assetUrlCacheWithGroups") && (entity.indexOf("ContentVersion") > -1 || entity.indexOf("DigitalAsset") > -1)) selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("digitalAssetCache") && (entity.indexOf("DigitalAsset") > 0 || entity.indexOf("ContentVersion") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("sortedChildContentsCache") && (entity.indexOf("Content") > 0 || entity.indexOf("ContentVersion") > 0 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("childContentCache") && (entity.indexOf("Content") > 0 || entity.indexOf("ContentVersion") > 0 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("matchingContentsCache") && (entity.indexOf("Content") > 0 || entity.indexOf("ContentVersion") > 0 || entity.indexOf("AccessRight") > 0 || entity.indexOf("SystemUser") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("Group") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("workflowCache") && entity.indexOf("WorkflowDefinition") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("rootSiteNodeCache") && entity.indexOf("SiteNode") > 0) { if(CmsPropertyHandler.getOperatingMode().equals("0")) clear = true; } if((cacheName.equalsIgnoreCase("siteNodeCache") || cacheName.equalsIgnoreCase("siteNodeVOCache")) && entity.indexOf("SiteNode") > 0) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("contentCache") && entity.indexOf("Content") > 0) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("rootContentCache") && entity.indexOf("Content") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("componentContentsCache") && entity.indexOf("Content") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("childSiteNodesCache") && (entity.indexOf("SiteNode") > 0 || entity.indexOf("ContentVersion") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("childPagesCache") && (entity.indexOf("SiteNode") > 0 || entity.indexOf("Content") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("siteNodeCacheWithLatestVersion") && entity.indexOf("SiteNode") > 0) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("propertySetCache") && entity.indexOf("SiteNode") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("groupVOListCache") && entity.indexOf("Group") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("roleListCache") && entity.indexOf("Role") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("groupPropertiesCache") && (entity.indexOf("Group") > 0 || entity.indexOf("PropertiesCategory") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("propertiesCategoryCache") && (entity.indexOf("Group") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("User") > 0 || entity.indexOf("PropertiesCategory") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("rolePropertiesCache") && entity.indexOf("Role") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("principalPropertyValueCache") && (entity.indexOf("Group") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("User") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("relatedCategoriesCache") && (entity.indexOf("Group") > 0 || entity.indexOf("Role") > 0 || entity.indexOf("User") > 0 || entity.indexOf("PropertiesCategory") > 0)) { clear = true; } if(cacheName.equalsIgnoreCase("categoryCache") && entity.indexOf("Category") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("contentCategoryCache") && entity.indexOf("ContentVersion") > 0) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("redirectCache") && entity.indexOf("Redirect") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("interceptorsCache") && entity.indexOf("Intercept") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("interceptionPointCache") && entity.indexOf("Intercept") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("siteNodeLanguageCache") && (entity.indexOf("Repository") > 0 || entity.indexOf("Language") > 0 || entity.indexOf("SiteNode") > 0)) { clear = true; selectiveCacheUpdate = true; } if(cacheName.equalsIgnoreCase("contentTypeDefinitionCache") && entity.indexOf("ContentTypeDefinition") > 0) { clear = true; } if(cacheName.equalsIgnoreCase("ServerNodeProperties")) { clear = true; } if(!cacheName.equalsIgnoreCase("serverNodePropertiesCache") && entity.equalsIgnoreCase("ServerNodeProperties")) { clear = true; } if(!cacheName.equalsIgnoreCase("encodedStringsCache") && entity.equalsIgnoreCase("ServerNodeProperties")) { clear = true; } if(logger.isInfoEnabled()) logger.info("clear:" + clear); if(clear) { if(logger.isInfoEnabled()) logger.info("clearing:" + e.getKey()); Object object = e.getValue(); String sentContentId = null; String sentParentContentId = null; String sentSiteNodeId = null; String sentParentSiteNodeId = null; String sentRepositoryId = null; String sentContentTypeDefinitionId = null; String sentContentIsProtected = null; if (extraInformation != null) { sentContentId = extraInformation.get("contentId"); sentParentContentId = extraInformation.get("parentContentId"); sentSiteNodeId = extraInformation.get("siteNodeId"); sentParentSiteNodeId = extraInformation.get("parentSiteNodeId"); sentRepositoryId = extraInformation.get("repositoryId"); sentContentTypeDefinitionId = extraInformation.get("contentTypeDefinitionId"); sentContentIsProtected = extraInformation.get("contentIsProtected"); } //System.out.println("sentContentId:" + sentContentId); //System.out.println("sentParentContentId:" + sentParentContentId); //System.out.println("sentSiteNodeId:" + sentSiteNodeId); //System.out.println("sentParentSiteNodeId:" + sentParentSiteNodeId); //System.out.println("sentRepositoryId:" + sentRepositoryId); if(object instanceof Map) { Map cacheInstance = (Map)e.getValue(); synchronized(cacheInstance) { if(cacheName.equals("componentContentsCache")) { try { if(entity.indexOf("ContentVersion") > 0) { String contentId = sentContentId; String contentTypeDefinitionId = sentContentTypeDefinitionId; if(contentId == null || contentId.equals("")) { try { contentId = ""+ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); } catch (Exception e2) { logger.info("Error loading content with id " + entityId + ":" + e2.getMessage()); } } if(contentId != null) { //ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentId); if(contentTypeDefinitionId != null && !contentTypeDefinitionId.equals("")) { ContentTypeDefinitionVO ctdVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(new Integer(contentTypeDefinitionId)); if(ctdVO.getName().equals("HTMLTemplate") || ctdVO.getName().equals("PagePartTemplate")) { ComponentController.getController().reIndexComponentContentsDelayed(new Integer(contentId)); } } else logger.info("No content type for " + contentId); } } else logger.info("skipping clearing components as it seems stupid"); } catch (Exception e2) { logger.warn("Error clearing componentContentsCache:" + e2.getMessage(), e2); } } else if(!(cacheName.equals("userAccessCache") && cacheInstance.size() < 100)) { logger.info("clearing ordinary map:" + e.getKey() + " (" + cacheInstance.size() + ")"); cacheInstance.clear(); } else logger.info("skipping clearing this as it seems stupid"); } } else { GeneralCacheAdministrator cacheInstance = (GeneralCacheAdministrator)e.getValue(); synchronized(cacheInstance) //Back { //t.printElapsedTime("START:" + entity + ":" + entityId); //ADD logic to flush correct on sitenode and sitenodeversion /* if(selectiveCacheUpdate && entity.indexOf("SiteNode") > 0) { cacheInstance.flushAll(); eventListeners.remove(cacheName + "_cacheEntryEventListener"); eventListeners.remove(cacheName + "_cacheMapAccessEventListener"); logger.info("clearing:" + e.getKey()); } */ //System.out.println("entity:" + entity); if(entity.indexOf("pageCache") == 0) { if(entity.indexOf("pageCache:") == 0) { String groupQualifyer = entity.substring("pageCache:".length()); logger.info("CacheController: This is a application pageCache-clear request... specific:" + groupQualifyer); logger.info("clearing " + e.getKey() + " : " + groupQualifyer); PageCacheHelper.getInstance().notify("" + groupQualifyer); /* if(cacheName.equals("pageCacheExtra")) { clearFileCacheForGroup(cacheInstance, "" + groupQualifyer); } else if(cacheName.equals("pageCache")) { cacheInstance.flushGroup("" + groupQualifyer); } */ } else { PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable"); /* logger.error("clearing " + e.getKey() + " selectiveCacheUpdateNonApplicable"); if(cacheName.equals("pageCacheExtra")) { clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable"); } else if(cacheName.equals("pageCache")) { cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); } */ } } if(selectiveCacheUpdate && entity.indexOf("Repository") > 0 && useSelectivePageCacheUpdate) { if(cacheName.equals("pageCacheExtra")) { PageCacheHelper.getInstance().notify("repository_" + entityId); PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable"); } else { cacheInstance.flushGroup("repository_" + entityId); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); } /* logger.info("clearing " + e.getKey() + " with group " + "repository_" + entityId); if(cacheName.equals("pageCacheExtra")) { clearFileCacheForGroup(cacheInstance, "repository_" + entityId); clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable"); } else { cacheInstance.flushGroup("repository_" + entityId); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); } */ } else if(selectiveCacheUpdate && entity.indexOf("SiteNodeVersion") > 0) { //Thread.dumpStack(); //How to solve this good if(CmsPropertyHandler.getOperatingMode().equalsIgnoreCase("0")) { if(cacheName.equals("pageCacheExtra")) { PageCacheHelper.getInstance().notify("siteNodeVersion_" + entityId); PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable"); //clearFileCacheForGroup(cacheInstance, "siteNodeVersion_" + entityId); //clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable"); } else { cacheInstance.flushGroup("siteNodeVersion_" + entityId); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); } logger.info("clearing " + e.getKey() + " with group " + "siteNodeVersion_" + entityId); try { logger.info("BeforesiteNodeVersionVO..."); String siteNodeId = sentSiteNodeId; String repositoryId = sentRepositoryId; String parentSiteNodeId = sentParentSiteNodeId; //System.out.println("siteNodeId:" + siteNodeId); //System.out.println("repositoryId:" + repositoryId); //System.out.println("parentSiteNodeId:" + parentSiteNodeId); if(siteNodeId == null || siteNodeId.equals("")) { try { SiteNodeVersionVO snvVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(entityId)); siteNodeId = ""+snvVO.getSiteNodeId(); if(repositoryId == null) { SiteNodeVO snVO = SiteNodeController.getController().getSiteNodeVOWithId(snvVO.getSiteNodeId()); repositoryId = ""+snVO.getRepositoryId(); parentSiteNodeId = ""+snVO.getParentSiteNodeId(); } } catch (Exception e2) { logger.info("Error getting siteNodeVersion " + entityId); } } if(siteNodeId != null) { logger.info("Before flushGroup2..."); if(cacheName.equals("pageCacheExtra")) { PageCacheHelper.getInstance().notify("siteNode_" + siteNodeId); //clearFileCacheForGroup(cacheInstance, "siteNode_" + siteNodeId); } else { cacheInstance.flushGroup("siteNode_" + siteNodeId); cacheInstance.flushGroup("" + siteNodeId); } if(siteNodeId != null && (cacheName.equals("childSiteNodesCache") || cacheName.equals("childPagesCache") || cacheName.equals("siteNodeCache") || cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups"))) { if(cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { cacheInstance.flushGroup("" + repositoryId); logger.info("Clearing componentPropertyCacheRepoGroups for repo:" + repositoryId); } if(parentSiteNodeId != null) { cacheInstance.flushGroup("siteNode_" + parentSiteNodeId); cacheInstance.flushGroup("" + parentSiteNodeId); cacheInstance.flushEntry("" + parentSiteNodeId); logger.info("Clearing for:" + parentSiteNodeId); } } logger.info("After flushGroup2..."); } } catch(Exception se) { logger.warn("Missing siteNode version: " + se.getMessage(), se); } } else { try { if((cacheName.equals("childSiteNodesCache") || cacheName.equals("childPagesCache") || cacheName.equals("siteNodeCache") || cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups"))) { SiteNodeVersionVO snvVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(entityId)); SiteNodeVO snVO = SiteNodeController.getController().getSiteNodeVOWithId(snvVO.getSiteNodeId()); Integer repositoryId = snVO.getRepositoryId(); Integer parentSiteNodeId = snVO.getParentSiteNodeId(); if(cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { cacheInstance.flushGroup("" + repositoryId); logger.info("Clearing componentPropertyCacheRepoGroups for repo:" + repositoryId); } if(parentSiteNodeId != null) { cacheInstance.flushGroup("siteNode_" + parentSiteNodeId); cacheInstance.flushGroup("" + parentSiteNodeId); cacheInstance.flushEntry("" + parentSiteNodeId); logger.info("Clearing for:" + parentSiteNodeId); } } } catch (Exception e2) { logger.error("Problem clearing cache for site node version:" + e2.getMessage(), e2); } } } else if(selectiveCacheUpdate && (entity.indexOf("SiteNode") > 0 && entity.indexOf("SiteNodeTypeDefinition") == -1) && useSelectivePageCacheUpdate) { //System.out.println("Entity: " + entity); logger.info("Flushing " + "" + entityId); logger.info("Flushing " + "siteNode_" + entityId); logger.info("Flushing " + "selectiveCacheUpdateNonApplicable"); if(cacheName.equals("pageCacheExtra")) { PageCacheHelper.getInstance().notify("siteNode_" + entityId); PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable"); //clearFileCacheForGroup(cacheInstance, "siteNode_" + entityId); //clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable"); } else { cacheInstance.flushEntry("" + entityId); cacheInstance.flushGroup("" + entityId); cacheInstance.flushGroup("siteNode_" + entityId); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); if(cacheName.equals("childSiteNodesCache") || cacheName.equals("childPagesCache") || cacheName.equals("siteNodeCache") || cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { logger.info("Flushing parent also"); String repositoryId = sentRepositoryId; String parentSiteNodeId = sentParentSiteNodeId; try { if(repositoryId == null) { SiteNodeVO snVO = SiteNodeController.getController().getSiteNodeVOWithId(new Integer(entityId)); if(snVO != null) { repositoryId = "" + snVO.getRepositoryId(); parentSiteNodeId = "" + snVO.getParentSiteNodeId(); } } if(cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { cacheInstance.flushGroup("" + repositoryId); logger.info("Clearing componentPropertyCacheRepoGroups for repo:" + repositoryId); } if(parentSiteNodeId != null && !parentSiteNodeId.equals("")) { logger.info("Flushing " + "" + entityId); logger.info("Flushing " + "siteNode_" + entityId); cacheInstance.flushGroup("siteNode_" + parentSiteNodeId); cacheInstance.flushGroup("" + parentSiteNodeId); cacheInstance.flushEntry("" + parentSiteNodeId); logger.info("Clearing for:" + parentSiteNodeId); } } catch(SystemException se) { logger.warn("Missing siteNode: " + se.getMessage(), se); } } } logger.info("clearing " + e.getKey() + " with group " + "siteNode_" + entityId); } else if(selectiveCacheUpdate && entity.indexOf("ContentVersion") > 0 && useSelectivePageCacheUpdate) { //t.printElapsedTime("CV start...."); logger.info("ContentVersion entity was sent: " + entity + ":" + entityId + " and cacheName:" + cacheName); logger.info("Getting eventListeners..."); //Object cacheEntryEventListener = eventListeners.get(e.getKey() + "_cacheEntryEventListener"); //Object cacheMapAccessEventListener = eventListeners.get(e.getKey() + "_cacheMapAccessEventListener"); //System.out.println("entity:" + entity); //System.out.println("Before flushGroup:" +cacheName); logger.info("Before flushGroup..."); if(cacheName.equals("pageCacheExtra")) { //clearFileCacheForGroup(cacheInstance, "contentVersion_" + entityId); //clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable"); } else if(cacheName.equals("pageCache")) { logger.info("Skipping clearing pageCache for version"); //cacheInstance.flushGroup("contentVersion_" + entityId); //cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); } else if(cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { Timer t2 = new Timer(); try { String repositoryId = sentRepositoryId; if(repositoryId == null) { String contentId = sentContentId; if(contentId == null) contentId = "" + ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(contentId)); repositoryId = "" + contentVO.getRepositoryId(); } cacheInstance.flushGroup("" + repositoryId); //t2.printElapsedTime("3"); if(cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); //t2.printElapsedTime("4"); logger.info("Clearing componentPropertyCacheRepoGroups for repo:" +repositoryId); } catch (Exception e2) { logger.info("Error loading content with id " + entityId + ":" + e2.getMessage()); } //t.printElapsedTime("componentPropertyCacheRepoGroups"); } else if(cacheName.equals("assetUrlCacheWithGroups")) { try { String contentId = sentContentId; if(contentId == null || contentId.equals("")) contentId = ""+ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); cacheInstance.flushGroup("content_" + contentId); logger.info("Clearing assetUrlCacheWithGroups for content:" + "content_" + contentId); } catch (Exception e2) { logger.warn("Flushing assetUrlCacheWithGroups as it was a missing entity - was probably a delete"); cacheInstance.flushAll(); } //t.printElapsedTime("assetUrlCacheWithGroups"); } else if(cacheName.equals("childPagesCache") || cacheName.equals("childSiteNodesCache")) { //System.out.println("childPagesCache:" + entity + "=" + entityId); //t.printElapsedTime("childPagesCache start"); try { String contentId = sentContentId; //System.out.println("sentContentId:" + sentContentId); if(contentId == null || contentId.equals("")) contentId = ""+ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); //System.out.println("contentId:" + contentId); //t.printElapsedTime("childPagesCache A"); ContentTypeDefinitionVO metaInfoContentTypeDefinitionVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithName("Meta info"); //t.printElapsedTime("childPagesCache B"); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(contentId)); //t.printElapsedTime("childPagesCache C"); if(metaInfoContentTypeDefinitionVO.getId().equals(contentVO.getContentTypeDefinitionId())) { try { SiteNodeVO siteNodeVO = SiteNodeController.getController().getSiteNodeVOWithMetaInfoContentId(new Integer(contentId)); //t.printElapsedTime("childPagesCache getSiteNodeVOWithMetaInfoContentId"); if(siteNodeVO != null) { cacheInstance.flushGroup("siteNode_" + siteNodeVO.getId()); cacheInstance.flushGroup("siteNode_" + siteNodeVO.getParentSiteNodeId()); } } catch (Exception e2) { logger.error("Did not find a sitenode with this meta info:" + contentId); } cacheInstance.flushGroup("content_" + contentId); cacheInstance.flushGroup("contentVersion_" + entityId); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); //t.printElapsedTime("childPagesCache flush done..."); logger.info("Clearing childPagesCache for content:" + "content_" + contentId); } } catch (Exception e2) { logger.warn("Flushing childPagesCache as it was a missing entity - was probably a delete"); cacheInstance.flushAll(); } //t.printElapsedTime("childPagesCache"); } else if(cacheName.equals("matchingContentsCache")) { try { String contentId = sentContentId; if(contentId == null || contentId.equals("")) contentId = ""+ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); try { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(contentId)); String contentTypeDefinitionId = "" + contentVO.getContentTypeDefinitionId(); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId); cacheInstance.putInCache("recacheMark_" + contentTypeDefinitionId, "" + System.currentTimeMillis()); cacheInstance.putInCache("recacheMark", "" + System.currentTimeMillis()); } catch (Exception e2) { logger.warn("Flushing all as it was a missing entity - was probably a delete:" + e2.getMessage()); cacheInstance.flushAll(); } cacheInstance.flushGroup("content_" + contentId); logger.info("Clearing assetUrlCacheWithGroups for content:" + "content_" + contentId); } catch (Exception e2) { logger.warn("Flushing all as it was a missing entity - was probably a delete:" + e2.getMessage()); cacheInstance.flushAll(); } //t.printElapsedTime("matchingContentsCache"); } else { //t.printElapsedTime("Before"); cacheInstance.flushGroup("contentVersion_" + entityId); //if(!cacheName.equals("contentCache") && !cacheName.equals("contentVersionCache") && !cacheName.equals("contentAttributeCache") && !cacheName.equals("contentVersionIdCache") && !cacheName.equals("contentCategoryCache") && !cacheName.equals("metaInfoContentAttributeCache")) cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); logger.info("clearing " + e.getKey() + " with selectiveCacheUpdateNonApplicable"); //t.printElapsedTime("clearing " + e.getKey() + " with selectiveCacheUpdateNonApplicable"); } logger.info("clearing " + e.getKey() + " with group " + "contentVersion_" + entityId); //String[] changedAttributes = new String[]{"Title","NavigationTitle"}; try { //t.printElapsedTime("Cache 3.4"); logger.info("Before contentVersionVO..."); //System.out.println("cacheName:" + cacheName); //System.out.println("entity:" + entity); //System.out.println("entityId:" + entityId); String contentIdString = sentContentId; String contentTypeDefinitionId = sentContentTypeDefinitionId; String contentIsProtected = sentContentIsProtected; if(contentIdString == null || contentIdString.equals("")) { try { contentIdString = "" + ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); } catch (Exception e2) { logger.info("Error loading content with id " + entityId + ":" + e2.getMessage()); } } Integer contentId = null; if(contentIdString != null) contentId = new Integer(contentIdString); if(contentTypeDefinitionId == null && contentIsProtected == null && contentId != null) { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(contentId)); contentTypeDefinitionId = ""+contentVO.getContentTypeDefinitionId(); contentIsProtected = ""+contentVO.getIsProtected().intValue(); } //t.printElapsedTime("Cache 3.5"); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Cache 3.5", t.getElapsedTime()); if(contentId != null) { List<String> changes = Collections.EMPTY_LIST; //System.out.println("extraInformation:" + extraInformation); String changedAttributes = extraInformation == null ? null : extraInformation.get("changedAttributeNames"); if(changedAttributes != null && changedAttributes.length() > 0) changes = new ArrayList<String>(Arrays.asList(StringUtils.split(changedAttributes, ","))); //ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(contentId)); logger.info("Before flushGroup2..."); if(cacheName.equals("pageCacheExtra")) { if(contentIsProtected.equals(""+ContentVO.YES.intValue())) { List<InterceptionPointVO> interceptionPointVOList = InterceptionPointController.getController().getInterceptionPointVOList("Content"); for(InterceptionPointVO interceptionPointVO : interceptionPointVOList) { if(interceptionPointVO.getName().endsWith(".Read")) { String acKey = "" + interceptionPointVO.getId() + "_" + entityId; CacheController.clearUserAccessCache(acKey); } } } PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId); PageCacheHelper.getInstance().notify("content_" + contentId); //clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); if((changes == null || changes.size() == 0) && CmsPropertyHandler.getOperatingMode().equals("3")) { ContentVersionVO oldContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(entityId)); ContentVersionVO newContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, oldContentVersionVO.getLanguageId(), new Integer(CmsPropertyHandler.getOperatingMode())); if(newContentVersionVO != null && oldContentVersionVO != null && newContentVersionVO.getId().equals(oldContentVersionVO.getId())) { oldContentVersionVO = null; //System.out.println("SHIT - same version allready - must find other"); List<SmallestContentVersionVO> contentVersionVOList = ContentVersionController.getContentVersionController().getSmallestContentVersionVOList(new Integer(contentId)); for(SmallestContentVersionVO cvVO : contentVersionVOList) { if(!cvVO.getId().equals(newContentVersionVO.getId()) && cvVO.getStateId().equals(new Integer(CmsPropertyHandler.getOperatingMode())) && cvVO.getLanguageId().equals(newContentVersionVO.getLanguageId()) && cvVO.getIsActive() && (oldContentVersionVO == null || oldContentVersionVO.getId() < cvVO.getId())) { oldContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(cvVO.getId()); } } } //System.out.println("Now we should have current and previous version:" + newContentVersionVO + " / " + oldContentVersionVO); if(newContentVersionVO != null && oldContentVersionVO != null) changes = ContentVersionController.getContentVersionController().getChangedAttributeNames(newContentVersionVO, oldContentVersionVO); } //System.out.println("changes:" + changes); for(String changedAttributeName : changes) { if(changedAttributeName.indexOf("ComponentStructure") > -1) { //Map allreadyFlushedEntries.... Set<String> groupEntries = (Set<String>)cacheInstance.getCache().cacheMap.getGroup("content_" + contentId + "_ComponentStructureDependency"); //System.out.println("groupEntries:" + groupEntries); if(groupEntries != null) { System.out.println("groupEntries:" + groupEntries.size()); outer:for(String key : groupEntries) { //System.out.println("key 1:" + key); try { //String[] usedEntities = (String[])cacheInstance.getFromCache(key + "_entities"); byte[] usedEntitiesByteArray = (byte[])cacheInstance.getFromCache(key + "_entitiesAsByte"); String usedEntitiesString = compressionHelper.decompress(usedEntitiesByteArray); //t.printElapsedTime("Decompress to " + usedEntitiesString.length() + " took"); String[] usedEntities = StringUtils.split(usedEntitiesString, "|"); //t.printElapsedTime("Split to usedEntities " + usedEntities.length + " took"); ContentVersionVO newContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(entityId)); String newComponentStructure = ContentVersionController.getContentVersionController().getAttributeValue(newContentVersionVO, "ComponentStructure", false); for(String usedEntity : usedEntities) { //System.out.println("usedEntity:" + usedEntity); if(usedEntity.startsWith("content_" + contentId + "_ComponentStructure(")) { //System.out.println("Match - now lets parse: " + usedEntity); String arguments = usedEntity.substring(usedEntity.indexOf("(") + 1, usedEntity.indexOf(")")); Integer oldComponentPropertyHash = new Integer(usedEntity.substring(usedEntity.indexOf("=") + 1)); String[] args = arguments.split(","); Integer componentId = new Integer(args[0]); String propertyName = args[1]; Integer siteNodeId = new Integer(args[2]); Integer languageId = new Integer(args[3]); //System.out.println("componentId:" + componentId); //System.out.println("propertyName:" + propertyName); //System.out.println("siteNodeId:" + siteNodeId); //System.out.println("languageId:" + languageId); int newComponentPropertyHash = getPropertyAsStringHashCode(newComponentStructure, componentId, propertyName, siteNodeId, languageId); //System.out.println("oldComponentPropertyHash:" + oldComponentPropertyHash); //System.out.println("newComponentPropertyHash:" + newComponentPropertyHash); if(oldComponentPropertyHash.intValue() != newComponentPropertyHash) { //System.out.println("Yes - clearing - must have changed something important:" + usedEntity); PageCacheHelper.getInstance().notify(usedEntity); //clearFileCacheForGroup(cacheInstance, usedEntity); } else { //System.out.println("Flushing content_" + currentPageMetaInfoContentId + "_ComponentStructure just to catch page itself"); //cacheInstance.flushGroup("content_" + currentPageMetaInfoContentId + "_ComponentStructure"); //System.out.println("Flushing content_" + contentId + "_ComponentStructure just to catch page itself"); //cacheInstance.flushGroup("content_" + contentId + "_ComponentStructure"); } } else if(usedEntity.startsWith("content_" + contentId + "_ComponentStructure:")) { //System.out.println("Match - now lets parse component order etc: " + usedEntity); String xPath = usedEntity.substring(usedEntity.indexOf(":") + 1, usedEntity.lastIndexOf("=")); Integer oldComponentPropertyHash = new Integer(usedEntity.substring(usedEntity.lastIndexOf("=") + 1)); //System.out.println("xPath:" + xPath); int newComponentPropertyHash = getComponentsAsStringHashCode(newComponentStructure, xPath); //System.out.println("oldComponentPropertyHash:" + oldComponentPropertyHash); //System.out.println("newComponentPropertyHash:" + newComponentPropertyHash); if(oldComponentPropertyHash.intValue() != newComponentPropertyHash) { //System.out.println("Yes - clearing - must have changed order or added/subtracted components:" + usedEntity); PageCacheHelper.getInstance().notify(usedEntity); //clearFileCacheForGroup(cacheInstance, usedEntity); } } } } catch (Exception ex) { //logger.error("Got error trying to update cache:" + ex.getMessage()); logger.warn("Got error trying to update cache:" + ex.getMessage(), ex); //clearFileCacheForGroup(cacheInstance, "content_" + contentId + "_" + changedAttributeName); //cacheInstance.flushGroup("content_" + contentId + "_" + changedAttributeName); //logger.warn("Cleared pageCache for " + "content_" + contentId + "_" + changedAttributeName); break outer; } } } } else { PageCacheHelper.getInstance().notify("content_" + contentId + "_" + changedAttributeName); //clearFileCacheForGroup(cacheInstance, "content_" + contentId + "_" + changedAttributeName); //System.out.println("Cleared for " + "content_" + contentId + "_" + changedAttributeName); } } //t.printElapsedTime("Handled page cache extra"); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Handled page cache extra", t.getElapsedTime()); //clearFileCacheForGroup(cacheInstance, "content_" + contentId); } else if(cacheName.equals("pageCache")) { //t.printElapsedTime("Page cache start"); RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Page cache start", t.getElapsedTime()); logger.info("Flushing pageCache for content type def"); String contentTypeDefKey = "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId; cacheInstance.flushGroup(contentTypeDefKey); //cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); //cacheInstance.flushGroup("content_" + contentVO.getId()); //System.out.println("Flushing:" + getPooledString(1, contentVO.getId())); cacheInstance.flushGroup(getPooledString(1, new Integer(contentId))); PageCacheHelper.getInstance().notify("content_" + contentId); ContentVersionVO oldContentVersionVO = null; ContentVersionVO newContentVersionVO = null; String debug = ""; if((changes == null || changes.size() == 0) && CmsPropertyHandler.getOperatingMode().equals("3")) { debug += "entityId:" + entityId + "\n"; debug += "contentId:" + contentId + "\n"; oldContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(entityId)); debug += "oldContentVersionVO:" + oldContentVersionVO.getId() + ":" + oldContentVersionVO.getLanguageId() + "\n"; debug += "oldContentVersionVO:" + CmsPropertyHandler.getOperatingMode() + "\n"; newContentVersionVO = ContentVersionController.getContentVersionController().getLatestActiveContentVersionVO(contentId, oldContentVersionVO.getLanguageId(), new Integer(CmsPropertyHandler.getOperatingMode())); debug += "newContentVersionVO:" + newContentVersionVO + "\n"; if(newContentVersionVO != null && oldContentVersionVO != null && newContentVersionVO.getId().equals(oldContentVersionVO.getId())) { debug += "newContentVersionVO:" + newContentVersionVO.getId() + "\n"; oldContentVersionVO = null; debug += "SHIT - same version allready - must find other"; List<SmallestContentVersionVO> contentVersionVOList = ContentVersionController.getContentVersionController().getSmallestContentVersionVOList(new Integer(contentId)); for(SmallestContentVersionVO cvVO : contentVersionVOList) { if(!cvVO.getId().equals(newContentVersionVO.getId()) && cvVO.getStateId().equals(new Integer(CmsPropertyHandler.getOperatingMode())) && cvVO.getLanguageId().equals(newContentVersionVO.getLanguageId()) && cvVO.getIsActive() && (oldContentVersionVO == null || oldContentVersionVO.getId() < cvVO.getId())) { oldContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(cvVO.getId()); } } debug += "oldContentVersionVO:" + (oldContentVersionVO == null ? "null" : oldContentVersionVO.getId()) + "\n"; } //System.out.println("Now we should have current and previous version:" + newContentVersionVO + " / " + oldContentVersionVO); if(newContentVersionVO != null && oldContentVersionVO != null) changes = ContentVersionController.getContentVersionController().getChangedAttributeNames(newContentVersionVO, oldContentVersionVO); } //t.printElapsedTime("Changes analyzed"); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Changes analyzed", t.getElapsedTime()); if((changes == null || changes.size() == 0) && CmsPropertyHandler.getOperatingMode().equals("3")) { if(oldContentVersionVO == null || newContentVersionVO == null) { //Hur kan det bli detta???? logger.warn("Fishy 1: " + oldContentVersionVO + ":" + newContentVersionVO + " in " + CmsPropertyHandler.getContextRootPath()); logger.warn("DEBUG: " + debug); } else { logger.warn("Fishy 2: No changes found between content versions " + newContentVersionVO.getId() + " and " + oldContentVersionVO.getId() + " in " + CmsPropertyHandler.getContextRootPath()); logger.warn("DEBUG: " + debug); logger.warn("Fishy: newContentVersionVO: " + newContentVersionVO.getVersionValue()); logger.warn("Fishy: newContentVersionVO: " + oldContentVersionVO.getVersionValue()); } logger.warn("Just to make sure pages are updated we pretend all attributes changed until we find the bug"); changes = ContentVersionController.getContentVersionController().getAttributeNames(newContentVersionVO); } //System.out.println("changes:" + changes); for(String changedAttributeName : changes) { logger.warn("changedAttributeName: " + changedAttributeName); if(changedAttributeName.indexOf("ComponentStructure") > -1 && cacheName.equals("pageCache")) { //Map allreadyFlushedEntries.... //It's something wrong here.. GeneralCacheAdministrator pageCacheExtraInstance = (GeneralCacheAdministrator)caches.get("pageCacheExtra"); String cacheGroupKey = "content_" + contentId + "_ComponentStructureDependency"; //Set<String> groupEntries = (Set<String>)cacheInstance.getCache().cacheMap.getGroup("content_" + contentId + "_ComponentStructureDependency"); Set<String> groupEntries = (Set<String>)cacheInstance.getCache().cacheMap.getGroup(getPooledString(cacheGroupKey.hashCode())); //System.out.println("groupEntries:" + groupEntries); if(groupEntries != null) { outer:for(String key : groupEntries) { logger.info("key 2:" + key); try { //String[] usedEntities = (String[])pageCacheExtraInstance.getFromCache(key + "_entities"); byte[] usedEntitiesByteArray = (byte[])pageCacheExtraInstance.getFromCache(key + "_entitiesAsByte"); String usedEntitiesString = compressionHelper.decompress(usedEntitiesByteArray); //t.printElapsedTime("Decompress to " + usedEntitiesString.length() + " took"); String[] usedEntities = StringUtils.split(usedEntitiesString, ","); //t.printElapsedTime("Split to usedEntities " + usedEntities.length + " took"); ContentVersionVO newestContentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(new Integer(entityId)); String newComponentStructure = ContentVersionController.getContentVersionController().getAttributeValue(newestContentVersionVO, "ComponentStructure", false); for(String usedEntity : usedEntities) { //System.out.println("usedEntity:" + usedEntity); if(usedEntity.startsWith("content_" + contentId + "_ComponentStructure(")) { //System.out.println("Match - now lets parse: " + usedEntity); String arguments = usedEntity.substring(usedEntity.indexOf("(") + 1, usedEntity.indexOf(")")); Integer oldComponentPropertyHash = new Integer(usedEntity.substring(usedEntity.indexOf("=") + 1)); String[] args = arguments.split(","); Integer componentId = new Integer(args[0]); String propertyName = args[1]; Integer siteNodeId = new Integer(args[2]); Integer languageId = new Integer(args[3]); //System.out.println("componentId:" + componentId); //System.out.println("propertyName:" + propertyName); //System.out.println("siteNodeId:" + siteNodeId); //System.out.println("languageId:" + languageId); int newComponentPropertyHash = getPropertyAsStringHashCode(newComponentStructure, componentId, propertyName, siteNodeId, languageId); //System.out.println("oldComponentPropertyHash:" + oldComponentPropertyHash); //System.out.println("newComponentPropertyHash:" + newComponentPropertyHash); if(oldComponentPropertyHash.intValue() != newComponentPropertyHash) { //System.out.println("Yes - clearing - must have changed something important:" + usedEntity); //cacheInstance.flushGroup(usedEntity); cacheInstance.flushGroup(getPooledString(usedEntity.hashCode())); //clearFileCacheForGroup(cacheInstance, usedEntity); } else { //System.out.println("Flushing content_" + currentPageMetaInfoContentId + "_ComponentStructure just to catch page itself"); //cacheInstance.flushGroup("content_" + currentPageMetaInfoContentId + "_ComponentStructure"); //System.out.println("Flushing content_" + contentId + "_ComponentStructure just to catch page itself"); String componentStructureKey = "content_" + contentId + "_ComponentStructure"; //cacheInstance.flushGroup(componentStructureKey); cacheInstance.flushGroup(getPooledString(componentStructureKey.hashCode())); cacheInstance.flushGroup(getPooledString(usedEntity.hashCode())); } } else if(usedEntity.startsWith("content_" + contentId + "_ComponentStructure:")) { //System.out.println("Match - now lets parse component order etc: " + usedEntity); String xPath = usedEntity.substring(usedEntity.indexOf(":") + 1, usedEntity.lastIndexOf("=")); Integer oldComponentPropertyHash = new Integer(usedEntity.substring(usedEntity.lastIndexOf("=") + 1)); //System.out.println("xPath:" + xPath); int newComponentPropertyHash = getComponentsAsStringHashCode(newComponentStructure, xPath); //System.out.println("oldComponentPropertyHash:" + oldComponentPropertyHash); //System.out.println("newComponentPropertyHash:" + newComponentPropertyHash); if(oldComponentPropertyHash.intValue() != newComponentPropertyHash) { //System.out.println("Yes - clearing - must have changed order or added/subtracted components:" + usedEntity); cacheInstance.flushGroup(getPooledString(usedEntity.hashCode())); //cacheInstance.flushGroup(usedEntity); } } } } catch(Exception ex) { //logger.error("Got error trying to update cache:" + ex.getMessage()); logger.warn("Got error trying to update cache:" + ex.getMessage(), ex); try { String attributeKey = "content_" + contentId + "_" + changedAttributeName; //cacheInstance.flushGroup(attributeKey); cacheInstance.flushGroup(getPooledString(attributeKey.hashCode())); logger.warn("Cleared pageCache for " + getPooledString(attributeKey.hashCode())); } catch(Exception ex2) { logger.error("Got error trying to flushGroup 2:" + ex2.getMessage()); cacheInstance.flushAll(); } break outer; } t.printElapsedTime("Handled group entries"); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Handled group entries", t.getElapsedTime()); } } } else { String attributeKey = "content_" + contentId + "_" + changedAttributeName; //cacheInstance.flushGroup("content_" + contentId + "_" + changedAttributeName); cacheInstance.flushGroup(getPooledString(attributeKey.hashCode())); logger.info("Cleared pageCache for " + "content_" + contentId + "_" + changedAttributeName); } } //cacheInstance.flushGroup("content_" + contentId); } else { String contentTypeDefKey = "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId; //cacheInstance.flushGroup(contentTypeDefKey); cacheInstance.flushGroup(contentTypeDefKey); //System.out.println("Cleared for " + "content_" + contentId + " on cache " + cacheName); String contentKey = "content_" + contentId; cacheInstance.flushGroup(contentKey); //cacheInstance.flushGroup(contentKey); } //t.printElapsedTime("Handled page cache"); //RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Handled page cache", t.getElapsedTime()); logger.info("After flushGroup2..."); } //} if (cacheName.equals("contentVersionCache")) { new AssetUpdatingThread(entityId).start(); } } catch(SystemException se) { se.printStackTrace(); logger.info("Missing content version: " + se.getMessage()); } catch(Exception ex) { ex.printStackTrace(); } } else if(selectiveCacheUpdate && (entity.indexOf("Content") > 0 && entity.indexOf("ContentTypeDefinition") == -1 && entity.indexOf("ContentCategory") == -1) && useSelectivePageCacheUpdate) { logger.info("Content entity was sent: " + entity + ":" + entityId); //System.out.println("Content entity was called and needs to be fixed:" + entity); //String[] changedAttributes = new String[]{"Title","NavigationTitle"}; /* ContentVO contentVO = null; if(isObjectCachedInCastor(SmallContentImpl.class, new Integer(entityId))) contentVO = ContentController.getContentController().getContentVOWithId(new Integer(entityId)); */ String repositoryId = sentRepositoryId; String contentTypeDefinitionId = sentContentTypeDefinitionId; String contentIsProtected = sentContentIsProtected; if(repositoryId == null || contentTypeDefinitionId == null || contentIsProtected == null) { //System.out.println("repositoryId:" + repositoryId); //System.out.println("contentTypeDefinitionId:" + contentTypeDefinitionId); //System.out.println("contentIsProtected:" + contentIsProtected); try { ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(entityId)); //t.printElapsedTime("clearCaches cv u1 contentVO", 10); repositoryId = ""+contentVO.getRepositoryId(); contentTypeDefinitionId = ""+contentVO.getContentTypeDefinitionId(); contentIsProtected = ""+contentVO.getIsProtected(); } catch (Exception e2) { logger.info("Error loading content with id " + entityId + ":" + e2.getMessage()); } } if(cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { cacheInstance.flushGroup("" + repositoryId); logger.info("Clearing componentPropertyCacheRepoGroups for repo:" + repositoryId); } if(cacheName.equals("pageCacheExtra")) { //clearFileCacheForGroup(cacheInstance, "content_" + entityId); PageCacheHelper.getInstance().notify("content_" + entityId); try { //cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); if(contentTypeDefinitionId != null) { //clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId); } } catch (Exception e2) { logger.warn("Could not find content type to clear pages based on: " + e2.getMessage(), e2); } } else if(cacheName.equals("pageCache")) { logger.info("Flushing page cache for {" + entityId + "} and {content_" + entityId + "}"); String entityKey = "" + entityId; String contentEntityKey = "content_" + entityId; //cacheInstance.flushGroup("" + entityId); //cacheInstance.flushGroup(contentEntityKey); cacheInstance.flushGroup(entityKey); cacheInstance.flushGroup(contentEntityKey); try { if(contentTypeDefinitionId != null) { String contentTypeCacheKey = "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId; //cacheInstance.flushGroup(contentTypeCacheKey); cacheInstance.flushGroup(contentTypeCacheKey); } } catch (Exception e2) { logger.warn("Could not find content type to clear pages based on: " + e2.getMessage(), e2); } } else { cacheInstance.flushGroup("" + entityId); cacheInstance.flushGroup("content_" + entityId); logger.info("clearing " + e.getKey() + " with selectiveCacheUpdateNonApplicable"); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); if(contentTypeDefinitionId != null) { cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId); } } if(contentTypeDefinitionId != null) { //System.out.println("****************************************************************"); if(contentIsProtected.equals(""+ContentVO.YES.intValue())) { List<InterceptionPointVO> interceptionPointVOList = InterceptionPointController.getController().getInterceptionPointVOList("Content"); for(InterceptionPointVO interceptionPointVO : interceptionPointVOList) { if(interceptionPointVO.getName().endsWith(".Read")) { String acKey = "" + interceptionPointVO.getId() + "_" + entityId; //System.out.println("Clearing access rights for:" + acKey); CacheController.clearUserAccessCache(acKey); } } } } //System.out.println("************************END************************************"); logger.info("clearing " + e.getKey() + " with group " + "content_" + entityId); } else if(selectiveCacheUpdate && entity.indexOf("DigitalAsset") > -1) { logger.info("Asset entity was sent: " + entity + ":" + entityId); Integer contentId = assetContentIdMapping.get(new Integer(entityId)); if(contentId == null) { logger.info("Checking fot cv for asset:" + entityId); List<SmallestContentVersionVO> contentVersions = DigitalAssetController.getContentVersionVOListConnectedToAssetWithId(new Integer(entityId)); if(contentVersions != null) { for(SmallestContentVersionVO contentVersionVO : contentVersions) { contentId = contentVersionVO.getContentId(); assetContentIdMapping.put(new Integer(entityId), contentId); break; } } } else logger.info("Using read asset"); //Integer contentId = null; ContentVO contentVO = null; try { contentVO = ContentController.getContentController().getContentVOWithId(contentId); if(cacheName.equals("componentPropertyCacheRepoGroups") || cacheName.equals("componentPropertyVersionIdCacheRepoGroups")) { cacheInstance.flushGroup("" + contentVO.getRepositoryId()); logger.info("Clearing componentPropertyCacheRepoGroups for repo:" + contentVO.getRepositoryId()); } } catch (Exception e2) { logger.info("Error loading content with id " + contentId + ":" + e2.getMessage()); } //ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(entityId)); if(cacheName.equals("pageCacheExtra")) { //clearFileCacheForGroup(cacheInstance, "content_" + entityId); PageCacheHelper.getInstance().notify("content_" + contentId); try { //cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); if(contentVO != null) { //clearFileCacheForGroup(cacheInstance, "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); PageCacheHelper.getInstance().notify("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId()); } } catch (Exception e2) { logger.warn("Could not find content type to clear pages based on: " + e2.getMessage(), e2); } } else if(cacheName.equals("pageCache")) { logger.info("Flushing page cache for {" + contentId + "} and {content_" + contentId + "}"); String entityKey = "" + contentId; String contentEntityKey = "content_" + contentId; //cacheInstance.flushGroup("" + entityId); //cacheInstance.flushGroup(contentEntityKey); cacheInstance.flushGroup(entityKey); cacheInstance.flushGroup(contentEntityKey); try { if(contentVO != null) { String contentTypeCacheKey = "selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentVO.getContentTypeDefinitionId(); //cacheInstance.flushGroup(contentTypeCacheKey); cacheInstance.flushGroup(contentTypeCacheKey); } } catch (Exception e2) { logger.warn("Could not find content type to clear pages based on: " + e2.getMessage(), e2); } } else { cacheInstance.flushGroup("" + contentId); cacheInstance.flushGroup("content_" + contentId); logger.info("clearing " + e.getKey() + " with selectiveCacheUpdateNonApplicable"); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); } logger.info("clearing " + e.getKey() + " with group " + "content_" + entityId); } else if(selectiveCacheUpdate && entity.indexOf("Publication") > 0 && useSelectivePageCacheUpdate && (operatingMode != null && operatingMode.equalsIgnoreCase("3")) && CmsPropertyHandler.getLivePublicationThreadClass().equalsIgnoreCase("org.infoglue.deliver.util.SelectiveLivePublicationThread")) { logger.info("Now we will ease out the publication..."); /* List publicationDetailVOList = PublicationController.getController().getPublicationDetailVOList(new Integer(entityId)); Iterator publicationDetailVOListIterator = publicationDetailVOList.iterator(); while(publicationDetailVOListIterator.hasNext()) { PublicationDetailVO publicationDetailVO = (PublicationDetailVO)publicationDetailVOListIterator.next(); logger.info("publicationDetailVO.getEntityClass():" + publicationDetailVO.getEntityClass()); logger.info("publicationDetailVO.getEntityId():" + publicationDetailVO.getEntityId()); if(Class.forName(publicationDetailVO.getEntityClass()).getName().equals(ContentVersion.class.getName())) { logger.error("We clear all caches having references to contentVersion: " + publicationDetailVO.getEntityId()); Integer contentId = ContentVersionController.getContentVersionController().getContentIdForContentVersion(publicationDetailVO.getEntityId()); cacheInstance.flushGroup("content_" + contentId); cacheInstance.flushGroup(CacheController.getPooledString(2, publicationDetailVO.getEntityId().toString())); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable"); logger.info("clearing " + e.getKey() + " with group " + "content_" + contentId); logger.info("clearing " + e.getKey() + " with group " + "content_" + contentId); } else if(Class.forName(publicationDetailVO.getEntityClass()).getName().equals(SiteNodeVersion.class.getName())) { Integer siteNodeId = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(publicationDetailVO.getEntityId()).getSiteNodeId(); CacheController.clearCaches(publicationDetailVO.getEntityClass(), publicationDetailVO.getEntityId().toString(), null); } } */ } else if(entity.equals("org.infoglue.cms.entities.management.impl.simple.AccessRightImpl")) { //System.out.println("This was an access right update - do we handle it:" + cacheName); if(!CmsPropertyHandler.getOperatingMode().equalsIgnoreCase("3")) { try { AccessRightVO acVO = AccessRightController.getController().getAccessRightVOWithId(new Integer(entityId)); InterceptionPointVO icpVO = InterceptionPointController.getController().getInterceptionPointVOWithId(acVO.getInterceptionPointId()); //System.out.println("icpVO:" + icpVO.getName()); if(icpVO.getName().indexOf("Content.") > -1) { //System.out.println("Was a content access... let's clear caches for that content."); String idAsString = acVO.getParameters(); if(idAsString != null && !idAsString.equals("")) clearCaches("org.infoglue.cms.entities.content.impl.simple.ContentImpl", idAsString, null, cachesToSkip, forceClear); } else if(icpVO.getName().indexOf("ContentVersion.") > -1) { //System.out.println("Was a contentversion access... let's clear caches for that content."); String idAsString = acVO.getParameters(); if(idAsString != null && !idAsString.equals("")) clearCaches("org.infoglue.cms.entities.content.impl.simple.ContentVersionImpl", idAsString, null, cachesToSkip, forceClear); } else if(icpVO.getName().indexOf("SiteNode.") > -1) { //System.out.println("Was a sitenode access... let's clear caches for that content."); String idAsString = acVO.getParameters(); if(idAsString != null && !idAsString.equals("")) clearCaches("org.infoglue.cms.entities.structure.impl.simple.SiteNodeImpl", idAsString, null, cachesToSkip, forceClear); } else if(icpVO.getName().indexOf("SiteNodeVersion.") > -1) { //System.out.println("Was a sitenode version access... let's clear caches for that content."); String idAsString = acVO.getParameters(); if(idAsString != null && !idAsString.equals("")) clearCaches("org.infoglue.cms.entities.structure.impl.simple.SiteNodeVersionImpl", idAsString, null, cachesToSkip, forceClear); } else { //System.out.println("****************************"); //System.out.println("* WHAT TO DO WITH IN CACHECONTROLLER: " + icpVO.getName() + " *"); //System.out.println("****************************"); } } catch(Exception e2) { logger.error("Error handling access right update: " + e2.getMessage(), e2); } } else logger.info("Skipping it as this is live mode.."); } else if(selectiveCacheUpdate && (entity.indexOf("ServiceBinding") > 0 || entity.indexOf("Qualifyer") > 0)) { logger.info("Ignoring this kind of notification... never used anymore:" + cacheName); } else if(entity.indexOf("AccessRightImpl") > -1) { logger.info("Ignoring handling of entity:" + entity); } else if(cacheName.equalsIgnoreCase("matchingContentsCache") && entity.indexOf("MediumContentCategoryImpl") > 0) { try { String contentId = sentContentId; //if(contentId == null || contentId.equals("")) ContentCategoryVO contentCategoryVO = ContentCategoryController.getController().findById(new Integer(entityId)); ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getContentVersionVOWithId(contentCategoryVO.getContentVersionId()); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(contentVersionVO.getContentId()); String contentTypeDefinitionId = "" + contentVO.getContentTypeDefinitionId(); cacheInstance.flushGroup("selectiveCacheUpdateNonApplicable_contentTypeDefinitionId_" + contentTypeDefinitionId); cacheInstance.putInCache("recacheMark_" + contentTypeDefinitionId, "" + System.currentTimeMillis()); cacheInstance.putInCache("recacheMark", "" + System.currentTimeMillis()); } catch (Exception e2) { cacheInstance.putInCache("recacheAllMark", "" + System.currentTimeMillis()); logger.warn("Flushing all as it was a missing entity - was probably a delete: " + e2.getMessage()); cacheInstance.flushAll(); } } else if(entity.indexOf("MediumContentCategoryImpl") > 0) { logger.info("Special handling - no handling"); } else if(cacheName.equalsIgnoreCase("componentEditorVersionIdCache") && entity.indexOf("ContentVersionImpl") > 0) { logger.info("Special handling componentEditorVersionIdCache"); String contentId = sentContentId; if(contentId == null || contentId.equals("")) contentId = ""+ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); cacheInstance.flushGroup("content_" + contentId); cacheInstance.flushGroup("contentVersion_" + entityId); } else if((cacheName.equalsIgnoreCase("componentEditorCache") || cacheName.equalsIgnoreCase("componentPropertyCache") || cacheName.equalsIgnoreCase("componentPropertyVersionIdCache") || cacheName.equalsIgnoreCase("pageComponentsCache")) && entity.indexOf("ContentVersionImpl") > 0) { try { logger.info("Special handling componentEditorVersionIdCache"); String contentId = sentContentId; if(contentId == null || contentId.equals("")) contentId = ""+ContentVersionController.getContentVersionController().getContentIdForContentVersion(new Integer(entityId)); ContentVO contentVO = ContentController.getContentController().getContentVOWithId(new Integer(contentId)); if(contentVO != null && contentVO.getContentTypeDefinitionId() != null) { ContentTypeDefinitionVO ctdVO = ContentTypeDefinitionController.getController().getContentTypeDefinitionVOWithId(contentVO.getContentTypeDefinitionId()); if(ctdVO.getName().equals("Meta info")) cacheInstance.flushAll(); else { if(cacheName.equalsIgnoreCase("componentEditorCache") && (ctdVO.getName().equals("HTMLTemplate") || ctdVO.getName().equals("PagePartTemplate"))) { cacheInstance.flushAll(); //CacheController.clearCache("componentEditorCache"); } else logger.info("No need to clear page stuff"); } } } catch (Exception e2) { if(e2.getCause() instanceof ObjectNotFoundException || (e2.getCause() != null && e2.getCause().getCause() instanceof ObjectNotFoundException)) logger.info("Error clearing caches - object was probably deleted."); else logger.warn("Error handling mixed caches: " + e2.getMessage(), e2); } } else { if(entity.indexOf("EventImpl") == -1 && entity.indexOf(".Publication") == -1) { if(logger.isInfoEnabled()) logger.info("Clearing all on: " + cacheName + ":" + entity); cacheInstance.flushAll(); if(logger.isInfoEnabled()) logger.info("clearing:" + e.getKey()); } } } //BACK } long elapsedTime = t.getElapsedTime(); if(elapsedTime > 20) logger.warn("Clear cache end took " + e.getKey() + ": " + elapsedTime); logger.info("Cleared cache:" + e.getKey()); if(!selectiveCacheUpdate) i.remove(); } else { logger.info("Did not clear " + e.getKey()); } } //} if(!useSelectivePageCacheUpdate || entity.indexOf("AccessRight") > -1) { logger.info("Clearing all pageCaches"); CacheController.clearFileCaches("pageCache"); } } t.printElapsedTime("clearCaches stop", 100); /* logger.info("clearCaches stop"); long time = t.getElapsedTime(); if(time > 3000) logger.warn("clearCaches took long time:" + time); */ } private static void printThreads() { ThreadGroup tg = Thread.currentThread().getThreadGroup(); int n = tg.activeCount(); logger.warn("Number of active threads: " + n); Thread[] threadArray = new Thread[n]; n = tg.enumerate(threadArray, false); for (int i=0; i<n; i++) { String currentThreadId = "" + threadArray[i].getId(); Thread t = threadArray[i]; Map stacks = t.getAllStackTraces(); Iterator stacksIterator = stacks.values().iterator(); while(stacksIterator.hasNext()) { StackTraceElement[] el = (StackTraceElement[])stacksIterator.next(); String stackString = ""; if (el != null && el.length != 0) { for (int j = 0; j < el.length; j++) { StackTraceElement frame = el[j]; if (frame == null) stackString += " null stack frame" + "<br/>"; else stackString += " null stack frame" + frame.toString() + "<br/>"; } logger.warn("\n\nThreads:\n\n " + stackString); } } } } public static void clearCastorCaches(DefeatCacheParameters dcp) throws Exception { if(CmsPropertyHandler.getApplicationName().equals("cms")) logger.info("Emptying the Castor Caches - why"); long wait = 0; while(!getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() > 0) //while(!getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getNumberOfActiveRequests() > 0) { if(wait > 1000) { logger.warn("The clearCastorCaches method waited over " + ((wait * 10) / 1000) + " seconds but there seems to be " + RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() + " queries blocking all the time. Continuing anyway."); break; } if(wait > 100) setForcedCacheEvictionMode(true); Thread.sleep(10); wait++; } Database db = CastorDatabaseService.getDatabase(); //CastorDatabaseService.setBlock(true); try { //db.getCacheManager().expireCache(); Map<Class,List<Object>> entities = dcp.getEntities(); Iterator<Class> keyIterator = entities.keySet().iterator(); while(keyIterator.hasNext()) { Class clazz = keyIterator.next(); List<Object> ids = entities.get(clazz); if(ids.size() > 0) { clearCache(clazz, ids.toArray(), true, db); logger.info("Emptied clazz:" + clazz + " with ids:" + ids); } else { clearCache(db, clazz); logger.info("Emptied clazz:" + clazz); } } //commitTransaction(db); logger.info("Emptied the Castor Caches"); } catch(Exception e) { logger.error("Exception when tried empty the Castor Caches"); rollbackTransaction(db); } finally { db.close(); //CastorDatabaseService.setBlock(false); } } public static void clearCastorCaches() throws Exception { if(CmsPropertyHandler.getApplicationName().equals("cms")) System.out.println("Emptying the Castor Caches... why"); long wait = 0; while(!getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() > 0) //while(!getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getNumberOfActiveRequests() > 0) { if(wait > 1000) { logger.warn("The clearCastorCaches method waited over " + ((wait * 10) / 1000) + " seconds but there seems to be " + RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() + " queries blocking all the time. Continuing anyway."); break; } if(wait > 100) setForcedCacheEvictionMode(true); Thread.sleep(10); wait++; } Database db = CastorDatabaseService.getDatabase(); //CastorDatabaseService.setBlock(true); try { //db.getCacheManager().expireCache(); clearCache(db, SmallContentImpl.class); clearCache(db, SmallishContentImpl.class); clearCache(db, MediumContentImpl.class); clearCache(db, ContentImpl.class); clearCache(db, ContentRelationImpl.class); clearCache(db, SmallContentVersionImpl.class); clearCache(db, SmallestContentVersionImpl.class); clearCache(db, ContentVersionImpl.class); clearCache(db, DigitalAssetImpl.class); clearCache(db, SmallDigitalAssetImpl.class); clearCache(db, MediumDigitalAssetImpl.class); clearCache(db, SmallAvailableServiceBindingImpl.class); clearCache(db, AvailableServiceBindingImpl.class); clearCache(db, ContentTypeDefinitionImpl.class); clearCache(db, LanguageImpl.class); clearCache(db, RepositoryImpl.class); clearCache(db, SmallRepositoryImpl.class); clearCache(db, RepositoryLanguageImpl.class); clearCache(db, RoleImpl.class); clearCache(db, GroupImpl.class); clearCache(db, SmallRoleImpl.class); clearCache(db, SmallGroupImpl.class); clearCache(db, SystemUserRoleImpl.class); clearCache(db, SystemUserGroupImpl.class); clearCache(db, ServiceDefinitionImpl.class); clearCache(db, SiteNodeTypeDefinitionImpl.class); clearCache(db, SystemUserImpl.class); clearCache(db, SmallSystemUserImpl.class); clearCache(db, QualifyerImpl.class); clearCache(db, ServiceBindingImpl.class); clearCache(db, SmallSiteNodeImpl.class); clearCache(db, SiteNodeImpl.class); clearCache(db, SiteNodeVersionImpl.class); clearCache(db, SmallSiteNodeVersionImpl.class); clearCache(db, PublicationImpl.class); //clearCache(db, PublicationDetailImpl.class); // This class depends on publication clearCache(db, ActionImpl.class); clearCache(db, ActionDefinitionImpl.class); clearCache(db, ActorImpl.class); clearCache(db, ConsequenceImpl.class); clearCache(db, ConsequenceDefinitionImpl.class); clearCache(db, EventImpl.class); clearCache(db, WorkflowImpl.class); clearCache(db, WorkflowDefinitionImpl.class); clearCache(db, CategoryImpl.class); clearCache(db, ContentCategoryImpl.class); clearCache(db, RegistryImpl.class); clearCache(db, RedirectImpl.class); clearCache(db, InterceptionPointImpl.class); clearCache(db, InterceptorImpl.class); clearCache(db, AccessRightImpl.class); clearCache(db, AccessRightRoleImpl.class); clearCache(db, AccessRightGroupImpl.class); clearCache(db, AccessRightUserImpl.class); clearCache(db, RolePropertiesImpl.class); clearCache(db, UserPropertiesImpl.class); clearCache(db, GroupPropertiesImpl.class); clearCache(db, UserContentTypeDefinitionImpl.class); clearCache(db, RoleContentTypeDefinitionImpl.class); clearCache(db, GroupContentTypeDefinitionImpl.class); clearCache(db, PropertiesCategoryImpl.class); clearCache(db, ServerNodeImpl.class); clearCache(db, SubscriptionImpl.class); clearCache(db, FormEntryImpl.class); clearCache(db, FormEntryValueImpl.class); //commitTransaction(db); logger.info("Emptied the Castor Caches"); } catch(Exception e) { logger.error("Exception when tried empty the Castor Caches"); rollbackTransaction(db); } finally { db.close(); //CastorDatabaseService.setBlock(false); } } public static void clearCache(Class type, Object[] ids) throws Exception { clearCache(type, ids, false); } public static void clearCache(Class type, Object[] ids, boolean forceClear) throws Exception { Timer t = new Timer(); if(CmsPropertyHandler.getOperatingMode().equals("3")) { long wait = 0; while(!forceClear && !getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() > 0) { logger.warn("Number of requests: " + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests() + " was more than 0 - lets wait a bit."); if(wait > 1000) { logger.warn("The clearCache method waited over " + ((wait * 10) / 1000) + " seconds but there seems to be " + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests() + " requests blocking all the time. Continuing anyway."); //printThreads(); break; } if(wait > 100) setForcedCacheEvictionMode(true); Thread.sleep(10); wait++; } } Database db = CastorDatabaseService.getDatabase(); try { if(type.getName().contains(".SiteNodeVersionImpl") || type.getName().contains(".MediumSiteNodeVersionImpl") || type.getName().contains(".SiteNodeImpl") || type.getName().contains(".LanguageImpl") || type.getName().contains(".RepositoryImpl") || type.getName().contains(".RepositoryLanguageImpl") || type.getName().contains(".DigitalAssetImpl") || type.getName().contains(".MediumDigitalAssetImpl") || type.getName().contains(".ContentImpl") || type.getName().contains(".MediumContentImpl") || type.getName().contains(".SmallContentImpl") || type.getName().contains(".SmallishContentImpl") || type.getName().contains(".ContentVersionImpl") || type.getName().contains(".MediumContentVersionImpl") || type.getName().contains(".SmallContentVersionImpl") || type.getName().contains(".SmallestContentVersionImpl") || type.getName().contains(".AccessRightImpl") || type.getName().contains(".SmallAccessRightImpl") || type.getName().contains(".AccessRightRoleImpl") || type.getName().contains(".AccessRightGroupImpl") || type.getName().contains(".AccessRightUserImpl") || type.getName().contains(".RegistryImpl")) { logger.info("Skipping clear of " + type); } else { logger.info("Clearing " + type); CacheManager manager = db.getCacheManager(); manager.expireCache(type, ids); //Class[] types = {type}; //db.expireCache(types, ids); } if(type.getName().equalsIgnoreCase(SmallContentImpl.class.getName()) || type.getName().equalsIgnoreCase(SmallishContentImpl.class.getName()) || type.getName().equalsIgnoreCase(MediumContentImpl.class.getName()) || type.getName().equalsIgnoreCase(ContentImpl.class.getName()) || type.getName().equalsIgnoreCase(SmallSiteNodeImpl.class.getName()) || type.getName().equalsIgnoreCase(PureSiteNodeImpl.class.getName()) || type.getName().equalsIgnoreCase(SiteNodeImpl.class.getName())) { expireDateTime = null; publishDateTime = null; } } catch(Exception e) { logger.error("Error clearing cache:" + e.getMessage() + " for type:" + type + ":" + ids + ":" + forceClear); } finally { try { db.close(); } catch (Exception e) { logger.error("Error closing database: " + e.getMessage()); } } } public static void clearCache(Class c) throws Exception { Database db = CastorDatabaseService.getDatabase(); try { clearCache(db, c); } catch(Exception e) { e.printStackTrace(); } finally { db.close(); } } public static void clearCache(Class type, Object[] ids, Database db) throws Exception { clearCache(type, ids, false, db); } public static void clearCache(Class type, Object[] ids, boolean forceClear, Database db) throws Exception { long wait = 0; while(!forceClear && !getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() > 0) { if(wait > 1000) { logger.warn("The clearCache method waited over " + ((wait * 10) / 1000) + " seconds but there seems to be " + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests() + " requests blocking all the time. Continuing anyway."); //printThreads(); break; } if(wait > 100) setForcedCacheEvictionMode(true); Thread.sleep(10); wait++; } if(type.getName().contains(".SiteNodeVersionImpl") || type.getName().contains(".MediumSiteNodeVersionImpl") || type.getName().contains(".SiteNodeImpl") || type.getName().contains(".LanguageImpl") || type.getName().contains(".RepositoryImpl") || type.getName().contains(".RepositoryLanguageImpl") || type.getName().contains(".DigitalAssetImpl") || type.getName().contains(".MediumDigitalAssetImpl") || type.getName().contains(".ContentImpl") || type.getName().contains(".MediumContentImpl") || type.getName().contains(".SmallContentImpl") || type.getName().contains(".SmallishContentImpl") || type.getName().contains(".ContentVersionImpl") || type.getName().contains(".MediumContentVersionImpl") || type.getName().contains(".SmallContentVersionImpl") || type.getName().contains(".SmallestContentVersionImpl") || type.getName().contains(".AccessRightImpl") || type.getName().contains(".SmallAccessRightImpl") || type.getName().contains(".AccessRightRoleImpl") || type.getName().contains(".AccessRightGroupImpl") || type.getName().contains(".AccessRightUserImpl") || type.getName().contains(".RegistryImpl")) { logger.info("Skipping clear of " + type); } else { logger.info("Clearing for real: " + type); CacheManager manager = db.getCacheManager(); manager.expireCache(type, ids); //Class[] types = {type}; //db.expireCache(types, ids); } if(type.getName().equalsIgnoreCase(SmallContentImpl.class.getName()) || type.getName().equalsIgnoreCase(SmallishContentImpl.class.getName()) || type.getName().equalsIgnoreCase(MediumContentImpl.class.getName()) || type.getName().equalsIgnoreCase(ContentImpl.class.getName()) || type.getName().equalsIgnoreCase(SmallSiteNodeImpl.class.getName()) || type.getName().equalsIgnoreCase(PureSiteNodeImpl.class.getName()) || type.getName().equalsIgnoreCase(SiteNodeImpl.class.getName())) { expireDateTime = null; publishDateTime = null; } } public static void clearCache(Database db, Class c) throws Exception { long wait = 0; while(!getForcedCacheEvictionMode() && RequestAnalyser.getRequestAnalyser().getApproximateNumberOfDatabaseQueries() > 0) { if(wait > 1000) { logger.warn("The clearCache method waited over " + ((wait * 10) / 1000) + " seconds but there seems to be " + RequestAnalyser.getRequestAnalyser().getNumberOfCurrentRequests() + " requests blocking all the time. Continuing anyway."); //printThreads(); break; } if(wait > 100) setForcedCacheEvictionMode(true); Thread.sleep(10); wait++; } if(c.getName().contains(".SiteNodeVersionImpl") || c.getName().contains(".MediumSiteNodeVersionImpl") || c.getName().contains(".SiteNodeImpl") || c.getName().contains(".LanguageImpl") || c.getName().contains(".RepositoryImpl") || c.getName().contains(".RepositoryLanguageImpl") || c.getName().contains(".DigitalAssetImpl") || c.getName().contains(".MediumDigitalAssetImpl") || c.getName().contains(".ContentImpl") || c.getName().contains(".MediumContentImpl") || c.getName().contains(".SmallContentImpl") || c.getName().contains(".SmallishContentImpl") || c.getName().contains(".ContentVersionImpl") || c.getName().contains(".MediumContentVersionImpl") || c.getName().contains(".SmallContentVersionImpl") || c.getName().contains(".SmallestContentVersionImpl") || c.getName().contains(".AccessRightImpl") || c.getName().contains(".SmallAccessRightImpl") || c.getName().contains(".AccessRightRoleImpl") || c.getName().contains(".AccessRightGroupImpl") || c.getName().contains(".AccessRightUserImpl") || c.getName().contains(".RegistryImpl")) { logger.info("Skipping " + c.getName() + " as they have no castor cache"); } else { logger.info("Clearing for real: " + c); Class[] types = {c}; CacheManager manager = db.getCacheManager(); manager.expireCache(types); //db.expireCache(types, null); } if(c.getName().equalsIgnoreCase(SmallContentImpl.class.getName()) || c.getName().equalsIgnoreCase(SmallishContentImpl.class.getName()) || c.getName().equalsIgnoreCase(MediumContentImpl.class.getName()) || c.getName().equalsIgnoreCase(ContentImpl.class.getName()) || c.getName().equalsIgnoreCase(SmallSiteNodeImpl.class.getName()) || c.getName().equalsIgnoreCase(PureSiteNodeImpl.class.getName()) || c.getName().equalsIgnoreCase(SiteNodeImpl.class.getName())) { expireDateTime = null; publishDateTime = null; } } public void run() { while(this.continueRunning && expireCacheAutomatically) { logger.info("Clearing caches"); try { clearCastorCaches(); } catch(Exception e) { logger.error("Error clearing cache in expireCacheAutomatically thread:" + e.getMessage(), e); } logger.info("Castor cache cleared"); try { clearCaches(null, null, null); } catch(Exception e) { logger.error("Error clearing other caches in expireCacheAutomatically thread:" + e.getMessage(), e); } logger.info("All other caches cleared"); try { sleep(cacheExpireInterval); } catch (InterruptedException e){} } } public static void cacheCentralCastorCaches() throws Exception { Database db = CastorDatabaseService.getDatabase(); DatabaseWrapper dbWrapper = new DatabaseWrapper(db); try { beginTransaction(db); String siteNodesToRecacheOnPublishing = CmsPropertyHandler.getSiteNodesToRecacheOnPublishing(); String recachePublishingMethod = CmsPropertyHandler.getRecachePublishingMethod(); logger.info("siteNodesToRecacheOnPublishing:" + siteNodesToRecacheOnPublishing); if(siteNodesToRecacheOnPublishing != null && !siteNodesToRecacheOnPublishing.equals("") && siteNodesToRecacheOnPublishing.indexOf("siteNodesToRecacheOnPublishing") == -1) { String[] siteNodeIdArray = siteNodesToRecacheOnPublishing.split(","); for(int i=0; i<siteNodeIdArray.length; i++) { Integer siteNodeId = new Integer(siteNodeIdArray[i]); logger.info("siteNodeId to recache:" + siteNodeId); if(recachePublishingMethod != null && recachePublishingMethod.equalsIgnoreCase("contentCentric")) new ContentCentricCachePopulator().recache(dbWrapper, siteNodeId); else if(recachePublishingMethod != null && recachePublishingMethod.equalsIgnoreCase("requestCentric")) new RequestCentricCachePopulator().recache(dbWrapper, siteNodeId); else if(recachePublishingMethod != null && recachePublishingMethod.equalsIgnoreCase("requestAndMetaInfoCentric")) new RequestAndMetaInfoCentricCachePopulator().recache(dbWrapper, siteNodeId); else logger.warn("No recaching was made during publishing - set the parameter recachePublishingMethod to 'contentCentric' or 'requestCentric' to recache."); } } commitTransaction(db); } catch(Exception e) { logger.error("An error occurred when we tried to rebuild the castor cache:" + e.getMessage(), e); rollbackTransaction(db); } finally { closeDatabase(db); } } public void stopThread() { this.continueRunning = false; } public boolean getExpireCacheAutomatically() { return expireCacheAutomatically; } public void setExpireCacheAutomatically(boolean expireCacheAutomatically) { this.expireCacheAutomatically = expireCacheAutomatically; } public static Map getCaches() { return caches; } public static void evictWaitingCache() throws Exception { Timer t = new Timer(); String operatingMode = CmsPropertyHandler.getOperatingMode(); synchronized(RequestAnalyser.getRequestAnalyser()) { if(RequestAnalyser.getRequestAnalyser().getBlockRequests() && RequestAnalyser.getRequestAnalyser().getBlockRequestTime() < 30000) { logger.warn("evictWaitingCache allready in progress - returning to avoid conflict"); return; } else if(RequestAnalyser.getRequestAnalyser().getBlockRequests() && RequestAnalyser.getRequestAnalyser().getBlockRequestTime() > 30000) logger.warn("An block must have gone wrong... there has gone over 30 seconds and still not reported done.. let's run anyway."); RequestAnalyser.getRequestAnalyser().setBlockRequests(true); } logger.info("evictWaitingCache starting"); logger.info("blocking"); synchronized(notifications) { if(notifications == null || notifications.size() == 0) { logger.info("No notifications..."); RequestAnalyser.getRequestAnalyser().setBlockRequests(false); return; } } logger.info("Had some notifications to handle:" + notifications.size()); WorkingPublicationThread wpt = new WorkingPublicationThread(); SelectiveLivePublicationThread pt = null; String livePublicationThreadClass = ""; try { livePublicationThreadClass = CmsPropertyHandler.getLivePublicationThreadClass(); if(operatingMode != null && operatingMode.equalsIgnoreCase("3")) //If published-mode we update entire cache to be sure.. { if(livePublicationThreadClass.equalsIgnoreCase("org.infoglue.deliver.util.SelectiveLivePublicationThread")) pt = new SelectiveLivePublicationThread(notifications); } } catch (Exception e) { logger.error("Could not get livePublicationThreadClass:" + e.getMessage(), e); } List localNotifications = new ArrayList(); boolean startedThread = false; if(pt == null) { logger.info("before notifications:" + notifications.size()); synchronized(notifications) { localNotifications.addAll(notifications); notifications.clear(); } Iterator i = localNotifications.iterator(); while(i.hasNext()) { CacheEvictionBean cacheEvictionBean = (CacheEvictionBean)i.next(); String className = cacheEvictionBean.getClassName(); logger.info("className:" + className); logger.info("pt:" + pt); //RequestAnalyser.getRequestAnalyser().addPublication("" + formatter.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss") + " - " + cacheEvictionBean.getClassName() + " - " + cacheEvictionBean.getObjectId()); if(pt == null) wpt.getCacheEvictionBeans().add(cacheEvictionBean); //else // pt.getCacheEvictionBeans().add(cacheEvictionBean); try { //Here we do what we need to if the server properties has changed. if(className != null && className.equalsIgnoreCase("ServerNodeProperties")) { try { logger.info("clearing InfoGlueAuthenticationFilter"); clearServerNodeProperty(true); logger.info("cleared InfoGlueAuthenticationFilter"); InfoGlueAuthenticationFilter.initializeProperties(); logger.info("initialized InfoGlueAuthenticationFilter"); logger.info("Shortening page stats"); RequestAnalyser.shortenPageStatistics(); } catch (Exception e1) { logger.warn("Could not refresh authentication filter:" + e1.getMessage(), e1); } catch (Throwable throwable) { logger.warn("Could not refresh authentication filter:" + throwable.getMessage(), throwable); } } if(operatingMode != null && !operatingMode.equalsIgnoreCase("3") && className != null && className.equalsIgnoreCase("PortletRegistry")) { logger.info("clearing portletRegistry"); clearPortlets(); logger.info("cleared portletRegistry"); } if(operatingMode != null && operatingMode.equalsIgnoreCase("3")) //If published-mode we update entire cache to be sure.. { if(!livePublicationThreadClass.equalsIgnoreCase("org.infoglue.deliver.util.SelectiveLivePublicationThread")) { logger.info("Starting publication thread..."); PublicationThread lpt = new PublicationThread(); lpt.setPriority(Thread.MIN_PRIORITY); lpt.start(); startedThread = true; logger.info("Done starting publication thread..."); } } } catch(Exception e) { logger.error("Cache eviction reported an error:" + e.getMessage(), e); } logger.info("Cache evicted.."); i.remove(); } } if(operatingMode != null && !operatingMode.equalsIgnoreCase("3")) { logger.info("Starting the work method"); //wpt.setPriority(Thread.MAX_PRIORITY); //wpt.start(); wpt.work(); startedThread = true; logger.info("Done starting working publication thread..."); } if(operatingMode != null && operatingMode.equalsIgnoreCase("3") && pt != null) //If published-mode we update entire cache to be sure.. { int size = 0; synchronized(notifications) { size = notifications.size(); } if(size > 0) { logger.info("Starting selective publication thread [" + pt.getClass().getName() + "]"); pt.setPriority(Thread.MIN_PRIORITY); pt.start(); startedThread = true; logger.info("Done starting publication thread..."); } } if(!startedThread) RequestAnalyser.getRequestAnalyser().setBlockRequests(false); t.printElapsedTime("evict done"); logger.info("evictWaitingCache stop"); } public static void clearPortlets() { //run registry services to load new portlet info from the registry files String[] svcs = { "org.apache.pluto.portalImpl.services.portletdefinitionregistry.PortletDefinitionRegistryService", "org.apache.pluto.portalImpl.services.portletentityregistry.PortletEntityRegistryService" }; int len = svcs.length; for (int i = 0; i < len; i++) { try { ServiceManager.hotInit(ServletConfigContainer.getContainer().getServletConfig(), svcs[i]); } catch (Throwable e) { String svc = svcs[i].substring(svcs[i].lastIndexOf('.') + 1); String msg = "Initialization of " + svc + " service for hot deployment failed!"; logger.error(msg); break; } try { ServiceManager.postHotInit(ServletConfigContainer.getContainer().getServletConfig(), svcs[i]); } catch (Throwable e) { String svc = svcs[i].substring(svcs[i].lastIndexOf('.') + 1); String msg = "Post initialization of " + svc + " service for hot deployment failed!"; logger.error(msg); break; } } try { PortletEntityRegistry.load(); } catch (IOException e) { e.printStackTrace(); } } public static String[] getPublicationPersistentCacheNames() { List<String> caches = new ArrayList<String>(); caches.add("redirectCache"); caches.add("languageCache"); caches.add("childSiteNodesCache"); caches.add("childPagesCache"); caches.add("parentSiteNodeCache"); caches.add("contentTypeDefinitionCache"); caches.add("componentContentsCache"); caches.add("contentVersionIdCache"); caches.add("rootSiteNodeCache"); caches.add("contentCache"); caches.add("relatedCategoriesCache"); caches.add("matchingContentsCache"); caches.add("propertiesCategoryCache"); caches.add("userCache"); caches.add("siteNodeCache"); caches.add("contentCategoryCache"); caches.add("contentVersionCache"); caches.add("digitalAssetCache"); caches.add("latestSiteNodeVersionCache"); caches.add("interceptionPointCache"); caches.add("contentAttributeCache"); caches.add("metaInfoContentAttributeCache"); caches.add("ServerNodeProperties"); caches.add("serverNodePropertiesCache"); caches.add("pageCache"); caches.add("pageCacheExtra"); caches.add("componentCache"); caches.add("NavigationCache"); caches.add("pagePathCache"); caches.add("userCache"); caches.add("pageCacheParentSiteNodeCache"); caches.add("pageCacheLatestSiteNodeVersions"); caches.add("pageCacheSiteNodeTypeDefinition"); caches.add("JNDIAuthorizationCache"); caches.add("WebServiceAuthorizationCache"); caches.add("importTagResultCache"); caches.add("assetUrlCacheWithGroups"); caches.add("componentPropertyCacheRepoGroups"); caches.add("pageDeliveryMetaDataCache"); List<String> userCaches = CmsPropertyHandler.getExtraPublicationPersistentCacheNames(); logger.info("Adding ExtraPublicationPersistentCacheNames:" + userCaches); caches.addAll(userCaches); String[] cachesArr = caches.toArray(new String[caches.size()]); return cachesArr; } /** * Composer of the pageCacheKey. * * @param siteNodeId * @param languageId * @param contentId * @param userAgent * @param queryString * @return */ public static String getPageCacheKey(HttpSession session, HttpServletRequest request, Integer siteNodeId, Integer languageId, Integer contentId, String userAgent, String queryString, String extra) { String originalRequestURL = request.getParameter("originalRequestURL"); if(originalRequestURL == null || originalRequestURL.length() == 0) originalRequestURL = request.getRequestURL().toString(); String pageKey = null; String pageKeyProperty = CmsPropertyHandler.getPageKey(); if(pageKeyProperty != null && pageKeyProperty.length() > 0) { pageKey = pageKeyProperty; pageKey = pageKey.replaceAll("\\$siteNodeId", "" + siteNodeId); pageKey = pageKey.replaceAll("\\$languageId", "" + languageId); pageKey = pageKey.replaceAll("\\$contentId", "" + contentId); pageKey = pageKey.replaceAll("\\$useragent", "" + userAgent); pageKey = pageKey.replaceAll("\\$queryString", "" + queryString); if(logger.isInfoEnabled()) logger.info("Raw pageKey:" + pageKey); int sessionAttributeStartIndex = pageKey.indexOf("$session."); while(sessionAttributeStartIndex > -1) { int sessionAttributeEndIndex = pageKey.indexOf("_", sessionAttributeStartIndex); String sessionAttribute = null; if(sessionAttributeEndIndex > -1) sessionAttribute = pageKey.substring(sessionAttributeStartIndex + 9, sessionAttributeEndIndex); else sessionAttribute = pageKey.substring(sessionAttributeStartIndex + 9); Object sessionAttributeValue = session.getAttribute(sessionAttribute); if(sessionAttributeValue == null && sessionAttribute.equalsIgnoreCase("principal")) sessionAttributeValue = session.getAttribute("infogluePrincipal"); if(logger.isInfoEnabled()) logger.info("sessionAttribute:" + sessionAttribute); pageKey = pageKey.replaceAll("_\\$session." + sessionAttribute, "" + (sessionAttributeValue == null ? "" : "_" + sessionAttributeValue)); sessionAttributeStartIndex = pageKey.indexOf("$session."); } if(logger.isInfoEnabled()) logger.info("after session pageKey:" + pageKey); int cookieAttributeStartIndex = pageKey.indexOf("$cookie."); while(cookieAttributeStartIndex > -1) { int cookieAttributeEndIndex = pageKey.indexOf("_", cookieAttributeStartIndex); String cookieAttribute = null; if(cookieAttributeEndIndex > -1) cookieAttribute = pageKey.substring(cookieAttributeStartIndex + 8, cookieAttributeEndIndex); else cookieAttribute = pageKey.substring(cookieAttributeStartIndex + 8); HttpHelper httpHelper = new HttpHelper(); pageKey = pageKey.replaceAll("\\$cookie." + cookieAttribute, "" + httpHelper.getCookie(request, cookieAttribute)); cookieAttributeStartIndex = pageKey.indexOf("$cookie."); } } else pageKey = "" + siteNodeId + "_" + languageId + "_" + contentId + "_" + userAgent + "_" + queryString; return originalRequestURL + "_" + pageKey + extra; } /** * Composer of the componentCacheKey. * * @param siteNodeId * @param languageId * @param contentId * @param userAgent * @param queryString * @return */ public static String getComponentCacheKey(String keyPattern, String pageKey, HttpSession session, HttpServletRequest request, Integer siteNodeId, Integer languageId, Integer contentId, String userAgent, String queryString, InfoGlueComponent component, String extra) { String originalRequestURL = request.getParameter("originalRequestURL"); if(originalRequestURL == null || originalRequestURL.length() == 0) originalRequestURL = request.getRequestURL().toString(); String componentKey = null; if(keyPattern != null && keyPattern.length() > 0) { componentKey = keyPattern; componentKey = componentKey.replaceAll("\\$siteNodeId", "" + siteNodeId); componentKey = componentKey.replaceAll("\\$languageId", "" + languageId); componentKey = componentKey.replaceAll("\\$contentId", "" + contentId); componentKey = componentKey.replaceAll("\\$useragent", "" + userAgent); componentKey = componentKey.replaceAll("\\$queryString", "" + queryString); componentKey = componentKey.replaceAll("\\$pageKey", "" + pageKey); componentKey = componentKey.replaceAll("\\$component.id", "" + component.getId()); componentKey = componentKey.replaceAll("\\$component.slotName", "" + component.getSlotName()); componentKey = componentKey.replaceAll("\\$component.contentId", "" + component.getContentId()); componentKey = componentKey.replaceAll("\\$component.isInherited", "" + component.getIsInherited()); int sessionAttributeStartIndex = componentKey.indexOf("$session."); while(sessionAttributeStartIndex > -1) { int sessionAttributeEndIndex = componentKey.indexOf("_", sessionAttributeStartIndex); String sessionAttribute = null; if(sessionAttributeEndIndex > -1) sessionAttribute = componentKey.substring(sessionAttributeStartIndex + 9, sessionAttributeEndIndex); else sessionAttribute = componentKey.substring(sessionAttributeStartIndex + 9); Object sessionAttributeValue = session.getAttribute(sessionAttribute); if(sessionAttributeValue == null && sessionAttribute.equalsIgnoreCase("principal")) sessionAttributeValue = session.getAttribute("infogluePrincipal"); componentKey = componentKey.replaceAll("\\$session." + sessionAttribute, "" + sessionAttributeValue); sessionAttributeStartIndex = componentKey.indexOf("$session."); } int cookieAttributeStartIndex = componentKey.indexOf("$cookie."); while(cookieAttributeStartIndex > -1) { int cookieAttributeEndIndex = componentKey.indexOf("_", cookieAttributeStartIndex); String cookieAttribute = null; if(cookieAttributeEndIndex > -1) cookieAttribute = componentKey.substring(cookieAttributeStartIndex + 8, cookieAttributeEndIndex); else cookieAttribute = componentKey.substring(cookieAttributeStartIndex + 8); HttpHelper httpHelper = new HttpHelper(); componentKey = componentKey.replaceAll("\\$cookie." + cookieAttribute, "" + httpHelper.getCookie(request, cookieAttribute)); cookieAttributeStartIndex = componentKey.indexOf("$cookie."); } } return componentKey; } private static String getCachedContentFromFile(String cacheName, String key, String charEncoding) { return getCachedContentFromFile(cacheName, key, null, charEncoding); } private static String getCachedContentFromFile(String cacheName, String key, Integer updateInterval, String charEncoding) { Timer t = new Timer(); if(!logger.isInfoEnabled()) t.setActive(false); String compressPageCache = CmsPropertyHandler.getCompressPageCache(); String contents = null; try { String firstPart = ("" + key.hashCode()).substring(0, 3); String filePath = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches" + File.separator + cacheName + File.separator + firstPart + File.separator + key.hashCode(); File file = new File(filePath); if(file.exists()) { //logger.info("updateInterval:" + updateInterval); if(updateInterval != null) { long updateDateTime = file.lastModified(); long now = System.currentTimeMillis(); //logger.info("diff:" + (now - updateDateTime) / 1000); if((now - updateDateTime) / 1000 < updateInterval) { if(cacheName.equals("pageCache") && compressPageCache != null && compressPageCache.equals("true")) { byte[] cachedCompressedData = FileHelper.getFileBytes(file); if(cachedCompressedData != null && cachedCompressedData.length > 0) contents = compressionHelper.decompress(cachedCompressedData); } else { //logger.info("getting file anyway:" + updateInterval); contents = FileHelper.getFileAsStringOpt(file, charEncoding); } //contents = FileHelper.getFileAsString(file, charEncoding); } else { //logger.info("Old file - skipping:" + ((now - updateDateTime) / 1000)); if(logger.isInfoEnabled()) logger.info("Old file - skipping:" + ((now - updateDateTime) / 1000)); } } else { //logger.info("getting file:" + file); if(cacheName.equals("pageCache") && compressPageCache != null && compressPageCache.equals("true")) { byte[] cachedCompressedData = FileHelper.getFileBytes(file); if(cachedCompressedData != null && cachedCompressedData.length > 0) contents = compressionHelper.decompress(cachedCompressedData); } else { //logger.info("getting file anyway:" + updateInterval); contents = FileHelper.getFileAsStringOpt(file, charEncoding); } //contents = FileHelper.getFileAsString(file, charEncoding); } } else { if(logger.isInfoEnabled()) logger.info("No filecache existed:" + filePath); } } catch (Exception e) { logger.warn("Problem loading data from file:" + e.getMessage()); } return contents; } private static void putCachedContentInFile(String cacheName, String key, String value, String fileCacheCharEncoding) { try { String firstPart = ("" + key.hashCode()).substring(0, 3); String dir = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches" + File.separator + cacheName + File.separator + firstPart; File dirFile = new File(dir); dirFile.mkdirs(); File file = new File(dir + File.separator + key.hashCode()); File tmpOutputFile = new File(dir + File.separator + Thread.currentThread().getId() + "_tmp_" + key.hashCode()); FileHelper.write(tmpOutputFile, value, false, fileCacheCharEncoding); if(logger.isInfoEnabled()) logger.info("Wrote file.."); if(tmpOutputFile.exists()) { if(tmpOutputFile.length() == 0) { tmpOutputFile.delete(); } else { if(logger.isInfoEnabled()) logger.info("Renaming file " + tmpOutputFile.getAbsolutePath() + " to " + file.getAbsolutePath()); if(logger.isInfoEnabled()) logger.info("file:" + file.exists() + ":" + file.length()); if(file.exists()) file.delete(); boolean renamed = tmpOutputFile.renameTo(file); if(logger.isInfoEnabled()) logger.info("renamed:" + renamed); if(cacheName.equals("pageCache")) numberOfPageCacheFiles.incrementAndGet(); } } } catch (Exception e) { logger.warn("Problem storing data to file:" + e.getMessage()); } } private static void putCachedCompressedContentInFile(String cacheName, String key, byte[] value) { try { String firstPart = ("" + key.hashCode()).substring(0, 3); String dir = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches" + File.separator + cacheName + File.separator + firstPart; File dirFile = new File(dir); dirFile.mkdirs(); File file = new File(dir + File.separator + key.hashCode()); File tmpOutputFile = new File(dir + File.separator + Thread.currentThread().getId() + "_tmp_" + key.hashCode()); FileHelper.writeToFile(tmpOutputFile, value); if(logger.isInfoEnabled()) logger.info("Wrote file.."); if(tmpOutputFile.exists()) { if(tmpOutputFile.length() == 0) { tmpOutputFile.delete(); } else { if(logger.isInfoEnabled()) logger.info("Renaming file " + tmpOutputFile.getAbsolutePath() + " to " + file.getAbsolutePath()); if(logger.isInfoEnabled()) logger.info("file:" + file.exists() + ":" + file.length()); if(file.exists()) file.delete(); boolean renamed = tmpOutputFile.renameTo(file); if(logger.isInfoEnabled()) logger.info("renamed:" + renamed); if(cacheName.equals("pageCache")) numberOfPageCacheFiles.incrementAndGet(); } } } catch (Exception e) { logger.warn("Problem storing data to file:" + e.getMessage()); } } public static void clearPageCache(String key) { clearCache("pageCache", key); /* try { String firstPart = ("" + key.hashCode()).substring(0, 3); String dir = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches" + File.separator + "pageCache" + File.separator + firstPart; File dirFile = new File(dir); dirFile.mkdirs(); File file = new File(dir + File.separator + key.hashCode()); if(logger.isInfoEnabled()) logger.info("Deleting " + file.getPath() + ":" + file.exists()); if(file.exists()) { boolean deleted = file.delete(); if(logger.isInfoEnabled()) logger.info("Deleted: " + deleted); } } catch (Exception e) { logger.warn("Problem storing data to file:" + e.getMessage()); } */ } private static void removeCachedContentInFile(String cacheName, String key) { try { String firstPart = ("" + key).substring(0, 3); String dir = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches" + File.separator + cacheName + File.separator + firstPart; File dirFile = new File(dir); dirFile.mkdirs(); File file = new File(dir + File.separator + key); logger.info("Deleting " + file.getPath()); file.delete(); } catch (Exception e) { logger.warn("Problem storing data to file:" + e.getMessage()); } } public static void clearFileCaches() { String dir = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches"; File dirFile = new File(dir); File dirOldFile = new File(dir+"CAN_BE_REMOVED"); if(dirFile.exists()) dirFile.renameTo(dirOldFile); new Thread(new Runnable() { public void run() {try {CacheController.clearFileCachesImpl(new File(CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches_CAN_BE_REMOVED"));} catch (Exception e) {}}}).start(); } public static void clearFileCachesImpl(File dirFile) { //System.out.println("dirFile:" + dirFile.exists()); if(dirFile.exists()) { File[] subCaches = dirFile.listFiles(); for(int i=0; i<subCaches.length; i++) { File subCacheDir = subCaches[i]; //System.out.println("subCacheDir:" + subCacheDir.getName()); if(subCacheDir.isDirectory()) { File[] subSubCacheFiles = subCacheDir.listFiles(); for(int j=0; j<subSubCacheFiles.length; j++) { File subSubCacheDir = subSubCacheFiles[j]; if(subSubCacheDir.isDirectory()) { File[] cacheFiles = subSubCacheDir.listFiles(); for(int k=0; k<cacheFiles.length; k++) { File cacheFile = cacheFiles[k]; //System.out.println("cacheFile:" + cacheFile.getName()); cacheFile.delete(); } subCacheDir.delete(); } //System.out.println("cacheFile:" + cacheFile.getName()); subSubCacheDir.delete(); } subCacheDir.delete(); } } } } public static void clearFileCaches(String cacheName) { CacheController.clearFileCachesImpl(cacheName); //new Thread(new Runnable() { public void run() {try {CacheController.clearFileCachesImpl(cacheName);} catch (Exception e) {}}}).start(); } public static void clearFileCachesImpl(String cacheName) { String dir = CmsPropertyHandler.getDigitalAssetPath() + File.separator + "caches"; File dirFile = new File(dir); //System.out.println("dirFile:" + dirFile.exists()); if(dirFile.exists()) { File[] subCaches = dirFile.listFiles(); for(int i=0; i<subCaches.length; i++) { File subCacheDir = subCaches[i]; //System.out.println("subCacheDir:" + subCacheDir.getName()); if(subCacheDir.isDirectory() && subCacheDir.getName().equals(cacheName) || (cacheName.equals("pageCache") && subCacheDir.getName().startsWith(cacheName))) { try { File[] subSubCacheFiles = subCacheDir.listFiles(); for(int j=0; j<subSubCacheFiles.length; j++) { File subSubCacheDir = subSubCacheFiles[j]; if(subSubCacheDir.isDirectory()) { File[] cacheFiles = subSubCacheDir.listFiles(); if(cacheFiles != null) { for(int k=0; k<cacheFiles.length; k++) { File cacheFile = cacheFiles[k]; //System.out.println("cacheFile:" + cacheFile.getName()); cacheFile.delete(); } } subCacheDir.delete(); } //System.out.println("cacheFile:" + cacheFile.getName()); subSubCacheDir.delete(); } subCacheDir.delete(); } catch (Exception e) { logger.warn("It seems the cache dir: " + cacheName + " was allready empty or removed. Error: " + e.getMessage()); } } } } } /** * Rollbacks a transaction on the named database */ /* public static void closeTransaction(Database db) throws SystemException { //if(db != null && !db.isClosed() && db.isActive()) commitTransaction(db); } */ /** * Begins a transaction on the named database */ public static void beginTransaction(Database db) throws SystemException { try { db.begin(); } catch(Exception e) { logger.error("An error occurred when we tried to begin an transaction. Reason:" + e.getMessage()); throw new SystemException("An error occurred when we tried to begin an transaction. Reason:" + e.getMessage(), e); } } /** * Ends a transaction on the named database */ static void commitTransaction(Database db) throws SystemException { try { if (db.isActive()) { db.commit(); } } catch(Exception e) { logger.error("An error occurred when we tried to commit an transaction. Reason:" + e.getMessage()); throw new SystemException("An error occurred when we tried to commit an transaction. Reason:" + e.getMessage(), e); } } /** * Rollbacks a transaction on the named database */ public static void rollbackTransaction(Database db) { try { if (db.isActive()) { db.rollback(); } } catch(Exception e) { logger.error("An error occurred when we tried to rollback an transaction. Reason:" + e.getMessage()); } } /** * Close the database */ public static void closeDatabase(Database db) { try { db.close(); } catch(Exception e) { logger.error("An error occurred when we tried to close a database. Reason:" + e.getMessage(), e); } } public static int getPropertyAsStringHashCode(String inheritedPageComponentsXML, Integer componentId, String propertyName, Integer siteNodeId, Integer languageId) throws Exception { Map property = null; XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance(); XmlDocument doc = builder.parseReader(new StringReader( inheritedPageComponentsXML ) ); String propertyXPath = "//component[@id=" + componentId + "]/properties/property[@name='" + propertyName + "']"; Xb1XPath xpathObject = new Xb1XPath( propertyXPath ); List anl = xpathObject.selectNodes( doc ); //If not found on the same component id - let's check them all and use the first we find. if(anl == null || anl.size() == 0) { String globalPropertyXPath = "(//component/properties/property[@name='" + propertyName + "'])[1]"; Xb1XPath globalXpathObject = new Xb1XPath( globalPropertyXPath ); anl = globalXpathObject.selectNodes( doc ); } StringBuilder sb = new StringBuilder(); Iterator anlIterator = anl.iterator(); while(anlIterator.hasNext()) { XmlElement infosetItem = (XmlElement)anlIterator.next(); String propertyXML = builder.serializeToString(infosetItem); //System.out.println("propertyXML:" + propertyXML); sb.append(propertyXML); } //System.out.println("propertyXML HASH:" + sb.toString().hashCode()); return sb.toString().hashCode(); } public static int getComponentsAsStringHashCode(String inheritedPageComponentsXML, String componentXPath) throws Exception { XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance(); XmlDocument doc = builder.parseReader(new StringReader( inheritedPageComponentsXML ) ); Xb1XPath xpathObject = new Xb1XPath( componentXPath ); //This keeps track of the cached inherited components. StringBuilder sb = new StringBuilder(); List componentNodeList = xpathObject.selectNodes( doc.getDocumentElement() ); Iterator componentNodeListIterator = componentNodeList.iterator(); while(componentNodeListIterator.hasNext()) { XmlElement child = (XmlElement)componentNodeListIterator.next(); String componentString = builder.serializeToString(child).trim(); sb.append(componentString); //System.out.println("componentString:" + componentString); } //System.out.println("propertyXML HASH:" + sb.toString().hashCode()); return sb.toString().hashCode(); } public static Map getEventListeners() { return eventListeners; } }