1 28 29 package com.opencms.template.cache; 30 31 import org.opencms.file.CmsObject; 32 import org.opencms.main.CmsException; 33 import org.opencms.main.CmsLog; 34 35 import com.opencms.legacy.CmsLegacyException; 36 import com.opencms.legacy.CmsXmlTemplateLoader; 37 import com.opencms.template.CmsMethodCacheDirectives; 38 import com.opencms.template.I_CmsTemplate; 39 40 import java.util.Enumeration ; 41 import java.util.Hashtable ; 42 import java.util.StringTokenizer ; 43 import java.util.Vector ; 44 45 56 public class CmsElementLocator { 57 58 61 private CmsLruCache m_elements; 62 63 66 private Hashtable m_dependenciesExtern = null; 67 68 71 CmsElementLocator(int cacheSize) { 72 if(cacheSize < 2){ 73 cacheSize = 50000; 74 } 75 m_elements = new CmsLruCache(cacheSize); 76 } 77 78 86 private void put(CmsElementDescriptor desc, A_CmsElement element) { 87 Vector removedElement = m_elements.put(desc, element); 88 if(removedElement != null && m_dependenciesExtern != null){ 89 removeElementFromDependencies((CmsElementDescriptor)removedElement.firstElement(), 91 (A_CmsElement)removedElement.lastElement()); 92 } 93 } 94 95 101 public void removeElementFromDependencies(CmsElementDescriptor desc, A_CmsElement element){ 102 if(element.hasDependenciesVariants()){ 103 Vector variantKeys = element.getAllVariantKeys(); 104 String cacheStart = desc.getClassName() +"|"+ desc.getTemplateName() +"|"; 105 for(int i=0; i<variantKeys.size(); i++){ 106 String key = (String )variantKeys.elementAt(i); 107 removeVariantFromDependencies(cacheStart + key, element.getVariant(key)); 108 } 109 } 110 } 111 112 118 public void removeVariantFromDependencies(String key, CmsElementVariant variant){ 119 120 if(variant != null){ 121 Vector variantDeps = variant.getDependencies(); 122 if(variantDeps != null){ 123 for(int j=0; j<variantDeps.size(); j++){ 124 Vector externEntrys = (Vector )m_dependenciesExtern.get(variantDeps.elementAt(j)); 125 if(externEntrys != null){ 126 externEntrys.removeElement(key); 127 } 128 } 129 } 130 } 131 } 132 133 138 public A_CmsElement get(CmsObject cms, CmsElementDescriptor desc, Hashtable parameters) throws CmsException{ 139 A_CmsElement result; 140 result = (A_CmsElement)m_elements.get(desc); 141 if(result == null) { 142 I_CmsTemplate cmsTemplate = null; 145 if("METHOD".equals(desc.getTemplateName())){ 147 String orgClassName = desc.getClassName(); 148 String className = orgClassName.substring(0,orgClassName.lastIndexOf(".")); 149 String methodName = orgClassName.substring(orgClassName.lastIndexOf(".")+1); 150 try { 151 cmsTemplate = (I_CmsTemplate)com.opencms.template.CmsTemplateClassManager.getClassInstance(className); 152 CmsMethodCacheDirectives mcd = (CmsMethodCacheDirectives)cmsTemplate.getClass().getMethod( 153 "getMethodCacheDirectives", new Class [] { 154 CmsObject.class, String .class}).invoke(cmsTemplate, 155 new Object [] {cms, methodName}); 156 result = new CmsMethodElement(className, methodName, mcd, 157 CmsXmlTemplateLoader.getElementCache().getVariantCachesize()); 158 put(desc, result); 159 } catch(Throwable e) { 160 if(CmsLog.getLog(this).isErrorEnabled()) { 161 CmsLog.getLog(this).error("Could not initialize method element for class \"" + className + "\"", e); 162 return null; 163 } 164 } 165 }else{ 166 try { 167 cmsTemplate = (I_CmsTemplate)com.opencms.template.CmsTemplateClassManager.getClassInstance(desc.getClassName()); 168 result = cmsTemplate.createElement(cms, desc.getTemplateName(), parameters); 169 put(desc, result); 170 } catch(Throwable e) { 171 if(CmsLog.getLog(this).isErrorEnabled()) { 172 CmsLog.getLog(this).error("Could not initialize (sub-)element for class \"" + desc.getClassName() + "\"", e); 173 throw new CmsLegacyException("Could not initialize (sub-)element for class \"" + 174 desc.getClassName() + "\". " +e.toString() , CmsLegacyException.C_XML_WRONG_TEMPLATE_CLASS); 175 } 176 } 177 } 178 } 179 return result; 180 } 181 182 187 public Vector getCacheInfo(){ 188 return m_elements.getCacheInfo(); 189 } 190 191 196 public void printCacheInfo(int selector){ 197 198 if(selector == 1){ 199 System.err.println(""); 201 System.err.println(""); 202 System.err.println("======================="); 203 System.err.println("The dependencies stores"); 204 System.err.println("======================="); 205 System.err.println(""); 206 System.err.println("======================="); 207 System.err.println("The extern Hashtable:"); 208 System.err.println("======================="); 209 int countExtern = 0; 210 int countIntern = 0; 211 if(m_dependenciesExtern != null){ 212 Enumeration enu = m_dependenciesExtern.keys(); 213 int count = 1; 214 System.err.println(""); 215 while(enu.hasMoreElements()){ 216 String key = (String )enu.nextElement(); 217 System.err.println("<"+count+"> "+key); 218 Vector entrysVector = (Vector )m_dependenciesExtern.get(key); 219 if(entrysVector == null){ 220 System.err.println(" Vector is null."); 221 }else{ 222 if(entrysVector.size() == 0){ 223 System.err.println(" Vector is empty."); 224 } 225 for(int i=0; i<entrysVector.size(); i++){ 226 System.err.println(" ("+i+") "+(String )entrysVector.elementAt(i)); 227 countExtern++; 228 } 229 } 230 System.err.println(""); 231 count++; 232 } 233 }else{ 234 System.err.println("... is null!"); 235 } 236 System.err.println(""); 237 System.err.println("==================================="); 238 System.err.println("The values in the element Variants:"); 239 System.err.println("==================================="); 240 Vector elementKeys = m_elements.getAllKeys(); 242 for(int i=0; i<elementKeys.size(); i++){ 243 A_CmsElement element = (A_CmsElement)m_elements.get(elementKeys.elementAt(i)); 244 if(element.hasDependenciesVariants()){ 245 System.err.println(""); 246 System.err.println("<"+i+"> element:"+element.toString()); 247 Vector variants = element.getAllVariantKeys(); 248 if(variants == null || variants.size() == 0){ 249 System.err.println(" no variants."); 250 }else{ 251 for(int j=0; j<variants.size(); j++){ 253 CmsElementVariant vari = element.getVariant(variants.elementAt(j)); 254 System.err.println(""); 255 System.err.println(" ("+j+")variant:"+(String )variants.elementAt(j)); 256 System.err.println(" timed:"+vari.isTimeCritical() + " nextTimeOut:"+vari.getNextTimeout() ); 257 Vector currentDeps = vari.getDependencies(); 258 if(currentDeps == null || currentDeps.size() == 0){ 259 System.err.println(" no dependencies in this element"); 260 }else{ 261 for(int k=0; k<currentDeps.size(); k++){ 262 System.err.println(" ["+k+"] "+(String )currentDeps.elementAt(k)); 263 countIntern++; 264 } 265 System.err.println(""); 266 } 267 } 268 } 269 } 270 } 271 System.err.println(""); 272 System.err.println("=================================="); 273 System.err.println("==== found in Extern store: "+countExtern); 274 System.err.println("==================================="); 275 System.err.println("==== found in Intern store: "+countIntern); 276 System.err.println("==================================="); 277 System.err.println(""); 278 } 279 } 280 281 285 public void cleanupElementCache(Vector invalidTemplates){ 286 287 cleanupExternDependencies(m_elements.deleteElementsAfterPublish()); 288 for(int i=0; i < invalidTemplates.size(); i++){ 289 cleanupExternDependencies( 290 m_elements.deleteElementsByTemplate((String )invalidTemplates.elementAt(i))); 291 } 292 } 293 294 303 public void cleanupDependencies(Vector invalidResources){ 304 305 if(invalidResources != null){ 306 for(int i=0; i<invalidResources.size(); i++){ 307 Enumeration extKeys = m_dependenciesExtern.keys(); 308 String aktInvalid = (String )invalidResources.elementAt(i); 309 while(extKeys.hasMoreElements()){ 310 String current = (String )extKeys.nextElement(); 311 if(aktInvalid.startsWith(current) || current.startsWith(aktInvalid)){ 312 Vector variantsToDelete = (Vector )m_dependenciesExtern.get(current); 313 if(variantsToDelete != null){ 314 for(int j=0; j < variantsToDelete.size(); j++){ 316 String variantKey = (String )variantsToDelete.elementAt(j); 317 StringTokenizer tocy = new StringTokenizer (variantKey, "|", false); 319 String classname = tocy.nextToken(); 320 String templatename = tocy.nextToken(); 321 String cacheDirectivesKey = tocy.nextToken(); 322 CmsElementDescriptor desc = new CmsElementDescriptor(classname, templatename); 323 A_CmsElement currentElement = (A_CmsElement)m_elements.get(desc); 324 if(currentElement != null){ 325 removeVariantFromDependencies(variantKey, currentElement.getVariant(cacheDirectivesKey)); 326 currentElement.removeVariant(cacheDirectivesKey); 327 } 328 } 329 } 330 } 331 } 332 } 333 Enumeration extKeys = m_dependenciesExtern.keys(); 335 while(extKeys.hasMoreElements()){ 336 String currentKey = (String )extKeys.nextElement(); 337 Vector currentValue = (Vector )m_dependenciesExtern.get(currentKey); 338 if(currentValue == null || currentValue.size() == 0){ 339 m_dependenciesExtern.remove(currentKey); 340 } 341 } 342 } 343 } 344 345 353 private void cleanupExternDependencies(Vector elements){ 354 if(elements != null){ 355 for(int i=0; i<elements.size(); i++){ 356 Vector actElement = (Vector )elements.elementAt(i); 357 removeElementFromDependencies((CmsElementDescriptor)actElement.firstElement(), 358 (A_CmsElement)actElement.lastElement()); 359 } 360 } 361 } 362 363 366 public void clearCache(){ 367 m_elements.clearCache(); 368 if(m_dependenciesExtern != null){ 369 m_dependenciesExtern.clear(); 370 } 371 } 372 373 377 public Hashtable getExternDependencies(){ 378 return m_dependenciesExtern; 379 } 380 381 384 public void setExternDependencies(Hashtable externDeps){ 385 m_dependenciesExtern = externDeps; 386 } 387 388 } | Popular Tags |