1 28 29 package com.opencms.template; 30 31 import org.opencms.file.CmsObject; 32 import org.opencms.file.CmsPropertyDefinition; 33 import org.opencms.file.CmsRequestContext; 34 import org.opencms.i18n.CmsEncoder; 35 import org.opencms.importexport.CmsCompatibleCheck; 36 import org.opencms.main.CmsException; 37 import org.opencms.main.CmsLog; 38 import org.opencms.main.OpenCms; 39 import org.opencms.staticexport.CmsLinkManager; 40 import org.opencms.workplace.editors.CmsDefaultPageEditor; 41 42 import com.opencms.defaults.A_CmsContentDefinition; 43 import com.opencms.defaults.I_CmsTimedContentDefinition; 44 import com.opencms.legacy.CmsLegacyException; 45 import com.opencms.legacy.CmsXmlTemplateLoader; 46 import com.opencms.template.cache.A_CmsElement; 47 import com.opencms.template.cache.CmsElementCache; 48 import com.opencms.template.cache.CmsElementDefinition; 49 import com.opencms.template.cache.CmsElementDefinitionCollection; 50 import com.opencms.template.cache.CmsElementDescriptor; 51 import com.opencms.template.cache.CmsElementVariant; 52 import com.opencms.template.cache.CmsElementXml; 53 54 import java.util.Enumeration ; 55 import java.util.Hashtable ; 56 import java.util.Vector ; 57 58 import javax.servlet.http.HttpServletRequest ; 59 60 69 public class CmsXmlTemplate extends A_CmsTemplate implements I_CmsXmlTemplate { 70 71 72 public static final String C_BODY_ELEMENT = CmsDefaultPageEditor.XML_BODY_ELEMENT; 73 74 75 public static final boolean C_DEBUG = true; 76 77 78 public static final String C_FRAME_SELECTOR = "cmsframe"; 79 80 83 protected static com.opencms.template.I_CmsTemplateCache m_cache; 84 85 86 private static final String C_ELEMENT = "_ELEMENT_"; 87 88 89 private static final String C_ERRORTEXT = "ERROR!"; 90 91 95 private int m_counter; 96 97 110 public CmsCacheDirectives collectCacheDirectives(CmsObject cms, String templateFile, 111 String elementName, Hashtable parameters, String templateSelector) { 112 113 boolean isCacheable = isCacheable(cms, templateFile, elementName, parameters, templateSelector); 115 boolean isProxyPrivateCacheable = isProxyPrivateCacheable(cms, templateFile, elementName, parameters, templateSelector); 116 boolean isProxyPublicCacheable = isProxyPublicCacheable(cms, templateFile, elementName, parameters, templateSelector); 117 boolean isExportable = isExportable(cms, templateFile, elementName, parameters, templateSelector); 118 boolean isStreamable = isStreamable(cms, templateFile, elementName, parameters, templateSelector); 119 CmsCacheDirectives result = new CmsCacheDirectives(isCacheable, isProxyPrivateCacheable, 120 isProxyPublicCacheable, isExportable, isStreamable); 121 122 CmsXmlTemplateFile doc = null; 124 Vector subtemplates = null; 125 try { 126 doc = this.getOwnTemplateFile(cms, templateFile, elementName, parameters, templateSelector); 127 doc.init(cms, templateFile); 128 subtemplates = doc.getAllSubElements(); 129 130 int numSubtemplates = subtemplates.size(); 132 for (int i = 0; i < numSubtemplates; i++) { 133 String elName = (String )subtemplates.elementAt(i); 134 String className = null; 135 String templateName = null; 136 137 className = getTemplateClassName(elName, doc, parameters); 138 templateName = getTemplateFileName(elName, doc, parameters); 139 140 if (className != null) { 141 I_CmsTemplate templClass = (I_CmsTemplate)CmsTemplateClassManager.getClassInstance(className); 142 CmsCacheDirectives cd2 = templClass.collectCacheDirectives(cms, templateName, elName, parameters, null); 143 149 150 result.merge(cd2); 152 155 } else { 156 return new CmsCacheDirectives(false); 161 } 162 } 163 } catch (CmsException e) { 164 if (CmsLog.getLog(this).isInfoEnabled()) { 165 CmsLog.getLog(this).info("Can not determine cache directives for my template file " 166 + templateFile, e); 167 return new CmsCacheDirectives(false); 168 } 169 } 170 return result; 171 172 } 173 174 188 public Integer counter(CmsObject cms, String tagcontent, A_CmsXmlContent doc, Object userObject) 189 throws CmsException { 190 191 m_counter++; 192 return new Integer (m_counter); 193 } 194 195 207 public A_CmsElement createElement(CmsObject cms, String templateFile, Hashtable parameters) { 208 209 CmsElementDefinitionCollection subtemplateDefinitions = new CmsElementDefinitionCollection(); 210 int variantCachesize = 100; 211 try { 217 CmsElementCache elementCache = CmsXmlTemplateLoader.getElementCache(); 218 variantCachesize = elementCache.getVariantCachesize(); 219 220 CmsXmlTemplateFile xmlTemplateDocument = getOwnTemplateFile(cms, templateFile, null, parameters, null); 221 222 Vector subtemplates = xmlTemplateDocument.getAllSubElementDefinitions(); 223 224 int numSubtemplates = subtemplates.size(); 225 for (int i = 0; i < numSubtemplates; i++) { 226 String elName = (String )subtemplates.elementAt(i); 227 String className = null; 228 String templateName = null; 229 String templateSelector = null; 230 231 if (xmlTemplateDocument.hasSubtemplateClass(elName)) { 232 className = xmlTemplateDocument.getSubtemplateClass(elName); 233 } 234 235 if (xmlTemplateDocument.hasSubtemplateFilename(elName)) { 236 templateName = xmlTemplateDocument.getSubtemplateFilename(elName); 237 } 238 239 if (xmlTemplateDocument.hasSubtemplateSelector(elName)) { 240 templateSelector = xmlTemplateDocument.getSubtemplateSelector(elName); 241 } 242 Hashtable templateParameters = xmlTemplateDocument.getParameters(elName); 243 if (className != null || templateName != null || templateSelector != null 244 || templateParameters.size() > 0) { 245 if (className == null) { 246 className = CmsCompatibleCheck.XML_CONTROL_DEFAULT_CLASS; 247 } 248 if (templateName != null) { 249 templateName = CmsLinkManager.getAbsoluteUri(templateName, templateFile); 250 } 251 CmsElementDefinition elDef = new CmsElementDefinition(elName, className, 252 templateName, templateSelector, templateParameters); 253 subtemplateDefinitions.add(elDef); 254 } 255 } 256 } catch (Exception e) { 257 if (templateFile != null) { 258 if (CmsLog.getLog(this).isWarnEnabled()) { 259 CmsLog.getLog(this).warn("Could not generate my template cache element", e); 260 } 261 } 262 } 263 CmsElementXml result = new CmsElementXml(getClass().getName(), templateFile, 264 getCacheDirectives(cms, templateFile, null, parameters, null), subtemplateDefinitions, 265 variantCachesize); 266 return result; 267 } 268 269 279 public CmsCacheDirectives getCacheDirectives(CmsObject cms, String templateFile, 280 String elementName, Hashtable parameters, String templateSelector) { 281 282 CmsCacheDirectives result = new CmsCacheDirectives(true); 284 Vector para = new Vector (); 285 para.add("cmsframe"); 286 result.setCacheParameters(para); 287 return result; 288 } 289 290 310 public byte[] getContent(CmsObject cms, String templateFile, String elementName, 311 Hashtable parameters) throws CmsException { 312 313 return getContent(cms, templateFile, elementName, parameters, null); 314 } 315 316 329 public byte[] getContent(CmsObject cms, String templateFile, String elementName, 330 Hashtable parameters, String templateSelector) throws CmsException { 331 332 if (CmsLog.getLog(this).isDebugEnabled() && C_DEBUG) { 333 CmsLog.getLog(this).debug("[CmsXmlTemplate] getting content of element " 334 + ((elementName == null) ? "<root>" : elementName)); 335 CmsLog.getLog(this).debug("[CmsXmlTemplate] template file is: " + templateFile); 336 CmsLog.getLog(this).debug("[CmsXmlTemplate] selected template section is: " 337 + ((templateSelector == null) ? "<default>" : templateSelector)); 338 } 339 CmsXmlTemplateFile xmlTemplateDocument = getOwnTemplateFile(cms, templateFile, elementName, parameters, templateSelector); 340 if (templateSelector == null || "".equals(templateSelector)) { 341 templateSelector = (String )parameters.get(C_FRAME_SELECTOR); 342 } 343 return startProcessing(cms, xmlTemplateDocument, elementName, parameters, templateSelector); 344 } 345 346 359 public Object getDescription(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 360 Object userObject) throws CmsException { 361 362 String requestedUri = cms.getRequestContext().getUri(); 363 String description = cms.readProperty(requestedUri, CmsPropertyDefinition.PROPERTY_DESCRIPTION); 364 if (description == null) { 365 description = ""; 366 } 367 return description; 368 } 369 370 public Object getEncoding(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 371 Object userObject) throws CmsException { 372 373 return cms.getRequestContext().getEncoding(); 374 } 375 376 384 public Object getFileUri(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 385 Object userObject) throws CmsException { 386 387 String uri = cms.getRequestContext().getUri(); 388 return uri.substring(uri.lastIndexOf("/") + 1); 389 } 390 391 404 public Object getFrameQueryString(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 405 Object userObject) throws CmsException { 406 407 String query = new String (); 408 try { 410 Enumeration parameters = (CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()).getParameterNames(); 411 StringBuffer paramQuery = new StringBuffer (); 412 while (parameters.hasMoreElements()) { 413 String name = (String )parameters.nextElement(); 414 String value = (String )((Hashtable )userObject).get(name); 415 if (value != null && !"".equals(value)) { 416 paramQuery.append(name + "=" + value + "&"); 417 } 418 } 419 if (paramQuery.length() > 0) { 420 query = paramQuery.substring(0, paramQuery.length() - 1).toString(); 422 } 423 } catch (Exception exc) { 424 exc.printStackTrace(); 425 } 426 427 String frame = "", param = ""; 429 if (!tagcontent.equals("")) { 430 if (!tagcontent.startsWith("&")) { 431 if (tagcontent.indexOf(",") != -1) { 432 frame = tagcontent.substring(0, tagcontent.indexOf(",")); 433 param = tagcontent.substring(tagcontent.indexOf(",") + 1); 434 } else { 435 frame = tagcontent; 436 } 437 } else { 438 param = tagcontent; 439 } 440 } 441 query = (query == null ? "" : query); 442 if (!query.equals("")) { 443 if (query.indexOf("cmsframe=") != -1) { 444 int start = query.indexOf("cmsframe="); 445 int end = query.indexOf("&", start); 446 String cmsframe = ""; 447 if (end != -1) { 448 cmsframe = query.substring(start + 9, end); 449 } else { 450 cmsframe = query.substring(start + 9); 451 } 452 if (!cmsframe.equals("plain")) { 453 if (!frame.equals("")) { 454 if (end != -1) { 455 query = query.substring(0, start + 9) + frame + query.substring(end); 456 } else { 457 query = query.substring(0, start + 9) + frame; 458 } 459 } else { 460 if (end != -1) { 461 query = query.substring(0, start) + query.substring(end + 1); 462 } else { 463 query = query.substring(0, start); 464 } 465 } 466 } 467 } else { 468 if (!tagcontent.equals("")) { 469 query = query + "&cmsframe=" + frame; 470 } 471 } 472 if (!query.equals("")) { 473 query = "?" + query; 474 } 475 } else { 476 if (!frame.equals("")) { 477 query = "?cmsframe=" + frame; 478 } 479 } 480 if (!query.equals("")) { 481 query = query + param; 482 } else { 483 query = "?" + param.substring(param.indexOf("&") + 1); 484 } 485 if (query.trim().equals("?") || query.trim().equals("&") || query.trim().equals("?&") 486 || query.trim().equals("??")) { 487 query = ""; 488 } 489 return query; 490 } 491 492 505 public Object getFrameTarget(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 506 Object userObject) throws CmsException { 507 508 String target = ""; 509 String cmsframe = (String )((Hashtable )userObject).get("cmsframe"); 510 cmsframe = (cmsframe == null ? "" : cmsframe); 511 if (cmsframe.equals("plain")) { 512 target = ""; 513 } else { 514 if (tagcontent.equals("")) { 515 target = "target=_top"; 516 } else { 517 target = "target=" + tagcontent; 518 } 519 } 520 return target; 521 } 522 523 537 public Object getKey(CmsObject cms, String templateFile, Hashtable parameters, 538 String templateSelector) { 539 540 CmsRequestContext reqContext = cms.getRequestContext(); 541 String result = "" + reqContext.currentProject().getId() + ":" 542 + reqContext.currentUser().getName() + reqContext.getUri() 543 + reqContext.addSiteRoot(templateFile); 544 Enumeration keys = parameters.keys(); 545 while (keys.hasMoreElements()) { 546 String key = (String )keys.nextElement(); 547 result = result + key + parameters.get(key); 548 } 549 result = result + templateSelector; 550 return result; 551 } 552 553 566 public Object getKeywords(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 567 Object userObject) throws CmsException { 568 569 String requestedUri = cms.getRequestContext().getUri(); 570 String keywords = cms.readProperty(requestedUri, CmsPropertyDefinition.PROPERTY_KEYWORDS); 571 if (keywords == null) { 572 keywords = ""; 573 } 574 return keywords; 575 } 576 577 582 public CmsMethodCacheDirectives getMethodCacheDirectives(CmsObject cms, String methodName) { 583 584 if ("getTitle".equals(methodName) || "getUri".equals(methodName) 585 || "getFileUri".equals(methodName) || "getDescription".equals(methodName) 586 || "getKeywords".equals(methodName) || "getProperty".equals(methodName) 587 || "getPathUri".equals(methodName)) { 588 CmsMethodCacheDirectives mcd = new CmsMethodCacheDirectives(true); 589 mcd.setCacheUri(true); 590 return mcd; 591 } 592 if ("getFrameQueryString".equals(methodName) || "getQueryString".equals(methodName) 593 || "getRequestIp".equals(methodName) || "getSessionId".equals(methodName) 594 || "getUriWithParameter".equals(methodName) || "parameters".equals(methodName) 595 || "getStylesheet".equals(methodName)) { 596 return new CmsMethodCacheDirectives(false); 597 } 598 return null; 599 } 600 601 616 public CmsXmlTemplateFile getOwnTemplateFile(CmsObject cms, String templateFile, 617 String elementName, Hashtable parameters, String templateSelector) throws CmsException { 618 619 CmsXmlTemplateFile xmlTemplateDocument = new CmsXmlTemplateFile(cms, templateFile); 620 return xmlTemplateDocument; 621 } 622 623 633 public Object getPathUri(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 634 Object userObject) throws CmsException { 635 636 String path = cms.getRequestContext().getUri(); 637 path = path.substring(0, path.lastIndexOf("/") + 1); 638 path = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getServletUrl() + path; 639 return path.getBytes(); 640 } 641 642 655 public Object getProperty(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 656 Object userObject) throws CmsException { 657 658 String requestedUri = cms.getRequestContext().getUri(); 659 String value = ""; 660 try { 661 value = cms.readProperty(requestedUri, tagcontent); 662 } catch (Exception e) { 663 if (CmsLog.getLog(this).isWarnEnabled()) { 664 CmsLog.getLog(this).warn("Usermethod getProperty throwed an Exception getting " 665 + tagcontent, e); 666 } 667 } 668 if (value == null) { 669 value = ""; 670 } 671 return value; 672 } 673 674 687 public Object getQueryString(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 688 Object userObject) throws CmsException { 689 690 String query = (CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()).getQueryString(); 691 if (query != null && !"".equals(query)) { 692 query = "?" + query; 693 } 694 return query; 695 } 696 697 710 public String getRequestIp(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 711 Object userObject) throws CmsException { 712 713 return (CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()).getRemoteAddr(); 714 } 715 716 730 public Object getServletPath(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 731 Object userObject) throws CmsException { 732 733 return CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getServletUrl() + "/"; 734 } 735 736 749 public String getSessionId(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 750 Object userObject) throws CmsException { 751 752 return (CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()).getSession(true).getId(); 753 } 754 755 778 public String getStylesheet(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 779 Object userObject) throws CmsException { 780 781 String styleSheetUri = null; 782 try { 783 styleSheetUri = getStylesheet(cms, tagcontent, null, doc, userObject); 784 } catch (CmsException e) { 785 } 787 if ((styleSheetUri == null) || ("".equals(styleSheetUri))) { 788 styleSheetUri = getStylesheet(cms, tagcontent, "frametemplate", doc, userObject); 789 } if (styleSheetUri == null) { 791 styleSheetUri = ""; 792 } 793 return styleSheetUri; 794 } 795 796 809 public Object getTitle(CmsObject cms, String tagcontent, A_CmsXmlContent doc, Object userObject) 810 throws CmsException { 811 812 String requestedUri = cms.getRequestContext().getUri(); 813 String title = cms.readProperty(requestedUri, CmsPropertyDefinition.PROPERTY_TITLE); 814 if (title == null) { 815 return ""; 816 } 817 return title; 818 } 819 820 834 public Object getTitleEscaped(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 835 Object userObject) throws CmsException { 836 837 String requestedUri = cms.getRequestContext().getUri(); 838 String title = cms.readProperty(requestedUri, CmsPropertyDefinition.PROPERTY_TITLE); 839 if (title == null) { 840 return ""; 841 } 842 return CmsEncoder.escapeHtml(title); 843 } 844 845 853 public Object getUri(CmsObject cms, String tagcontent, A_CmsXmlContent doc, Object userObject) 854 throws CmsException { 855 856 String res = cms.getRequestContext().getUri(); 857 if (tagcontent == null || "".equals(tagcontent)) { 858 return OpenCms.getLinkManager().substituteLink(cms, res).getBytes(); 859 } else { 860 return OpenCms.getLinkManager().substituteLink(cms, res + "?" + tagcontent).getBytes(); 861 } 862 } 863 864 872 public Object getUriWithParameter(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 873 Object userObject) throws CmsException { 874 875 String query = new String (); 876 try { 878 Enumeration parameters = ((HttpServletRequest )CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest()).getParameterNames(); 879 StringBuffer paramQuery = new StringBuffer (); 880 while (parameters.hasMoreElements()) { 881 String name = (String )parameters.nextElement(); 882 String value = (String )((Hashtable )userObject).get(name); 883 if (value != null && !"".equals(value)) { 884 paramQuery.append(name + "=" + value + "&"); 885 } 886 } 887 if (paramQuery.length() > 0) { 888 query = paramQuery.substring(0, paramQuery.length() - 1).toString(); 890 } 891 } catch (Exception exc) { 892 exc.printStackTrace(); 893 } 894 895 if ((tagcontent != null) && (!"".equals(tagcontent))) { 897 if (tagcontent.startsWith("?")) { 898 tagcontent = tagcontent.substring(1); 899 } 900 query = tagcontent + "&" + query; 901 } 902 return getUri(cms, query, doc, userObject); 903 } 904 905 929 public boolean isStreamable(CmsObject cms, String templateFile, String elementName, 930 Hashtable parameters, String templateSelector) { 931 932 return true; 933 } 934 935 939 public final boolean isTemplateCacheSet() { 940 941 return m_cache != null; 942 } 943 944 956 public Object mergeAbsolutePath(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 957 Object userObject) throws CmsException { 958 959 return CmsLinkManager.getAbsoluteUri(tagcontent, doc.getAbsoluteFilename()).getBytes(); 960 } 961 962 974 public Object mergeAbsoluteUrl(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 975 Object userObject) throws CmsException { 976 977 String ocPath = new String ((byte[])mergeAbsolutePath(cms, tagcontent, doc, userObject)); 978 String servletPath = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getServletUrl(); 979 return (servletPath + ocPath).getBytes(); 980 } 981 982 995 public String parameters(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 996 Object userObject) { 997 998 Hashtable param = (Hashtable )userObject; 999 Enumeration keys = param.keys(); 1000 String s = ""; 1001 while (keys.hasMoreElements()) { 1002 String key = (String )keys.nextElement(); 1003 s = s + "<B>" + key + "</B>: " + param.get(key) + "<BR>"; 1004 } 1005 s = s + "<B>" + tagcontent + "</B><BR>"; 1006 return s; 1007 } 1008 1009 public Object setEncoding(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 1010 Object userObject) throws CmsException { 1011 1012 if ((tagcontent != null) && !"".equals(tagcontent)) { 1013 cms.getRequestContext().setEncoding(tagcontent.trim()); 1014 } 1015 return ""; 1016 } 1017 1018 1024 public final void setTemplateCache(I_CmsTemplateCache c) { 1025 1026 m_cache = c; 1027 } 1028 1029 1041 public boolean shouldReload(CmsObject cms, String templateFile, String elementName, 1042 Hashtable parameters, String templateSelector) { 1043 1044 return false; 1045 } 1046 1047 1062 public Object templateElement(CmsObject cms, String tagcontent, A_CmsXmlContent doc, 1063 Object userObject) throws CmsException { 1064 1065 CmsXmlTemplateFile templateFile = (CmsXmlTemplateFile)doc; 1067 1068 boolean isAnonymousUser = cms.getRequestContext().currentUser().isGuestUser(); 1070 1071 Hashtable parameterHashtable = (Hashtable )((Hashtable )userObject).clone(); 1073 1074 String templateClass = getTemplateClassName(tagcontent, templateFile, parameterHashtable); 1076 1077 String templateFilename = CmsLinkManager.getAbsoluteUri(getTemplateFileName(tagcontent, templateFile, parameterHashtable), doc.getAbsoluteFilename()); 1079 1080 String templateSelector = getTemplateSelector(tagcontent, templateFile, parameterHashtable); 1082 1083 byte[] result = null; 1085 1086 Object loadedObject = null; 1088 1089 I_CmsTemplate subTemplate = null; 1091 1092 Object subTemplateKey = null; 1094 1095 try { 1097 loadedObject = CmsTemplateClassManager.getClassInstance(templateClass); 1098 } catch (CmsException e) { 1099 1100 templateFile.removeFromFileCache(); 1102 if (isAnonymousUser) { 1103 1104 return C_ERRORTEXT; 1106 } else { 1107 throw e; 1109 } 1110 } 1111 1112 if (!(loadedObject instanceof I_CmsTemplate)) { 1114 String errorMessage = "Class " + templateClass + " is no OpenCms template class."; 1115 if (CmsLog.getLog(this).isErrorEnabled()) { 1116 CmsLog.getLog(this).error(errorMessage); 1117 } 1118 throw new CmsLegacyException(errorMessage, CmsLegacyException.C_XML_NO_TEMPLATE_CLASS); 1119 } 1120 subTemplate = (I_CmsTemplate)loadedObject; 1121 1122 Vector parameterTags = null; 1124 parameterTags = templateFile.getParameterNames(tagcontent); 1125 if (parameterTags != null) { 1126 int numParameterTags = parameterTags.size(); 1127 for (int i = 0; i < numParameterTags; i++) { 1128 String paramName = (String )parameterTags.elementAt(i); 1129 String paramValue = templateFile.getParameter(tagcontent, paramName); 1130 if (!parameterHashtable.containsKey(paramName)) { 1131 parameterHashtable.put(tagcontent + "." + paramName, paramValue); 1132 } 1133 } 1134 } 1135 1136 parameterHashtable.put(C_ELEMENT, tagcontent); 1139 1140 if (subTemplate.collectCacheDirectives(cms, templateFilename, tagcontent, parameterHashtable, null).isInternalCacheable()) { 1143 subTemplateKey = subTemplate.getKey(cms, templateFilename, parameterHashtable, null); 1144 if (m_cache != null 1145 && m_cache.has(subTemplateKey) 1146 && (!subTemplate.shouldReload(cms, templateFilename, tagcontent, parameterHashtable, null))) { 1147 result = m_cache.get(subTemplateKey); 1148 } 1149 } 1150 1151 if (result == null) { 1153 try { 1154 result = subTemplate.getContent(cms, templateFilename, tagcontent, parameterHashtable, templateSelector); 1155 } catch (Exception e) { 1156 1157 1159 if (CmsLog.getLog(this).isErrorEnabled()) { 1161 CmsLog.getLog(this).error("Could not generate output for template file \"" 1162 + templateFilename + "\" included as element \"" + tagcontent + "\"", e); 1163 } 1164 1165 if (isAnonymousUser) { 1167 return C_ERRORTEXT; 1168 } else { 1169 if (e instanceof CmsException) { 1170 throw (CmsException)e; 1171 } else { 1172 throw new CmsLegacyException( 1173 "Error while executing getContent for subtemplate \"" + tagcontent 1174 + "\". " + e); 1175 } 1176 } 1177 } 1178 1179 if (subTemplate.collectCacheDirectives(cms, templateFilename, tagcontent, parameterHashtable, null).isInternalCacheable() 1182 && m_cache != null) { 1183 1184 m_cache.put(subTemplateKey, result); 1186 } 1187 } 1188 return new CmsProcessedString(result, cms.getRequestContext().getEncoding()); 1189 } 1190 1191 1202 protected String getTemplateClassName(String elementName, CmsXmlTemplateFile doc, 1203 Hashtable parameters) throws CmsException { 1204 1205 String result = null; 1206 if (parameters.containsKey(elementName + "._CLASS_")) { 1207 result = (String )parameters.get(elementName + "._CLASS_"); 1208 } else { 1209 if (doc.hasSubtemplateClass(elementName)) { 1210 result = doc.getSubtemplateClass(elementName); 1211 } else { 1212 1213 if (parameters.containsKey("body._CLASS_")) { 1215 result = (String )parameters.get("body._CLASS_"); 1216 } 1217 } 1218 } 1219 if (result == null) { 1220 CmsElementDefinitionCollection elDefs = (CmsElementDefinitionCollection)parameters.get("_ELDEFS_"); 1221 if (elDefs != null) { 1222 CmsElementDefinition elDef = elDefs.get(elementName); 1223 if (elDef != null) { 1224 result = elDef.getClassName(); 1225 } 1226 } 1227 } 1228 return result; 1229 } 1230 1231 1242 protected String getTemplateFileName(String elementName, CmsXmlTemplateFile doc, 1243 Hashtable parameters) throws CmsException { 1244 1245 String result = null; 1246 if (parameters.containsKey(elementName + "._TEMPLATE_")) { 1247 result = (String )parameters.get(elementName + "._TEMPLATE_"); 1248 } else { 1249 if (doc.hasSubtemplateFilename(elementName)) { 1250 result = doc.getSubtemplateFilename(elementName); 1251 } else { 1252 if (parameters.containsKey("body._TEMPLATE_")) { 1254 result = (String )parameters.get("body._TEMPLATE_"); 1255 } 1256 } 1257 } 1258 if (result == null) { 1259 CmsElementDefinitionCollection elDefs = (CmsElementDefinitionCollection)parameters.get("_ELDEFS_"); 1260 if (elDefs != null) { 1261 CmsElementDefinition elDef = elDefs.get(elementName); 1262 if (elDef != null) { 1263 result = elDef.getTemplateName(); 1264 } 1265 } 1266 } 1267 return result; 1268 } 1269 1270 1281 protected String getTemplateSelector(String elementName, CmsXmlTemplateFile doc, 1282 Hashtable parameters) throws CmsException { 1283 1284 if (parameters.containsKey(elementName + "._TEMPLATESELECTOR_")) { 1285 return (String )parameters.get(elementName + "._TEMPLATESELECTOR_"); 1286 } else { 1287 if (doc.hasSubtemplateSelector(elementName)) { 1288 return doc.getSubtemplateSelector(elementName); 1289 } else { 1290 CmsElementDefinitionCollection elDefs = (CmsElementDefinitionCollection)parameters.get("_ELDEFS_"); 1291 if (elDefs != null) { 1292 CmsElementDefinition elDef = elDefs.get(elementName); 1293 if (elDef != null) { 1294 return elDef.getTemplateSelector(); 1295 } 1296 } 1297 return null; 1298 } 1299 } 1300 } 1301 1302 1321 protected void registerVariantDeps(CmsObject cms, String templateName, String elementName, 1322 String templateSelector, Hashtable parameters, Vector vfsDeps, Vector cosDeps, 1323 Vector cosClassDeps) throws CmsException { 1324 1325 String cacheKey = getCacheDirectives(cms, templateName, elementName, parameters, templateSelector).getCacheKey(cms, parameters); 1326 if (CmsXmlTemplateLoader.isElementCacheEnabled() && (cacheKey != null) 1327 && (cms.getRequestContext().currentProject().isOnlineProject())) { 1328 boolean exportmode = false; 1329 Hashtable externVarDeps = CmsXmlTemplateLoader.getVariantDependencies(); 1330 long exTimeForVariant = Long.MAX_VALUE; 1331 long now = System.currentTimeMillis(); 1332 String variantEntry = getClass().getName() + "|" + templateName + "|" + cacheKey; 1334 1335 Vector allDeps = new Vector (); 1337 if (cosDeps != null) { 1339 for (int i = 0; i < cosDeps.size(); i++) { 1340 A_CmsContentDefinition contentDef = (A_CmsContentDefinition)cosDeps.elementAt(i); 1341 String key = cms.getRequestContext().addSiteRoot(contentDef.getClass().getName() 1342 + "/" + contentDef.getUniqueId(cms)); 1343 allDeps.add(key); 1347 if (contentDef.isTimedContent()) { 1348 long time = ((I_CmsTimedContentDefinition)cosDeps.elementAt(i)).getPublicationDate(); 1349 if (time > now && time < exTimeForVariant) { 1350 exTimeForVariant = time; 1351 } 1352 time = ((I_CmsTimedContentDefinition)cosDeps.elementAt(i)).getPurgeDate(); 1353 if (time > now && time < exTimeForVariant) { 1354 exTimeForVariant = time; 1355 } 1356 time = ((I_CmsTimedContentDefinition)cosDeps.elementAt(i)).getAdditionalChangeDate(); 1357 if (time > now && time < exTimeForVariant) { 1358 exTimeForVariant = time; 1359 } 1360 } 1361 } 1362 } 1363 for (int i = 0; i < allDeps.size(); i++) { 1384 String key = (String )allDeps.elementAt(i); 1385 Vector variantsForDep = (Vector )externVarDeps.get(key); 1386 if (variantsForDep == null) { 1387 variantsForDep = new Vector (); 1388 } 1389 if (!variantsForDep.contains(variantEntry)) { 1390 variantsForDep.add(variantEntry); 1391 } 1392 externVarDeps.put(key, variantsForDep); 1393 } 1394 CmsElementCache elementCache = CmsXmlTemplateLoader.getElementCache(); 1399 CmsElementDescriptor elKey = new CmsElementDescriptor(getClass().getName(), 1400 templateName); 1401 A_CmsElement currElem = elementCache.getElementLocator().get(cms, elKey, parameters); 1402 CmsElementVariant emptyVar = new CmsElementVariant(); 1404 emptyVar.addDependencies(allDeps); 1405 if (exTimeForVariant < Long.MAX_VALUE) { 1406 emptyVar.mergeNextTimeout(exTimeForVariant); 1407 } 1408 Vector removedVar = currElem.addVariant(cacheKey, emptyVar); 1409 if ((removedVar != null)) { 1410 String key = (String )removedVar.firstElement(); 1412 CmsElementVariant oldVar = (CmsElementVariant)removedVar.lastElement(); 1413 Vector oldVarDeps = oldVar.getDependencies(); 1414 if (oldVarDeps != null) { 1415 String oldVariantEntry = getClass().getName() + "|" + templateName + "|" + key; 1416 for (int i = 0; i < oldVarDeps.size(); i++) { 1417 Vector externEntrys = (Vector )externVarDeps.get(oldVarDeps.elementAt(i)); 1418 if (externEntrys != null) { 1419 externEntrys.removeElement(oldVariantEntry); 1420 } 1421 } 1422 } 1423 } 1424 currElem.thisElementHasDepVariants(); 1426 1427 } 1428 } 1429 1430 1454 protected byte[] startProcessing(CmsObject cms, CmsXmlTemplateFile xmlTemplateDocument, 1455 String elementName, Hashtable parameters, String templateSelector) throws CmsException { 1456 1457 byte[] result = null; 1458 1459 if (CmsXmlTemplateLoader.isElementCacheEnabled()) { 1460 CmsElementDefinitionCollection mergedElDefs = (CmsElementDefinitionCollection)parameters.get("_ELDEFS_"); 1461 CmsElementVariant variant = xmlTemplateDocument.generateElementCacheVariant(this, parameters, elementName, templateSelector); 1463 CmsElementCache elementCache = CmsXmlTemplateLoader.getElementCache(); 1465 CmsElementDescriptor elKey = new CmsElementDescriptor(getClass().getName(), 1466 xmlTemplateDocument.getAbsoluteFilename()); 1467 A_CmsElement currElem = elementCache.getElementLocator().get(cms, elKey, parameters); 1468 1469 if (currElem.getCacheDirectives().isInternalCacheable()) { 1471 Vector removedVar = currElem.addVariant(currElem.getCacheDirectives().getCacheKey(cms, parameters), variant); 1473 if ((removedVar != null) && currElem.hasDependenciesVariants()) { 1474 String key = (String )removedVar.firstElement(); 1476 CmsElementVariant oldVar = (CmsElementVariant)removedVar.lastElement(); 1477 Vector oldVarDeps = oldVar.getDependencies(); 1478 if (oldVarDeps != null) { 1479 String oldVariantEntry = getClass().getName() + "|" 1480 + xmlTemplateDocument.getAbsoluteFilename() + "|" + key; 1481 for (int i = 0; i < oldVarDeps.size(); i++) { 1482 Vector externEntrys = (Vector )CmsXmlTemplateLoader.getVariantDependencies().get(oldVarDeps.elementAt(i)); 1483 if (externEntrys != null) { 1484 externEntrys.removeElement(oldVariantEntry); 1485 } 1486 } 1487 } 1488 } 1489 } 1490 result = ((CmsElementXml)currElem).resolveVariant(cms, variant, elementCache, mergedElDefs, parameters); 1491 } else { 1492 try { 1495 result = xmlTemplateDocument.getProcessedTemplateContent(this, parameters, templateSelector).getBytes(cms.getRequestContext().getEncoding()); 1496 } catch (Throwable e) { 1497 xmlTemplateDocument.removeFromFileCache(); 1500 if (isCacheable(cms, xmlTemplateDocument.getAbsoluteFilename(), elementName, parameters, templateSelector)) { 1501 m_cache.clearCache(getKey(cms, xmlTemplateDocument.getAbsoluteFilename(), parameters, templateSelector)); 1502 } 1503 if (e instanceof CmsException) { 1504 throw (CmsException)e; 1505 } else { 1506 String errorMessage = "Exception while getting content for (sub)template " 1510 + elementName + ". " + e; 1511 if (CmsLog.getLog(this).isErrorEnabled()) { 1512 CmsLog.getLog(this).error(errorMessage, e); 1513 } 1514 throw new CmsLegacyException(errorMessage); 1515 } 1516 } 1517 } 1518 if (templateSelector != null) { 1520 parameters.put(elementName + "._TEMPLATESELECTOR_", templateSelector); 1521 } 1522 1523 return result; 1524 } 1525 1526 1533 protected void throwException(String errorMessage) throws CmsException { 1534 1535 throwException(errorMessage, CmsLegacyException.C_UNKNOWN_EXCEPTION); 1536 } 1537 1538 1546 protected void throwException(String errorMessage, Exception e) throws CmsException { 1547 1548 if (CmsLog.getLog(this).isErrorEnabled()) { 1549 CmsLog.getLog(this).error(errorMessage, e); 1550 } 1551 if (e instanceof CmsException) { 1552 throw (CmsException)e; 1553 } else { 1554 throw new CmsLegacyException(errorMessage, CmsLegacyException.C_UNKNOWN_EXCEPTION, e); 1555 } 1556 } 1557 1558 1566 protected void throwException(String errorMessage, int type) throws CmsLegacyException { 1567 1568 if (CmsLog.getLog(this).isErrorEnabled()) { 1569 CmsLog.getLog(this).error(errorMessage); 1570 } 1571 throw new CmsLegacyException(errorMessage, type); 1572 } 1573 1574 1587 private String getStylesheet(CmsObject cms, String tagcontent, String templatename, 1588 A_CmsXmlContent doc, Object userObject) throws CmsException { 1589 1590 CmsXmlTemplateFile tempTemplateFile = (CmsXmlTemplateFile)doc; 1591 1592 CmsXmlTemplateFile templateFile = tempTemplateFile; 1594 1595 if (templatename != null) { 1596 Object tempObj = CmsTemplateClassManager.getClassInstance(tempTemplateFile.getSubtemplateClass(templatename)); 1601 CmsXmlTemplate frameTemplateClassObject = (CmsXmlTemplate)tempObj; 1602 templateFile = frameTemplateClassObject.getOwnTemplateFile(cms, tempTemplateFile.getSubtemplateFilename(templatename), null, null, null); 1603 } 1604 1605 String styleIE = null; 1607 String styleNS = null; 1608 if (templateFile.hasData("stylesheet-ie")) { 1609 styleIE = templateFile.getDataValue("stylesheet-ie"); 1610 } else { 1611 if (templateFile.hasData("stylesheet")) { 1612 styleIE = templateFile.getDataValue("stylesheet"); 1613 } else { 1614 styleIE = ""; 1615 } 1616 } 1617 if (templateFile.hasData("stylesheet-ns")) { 1618 styleNS = templateFile.getDataValue("stylesheet-ns"); 1619 } else { 1620 if (templateFile.hasData("stylesheet")) { 1621 styleNS = templateFile.getDataValue("stylesheet"); 1622 } else { 1623 styleNS = ""; 1624 } 1625 } 1626 1627 HttpServletRequest orgReq = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getOriginalRequest(); 1628 String servletPath = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getServletUrl(); 1629 if (!servletPath.endsWith("/")) { 1630 servletPath = CmsXmlTemplateLoader.getRequest(cms.getRequestContext()).getServletUrl() 1632 + "/"; 1633 } 1634 1635 if (styleIE.startsWith("/")) { 1637 styleIE = styleIE.substring(1); 1638 } 1639 if (styleNS.startsWith("/")) { 1640 styleNS = styleNS.substring(1); 1641 } 1642 1643 String browser = orgReq.getHeader("user-agent"); 1645 if ((browser != null) && (browser.indexOf("MSIE") > -1)) { 1646 return ("".equals(styleIE)) ? "" : servletPath + styleIE; 1647 } else { 1648 return ("".equals(styleNS)) ? "" : servletPath + styleNS; 1650 } 1651 1652 } 1653} 1654
| Popular Tags
|