schemacompiler.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,423 行 · 第 1/5 页
JAVA
1,423 行
//process any attribute
//somehow the xml schema parser does not seem to pickup the any attribute!!
XmlSchemaAnyAttribute anyAtt = extension.getAnyAttribute();
if (anyAtt != null) {
processAnyAttribute(metaInfHolder, anyAtt);
}
String className = findClassName(extension.getBaseTypeName(), false);
if (!writer.getDefaultClassName().equals(className)) {
//the particle has been processed, However since this is an extension we need to
//add the basetype as an extension to the complex type class.
// The basetype has been processed already
metaInfHolder.setExtension(true);
metaInfHolder.setExtensionClassName(className);
//Note - this is no array! so the array boolean is false
}
} else if (content instanceof XmlSchemaComplexContentRestriction) {
XmlSchemaComplexContentRestriction restriction = (XmlSchemaComplexContentRestriction) content;
//process the base type if it has not been processed yet
if (!isAlreadyProcessed(restriction.getBaseTypeName())) {
//pick the relevant basetype from the schema and process it
XmlSchemaType type = getType(parentSchema, restriction.getBaseTypeName());
if (type instanceof XmlSchemaComplexType) {
XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
if (complexType.getName() != null) {
processNamedComplexSchemaType(complexType, parentSchema);
} else {
//this is not possible. The restriction should always
//have a name
throw new SchemaCompilationException("Unnamed complex type used in restriction");//Internationlize this
}
} else if (type instanceof XmlSchemaSimpleType) {
throw new SchemaCompilationException("Not a valid restriction, complex content restriction base type cannot be a simple type.");
}
}
copyMetaInfoHierarchy(metaInfHolder, restriction.getBaseTypeName(), parentSchema);
//process the particle of this node
processParticle(restriction.getBaseTypeName(),restriction.getParticle(), metaInfHolder, parentSchema);
//process attributes - first look for the explicit attributes
XmlSchemaObjectCollection attribs = restriction.getAttributes();
Iterator attribIterator = attribs.getIterator();
while (attribIterator.hasNext()) {
Object o = attribIterator.next();
if (o instanceof XmlSchemaAttribute) {
processAttribute((XmlSchemaAttribute) o, metaInfHolder, parentSchema);
}
}
//process any attribute
//somehow the xml schema parser does not seem to pickup the any attribute!!
XmlSchemaAnyAttribute anyAtt = restriction.getAnyAttribute();
if (anyAtt != null) {
processAnyAttribute(metaInfHolder, anyAtt);
}
String className = findClassName(restriction.getBaseTypeName(), false);
if (!writer.getDefaultClassName().equals(className)) {
metaInfHolder.setRestriction(true);
metaInfHolder.setRestrictionClassName(findClassName(restriction.getBaseTypeName(), false));
//Note - this is no array! so the array boolean is false
}
}
}
/**
* Recursive method to populate the metainfo holders with info from the base types
*
* @param metaInfHolder
* @param baseTypeName
* @param parentSchema
*/
private void copyMetaInfoHierarchy(BeanWriterMetaInfoHolder metaInfHolder,
QName baseTypeName,
XmlSchema parentSchema)
throws SchemaCompilationException {
XmlSchemaType type;
type = parentSchema.getTypeByName(baseTypeName);
if (type == null) {
type = getType(parentSchema, baseTypeName);
}
BeanWriterMetaInfoHolder baseMetaInfoHolder = (BeanWriterMetaInfoHolder)
processedTypeMetaInfoMap.get(baseTypeName);
if (baseMetaInfoHolder != null) {
// see whether this type is also extended from some other type first
// if so proceed to set their parents as well.
if (type instanceof XmlSchemaComplexType) {
XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
if (complexType.getContentModel() != null) {
XmlSchemaContentModel content = complexType.getContentModel();
if (content instanceof XmlSchemaComplexContent) {
XmlSchemaComplexContent complexContent =
(XmlSchemaComplexContent) content;
if (complexContent.getContent() instanceof XmlSchemaComplexContentExtension) {
XmlSchemaComplexContentExtension extension =
(XmlSchemaComplexContentExtension) complexContent.getContent();
//recursively call the copyMetaInfoHierarchy method
copyMetaInfoHierarchy(baseMetaInfoHolder,
extension.getBaseTypeName(),
parentSchema);
} else if (complexContent.getContent() instanceof XmlSchemaComplexContentRestriction) {
XmlSchemaComplexContentRestriction restriction =
(XmlSchemaComplexContentRestriction) complexContent.getContent();
//recursively call the copyMetaInfoHierarchy method
copyMetaInfoHierarchy(baseMetaInfoHolder,
restriction.getBaseTypeName(),
parentSchema);
} else {
throw new SchemaCompilationException(
SchemaCompilerMessages.getMessage("schema.unknowncontenterror"));
}
} else if (content instanceof XmlSchemaSimpleContent) {
throw new SchemaCompilationException(
SchemaCompilerMessages.getMessage("schema.unsupportedcontenterror", "Simple Content"));
} else {
throw new SchemaCompilationException(
SchemaCompilerMessages.getMessage("schema.unknowncontenterror"));
}
}
//Do the actual parent setting
metaInfHolder.setAsParent(baseMetaInfoHolder);
} else if (type instanceof XmlSchemaSimpleType) {
// we have to copy the uion data if the parent simple type restriction
// is an union
// this union attribute is copied from the child to parent to genrate the parent
// code as union
if (baseMetaInfoHolder.isUnion()) {
metaInfHolder.setUnion(true);
Map memberTypes = baseMetaInfoHolder.getMemberTypes();
Object qname;
for (Iterator iter = memberTypes.keySet().iterator(); iter.hasNext();) {
qname = iter.next();
metaInfHolder.addMemberType((QName) qname, (String) memberTypes.get(qname));
}
}
// we have to copy the list type data to parent if it is a list
if (baseMetaInfoHolder.isList()) {
metaInfHolder.setList(true);
metaInfHolder.setItemTypeQName(baseMetaInfoHolder.getItemTypeQName());
metaInfHolder.setItemTypeClassName(baseMetaInfoHolder.getItemTypeClassName());
}
metaInfHolder.setAsParent(baseMetaInfoHolder);
}
}
}
/**
* @param simpleContent
* @param metaInfHolder
* @throws SchemaCompilationException
*/
private void processSimpleContent(XmlSchemaSimpleContent simpleContent, BeanWriterMetaInfoHolder metaInfHolder, XmlSchema parentSchema)
throws SchemaCompilationException {
XmlSchemaContent content;
content = simpleContent.getContent();
if (content instanceof XmlSchemaSimpleContentExtension) {
XmlSchemaSimpleContentExtension extension = (XmlSchemaSimpleContentExtension) content;
//process the base type if it has not been processed yet
if (!isAlreadyProcessed(extension.getBaseTypeName())) {
//pick the relevant basetype from the schema and process it
XmlSchemaType type = getType(parentSchema, extension.getBaseTypeName());
if (type instanceof XmlSchemaComplexType) {
XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
if (complexType.getName() != null) {
processNamedComplexSchemaType(complexType, parentSchema);
} else {
//this is not possible. The extension should always
//have a name
throw new SchemaCompilationException("Unnamed complex type used in extension");//Internationlize this
}
} else if (type instanceof XmlSchemaSimpleType) {
//process simple type
processSimpleSchemaType((XmlSchemaSimpleType) type, null, parentSchema, null);
}
}
//process extension base type
processSimpleExtensionBaseType(extension.getBaseTypeName(), metaInfHolder, parentSchema);
//process attributes
XmlSchemaObjectCollection attribs = extension.getAttributes();
Iterator attribIterator = attribs.getIterator();
while (attribIterator.hasNext()) {
Object attr = attribIterator.next();
if (attr instanceof XmlSchemaAttribute) {
processAttribute((XmlSchemaAttribute) attr, metaInfHolder, parentSchema);
}
}
//process any attribute
XmlSchemaAnyAttribute anyAtt = extension.getAnyAttribute();
if (anyAtt != null) {
processAnyAttribute(metaInfHolder, anyAtt);
}
} else if (content instanceof XmlSchemaSimpleContentRestriction) {
XmlSchemaSimpleContentRestriction restriction = (XmlSchemaSimpleContentRestriction) content;
//process the base type if it has not been processed yet
if (!isAlreadyProcessed(restriction.getBaseTypeName())) {
//pick the relevant basetype from the schema and process it
XmlSchemaType type = getType(parentSchema, restriction.getBaseTypeName());
if (type instanceof XmlSchemaComplexType) {
XmlSchemaComplexType complexType = (XmlSchemaComplexType) type;
if (complexType.getName() != null) {
processNamedComplexSchemaType(complexType, parentSchema);
} else {
//this is not possible. The extension should always
//have a name
throw new SchemaCompilationException("Unnamed complex type used in restriction");//Internationlize this
}
} else if (type instanceof XmlSchemaSimpleType) {
//process simple type
processSimpleSchemaType((XmlSchemaSimpleType) type, null, parentSchema, null);
}
}
//process restriction base type
processSimpleRestrictionBaseType(restriction.getBaseTypeName(),
restriction.getBaseTypeName(),
metaInfHolder,
parentSchema);
metaInfHolder.setSimple(true);
}
}
/**
* Process Simple Extension Base Type.
*
* @param extBaseType
* @param metaInfHolder
*/
public void processSimpleExtensionBaseType(QName extBaseType,
BeanWriterMetaInfoHolder metaInfHolder,
XmlSchema parentSchema) throws SchemaCompilationException {
//find the class name
String className = findClassName(extBaseType, false);
// if the base type is an primitive then we do not have to extend them
// and it is considered as a property
// on the otherhand if the base type is an generated class then we have to
// extend from it
if (baseSchemaTypeMap.containsKey(extBaseType)) {
//this means the schema type actually returns a different QName
if (changedTypeMap.containsKey(extBaseType)) {
metaInfHolder.registerMapping(extBaseType,
(QName) changedTypeMap.get(extBaseType),
className, SchemaConstants.ELEMENT_TYPE);
} else {
metaInfHolder.registerMapping(extBaseType,
extBaseType,
className, SchemaConstants.ELEMENT_TYPE);
}
metaInfHolder.setSimple(true);
// we have already process when it comes to this place
} else if (processedTypemap.containsKey(extBaseType)) {
//set the extension base class name
XmlSchemaType type = getType(parentSchema, extBaseType);
if (type instanceof XmlSchemaSimpleType) {
meta
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?