📄 cmsxmlcontenttypemanager.java
字号:
public I_CmsXmlContentHandler getContentHandler(String className, String schemaLocation) throws CmsXmlException {
// create a unique key for the content deinition / class name combo
StringBuffer buffer = new StringBuffer(128);
buffer.append(schemaLocation);
buffer.append('#');
buffer.append(className);
String key = buffer.toString();
// look up the content handler from the cache
I_CmsXmlContentHandler contentHandler = (I_CmsXmlContentHandler)m_contentHandlers.get(key);
if (contentHandler != null) {
return contentHandler;
}
// generate an instance for the content handler
try {
contentHandler = (I_CmsXmlContentHandler)Class.forName(className).newInstance();
} catch (InstantiationException e) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CONTENT_HANDLER_1, key));
} catch (IllegalAccessException e) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CONTENT_HANDLER_1, key));
} catch (ClassCastException e) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CONTENT_HANDLER_1, key));
} catch (ClassNotFoundException e) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CONTENT_HANDLER_1, key));
}
// cache and return the content handler instance
m_contentHandlers.put(key, contentHandler);
return contentHandler;
}
/**
* Generates an initialized instance of a XML content type definition
* from the given XML schema element.<p>
*
* @param typeElement the element to generate the XML content type definition from
* @param nestedDefinitions the nested (included) XML content sub-definitions
*
* @return an initialized instance of a XML content type definition
* @throws CmsXmlException in case the element does not describe a valid XML content type definition
*/
public I_CmsXmlSchemaType getContentType(Element typeElement, Set nestedDefinitions) throws CmsXmlException {
if (!CmsXmlContentDefinition.XSD_NODE_ELEMENT.equals(typeElement.getQName())) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CD_SCHEMA_STRUCTURE_0));
}
if (typeElement.elements().size() > 0) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CD_SCHEMA_STRUCTURE_0));
}
int todo = 0;
// TODO: Use validation methods from CmsXmlContentDefinition here
String elementName = typeElement.attributeValue(CmsXmlContentDefinition.XSD_ATTRIBUTE_NAME);
String typeName = typeElement.attributeValue(CmsXmlContentDefinition.XSD_ATTRIBUTE_TYPE);
String defaultValue = typeElement.attributeValue(CmsXmlContentDefinition.XSD_ATTRIBUTE_DEFAULT);
String maxOccrs = typeElement.attributeValue(CmsXmlContentDefinition.XSD_ATTRIBUTE_MAX_OCCURS);
String minOccrs = typeElement.attributeValue(CmsXmlContentDefinition.XSD_ATTRIBUTE_MIN_OCCURS);
if (CmsStringUtil.isEmpty(elementName) || CmsStringUtil.isEmpty(typeName)) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_INVALID_CD_SCHEMA_STRUCTURE_0));
}
boolean simpleType = true;
I_CmsXmlSchemaType schemaType = (I_CmsXmlSchemaType)m_registeredTypes.get(typeName);
if (schemaType == null) {
// the name is not a simple type, try to resolve from the nested schemas
Iterator i = nestedDefinitions.iterator();
while (i.hasNext()) {
CmsXmlContentDefinition cd = (CmsXmlContentDefinition)i.next();
if (typeName.equals(cd.getTypeName())) {
simpleType = false;
return new CmsXmlNestedContentDefinition(cd, elementName, minOccrs, maxOccrs);
}
}
if (simpleType) {
throw new CmsXmlException(Messages.get().container(Messages.ERR_UNKNOWN_SCHEMA_1, typeName));
}
}
if (simpleType) {
schemaType = schemaType.newInstance(elementName, minOccrs, maxOccrs);
if (CmsStringUtil.isNotEmpty(defaultValue)) {
schemaType.setDefault(defaultValue);
}
}
return schemaType;
}
/**
* Returns the content type registered with the given name, or <code>null</code>.<p>
*
* @param typeName the name to look up the content type for
* @return the content type registered with the given name, or <code>null</code>
*/
public I_CmsXmlSchemaType getContentType(String typeName) {
return (I_CmsXmlSchemaType)m_registeredTypes.get(typeName);
}
/**
* Retruns an alphabetically sorted list of all configured XML content schema types.<p>
*
* @return an alphabetically sorted list of all configured XML content schema types
*/
public List getRegisteredSchemaTypes() {
List result = new ArrayList(m_registeredTypes.values());
Collections.sort(result);
return result;
}
/**
* Returns the alias for the given Widget class name, may be <code>null</code> if no alias is defined for
* the class.<p>
*
* @param className the name of the widget
* @return the alias for the given Widget class name, may be <code>null</code> if no alias is defined for
* the class
*/
public String getRegisteredWidgetAlias(String className) {
// this implementation could be improved for performance,
// but since it's very seldom used it's currently just a straight map iteration
Iterator i = m_widgetAliases.keySet().iterator();
while (i.hasNext()) {
String aliasName = (String)i.next();
String clazzName = (String)m_widgetAliases.get(aliasName);
if (clazzName.equals(className)) {
// the alias mapping was found
return aliasName;
}
}
return null;
}
/**
* Retruns an alphabetically sorted list of the class names of all configured XML widgets.<p>
*
* @return an alphabetically sorted list of the class names of all configured XML widgets
*/
public List getRegisteredWidgetNames() {
List result = new ArrayList(m_registeredWidgets.keySet());
Collections.sort(result);
return result;
}
/**
* Returns an initialized widget class by it's class name or by it's alias.<p>
*
* @param name the class name or alias name to get the widget for
* @return the widget instance for the class name
*/
public I_CmsWidget getWidget(String name) {
// first look up by class name
I_CmsWidget result = (I_CmsWidget)m_registeredWidgets.get(name);
if (result == null) {
// not found by class name, look up an alias
String className = (String)m_widgetAliases.get(name);
if (className != null) {
result = (I_CmsWidget)m_registeredWidgets.get(className);
}
}
if (result != null) {
result = result.newInstance();
}
return result;
}
/**
* Returns the editor widget for the specified XML content type.<p>
*
* @param typeName the name of the XML content type to get the widget for
* @return the editor widget for the specified XML content type
*/
public I_CmsWidget getWidgetDefault(String typeName) {
I_CmsWidget result = (I_CmsWidget)m_defaultWidgets.get(typeName);
if (result != null) {
result = result.newInstance();
}
return result;
}
/**
* Initializes XML content types managed in this XML content type manager.<p>
*
* @param cms an initialized OpenCms user context with "Administrator" role permissions
*
* @throws CmsRoleViolationException in case the provided OpenCms user context doea not have "Administrator" role permissions
*/
public synchronized void initialize(CmsObject cms) throws CmsRoleViolationException {
if (OpenCms.getRunLevel() > OpenCms.RUNLEVEL_1_CORE_OBJECT) {
// simple test cases don't require this check
cms.checkRole(CmsRole.ADMINISTRATOR);
}
// initilaize the special entity resolver
CmsXmlEntityResolver.initialize(cms, getSchemaBytes());
if (CmsLog.INIT.isInfoEnabled()) {
CmsLog.INIT.info(Messages.get().getBundle().key(
Messages.INIT_NUM_ST_INITIALIZED_1,
new Integer(m_registeredTypes.size())));
}
}
/**
* Returns a byte array to be used as input source for the configured XML content types.<p>
*
* @return a byte array to be used as input source for the configured XML content types
*/
private byte[] getSchemaBytes() {
StringBuffer schema = new StringBuffer(512);
schema.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
schema.append("<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" elementFormDefault=\"qualified\">");
Iterator i = m_registeredTypes.values().iterator();
while (i.hasNext()) {
I_CmsXmlSchemaType type = (I_CmsXmlSchemaType)i.next();
schema.append(type.getSchemaDefinition());
}
schema.append("</xsd:schema>");
String schemaStr = schema.toString();
try {
// pretty print the XML schema
// this helps in debugging the auto-generated schema includes
// since it makes them more human-readable
Document doc = CmsXmlUtils.unmarshalHelper(schemaStr, null);
schemaStr = CmsXmlUtils.marshal(doc, CmsEncoder.ENCODING_UTF_8);
} catch (CmsXmlException e) {
// should not ever happen
LOG.error(Messages.get().getBundle().key(Messages.LOG_PRETTY_PRINT_SCHEMA_BYTES_ERROR_0), e);
}
if (LOG.isInfoEnabled()) {
LOG.info(Messages.get().getBundle().key(
Messages.LOG_XML_TYPE_DEFINITION_XSD_2,
CmsXmlContentDefinition.XSD_INCLUDE_OPENCMS,
schemaStr));
}
try {
return schemaStr.getBytes(CmsEncoder.ENCODING_UTF_8);
} catch (UnsupportedEncodingException e) {
// should not happen since the default encoding of UTF-8 is always valid
LOG.error(Messages.get().getBundle().key(Messages.LOG_CONVERTING_SCHEMA_BYTES_ERROR_0), e);
}
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -