📄 cmsjsploader.java
字号:
/**
* 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,
new Boolean(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 {
// 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);
}
}
/**
* @see org.opencms.loader.I_CmsResourceLoader#service(org.opencms.file.CmsObject, org.opencms.file.CmsResource, javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void service(CmsObject cms, CmsResource resource, ServletRequest req, ServletResponse res)
throws ServletException, IOException, CmsLoaderException {
CmsFlexController controller = CmsFlexController.getController(req);
// get JSP target name on "real" file system
String target = updateJsp(resource, controller, new HashSet(8));
// important: Indicate that all output must be buffered
controller.getCurrentResponse().setOnlyBuffering(true);
// dispatch to external file
controller.getCurrentRequest().getRequestDispatcherToExternal(cms.getSitePath(resource), target).include(
req,
res);
}
/**
* @see org.opencms.loader.I_CmsFlexCacheEnabledLoader#setFlexCache(org.opencms.flex.CmsFlexCache)
*/
public void setFlexCache(CmsFlexCache cache) {
m_cache = cache;
// output setup information
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_ADD_FLEX_CACHE_0));
}
}
/**
* Dispatches the current request to the OpenCms internal JSP.<p>
*
* @param controller the current controller
*
* @return the content of the processed JSP
*
* @throws ServletException if inclusion does not work
* @throws IOException if inclusion does not work
*/
private byte[] dispatchJsp(CmsFlexController controller) throws ServletException, IOException {
// get request / response wrappers
CmsFlexRequest f_req = controller.getCurrentRequest();
CmsFlexResponse f_res = controller.getCurrentResponse();
try {
f_req.getRequestDispatcher(controller.getCmsObject().getSitePath(controller.getCmsResource())).include(
f_req,
f_res);
} catch (SocketException e) {
// uncritical, might happen if client (browser) does not wait until end of page delivery
LOG.debug(Messages.get().getBundle().key(Messages.LOG_IGNORING_EXC_1, e.getClass().getName()), e);
}
byte[] result = null;
HttpServletResponse res = controller.getTopResponse();
if (!controller.isStreaming() && !f_res.isSuspended()) {
try {
// if a JSP errorpage was triggered the response will be already committed here
if (!res.isCommitted() || m_errorPagesAreNotCommited) {
// check if the current request was done by a workplace user
boolean isWorkplaceUser = CmsWorkplaceManager.isWorkplaceUser(f_req);
// check if the content was modified since the last request
if (controller.isTop()
&& !isWorkplaceUser
&& CmsFlexController.isNotModifiedSince(f_req, controller.getDateLastModified())) {
if (f_req.getParameterMap().size() == 0) {
// only use "expires" header on pages that have no parameters,
// otherwise some browsers (e.g. IE 6) will not even try to request
// updated versions of the page
CmsFlexController.setDateExpiresHeader(
res,
controller.getDateExpires(),
m_clientCacheMaxAge);
}
res.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
return null;
}
// get the result byte array
result = f_res.getWriterBytes();
HttpServletRequest req = controller.getTopRequest();
if (req.getHeader(CmsRequestUtil.HEADER_OPENCMS_EXPORT) != null) {
// this is a non "on-demand" static export request, don't write to the response stream
req.setAttribute(CmsRequestUtil.HEADER_OPENCMS_EXPORT, new Long(
controller.getDateLastModified()));
} else if (controller.isTop()) {
// process headers and write output if this is the "top" request/response
res.setContentLength(result.length);
// check for preset error code
Integer errorCode = (Integer)req.getAttribute(CmsRequestUtil.ATTRIBUTE_ERRORCODE);
if (errorCode == null) {
// set last modified / no cache headers only if this is not an error page
if (isWorkplaceUser) {
res.setDateHeader(CmsRequestUtil.HEADER_LAST_MODIFIED, System.currentTimeMillis());
CmsRequestUtil.setNoCacheHeaders(res);
} else {
// set date last modified header
CmsFlexController.setDateLastModifiedHeader(res, controller.getDateLastModified());
if ((f_req.getParameterMap().size() == 0) && (controller.getDateLastModified() > -1)) {
// only use "expires" header on pages that have no parameters
// and that are cachable (i.e. 'date last modified' is set)
// otherwise some browsers (e.g. IE 6) will not even try to request
// updated versions of the page
CmsFlexController.setDateExpiresHeader(
res,
controller.getDateExpires(),
m_clientCacheMaxAge);
}
}
// set response status to "200 - OK" (required for static export "on-demand")
res.setStatus(HttpServletResponse.SC_OK);
} else {
// set previously saved error code
res.setStatus(errorCode.intValue());
}
// proecess the headers
CmsFlexResponse.processHeaders(f_res.getHeaders(), res);
res.getOutputStream().write(result);
res.getOutputStream().flush();
}
}
} catch (IllegalStateException e) {
// uncritical, might happen if JSP error page was used
LOG.debug(Messages.get().getBundle().key(Messages.LOG_IGNORING_EXC_1, e.getClass().getName()), e);
} catch (SocketException e) {
// uncritical, might happen if client (browser) does not wait until end of page delivery
LOG.debug(Messages.get().getBundle().key(Messages.LOG_IGNORING_EXC_1, e.getClass().getName()), e);
}
}
return result;
}
/**
* 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,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -