// hold the ct open in case we need to generate @mixed below...
ct.block();
// either <sequence> or <all>
ExplicitGroup compositor = null;
// only necessary if this type has a base class we need to extend from
AttrDecls contentModel = ct;
// if there is a base class, we need to generate an extension in the schema
final ClassInfo<T,C> bc = c.getBaseClass();
if (bc != null) {
if(bc.hasValueProperty()) {
// extending complex type with simple content
SimpleExtension se = ct.simpleContent().extension();
contentModel = se;
se.base(bc.getTypeName());
} else {
ComplexExtension ce = ct.complexContent().extension();
contentModel = ce;
ce.base(bc.getTypeName());
// TODO: what if the base type is anonymous?
// ordered props go in a sequence, unordered go in an all
if( c.isOrdered() ) {
compositor = ce.sequence();
} else {
compositor = ce.all();
}
}
}
// iterate over the properties
if (c.hasProperties()) {
if( compositor == null ) { // if there is no extension base, create a top level seq
// ordered props go in a sequence, unordered go in an all
if( c.isOrdered() ) {
compositor = ct.sequence();
} else {
compositor = ct.all();
}
}
// block writing the compositor because we might need to
// write some out of order attributes to handle min/maxOccurs
compositor.block();
for (PropertyInfo<T,C> p : c.getProperties()) {
// handling for <complexType @mixed='true' ...>
if(p instanceof ReferencePropertyInfo && ((ReferencePropertyInfo)p).isMixed()) {
ct.mixed(true);
}
writeProperty(p, contentModel, compositor);
}
compositor.commit();
}
// look for wildcard attributes
if( c.hasAttributeWildcard()) {
// TODO: not type safe