cmsstaticexportmanager.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,637 行 · 第 1/5 页
JAVA
1,637 行
String source,
String rfsPrefix,
String exportPath,
String exportWorkPath,
String exportBackups,
String useRelativeLinks) throws CmsStaticExportException {
if ((m_staticExportPathConfigured != null) && exportPath.equals(m_staticExportPathConfigured)) {
throw new CmsStaticExportException(Messages.get().container(Messages.ERR_VALIDATE_EXPORTPATH_0));
}
if (!m_rfsRules.isEmpty()) {
Iterator itRules = m_rfsRules.iterator();
while (itRules.hasNext()) {
CmsStaticExportRfsRule rule = (CmsStaticExportRfsRule)itRules.next();
if (exportPath.equals(rule.getExportPathConfigured())) {
throw new CmsStaticExportException(Messages.get().container(Messages.ERR_VALIDATE_EXPORTPATH_0));
}
}
}
Boolean relativeLinks = (useRelativeLinks == null ? null : Boolean.valueOf(useRelativeLinks));
Integer backups = (exportBackups == null ? null : Integer.valueOf(exportBackups));
m_rfsRules.add(new CmsStaticExportRfsRule(
name,
description,
source,
rfsPrefix,
exportPath,
exportWorkPath,
backups,
relativeLinks,
m_rfsTmpRule.getRelatedSystemResources()));
m_rfsTmpRule = new CmsStaticExportRfsRule("", "", "", "", "", "", null, null);
}
/**
* Adds a regex of related system resources to the latest rfs-rule.<p>
*
* @param regex the regex to add
*/
public void addRfsRuleSystemRes(String regex) {
m_rfsTmpRule.addRelatedSystemRes(regex);
}
/**
* Caches a calculated export uri.<p>
*
* @param rfsName the name of the resource in the "real" file system
* @param vfsName the name of the resource in the VFS
* @param parameters the optional parameters for the generation of the resource
*/
public void cacheExportUri(String rfsName, String vfsName, String parameters) {
m_cacheExportUris.put(rfsName, new CmsStaticExportData(vfsName, parameters));
}
/**
* Caches a calculated online link.<p>
*
* @param linkName the link
* @param vfsName the name of the VFS resource
*/
public void cacheOnlineLink(Object linkName, Object vfsName) {
m_cacheOnlineLinks.put(linkName, vfsName);
}
/**
* Implements the CmsEvent interface,
* the static export properties uses the events to clear
* the list of cached keys in case a project is published.<p>
*
* @param event CmsEvent that has occurred
*/
public void cmsEvent(CmsEvent event) {
if (!isStaticExportEnabled()) {
if (LOG.isWarnEnabled()) {
LOG.warn(Messages.get().getBundle().key(Messages.LOG_STATIC_EXPORT_DISABLED_0));
}
return;
}
I_CmsReport report = null;
Map data = event.getData();
if (data != null) {
report = (I_CmsReport)data.get(I_CmsEventListener.KEY_REPORT);
}
if (report == null) {
report = new CmsLogReport(CmsLocaleManager.getDefaultLocale(), getClass());
}
switch (event.getType()) {
case I_CmsEventListener.EVENT_UPDATE_EXPORTS:
scrubExportFolders(report);
clearCaches(event);
break;
case I_CmsEventListener.EVENT_PUBLISH_PROJECT:
if (data == null) {
if (LOG.isErrorEnabled()) {
LOG.error(Messages.get().getBundle().key(Messages.ERR_EMPTY_EVENT_DATA_0));
}
return;
}
// event data contains a list of the published resources
CmsUUID publishHistoryId = new CmsUUID((String)data.get(I_CmsEventListener.KEY_PUBLISHID));
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_EVENT_PUBLISH_PROJECT_1, publishHistoryId));
}
synchronized (m_lockCmsEvent) {
getHandler().performEventPublishProject(publishHistoryId, report);
}
clearCaches(event);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_EVENT_PUBLISH_PROJECT_FINISHED_1,
publishHistoryId));
}
break;
case I_CmsEventListener.EVENT_CLEAR_CACHES:
clearCaches(event);
break;
default:
// no operation
}
}
/**
* Exports the requested uri and at the same time writes the uri to the response output stream
* if required.<p>
*
* @param req the current request
* @param res the current response
* @param cms an initialized cms context (should be initialized with the "Guest" user only)
* @param data the static export data set
* @return status code of the export operation, status codes are the same as http status codes (200,303,304)
* @throws CmsException in case of errors accessing the VFS
* @throws ServletException in case of errors accessing the servlet
* @throws IOException in case of erros writing to the export output stream
* @throws CmsStaticExportException if static export is disabled
*/
public int export(HttpServletRequest req, HttpServletResponse res, CmsObject cms, CmsStaticExportData data)
throws CmsException, IOException, ServletException, CmsStaticExportException {
String vfsName = data.getVfsName();
String rfsName = data.getRfsName();
CmsResource resource = data.getResource();
// cut the site root from the vfsName and switch to the correct site
String siteRoot = OpenCms.getSiteManager().getSiteRoot(vfsName);
CmsI18nInfo i18nInfo = OpenCms.getLocaleManager().getI18nInfo(
req,
cms.getRequestContext().currentUser(),
cms.getRequestContext().currentProject(),
vfsName);
String remoteAddr = m_remoteAddr;
if (remoteAddr == null) {
remoteAddr = CmsContextInfo.LOCALHOST;
}
CmsContextInfo contextInfo = new CmsContextInfo(
cms.getRequestContext().currentUser(),
cms.getRequestContext().currentProject(),
vfsName,
"/",
i18nInfo.getLocale(),
i18nInfo.getEncoding(),
remoteAddr,
CmsContextInfo.CURRENT_TIME,
cms.getRequestContext().getOuFqn());
cms = OpenCms.initCmsObject(null, contextInfo);
if (siteRoot != null) {
vfsName = vfsName.substring(siteRoot.length());
} else {
siteRoot = "/";
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_STATIC_EXPORT_SITE_ROOT_2, siteRoot, vfsName));
}
cms.getRequestContext().setSiteRoot(siteRoot);
String oldUri = null;
// this flag signals if the export method is used for "on demand" or "after publish".
// if no request and result stream are available, it was called during "export on publish"
boolean exportOnDemand = ((req != null) && (res != null));
CmsStaticExportResponseWrapper wrapRes = null;
if (res != null) {
wrapRes = new CmsStaticExportResponseWrapper(res);
}
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_SE_RESOURCE_START_1, data));
}
CmsFile file;
// read vfs resource
if (resource.isFile()) {
file = cms.readFile(vfsName);
} else {
file = cms.readFile(OpenCms.initResource(cms, vfsName, req, wrapRes));
if (cms.existsResource(vfsName + file.getName())) {
vfsName = vfsName + file.getName();
}
rfsName += EXPORT_DEFAULT_FILE;
}
// check loader id for resource
I_CmsResourceLoader loader = OpenCms.getResourceManager().getLoader(file);
if ((loader == null) || (!loader.isStaticExportEnabled())) {
Object[] arguments = new Object[] {vfsName, new Integer(file.getTypeId())};
throw new CmsStaticExportException(Messages.get().container(Messages.ERR_EXPORT_NOT_SUPPORTED_2, arguments));
}
// ensure we have exactly the same setup as if called "the usual way"
// we only have to do this in case of the static export on demand
if (exportOnDemand) {
String mimetype = OpenCms.getResourceManager().getMimeType(
file.getName(),
cms.getRequestContext().getEncoding());
if (wrapRes != null) {
wrapRes.setContentType(mimetype);
}
oldUri = cms.getRequestContext().getUri();
cms.getRequestContext().setUri(vfsName);
}
// do the export
byte[] result = loader.export(cms, file, req, wrapRes);
// release unused resources
file = null;
int status = -1;
if (result != null) {
// normal case
String exportPath = getExportPath(siteRoot + vfsName);
// only export those resource where the export property is set
if (isExportLink(cms, vfsName)) {
writeResource(req, exportPath, rfsName, vfsName, resource, result);
// system folder case
if (vfsName.startsWith(CmsWorkplace.VFS_PATH_SYSTEM)) {
// iterate over all rules
Iterator it = getRfsRules().iterator();
while (it.hasNext()) {
CmsStaticExportRfsRule rule = (CmsStaticExportRfsRule)it.next();
if (rule.match(vfsName)) {
writeResource(req, rule.getExportPath(), rfsName, vfsName, resource, result);
}
}
}
// get the wrapper status that was set
status = (wrapRes != null) ? wrapRes.getStatus() : -1;
if (status < 0) {
// the status was not set, assume everything is o.k.
status = HttpServletResponse.SC_OK;
}
} else {
// the resource was not used for export, so return HttpServletResponse.SC_SEE_OTHER
// as a signal for not exported resource
status = HttpServletResponse.SC_SEE_OTHER;
}
} else {
// the resource was not written because it was not modified.
// set the status to not modified
status = HttpServletResponse.SC_NOT_MODIFIED;
}
// restore context
// we only have to do this in case of the static export on demand
if (exportOnDemand) {
cms.getRequestContext().setUri(oldUri);
}
return status;
}
/**
* Starts a complete static export of all resources.<p>
*
* @param purgeFirst flag to delete all resources in the export folder of the rfs
* @param report an I_CmsReport instance to print output message, or null to write messages to the log file
*
* @throws CmsException in case of errors accessing the VFS
* @throws IOException in case of erros writing to the export output stream
* @throws ServletException in case of errors accessing the servlet
*/
public synchronized void exportFullStaticRender(boolean purgeFirst, I_CmsReport report)
throws CmsException, IOException, ServletException {
// set member to true to get temporary export paths for rules
m_fullStaticExport = true;
// save the real export path
String staticExportPathStore = m_staticExportPath;
// set the export path to the export work path
m_staticExportPath = m_staticExportWorkPath;
// delete all old exports if the purgeFirst flag is set
if (purgeFirst) {
Map eventData = new HashMap();
eventData.put(I_CmsEventListener.KEY_REPORT, report);
CmsEvent clearCacheEvent = new CmsEvent(I_CmsEventListener.EVENT_CLEAR_CACHES, eventData);
OpenCms.fireCmsEvent(clearCacheEvent);
scrubExportFolders(report);
CmsObject cms = OpenCms.initCmsObject(OpenCms.getDefaultUsers().getUserExport());
cms.deleteAllStaticExportPublishedResources(EXPORT_LINK_WITHOUT_PARAMETER);
cms.deleteAllStaticExportPublishedResources(EXPORT_LINK_WITH_PARAMETER);
}
// do the export
CmsAfterPublishStaticExportHandler handler = new CmsAfterPublishStaticExportHandler();
// export everything
handler.doExportAfterPublish(null, report);
// set export path to the original one
m_staticExportPath = staticExportPathStore;
// set member to false for further exports
m_fullStaticExport = false;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?