schemacompiler.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,423 行 · 第 1/5 页
JAVA
1,423 行
*
* @param schemaType
* @throws SchemaCompilationException
*/
private void processSchema(XmlSchemaElement xsElt, XmlSchemaType schemaType, XmlSchema parentSchema) throws SchemaCompilationException {
if (schemaType instanceof XmlSchemaComplexType) {
//write classes for complex types
XmlSchemaComplexType complexType = (XmlSchemaComplexType) schemaType;
if (complexType.getName() != null) {
processNamedComplexSchemaType(complexType, parentSchema);
} else {
processAnonymousComplexSchemaType(xsElt, complexType, parentSchema);
}
} else if (schemaType instanceof XmlSchemaSimpleType) {
//process simple type
processSimpleSchemaType((XmlSchemaSimpleType) schemaType,
xsElt,
parentSchema, null);
}
}
/**
* @param complexType
* @throws SchemaCompilationException
*/
private void processAnonymousComplexSchemaType(XmlSchemaElement elt,
XmlSchemaComplexType complexType,
XmlSchema parentSchema)
throws SchemaCompilationException {
BeanWriterMetaInfoHolder metaInfHolder = processComplexType(elt.getQName(),complexType, parentSchema);
//since this is a special case (an unnamed complex type) we'll put the already processed
//metainf holder in a special map to be used later
this.processedAnonymousComplexTypesMap.put(elt, metaInfHolder);
}
/**
* handle the complex types which are named
*
* @param complexType
*/
private void processNamedComplexSchemaType(XmlSchemaComplexType complexType,
XmlSchema parentSchema) throws SchemaCompilationException {
if (processedTypemap.containsKey(complexType.getQName())
|| baseSchemaTypeMap.containsKey(complexType.getQName())) {
return;
}
// Must do this up front to support recursive types
String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(complexType.getQName());
processedTypemap.put(complexType.getQName(), fullyQualifiedClassName);
//register that in the schema metainfo bag
complexType.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
fullyQualifiedClassName);
BeanWriterMetaInfoHolder metaInfHolder = processComplexType(complexType.getQName(),complexType, parentSchema);
//add this information to the metainfo holder
metaInfHolder.setOwnQname(complexType.getQName());
metaInfHolder.setOwnClassName(fullyQualifiedClassName);
//write the class. This type mapping would have been populated right now
//Note - We always write classes for named complex types
writeComplexType(complexType, metaInfHolder);
}
/**
* Writes a complex type
*
* @param complexType
* @param metaInfHolder
* @throws SchemaCompilationException
*/
private String writeComplexType(XmlSchemaComplexType complexType, BeanWriterMetaInfoHolder metaInfHolder)
throws SchemaCompilationException {
String javaClassName = writer.write(complexType.getQName(), processedTypemap, metaInfHolder, complexType.isAbstract());
processedTypeMetaInfoMap.put(complexType.getQName(), metaInfHolder);
return javaClassName;
}
/**
* Writes complex Sequence,Choice, all elements
* @param qname complex type qname
* @param metaInfHolder
* @return written java class name
* @throws SchemaCompilationException
*/
private String writeComplexParticle(QName qname,BeanWriterMetaInfoHolder metaInfHolder)
throws SchemaCompilationException {
String javaClassName = writer.write(qname, processedTypemap, metaInfHolder,false);
processedTypeMetaInfoMap.put(qname, metaInfHolder);
return javaClassName;
}
/**
* Writes a complex type
*
* @param simpleType
* @param metaInfHolder
* @throws SchemaCompilationException
*/
private void writeSimpleType(XmlSchemaSimpleType simpleType, BeanWriterMetaInfoHolder metaInfHolder)
throws SchemaCompilationException {
writer.write(simpleType, processedTypemap, metaInfHolder);
processedTypeMetaInfoMap.put(simpleType.getQName(), metaInfHolder);
}
private BeanWriterMetaInfoHolder processComplexType(
QName parentElementQName,
XmlSchemaComplexType complexType,
XmlSchema parentSchema) throws SchemaCompilationException {
XmlSchemaParticle particle = complexType.getParticle();
BeanWriterMetaInfoHolder metaInfHolder = new BeanWriterMetaInfoHolder();
if (particle != null) {
//Process the particle
processParticle(parentElementQName, particle, metaInfHolder, parentSchema);
}
//process attributes - first look for the explicit attributes
processAttributes(complexType.getAttributes(),metaInfHolder,parentSchema);
//process any attribute
//somehow the xml schema parser does not seem to pickup the any attribute!!
XmlSchemaAnyAttribute anyAtt = complexType.getAnyAttribute();
if (anyAtt != null) {
processAnyAttribute(metaInfHolder, anyAtt);
}
//process content ,either complex or simple
if (complexType.getContentModel() != null) {
processContentModel(complexType.getContentModel(),
metaInfHolder,
parentSchema);
}
return metaInfHolder;
}
private void processAttributes(XmlSchemaObjectCollection attributes,
BeanWriterMetaInfoHolder metaInfHolder,
XmlSchema parentSchema) throws SchemaCompilationException {
Iterator attribIterator = attributes.getIterator();
while (attribIterator.hasNext()) {
Object o = attribIterator.next();
if (o instanceof XmlSchemaAttribute) {
processAttribute((XmlSchemaAttribute) o, metaInfHolder, parentSchema);
} else if (o instanceof XmlSchemaAttributeGroupRef){
processAttributeGroupReference((XmlSchemaAttributeGroupRef)o,metaInfHolder,parentSchema);
}
}
}
private void processAttributeGroupReference(XmlSchemaAttributeGroupRef attributeGroupRef,
BeanWriterMetaInfoHolder metaInfHolder,
XmlSchema parentSchema) throws SchemaCompilationException {
QName attributeGroupRefName = attributeGroupRef.getRefName();
if (attributeGroupRefName != null){
parentSchema = resolveParentSchema(attributeGroupRefName,parentSchema);
XmlSchemaAttributeGroup xmlSchemaAttributeGroup = getXmlSchemaAttributeGroup(attributeGroupRefName,
parentSchema);
if (xmlSchemaAttributeGroup != null){
processAttributes(xmlSchemaAttributeGroup.getAttributes(),metaInfHolder,parentSchema);
} else {
throw new SchemaCompilationException("Can not find an attribute group for group reference "
+ attributeGroupRefName.getLocalPart());
}
} else {
throw new SchemaCompilationException("No group refernce has given");
}
}
private XmlSchemaAttributeGroup getXmlSchemaAttributeGroup(QName attributeGroupQName,
XmlSchema parentSchema){
XmlSchemaAttributeGroup xmlSchemaAttributeGroup =
(XmlSchemaAttributeGroup) parentSchema.getAttributeGroups().getItem(attributeGroupQName);
if (xmlSchemaAttributeGroup == null){
// i.e this attribute can be in a included or imported schema
xmlSchemaAttributeGroup = (XmlSchemaAttributeGroup) parentSchema.getAttributeGroups().getItem(attributeGroupQName);
if (xmlSchemaAttributeGroup == null) {
// try to find in an import or an include
XmlSchemaObjectCollection includes = parentSchema.getIncludes();
if (includes != null) {
Iterator includesIter = includes.getIterator();
Object object = null;
while (includesIter.hasNext()) {
object = includesIter.next();
if (object instanceof XmlSchemaImport) {
XmlSchema schema1 = ((XmlSchemaImport) object).getSchema();
xmlSchemaAttributeGroup = (XmlSchemaAttributeGroup) schema1.getAttributeGroups().getItem(attributeGroupQName);
}
if (object instanceof XmlSchemaInclude) {
XmlSchema schema1 = ((XmlSchemaInclude) object).getSchema();
xmlSchemaAttributeGroup = (XmlSchemaAttributeGroup) schema1.getAttributeGroups().getItem(attributeGroupQName);
}
if (xmlSchemaAttributeGroup != null){
break;
}
}
}
}
}
return xmlSchemaAttributeGroup;
}
/**
* Process the content models. A content model is either simple type or a complex type
* and included inside a complex content
*/
private void processContentModel(XmlSchemaContentModel content,
BeanWriterMetaInfoHolder metaInfHolder,
XmlSchema parentSchema)
throws SchemaCompilationException {
if (content instanceof XmlSchemaComplexContent) {
processComplexContent((XmlSchemaComplexContent) content, metaInfHolder, parentSchema);
} else if (content instanceof XmlSchemaSimpleContent) {
processSimpleContent((XmlSchemaSimpleContent) content, metaInfHolder, parentSchema);
}
}
/**
* Prcess the complex content
*/
private void processComplexContent(XmlSchemaComplexContent complexContent,
BeanWriterMetaInfoHolder metaInfHolder,
XmlSchema parentSchema)
throws SchemaCompilationException {
XmlSchemaContent content = complexContent.getContent();
if (content instanceof XmlSchemaComplexContentExtension) {
// to handle extension we need to attach the extended items to the base type
// and create a new type
XmlSchemaComplexContentExtension extension = (XmlSchemaComplexContentExtension)
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);
}
}
// before actually processing this node, we need to recurse through the base types and add their
// children (sometimes even preserving the order) to the metainfo holder of this type
// the reason is that for extensions, the prefered way is to have the sequences of the base class
//* before * the sequence of the child element.
copyMetaInfoHierarchy(metaInfHolder, extension.getBaseTypeName(), parentSchema);
//process the particle of this node
if (extension.getParticle() != null) {
processParticle(extension.getBaseTypeName(),extension.getParticle(), metaInfHolder, parentSchema);
}
// process attributes
//process attributes - first look for the explicit attributes
XmlSchemaObjectCollection attribs = extension.getAttributes();
Iterator attribIterator = attribs.getIterator();
while (attribIterator.hasNext()) {
Object o = attribIterator.next();
if (o instanceof XmlSchemaAttribute) {
processAttribute((XmlSchemaAttribute) o, metaInfHolder, parentSchema);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?