📄 cmsdefaultxmlcontenthandler.java
字号:
/**
* @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) {
// no appinfo provided, so no initialization is required
return;
}
// 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_DEFAULTS)) {
initDefaultValues(element, contentDefinition);
} else if (nodeName.equals(APPINFO_PREVIEW)) {
initPreview(element, contentDefinition);
} else if (nodeName.equals(APPINFO_RESOURCEBUNDLE)) {
initResourceBundle(element, contentDefinition);
}
}
}
/**
* @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 {
// validate the xml structure before writing the file
// 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 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-elemenets 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 mapping for the element name
String mapping = getMapping(value.getPath());
if (CmsStringUtil.isNotEmpty(mapping)) {
// get root path of the file
String rootPath = content.getFile().getRootPath();
try {
// try / catch to ensure site root is always restored
cms.getRequestContext().saveSiteRoot();
cms.getRequestContext().setSiteRoot("/");
// read all siblings of the file
List siblings = cms.readSiblings(rootPath, CmsResourceFilter.IGNORE_EXPIRATION);
// for multilanguage mappings, we need to ensure
// a) all siblings are handled
// b) only the "right" locale is mapped to a sibling
for (int i = (siblings.size() - 1); i >= 0; i--) {
// get filename
String filename = ((CmsResource)siblings.get(i)).getRootPath();
Locale locale = OpenCms.getLocaleManager().getDefaultLocale(cms, 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(cms);
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(cms));
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
cms.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
cms.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: // datereleased
long date;
date = Long.valueOf(stringValue).longValue();
if (date == 0) {
date = CmsResource.DATE_RELEASED_DEFAULT;
}
file.setDateReleased(date);
break;
case 1: // dateexpired
date = Long.valueOf(stringValue).longValue();
if (date == 0) {
date = CmsResource.DATE_EXPIRED_DEFAULT;
}
file.setDateExpired(date);
break;
default:
// ignore invalid / other mappings
}
}
}
} finally {
// restore the saved site root
cms.getRequestContext().restoreSiteRoot();
}
}
}
/**
* @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-elemenets 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 configuration value for an element widget.<p>
*
* @param contentDefinition the XML content definition this XML content handler belongs to
* @param elementName the element name to map
* @param configurationValue the configuration value to use
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addConfiguration(
CmsXmlContentDefinition contentDefinition,
String elementName,
String configurationValue) throws CmsXmlException {
if (contentDefinition.getSchemaType(elementName) == null) {
throw new CmsXmlException(Messages.get().container(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -