cmsjsploader.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,284 行 · 第 1/4 页
JAVA
1,284 行
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#dump(org.opencms.file.CmsObject, org.opencms.file.CmsResource, java.lang.String, java.util.Locale, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public byte[] dump(
CmsObject cms,
CmsResource file,
String element,
Locale locale,
HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
// get the current Flex controller
CmsFlexController controller = CmsFlexController.getController(req);
CmsFlexController oldController = null;
if (controller != null) {
// for dumping we must create an new "top level" controller, save the old one to be restored later
oldController = controller;
}
byte[] result = null;
try {
// now create a new, temporary Flex controller
controller = getController(cms, file, req, res, false, false);
if (element != null) {
// add the element parameter to the included request
String[] value = new String[] {element};
Map parameters = Collections.singletonMap(I_CmsResourceLoader.PARAMETER_ELEMENT, value);
controller.getCurrentRequest().addParameterMap(parameters);
}
// dispatch to the JSP
result = dispatchJsp(controller);
// remove temporary controller
CmsFlexController.removeController(req);
} finally {
if ((oldController != null) && (controller != null)) {
// update "date last modified"
oldController.updateDates(controller.getDateLastModified(), controller.getDateExpires());
// reset saved controller
CmsFlexController.setController(req, oldController);
}
}
return result;
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#export(org.opencms.file.CmsObject, org.opencms.file.CmsResource, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public byte[] export(CmsObject cms, CmsResource resource, HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// get the Flex controller
CmsFlexController controller = getController(cms, resource, req, res, false, true);
// dispatch to the JSP
byte[] result = dispatchJsp(controller);
// remove the controller from the request
CmsFlexController.removeController(req);
// return the contents
return result;
}
/**
* @see org.opencms.configuration.I_CmsConfigurationParameterHandler#getConfiguration()
*/
public Map getConfiguration() {
// return the configuration in an immutable form
return Collections.unmodifiableMap(m_configuration);
}
/**
* Delivers a Flex controller, either by creating a new one, or by re-using an existing one.<p>
*
* @param cms the initial CmsObject to wrap in the controller
* @param resource the resource requested
* @param req the current request
* @param res the current response
* @param streaming indicates if the response is streaming
* @param top indicates if the response is the top response
*
* @return a Flex controller
*/
private CmsFlexController getController(
CmsObject cms,
CmsResource resource,
HttpServletRequest req,
HttpServletResponse res,
boolean streaming,
boolean top) {
CmsFlexController controller = null;
if (top) {
// only check for existing contoller if this is the "top" request/response
controller = CmsFlexController.getController(req);
}
if (controller == null) {
// create new request / response wrappers
controller = new CmsFlexController(cms, resource, m_cache, req, res, streaming, top);
CmsFlexController.setController(req, controller);
CmsFlexRequest f_req = new CmsFlexRequest(req, controller);
CmsFlexResponse f_res = new CmsFlexResponse(res, controller, streaming, true);
controller.push(f_req, f_res);
} else if (controller.isForwardMode()) {
// reset CmsObject (because of URI) if in forward mode
controller = new CmsFlexController(cms, controller);
CmsFlexController.setController(req, controller);
}
return controller;
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#getLoaderId()
*/
public int getLoaderId() {
return RESOURCE_LOADER_ID;
}
/**
* Return a String describing the ResourceLoader,
* which is (localized to the system default locale)
* <code>"The OpenCms default resource loader for JSP".</code>
*
* @return a describing String for the ResourceLoader
*/
public String getResourceLoaderInfo() {
return Messages.get().getBundle().key(Messages.GUI_LOADER_JSP_DEFAULT_DESC_0);
}
/**
* @see org.opencms.configuration.I_CmsConfigurationParameterHandler#initConfiguration()
*/
public void initConfiguration() {
ExtendedProperties config = new ExtendedProperties();
config.putAll(m_configuration);
m_jspRepository = config.getString(PARAM_JSP_REPOSITORY);
if (m_jspRepository == null) {
m_jspRepository = OpenCms.getSystemInfo().getWebApplicationRfsPath();
}
m_jspWebAppRepository = config.getString(PARAM_JSP_FOLDER, DEFAULT_JSP_FOLDER);
if (!m_jspWebAppRepository.endsWith("/")) {
m_jspWebAppRepository += "/";
}
m_jspRepository = CmsFileUtil.normalizePath(m_jspRepository + m_jspWebAppRepository);
String maxAge = config.getString(PARAM_CLIENT_CACHE_MAXAGE);
if (maxAge == null) {
m_clientCacheMaxAge = -1;
} else {
m_clientCacheMaxAge = Long.parseLong(maxAge);
}
// get the "error pages are commited or not" flag from the configuration
m_errorPagesAreNotCommited = config.getBoolean(PARAM_JSP_ERRORPAGE_COMMITTED, true);
// output setup information
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_JSP_REPOSITORY_ABS_PATH_1, m_jspRepository));
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_WEBAPP_PATH_1, m_jspWebAppRepository));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_JSP_REPOSITORY_ERR_PAGE_COMMOTED_1,
Boolean.valueOf(m_errorPagesAreNotCommited)));
if (maxAge != null) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_CLIENT_CACHE_MAX_AGE_1, maxAge));
}
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_LOADER_INITIALIZED_1,
this.getClass().getName()));
}
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#isStaticExportEnabled()
*/
public boolean isStaticExportEnabled() {
return true;
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#isStaticExportProcessable()
*/
public boolean isStaticExportProcessable() {
return true;
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#isUsableForTemplates()
*/
public boolean isUsableForTemplates() {
return true;
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#isUsingUriWhenLoadingTemplate()
*/
public boolean isUsingUriWhenLoadingTemplate() {
return false;
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#load(org.opencms.file.CmsObject, org.opencms.file.CmsResource, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void load(CmsObject cms, CmsResource file, HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException, CmsException {
CmsRequestContext context = cms.getRequestContext();
// If we load template jsp or template-element jsp (xml contents or xml pages) don't show source (2nd test)
if ((CmsHistoryResourceHandler.isHistoryRequest(req))
&& (context.getUri().equals(context.removeSiteRoot(file.getRootPath())))) {
showSource(cms, file, req, res);
} else {
// load and process the JSP
boolean streaming = false;
boolean bypass = false;
// read "cache" property for requested VFS resource to check for special "stream" and "bypass" values
String cacheProperty = cms.readPropertyObject(file, CmsPropertyDefinition.PROPERTY_CACHE, true).getValue();
if (cacheProperty != null) {
cacheProperty = cacheProperty.trim();
if (CACHE_PROPERTY_STREAM.equals(cacheProperty)) {
streaming = true;
} else if (CACHE_PROPERTY_BYPASS.equals(cacheProperty)) {
streaming = true;
bypass = true;
}
}
// get the Flex controller
CmsFlexController controller = getController(cms, file, req, res, streaming, true);
if (bypass || controller.isForwardMode()) {
// once in forward mode, always in forward mode (for this request)
controller.setForwardMode(true);
// bypass Flex cache for this page, update the JSP first if neccessary
String target = updateJsp(file, controller, new HashSet());
// dispatch to external JSP
req.getRequestDispatcher(target).forward(controller.getCurrentRequest(), res);
} else {
// Flex cache not bypassed, dispatch to internal JSP
dispatchJsp(controller);
}
// remove the controller from the request if not forwarding
if (!controller.isForwardMode()) {
CmsFlexController.removeController(req);
}
}
}
/**
* Parses the JSP and modifies OpenCms critical directive information.<p>
*
* @param byteContent the original JSP content
* @param encoding the encoding to use for the JSP
* @param controller the controller for the JSP integration
* @param updatedFiles a Set containing all JSP pages that have been already updated
* @param isHardInclude indicated if this page is actually a "hard" include with <code><%@ include file="..." ></code>
*
* @return the modified JSP content
*/
private byte[] parseJsp(
byte[] byteContent,
String encoding,
CmsFlexController controller,
Set updatedFiles,
boolean isHardInclude) {
String content;
// make sure encoding is set correctly
try {
content = new String(byteContent, encoding);
} catch (UnsupportedEncodingException e) {
// encoding property is not set correctly
LOG.error(Messages.get().getBundle().key(
Messages.LOG_UNSUPPORTED_ENC_1,
controller.getCurrentRequest().getElementUri()), e);
try {
encoding = OpenCms.getSystemInfo().getDefaultEncoding();
content = new String(byteContent, encoding);
} catch (UnsupportedEncodingException e2) {
// should not happen since default encoding is always a valid encoding (checked during system startup)
content = new String(byteContent);
}
}
// parse for special %(link:...) macros
content = parseJspLinkMacros(content, controller);
// parse for special <%@cms file="..." %> tag
content = parseJspCmsTag(content, controller, updatedFiles);
// parse for included files in tags
content = parseJspIncludes(content, controller, updatedFiles);
// parse for <%@page pageEncoding="..." %> tag
content = parseJspEncoding(content, encoding, isHardInclude);
// convert the result to bytes and return it
try {
return content.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
// should not happen since encoding was already checked
return content.getBytes();
}
}
/**
* Parses the JSP content for the special <code><%cms file="..." %></code> tag.<p>
*
* @param content the JSP content to parse
* @param controller the current JSP controller
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?