📄 cmsxmlcontentdefinition.java
字号:
*/
public static CmsXmlContentDefinition unmarshal(Document document, String schemaLocation) throws CmsXmlException {
EntityResolver resolver = document.getEntityResolver();
CmsXmlContentDefinition result = getCachedContentDefinition(schemaLocation, resolver);
if (result == null) {
// content definition was not found in the cache, unmarshal the XML document
result = unmarshalInternal(document, schemaLocation, resolver);
}
return result;
}
/**
* Factory method to unmarshal (read) a XML content definition instance from a XML InputSource.<p>
*
* @param source the XML InputSource to use
* @param schemaLocation the location from which the XML schema was read (system id)
* @param resolver the XML entitiy resolver to use
*
* @return a XML content definition instance unmarshalled from the InputSource
*
* @throws CmsXmlException if something goes wrong
*/
public static CmsXmlContentDefinition unmarshal(InputSource source, String schemaLocation, EntityResolver resolver)
throws CmsXmlException {
CmsXmlContentDefinition result = getCachedContentDefinition(schemaLocation, resolver);
if (result == null) {
// content definition was not found in the cache, unmarshal the XML document
result = unmarshalInternal(CmsXmlUtils.unmarshalHelper(source, resolver), schemaLocation, resolver);
}
return result;
}
/**
* Factory method to unmarshal (read) a XML content definition instance from a given XML schema location.<p>
*
* The XML content definiton data to unmarshal will be read from the provided schema location using
* an XML InputSource.<p>
*
* @param schemaLocation the location from which to read the XML schema (system id)
* @param resolver the XML entitiy resolver to use
*
* @return a XML content definition instance unmarshalled from the InputSource
*
* @throws CmsXmlException if something goes wrong
* @throws SAXException if the XML schema location could not be converted to an XML InputSource
* @throws IOException if the XML schema location could not be converted to an XML InputSource
*/
public static CmsXmlContentDefinition unmarshal(String schemaLocation, EntityResolver resolver)
throws CmsXmlException, SAXException, IOException {
CmsXmlContentDefinition result = getCachedContentDefinition(schemaLocation, resolver);
if (result == null) {
// content definition was not found in the cache, unmarshal the XML document
InputSource source = resolver.resolveEntity(null, schemaLocation);
result = unmarshalInternal(CmsXmlUtils.unmarshalHelper(source, resolver), schemaLocation, resolver);
}
return result;
}
/**
* Factory method to unmarshal (read) a XML content definition instance from a String
* that contains XML data.<p>
*
* @param xmlData the XML data in a String
* @param schemaLocation the location from which the XML schema was read (system id)
* @param resolver the XML entitiy resolver to use
*
* @return a XML content definition instance unmarshalled from the byte array
*
* @throws CmsXmlException if something goes wrong
*/
public static CmsXmlContentDefinition unmarshal(String xmlData, String schemaLocation, EntityResolver resolver)
throws CmsXmlException {
CmsXmlContentDefinition result = getCachedContentDefinition(schemaLocation, resolver);
if (result == null) {
// content definition was not found in the cache, unmarshal the XML document
result = unmarshalInternal(CmsXmlUtils.unmarshalHelper(xmlData, resolver), schemaLocation, resolver);
}
return result;
}
/**
* Creates the name of the type attribute from the given content name.<p>
*
* @param name the name to use
*
* @return the name of the type attribute
*/
protected static String createTypeName(String name) {
StringBuffer result = new StringBuffer(32);
result.append("OpenCms");
result.append(name.substring(0, 1).toUpperCase());
if (name.length() > 1) {
result.append(name.substring(1));
}
return result.toString();
}
/**
* Validates if a given attribute exists at the given element with an (optional) specified value.<p>
*
* If the required value is not <code>null</code>, the attribute must have excatly this
* value set.<p>
*
* If no value is required, some simple validation is performed on the attribute value,
* like a check that the value does not have leading or trainling white spaces.<p>
*
* @param element the element to validate
* @param attributeName the attribute to check for
* @param requiredValue the required value of the attribute, or <code>null</code> if any value is allowed
*
* @return the value of the attribute
*
* @throws CmsXmlException if the element does not have the required attribute set, or if the validation fails
*/
protected static String validateAttribute(Element element, String attributeName, String requiredValue)
throws CmsXmlException {
Attribute attribute = element.attribute(attributeName);
if (attribute == null) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_MISSING_ATTRIBUTE_2,
element.getUniquePath(),
attributeName));
}
String value = attribute.getValue();
if (requiredValue == null) {
if (CmsStringUtil.isEmptyOrWhitespaceOnly(value) || !value.equals(value.trim())) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_BAD_ATTRIBUTE_WS_3,
element.getUniquePath(),
attributeName,
value));
}
} else {
if (!requiredValue.equals(value)) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_BAD_ATTRIBUTE_VALUE_4,
new Object[] {element.getUniquePath(), attributeName, requiredValue, value}));
}
}
return value;
}
/**
* Validates if a gicen element has exactly the required attributes set.<p>
*
* @param element the element to validate
* @param requiredAttributes the list of required attributes
* @param optionalAttributes the list of optional attributes
*
* @throws CmsXmlException if the validation fails
*/
protected static void validateAttributesExists(
Element element,
String[] requiredAttributes,
String[] optionalAttributes) throws CmsXmlException {
if (element.attributeCount() < requiredAttributes.length) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_ATTRIBUTE_TOOFEW_3,
element.getUniquePath(),
new Integer(requiredAttributes.length),
new Integer(element.attributeCount())));
}
if (element.attributeCount() > (requiredAttributes.length + optionalAttributes.length)) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_ATTRIBUTE_TOOMANY_3,
element.getUniquePath(),
new Integer(requiredAttributes.length + optionalAttributes.length),
new Integer(element.attributeCount())));
}
List attributes = element.attributes();
for (int i = 0; i < requiredAttributes.length; i++) {
String attributeName = requiredAttributes[i];
if (element.attribute(attributeName) == null) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_MISSING_ATTRIBUTE_2,
element.getUniquePath(),
attributeName));
}
}
List rA = Arrays.asList(requiredAttributes);
List oA = Arrays.asList(optionalAttributes);
for (int i = 0; i < attributes.size(); i++) {
String attributeName = element.attribute(i).getName();
if (!rA.contains(attributeName) && !oA.contains(attributeName)) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_EL_INVALID_ATTRIBUTE_2,
element.getUniquePath(),
attributeName));
}
}
}
/**
* Validates the given element as a complex type sequence.<p>
*
* @param element the element to validate
* @param includes the XML schema includes
* @param definition the content definition the complex type seqnence belongs to
*
* @return a data structure containing the validated complex type seqnence data
*
* @throws CmsXmlException if the validation fails
*/
protected static CmsXmlComplexTypeSequence validateComplexTypeSequence(
Element element,
Set includes,
CmsXmlContentDefinition definition) throws CmsXmlException {
validateAttributesExists(element, new String[] {XSD_ATTRIBUTE_NAME}, new String[0]);
String name = validateAttribute(element, XSD_ATTRIBUTE_NAME, null);
// now check the type definition list
List mainElements = element.elements();
if ((mainElements.size() != 1) && (mainElements.size() != 2)) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_TS_SUBELEMENT_COUNT_2,
element.getUniquePath(),
new Integer(mainElements.size())));
}
boolean hasLanguageAttribute = false;
if (mainElements.size() == 2) {
// two elements in the master list: the second must be the "language" attribute definition
Element typeAttribute = (Element)mainElements.get(1);
if (!XSD_NODE_ATTRIBUTE.equals(typeAttribute.getQName())) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_CD_ELEMENT_NAME_3,
typeAttribute.getUniquePath(),
XSD_NODE_ATTRIBUTE.getQualifiedName(),
typeAttribute.getQName().getQualifiedName()));
}
validateAttribute(typeAttribute, XSD_ATTRIBUTE_NAME, XSD_ATTRIBUTE_VALUE_LANGUAGE);
validateAttribute(typeAttribute, XSD_ATTRIBUTE_TYPE, CmsXmlLocaleValue.TYPE_NAME);
try {
validateAttribute(typeAttribute, XSD_ATTRIBUTE_USE, XSD_ATTRIBUTE_VALUE_REQUIRED);
} catch (CmsXmlException e) {
validateAttribute(typeAttribute, XSD_ATTRIBUTE_USE, XSD_ATTRIBUTE_VALUE_OPTIONAL);
}
// no error: then the language attribute is valid
hasLanguageAttribute = true;
}
// check the main element type sequence
Element typeSequence = (Element)mainElements.get(0);
if (!XSD_NODE_SEQUENCE.equals(typeSequence.getQName())) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_CD_ELEMENT_NAME_3,
typeSequence.getUniquePath(),
XSD_NODE_SEQUENCE.getQualifiedName(),
typeSequence.getQName().getQualifiedName()));
}
// check the type definition sequence
List typeSequenceElements = typeSequence.elements();
if (typeSequenceElements.size() < 1) {
throw new CmsXmlException(Messages.get().container(
Messages.ERR_TS_SUBELEMENT_TOOFEW_3,
typeSequence.getUniquePath(),
new Integer(1),
new Integer(typeSequenceElements.size())));
}
// now add all type definitions from the schema
List sequence = new ArrayList();
if (hasLanguageAttribute) {
// only generate types for sequence node with language attribute
CmsXmlContentTypeManager typeManager = OpenCms.getXmlContentTypeManager();
Iterator i = typeSequenceElements.iterator();
while (i.hasNext()) {
sequence.add(typeManager.getContentType((Element)i.next(), includes));
}
} else {
// generate a nested content definition for the main type sequence
Element e = (Element)typeSequenceElements.get(0);
String typeName = validateAttribute(e, XSD_ATTRIBUTE_NAME, null);
String minOccurs = validateAttribute(e, XSD_ATTRIBUTE_MIN_OCCURS, XSD_ATTRIBUTE_VALUE_ZERO);
String maxOccurs = validateAttribute(e, XSD_ATTRIBUTE_MAX_OCCURS, XSD_ATTRIBUTE_VALUE_UNBOUNDED);
validateAttribute(e, XSD_ATTRIBUTE_TYPE, createTypeName(typeName));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -