QName[] qName;
String javaClassNameForElement;
ArrayList missingQNames = new ArrayList();
ArrayList qNames = new ArrayList();
BeanWriterMetaInfoHolder parentMetaInf = metainf.getParent();
if (metainf.isOrdered()) {
qName = metainf.getOrderedQNameArray();
} else {
qName = metainf.getQNameArray();
}
for (int i = 0; i < qName.length; i++) {
qNames.add(qName[i]);
}
//adding missing QNames to the end, including elements & attributes.
// for the simple types we have already add the parent elements
// it is almost consider as an extension
if (metainf.isRestriction() && !metainf.isSimple()) {
addMissingQNames(metainf, qNames, missingQNames);
}
QName name;
for (int i = 0; i < qNames.size(); i++) {
name = (QName) qNames.get(i);
Element property = XSLTUtils.addChildElement(model, "property", rootElt);
String xmlName = name.getLocalPart();
XSLTUtils.addAttribute(model, "name", xmlName, property);
XSLTUtils.addAttribute(model, "nsuri", name.getNamespaceURI(), property);
String javaName;
if (metainf.isJavaNameMappingAvailable(xmlName)) {
javaName = metainf.getJavaName(xmlName);
} else {
javaName = makeUniqueJavaClassName(propertyNames, xmlName);
// in a restriction if this element already there and array status have changed
// then we have to generate a new name for this
if (parentMetaInf != null && metainf.isRestriction() && !missingQNames.contains(name) &&
(parentMetaInf.getArrayStatusForQName(name) && !metainf.getArrayStatusForQName(name))) {
javaName = makeUniqueJavaClassName(propertyNames, xmlName);
}
metainf.addXmlNameJavaNameMapping(xmlName,javaName);
}
XSLTUtils.addAttribute(model, "javaname", javaName, property);
if (parentMetaInf != null && metainf.isRestriction() && missingQNames.contains(name)) {
javaClassNameForElement = parentMetaInf.getClassNameForQName(name);
} else {
javaClassNameForElement = metainf.getClassNameForQName(name);
}
if (javaClassNameForElement == null) {
javaClassNameForElement = getDefaultClassName();
log.warn(SchemaCompilerMessages
.getMessage("schema.typeMissing", name.toString()));
}
if (metainf.isRestriction() && typeChanged(name, missingQNames, metainf)) {
XSLTUtils.addAttribute(model, "typeChanged", "yes", property);
//XSLTUtils.addAttribute(model, "restricted", "yes", property);
}
long minOccurs = metainf.getMinOccurs(name);
if (PrimitiveTypeFinder.isPrimitive(javaClassNameForElement)
&& isUseWrapperClasses && ((minOccurs == 0) || metainf.isNillable(name))) {
// if this is an primitive class and user wants to use the
// wrapper type we change the type to wrapper type.
javaClassNameForElement = PrimitiveTypeWrapper.getWrapper(javaClassNameForElement);
}
XSLTUtils.addAttribute(model, "type", javaClassNameForElement, property);
if (PrimitiveTypeFinder.isPrimitive(javaClassNameForElement)) {
XSLTUtils.addAttribute(model, "primitive", "yes", property);
}
// add the default value
if (metainf.isDefaultValueAvailable(name)){
QName schemaQName = metainf.getSchemaQNameForQName(name);
if (baseTypeMap.containsKey(schemaQName)){
XSLTUtils.addAttribute(model, "defaultValue",
metainf.getDefaultValueForQName(name), property);
}
}
//in the case the original element is an array but the derived one is not.
if (parentMetaInf != null && metainf.isRestriction() && !missingQNames.contains(name) &&
(parentMetaInf.getArrayStatusForQName(name) && !metainf.getArrayStatusForQName(name))) {
XSLTUtils.addAttribute(model, "rewrite", "yes", property);
XSLTUtils.addAttribute(model, "occuranceChanged", "yes", property);
} else if (metainf.isRestriction() && !missingQNames.contains(name) &&
(minOccursChanged(name, missingQNames, metainf) || maxOccursChanged(name, missingQNames, metainf)))