📄 cmsxmlentityresolver.java
字号:
*/
public void cmsEvent(CmsEvent event) {
CmsResource resource;
switch (event.getType()) {
case I_CmsEventListener.EVENT_PUBLISH_PROJECT:
case I_CmsEventListener.EVENT_CLEAR_CACHES:
// flush cache
m_cacheTemporary.clear();
m_cacheContentDefinitions.clear();
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ER_FLUSHED_CACHES_0));
}
break;
case I_CmsEventListener.EVENT_RESOURCE_MODIFIED:
resource = (CmsResource)event.getData().get("resource");
uncacheSystemId(resource.getRootPath());
break;
case I_CmsEventListener.EVENT_RESOURCE_DELETED:
List resources = (List)event.getData().get("resources");
for (int i = 0; i < resources.size(); i++) {
resource = (CmsResource)resources.get(i);
uncacheSystemId(resource.getRootPath());
}
break;
default:
// no operation
}
}
/**
* Looks up the given XML content definition system id in the internal content definition cache.<p>
*
* @param systemId the system id of the XML content definition to look up
*
* @return the XML content definition found, or null if no definition is cached for the given system id
*/
public CmsXmlContentDefinition getCachedContentDefinition(String systemId) {
String cacheKey = getCacheKeyForCurrentProject(systemId);
CmsXmlContentDefinition result = (CmsXmlContentDefinition)m_cacheContentDefinitions.get(cacheKey);
if ((result != null) && LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_CACHE_LOOKUP_SUCCEEDED_1, cacheKey));
}
return result;
}
/**
* @see org.xml.sax.EntityResolver#resolveEntity(java.lang.String, java.lang.String)
*/
public InputSource resolveEntity(String publicId, String systemId) {
// lookup the system id caches first
byte[] content;
content = (byte[])m_cachePermanent.get(systemId);
if (content != null) {
// permanent cache contains system id
return new InputSource(new ByteArrayInputStream(content));
} else if (systemId.equals(CmsXmlPage.XMLPAGE_XSD_SYSTEM_ID)) {
// XML page XSD reference
try {
InputStream stream = getClass().getClassLoader().getResourceAsStream(XMLPAGE_XSD_LOCATION);
content = CmsFileUtil.readFully(stream);
// cache the XML page DTD
m_cachePermanent.put(systemId, content);
return new InputSource(new ByteArrayInputStream(content));
} catch (Throwable t) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_XMLPAGE_XSD_NOT_FOUND_1, XMLPAGE_XSD_LOCATION), t);
}
} else if (systemId.equals(XMLPAGE_OLD_DTD_SYSTEM_ID_1) || systemId.endsWith(XMLPAGE_OLD_DTD_SYSTEM_ID_2)) {
// XML page DTD reference
try {
InputStream stream = getClass().getClassLoader().getResourceAsStream(XMLPAGE_OLD_DTD_LOCATION);
// cache the XML page DTD
content = CmsFileUtil.readFully(stream);
m_cachePermanent.put(systemId, content);
return new InputSource(new ByteArrayInputStream(content));
} catch (Throwable t) {
LOG.error(
Messages.get().getBundle().key(Messages.LOG_XMLPAGE_DTD_NOT_FOUND_1, XMLPAGE_OLD_DTD_LOCATION),
t);
}
} else if ((m_cms != null) && systemId.startsWith(OPENCMS_SCHEME)) {
// opencms:// VFS reference
String cacheSystemId = systemId.substring(OPENCMS_SCHEME.length() - 1);
String cacheKey = getCacheKey(cacheSystemId, m_cms.getRequestContext().currentProject().isOnlineProject());
// look up temporary cache
content = (byte[])m_cacheTemporary.get(cacheKey);
if (content != null) {
return new InputSource(new ByteArrayInputStream(content));
}
try {
// content not cached, read from VFS
m_cms.getRequestContext().saveSiteRoot();
m_cms.getRequestContext().setSiteRoot("/");
CmsFile file = m_cms.readFile(cacheSystemId);
content = file.getContents();
// store content in cache
m_cacheTemporary.put(cacheKey, content);
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_ER_CACHED_SYS_ID_1, cacheKey));
}
return new InputSource(new ByteArrayInputStream(content));
} catch (Throwable t) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_ENTITY_RESOLVE_FAILED_1, systemId), t);
} finally {
m_cms.getRequestContext().restoreSiteRoot();
}
} else if (systemId.substring(0, systemId.lastIndexOf("/") + 1).equalsIgnoreCase(
CmsConfigurationManager.DEFAULT_DTD_PREFIX)) {
// default DTD location in the org.opencms.configuration package
String location = null;
try {
String dtdFilename = systemId.substring(systemId.lastIndexOf("/") + 1);
location = CmsConfigurationManager.DEFAULT_DTD_LOCATION + dtdFilename;
InputStream stream = getClass().getClassLoader().getResourceAsStream(location);
content = CmsFileUtil.readFully(stream);
// cache the DTD
m_cachePermanent.put(systemId, content);
return new InputSource(new ByteArrayInputStream(content));
} catch (Throwable t) {
LOG.error(Messages.get().getBundle().key(Messages.LOG_DTD_NOT_FOUND_1, location), t);
}
}
// use the default behaviour (i.e. resolve through external URL)
return null;
}
/**
* Returns a cache key for the given system id (filename) based on the status
* of the given project flag.<p>
*
* @param systemId the system id (filename) to get the cache key for
* @param online indicates if this key is generated for the online project
*
* @return the cache key for the system id
*/
private String getCacheKey(String systemId, boolean online) {
if (online) {
return "online_".concat(systemId);
}
return "offline_".concat(systemId);
}
/**
* Returns a cache key for the given system id (filename) based on the status
* of the internal CmsObject.<p>
*
* @param systemId the system id (filename) to get the cache key for
*
* @return the cache key for the system id
*/
private String getCacheKeyForCurrentProject(String systemId) {
// check the project
boolean project = (m_cms != null) ? m_cms.getRequestContext().currentProject().isOnlineProject() : false;
// remove opencms:// prefix
if (systemId.startsWith(OPENCMS_SCHEME)) {
systemId = systemId.substring(OPENCMS_SCHEME.length() - 1);
}
return getCacheKey(systemId, project);
}
/**
* Uncaches a system id (filename) from the internal offline temporary and content defintions caches.<p>
*
* The online resources cached for the online project are only flushed when a project is published.<p>
*
* @param systemId the system id (filename) to uncache
*/
private void uncacheSystemId(String systemId) {
Object o;
o = m_cacheTemporary.remove(getCacheKey(systemId, false));
if (null != o) {
// if an object was removed from the tomporary cache, all XML content definitions must be cleared
// because this may be a nested subschema
m_cacheContentDefinitions.clear();
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_ER_UNCACHED_SYS_ID_1,
getCacheKey(systemId, false)));
}
} else {
// check if a cached content definition has to be removed based on the system id
o = m_cacheContentDefinitions.remove(getCacheKey(systemId, false));
if ((null != o) && LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_ER_UNCACHED_CONTENT_DEF_1,
getCacheKey(systemId, false)));
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -