cmsdefaultxmlcontenthandler.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,448 行 · 第 1/5 页
JAVA
1,448 行
appinfoSchema = CmsFileUtil.readFile(APPINFO_SCHEMA_FILE);
} catch (Exception e) {
throw new CmsRuntimeException(Messages.get().container(
org.opencms.xml.types.Messages.ERR_XMLCONTENT_LOAD_SCHEMA_1,
APPINFO_SCHEMA_FILE), e);
}
CmsXmlEntityResolver.cacheSystemId(APPINFO_SCHEMA_SYSTEM_ID, appinfoSchema);
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#getConfiguration(org.opencms.xml.types.I_CmsXmlSchemaType)
*/
public String getConfiguration(I_CmsXmlSchemaType type) {
String elementName = type.getName();
return (String)m_configurationValues.get(elementName);
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#getDefault(org.opencms.file.CmsObject, I_CmsXmlContentValue, java.util.Locale)
*/
public String getDefault(CmsObject cms, I_CmsXmlContentValue value, Locale locale) {
String defaultValue;
if (value.getElement() == null) {
// use the "getDefault" method of the given value, will use value from standard XML schema
defaultValue = value.getDefault(locale);
} else {
String xpath = value.getPath();
// look up the default from the configured mappings
defaultValue = (String)m_defaultValues.get(xpath);
if (defaultValue == null) {
// no value found, try default xpath
xpath = CmsXmlUtils.removeXpath(xpath);
xpath = CmsXmlUtils.createXpath(xpath, 1);
// look up the default value again with default index of 1 in all path elements
defaultValue = (String)m_defaultValues.get(xpath);
}
}
if (defaultValue != null) {
CmsObject newCms = cms;
try {
// switch the current URI to the XML document resource so that properties can be read
CmsResource file = value.getDocument().getFile();
CmsSite site = OpenCms.getSiteManager().getSiteForRootPath(file.getRootPath());
if (site != null) {
newCms = OpenCms.initCmsObject(cms);
newCms.getRequestContext().setSiteRoot(site.getSiteRoot());
newCms.getRequestContext().setUri(newCms.getSitePath(file));
}
} catch (Exception e) {
// on any error just use the default input OpenCms context
}
// return the default value with processed macros
CmsMacroResolver resolver = CmsMacroResolver.newInstance().setCmsObject(newCms).setMessages(
getMessages(locale));
return resolver.resolveMacros(defaultValue);
}
// no default value is available
return null;
}
/**
* Returns the first mapping defined for the given element xpath.<p>
*
* Since OpenCms version 7.0.2, multiple mappings for an element are possible, so
* use {@link #getMapping(String)} instead.<p>
*
* @param elementName the element xpath to look up the mapping for
*
* @return the mapping defined for the given element xpath
*
* @deprecated use {@link #getMappings(String)} instead to recieve all mappings
*/
public String getMapping(String elementName) {
String[] mappings = getMappings(elementName);
return (mappings == null) ? null : mappings[0];
}
/**
* Returns the all mappings defined for the given element xpath.<p>
*
* @since 7.0.2
*
* @param elementName the element xpath to look up the mapping for
*
* @return the mapping defined for the given element xpath
*/
public String[] getMappings(String elementName) {
return (String[])m_elementMappings.get(elementName);
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#getMessages(java.util.Locale)
*/
public CmsMessages getMessages(Locale locale) {
if (m_messageBundleName == null) {
// no message bundle was initialized
return null;
}
return new CmsMessages(m_messageBundleName, locale);
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#getModelFolder(org.opencms.file.CmsObject, java.lang.String)
*/
public String getModelFolder(CmsObject cms, String currentFolder) {
String result = m_modelFolder;
// store the original uri
String uri = cms.getRequestContext().getUri();
try {
// set uri to current folder
cms.getRequestContext().setUri(currentFolder);
CmsMacroResolver resolver = CmsMacroResolver.newInstance().setCmsObject(cms);
// resolve eventual macros
result = resolver.resolveMacros(m_modelFolder);
} finally {
// switch back to stored uri
cms.getRequestContext().setUri(uri);
}
return result;
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#getPreview(org.opencms.file.CmsObject, org.opencms.xml.content.CmsXmlContent, java.lang.String)
*/
public String getPreview(CmsObject cms, CmsXmlContent content, String resourcename) {
CmsMacroResolver resolver = CmsMacroResolver.newInstance().setCmsObject(cms);
resolver.addMacro(MACRO_PREVIEW_TEMPFILE, resourcename);
return resolver.resolveMacros(m_previewLocation);
}
/**
* @see I_CmsXmlContentHandler#getRelationType(I_CmsXmlContentValue)
*/
public CmsRelationType getRelationType(I_CmsXmlContentValue value) {
if (value == null) {
return null;
}
String xpath = value.getPath();
CmsRelationType relationType = null;
// look up the default from the configured mappings
relationType = (CmsRelationType)m_relations.get(RELATION_TYPE_PREFIX + xpath);
if (relationType == null) {
// no value found, try default xpath
String path = CmsXmlUtils.removeXpathIndex(xpath);
// look up the default value again without indexes
relationType = (CmsRelationType)m_relations.get(RELATION_TYPE_PREFIX + path);
}
if (relationType == null) {
// no value found, try the last simple type path
String path = CmsXmlUtils.getLastXpathElement(xpath);
// look up the default value again for the last simple type
relationType = (CmsRelationType)m_relations.get(RELATION_TYPE_PREFIX + path);
}
if (relationType == null) {
return CmsRelationType.XML_WEAK;
}
return relationType;
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#getWidget(org.opencms.xml.types.I_CmsXmlContentValue)
*/
public I_CmsWidget getWidget(I_CmsXmlContentValue value) {
// try the specific widget settings first
I_CmsWidget result = (I_CmsWidget)m_elementWidgets.get(value.getName());
if (result == null) {
// use default widget mappings
result = OpenCms.getXmlContentTypeManager().getWidgetDefault(value.getTypeName());
} else {
result = result.newInstance();
}
// set the configuration value for this widget
result.setConfiguration(getConfiguration(value));
return result;
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#initialize(org.dom4j.Element, org.opencms.xml.CmsXmlContentDefinition)
*/
public synchronized void initialize(Element appInfoElement, CmsXmlContentDefinition contentDefinition)
throws CmsXmlException {
if (appInfoElement != null) {
// validate the appinfo element XML content with the default appinfo handler schema
validateAppinfoElement(appInfoElement);
// re-initialize the local variables
init();
Iterator i = appInfoElement.elements().iterator();
while (i.hasNext()) {
// iterate all elements in the appinfo node
Element element = (Element)i.next();
String nodeName = element.getName();
if (nodeName.equals(APPINFO_MAPPINGS)) {
initMappings(element, contentDefinition);
} else if (nodeName.equals(APPINFO_LAYOUTS)) {
initLayouts(element, contentDefinition);
} else if (nodeName.equals(APPINFO_VALIDATIONRULES)) {
initValidationRules(element, contentDefinition);
} else if (nodeName.equals(APPINFO_RELATIONS)) {
initRelations(element, contentDefinition);
} else if (nodeName.equals(APPINFO_DEFAULTS)) {
initDefaultValues(element, contentDefinition);
} else if (nodeName.equals(APPINFO_MODELFOLDER)) {
initModelFolder(element, contentDefinition);
} else if (nodeName.equals(APPINFO_PREVIEW)) {
initPreview(element, contentDefinition);
} else if (nodeName.equals(APPINFO_RESOURCEBUNDLE)) {
initResourceBundle(element, contentDefinition);
}
}
}
// at the end, add default check rules for optional file references
addDefaultCheckRules(contentDefinition, null, null);
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#invalidateBrokenLinks(CmsObject, CmsXmlContent)
*/
public void invalidateBrokenLinks(CmsObject cms, CmsXmlContent document) {
if ((cms == null) || (cms.getRequestContext().getRequestTime() == CmsResource.DATE_RELEASED_EXPIRED_IGNORE)) {
// do not check if the request comes the editor
return;
}
boolean needReinitialization = false;
// iterate the locales
Iterator itLocales = document.getLocales().iterator();
while (itLocales.hasNext()) {
Locale locale = (Locale)itLocales.next();
List removedNodes = new ArrayList();
// iterate the values
Iterator itValues = document.getValues(locale).iterator();
while (itValues.hasNext()) {
I_CmsXmlContentValue value = (I_CmsXmlContentValue)itValues.next();
String path = value.getPath();
// check if this value has already been deleted by parent rules
boolean alreadyRemoved = false;
Iterator itRemNodes = removedNodes.iterator();
while (itRemNodes.hasNext()) {
String remNode = (String)itRemNodes.next();
if (path.startsWith(remNode)) {
alreadyRemoved = true;
break;
}
}
// only continue if not already removed and if a rule match
if (alreadyRemoved
|| ((m_relations.get(path) == null) && (m_relations.get(CmsXmlUtils.removeXpath(path)) == null))) {
continue;
}
// check rule matched
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(Messages.LOG_XMLCONTENT_CHECK_RULE_MATCH_1, path));
}
if (validateLink(cms, value, null)) {
// invalid link
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_XMLCONTENT_CHECK_WARNING_2,
path,
value.getStringValue(cms)));
}
// find the node to remove
String parentPath = path;
while (isInvalidateParent(parentPath)) {
// check parent
parentPath = CmsXmlUtils.removeLastXpathElement(parentPath);
// log info
if (LOG.isDebugEnabled()) {
LOG.debug(Messages.get().getBundle().key(
Messages.LOG_XMLCONTENT_CHECK_PARENT_2,
path,
parentPath));
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?