<commit_before>/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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 <axis2_disp.h>
#include <axis2_handler_desc.h>
#include <axis2_qname.h>
#include <axis2_relates_to.h>
#include <axis2_svc.h>
#include <axis2_const.h>
#include <axis2_conf_ctx.h>
#include <axis2_addr.h>
#include <axis2_utils.h>

#define AXIS2_ADDR_DISP_NAME "addressing_based_dispatcher"

axis2_status_t AXIS2_CALL
axis2_addr_disp_invoke(
    axis2_handler_t *handler,
    const axis2_env_t *env,
    struct axis2_msg_ctx *msg_ctx);

axis2_svc_t *AXIS2_CALL
axis2_addr_disp_find_svc(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env);

axis2_op_t *AXIS2_CALL
axis2_addr_disp_find_op(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env,
    axis2_svc_t *svc);

axis2_disp_t *AXIS2_CALL
axis2_addr_disp_create(
    const axis2_env_t *env)
{
    axis2_disp_t *disp = NULL;
    axis2_handler_t *handler = NULL;
    axis2_qname_t *qname = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    qname = axis2_qname_create(env, AXIS2_ADDR_DISP_NAME,
            AXIS2_DISP_NAMESPACE,
            NULL);
    if (!qname)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    disp = axis2_disp_create(env, qname);
    if (!disp)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        AXIS2_QNAME_FREE(qname, env);
        return NULL;
    }

    handler = AXIS2_DISP_GET_BASE(disp, env);
    if (!handler)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE);
        AXIS2_QNAME_FREE(qname, env);
        return NULL;
    }

    handler->ops->invoke = axis2_addr_disp_invoke;

    AXIS2_QNAME_FREE(qname, env);

    return disp;
}

axis2_svc_t *AXIS2_CALL
axis2_addr_disp_find_svc(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env)
{
    axis2_endpoint_ref_t *endpoint_ref = NULL;
    axis2_svc_t *svc = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    endpoint_ref = AXIS2_MSG_CTX_GET_TO(msg_ctx, env);

    if (endpoint_ref)
    {
        const axis2_char_t *address = NULL;

        address = AXIS2_ENDPOINT_REF_GET_ADDRESS(endpoint_ref, env);
        if (address)
        {
            axis2_char_t **url_tokens = NULL;
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                    "Checking for service using WSA enpoint address : %s", address);

            if ((AXIS2_STRCMP(AXIS2_WSA_ANONYMOUS_URL, address) == 0) ||
                    (AXIS2_STRCMP(AXIS2_WSA_NAMESPACE_SUBMISSION, address) == 0))
            {
                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
                    "Endpoint address cannot be the same as WSA namespace : %s", address);
                return NULL;
            }

            url_tokens = axis2_parse_request_url_for_svc_and_op(env, address);

            if (url_tokens)
            {
                if (url_tokens[0])
                {
                    axis2_conf_ctx_t *conf_ctx = NULL;

                    conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env);
                    if (conf_ctx)
                    {
                        axis2_conf_t *conf = NULL;
                        conf = AXIS2_CONF_CTX_GET_CONF(conf_ctx, env);
                        if (conf)
                        {
                            svc = AXIS2_CONF_GET_SVC(conf, env, url_tokens[0]);

                            if (svc)
                            {
                                AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                                        "Service found using WSA enpoint address");
                            }
                        }
                    }
                    AXIS2_FREE(env->allocator, url_tokens[0]);
                }
                if (url_tokens[1])
                {
                    AXIS2_FREE(env->allocator, url_tokens[1]);
                }
                AXIS2_FREE(env->allocator, url_tokens);
                url_tokens = NULL;
            }
        }
    }

    return svc;
}

axis2_op_t *AXIS2_CALL
axis2_addr_disp_find_op(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env,
    axis2_svc_t *svc)
{
    const axis2_char_t *action = NULL;
    axis2_qname_t *qname = NULL;
    axis2_op_t *op = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    AXIS2_PARAM_CHECK(env->error, svc, NULL);

    action = AXIS2_MSG_CTX_GET_WSA_ACTION(msg_ctx, env);

    if (action)
    {
        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                "Checking for operation using WSA Action : %s", action);

        qname = axis2_qname_create(env, action, NULL, NULL);
        op = AXIS2_SVC_GET_OP_WITH_QNAME(svc, env, qname);
        if (op)
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                    "Operation found using WSA Action");
        AXIS2_QNAME_FREE(qname, env);
    }

    return op;
}


axis2_status_t AXIS2_CALL
axis2_addr_disp_invoke(
    axis2_handler_t *handler,
    const axis2_env_t *env,
    struct axis2_msg_ctx *msg_ctx)
{
    axis2_relates_to_t *relates_to = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);

    relates_to = AXIS2_MSG_CTX_GET_RELATES_TO(msg_ctx, env);

    /** first check if we can dispatch using the relates_to */
    if (relates_to)
    {
        const axis2_char_t *relates_to_value = NULL;
        relates_to_value = AXIS2_RELATES_TO_GET_VALUE(relates_to, env);
        if (relates_to_value && AXIS2_STRCMP(relates_to_value, "") != 0)
        {
            axis2_conf_ctx_t *conf_ctx = NULL;

            conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env);
            if (conf_ctx)
            {
                axis2_op_ctx_t *op_ctx = NULL;
                const axis2_char_t *msg_id = AXIS2_MSG_CTX_GET_MSG_ID(msg_ctx, env);
                op_ctx = AXIS2_CONF_CTX_GET_OP_CTX(conf_ctx, env, msg_id);
                if (op_ctx)<commit_msg>Declared the appropriate functions static<commit_after>/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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 <axis2_disp.h>
#include <axis2_handler_desc.h>
#include <axis2_qname.h>
#include <axis2_relates_to.h>
#include <axis2_svc.h>
#include <axis2_const.h>
#include <axis2_conf_ctx.h>
#include <axis2_addr.h>
#include <axis2_utils.h>

#define AXIS2_ADDR_DISP_NAME "addressing_based_dispatcher"

static axis2_status_t AXIS2_CALL
axis2_addr_disp_invoke(
    axis2_handler_t *handler,
    const axis2_env_t *env,
    struct axis2_msg_ctx *msg_ctx);

static axis2_svc_t *AXIS2_CALL
axis2_addr_disp_find_svc(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env);

static axis2_op_t *AXIS2_CALL
axis2_addr_disp_find_op(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env,
    axis2_svc_t *svc);

axis2_disp_t *AXIS2_CALL
axis2_addr_disp_create(
    const axis2_env_t *env)
{
    axis2_disp_t *disp = NULL;
    axis2_handler_t *handler = NULL;
    axis2_qname_t *qname = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    qname = axis2_qname_create(env, AXIS2_ADDR_DISP_NAME,
            AXIS2_DISP_NAMESPACE,
            NULL);
    if (!qname)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        return NULL;
    }

    disp = axis2_disp_create(env, qname);
    if (!disp)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE);
        AXIS2_QNAME_FREE(qname, env);
        return NULL;
    }

    handler = AXIS2_DISP_GET_BASE(disp, env);
    if (!handler)
    {
        AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE);
        AXIS2_QNAME_FREE(qname, env);
        return NULL;
    }

    handler->ops->invoke = axis2_addr_disp_invoke;

    AXIS2_QNAME_FREE(qname, env);

    return disp;
}

static axis2_svc_t *AXIS2_CALL
axis2_addr_disp_find_svc(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env)
{
    axis2_endpoint_ref_t *endpoint_ref = NULL;
    axis2_svc_t *svc = NULL;

    AXIS2_ENV_CHECK(env, NULL);

    endpoint_ref = AXIS2_MSG_CTX_GET_TO(msg_ctx, env);

    if (endpoint_ref)
    {
        const axis2_char_t *address = NULL;

        address = AXIS2_ENDPOINT_REF_GET_ADDRESS(endpoint_ref, env);
        if (address)
        {
            axis2_char_t **url_tokens = NULL;
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                    "Checking for service using WSA enpoint address : %s", address);

            if ((AXIS2_STRCMP(AXIS2_WSA_ANONYMOUS_URL, address) == 0) ||
                    (AXIS2_STRCMP(AXIS2_WSA_NAMESPACE_SUBMISSION, address) == 0))
            {
                AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
                    "Endpoint address cannot be the same as WSA namespace : %s", address);
                return NULL;
            }

            url_tokens = axis2_parse_request_url_for_svc_and_op(env, address);

            if (url_tokens)
            {
                if (url_tokens[0])
                {
                    axis2_conf_ctx_t *conf_ctx = NULL;

                    conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env);
                    if (conf_ctx)
                    {
                        axis2_conf_t *conf = NULL;
                        conf = AXIS2_CONF_CTX_GET_CONF(conf_ctx, env);
                        if (conf)
                        {
                            svc = AXIS2_CONF_GET_SVC(conf, env, url_tokens[0]);

                            if (svc)
                            {
                                AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                                        "Service found using WSA enpoint address");
                            }
                        }
                    }
                    AXIS2_FREE(env->allocator, url_tokens[0]);
                }
                if (url_tokens[1])
                {
                    AXIS2_FREE(env->allocator, url_tokens[1]);
                }
                AXIS2_FREE(env->allocator, url_tokens);
                url_tokens = NULL;
            }
        }
    }

    return svc;
}

static axis2_op_t *AXIS2_CALL
axis2_addr_disp_find_op(
    axis2_msg_ctx_t *msg_ctx,
    const axis2_env_t *env,
    axis2_svc_t *svc)
{
    const axis2_char_t *action = NULL;
    axis2_qname_t *qname = NULL;
    axis2_op_t *op = NULL;

    AXIS2_ENV_CHECK(env, NULL);
    AXIS2_PARAM_CHECK(env->error, svc, NULL);

    action = AXIS2_MSG_CTX_GET_WSA_ACTION(msg_ctx, env);

    if (action)
    {
        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                "Checking for operation using WSA Action : %s", action);

        qname = axis2_qname_create(env, action, NULL, NULL);
        op = AXIS2_SVC_GET_OP_WITH_QNAME(svc, env, qname);
        if (op)
            AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI,
                    "Operation found using WSA Action");
        AXIS2_QNAME_FREE(qname, env);
    }

    return op;
}


static axis2_status_t AXIS2_CALL
axis2_addr_disp_invoke(
    axis2_handler_t *handler,
    const axis2_env_t *env,
    struct axis2_msg_ctx *msg_ctx)
{
    axis2_relates_to_t *relates_to = NULL;

    AXIS2_ENV_CHECK(env, AXIS2_FAILURE);

    relates_to = AXIS2_MSG_CTX_GET_RELATES_TO(msg_ctx, env);

    /** first check if we can dispatch using the relates_to */
    if (relates_to)
    {
        const axis2_char_t *relates_to_value = NULL;
        relates_to_value = AXIS2_RELATES_TO_GET_VALUE(relates_to, env);
        if (relates_to_value && AXIS2_STRCMP(relates_to_value, "") != 0)
        {
            axis2_conf_ctx_t *conf_ctx = NULL;

            conf_ctx = AXIS2_MSG_CTX_GET_CONF_CTX(msg_ctx, env);
            if (conf_ctx)
            {
                axis2_op_ctx_t *op_ctx = NULL;
                const axis2_char_t *msg_id = AXIS2_MSG_CTX_GET_MSG_ID(msg_ctx, env);
                op_ctx = AXIS2_CONF_CTX_GET_OP_CTX(conf_ctx, env, msg_id);
                if (op_ctx)
{'fraction_non_alphanumeric': 0.08397065709380365, 'fraction_numerical': 0.022163258935539255, 'mean_word_length': 2.2222780990696505, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 49, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6936546', 'n_tokens_mistral': 4762, 'n_tokens_neox': 4522, 'n_words': 879}