// </>
// </>
// ...
// <element name="f" type="foo"/>
// ...
ComplexType ct = ((ComplexTypeHost)parent).complexType();
writeName(c,ct);
if(c.isFinal())
ct._final("extension restriction");
SimpleExtension se = ct.simpleContent().extension();
se.block(); // because we might have attribute before value
for (PropertyInfo<T,C> p : c.getProperties()) {
switch (p.kind()) {
case ATTRIBUTE:
handleAttributeProp((AttributePropertyInfo<T,C>)p,se);
break;
case VALUE:
TODO.checkSpec("what if vp.isCollection() == true?");
ValuePropertyInfo vp = (ValuePropertyInfo) p;
se.base(vp.getTarget().getTypeName());
break;
case ELEMENT: // error
case REFERENCE: // error
default:
assert false;
throw new IllegalStateException();
}
}
se.commit();
}
TODO.schemaGenerator("figure out what to do if bc != null");
TODO.checkSpec("handle sec 8.9.5.2, bullet #4");
// Java types containing value props can only contain properties of type
// ValuePropertyinfo and AttributePropertyInfo which have just been handled,
// so return.
return;
}
// we didn't fall into the special case for value props, so we
// need to initialize the ct.
// generate the complexType
ComplexType ct = ((ComplexTypeHost)parent).complexType();
writeName(c,ct);
if(c.isFinal())
ct._final("extension restriction");
if(c.isAbstract())
ct._abstract(true);
// these are where we write content model and attributes
AttrDecls contentModel = ct;
TypeDefParticle contentModelOwner = 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;
contentModelOwner = null;
se.base(bc.getTypeName());
} else {
ComplexExtension ce = ct.complexContent().extension();
contentModel = ce;
contentModelOwner = ce;
ce.base(bc.getTypeName());
// TODO: what if the base type is anonymous?
}
}
if(contentModelOwner!=null) {
// build the tree that represents the explicit content model from iterate over the properties
ArrayList<Tree> children = new ArrayList<Tree>();
for (PropertyInfo<T,C> p : c.getProperties()) {
// handling for <complexType @mixed='true' ...>
if(p instanceof ReferencePropertyInfo && ((ReferencePropertyInfo)p).isMixed()) {
ct.mixed(true);
}
Tree t = buildPropertyContentModel(p);
if(t!=null)
children.add(t);
}
Tree top = Tree.makeGroup( c.isOrdered() ? GroupKind.SEQUENCE : GroupKind.ALL, children);
// write the content model
top.write(contentModelOwner);
}
// then attributes
for (PropertyInfo<T,C> p : c.getProperties()) {
if (p instanceof AttributePropertyInfo) {
handleAttributeProp((AttributePropertyInfo<T,C>)p, contentModel);
}
}
if( c.hasAttributeWildcard()) {
contentModel.anyAttribute().namespace("##other").processContents("skip");
}
ct.commit();
}