* @param element
* @param parent
* @return AttributeDef bij simpleTypes of AccessorDef bij complexTypes
*/
protected void resolveElement(final XSDElement element, final MovableStructureDef parent) {
XSDNode type = element.getType();
boolean noType = false;
boolean explicitAnyType = false;
if (isAnyType(type)) {
if (hasTypeAttribute(element)) {
explicitAnyType = true;
} else { // elementen zonder type krijgen een XSDComplexType anyType. Deze negeren
// we om onderscheid te kunnen maken met elementen die expliciet op
// type=anyType zijn gezet
noType = true;
type = null;
}
}
final String safeElementName = Utility.normalizeString(element.getName());
final boolean collection = isCollection(element);
if (type instanceof XSDSimpleType || noType || explicitAnyType) { // simpletype, geen type (dus string) en anytype moeten allemaal
// attribuut worden
AccessorDef collAccessor = null;
MovableStructureDef attrParent = parent;
LeafNodeType leafNodeType = LeafNodeType.ELEMENT;
if (collection) { // collectie van attributen kan niet, dus collection accessor maken met
// "fake" structure
// TODO: beter beschrijven scalar collection??
collAccessor =
createDCAccessor(safeElementName + SCALAR_COLLECTION_POSTFIX, parent, collection,
SCALAR_COLLECTION_TRUE);
addAccessorProperties(collAccessor, element);
//createCompound(type, accessorDef); // maak StructureDefinition
// maak StructureDefinition met enkel attribuut
final MovableStructureDef collStructure = createDCStructure(collAccessor);
// attribute voor element laten aanmaken in nieuwe structureDef en niet
// in gegeven parent (waar nu een accessor en andere structure in
// geplaatst zijn)
attrParent = collStructure;
leafNodeType = LeafNodeType.SCALAR_COLLECTION_ELEMENT;
}
// TODO: kunnen we code delen met resolveElement bij een simpleType???
// TODO: kunnen we code delen met collectie van simpleType???
// attribuut maken en deze toe voegen aan gegeven parent of "fake"
// parent die we net gemaakt hebben igv collectie
// wanneer expliciet anyType is opgegeven dan hele XML element exposen
if (explicitAnyType) {
final AttributeDef attrDef = createDCAttribute(safeElementName, attrParent, "org.w3c.dom.Element");
addAttributeProperties(attrDef, element, type.getQName(), leafNodeType);
} else {
final XSDSimpleType simpleType = (XSDSimpleType) type;
final AttributeDef attrDef =
createDCAttribute(safeElementName, attrParent, getTypeMapper().getJavaType(simpleType));
addAttributeProperties(attrDef, element, getTypeMapper().getMappableType(simpleType), leafNodeType);
}
} else if (type instanceof XSDComplexType) { // complexType (niet anyType) als accessor met structure maken
final XSDComplexType complexType = (XSDComplexType) type;
final AccessorDef accessorDef =
createDCAccessor(safeElementName, parent, collection, SCALAR_COLLECTION_FALSE);
addAccessorProperties(accessorDef, element);
final MovableStructureDef structDef =
resolveComplexType(complexType, accessorDef); // maak StructureDefinition
addStructureProperties(structDef, complexType);
} else {
throw new UnsupportedOperationException("XSDElement with type " + type.getClass().getName());
}
}