/* * 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 #include #include #include #include static axis2_status_t axis2_phase_add_unique( const axutil_env_t * env, axutil_array_list_t * list, axis2_handler_t * handler); static axis2_status_t axis2_phase_remove_unique( const axutil_env_t * env, axutil_array_list_t * list, axis2_handler_t * handler); struct axis2_phase { /** phase name */ axis2_char_t *name; /** array list of handlers */ axutil_array_list_t *handlers; /** first handler of phase */ axis2_handler_t *first_handler; /** first handler of phase set? */ axis2_bool_t first_handler_set; /** last handler of phase */ axis2_handler_t *last_handler; /** last handler of phase set? */ axis2_bool_t last_handler_set; /** * handler_first and handler_last are the same handler * that is for this phase there is only one handler */ axis2_bool_t is_one_handler; int ref; }; AXIS2_EXTERN axis2_phase_t *AXIS2_CALL axis2_phase_create( const axutil_env_t * env, const axis2_char_t * phase_name) { axis2_phase_t *phase = NULL; phase = AXIS2_MALLOC(env->allocator, sizeof(axis2_phase_t)); if(!phase) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory"); return NULL; } phase->name = NULL; phase->handlers = NULL; phase->first_handler = NULL; phase->first_handler_set = AXIS2_FALSE; phase->last_handler = NULL; phase->last_handler_set = AXIS2_FALSE; phase->is_one_handler = AXIS2_FALSE; phase->ref = 1; phase->handlers = axutil_array_list_create(env, 10); if(!(phase->handlers)) { /** error is already set by last method array list container create */ axis2_phase_free(phase, env); return NULL; } if(phase_name) { phase->name = axutil_strdup(env, phase_name); if(!(phase->name)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_NO_MEMORY, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "No memory"); axis2_phase_free(phase, env); return NULL; } } return phase; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_add_handler_at( axis2_phase_t * phase, const axutil_env_t * env, const int index, axis2_handler_t * handler) { AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "axis2_handler_t *%s added to the index %d of the phase %s", axutil_string_get_buffer( axis2_handler_get_name(handler, env), env), index, phase->name); return axutil_array_list_add_at(phase->handlers, env, index, handler); } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_add_handler( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { AXIS2_LOG_INFO(env->log, "Handler %s added to phase %s", axutil_string_get_buffer( axis2_handler_get_name(handler, env), env), phase->name); return axis2_phase_add_unique(env, phase->handlers, handler); } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_remove_handler( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { AXIS2_LOG_INFO(env->log, "Handler %s romoved from phase %s", axutil_string_get_buffer( axis2_handler_get_name(handler, env), env), phase->name); return axis2_phase_remove_unique(env, phase->handlers, handler); } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_invoke( axis2_phase_t * phase, const axutil_env_t * env, axis2_msg_ctx_t * msg_ctx) { int index = 0, size = 0; axis2_status_t status = AXIS2_SUCCESS; AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Entry:axis2_phase_invoke"); axis2_msg_ctx_set_paused_phase_name(msg_ctx, env, phase->name); if(phase->first_handler) { if(axis2_msg_ctx_is_paused(msg_ctx, env)) { AXIS2_LOG_INFO(env->log, "Message context is paused in the phase %s", phase->name); return AXIS2_SUCCESS; } else { const axis2_char_t *handler_name = axutil_string_get_buffer(axis2_handler_get_name( phase->first_handler, env), env); AXIS2_LOG_INFO(env->log, "Invoke the first handler %s within the phase %s", handler_name, phase->name); status = axis2_handler_invoke(phase->first_handler, env, msg_ctx); if(!status) { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler %s invoke failed within phase %s", handler_name, phase->name); return status; } } } /* Invoking the rest of handlers except first_handler and last_handler */ size = axutil_array_list_size(phase->handlers, env); while(index < size) { if(axis2_msg_ctx_is_paused(msg_ctx, env)) { break; } else { axis2_handler_t *handler = (axis2_handler_t *)axutil_array_list_get(phase->handlers, env, index); if(handler) { const axis2_char_t *handler_name = axutil_string_get_buffer(axis2_handler_get_name( handler, env), env); AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Invoke the handler %s within the phase %s", handler_name, phase->name); /* Test code. This is used when valgrind is used to find leaks in Axis2/C modules.*/ /*if(!axutil_strcmp(handler_name, "SandeshaGlobalInHandler") || !axutil_strcmp( handler_name, "SandeshaInHandler")) { AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "dam_handler_name %s. dam_phase_name %s", handler_name, phase->name); if(!axutil_strcmp(handler_name, "SandeshaGlobalInHandler")) { status = sandesha2_global_in_handler_invoke(phase->first_handler, env, msg_ctx); } if(!axutil_strcmp(handler_name, "SandeshaInHandler")) { status = sandesha2_in_handler_invoke(phase->first_handler, env, msg_ctx); } } else*/ status = axis2_handler_invoke(handler, env, msg_ctx); if(!status) { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler %s invoke failed within phase %s", handler_name, phase->name); return status; } /* index increment should be done after the invoke function. If the invocation failed this handler is taken care of and no need to revoke again */ index++; axis2_msg_ctx_set_current_handler_index(msg_ctx, env, index); } } } /* If phase last handler is there invoke it here */ if(phase->last_handler) { if(axis2_msg_ctx_is_paused(msg_ctx, env)) { AXIS2_LOG_INFO(env->log, "Message context is paused in the phase %s", phase->name); return AXIS2_SUCCESS; } else { const axis2_char_t *handler_name = axutil_string_get_buffer(axis2_handler_get_name( phase->last_handler, env), env); AXIS2_LOG_INFO(env->log, "Invoke the last handler %s within the phase %s", handler_name, phase->name); status = axis2_handler_invoke(phase->last_handler, env, msg_ctx); if(!status) { AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler %s invoke failed within phase %s", handler_name, phase->name); return status; } } } AXIS2_LOG_TRACE(env->log, AXIS2_LOG_SI, "Exit:axis2_phase_invoke"); return AXIS2_SUCCESS; } AXIS2_EXTERN const axis2_char_t *AXIS2_CALL axis2_phase_get_name( const axis2_phase_t * phase, const axutil_env_t * env) { return phase->name; } AXIS2_EXTERN int AXIS2_CALL axis2_phase_get_handler_count( const axis2_phase_t * phase, const axutil_env_t * env) { return axutil_array_list_size(phase->handlers, env); } AXIS2_EXTERN int AXIS2_CALL _axis2_phase_get_before_after( axis2_handler_t * handler, const axutil_env_t * env) { const axis2_char_t *before = NULL, *after = NULL; axis2_handler_desc_t *handler_desc = NULL; axis2_phase_rule_t *rules = NULL; const axis2_char_t *name = axutil_string_get_buffer(axis2_handler_get_name(handler, env), env); handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set for the Handler %s", name); return AXIS2_FAILURE; } rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler rules are not set for the Handler Description %s", name); return AXIS2_FAILURE; } before = axis2_phase_rule_get_before(rules, env); after = axis2_phase_rule_get_after(rules, env); if(before && after) { if(!axutil_strcmp(before, after)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_BEFORE_AFTER_HANDLERS_SAME, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Both before and after handlers cannot be the same"); return AXIS2_FAILURE; } return AXIS2_PHASE_BOTH_BEFORE_AFTER; } else if(before) { return AXIS2_PHASE_BEFORE; } else if(after) { return AXIS2_PHASE_AFTER; } else { return AXIS2_PHASE_ANYWHERE; } } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_set_first_handler( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { const axis2_char_t *handler_name = axutil_string_get_buffer( axis2_handler_get_name(handler, env), env); const axis2_char_t *phase_name = axis2_phase_get_name(phase, env); if(phase->first_handler_set) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_PHASE_FIRST_HANDLER_ALREADY_SET, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "First handler of phase already set, so cannot set handler %s " "in to the phase %s as first handler", handler_name, phase_name); return AXIS2_FAILURE; } else { if(_axis2_phase_get_before_after(handler, env) != AXIS2_PHASE_ANYWHERE) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_PHASE_FIRST_HANDLER, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid first handler %s set for the Phase %s", handler_name, phase_name); return AXIS2_FAILURE; } phase->first_handler = handler; phase->first_handler_set = AXIS2_TRUE; } return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_set_last_handler( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { const axis2_char_t *handler_name = axutil_string_get_buffer( axis2_handler_get_name(handler, env), env); const axis2_char_t *phase_name = axis2_phase_get_name(phase, env); if(phase->last_handler_set) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_PHASE_LAST_HANDLER_ALREADY_SET, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Last handler of phase already set, so cannot set handler %s " "in to the phase %s as last handler", handler_name, phase_name); return AXIS2_FAILURE; } else { if(_axis2_phase_get_before_after(handler, env) != AXIS2_PHASE_ANYWHERE) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_PHASE_LAST_HANDLER, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid last handler %s set for the Phase %s", handler_name, phase_name); return AXIS2_FAILURE; } phase->last_handler = handler; phase->last_handler_set = AXIS2_TRUE; } return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_add_handler_desc( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_desc_t * handler_desc) { axis2_phase_rule_t *rules = NULL; axis2_handler_t *handler = NULL; axis2_status_t status = AXIS2_SUCCESS; axis2_bool_t first = AXIS2_FALSE, last = AXIS2_FALSE; const axis2_char_t *handler_desc_name = axutil_string_get_buffer(axis2_handler_desc_get_name( handler_desc, env), env); if(phase->is_one_handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_PHASE_ADD_HANDLER_INVALID, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Only one handler allowed for phase %s, adding handler %s is not " "allowed", phase->name, handler_desc_name); return AXIS2_FAILURE; } else { rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler rules are not set for the Hanlder Description %s " "within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } first = axis2_phase_rule_is_first(rules, env); last = axis2_phase_rule_is_last(rules, env); if(first && last) { if(axutil_array_list_size(phase->handlers, env) > 0) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_RULES, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid handler rules, so unable to add handler %s to " "phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } handler = axis2_handler_desc_get_handler(handler_desc, env); if(!handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler is not set for the Handler Description %s " "within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } /*status = axutil_array_list_add(phase->handlers, env, handler); */ status = axis2_phase_add_unique(env, phase->handlers, handler); if(status) phase->is_one_handler = AXIS2_TRUE; return status; } else if(first) { handler = axis2_handler_desc_get_handler(handler_desc, env); if(!handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler is not set for the Handler Description %s " "within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } return axis2_phase_set_first_handler(phase, env, handler); } else if(last) { handler = axis2_handler_desc_get_handler(handler_desc, env); if(!handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler is not set for the Handler Description %s " "within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } return axis2_phase_set_last_handler(phase, env, handler); } else { handler = axis2_handler_desc_get_handler(handler_desc, env); if(!handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler is not set for the Handler Description %s " "within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } return axis2_phase_insert_handler_desc(phase, env, handler_desc); } } } AXIS2_EXTERN axis2_bool_t AXIS2_CALL _axis2_phase_is_valid_before( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { axis2_phase_rule_t *rules = NULL; axis2_handler_desc_t *handler_desc = NULL; const axis2_char_t *first_handler_name = NULL, *before = NULL; if(phase->first_handler) { handler_desc = axis2_handler_get_handler_desc(phase->first_handler, env); if(!handler_desc) return AXIS2_TRUE; first_handler_name = axutil_string_get_buffer( axis2_handler_desc_get_name(handler_desc, env), env); if(!first_handler_name) return AXIS2_TRUE; handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) return AXIS2_TRUE; rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) return AXIS2_TRUE; before = axis2_phase_rule_get_before(rules, env); if(!before) return AXIS2_TRUE; if(!axutil_strcmp(first_handler_name, before)) return AXIS2_FALSE; else return AXIS2_TRUE; } return AXIS2_TRUE; } AXIS2_EXTERN axis2_bool_t AXIS2_CALL _axis2_phase_is_valid_after( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { axis2_phase_rule_t *rules = NULL; axis2_handler_desc_t *handler_desc = NULL; const axis2_char_t *last_handler_name = NULL, *after = NULL; if(phase->last_handler) { handler_desc = axis2_handler_get_handler_desc(phase->last_handler, env); if(!handler_desc) return AXIS2_TRUE; last_handler_name = axutil_string_get_buffer( axis2_handler_desc_get_name(handler_desc, env), env); if(!last_handler_name) return AXIS2_TRUE; handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) return AXIS2_TRUE; rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) return AXIS2_TRUE; after = axis2_phase_rule_get_after(rules, env); if(!after) return AXIS2_TRUE; if(!axutil_strcmp(last_handler_name, after)) return AXIS2_FALSE; else return AXIS2_TRUE; } return AXIS2_TRUE; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_insert_before( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { axis2_phase_rule_t *rules = NULL; axis2_handler_desc_t *handler_desc = NULL; const axis2_char_t *handler_name = NULL, *before = NULL; int i = 0; int size = 0; const axis2_char_t *name = axutil_string_get_buffer(axis2_handler_get_name(handler, env), env); const axis2_char_t *handler_desc_name = NULL; handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the handler %s within phase %s", name, phase->name); return AXIS2_FAILURE; } handler_desc_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler rules are not set in the handler description %s within " "phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } before = axis2_phase_rule_get_before(rules, env); if(!before) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Rule `before` is not set in the handler rules for handler %s " "within phase %s", name, phase->name); return AXIS2_FAILURE; } if(phase->last_handler) { const axis2_char_t *last_handler_name = axutil_string_get_buffer(axis2_handler_get_name( phase->last_handler, env), env); handler_desc = axis2_handler_get_handler_desc(phase->last_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the last handler %s of " "phase %s", last_handler_name, phase->name); return AXIS2_FAILURE; } handler_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); if(!handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler description for " "last handler %s within phase %s", last_handler_name, phase->name); return AXIS2_FAILURE; } if(!axutil_strcmp(before, handler_name)) { /*return axutil_array_list_add(phase->handlers, env, handler); */ return axis2_phase_add_unique(env, phase->handlers, handler); } } size = axutil_array_list_size(phase->handlers, env); for(i = 0; i < size; i++) { axis2_handler_t *temp_handler = (axis2_handler_t *)axutil_array_list_get(phase->handlers, env, i); if(temp_handler) { const axis2_char_t *temp_handler_name = axutil_string_get_buffer( axis2_handler_get_name(temp_handler, env), env); handler_desc = axis2_handler_get_handler_desc(temp_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler Description is not set for the Handler %s " "within phase %s", temp_handler_name, phase->name); return AXIS2_FAILURE; } handler_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); if(!handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler description for " "handler %s within phase %s", temp_handler_name, phase->name); return AXIS2_FAILURE; } if(!axutil_strcmp(before, handler_name)) { return axutil_array_list_add_at(phase->handlers, env, i, handler); } } } /* add as the last handler */ /* return axutil_array_list_add(phase->handlers, env, handler); */ return axis2_phase_add_unique(env, phase->handlers, handler); } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_insert_after( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { axis2_phase_rule_t *rules = NULL; axis2_handler_desc_t *handler_desc = NULL; const axis2_char_t *handler_name = NULL; const axis2_char_t *after = NULL; int i = 0; int size = 0; const axis2_char_t *name = axutil_string_get_buffer(axis2_handler_get_name(handler, env), env); const axis2_char_t *handler_desc_name = NULL; handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the handler %s within phase %s", name, phase->name); return AXIS2_FAILURE; } handler_desc_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler rules are not set in the handler description %s within " "phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } after = axis2_phase_rule_get_after(rules, env); if(!after) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Rule `after` is not set in the handler rules for handler desc " "%s within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } if(phase->first_handler) { const axis2_char_t *first_handler_name = axutil_string_get_buffer(axis2_handler_get_name( phase->first_handler, env), env); handler_desc = axis2_handler_get_handler_desc(phase->first_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the first handler %s " "within phase %s", first_handler_name, phase->name); return AXIS2_FAILURE; } handler_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); if(!handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler description for " "handler %s within phase %s", name, phase->name); return AXIS2_FAILURE; } if(!axutil_strcmp(after, handler_name)) { return axutil_array_list_add_at(phase->handlers, env, 0, handler); } } size = axutil_array_list_size(phase->handlers, env); for(i = 0; i < size; i++) { axis2_handler_t *temp_handler = (axis2_handler_t *)axutil_array_list_get(phase->handlers, env, i); if(temp_handler) { const axis2_char_t *temp_handler_name = axutil_string_get_buffer( axis2_handler_get_name(temp_handler, env), env); handler_desc = axis2_handler_get_handler_desc(temp_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the handler %s within" " phase %s", temp_handler_name, phase->name); return AXIS2_FAILURE; } handler_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); if(!handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler description %s " "within phase %s", temp_handler_name, phase->name); return AXIS2_FAILURE; } if(!axutil_strcmp(after, handler_name)) { if(i == (size - 1)) { return axis2_phase_add_unique(env, phase->handlers, handler); } else return axutil_array_list_add_at(phase->handlers, env, i + 1, handler); } } } if(size > 0) return axutil_array_list_add_at(phase->handlers, env, 0, handler); else { return axis2_phase_add_unique(env, phase->handlers, handler); } } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_insert_before_and_after( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_t * handler) { int before = -1; int after = -1; axis2_phase_rule_t *rules = NULL; axis2_handler_desc_t *handler_desc = NULL; const axis2_char_t *before_handler_name = NULL, *after_handler_name = NULL, *after_name = NULL, *before_name = NULL, *handler_name = NULL; int i = 0; int size = 0; const axis2_char_t *name = axutil_string_get_buffer(axis2_handler_get_name(handler, env), env); const axis2_char_t *handler_desc_name = NULL; handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the handler %s within phase %s", name, phase->name); return AXIS2_FAILURE; } handler_desc_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); rules = axis2_handler_desc_get_rules(handler_desc, env); if(!rules) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler rules are not set in the handler description %s within " "phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } before_name = axis2_phase_rule_get_before(rules, env); if(!before_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Rule `before` is not set in the handler rules for handler desc " " %s within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } after_name = axis2_phase_rule_get_after(rules, env); if(!after_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Rule `after` is not set in the handler rules for handler desc " "%s within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } if(phase->first_handler) { const axis2_char_t *first_handler_name = axutil_string_get_buffer(axis2_handler_get_name( phase->first_handler, env), env); handler_desc = axis2_handler_get_handler_desc(phase->first_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the first handler %s " "within phase %s", first_handler_name, phase->name); return AXIS2_FAILURE; } before_handler_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); if(!before_handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler description for the " "first handler %s within phase %s", first_handler_name, phase->name); return AXIS2_FAILURE; } } if(phase->last_handler) { const axis2_char_t *last_handler_name = axutil_string_get_buffer(axis2_handler_get_name( phase->last_handler, env), env); handler_desc = axis2_handler_get_handler_desc(phase->last_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description is not set in the last handler %s " "within phase %s", last_handler_name, phase->name); return AXIS2_FAILURE; } after_handler_name = axutil_string_get_buffer( axis2_handler_desc_get_name(handler_desc, env), env); if(!after_handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler description for the " "last handler %s within phase %s", last_handler_name, phase->name); return AXIS2_FAILURE; } } if(before_handler_name && after_handler_name) { if(!axutil_strcmp(before_handler_name, before_name) && !axutil_strcmp(after_handler_name, after_name)) { return axis2_phase_add_unique(env, phase->handlers, handler); } } if(after_handler_name) { if(!axutil_strcmp(after_handler_name, after_name)) after = 0; } size = axutil_array_list_size(phase->handlers, env); if(after_handler_name) { if(!axutil_strcmp(before_handler_name, before_name)) before = size; } for(i = 0; i < size; i++) { axis2_handler_t *temp_handler = (axis2_handler_t *)axutil_array_list_get(phase->handlers, env, i); if(temp_handler) { const axis2_char_t *temp_handler_name = axutil_string_get_buffer( axis2_handler_get_name(temp_handler, env), env); handler_desc = axis2_handler_get_handler_desc(temp_handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler Description is not set for the Handler %s " "within phase %s", temp_handler_name, phase->name); return AXIS2_FAILURE; } handler_name = axutil_string_get_buffer(axis2_handler_desc_get_name(handler_desc, env), env); if(!handler_name) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler name is not set in the handler Description for " "handler %s within phase %s", temp_handler_name, phase->name); return AXIS2_FAILURE; } if(!axutil_strcmp(handler_name, after_name)) after = i; if(!axutil_strcmp(handler_name, before_name)) before = i; } if((after >= 0) && (before >= 0)) { /*both the before and after indexes have been found */ if(after > before) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Both the before and after indexes have been found and " "`after` comes before `before` which is wrong within " "phase %s", phase->name); return AXIS2_FAILURE; } else { if(after + 1 < size) { return axutil_array_list_add_at(phase->handlers, env, after + 1, handler); } else { return axis2_phase_add_unique(env, phase->handlers, handler); } } } } return axis2_phase_add_unique(env, phase->handlers, handler); } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_insert_handler_desc( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_desc_t * handler_desc) { int type = 0; axis2_handler_t *handler = NULL; axis2_status_t status = AXIS2_FAILURE; const axis2_char_t *handler_desc_name = axutil_string_get_buffer(axis2_handler_desc_get_name( handler_desc, env), env); const axis2_char_t *handler_name = NULL; handler = axis2_handler_desc_get_handler(handler_desc, env); if(!handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler is not set in the handler description %s", handler_desc_name); return AXIS2_FAILURE; } handler_name = axutil_string_get_buffer(axis2_handler_get_name(handler, env), env); if(!_axis2_phase_is_valid_after(phase, env, handler)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid Handler State for the handler %s within the phase %s", handler_name, phase->name); return AXIS2_FAILURE; } if(!_axis2_phase_is_valid_before(phase, env, handler)) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid Handler State for the handler %s within the phase %s", handler_name, phase->name); return AXIS2_FAILURE; } type = _axis2_phase_get_before_after(handler, env); switch(type) { case 0: /*AXIS2_BOTH_BEFORE_AFTER: */ status = axis2_phase_insert_before_and_after(phase, env, handler); break; case 1: /*AXIS2_BEFORE: */ status = axis2_phase_insert_before(phase, env, handler); break; case 2: /*AXIS2_AFTER: */ status = axis2_phase_insert_after(phase, env, handler); break; case 3: /*AXIS2_ANYWHERE: */ status = axis2_phase_add_unique(env, phase->handlers, handler); break; default: AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler description %s insertion failed within the phase %s", handler_desc_name, phase->name); status = AXIS2_FAILURE; break; } return status; } AXIS2_EXTERN axutil_array_list_t *AXIS2_CALL axis2_phase_get_all_handlers( const axis2_phase_t * phase, const axutil_env_t * env) { return phase->handlers; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_invoke_start_from_handler( axis2_phase_t * phase, const axutil_env_t * env, const int paused_handler_index, axis2_msg_ctx_t * msg_ctx) { int i = 0, size = 0; axis2_status_t status = AXIS2_SUCCESS; axis2_msg_ctx_set_paused_phase_name(msg_ctx, env, phase->name); size = axutil_array_list_size(phase->handlers, env); for(i = paused_handler_index; i < size; i++) { axis2_handler_t *handler = (axis2_handler_t *)axutil_array_list_get(phase->handlers, env, i); if(handler) { const axis2_char_t *handler_name = axutil_string_get_buffer(axis2_handler_get_name( handler, env), env); int index = -1; axis2_handler_desc_t *handler_desc = axis2_handler_get_handler_desc(handler, env); if(!handler_desc) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_HANDLER_STATE, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Invalid Handler State for the handler %s within phase %s", handler_name, phase->name); return AXIS2_FAILURE; } axis2_handler_invoke(handler, env, msg_ctx); index = axis2_msg_ctx_get_current_handler_index(msg_ctx, env); axis2_msg_ctx_set_current_handler_index(msg_ctx, env, (index + 1)); } } return status; } AXIS2_EXTERN void AXIS2_CALL axis2_phase_free( axis2_phase_t * phase, const axutil_env_t * env) { if(--(phase->ref) > 0) { return; } if(phase->name) { AXIS2_FREE(env->allocator, phase->name); } if(phase->handlers) { axutil_array_list_free(phase->handlers, env); } AXIS2_FREE(env->allocator, phase); return; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_remove_handler_desc( axis2_phase_t * phase, const axutil_env_t * env, axis2_handler_desc_t * handler_desc) { axis2_handler_t *handler; const axis2_char_t *handler_desc_name = axutil_string_get_buffer(axis2_handler_desc_get_name( handler_desc, env), env); handler = axis2_handler_desc_get_handler(handler_desc, env); if(!handler) { AXIS2_ERROR_SET(env->error, AXIS2_ERROR_INVALID_NULL_PARAM, AXIS2_FAILURE); AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "Handler is not set in the Handler Description %s within phase %s", handler_desc_name, phase->name); return AXIS2_FAILURE; } return axis2_phase_remove_unique(env, phase->handlers, handler); } static axis2_status_t axis2_phase_add_unique( const axutil_env_t * env, axutil_array_list_t * list, axis2_handler_t * handler) { int i = 0, size = 0; axis2_bool_t add_handler = AXIS2_TRUE; const axutil_string_t *handler_name = NULL; handler_name = axis2_handler_get_name(handler, env); size = axutil_array_list_size(list, env); for(i = 0; i < size; i++) { axis2_handler_t *obj = NULL; const axutil_string_t *obj_name = NULL; obj = (axis2_handler_t *)axutil_array_list_get(list, env, i); obj_name = axis2_handler_get_name(obj, env); if(obj == handler) { add_handler = AXIS2_FALSE; break; } else if(!axutil_strcmp(axutil_string_get_buffer(handler_name, env), axutil_string_get_buffer(obj_name, env))) { add_handler = AXIS2_FALSE; break; } } if(add_handler) axutil_array_list_add(list, env, handler); return AXIS2_SUCCESS; } static axis2_status_t axis2_phase_remove_unique( const axutil_env_t * env, axutil_array_list_t * list, axis2_handler_t * handler) { int i = 0, size = 0; axis2_bool_t remove_handler = AXIS2_FALSE; const axutil_string_t *handler_name = NULL; handler_name = axis2_handler_get_name(handler, env); size = axutil_array_list_size(list, env); for(i = 0; i < size; i++) { axis2_handler_t *obj = NULL; const axutil_string_t *obj_name = NULL; obj = (axis2_handler_t *)axutil_array_list_get(list, env, i); obj_name = axis2_handler_get_name(obj, env); if(obj == handler) { remove_handler = AXIS2_TRUE; break; } else if(!axutil_strcmp(axutil_string_get_buffer(handler_name, env), axutil_string_get_buffer(obj_name, env))) { remove_handler = AXIS2_TRUE; break; } } if(remove_handler) axutil_array_list_remove(list, env, i); return AXIS2_SUCCESS; } AXIS2_EXTERN axis2_status_t AXIS2_CALL axis2_phase_increment_ref( axis2_phase_t * phase, const axutil_env_t * env) { phase->ref++; return AXIS2_SUCCESS; }