abapGit/src/utils/zcl_abapgit_log.clas.abap
Marc Bernard cf9da3c06d
Some checks failed
main-build / build-merged (push) Has been cancelled
main-build / auto-tag (push) Has been cancelled
main-build / coverage (push) Has been cancelled
main-build / auto-tag-artifact (push) Has been cancelled
ajson mirror / pr_ajson_changes (push) Has been cancelled
Enhance logging with message id and number (#7111)
Co-authored-by: Lars Hvam <larshp@hotmail.com>
2024-12-10 15:17:28 -05:00

328 lines
7.4 KiB
ABAP

CLASS zcl_abapgit_log DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_log .
METHODS constructor
IMPORTING
iv_title TYPE string OPTIONAL.
CLASS-METHODS from_exception
IMPORTING
io_x TYPE REF TO cx_root
RETURNING
VALUE(ro_log) TYPE REF TO zcl_abapgit_log.
PROTECTED SECTION.
TYPES:
BEGIN OF ty_log, "in order of occurrence
msg TYPE zif_abapgit_log=>ty_msg,
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 sy-msgty .
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_abapgit_log IMPLEMENTATION.
METHOD constructor.
zif_abapgit_log~set_title( iv_title ).
ENDMETHOD.
METHOD from_exception.
CREATE OBJECT ro_log.
IF io_x IS BOUND.
ro_log->zif_abapgit_log~add_exception( io_x ).
ENDIF.
ENDMETHOD.
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: <ls_log> LIKE LINE OF mt_log.
APPEND INITIAL LINE TO mt_log ASSIGNING <ls_log>.
<ls_log>-msg-text = iv_msg.
<ls_log>-msg-type = iv_type.
<ls_log>-msg-id = iv_class.
<ls_log>-msg-number = iv_number.
<ls_log>-item = is_item.
<ls_log>-exception = ix_exc.
CASE iv_type.
WHEN 'E' OR 'A' OR 'X'.
<ls_log>-msg-level = zif_abapgit_log=>c_log_level-error.
WHEN 'W'.
<ls_log>-msg-level = zif_abapgit_log=>c_log_level-warning.
WHEN 'S' OR 'I'.
<ls_log>-msg-level = zif_abapgit_log=>c_log_level-info.
WHEN OTHERS. "unknown
ASSERT 0 = 1.
ENDCASE.
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~clone.
DATA lo_log TYPE REF TO zcl_abapgit_log.
CREATE OBJECT lo_log EXPORTING iv_title = mv_title.
lo_log->mt_log = mt_log.
ri_log = lo_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_log_level.
FIELD-SYMBOLS <ls_log> LIKE LINE OF mt_log.
rv_level = zif_abapgit_log=>c_log_level-empty.
LOOP AT mt_log ASSIGNING <ls_log>.
IF <ls_log>-msg-level = zif_abapgit_log=>c_log_level-error.
rv_level = zif_abapgit_log=>c_log_level-error.
EXIT.
ELSEIF <ls_log>-msg-level > rv_level.
rv_level = <ls_log>-msg-level.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_log~get_messages.
DATA ls_msg TYPE zif_abapgit_log~ty_log_out.
FIELD-SYMBOLS <ls_log> TYPE ty_log.
LOOP AT mt_log ASSIGNING <ls_log>.
ls_msg-type = <ls_log>-msg-type.
ls_msg-id = <ls_log>-msg-id.
ls_msg-number = <ls_log>-msg-number.
ls_msg-text = <ls_log>-msg-text.
ls_msg-obj_type = <ls_log>-item-obj_type.
ls_msg-obj_name = <ls_log>-item-obj_name.
ls_msg-exception = <ls_log>-exception.
APPEND ls_msg TO rt_msg.
ENDLOOP.
DELETE ADJACENT DUPLICATES FROM rt_msg.
ENDMETHOD.
METHOD zif_abapgit_log~get_status.
DATA lr_log TYPE REF TO ty_log.
rv_status = zif_abapgit_log=>c_status-ok.
LOOP AT mt_log REFERENCE INTO lr_log.
CASE lr_log->msg-type.
WHEN 'E' OR 'A' OR 'X'.
rv_status = zif_abapgit_log=>c_status-error.
EXIT.
WHEN 'W'.
rv_status = zif_abapgit_log=>c_status-warning.
CONTINUE.
WHEN 'S' OR 'I'.
IF rv_status <> zif_abapgit_log=>c_status-warning.
rv_status = zif_abapgit_log=>c_status-ok.
ENDIF.
CONTINUE.
WHEN OTHERS. "unknown
ASSERT 0 = 1.
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~merge_with.
DATA lo_log TYPE REF TO zcl_abapgit_log.
DATA lt_log_temp LIKE lo_log->mt_log.
IF ii_log IS BOUND.
lo_log ?= ii_log.
IF iv_min_level > 0.
lt_log_temp = lo_log->mt_log.
DELETE lt_log_temp WHERE msg-level < iv_min_level.
APPEND LINES OF lt_log_temp TO mt_log.
ELSE.
APPEND LINES OF lo_log->mt_log TO mt_log.
ENDIF.
ENDIF.
ri_log = me.
ENDMETHOD.
METHOD zif_abapgit_log~set_title.
mv_title = iv_title.
ri_log = me.
ENDMETHOD.
ENDCLASS.