@Override
public ItemDefinition<?> createAdHocDefinition(QName elementName, QName typeName, int minOccurs, int maxOccurs) {
Collection<? extends TypeDefinition> typeDefinitions = findTypeDefinitionsByType(typeName);
if (typeDefinitions.size() == 0) {
return createAdHocPropertyDefinition(elementName, typeName, minOccurs, maxOccurs);
} else if (typeDefinitions.size() == 1) {
TypeDefinition typeDefinition = typeDefinitions.iterator().next();
if (typeDefinition instanceof SimpleTypeDefinition) {
return createAdHocPropertyDefinition(elementName, typeName, minOccurs, maxOccurs);
} else if (typeDefinition instanceof ComplexTypeDefinition) {
ComplexTypeDefinition ctd = (ComplexTypeDefinition) typeDefinition;
if (ctd.isObjectMarker()) {
return createAdHocObjectDefinition(elementName, ctd, minOccurs, maxOccurs);
} else if (ctd.isContainerMarker()) {
return createAdHocContainerDefinition(elementName, ctd, minOccurs, maxOccurs);
} else if (ctd.isReferenceMarker()) {
return createAdHocReferenceDefinition(elementName, ctd, minOccurs, maxOccurs);
} else {
return createAdHocPropertyDefinition(elementName, typeName, minOccurs, maxOccurs);
}
} else {
throw new IllegalStateException("Creation of ad-hoc definition from this type definition is not supported: " + typeDefinition);
}
} else {
throw new IllegalStateException("More than one definition for type: " + typeName);
}
}