cmsdefaultxmlcontenthandler.java
来自「找了很久才找到到源代码」· Java 代码 · 共 1,448 行 · 第 1/5 页
JAVA
1,448 行
if (schemaType == null) {
// no element with the given name
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_CHECK_INVALID_ELEM_1,
elementName));
}
if (!CmsXmlVfsFileValue.TYPE_NAME.equals(schemaType.getTypeName())
&& !CmsXmlVarLinkValue.TYPE_NAME.equals(schemaType.getTypeName())) {
// element is not a OpenCmsVfsFile
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_CHECK_INVALID_TYPE_1,
elementName));
}
// cache the check rule data
Boolean invalidateParent = null;
if ((invalidate == null)
|| invalidate.equalsIgnoreCase(Boolean.TRUE.toString())
|| invalidate.equalsIgnoreCase(APPINFO_ATTR_TYPE_NODE)) {
invalidateParent = Boolean.FALSE;
} else if (invalidate.equalsIgnoreCase(APPINFO_ATTR_TYPE_PARENT)) {
invalidateParent = Boolean.TRUE;
}
if (invalidateParent != null) {
m_relations.put(elementName, invalidateParent);
}
CmsRelationType relationType = (type == null ? CmsRelationType.XML_WEAK : CmsRelationType.valueOfXml(type));
m_relations.put(RELATION_TYPE_PREFIX + elementName, relationType);
if (invalidateParent != null) {
// check the whole xpath hierarchy
String path = elementName;
while (CmsStringUtil.isNotEmptyOrWhitespaceOnly(path)) {
if (!isInvalidateParent(path)) {
// if invalidate type = node, then the node needs to be optional
if (contentDefinition.getSchemaType(path).getMinOccurs() > 0) {
// element is not optional
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_CHECK_NOT_OPTIONAL_1,
path));
}
// no need to further check
break;
} else if (!CmsXmlUtils.isDeepXpath(path)) {
// if invalidate type = parent, then the node needs to be nested
// document root can not be invalidated
throw new CmsXmlException(Messages.get().container(Messages.ERR_XMLCONTENT_CHECK_NOT_EMPTY_DOC_0));
}
path = CmsXmlUtils.removeLastXpathElement(path);
}
}
}
/**
* 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(
Messages.ERR_XMLCONTENT_CONFIG_ELEM_UNKNOWN_1,
elementName));
}
m_configurationValues.put(elementName, configurationValue);
}
/**
* Adds a default value for an element.<p>
*
* @param contentDefinition the XML content definition this XML content handler belongs to
* @param elementName the element name to map
* @param defaultValue the default value to use
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addDefault(CmsXmlContentDefinition contentDefinition, String elementName, String defaultValue)
throws CmsXmlException {
if (contentDefinition.getSchemaType(elementName) == null) {
throw new CmsXmlException(org.opencms.xml.types.Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_ELEM_DEFAULT_1,
elementName));
}
// store mappings as xpath to allow better control about what is mapped
String xpath = CmsXmlUtils.createXpath(elementName, 1);
m_defaultValues.put(xpath, defaultValue);
}
/**
* Adds all needed default check rules recursively for the given schema type.<p>
*
* @param rootContentDefinition the root content definition
* @param schemaType the schema type to check
* @param elementPath the current element path
*
* @throws CmsXmlException if something goes wrong
*/
protected void addDefaultCheckRules(
CmsXmlContentDefinition rootContentDefinition,
I_CmsXmlSchemaType schemaType,
String elementPath) throws CmsXmlException {
if ((schemaType != null) && schemaType.isSimpleType()) {
if ((schemaType.getMinOccurs() == 0)
&& (CmsXmlVfsFileValue.TYPE_NAME.equals(schemaType.getTypeName()) || CmsXmlVarLinkValue.TYPE_NAME.equals(schemaType.getTypeName()))
&& !m_relations.containsKey(elementPath)
&& !m_relations.containsKey(RELATION_TYPE_PREFIX + elementPath)) {
// add default check rule for the element
addCheckRule(rootContentDefinition, elementPath, null, null);
}
} else {
// recursion required
CmsXmlContentDefinition nestedContentDefinition = rootContentDefinition;
if (schemaType != null) {
CmsXmlNestedContentDefinition nestedDefinition = (CmsXmlNestedContentDefinition)schemaType;
nestedContentDefinition = nestedDefinition.getNestedContentDefinition();
}
Iterator itElems = nestedContentDefinition.getSchemaTypes().iterator();
while (itElems.hasNext()) {
String element = (String)itElems.next();
String path = (schemaType != null) ? CmsXmlUtils.concatXpath(elementPath, element) : element;
addDefaultCheckRules(rootContentDefinition, nestedContentDefinition.getSchemaType(element), path);
}
}
}
/**
* Adds an element mapping.<p>
*
* @param contentDefinition the XML content definition this XML content handler belongs to
* @param elementName the element name to map
* @param mapping the mapping to use
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addMapping(CmsXmlContentDefinition contentDefinition, String elementName, String mapping)
throws CmsXmlException {
if (contentDefinition.getSchemaType(elementName) == null) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_ELEM_MAPPING_1,
elementName));
}
// store mappings as xpath to allow better control about what is mapped
String xpath = CmsXmlUtils.createXpath(elementName, 1);
// since 7.0.2 multiple mappings are possible, so the mappings are stored in an array
String[] values = (String[])m_elementMappings.get(xpath);
if (values == null) {
values = new String[] {mapping};
} else {
String[] newValues = new String[values.length + 1];
System.arraycopy(values, 0, newValues, 0, values.length);
newValues[values.length] = mapping;
values = newValues;
}
m_elementMappings.put(xpath, values);
}
/**
* Adds a search setting for an element.<p>
*
* @param contentDefinition the XML content definition this XML content handler belongs to
* @param elementName the element name to map
* @param value the search setting value to store
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addSearchSetting(CmsXmlContentDefinition contentDefinition, String elementName, Boolean value)
throws CmsXmlException {
if (contentDefinition.getSchemaType(elementName) == null) {
throw new CmsXmlException(org.opencms.xml.types.Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_ELEM_SEARCHSETTINGS_1,
elementName));
}
// store the search exclusion as defined
m_searchSettings.put(elementName, value);
}
/**
* Adds a validation 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 regex the validation rule regular expression
* @param message the message in case validation fails (may be null)
* @param isWarning if true, this rule is used for warnings, otherwise it's an error
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addValidationRule(
CmsXmlContentDefinition contentDefinition,
String elementName,
String regex,
String message,
boolean isWarning) throws CmsXmlException {
if (contentDefinition.getSchemaType(elementName) == null) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_ELEM_VALIDATION_1,
elementName));
}
if (isWarning) {
m_validationWarningRules.put(elementName, regex);
if (message != null) {
m_validationWarningMessages.put(elementName, message);
}
} else {
m_validationErrorRules.put(elementName, regex);
if (message != null) {
m_validationErrorMessages.put(elementName, message);
}
}
}
/**
* Adds a GUI widget for a specified element.<p>
*
* @param contentDefinition the XML content definition this XML content handler belongs to
* @param elementName the element name to map
* @param widgetClassOrAlias the widget to use as GUI for the element (registered alias or class name)
*
* @throws CmsXmlException in case an unknown element name is used
*/
protected void addWidget(CmsXmlContentDefinition contentDefinition, String elementName, String widgetClassOrAlias)
throws CmsXmlException {
if (contentDefinition.getSchemaType(elementName) == null) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_ELEM_LAYOUTWIDGET_1,
elementName));
}
// get the base widget from the XML content type manager
I_CmsWidget widget = OpenCms.getXmlContentTypeManager().getWidget(widgetClassOrAlias);
if (widget == null) {
// no registered widget class found
if (CmsStringUtil.isValidJavaClassName(widgetClassOrAlias)) {
// java class name given, try to create new instance of the class and cast to widget
try {
Class specialWidgetClass = Class.forName(widgetClassOrAlias);
widget = (I_CmsWidget)specialWidgetClass.newInstance();
} catch (Exception e) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_CUSTOM_CLASS_3,
widgetClassOrAlias,
elementName,
contentDefinition.getSchemaLocation()), e);
}
}
if (widget == null) {
// no valid widget found
throw new CmsXmlException(Messages.get().container(
Messages.ERR_XMLCONTENT_INVALID_WIDGET_3,
widgetClassOrAlias,
elementName,
contentDefinition.getSchemaLocation()));
}
}
m_elementWidgets.put(elementName, widget);
}
/**
* Returns the validation message to be displayed if a certain rule was violated.<p>
*
* @param cms the current users OpenCms context
* @param value the value to validate
* @param regex the rule that was violated
* @param valueStr the string value of the given value
* @param matchResult if false, the rule was negated
* @param isWarning if true, this validation indicate a warning, otherwise an error
*
* @return the validation message to be displayed
*/
protected String getValidationMessage(
CmsObject cms,
I_CmsXmlContentValue value,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?