schemacompiler.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,423 行 · 第 1/5 页
JAVA
1,423 行
if (o instanceof XmlSchemaInclude) {
XmlSchema schema1 = ((XmlSchemaInclude) o).getSchema();
if (schema1 != null) compile(schema1, isPartofGroup);
}
}
}
//select all the elements. We generate the code for types
//only if the elements refer them!!! regardless of the fact that
//we have a list of elementnames, we'll need to process all the elements
XmlSchemaObjectTable elements = schema.getElements();
Iterator xmlSchemaElement1Iterator = elements.getValues();
while (xmlSchemaElement1Iterator.hasNext()) {
//this is the set of outer elements so we need to generate classes
//The outermost elements do not contain occurence counts (!) so we do not need
//to check for arraytypes
processElement((XmlSchemaElement) xmlSchemaElement1Iterator.next(), schema);
}
Iterator xmlSchemaElement2Iterator = elements.getValues();
// re-iterate through the elements and write them one by one
// if the mode is unpack this process will not really write the
// classes but will accumilate the models for a final single shot
// write
while (xmlSchemaElement2Iterator.hasNext()) {
//this is the set of outer elements so we need to generate classes
writeElement((XmlSchemaElement) xmlSchemaElement2Iterator.next());
}
if (options.isGenerateAll()) {
Iterator xmlSchemaTypes2Iterator = schema.getSchemaTypes().getValues();
while (xmlSchemaTypes2Iterator.hasNext()) {
XmlSchemaType schemaType = (XmlSchemaType) xmlSchemaTypes2Iterator.next();
if (this.isAlreadyProcessed(schemaType.getQName())) {
continue;
}
if (schemaType instanceof XmlSchemaComplexType) {
//write classes for complex types
XmlSchemaComplexType complexType = (XmlSchemaComplexType) schemaType;
if (complexType.getName() != null) {
processNamedComplexSchemaType(complexType, schema);
}
} else if (schemaType instanceof XmlSchemaSimpleType) {
//process simple type
processSimpleSchemaType((XmlSchemaSimpleType) schemaType,
null,
schema, null);
}
}
}
if (!isPartofGroup) {
//complete the compilation
finalizeSchemaCompilation();
}
}
/**
* Completes the schema compilation process by writing the
* mappers and the classes in a batch if needed
*
* @throws SchemaCompilationException
*/
private void finalizeSchemaCompilation() throws SchemaCompilationException {
//write the extension mapping class
writer.writeExtensionMapper(
(BeanWriterMetaInfoHolder[])
processedTypeMetaInfoMap.values().toArray(
new BeanWriterMetaInfoHolder[processedTypeMetaInfoMap.size()]));
if (options.isWrapClasses()) {
writer.writeBatch();
}
// resets the changed types
XmlSchemaComplexType xmlSchemaComplexType = null;
for (Iterator iter = changedComplexTypeSet.iterator();iter.hasNext();){
xmlSchemaComplexType = (XmlSchemaComplexType) iter.next();
xmlSchemaComplexType.setName(null);
}
XmlSchemaSimpleType xmlSchemaSimpleType = null;
for (Iterator iter = changedSimpleTypeSet.iterator();iter.hasNext();){
xmlSchemaSimpleType = (XmlSchemaSimpleType) iter.next();
xmlSchemaSimpleType.setName(null);
}
XmlSchemaElement xmlSchemaElement = null;
for (Iterator iter = changedElementSet.iterator();iter.hasNext();){
xmlSchemaElement = (XmlSchemaElement) iter.next();
xmlSchemaElement.setSchemaTypeName(null);
}
}
/**
* @return the property map of the schemacompiler.
* In this case it would be the property map loaded from
* the configuration file
*/
public Properties getCompilerProperties() {
return SchemaPropertyLoader.getPropertyMap();
}
/**
* Writes the element
*
* @param xsElt
* @throws SchemaCompilationException
*/
private void writeElement(XmlSchemaElement xsElt) throws SchemaCompilationException {
if (this.processedElementMap.containsKey(xsElt.getQName())) {
return;
}
XmlSchemaType schemaType = xsElt.getSchemaType();
BeanWriterMetaInfoHolder metainf = new BeanWriterMetaInfoHolder();
if (schemaType != null && schemaType.getName() != null) {
//this is a named type
QName qName = schemaType.getQName();
//find the class name
String className = findClassName(qName, isArray(xsElt));
//this means the schema type actually returns a different QName
if (changedTypeMap.containsKey(qName)) {
metainf.registerMapping(xsElt.getQName(),
(QName) changedTypeMap.get(qName),
className);
} else {
metainf.registerMapping(xsElt.getQName(),
qName,
className);
}
if (isBinary(xsElt)) {
metainf.addtStatus(xsElt.getQName(),
SchemaConstants.BINARY_TYPE);
}
} else if (xsElt.getRefName() != null) {
// Since top level elements would not have references
// and we only write toplevel elements, this should
// not be a problem , atleast should not occur in a legal schema
} else if (xsElt.getSchemaTypeName() != null) {
QName qName = xsElt.getSchemaTypeName();
String className = findClassName(qName, isArray(xsElt));
metainf.registerMapping(xsElt.getQName(),
qName,
className);
} else if (schemaType != null) { //the named type should have been handled already
//we are going to special case the anonymous complex type. Our algorithm for dealing
//with it is to generate a single object that has the complex content inside. Really the
//intent of the user when he declares the complexType anonymously is to use it privately
//First copy the schema types content into the metainf holder
metainf = (BeanWriterMetaInfoHolder) this.processedAnonymousComplexTypesMap.get(xsElt);
metainf.setAnonymous(true);
} else {
//this means we did not find any schema type associated with the particular element.
log.warn(SchemaCompilerMessages.getMessage("schema.elementWithNoType", xsElt.getQName().toString()));
metainf.registerMapping(xsElt.getQName(),
null,
writer.getDefaultClassName(),
SchemaConstants.ANY_TYPE);
}
if (nillableElementList.contains(xsElt.getQName())) {
metainf.registerNillableQName(xsElt.getQName());
}
String writtenClassName = writer.write(xsElt, processedTypemap, metainf);
//register the class name
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY, writtenClassName);
processedElementMap.put(xsElt.getQName(), writtenClassName);
}
/**
* For inner elements
*
* @param xsElt
* @param innerElementMap
* @param parentSchema
* @throws SchemaCompilationException
*/
private void processElement(XmlSchemaElement xsElt, Map innerElementMap, List localNillableList, XmlSchema parentSchema) throws SchemaCompilationException {
processElement(xsElt, false, innerElementMap, localNillableList, parentSchema);
}
/**
* For outer elements
*
* @param xsElt
* @param parentSchema
* @throws SchemaCompilationException
*/
private void processElement(XmlSchemaElement xsElt, XmlSchema parentSchema) throws SchemaCompilationException {
processElement(xsElt, true, null, null, parentSchema);
}
/**
* Process and Element
*
* @param xsElt
* @param isOuter We need to know this since the treatment of outer elements is different that
* inner elements
* @throws SchemaCompilationException
*/
private void processElement(XmlSchemaElement xsElt, boolean isOuter, Map innerElementMap, List localNillableList, XmlSchema parentSchema) throws SchemaCompilationException {
//if the element is null, which usually happens when the qname is not
//proper, throw an exceptions
if (xsElt == null) {
throw new SchemaCompilationException(
SchemaCompilerMessages.getMessage("schema.elementNull"));
}
//The processing element logic seems to be quite simple. Look at the relevant schema type
//for each and every element and process that accordingly.
//this means that any unused type definitions would not be generated!
if (isOuter && processedElementList.contains(xsElt.getQName())) {
return;
}
XmlSchemaType schemaType = xsElt.getSchemaType();
if (schemaType != null) {
processSchema(xsElt, schemaType, parentSchema);
//at this time it is not wise to directly write the class for the element
//so we push the complete element to an arraylist and let the process
//pass through. We'll be iterating through the elements writing them
//later
if (!isOuter) {
if (schemaType.getName() != null) {
// this element already has a name. Which means we can directly
// register it
String className = findClassName(schemaType.getQName(),
isArray(xsElt));
innerElementMap.put(xsElt.getQName(), className);
// always store the class name in the element meta Info itself
// this details only needed by the unwrappig to set the complex type
schemaType.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY, className);
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY, className);
if (baseSchemaTypeMap.containsValue(className)) {
schemaType.addMetaInfo(
SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_PRIMITVE_KEY,
Boolean.TRUE);
}
//since this is a inner element we should add it to the inner element map
} else {
//this is an anon type. This should have been already processed and registered at
//the anon map. we've to write it just like we treat a referenced type(giving due
//care that this is meant to be an attribute in some class)
QName generatedTypeName = generateTypeQName(xsElt.getQName(), parentSchema);
if (schemaType instanceof XmlSchemaComplexType) {
//set a name
schemaType.setName(generatedTypeName.getLocalPart());
changedComplexTypeSet.add(schemaType);
// Must do this up front to support recursive types
String fullyQualifiedClassName = writer.makeFullyQualifiedClassName(schemaType.getQName());
processedTypemap.put(schemaType.getQName(), fullyQualifiedClassName);
BeanWriterMetaInfoHolder metaInfHolder = (BeanWriterMetaInfoHolder) processedAnonymousComplexTypesMap.get(xsElt);
metaInfHolder.setOwnQname(schemaType.getQName());
metaInfHolder.setOwnClassName(fullyQualifiedClassName);
writeComplexType((XmlSchemaComplexType) schemaType,
metaInfHolder);
//remove the reference from the anon list since we named the type
processedAnonymousComplexTypesMap.remove(xsElt);
String className = findClassName(schemaType.getQName(), isArray(xsElt));
innerElementMap.put(
xsElt.getQName(),
className);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?