📄 cmsstaticexportmanager.java
字号:
if (prop.isIdentical(exportNameProperty)) {
// look for the right position in path
value = prop.getValue();
}
cont = (value == null) && (resourceName.length() > 1);
} catch (CmsVfsResourceNotFoundException e) {
// this is for publishing deleted resources
cont = (resourceName.length() > 1);
} catch (CmsSecurityException se) {
// a security exception (probably no read permission) we return the current result
cont = false;
}
if (cont) {
resourceName = CmsResource.getParentFolder(resourceName);
}
} while (cont);
rfsName = exportname + rfsName.substring(resourceName.length());
}
String extension = CmsFileUtil.getFileExtension(rfsName);
// check if the VFS resouce is a JSP page with a ".jsp" ending
// in this case the rfs name suffix must be build with special care,
// usually it must be set to ".html"
boolean isJsp = extension.equals(".jsp");
if (isJsp) {
CmsResource res = cms.readResource(vfsName);
isJsp = res.getTypeId() == CmsResourceTypeJsp.getStaticTypeId();
// if the resource is a plain resouce then no change in suffix is required
if (isJsp) {
String suffix = cms.readPropertyObject(vfsName, CmsPropertyDefinition.PROPERTY_EXPORTSUFFIX, true).getValue(
".html");
if (!extension.equals(suffix.toLowerCase())) {
rfsName += suffix;
extension = suffix;
}
}
}
if (parameters != null) {
// build the RFS name for the link with parameters
rfsName = CmsFileUtil.getRfsPath(rfsName, extension, parameters);
// we have found a rfs name for a vfs resource with parameters, save it to the database
try {
cms.writeStaticExportPublishedResource(
rfsName,
EXPORT_LINK_WITH_PARAMETER,
parameters,
System.currentTimeMillis());
} catch (CmsException e) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_WRITE_FAILED_1, rfsName), e);
}
}
} catch (CmsException e) {
// ignore exception, return vfsName as rfsName
rfsName = vfsName;
}
// add export rfs prefix and return result
if (!vfsName.startsWith(CmsWorkplace.VFS_PATH_SYSTEM)) {
return getRfsPrefix(cms.getRequestContext().addSiteRoot(vfsName)).concat(rfsName);
} else {
return getRfsPrefix(cms.getRequestContext().getSiteRoot() + "/").concat(rfsName);
}
}
/**
* Returns the prefix for exported links in the "real" file system.<p>
*
* The returned value will be a direcory like prefix. The value is configured
* in the <code>opencms-importexport.xml</code> configuration file. An optimization
* of the configured value will be performed, where all relative path infprmation is resolved
* (for example <code>/export/../static</code> will be resolved to <code>/export</code>.
* Moreover, if the configured path ends with a <code>/</code>, this will be cut off
* (for example <code>/export/</code> becomes <code>/export</code>.<p>
*
* This is resource name based, and based on the rfs-rules defined in the
* <code>opencms-importexport.xml</code> configuration file.
*
* @param vfsName the name of the resource to export
*
* @return the prefix for exported links in the "real" file system
*
* @see #getExportPath(String)
* @see #getVfsPrefix()
*/
public String getRfsPrefix(String vfsName) {
if (vfsName != null) {
Iterator it = m_rfsRules.iterator();
while (it.hasNext()) {
CmsStaticExportRfsRule rule = (CmsStaticExportRfsRule)it.next();
if (rule.getSource().matcher(vfsName).matches()) {
return rule.getRfsPrefix();
}
}
}
return m_rfsPrefix;
}
/**
* Returns the original configured prefix for exported links in the "real" file, to be used
* when re-writing the configuration.<p>
*
* This is required <b>only</b> to serialize the configuration again exactly as it was configured.
* This method should <b>not</b> be used otherwise. Use <code>{@link #getRfsPrefix(String)}</code>
* to obtain the rfs prefix to use for the exported links.<p>
*
* @return the original configured prefix for exported links in the "real" file
*/
public String getRfsPrefixForConfiguration() {
return m_rfsPrefixConfigured;
}
/**
* Returns the rfs Rules.<p>
*
* @return the rfs Rules
*/
public List getRfsRules() {
return Collections.unmodifiableList(m_rfsRules);
}
/**
* Returns the vfs name of the test resource.<p>
*
* @return the vfs name of the test resource.
*/
public String getTestResource() {
return m_testResource;
}
/**
* Returns the VFS name for the given RFS name, being the exact reverse of <code>{@link #getRfsName(CmsObject, String)}</code>.<p>
*
* Returns <code>null</code> if no matching VFS resource can be found for the given RFS name.<p>
*
* @param cms the current users OpenCms context
* @param rfsName the RFS name to get the VFS name for
*
* @return the VFS name for the given RFS name, or <code>null</code> if the RFS name does not match to the VFS
*
* @see #getRfsName(CmsObject, String)
*/
public String getVfsName(CmsObject cms, String rfsName) {
CmsStaticExportData data = getExportData(rfsName, null, cms);
if (data != null) {
String result = data.getVfsName();
if ((result != null) && result.startsWith(cms.getRequestContext().getSiteRoot())) {
result = result.substring(cms.getRequestContext().getSiteRoot().length());
}
return result;
}
return null;
}
/**
* Returns the prefix for the internal in the VFS.<p>
*
* The returned value will be a direcory like prefix. The value is configured
* in the <code>opencms-importexport.xml</code> configuration file. An optimization
* of the configured value will be performed, where all relative path infprmation is resolved
* (for example <code>/opencms/../mycms</code> will be resolved to <code>/mycms</code>.
* Moreover, if the configured path ends with a <code>/</code>, this will be cut off
* (for example <code>/opencms/</code> becomes <code>/opencms</code>.<p>
*
* @return the prefix for the internal in the VFS
*
* @see #getExportPath(String)
* @see #getRfsPrefix(String)
*/
public String getVfsPrefix() {
return m_vfsPrefix;
}
/**
* Returns the original configured prefix for internal links in the VFS, to be used
* when re-writing the configuration.<p>
*
* This is required <b>only</b> to serialize the configuration again exactly as it was configured.
* This method should <b>not</b> be used otherwise. Use <code>{@link #getVfsPrefix()}</code>
* to obtain the VFS prefix to use for the internal links.<p>
*
* @return the original configured prefix for internal links in the VFS
*/
public String getVfsPrefixForConfiguration() {
return m_vfsPrefixConfigured;
}
/**
* Initializes the static export manager with the OpenCms system configuration.<p>
*
* @param cms an OpenCms context object
*/
public void initialize(CmsObject cms) {
// initialize static export RFS path (relative to web application)
m_staticExportPath = normalizeExportPath(m_staticExportPathConfigured);
if (m_staticExportPath.equals(OpenCms.getSystemInfo().getWebApplicationRfsPath())) {
throw new CmsIllegalArgumentException(Messages.get().container(Messages.ERR_INVALID_EXPORT_PATH_0));
}
// initialize prefix variables
m_rfsPrefix = normalizeRfsPrefix(m_rfsPrefixConfigured);
Iterator itRfsRules = m_rfsRules.iterator();
while (itRfsRules.hasNext()) {
CmsStaticExportRfsRule rule = (CmsStaticExportRfsRule)itRfsRules.next();
try {
rule.setExportPath(normalizeExportPath(rule.getExportPathConfigured()));
} catch (CmsIllegalArgumentException e) {
CmsLog.INIT.info(e.getMessageContainer());
rule.setExportPath(m_staticExportPath);
}
rule.setRfsPrefix(normalizeRfsPrefix(rule.getRfsPrefixConfigured()));
}
m_vfsPrefix = insertContextStrings(m_vfsPrefixConfigured);
m_vfsPrefix = CmsFileUtil.normalizePath(m_vfsPrefix, '/');
if (CmsResource.isFolder(m_vfsPrefix)) {
// ensure prefix does NOT end with a folder '/'
m_vfsPrefix = m_vfsPrefix.substring(0, m_vfsPrefix.length() - 1);
}
if (CmsLog.INIT.isDebugEnabled()) {
if (cms != null) {
CmsLog.INIT.debug(Messages.get().getBundle().key(Messages.INIT_SE_MANAGER_CREATED_1, cms));
} else {
CmsLog.INIT.debug(Messages.get().getBundle().key(Messages.INIT_SE_MANAGER_CREATED_0));
}
}
LRUMap lruMap1 = new LRUMap(2048);
m_cacheOnlineLinks = Collections.synchronizedMap(lruMap1);
if (OpenCms.getMemoryMonitor().enabled()) {
// map must be of type "LRUMap" so that memory monitor can acecss all information
OpenCms.getMemoryMonitor().register(this.getClass().getName() + ".m_cacheOnlineLinks", lruMap1);
}
LRUMap lruMap2 = new LRUMap(2048);
m_cacheExportUris = Collections.synchronizedMap(lruMap2);
if (OpenCms.getMemoryMonitor().enabled()) {
// map must be of type "LRUMap" so that memory monitor can acecss all information
OpenCms.getMemoryMonitor().register(this.getClass().getName() + ".m_cacheExportUris", lruMap2);
}
LRUMap lruMap3 = new LRUMap(2048);
m_cacheSecureLinks = Collections.synchronizedMap(lruMap3);
if (OpenCms.getMemoryMonitor().enabled()) {
// map must be of type "LRUMap" so that memory monitor can acecss all information
OpenCms.getMemoryMonitor().register(this.getClass().getName() + ".m_cacheSecureLinks", lruMap3);
}
LRUMap lruMap4 = new LRUMap(2048);
m_cacheExportLinks = Collections.synchronizedMap(lruMap4);
if (OpenCms.getMemoryMonitor().enabled()) {
// map must be of type "LRUMap" so that memory monitor can acecss all information
OpenCms.getMemoryMonitor().register(this.getClass().getName() + ".m_cacheExportLinks", lruMap4);
}
// register this object as event listener
OpenCms.addCmsEventListener(this, new int[] {
I_CmsEventListener.EVENT_PUBLISH_PROJECT,
I_CmsEventListener.EVENT_CLEAR_CACHES,
I_CmsEventListener.EVENT_UPDATE_EXPORTS});
m_exportFolderMatcher = new CmsExportFolderMatcher(m_exportFolders, m_testResource);
// initialize "exportname" folders
setExportnames();
// get the default accept-language header value
m_defaultAcceptLanguageHeader = CmsAcceptLanguageHeaderParser.createLanguageHeader();
// get the default accept-charset header value
m_defaultAcceptCharsetHeader = OpenCms.getSystemInfo().getDefaultEncoding();
// get the export url prefix
int pos = m_exportUrl.indexOf("://");
if (pos > 0) {
// absolute link, remove http://servername
int pos2 = m_exportUrl.indexOf('/', pos + 3);
if (pos2 > 0) {
m_exportUrlPrefix = m_exportUrl.substring(pos2);
} else {
// should never happen
m_exportUrlPrefix = "";
}
} else {
m_exportUrlPrefix = m_exportUrl;
}
if (CmsLog.INIT.isInfoEnabled()) {
if (isStaticExportEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_STATIC_EXPORT_ENABLED_0));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_DEFAULT_1,
new Boolean(getExportPropertyDefault())));
itRfsRules = m_rfsRules.iterator();
while (itRfsRules.hasNext()) {
CmsStaticExportRfsRule rfsRule = (CmsStaticExportRfsRule)itRfsRules.next();
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_RFS_RULE_EXPORT_PATH_2,
rfsRule.getSource(),
rfsRule.getExportPath()));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_RFS_RULE_RFS_PREFIX_2,
rfsRule.getSource(),
rfsRule.getRfsPrefix()));
if (rfsRule.getUseRelativeLinks() != null) {
if (rfsRule.getUseRelativeLinks().booleanValue()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_RFS_RULE_RELATIVE_LINKS_1,
rfsRule.getSource()));
} else {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_RFS_RULE_ABSOLUTE_LINKS_1,
rfsRule.getSource()));
}
}
}
// default rule
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_RFS_RULE_EXPORT_PATH_2,
"/",
m_staticExportPath));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_RFS_RULE_RFS_PREFIX_2,
"/",
m_rfsPrefix));
if (m_exportRelativeLinks) {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_EXPORT_RFS_RULE_RELATIVE_LINKS_1, "/"));
} else {
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_EXPORT_RFS_RULE_ABSOLUTE_LINKS_1, "/"));
}
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_EXPORT_VFS_PREFIX_1, getVfsPrefix()));
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_EXPORT_EXPORT_HANDLER_1,
getHandler().getClass().getName()));
CmsLog.INIT.info(Messages.get().getBundle().key(Messages.INIT_EXPORT_URL_1, getExportUrl()));
CmsLog.INIT.info(Messages.get().getBundle().key(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -