cmsdefaultxmlcontenthandler.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,448 行 · 第 1/5 页
JAVA
1,448 行
}
value = document.getValue(parentPath, locale);
// detach the value node from the XML document
value.getElement().detach();
// mark node as deleted
removedNodes.add(parentPath);
}
}
if (!removedNodes.isEmpty()) {
needReinitialization = true;
}
}
if (needReinitialization) {
// re-initialize the XML content
document.initDocument();
}
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#isSearchable(org.opencms.xml.types.I_CmsXmlContentValue)
*/
public boolean isSearchable(I_CmsXmlContentValue value) {
// check for name configured in the annotations
Boolean anno = (Boolean)m_searchSettings.get(value.getName());
// if no annotation has been found, use default for value
return (anno == null) ? value.isSearchable() : anno.booleanValue();
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#prepareForUse(org.opencms.file.CmsObject, org.opencms.xml.content.CmsXmlContent)
*/
public CmsXmlContent prepareForUse(CmsObject cms, CmsXmlContent content) {
// NOOP, just return the unmodified content
return content;
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#prepareForWrite(org.opencms.file.CmsObject, org.opencms.xml.content.CmsXmlContent, org.opencms.file.CmsFile)
*/
public CmsFile prepareForWrite(CmsObject cms, CmsXmlContent content, CmsFile file) throws CmsException {
if (!content.isAutoCorrectionEnabled()) {
// check if the XML should be corrected automatically (if not already set)
Object attribute = cms.getRequestContext().getAttribute(CmsXmlContent.AUTO_CORRECTION_ATTRIBUTE);
// set the auto correction mode as required
boolean autoCorrectionEnabled = (attribute != null) && ((Boolean)attribute).booleanValue();
content.setAutoCorrectionEnabled(autoCorrectionEnabled);
}
// validate the XML structure before writing the file if required
if (!content.isAutoCorrectionEnabled()) {
// an exception will be thrown if the structure is invalid
content.validateXmlStructure(new CmsXmlEntityResolver(cms));
}
// read the content-conversion property
String contentConversion = CmsHtmlConverter.getConversionSettings(cms, file);
if (CmsStringUtil.isEmptyOrWhitespaceOnly(contentConversion)) {
// enable pretty printing and XHTML conversion of XML content html fields by default
contentConversion = CmsHtmlConverter.PARAM_XHTML;
}
content.setConversion(contentConversion);
// correct the HTML structure
file = content.correctXmlStructure(cms);
content.setFile(file);
// resolve the file mappings
content.resolveMappings(cms);
// ensure all property mappings of deleted optional values are removed
removeEmptyMappings(cms, content);
// return the result
return file;
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#resolveMapping(org.opencms.file.CmsObject, org.opencms.xml.content.CmsXmlContent, org.opencms.xml.types.I_CmsXmlContentValue)
*/
public void resolveMapping(CmsObject cms, CmsXmlContent content, I_CmsXmlContentValue value) throws CmsException {
if (!value.isSimpleType()) {
// no mappings for a nested schema are possible
// note that the sub-elements of the nested schema ARE mapped by the node visitor,
// it's just the nested schema value itself that does not support mapping
return;
}
// get the original VFS file from the content
CmsFile file = content.getFile();
if (file == null) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_XMLCONTENT_RESOLVE_FILE_NOT_FOUND_0));
}
// get the mappings for the element name
String[] mappings = getMappings(value.getPath());
if (mappings == null) {
// nothing to do if we have no mappings at all
return;
}
// create OpenCms user context initialized with "/" as site root to read all siblings
CmsObject rootCms = OpenCms.initCmsObject(cms);
rootCms.getRequestContext().setSiteRoot("/");
// read all siblings of the file
List siblings = rootCms.readSiblings(content.getFile().getRootPath(), CmsResourceFilter.IGNORE_EXPIRATION);
// since 7.0.2 multiple mappings are possible
for (int m = mappings.length - 1; m >= 0; m--) {
// for multiple language mappings, we need to ensure
// a) all siblings are handled
// b) only the "right" locale is mapped to a sibling
String mapping = mappings[m];
if (CmsStringUtil.isNotEmpty(mapping)) {
for (int i = (siblings.size() - 1); i >= 0; i--) {
// get filename
String filename = ((CmsResource)siblings.get(i)).getRootPath();
Locale locale = OpenCms.getLocaleManager().getDefaultLocale(rootCms, filename);
if (!locale.equals(value.getLocale())) {
// only map property if the locale fits
continue;
}
// get the string value of the current node
String stringValue = value.getStringValue(rootCms);
if (mapping.startsWith(MAPTO_PROPERTY_LIST) && (value.getIndex() == 0)) {
boolean mapToShared;
int prefixLength;
// check which mapping is used (shared or individual)
if (mapping.startsWith(MAPTO_PROPERTY_LIST_SHARED)) {
mapToShared = true;
prefixLength = MAPTO_PROPERTY_LIST_SHARED.length();
} else if (mapping.startsWith(MAPTO_PROPERTY_LIST_INDIVIDUAL)) {
mapToShared = false;
prefixLength = MAPTO_PROPERTY_LIST_INDIVIDUAL.length();
} else {
mapToShared = false;
prefixLength = MAPTO_PROPERTY_LIST.length();
}
// this is a property list mapping
String property = mapping.substring(prefixLength);
String path = CmsXmlUtils.removeXpathIndex(value.getPath());
List values = content.getValues(path, locale);
Iterator j = values.iterator();
StringBuffer result = new StringBuffer(values.size() * 64);
while (j.hasNext()) {
I_CmsXmlContentValue val = (I_CmsXmlContentValue)j.next();
result.append(val.getStringValue(rootCms));
if (j.hasNext()) {
result.append(CmsProperty.VALUE_LIST_DELIMITER);
}
}
CmsProperty p;
if (mapToShared) {
// map to shared value
p = new CmsProperty(property, null, result.toString());
} else {
// map to individual value
p = new CmsProperty(property, result.toString(), null);
}
// write the created list string value in the selected property
rootCms.writePropertyObject(filename, p);
if (mapToShared) {
// special case: shared mappings must be written only to one sibling, end loop
i = 0;
}
} else if (mapping.startsWith(MAPTO_PROPERTY)) {
boolean mapToShared;
int prefixLength;
// check which mapping is used (shared or individual)
if (mapping.startsWith(MAPTO_PROPERTY_SHARED)) {
mapToShared = true;
prefixLength = MAPTO_PROPERTY_SHARED.length();
} else if (mapping.startsWith(MAPTO_PROPERTY_INDIVIDUAL)) {
mapToShared = false;
prefixLength = MAPTO_PROPERTY_INDIVIDUAL.length();
} else {
mapToShared = false;
prefixLength = MAPTO_PROPERTY.length();
}
// this is a property mapping
String property = mapping.substring(prefixLength);
CmsProperty p;
if (mapToShared) {
// map to shared value
p = new CmsProperty(property, null, stringValue);
} else {
// map to individual value
p = new CmsProperty(property, stringValue, null);
}
// just store the string value in the selected property
rootCms.writePropertyObject(filename, p);
if (mapToShared) {
// special case: shared mappings must be written only to one sibling, end loop
i = 0;
}
} else if (mapping.startsWith(MAPTO_ATTRIBUTE)) {
// this is an attribute mapping
String attribute = mapping.substring(MAPTO_ATTRIBUTE.length());
switch (ATTRIBUTES.indexOf(attribute)) {
case 0: // date released
long date = 0;
try {
date = Long.valueOf(stringValue).longValue();
} catch (NumberFormatException e) {
// ignore, value can be a macro
}
if (date == 0) {
date = CmsResource.DATE_RELEASED_DEFAULT;
}
file.setDateReleased(date);
break;
case 1: // date expired
date = 0;
try {
date = Long.valueOf(stringValue).longValue();
} catch (NumberFormatException e) {
// ignore, value can be a macro
}
if (date == 0) {
date = CmsResource.DATE_EXPIRED_DEFAULT;
}
file.setDateExpired(date);
break;
default:
// ignore invalid / other mappings
}
}
}
}
}
}
/**
* @see org.opencms.xml.content.I_CmsXmlContentHandler#resolveValidation(org.opencms.file.CmsObject, org.opencms.xml.types.I_CmsXmlContentValue, org.opencms.xml.content.CmsXmlContentErrorHandler)
*/
public CmsXmlContentErrorHandler resolveValidation(
CmsObject cms,
I_CmsXmlContentValue value,
CmsXmlContentErrorHandler errorHandler) {
if (errorHandler == null) {
// init a new error handler if required
errorHandler = new CmsXmlContentErrorHandler();
}
if (!value.isSimpleType()) {
// no validation for a nested schema is possible
// note that the sub-elements of the nested schema ARE validated by the node visitor,
// it's just the nested schema value itself that does not support validation
return errorHandler;
}
// validate the error rules
errorHandler = validateValue(cms, value, errorHandler, m_validationErrorRules, false);
// validate the warning rules
errorHandler = validateValue(cms, value, errorHandler, m_validationWarningRules, true);
// return the result
return errorHandler;
}
/**
* Adds a check rule for a specified element.<p>
*
* @param contentDefinition the XML content definition this XML content handler belongs to
* @param elementName the element name to add the rule to
* @param invalidate
* <code>false</code>, to disable link check
* <code>true</code> or <code>node</code>, to invalidate just the single node if the link is broken
* <code>parent</code>, if this rule will invalidate the whole parent node in nested content
* @param type the relation type
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addCheckRule(
CmsXmlContentDefinition contentDefinition,
String elementName,
String invalidate,
String type) throws CmsXmlException {
I_CmsXmlSchemaType schemaType = contentDefinition.getSchemaType(elementName);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?