Element serializeSimpleTypeUnion()

in xmlschema-core/src/main/java/org/apache/ws/commons/schema/XmlSchemaSerializer.java [2139:2209]


    Element serializeSimpleTypeUnion(Document doc, XmlSchemaSimpleTypeUnion unionObj, XmlSchema schema)
        throws XmlSchemaSerializerException {

        Element union = createNewElement(doc, "union", schema.getSchemaNamespacePrefix(),
                                         XmlSchema.SCHEMA_NS);
        if (unionObj.getId() != null) {
            union.setAttributeNS(null, "id", unionObj.getId());
        }

        if (unionObj.getMemberTypesSource() != null) {
            QName[] memberTypesQNames = unionObj.getMemberTypesQNames();            
            for (QName qn : memberTypesQNames) {
                String namespace = qn.getNamespaceURI();
                if (namespace.length() != 0 && qn.getPrefix().length() != 0) {
                    String prefix = schemaNamespace.get(namespace);
                    if (!qn.getPrefix().equals(prefix)) {
                        prefix = union.lookupPrefix(namespace);
                    }
                    if (!qn.getPrefix().equals(prefix)) {
                        union.setAttributeNS(XMLNS_NAMESPACE_URI, "xmlns:" + qn.getPrefix(), qn.getNamespaceURI());
                    }
                }
            }
            union.setAttributeNS(null, "memberTypes", unionObj.getMemberTypesSource());
        } else {
            QName[] memberTypesQNames = unionObj.getMemberTypesQNames();
            if (memberTypesQNames != null && memberTypesQNames.length > 0) {
                StringBuilder memberTypes = new StringBuilder();
                for (int i = 0, n = memberTypesQNames.length - 1; i <= n; i++) {
                    QName memberTypesQName = memberTypesQNames[i];
                    String namespace = memberTypesQName.getNamespaceURI();
                    if (namespace.length() != 0) {
                        String prefix = schemaNamespace.get(namespace);                        
                        if (prefix.length() != 0) {
                            memberTypes.append(prefix).append(':');
                        }
                    }
                    memberTypes.append(memberTypesQName.getLocalPart());
                    if (i != n) {
                        memberTypes.append(' ');
                    }
                }
                
                union.setAttributeNS(null, "memberTypes", memberTypes.toString());
            }
        }

        if (unionObj.getBaseTypes().size() > 0) {
            int baseTypesLength = unionObj.getBaseTypes().size();
            Element baseType;
            for (int i = 0; i < baseTypesLength; i++) {
                try {
                    baseType = serializeSimpleType(doc, (XmlSchemaSimpleType)unionObj.getBaseTypes().get(i),
                                                   schema);
                    union.appendChild(baseType);
                } catch (ClassCastException e) {
                    throw new XmlSchemaSerializerException("only inline simple type allow as attribute's "
                                                           + "inline type");
                }
            }
        }
        if (unionObj.getAnnotation() != null) {
            Element annotation = serializeAnnotation(doc, unionObj.getAnnotation(), schema);
            union.appendChild(annotation);
        }

        // process extension
        processExtensibilityComponents(unionObj, union);

        return union;
    }