/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <neethi_assertion_builder.h>

AXIS2_EXTERN neethi_assertion_t *AXIS2_CALL
neethi_assertion_builder_build(
    const axutil_env_t *env,
    axiom_node_t *node,
    axiom_element_t *element)
{
    axis2_char_t *localname = NULL;
    axis2_char_t *ns = NULL;
    axutil_qname_t *node_qname = NULL;

    localname = axiom_element_get_localname(element, env);
    if(!localname)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[neethi] Cannot get localname from element.");
        return NULL;
    }

    node_qname = axiom_element_get_qname(element, env, node);
    if(!node_qname)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[neethi] Cannot get qname from element %s.",
            localname);
        return NULL;
    }

    ns = axutil_qname_get_uri(node_qname, env);
    if(!ns)
    {
        AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[neethi] Cannot get namespace from element %s.",
            localname);
        return NULL;
    }

    if(!(axutil_strcmp(ns, RP_SP_NS_11) && axutil_strcmp(ns, RP_SP_NS_12)))
    {
        /* if namespace is WS-SecurityPolicy Namespace */
        if(!axutil_strcmp(localname, RP_TRANSPORT_BINDING))
        {
            return rp_transport_binding_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_ASYMMETRIC_BINDING))
        {
            return rp_asymmetric_binding_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_SYMMETRIC_BINDING))
        {
            return rp_symmetric_binding_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_TRANSPORT_TOKEN))
        {
            return rp_transport_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_RECIPIENT_TOKEN))
        {
            return rp_recipient_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_INITIATOR_TOKEN))
        {
            return rp_initiator_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_PROTECTION_TOKEN))
        {
            return rp_protection_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_ENCRYPTION_TOKEN))
        {
            return rp_encryption_token_builder_build(env, node, element);
        }

        else if(!axutil_strcmp(localname, RP_SIGNATURE_TOKEN))
        {
            return rp_signature_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_X509_TOKEN))
        {
            return rp_x509_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_SECURITY_CONTEXT_TOKEN))
        {
            return rp_security_context_token_builder_build(env, node, element, ns, AXIS2_FALSE);
        }
        else if(!axutil_strcmp(localname, RP_SECURE_CONVERSATION_TOKEN))
        {
            return rp_security_context_token_builder_build(env, node, element, ns, AXIS2_TRUE);
        }
        else if(!axutil_strcmp(localname, RP_ENCRYPT_BEFORE_SIGNING))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_ENCRYPT_BEFORE_SIGNING);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_SIGN_BEFORE_ENCRYPTING))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_SIGN_BEFORE_ENCRYPTING);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_ENCRYPT_SIGNATURE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_ENCRYPT_SIGNATURE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_PROTECT_TOKENS))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_PROTECT_TOKENS);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_ONLY_SIGN_ENTIRE_HEADERS_AND_BODY))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_ONLY_SIGN_ENTIRE_HEADERS_AND_BODY);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_KEY_IDENTIFIRE_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_KEY_IDENTIFIRE_REFERENCE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_ISSUER_SERIAL_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_ISSUER_SERIAL_REFERENCE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_EMBEDDED_TOKEN_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_EMBEDDED_TOKEN_REFERENCE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_THUMBPRINT_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_THUMBPRINT_REFERENCE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_X509_V1_TOKEN_10))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_X509_V1_TOKEN_10);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_X509_V3_TOKEN_10))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_X509_V3_TOKEN_10);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_ALGORITHM_SUITE))
        {
            return rp_algorithmsuite_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_LAYOUT))
        {
            return rp_layout_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_USERNAME_TOKEN))
        {
            return rp_username_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_SIGNED_SUPPORTING_TOKENS))
        {
            return rp_supporting_tokens_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_SUPPORTING_TOKENS))
        {
            return rp_supporting_tokens_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_ENDORSING_SUPPORTING_TOKENS))
        {
            return rp_supporting_tokens_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_SIGNED_ENDORSING_SUPPORTING_TOKENS))
        {
            return rp_supporting_tokens_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_WSS10))
        {
            return rp_wss10_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_WSS11))
        {
            return rp_wss11_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_TRUST10))
        {
            return rp_trust10_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_TRUST13))
        {
            /* we can still use rp_trust10 structures */
            return rp_trust10_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_INCLUDE_TIMESTAMP))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_INCLUDE_TIMESTAMP);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_HTTPS_TOKEN))
        {
            return rp_https_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_WSS_USERNAME_TOKEN_10))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_USERNAME_TOKEN_10);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_USERNAME_TOKEN_11))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_USERNAME_TOKEN_11);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_REF_KEY_IDENTIFIER))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_REF_KEY_IDENTIFIER);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_REF_ISSUER_SERIAL))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_REF_ISSUER_SERIAL);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_REF_EXTERNAL_URI))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_REF_EXTERNAL_URI);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_REF_EMBEDDED_TOKEN))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_REF_EMBEDDED_TOKEN);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_SIGNED_PARTS))
        {
            return rp_signed_encrypted_parts_builder_build(env, node, element, AXIS2_TRUE);
        }
        else if(!axutil_strcmp(localname, RP_ENCRYPTED_PARTS))
        {
            return rp_signed_encrypted_parts_builder_build(env, node, element, AXIS2_FALSE);
        }
        else if(!axutil_strcmp(localname, RP_BOOTSTRAP_POLICY))
        {
            return rp_bootstrap_policy_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_REF_THUMBPRINT))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_REF_THUMBPRINT);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_REF_ENCRYPTED_KEY))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_REF_ENCRYPTED_KEY);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_SIGNATURE_CONFIRMATION))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_SIGNATURE_CONFIRMATION);
            return assertion;
        }

        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_CLIENT_CHALLENGE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_CLIENT_CHALLENGE);
            return assertion;
        }

        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_SERVER_CHALLENGE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_SERVER_CHALLENGE);
            return assertion;
        }

        else if(!axutil_strcmp(localname, RP_REQUIRE_CLIENT_ENTROPY))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_REQUIRE_CLIENT_ENTROPY);
            return assertion;
        }

        else if(!axutil_strcmp(localname, RP_REQUIRE_SERVER_ENTROPHY))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_REQUIRE_SERVER_ENTROPHY);
            return assertion;
        }

        else if(!axutil_strcmp(localname, RP_MUST_SUPPORT_ISSUED_TOKENS))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_MUST_SUPPORT_ISSUED_TOKENS);
            return assertion;
        }

        else if(!axutil_strcmp(localname, RP_REQUIRE_DERIVED_KEYS))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            if(!axutil_strcmp(ns, RP_SP_NS_11))
            {
                /* derived key should be as defined in WS-SecConversation 1.0 */
                neethi_assertion_set_value(assertion, env, NULL,
                    ASSERTION_TYPE_REQUIRE_DERIVED_KEYS_SC10);
            }
            else
            {
                /* derived key should be as defined in WS-SecConversation 1.3 */
                neethi_assertion_set_value(assertion, env, NULL,
                    ASSERTION_TYPE_REQUIRE_DERIVED_KEYS_SC13);
            }
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_EXTERNAL_URI_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_REQUIRE_EXTERNAL_URI);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_SC10_SECURITY_CONTEXT_TOKEN))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_SC10_SECURITY_CONTEXT_TOKEN);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_SC13_SECURITY_CONTEXT_TOKEN))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_SC13_SECURITY_CONTEXT_TOKEN);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_ISSUER))
        {
            neethi_assertion_t *assertion = NULL;
            axis2_char_t *issuer = NULL;

            issuer = axiom_element_get_text(element, env, node);
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, issuer, ASSERTION_TYPE_ISSUER);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_EXTERNAL_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_EXTERNAL_REFERENCE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_REQUIRE_INTERNAL_REFERENCE))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_REQUIRE_INTERNAL_REFERENCE);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_ISSUED_TOKEN))
        {
            return rp_issued_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_SAML_TOKEN))
        {
            return rp_saml_token_builder_build(env, node, element);
        }
        else if(!axutil_strcmp(localname, RP_WSS_SAML_V10_TOKEN_V10))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_SAML_V10_TOKEN_V10);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_SAML_V10_TOKEN_V11))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_SAML_V10_TOKEN_V11);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_SAML_V11_TOKEN_V10))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_SAML_V11_TOKEN_V10);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_SAML_V11_TOKEN_V11))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_SAML_V11_TOKEN_V11);
            return assertion;
        }
        else if(!axutil_strcmp(localname, RP_WSS_SAML_V20_TOKEN_V11))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL, ASSERTION_TYPE_WSS_SAML_V20_TOKEN_V11);
            return assertion;
        }
    }
    else if(!axutil_strcmp(ns, RP_RAMPART_NS))
    {
        /* if namespace is Rampart Namespace */
        if(!axutil_strcmp(localname, RP_RAMPART_CONFIG))
        {
            return rp_rampart_config_builder_build(env, node, element);
        }
    }
    else if(!axutil_strcmp(ns, AXIS2_MTOM_POLICY_NS))
    {
        if(!axutil_strcmp(localname, AXIS2_OPTIMIZED_MIME_SERIALIZATION))
        {
            neethi_assertion_t *assertion = NULL;
            assertion = neethi_assertion_create(env);
            neethi_assertion_set_value(assertion, env, NULL,
                ASSERTION_TYPE_OPTIMIZED_MIME_SERIALIZATION);
            return assertion;
        }
    }
    else if((!axutil_strcmp(ns, AXIS2_RM_POLICY_10_NS)) || (!axutil_strcmp(ns,
        AXIS2_RM_POLICY_11_NS)))
    {
        if(!axutil_strcmp(localname, AXIS2_RM_RMASSERTION))
        {
            return axis2_rm_assertion_builder_build(env, node, element);
        }
    }

    /* This assertion cannot be processed */
    AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NEETHI_UNKNOWN_ASSERTION, AXIS2_FAILURE);
    AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[neethi] Unknown Assertion %s with namespace %s",
        localname, ns);
    return NULL;
}
