CLASS zcl_abapgit_log DEFINITION PUBLIC CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_log . PROTECTED SECTION. TYPES: BEGIN OF ty_msg, text TYPE string, type TYPE symsgty, END OF ty_msg . TYPES: BEGIN OF ty_log, "in order of occurrence msg TYPE ty_msg, rc TYPE balsort, item TYPE zif_abapgit_definitions=>ty_item, exception TYPE REF TO cx_root, END OF ty_log . DATA: mt_log TYPE STANDARD TABLE OF ty_log WITH DEFAULT KEY . DATA mv_title TYPE string . METHODS get_messages_status IMPORTING !it_msg TYPE zif_abapgit_log=>ty_msgs RETURNING VALUE(rv_status) TYPE symsgty . PRIVATE SECTION. ENDCLASS. CLASS ZCL_ABAPGIT_LOG IMPLEMENTATION. METHOD get_messages_status. DATA lr_msg TYPE REF TO zif_abapgit_log=>ty_msg. rv_status = 'S'. LOOP AT it_msg REFERENCE INTO lr_msg. CASE lr_msg->type. WHEN 'E' OR 'A' OR 'X'. rv_status = 'E'. "not okay EXIT. WHEN 'W'. rv_status = 'W'. "maybe CONTINUE. WHEN 'S' OR 'I'. IF rv_status <> 'W'. rv_status = 'S'. "okay ENDIF. CONTINUE. WHEN OTHERS. "unknown CONTINUE. ENDCASE. ENDLOOP. ENDMETHOD. METHOD zif_abapgit_log~add. FIELD-SYMBOLS: LIKE LINE OF mt_log. APPEND INITIAL LINE TO mt_log ASSIGNING . -msg-text = iv_msg. -msg-type = iv_type. -rc = iv_rc. -item = is_item. -exception = ix_exc. ENDMETHOD. METHOD zif_abapgit_log~add_error. zif_abapgit_log~add( iv_msg = iv_msg iv_type = 'E' is_item = is_item ). ENDMETHOD. METHOD zif_abapgit_log~add_exception. DATA lx_exc TYPE REF TO cx_root. DATA lv_msg TYPE string. lx_exc ?= ix_exc. DO. lv_msg = lx_exc->get_text( ). zif_abapgit_log~add( iv_msg = lv_msg iv_type = 'E' is_item = is_item ix_exc = lx_exc ). IF lx_exc->previous IS BOUND. lx_exc = lx_exc->previous. ELSE. EXIT. ENDIF. ENDDO. ENDMETHOD. METHOD zif_abapgit_log~add_info. zif_abapgit_log~add( iv_msg = iv_msg iv_type = 'I' is_item = is_item ). ENDMETHOD. METHOD zif_abapgit_log~add_success. zif_abapgit_log~add( iv_msg = iv_msg iv_type = 'S' is_item = is_item ). ENDMETHOD. METHOD zif_abapgit_log~add_warning. zif_abapgit_log~add( iv_msg = iv_msg iv_type = 'W' is_item = is_item ). ENDMETHOD. METHOD zif_abapgit_log~clear. CLEAR mt_log. ENDMETHOD. METHOD zif_abapgit_log~count. rv_count = lines( mt_log ). ENDMETHOD. METHOD zif_abapgit_log~get_item_status. DATA lr_log TYPE REF TO ty_log. DATA ls_msg TYPE zif_abapgit_log=>ty_msg. DATA ls_item_status TYPE zif_abapgit_log=>ty_item_status_out. DATA lr_item_status TYPE REF TO zif_abapgit_log=>ty_item_status_out. "collect all message for all objects LOOP AT mt_log REFERENCE INTO lr_log. CLEAR ls_item_status. ls_item_status-item = lr_log->item. READ TABLE rt_item_status REFERENCE INTO lr_item_status WITH KEY item-obj_type = ls_item_status-item-obj_type item-obj_name = ls_item_status-item-obj_name. IF sy-subrc <> 0. INSERT ls_item_status INTO TABLE rt_item_status. GET REFERENCE OF ls_item_status INTO lr_item_status. ENDIF. CLEAR ls_msg. ls_msg-type = lr_log->msg-type. ls_msg-text = lr_log->msg-text. INSERT ls_msg INTO TABLE lr_item_status->messages. ENDLOOP. "determine object status from object messages LOOP AT rt_item_status REFERENCE INTO lr_item_status. lr_item_status->status = get_messages_status( lr_item_status->messages ). IF lr_item_status->messages IS INITIAL. CLEAR ls_msg. ls_msg-type = 'I'. ls_msg-text = 'No message'. INSERT ls_msg INTO TABLE lr_item_status->messages. ENDIF. ENDLOOP. ENDMETHOD. METHOD zif_abapgit_log~get_messages. DATA ls_msg TYPE zif_abapgit_log~ty_log_out. FIELD-SYMBOLS TYPE ty_log. LOOP AT mt_log ASSIGNING . ls_msg-type = -msg-type. ls_msg-text = -msg-text. ls_msg-obj_type = -item-obj_type. ls_msg-obj_name = -item-obj_name. ls_msg-exception = -exception. APPEND ls_msg TO rt_msg. ENDLOOP. ENDMETHOD. METHOD zif_abapgit_log~get_status. DATA lr_log TYPE REF TO ty_log. rv_status = 'S'. LOOP AT mt_log REFERENCE INTO lr_log. CASE lr_log->msg-type. WHEN 'E' OR 'A' OR 'X'. rv_status = 'E'. "not okay EXIT. WHEN 'W'. rv_status = 'W'. "maybe CONTINUE. WHEN 'S' OR 'I'. IF rv_status <> 'W'. rv_status = 'S'. "okay ENDIF. CONTINUE. WHEN OTHERS. "unknown CONTINUE. ENDCASE. ENDLOOP. ENDMETHOD. METHOD zif_abapgit_log~get_title. rv_title = mv_title. IF rv_title IS INITIAL. rv_title = 'Log'. ENDIF. ENDMETHOD. METHOD zif_abapgit_log~has_rc. * todo, this method is only used in unit tests READ TABLE mt_log WITH KEY rc = iv_rc TRANSPORTING NO FIELDS. rv_yes = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_log~set_title. mv_title = iv_title. ENDMETHOD. ENDCLASS.