in axis-rt-core/src/main/java/org/apache/axis/encoding/ser/BeanSerializer.java [302:451]
public Element writeSchema(Class javaType, Types types) throws Exception {
// ComplexType representation of bean class
Element complexType = types.createElement("complexType");
// See if there is a super class, stop if we hit a stop class
Element e = null;
Class superClass = javaType.getSuperclass();
BeanPropertyDescriptor[] superPd = null;
List stopClasses = types.getStopClasses();
if (superClass != null &&
superClass != java.lang.Object.class &&
superClass != java.lang.Exception.class &&
superClass != java.lang.Throwable.class &&
superClass != java.lang.RuntimeException.class &&
superClass != java.rmi.RemoteException.class &&
superClass != org.apache.axis.AxisFault.class &&
(stopClasses == null ||
!(stopClasses.contains(superClass.getName()))) ) {
// Write out the super class
String base = types.writeType(superClass);
Element complexContent = types.createElement("complexContent");
complexType.appendChild(complexContent);
Element extension = types.createElement("extension");
complexContent.appendChild(extension);
extension.setAttribute("base", base);
e = extension;
// Get the property descriptors for the super class
TypeDesc superTypeDesc = TypeDesc.getTypeDescForClass(superClass);
if (superTypeDesc != null) {
superPd = superTypeDesc.getPropertyDescriptors();
} else {
superPd = BeanUtils.getPd(superClass, null);
}
} else {
e = complexType;
}
// Add fields under sequence element.
// Note: In most situations it would be okay
// to put the fields under an all element.
// However it is illegal schema to put an
// element with minOccurs=0 or maxOccurs>1 underneath
// an all element. This is the reason why a sequence
// element is used.
Element all = types.createElement("sequence");
e.appendChild(all);
if (Modifier.isAbstract(javaType.getModifiers())) {
complexType.setAttribute("abstract", "true");
}
// Serialize each property
for (int i=0; i<propertyDescriptor.length; i++) {
String propName = propertyDescriptor[i].getName();
// Don't serializer properties named class
boolean writeProperty = true;
if (propName.equals("class")) {
writeProperty = false;
}
// Don't serialize the property if it is present
// in the super class property list
if (superPd != null && writeProperty) {
for (int j=0; j<superPd.length && writeProperty; j++) {
if (propName.equals(superPd[j].getName())) {
writeProperty = false;
}
}
}
if (!writeProperty) {
continue;
}
// If we have type metadata, check to see what we're doing
// with this field. If it's an attribute, skip it. If it's
// an element, use whatever qname is in there. If we can't
// find any of this info, use the default.
if (typeDesc != null) {
Class fieldType = propertyDescriptor[i].getType();
FieldDesc field = typeDesc.getFieldByName(propName);
if (field != null) {
QName qname = field.getXmlName();
QName fieldXmlType = field.getXmlType();
boolean isAnonymous = fieldXmlType != null && fieldXmlType.getLocalPart().startsWith(">");
if (qname != null) {
// FIXME!
// Check to see if this is in the right namespace -
// if it's not, we need to use an <element ref="">
// to represent it!!!
// Use the default...
propName = qname.getLocalPart();
}
if (!field.isElement()) {
writeAttribute(types,
propName,
fieldType,
fieldXmlType,
complexType);
} else {
writeField(types,
propName,
fieldXmlType,
fieldType,
propertyDescriptor[i].isIndexed(),
field.isMinOccursZero(),
all, isAnonymous,
((ElementDesc)field).getItemQName());
}
} else {
writeField(types,
propName,
null,
fieldType,
propertyDescriptor[i].isIndexed(), false, all, false, null);
}
} else {
boolean done = false;
if (propertyDescriptor[i] instanceof FieldPropertyDescriptor){
FieldPropertyDescriptor fpd = (FieldPropertyDescriptor) propertyDescriptor[i];
Class clazz = fpd.getField().getType();
if(types.getTypeQName(clazz)!=null) {
writeField(types,
propName,
null,
clazz,
false, false, all, false, null);
done = true;
}
}
if(!done) {
writeField(types,
propName,
null,
propertyDescriptor[i].getType(),
propertyDescriptor[i].isIndexed(), false, all, false, null);
}
}
}
// done
return complexType;
}