📄 cmsxmllauncher.java
字号:
if(doc.isElementClassDefined(elementName)) {
newParameters.put(elementName + "._CLASS_", doc.getElementClass(elementName));
}
if(doc.isElementTemplateDefined(elementName)) {
// need to check for the body template here so that non-XMLTemplate templates
// like JSPs know where to find the body defined in the XMLTemplate
String template = doc.getElementTemplate(elementName);
if (I_CmsConstants.C_XML_BODY_ELEMENT.equalsIgnoreCase(elementName)) {
// found body element
if (template != null) {
cms.getRequestContext().setAttribute(I_CmsConstants.C_XML_BODY_ELEMENT, template);
}
}
newParameters.put(elementName + "._TEMPLATE_", template);
}
if(doc.isElementTemplSelectorDefined(elementName)) {
newParameters.put(elementName + "._TEMPLATESELECTOR_", doc.getElementTemplSelector(elementName));
}
Enumeration parameters = doc.getElementParameterNames(elementName);
while(parameters.hasMoreElements()) {
String paramName = (String)parameters.nextElement();
String paramValue = doc.getElementParameter(elementName, paramName);
if(paramValue != null) {
newParameters.put(elementName + "." + paramName, paramValue);
}
else {
if(I_CmsLogChannels.C_PREPROCESSOR_IS_LOGGING && A_OpenCms.isLogging() ) {
A_OpenCms.log(C_OPENCMS_INFO, getClassName() + "Empty parameter \"" + paramName + "\" found.");
}
}
}
}
}
// URL parameters ary really dynamic.
// We cannot store them in an element cache.
// Therefore these parameters must be collected in ANY case!
String datafor = req.getParameter("datafor");
if(datafor == null) {
datafor = "";
} else {
if(!"".equals(datafor)) {
datafor = datafor + ".";
}
}
Enumeration urlParameterNames = req.getParameterNames();
while(urlParameterNames.hasMoreElements()) {
String pname = (String)urlParameterNames.nextElement();
String paramValue = req.getParameter(pname);
if(paramValue != null) {
if((!"datafor".equals(pname)) && (!"_clearcache".equals(pname))) {
newParameters.put(datafor + pname, paramValue);
}
}else {
if(I_CmsLogChannels.C_PREPROCESSOR_IS_LOGGING && A_OpenCms.isLogging() ) {
A_OpenCms.log(C_OPENCMS_INFO, getClassName() + "Empty URL parameter \"" + pname + "\" found.");
}
}
}
if(elementCacheEnabled && cmsUri == null) {
// ---- element cache stuff --------
// No URI could be found in cache.
// So create a new URI object with a start element and store it using the UriLocator
CmsElementDescriptor elemDesc = new CmsElementDescriptor(templateClass, templateName);
CmsElementDefinitionCollection eldefs = doc.getElementDefinitionCollection();
if(elementreplace){
// we cant cach this
eldefs.add(replaceDef);
cmsUri = new CmsUri(elemDesc, cms.getReadingpermittedGroup(
cms.getRequestContext().currentProject().getId(),
templateName), eldefs, Utils.isHttpsResource(cms, file));
}else{
cmsUri = new CmsUri(elemDesc, cms.getReadingpermittedGroup(
cms.getRequestContext().currentProject().getId(),
templateName), eldefs, Utils.isHttpsResource(cms, file));
elementCache.getUriLocator().put(uriDesc, cmsUri);
}
}
if(elementCacheEnabled) {
// lets check if ssl is active
if(cms.getMode() == C_MODUS_ONLINE){
String scheme = ((HttpServletRequest)cms.getRequestContext().getRequest().getOriginalRequest()).getScheme();
boolean httpsReq = "https".equalsIgnoreCase(scheme);
if(cmsUri.isHttpsResource() != httpsReq){
if(httpsReq){
//throw new CmsException(" "+file.getAbsolutePath()+" needs a http request", CmsException.C_HTTPS_PAGE_ERROR);
}else if(CmsObject.getStaticExportProperties().isStaticExportEnabled()
|| "false_ssl".equals(CmsObject.getStaticExportProperties().getStaticExportEnabledValue())){
// check if static export is enabled and value is not false_ssl
throw new CmsException(" "+file.getAbsolutePath()+" needs a https request", CmsException.C_HTTPS_REQUEST_ERROR);
}
}
}
// now lets get the output
if(elementreplace){
output = cmsUri.callCanonicalRoot(elementCache, cms, newParameters);
}else{
output = elementCache.callCanonicalRoot(cms, newParameters);
}
} else {
// ----- traditional stuff ------
// Element cache is deactivated. So let's go on as usual.
try {
CmsFile masterTemplate = loadMasterTemplateFile(cms, templateName, doc);
I_CmsTemplate tmpl = getTemplateClass(cms, templateClass);
if(!(tmpl instanceof I_CmsXmlTemplate)) {
String errorMessage = "Error in " + file.getAbsolutePath() + ": " + templateClass + " is not a XML template class.";
if(I_CmsLogChannels.C_PREPROCESSOR_IS_LOGGING && A_OpenCms.isLogging() ) {
A_OpenCms.log(C_OPENCMS_CRITICAL, getClassName() + errorMessage);
}
throw new CmsException(errorMessage, CmsException.C_XML_WRONG_TEMPLATE_CLASS);
}
output = callCanonicalRoot(cms, (I_CmsTemplate)tmpl, masterTemplate, newParameters);
}
catch(CmsException e) {
if(I_CmsLogChannels.C_PREPROCESSOR_IS_LOGGING && A_OpenCms.isLogging() ) {
A_OpenCms.log(C_OPENCMS_INFO, "[CmsXmlLauncher] There were exceptions while generating output for " + file.getAbsolutePath());
A_OpenCms.log(C_OPENCMS_INFO, "[CmsXmlLauncher] Clearing template file cache for this file.");
}
doc.removeFromFileCache();
throw e;
}
}
return output;
}
/**
* Gets the ID that indicates the type of the launcher.
* @return launcher ID
*/
public int getLauncherId() {
return C_TYPE_XML;
}
/**
* Unitary method to start generating the output.
* Every launcher has to implement this method.
* In it possibly the selected file will be analyzed, and the
* Canonical Root will be called with the appropriate
* template class, template file and parameters. At least the
* canonical root's output must be written to the HttpServletResponse.
*
* @param cms CmsObject Object for accessing system resources
* @param file CmsFile Object with the selected resource to be shown
* @param startTemplateClass Name of the template class to start with.
* @param openCms a instance of A_OpenCms for redirect-needs
* @throws CmsException
*/
protected void launch(CmsObject cms, CmsFile file, String startTemplateClass, A_OpenCms openCms) throws CmsException {
// get the CmsRequest
I_CmsRequest req = cms.getRequestContext().getRequest();
byte[] result = null;
result = generateOutput(cms, file, startTemplateClass, req);
if(result != null) {
writeBytesToResponse(cms, result);
}
}
/**
* Internal utility method for checking and loading a given template file.
* @param cms CmsObject for accessing system resources.
* @param templateName Name of the requestet template file.
* @param doc CmsXmlControlFile object containig the parsed body file.
* @return CmsFile object of the requested template file.
* @throws CmsException
*/
private CmsFile loadMasterTemplateFile(CmsObject cms, String templateName, com.opencms.template.CmsXmlControlFile doc) throws CmsException {
CmsFile masterTemplate = null;
try {
masterTemplate = cms.readFile(templateName);
}
catch(Exception e) {
handleException(cms, e, "Cannot load master template " + templateName + ". ");
doc.removeFromFileCache();
}
return masterTemplate;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -