in modules/adb-codegen/src/org/apache/axis2/schema/SchemaCompiler.java [584:861]
private void processElement(XmlSchemaElement xsElt, boolean isOuter,
Map<QName, String> innerElementMap, List<QName> 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, false);
//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.getWireName(), className);
// always store the class name in the element meta Info itself
// this details only needed by the unwrappig to set the complex type
if (options.isUseWrapperClasses() && PrimitiveTypeFinder.isPrimitive(className)) {
className = PrimitiveTypeWrapper.getWrapper(className);
}
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.getWireName(), parentSchema);
if (schemaType instanceof XmlSchemaComplexType) {
//set a name
schemaType.setName(generatedTypeName.getLocalPart());
changedComplexTypeSet.add((XmlSchemaComplexType) schemaType);
// Must do this up front to support recursive types
String fullyQualifiedClassName = writer.
makeFullyQualifiedClassName(schemaType.getQName());
processedTypemap.put(schemaType.getQName(), fullyQualifiedClassName);
BeanWriterMetaInfoHolder metaInfHolder =
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.getWireName(),
className);
//store in the schema map to retrive in the unwrapping
xsElt.addMetaInfo(
SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
className);
} else if (schemaType instanceof XmlSchemaSimpleType) {
//set a name
schemaType.setName(generatedTypeName.getLocalPart());
changedSimpleTypeSet.add((XmlSchemaSimpleType) schemaType);
// Must do this up front to support recursive types
String fullyQualifiedClassName = writer.
makeFullyQualifiedClassName(schemaType.getQName());
processedTypemap.put(schemaType.getQName(), fullyQualifiedClassName);
BeanWriterMetaInfoHolder metaInfHolder =
processedAnonymousComplexTypesMap.get(xsElt);
metaInfHolder.setOwnQname(schemaType.getQName());
metaInfHolder.setOwnClassName(fullyQualifiedClassName);
writeSimpleType((XmlSchemaSimpleType) 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.getWireName(),
className);
//store in the schema map
xsElt.addMetaInfo(
SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
className);
}
}
} else {
// set the binary status of this element
this.processedElementList.add(xsElt.getQName());
}
//referenced name
} else if (xsElt.getRef().getTargetQName() != null) {
if (xsElt.getRef().getTargetQName().equals(SchemaConstants.XSD_SCHEMA)) {
innerElementMap.put(xsElt.getQName(), writer.getDefaultClassName());
return;
}
//process the referenced type. It could be thought that the referenced element replaces this
//element
XmlSchema resolvedSchema = getParentSchema(parentSchema,
xsElt.getRef().getTargetQName(),
COMPONENT_ELEMENT);
if (resolvedSchema == null) {
throw new SchemaCompilationException("can not find the element " +
xsElt.getRef().getTargetQName()
+ " from the parent schema " +
parentSchema.getTargetNamespace());
}
XmlSchemaElement referencedElement = resolvedSchema.
getElementByName(xsElt.getRef().getTargetQName());
if (referencedElement == null) {
throw new SchemaCompilationException(
SchemaCompilerMessages.
getMessage("schema.referencedElementNotFound",
xsElt.getRef().getTargetQName().toString()));
}
// here what we want is to set the schema type name for the element
if ((referencedElement.getSchemaType() != null)
&& (referencedElement.getSchemaType().getQName() != null)) {
// i.e this element refers to an complex type name
if (!this.processedElementRefMap.containsKey(referencedElement.getQName())) {
if (this.baseSchemaTypeMap.containsKey(referencedElement.getSchemaTypeName())) {
this.processedElementRefMap.put(referencedElement.getQName(),
this.baseSchemaTypeMap.
get(referencedElement.
getSchemaTypeName()));
} else {
XmlSchema resolvedTypeSchema = getParentSchema(resolvedSchema,
referencedElement.
getSchemaTypeName(),
COMPONENT_TYPE);
XmlSchemaType xmlSchemaType = resolvedTypeSchema.getTypeByName(
referencedElement.getSchemaTypeName().getLocalPart());
processSchema(referencedElement, xmlSchemaType, resolvedTypeSchema, true);
this.processedElementRefMap.put(referencedElement.getQName(),
this.processedTypemap.
get(referencedElement.
getSchemaTypeName()));
}
}
String javaClassName;
if (this.baseSchemaTypeMap.containsKey(referencedElement.getSchemaTypeName())) {
// here we have to do nothing since we do not generate a name
} else {
javaClassName = this.processedTypemap.get(referencedElement.getSchemaTypeName());
referencedElement.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.
CLASSNAME_KEY,
javaClassName);
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
javaClassName);
}
} else if (referencedElement.getSchemaType() != null) {
if (!this.processedElementRefMap.containsKey(referencedElement.getQName())) {
processSchema(referencedElement, referencedElement.getSchemaType(),
resolvedSchema, true);
// if this is an anonomous complex type we have to set this
this.processedElementRefMap.put(referencedElement.getQName(),
this.processedTypemap.get(referencedElement.
getSchemaTypeName()));
}
String javaClassName = this.processedTypemap.
get(referencedElement.getSchemaTypeName());
referencedElement.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
javaClassName);
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
javaClassName);
} else if (referencedElement.getSchemaTypeName() != null) {
QName schemaTypeName = referencedElement.getSchemaTypeName();
XmlSchema newResolvedSchema = getParentSchema(resolvedSchema, schemaTypeName,
COMPONENT_TYPE);
XmlSchemaType xmlSchemaType = newResolvedSchema.getTypeByName(schemaTypeName);
if (xmlSchemaType != null) {
if (!this.processedElementRefMap.containsKey(referencedElement.getQName())) {
// we know this is a named complex type
processSchema(referencedElement, xmlSchemaType, newResolvedSchema, false);
// if this is an anonomous complex type we have to set this
this.processedElementRefMap.put(referencedElement.getQName(),
this.processedTypemap.get(schemaTypeName));
}
String javaClassName = this.processedTypemap.get(referencedElement.
getSchemaTypeName());
referencedElement.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.
CLASSNAME_KEY,
javaClassName);
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
javaClassName);
} else {
throw new SchemaCompilationException(" Can not find the schema type with name " +
schemaTypeName);
}
}
// schema type name is present but not the schema type object
} else if (xsElt.getSchemaTypeName() != null) {
//There can be instances where the SchemaType is null but the schemaTypeName is not!
//this specifically happens with xsd:anyType.
QName schemaTypeName = xsElt.getSchemaTypeName();
XmlSchema resolvedSchema = getParentSchema(parentSchema, schemaTypeName, COMPONENT_TYPE);
XmlSchemaType typeByName = null;
if (resolvedSchema != null) {
typeByName = resolvedSchema.getTypeByName(schemaTypeName);
}
if (typeByName != null) {
//this type is found in the schema so we can process it
processSchema(xsElt, typeByName, resolvedSchema, false);
if (!isOuter) {
String className = findClassName(schemaTypeName, isArray(xsElt));
//since this is a inner element we should add it to the inner element map
innerElementMap.put(xsElt.getWireName(), className);
// set the class name to be used in unwrapping
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
className);
} else {
this.processedElementList.add(xsElt.getQName());
}
} else {
//this type is not found at all. we'll just register it with whatever the class name we can comeup with
if (!isOuter) {
String className = findClassName(schemaTypeName, isArray(xsElt));
innerElementMap.put(xsElt.getWireName(), className);
// set the class name to be used in unwrapping
xsElt.addMetaInfo(SchemaConstants.SchemaCompilerInfoHolder.CLASSNAME_KEY,
className);
} else {
this.processedElementList.add(xsElt.getQName());
}
}
}
//add this elements QName to the nillable group if it has the nillable attribute
if (xsElt.isNillable()) {
if (isOuter) {
this.nillableElementList.add(xsElt.getQName());
} else {
localNillableList.add(xsElt.getWireName());
}
}
}