private TypeDescriptor getElementDescriptor()

in taverna-wsdl-generic/src/main/java/org/apache/taverna/wsdl/parser/TypeDescriptors.java [173:235]


    private TypeDescriptor getElementDescriptor(XmlSchemaElement element) {
        TypeDescriptor elementDescriptor;
        TypeDescriptor typeDesc;
        
        QName typeName;
        if (element.isRef()) {
            XmlSchemaRef<XmlSchemaElement> ref = element.getRef();

            XmlSchemaElement target = ref.getTarget();
            if (target == null) {
                QName targetName = ref.getTargetQName();
                if (targetName != null) {
                    target = schemas.getElementByQName(targetName);
                }
            }
            if (target != null) {
                typeName = target.getSchemaTypeName();
                if (typeName != null) {
                    typeDesc = getTypeDescriptor(typeName);
                } else {
                    XmlSchemaType xmlSchemaType = target.getSchemaType();
                    typeDesc = getTypeDescriptor(xmlSchemaType);
                }   
            } else {
                return null; // invalid XML Schema...
            }
        } else {
            typeName = element.getSchemaTypeName();
            if (typeName != null) {
                typeDesc = getTypeDescriptor(typeName);
            } else {
                XmlSchemaType xmlSchemaType = element.getSchemaType();
                typeDesc = getTypeDescriptor(xmlSchemaType);
            }
        }

        if (element.getMaxOccurs() > 1) {
            ArrayTypeDescriptor arrayElementDescriptor = new ArrayTypeDescriptor();
            arrayElementDescriptor.setElementType(typeDesc);

            elementDescriptor = arrayElementDescriptor;
        }
        else if (typeDesc instanceof ComplexTypeDescriptor) {
            ComplexTypeDescriptor complexElementDescr = (ComplexTypeDescriptor)typeDesc;
            ComplexTypeDescriptor complexTypeDesc = new ComplexTypeDescriptor(); 

            complexTypeDesc.getElements().addAll(complexElementDescr.getElements());
            complexTypeDesc.getAttributes().addAll(complexElementDescr.getAttributes());

            elementDescriptor = complexTypeDesc;
        } else {
            elementDescriptor = new BaseTypeDescriptor();
        }
        elementDescriptor.setType(typeName == null ? "" : typeName.getLocalPart());

        elementDescriptor.setName(element.isRef() ? element.getWireName().getLocalPart() : element.getName());
        elementDescriptor.setQname(element.getWireName());
        elementDescriptor.setOptional(element.getMinOccurs() == 0);
        elementDescriptor.setUnbounded(Long.MAX_VALUE == element.getMaxOccurs());
        elementDescriptor.setNillable(element.isNillable());

        return elementDescriptor;
    }