public void writeOrganization(OrganizationType org) throws ProcessingException {
    if (org == null) throw new ProcessingException(logger.nullArgumentError("Organization"));
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.ORGANIZATION.get(), METADATA_NSURI.get());

    ExtensionsType extensions = org.getExtensions();
    if (extensions != null) {
      StaxUtil.writeDOMElement(writer, extensions.getElement());
    }

    // Write the name
    List<LocalizedNameType> nameList = org.getOrganizationName();
    for (LocalizedNameType localName : nameList) {
      StaxUtil.writeStartElement(
          writer,
          METADATA_PREFIX,
          JBossSAMLConstants.ORGANIZATION_NAME.get(),
          METADATA_NSURI.get());

      writeLocalizedType(localName);
    }

    // Write the display name
    List<LocalizedNameType> displayNameList = org.getOrganizationDisplayName();
    for (LocalizedNameType localName : displayNameList) {
      StaxUtil.writeStartElement(
          writer,
          METADATA_PREFIX,
          JBossSAMLConstants.ORGANIZATION_DISPLAY_NAME.get(),
          METADATA_NSURI.get());
      writeLocalizedType(localName);
    }

    // Write the url
    List<LocalizedURIType> uriList = org.getOrganizationURL();
    for (LocalizedURIType uri : uriList) {
      StaxUtil.writeStartElement(
          writer, METADATA_PREFIX, JBossSAMLConstants.ORGANIZATION_URL.get(), METADATA_NSURI.get());

      String lang = uri.getLang();
      String val = uri.getValue().toString();
      StaxUtil.writeAttribute(
          writer,
          new QName(JBossSAMLURIConstants.XML.get(), JBossSAMLConstants.LANG.get(), "xml"),
          lang);

      StaxUtil.writeCharacters(writer, val);

      StaxUtil.writeEndElement(writer);
    }

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void writeAttributeConsumingService(AttributeConsumingServiceType attributeConsumer)
      throws ProcessingException {
    StaxUtil.writeStartElement(
        writer,
        METADATA_PREFIX,
        JBossSAMLConstants.ATTRIBUTE_CONSUMING_SERVICE.get(),
        METADATA_NSURI.get());

    StaxUtil.writeAttribute(
        writer, JBossSAMLConstants.ISDEFAULT.get(), "" + attributeConsumer.isIsDefault());
    StaxUtil.writeAttribute(
        writer, JBossSAMLConstants.INDEX.get(), "" + attributeConsumer.getIndex());

    // Service Name
    List<LocalizedNameType> serviceNames = attributeConsumer.getServiceName();
    for (LocalizedNameType serviceName : serviceNames) {
      writeLocalizedNameType(
          serviceName,
          new QName(METADATA_NSURI.get(), JBossSAMLConstants.SERVICE_NAME.get(), METADATA_PREFIX));
    }

    List<LocalizedNameType> serviceDescriptions = attributeConsumer.getServiceDescription();
    for (LocalizedNameType serviceDescription : serviceDescriptions) {
      writeLocalizedNameType(
          serviceDescription,
          new QName(
              METADATA_NSURI.get(), JBossSAMLConstants.SERVICE_DESCRIPTION.get(), METADATA_PREFIX));
    }

    List<RequestedAttributeType> requestedAttributes = attributeConsumer.getRequestedAttribute();
    for (RequestedAttributeType requestedAttribute : requestedAttributes) {
      StaxUtil.writeStartElement(
          writer,
          METADATA_PREFIX,
          JBossSAMLConstants.REQUESTED_ATTRIBUTE.get(),
          METADATA_NSURI.get());
      Boolean isRequired = requestedAttribute.isIsRequired();
      if (isRequired != null) {
        StaxUtil.writeAttribute(
            writer, new QName(JBossSAMLConstants.IS_REQUIRED.get()), isRequired.toString());
      }
      writeAttributeTypeWithoutRootTag(requestedAttribute);
      StaxUtil.writeEndElement(writer);
    }

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  private void writeNameIDFormat(String nameIDFormat) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.NAMEID_FORMAT.get(), METADATA_NSURI.get());

    StaxUtil.writeCharacters(writer, nameIDFormat);
    StaxUtil.writeEndElement(writer);
  }
  public void write(SPSSODescriptorType spSSODescriptor) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.SP_SSO_DESCRIPTOR.get(), METADATA_NSURI.get());
    StaxUtil.writeAttribute(
        writer,
        new QName(JBossSAMLConstants.PROTOCOL_SUPPORT_ENUMERATION.get()),
        spSSODescriptor.getProtocolSupportEnumeration().get(0));

    // Write the attributes
    Boolean authnSigned = spSSODescriptor.isAuthnRequestsSigned();
    if (authnSigned != null) {
      StaxUtil.writeAttribute(
          writer,
          new QName(JBossSAMLConstants.WANT_AUTHN_REQUESTS_SIGNED.get()),
          authnSigned.toString());
    }
    Boolean wantAssertionsSigned = spSSODescriptor.isWantAssertionsSigned();
    if (wantAssertionsSigned != null) {
      StaxUtil.writeAttribute(
          writer,
          new QName(JBossSAMLConstants.WANT_ASSERTIONS_SIGNED.get()),
          wantAssertionsSigned.toString());
    }

    // Get the key descriptors
    List<KeyDescriptorType> keyDescriptors = spSSODescriptor.getKeyDescriptor();
    for (KeyDescriptorType keyDescriptor : keyDescriptors) {
      writeKeyDescriptor(keyDescriptor);
    }

    List<EndpointType> sloServices = spSSODescriptor.getSingleLogoutService();
    for (EndpointType endpoint : sloServices) {
      writeSingleLogoutService(endpoint);
    }

    List<IndexedEndpointType> artifactResolutions = spSSODescriptor.getArtifactResolutionService();
    for (IndexedEndpointType artifactResolution : artifactResolutions) {
      writeArtifactResolutionService(artifactResolution);
    }

    List<String> nameIDFormats = spSSODescriptor.getNameIDFormat();
    for (String nameIDFormat : nameIDFormats) {
      writeNameIDFormat(nameIDFormat);
    }

    List<IndexedEndpointType> assertionConsumers = spSSODescriptor.getAssertionConsumerService();
    for (IndexedEndpointType assertionConsumer : assertionConsumers) {
      writeAssertionConsumerService(assertionConsumer);
    }

    List<AttributeConsumingServiceType> attributeConsumers =
        spSSODescriptor.getAttributeConsumingService();
    for (AttributeConsumingServiceType attributeConsumer : attributeConsumers) {
      writeAttributeConsumingService(attributeConsumer);
    }

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void writeAttributeService(EndpointType endpoint) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.ATTRIBUTE_SERVICE.get(), METADATA_NSURI.get());

    writeEndpointType(endpoint);

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
 public void writeAssertionConsumerService(IndexedEndpointType indexedEndpoint)
     throws ProcessingException {
   StaxUtil.writeStartElement(
       writer,
       METADATA_PREFIX,
       JBossSAMLConstants.ASSERTION_CONSUMER_SERVICE.get(),
       METADATA_NSURI.get());
   writeIndexedEndpointType(indexedEndpoint);
 }
  public void writeArtifactResolutionService(IndexedEndpointType indexedEndpoint)
      throws ProcessingException {
    StaxUtil.writeStartElement(
        writer,
        METADATA_PREFIX,
        JBossSAMLConstants.ARTIFACT_RESOLUTION_SERVICE.get(),
        METADATA_NSURI.get());

    writeIndexedEndpointType(indexedEndpoint);
  }
  public void writeSingleSignOnService(EndpointType endpoint) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer,
        METADATA_PREFIX,
        JBossSAMLConstants.SINGLE_SIGNON_SERVICE.get(),
        METADATA_NSURI.get());

    writeEndpointType(endpoint);

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void writeKeyDescriptor(KeyDescriptorType keyDescriptor) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.KEY_DESCRIPTOR.get(), METADATA_NSURI.get());

    KeyTypes keyTypes = keyDescriptor.getUse();
    if (keyTypes != null)
      StaxUtil.writeAttribute(writer, new QName(JBossSAMLConstants.USE.get()), keyTypes.value());

    Element keyInfo = keyDescriptor.getKeyInfo();
    StaxUtil.writeDOMElement(writer, keyInfo);
    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void write(ContactType contact) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.CONTACT_PERSON.get(), METADATA_NSURI.get());

    ExtensionsType extensions = contact.getExtensions();
    if (extensions != null) {
      StaxUtil.writeDOMElement(writer, extensions.getElement());
    }
    ContactTypeType attribs = contact.getContactType();
    StaxUtil.writeAttribute(writer, JBossSAMLConstants.CONTACT_TYPE.get(), attribs.value());

    // Write the name
    String company = contact.getCompany();
    if (company != null) {
      StaxUtil.writeStartElement(
          writer, METADATA_PREFIX, JBossSAMLConstants.COMPANY.get(), METADATA_NSURI.get());
      StaxUtil.writeCharacters(writer, company);
      StaxUtil.writeEndElement(writer);
    }
    String givenName = contact.getGivenName();
    if (givenName != null) {
      StaxUtil.writeStartElement(
          writer, METADATA_PREFIX, JBossSAMLConstants.GIVEN_NAME.get(), METADATA_NSURI.get());
      StaxUtil.writeCharacters(writer, givenName);
      StaxUtil.writeEndElement(writer);
    }

    String surName = contact.getSurName();
    if (surName != null) {
      StaxUtil.writeStartElement(
          writer, METADATA_PREFIX, JBossSAMLConstants.SURNAME.get(), METADATA_NSURI.get());
      StaxUtil.writeCharacters(writer, surName);
      StaxUtil.writeEndElement(writer);
    }

    List<String> emailAddresses = contact.getEmailAddress();
    for (String email : emailAddresses) {
      StaxUtil.writeStartElement(
          writer, METADATA_PREFIX, JBossSAMLConstants.EMAIL_ADDRESS.get(), METADATA_NSURI.get());
      StaxUtil.writeCharacters(writer, email);
      StaxUtil.writeEndElement(writer);
    }

    List<String> tels = contact.getTelephoneNumber();
    for (String telephone : tels) {
      StaxUtil.writeStartElement(
          writer, METADATA_PREFIX, JBossSAMLConstants.TELEPHONE_NUMBER.get(), METADATA_NSURI.get());
      StaxUtil.writeCharacters(writer, telephone);
      StaxUtil.writeEndElement(writer);
    }

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void write(IDPSSODescriptorType idpSSODescriptor) throws ProcessingException {
    if (idpSSODescriptor == null)
      throw new ProcessingException(logger.nullArgumentError("IDPSSODescriptorType"));

    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.IDP_SSO_DESCRIPTOR.get(), METADATA_NSURI.get());

    Boolean wantsAuthnRequestsSigned = idpSSODescriptor.isWantAuthnRequestsSigned();
    if (wantsAuthnRequestsSigned != null) {
      StaxUtil.writeAttribute(
          writer,
          new QName(JBossSAMLConstants.WANT_AUTHN_REQUESTS_SIGNED.get()),
          wantsAuthnRequestsSigned.toString());
    }
    writeProtocolSupportEnumeration(idpSSODescriptor.getProtocolSupportEnumeration());

    List<IndexedEndpointType> artifactResolutionServices =
        idpSSODescriptor.getArtifactResolutionService();
    for (IndexedEndpointType indexedEndpoint : artifactResolutionServices) {
      writeArtifactResolutionService(indexedEndpoint);
    }

    List<EndpointType> sloServices = idpSSODescriptor.getSingleLogoutService();
    for (EndpointType endpoint : sloServices) {
      writeSingleLogoutService(endpoint);
    }

    List<EndpointType> ssoServices = idpSSODescriptor.getSingleSignOnService();
    for (EndpointType endpoint : ssoServices) {
      writeSingleSignOnService(endpoint);
    }

    List<String> nameIDFormats = idpSSODescriptor.getNameIDFormat();
    for (String nameIDFormat : nameIDFormats) {
      writeNameIDFormat(nameIDFormat);
    }

    List<AttributeType> attributes = idpSSODescriptor.getAttribute();
    for (AttributeType attribType : attributes) {
      write(attribType);
    }

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void writeEntitiesDescriptor(EntitiesDescriptorType entities) throws ProcessingException {
    StaxUtil.writeStartElement(
        writer,
        METADATA_PREFIX,
        JBossSAMLConstants.ENTITIES_DESCRIPTOR.get(),
        METADATA_NSURI.get());

    StaxUtil.writeDefaultNameSpace(writer, JBossSAMLURIConstants.METADATA_NSURI.get());
    StaxUtil.writeNameSpace(writer, "md", JBossSAMLURIConstants.METADATA_NSURI.get());
    StaxUtil.writeNameSpace(writer, "saml", JBossSAMLURIConstants.ASSERTION_NSURI.get());
    StaxUtil.writeNameSpace(writer, "ds", JBossSAMLURIConstants.XMLDSIG_NSURI.get());

    if (entities.getValidUntil() != null) {
      StaxUtil.writeAttribute(
          writer, JBossSAMLConstants.VALID_UNTIL.get(), entities.getValidUntil().toString());
    }
    if (entities.getID() != null) {
      StaxUtil.writeAttribute(writer, JBossSAMLConstants.ID.get(), entities.getID());
    }

    if (entities.getName() != null) {
      StaxUtil.writeAttribute(writer, JBossSAMLConstants.NAME.get(), entities.getName());
    }

    Element signature = entities.getSignature();
    if (signature != null) {
      StaxUtil.writeDOMElement(writer, signature);
    }
    ExtensionsType extensions = entities.getExtensions();
    if (extensions != null) {
      StaxUtil.writeDOMElement(writer, extensions.getElement());
    }

    List<Object> entityDescriptors = entities.getEntityDescriptor();
    for (Object ed : entityDescriptors) {
      if (ed instanceof EntityDescriptorType) {
        writeEntityDescriptor((EntityDescriptorType) ed);
      } else writeEntitiesDescriptor((EntitiesDescriptorType) ed);
    }

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void writeAttributeAuthorityDescriptor(AttributeAuthorityDescriptorType attributeAuthority)
      throws ProcessingException {
    StaxUtil.writeStartElement(
        writer,
        METADATA_PREFIX,
        JBossSAMLConstants.ATTRIBUTE_AUTHORITY_DESCRIPTOR.get(),
        METADATA_NSURI.get());

    writeProtocolSupportEnumeration(attributeAuthority.getProtocolSupportEnumeration());

    Element signature = attributeAuthority.getSignature();
    if (signature != null) {
      StaxUtil.writeDOMElement(writer, signature);
    }
    ExtensionsType extensions = attributeAuthority.getExtensions();
    if (extensions != null) {
      StaxUtil.writeDOMElement(writer, extensions.getElement());
    }

    List<KeyDescriptorType> keyDescriptorList = attributeAuthority.getKeyDescriptor();
    for (KeyDescriptorType keyDescriptor : keyDescriptorList) {
      writeKeyDescriptor(keyDescriptor);
    }

    List<EndpointType> attributeServices = attributeAuthority.getAttributeService();
    for (EndpointType endpoint : attributeServices) {
      writeAttributeService(endpoint);
    }

    List<String> nameIDFormats = attributeAuthority.getNameIDFormat();
    for (String nameIDFormat : nameIDFormats) {
      writeNameIDFormat(nameIDFormat);
    }

    List<AttributeType> attributes = attributeAuthority.getAttribute();
    for (AttributeType attributeType : attributes) {
      write(attributeType);
    }
    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }
  public void writeEntityDescriptor(EntityDescriptorType entityDescriptor)
      throws ProcessingException {
    StaxUtil.writeStartElement(
        writer, METADATA_PREFIX, JBossSAMLConstants.ENTITY_DESCRIPTOR.get(), METADATA_NSURI.get());
    StaxUtil.writeDefaultNameSpace(writer, JBossSAMLURIConstants.METADATA_NSURI.get());
    StaxUtil.writeNameSpace(writer, "md", JBossSAMLURIConstants.METADATA_NSURI.get());
    StaxUtil.writeNameSpace(writer, "saml", JBossSAMLURIConstants.ASSERTION_NSURI.get());
    StaxUtil.writeNameSpace(writer, "ds", JBossSAMLURIConstants.XMLDSIG_NSURI.get());

    StaxUtil.writeAttribute(
        writer, JBossSAMLConstants.ENTITY_ID.get(), entityDescriptor.getEntityID());
    if (entityDescriptor.getValidUntil() != null) {
      StaxUtil.writeAttribute(
          writer,
          JBossSAMLConstants.VALID_UNTIL.get(),
          entityDescriptor.getValidUntil().toString());
    }
    if (entityDescriptor.getID() != null) {
      StaxUtil.writeAttribute(writer, JBossSAMLConstants.ID.get(), entityDescriptor.getID());
    }

    Element signature = entityDescriptor.getSignature();
    if (signature != null) {
      StaxUtil.writeDOMElement(writer, signature);
    }
    ExtensionsType extensions = entityDescriptor.getExtensions();
    if (extensions != null) {
      StaxUtil.writeDOMElement(writer, extensions.getElement());
    }

    List<EDTChoiceType> choiceTypes = entityDescriptor.getChoiceType();
    for (EDTChoiceType edtChoice : choiceTypes) {
      AffiliationDescriptorType affliationDesc = edtChoice.getAffiliationDescriptor();
      if (affliationDesc != null) throw logger.notImplementedYet("affliation"); // TODO: affiliation

      List<EDTDescriptorChoiceType> edtDescChoices = edtChoice.getDescriptors();
      for (EDTDescriptorChoiceType edtDescChoice : edtDescChoices) {
        RoleDescriptorType roleDesc = edtDescChoice.getRoleDescriptor();

        if (roleDesc != null) throw logger.notImplementedYet("Role Descriptor type");

        IDPSSODescriptorType idpSSO = edtDescChoice.getIdpDescriptor();
        if (idpSSO != null) write(idpSSO);

        SPSSODescriptorType spSSO = edtDescChoice.getSpDescriptor();
        if (spSSO != null) write(spSSO);

        AttributeAuthorityDescriptorType attribAuth = edtDescChoice.getAttribDescriptor();
        if (attribAuth != null) writeAttributeAuthorityDescriptor(attribAuth);

        AuthnAuthorityDescriptorType authNDesc = edtDescChoice.getAuthnDescriptor();
        if (authNDesc != null) throw logger.notImplementedYet("AuthnAuthorityDescriptorType");

        PDPDescriptorType pdpDesc = edtDescChoice.getPdpDescriptor();
        if (pdpDesc != null) throw logger.notImplementedYet("PDPDescriptorType");
      }
    }
    OrganizationType organization = entityDescriptor.getOrganization();
    if (organization != null) {
      writeOrganization(organization);
    }

    List<ContactType> contactPersons = entityDescriptor.getContactPerson();
    for (ContactType contact : contactPersons) {
      write(contact);
    }

    List<AdditionalMetadataLocationType> addl = entityDescriptor.getAdditionalMetadataLocation();
    if (addl.size() > 0) throw logger.notImplementedYet("AdditionalMetadataLocationType");

    StaxUtil.writeEndElement(writer);
    StaxUtil.flush(writer);
  }