diff --git a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap index c0f4adbe2..c05c43f20 100644 --- a/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap +++ b/src/ui/zcl_abapgit_gui_chunk_lib.clas.abap @@ -324,19 +324,19 @@ CLASS ZCL_ABAPGIT_GUI_CHUNK_LIB IMPLEMENTATION. lv_longtext = ix_error->if_message~get_longtext( abap_true ). REPLACE FIRST OCCURRENCE OF REGEX - |({ zcl_abapgit_message_helper=>gc_section_text-cause }{ cl_abap_char_utilities=>newline })| + |({ zcx_abapgit_exception=>gc_section_text-cause }{ cl_abap_char_utilities=>newline })| IN lv_longtext WITH |

$1

|. REPLACE FIRST OCCURRENCE OF REGEX - |({ zcl_abapgit_message_helper=>gc_section_text-system_response }{ cl_abap_char_utilities=>newline })| + |({ zcx_abapgit_exception=>gc_section_text-system_response }{ cl_abap_char_utilities=>newline })| IN lv_longtext WITH |

$1

|. REPLACE FIRST OCCURRENCE OF REGEX - |({ zcl_abapgit_message_helper=>gc_section_text-what_to_do }{ cl_abap_char_utilities=>newline })| + |({ zcx_abapgit_exception=>gc_section_text-what_to_do }{ cl_abap_char_utilities=>newline })| IN lv_longtext WITH |

$1

|. REPLACE FIRST OCCURRENCE OF REGEX - |({ zcl_abapgit_message_helper=>gc_section_text-sys_admin }{ cl_abap_char_utilities=>newline })| + |({ zcx_abapgit_exception=>gc_section_text-sys_admin }{ cl_abap_char_utilities=>newline })| IN lv_longtext WITH |

$1

|. ri_html->add( |
| ). diff --git a/src/zcl_abapgit_message_helper.clas.abap b/src/zcl_abapgit_message_helper.clas.abap deleted file mode 100644 index 8a8899b6a..000000000 --- a/src/zcl_abapgit_message_helper.clas.abap +++ /dev/null @@ -1,373 +0,0 @@ -CLASS zcl_abapgit_message_helper DEFINITION - PUBLIC - FINAL - CREATE PUBLIC . - - PUBLIC SECTION. - - CONSTANTS: - BEGIN OF gc_section_text, - cause TYPE string VALUE `Cause`, - system_response TYPE string VALUE `System response`, - what_to_do TYPE string VALUE `Procedure`, - sys_admin TYPE string VALUE `System administration`, - END OF gc_section_text . - CONSTANTS: - BEGIN OF gc_section_token, - cause TYPE string VALUE `&CAUSE&`, - system_response TYPE string VALUE `&SYSTEM_RESPONSE&`, - what_to_do TYPE string VALUE `&WHAT_TO_DO&`, - sys_admin TYPE string VALUE `&SYS_ADMIN&`, - END OF gc_section_token . - - CLASS-METHODS set_msg_vars_for_clike - IMPORTING - !iv_text TYPE string . - METHODS constructor - IMPORTING - !io_exception TYPE REF TO zcx_abapgit_exception . - METHODS get_t100_longtext - RETURNING - VALUE(rv_longtext) TYPE string . - PROTECTED SECTION. - PRIVATE SECTION. - - TYPES: - BEGIN OF ty_msg, - msgv1 TYPE symsgv, - msgv2 TYPE symsgv, - msgv3 TYPE symsgv, - msgv4 TYPE symsgv, - END OF ty_msg . - - DATA: - mo_exception TYPE REF TO zcx_abapgit_exception, - ms_t100key TYPE scx_t100key. - - CLASS-METHODS split_text - IMPORTING - !iv_text TYPE string - RETURNING - VALUE(rs_msg) TYPE ty_msg . - METHODS itf_to_string - IMPORTING - !it_itf TYPE tline_tab - RETURNING - VALUE(rv_result) TYPE string . - METHODS get_t100_longtext_itf - RETURNING - VALUE(rt_itf) TYPE tline_tab . - METHODS remove_empty_section - IMPORTING - !iv_tabix_from TYPE i - !iv_tabix_to TYPE i - CHANGING - !ct_itf TYPE tline_tab . - METHODS replace_section_head_with_text - CHANGING - !cs_itf TYPE tline . - METHODS set_single_msg_var - IMPORTING - !iv_arg TYPE clike - RETURNING - VALUE(rv_target) TYPE symsgv . - METHODS set_single_msg_var_clike - IMPORTING - !iv_arg TYPE clike - RETURNING - VALUE(rv_target) TYPE symsgv . - METHODS set_single_msg_var_numeric - IMPORTING - !iv_arg TYPE numeric - RETURNING - VALUE(rv_target) TYPE symsgv . - METHODS set_single_msg_var_xseq - IMPORTING - !iv_arg TYPE xsequence - RETURNING - VALUE(rv_target) TYPE symsgv . -ENDCLASS. - - - -CLASS ZCL_ABAPGIT_MESSAGE_HELPER IMPLEMENTATION. - - - METHOD constructor. - - mo_exception = io_exception. - ms_t100key = io_exception->if_t100_message~t100key. - - ENDMETHOD. - - - METHOD get_t100_longtext. - -* method is called dynamically from ZCX_ABAPGIT_EXCEPTION - - rv_longtext = itf_to_string( get_t100_longtext_itf( ) ). - - ENDMETHOD. - - - METHOD get_t100_longtext_itf. - - DATA: lv_docu_key TYPE doku_obj. - - lv_docu_key = ms_t100key-msgid && ms_t100key-msgno. - - CALL FUNCTION 'DOCU_GET' - EXPORTING - id = 'NA' - langu = sy-langu - object = lv_docu_key - typ = 'E' - TABLES - line = rt_itf - EXCEPTIONS - OTHERS = 1. - - IF sy-subrc = 0. - sy-msgv1 = set_single_msg_var( iv_arg = ms_t100key-attr1 ). - - REPLACE ALL OCCURRENCES OF '&V1&' IN TABLE rt_itf WITH sy-msgv1. - - sy-msgv2 = set_single_msg_var( iv_arg = ms_t100key-attr2 ). - - REPLACE ALL OCCURRENCES OF '&V2&' IN TABLE rt_itf WITH sy-msgv2. - - sy-msgv3 = set_single_msg_var( iv_arg = ms_t100key-attr3 ). - - REPLACE ALL OCCURRENCES OF '&V3&' IN TABLE rt_itf WITH sy-msgv3. - - sy-msgv4 = set_single_msg_var( iv_arg = ms_t100key-attr4 ). - - REPLACE ALL OCCURRENCES OF '&V4&' IN TABLE rt_itf WITH sy-msgv4. - ENDIF. - - ENDMETHOD. - - - METHOD itf_to_string. - - CONSTANTS: lc_format_section TYPE string VALUE 'U1'. - - DATA: - lt_stream TYPE TABLE OF tdline, - lt_string TYPE TABLE OF string, - lv_string LIKE LINE OF lt_string, - lt_itf TYPE tline_tab, - lv_has_content TYPE abap_bool, - lv_tabix_from TYPE syst-tabix, - lv_tabix_to TYPE syst-tabix. - - FIELD-SYMBOLS: TYPE tline, - TYPE tline. - - lt_itf = it_itf. - - " You should remember that we replace the U1 format because - " that preserves the section header of longtexts. - LOOP AT lt_itf ASSIGNING - WHERE tdformat = lc_format_section. - - CLEAR: - lv_has_content, - lv_tabix_to. - - lv_tabix_from = sy-tabix. - - LOOP AT lt_itf ASSIGNING - FROM sy-tabix + 1. - - IF -tdformat = lc_format_section. - lv_tabix_to = sy-tabix. - EXIT. - ELSEIF -tdline IS NOT INITIAL. - lv_has_content = abap_true. - ENDIF. - - ENDLOOP. - - IF lv_has_content = abap_false. - remove_empty_section( - EXPORTING - iv_tabix_from = lv_tabix_from - iv_tabix_to = lv_tabix_to - CHANGING - ct_itf = lt_itf ). - CONTINUE. - ENDIF. - - replace_section_head_with_text( CHANGING cs_itf = ). - - ENDLOOP. - - CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT' - EXPORTING - lf = 'X' - IMPORTING - stream_lines = lt_string - TABLES - itf_text = lt_itf - text_stream = lt_stream. - - LOOP AT lt_string INTO lv_string. - IF sy-tabix = 1. - rv_result = lv_string. - ELSE. - CONCATENATE rv_result lv_string - INTO rv_result - SEPARATED BY cl_abap_char_utilities=>newline. - ENDIF. - - ENDLOOP. - - ENDMETHOD. - - - METHOD remove_empty_section. - IF iv_tabix_to BETWEEN iv_tabix_from AND lines( ct_itf ). - DELETE ct_itf FROM iv_tabix_from TO iv_tabix_to. - ELSE. - DELETE ct_itf FROM iv_tabix_from. - ENDIF. - ENDMETHOD. - - - METHOD replace_section_head_with_text. - - CASE cs_itf-tdline. - WHEN gc_section_token-cause. - cs_itf-tdline = gc_section_text-cause. - WHEN gc_section_token-system_response. - cs_itf-tdline = gc_section_text-system_response. - WHEN gc_section_token-what_to_do. - cs_itf-tdline = gc_section_text-what_to_do. - WHEN gc_section_token-sys_admin. - cs_itf-tdline = gc_section_text-sys_admin. - ENDCASE. - - ENDMETHOD. - - - METHOD set_msg_vars_for_clike. - - DATA: ls_msg TYPE ty_msg, - lv_dummy TYPE string. - - ls_msg = split_text( iv_text ). - - MESSAGE e001(00) WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO lv_dummy. - - ENDMETHOD. - - - METHOD set_single_msg_var. - - FIELD-SYMBOLS TYPE any. - - IF iv_arg IS INITIAL. - RETURN. - ENDIF. - - ASSIGN mo_exception->(iv_arg) TO . - IF sy-subrc <> 0. - CONCATENATE '&' iv_arg '&' INTO rv_target. - RETURN. - ENDIF. - - TRY. - rv_target = set_single_msg_var_clike( iv_arg = ). - RETURN. - CATCH cx_sy_dyn_call_illegal_type ##no_handler. - ENDTRY. - - TRY. - rv_target = set_single_msg_var_numeric( iv_arg = ). - RETURN. - CATCH cx_sy_dyn_call_illegal_type ##no_handler. - ENDTRY. - - TRY. - rv_target = set_single_msg_var_xseq( iv_arg = ). - RETURN. - CATCH cx_sy_dyn_call_illegal_type ##no_handler. - ENDTRY. - - CONCATENATE '&' iv_arg '&' INTO rv_target. - - ENDMETHOD. - - - METHOD set_single_msg_var_clike. - " a kind of MOVE where all conversion errors are signalled by exceptions - WRITE iv_arg LEFT-JUSTIFIED TO rv_target. - ENDMETHOD. - - - METHOD set_single_msg_var_numeric. - " a kind of MOVE where all conversion errors are signalled by exceptions - WRITE iv_arg LEFT-JUSTIFIED TO rv_target. - ENDMETHOD. - - - METHOD set_single_msg_var_xseq. - " a kind of MOVE where all conversion errors are signalled by exceptions - WRITE iv_arg LEFT-JUSTIFIED TO rv_target. - ENDMETHOD. - - - METHOD split_text. - - CONSTANTS: - lc_length_of_msgv TYPE i VALUE 50, - lc_offset_of_last_character TYPE i VALUE 49. - - TYPES: - ty_char200 TYPE c LENGTH 200. - - DATA: - lv_text TYPE ty_char200, - lv_msg_var TYPE c LENGTH lc_length_of_msgv, - lv_rest TYPE ty_char200, - lv_index TYPE syst-index. - - lv_text = iv_text. - - DO 4 TIMES. - - lv_index = sy-index. - - CALL FUNCTION 'TEXT_SPLIT' - EXPORTING - length = lc_length_of_msgv - text = lv_text - IMPORTING - line = lv_msg_var - rest = lv_rest. - - IF lv_msg_var+lc_offset_of_last_character(1) = space OR - lv_text+lc_length_of_msgv(1) = space. - " keep the space at the beginning of the rest - " because otherwise it's lost - lv_rest = | { lv_rest }|. - ENDIF. - - lv_text = lv_rest. - - CASE lv_index. - WHEN 1. - rs_msg-msgv1 = lv_msg_var. - WHEN 2. - rs_msg-msgv2 = lv_msg_var. - WHEN 3. - rs_msg-msgv3 = lv_msg_var. - WHEN 4. - rs_msg-msgv4 = lv_msg_var. - ENDCASE. - - ENDDO. - - ENDMETHOD. -ENDCLASS. diff --git a/src/zcl_abapgit_message_helper.clas.testclasses.abap b/src/zcl_abapgit_message_helper.clas.testclasses.abap deleted file mode 100644 index a4bf6d030..000000000 --- a/src/zcl_abapgit_message_helper.clas.testclasses.abap +++ /dev/null @@ -1,147 +0,0 @@ -CLASS ltcl_get_t100_longtext DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. - - PUBLIC SECTION. - METHODS test01 FOR TESTING. - -ENDCLASS. - -CLASS ltcl_get_t100_longtext IMPLEMENTATION. - - METHOD test01. - - DATA: lx_err TYPE REF TO zcx_abapgit_exception, - lv_dummy TYPE string, - lv_result TYPE string. - - TRY. - MESSAGE e058(00) WITH 'Value_1' 'Value_2' 'Value_3' 'Value_4' INTO lv_dummy. - zcx_abapgit_exception=>raise_t100( ). - CATCH zcx_abapgit_exception INTO lx_err. - lv_result = lx_err->get_longtext( ). - ENDTRY. - - cl_abap_unit_assert=>assert_not_initial( lv_result ). - - IF lv_result NS 'Value_1'. - cl_abap_unit_assert=>fail( ). - ENDIF. - IF lv_result NS 'Value_2'. - cl_abap_unit_assert=>fail( ). - ENDIF. - IF lv_result NS 'Value_3'. - cl_abap_unit_assert=>fail( ). - ENDIF. - IF lv_result NS 'Value_4'. - cl_abap_unit_assert=>fail( ). - ENDIF. - - ENDMETHOD. - -ENDCLASS. - -CLASS ltcl_set_msg_vars_for_clike DEFINITION - FOR TESTING - DURATION SHORT - RISK LEVEL HARMLESS. - - PUBLIC SECTION. - METHODS: - test_set_msg_b FOR TESTING, - test_set_msg_c FOR TESTING, - test_set_msg_d FOR TESTING, - test_set_msg_e FOR TESTING, - test_set_msg_z FOR TESTING. - PROTECTED SECTION. - PRIVATE SECTION. - TYPES: - BEGIN OF ty_msg, - v1 TYPE sy-msgv1, - v2 TYPE sy-msgv2, - v3 TYPE sy-msgv3, - v4 TYPE sy-msgv4, - END OF ty_msg. - CLASS-METHODS: - test_set_msg_vars - IMPORTING - iv_text TYPE string - is_msg TYPE ty_msg. -ENDCLASS. - -CLASS ltcl_set_msg_vars_for_clike IMPLEMENTATION. - METHOD test_set_msg_b. - CONSTANTS: - lc_text_b TYPE string VALUE '0123456789012345678901234567890123456789012345678 0123456789', - BEGIN OF lc_msg_b, - v1 TYPE sy-msgv1 VALUE '0123456789012345678901234567890123456789012345678', - v2 TYPE sy-msgv2 VALUE ' 0123456789', - v3 TYPE sy-msgv3 VALUE '', - v4 TYPE sy-msgv4 VALUE '', - END OF lc_msg_b. - test_set_msg_vars( iv_text = lc_text_b - is_msg = lc_msg_b ). - ENDMETHOD. - METHOD test_set_msg_c. - CONSTANTS: - lc_text_c TYPE string VALUE '01234567890123456789012345678901234567890123456789 123456789', - BEGIN OF lc_msg_c, - v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789', - v2 TYPE sy-msgv2 VALUE ' 123456789', - v3 TYPE sy-msgv3 VALUE '', - v4 TYPE sy-msgv4 VALUE '', - END OF lc_msg_c. - test_set_msg_vars( iv_text = lc_text_c - is_msg = lc_msg_c ). - ENDMETHOD. - METHOD test_set_msg_d. - CONSTANTS: - lc_text_d TYPE string VALUE '012345678901234567890123456789012345678901234567890 23456789', - BEGIN OF lc_msg_d, - v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789', - v2 TYPE sy-msgv2 VALUE '0 23456789', - v3 TYPE sy-msgv3 VALUE '', - v4 TYPE sy-msgv4 VALUE '', - END OF lc_msg_d. - test_set_msg_vars( iv_text = lc_text_d - is_msg = lc_msg_d ). - ENDMETHOD. - METHOD test_set_msg_e. - CONSTANTS: - lc_text_e TYPE string VALUE '012345678901234567890123456789012345678901234567890123456789', - BEGIN OF lc_msg_e, - v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789', - v2 TYPE sy-msgv2 VALUE '0123456789', - v3 TYPE sy-msgv3 VALUE '', - v4 TYPE sy-msgv4 VALUE '', - END OF lc_msg_e. - test_set_msg_vars( iv_text = lc_text_e - is_msg = lc_msg_e ). - ENDMETHOD. - METHOD test_set_msg_z. - CONSTANTS: - lc_text_x TYPE string VALUE `Here is a very long text more than 200 characters and we have to invent `, - lc_text_y TYPE string VALUE `a nice story about abapGit to fill this long message. abapGit is simply `, - lc_text_z TYPE string VALUE `the greatest! #abapGit #awesome #community #opensource`, - BEGIN OF lc_msg_z, - v1 TYPE sy-msgv1 VALUE `Here is a very long text more than 200 characters`, - v2 TYPE sy-msgv2 VALUE ` and we have to invent a nice story about abapGit`, - v3 TYPE sy-msgv3 VALUE ` to fill this long message. abapGit is simply the`, - v4 TYPE sy-msgv4 VALUE ` greatest! #abapGit #awesome #community`, - END OF lc_msg_z. - test_set_msg_vars( iv_text = lc_text_x && lc_text_y && lc_text_z - is_msg = lc_msg_z ). - ENDMETHOD. - METHOD test_set_msg_vars. - - zcl_abapgit_message_helper=>set_msg_vars_for_clike( iv_text ). - - cl_abap_unit_assert=>assert_equals( act = sy-msgv1 - exp = is_msg-v1 ). - cl_abap_unit_assert=>assert_equals( act = sy-msgv2 - exp = is_msg-v2 ). - cl_abap_unit_assert=>assert_equals( act = sy-msgv3 - exp = is_msg-v3 ). - cl_abap_unit_assert=>assert_equals( act = sy-msgv4 - exp = is_msg-v4 ). - - ENDMETHOD. -ENDCLASS. diff --git a/src/zcl_abapgit_message_helper.clas.xml b/src/zcl_abapgit_message_helper.clas.xml deleted file mode 100644 index 45b589c54..000000000 --- a/src/zcl_abapgit_message_helper.clas.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - ZCL_ABAPGIT_MESSAGE_HELPER - E - abapGit message helper - 1 - X - X - X - X - - - - diff --git a/src/zcx_abapgit_exception.clas.abap b/src/zcx_abapgit_exception.clas.abap index 79062dd39..2b2ba3c4e 100644 --- a/src/zcx_abapgit_exception.clas.abap +++ b/src/zcx_abapgit_exception.clas.abap @@ -8,6 +8,20 @@ CLASS zcx_abapgit_exception DEFINITION INTERFACES if_t100_message . + CONSTANTS: + BEGIN OF gc_section_text, + cause TYPE string VALUE `Cause`, + system_response TYPE string VALUE `System response`, + what_to_do TYPE string VALUE `Procedure`, + sys_admin TYPE string VALUE `System administration`, + END OF gc_section_text . + CONSTANTS: + BEGIN OF gc_section_token, + cause TYPE string VALUE `&CAUSE&`, + system_response TYPE string VALUE `&SYSTEM_RESPONSE&`, + what_to_do TYPE string VALUE `&WHAT_TO_DO&`, + sys_admin TYPE string VALUE `&SYS_ADMIN&`, + END OF gc_section_token . DATA msgv1 TYPE symsgv READ-ONLY . DATA msgv2 TYPE symsgv READ-ONLY . DATA msgv3 TYPE symsgv READ-ONLY . @@ -43,6 +57,12 @@ CLASS zcx_abapgit_exception DEFINITION VALUE(iv_msgv2) TYPE symsgv DEFAULT sy-msgv2 VALUE(iv_msgv3) TYPE symsgv DEFAULT sy-msgv3 VALUE(iv_msgv4) TYPE symsgv DEFAULT sy-msgv4 + !ix_previous TYPE REF TO cx_root OPTIONAL + RAISING + zcx_abapgit_exception . + CLASS-METHODS raise_with_text + IMPORTING + !ix_previous TYPE REF TO cx_root RAISING zcx_abapgit_exception . METHODS constructor @@ -53,11 +73,6 @@ CLASS zcx_abapgit_exception DEFINITION !msgv2 TYPE symsgv OPTIONAL !msgv3 TYPE symsgv OPTIONAL !msgv4 TYPE symsgv OPTIONAL . - CLASS-METHODS raise_with_text - IMPORTING - !ix_previous TYPE REF TO cx_root - RAISING - zcx_abapgit_exception . METHODS get_source_position REDEFINITION . @@ -65,11 +80,32 @@ CLASS zcx_abapgit_exception DEFINITION REDEFINITION . PROTECTED SECTION. PRIVATE SECTION. - CONSTANTS: - gc_generic_error_msg TYPE string VALUE `An error occured (ZCX_ABAPGIT_EXCEPTION)` ##NO_TEXT. - METHODS: - save_callstack. + CONSTANTS gc_generic_error_msg TYPE string VALUE `An error occured (ZCX_ABAPGIT_EXCEPTION)` ##NO_TEXT. + + CLASS-METHODS split_text_to_symsg + IMPORTING + !iv_text TYPE string + RETURNING + VALUE(rs_msg) TYPE symsg . + METHODS save_callstack . + METHODS itf_to_string + IMPORTING + !it_itf TYPE tline_tab + RETURNING + VALUE(rv_result) TYPE string . + METHODS get_t100_longtext_itf + RETURNING + VALUE(rt_itf) TYPE tline_tab . + METHODS remove_empty_section + IMPORTING + !iv_tabix_from TYPE i + !iv_tabix_to TYPE i + CHANGING + !ct_itf TYPE tline_tab . + METHODS replace_section_head_with_text + CHANGING + !cs_itf TYPE tline . ENDCLASS. @@ -78,6 +114,7 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. METHOD constructor ##ADT_SUPPRESS_GENERATION. + super->constructor( previous = previous ). me->msgv1 = msgv1. @@ -118,6 +155,47 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. ENDMETHOD. + METHOD get_t100_longtext_itf. + + DATA: lv_docu_key TYPE doku_obj. + + FIELD-SYMBOLS TYPE any. + + lv_docu_key = if_t100_message~t100key-msgid && if_t100_message~t100key-msgno. + + CALL FUNCTION 'DOCU_GET' + EXPORTING + id = 'NA' + langu = sy-langu + object = lv_docu_key + typ = 'E' + TABLES + line = rt_itf + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc = 0. + ASSIGN me->(if_t100_message~t100key-attr1) TO . + IF sy-subrc = 0. + REPLACE ALL OCCURRENCES OF '&V1&' IN TABLE rt_itf WITH . + ENDIF. + ASSIGN me->(if_t100_message~t100key-attr2) TO . + IF sy-subrc = 0. + REPLACE ALL OCCURRENCES OF '&V2&' IN TABLE rt_itf WITH . + ENDIF. + ASSIGN me->(if_t100_message~t100key-attr3) TO . + IF sy-subrc = 0. + REPLACE ALL OCCURRENCES OF '&V3&' IN TABLE rt_itf WITH . + ENDIF. + ASSIGN me->(if_t100_message~t100key-attr4) TO . + IF sy-subrc = 0. + REPLACE ALL OCCURRENCES OF '&V4&' IN TABLE rt_itf WITH . + ENDIF. + ENDIF. + + ENDMETHOD. + + METHOD if_message~get_longtext. " You should remember that we have to call ZCL_ABAPGIT_MESSAGE_HELPER @@ -131,26 +209,94 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. IF if_t100_message~t100key IS NOT INITIAL. - CREATE OBJECT lo_message_helper TYPE ('ZCL_ABAPGIT_MESSAGE_HELPER') - EXPORTING - io_exception = me. - - CALL METHOD lo_message_helper->('GET_T100_LONGTEXT') - RECEIVING - rv_longtext = result. + result = itf_to_string( get_t100_longtext_itf( ) ). ENDIF. ENDMETHOD. + METHOD itf_to_string. + + CONSTANTS: lc_format_section TYPE string VALUE 'U1'. + + DATA: + lt_stream TYPE TABLE OF tdline, + lt_string TYPE TABLE OF string, + lv_string LIKE LINE OF lt_string, + lt_itf TYPE tline_tab, + lv_has_content TYPE abap_bool, + lv_tabix_from TYPE syst-tabix, + lv_tabix_to TYPE syst-tabix. + + FIELD-SYMBOLS: TYPE tline, + TYPE tline. + + lt_itf = it_itf. + + " You should remember that we replace the U1 format because + " that preserves the section header of longtexts. + LOOP AT lt_itf ASSIGNING + WHERE tdformat = lc_format_section. + + CLEAR: + lv_has_content, + lv_tabix_to. + + lv_tabix_from = sy-tabix. + + LOOP AT lt_itf ASSIGNING + FROM sy-tabix + 1. + + IF -tdformat = lc_format_section. + lv_tabix_to = sy-tabix. + EXIT. + ELSEIF -tdline IS NOT INITIAL. + lv_has_content = abap_true. + ENDIF. + + ENDLOOP. + + IF lv_has_content = abap_false. + remove_empty_section( + EXPORTING + iv_tabix_from = lv_tabix_from + iv_tabix_to = lv_tabix_to + CHANGING + ct_itf = lt_itf ). + CONTINUE. + ENDIF. + + replace_section_head_with_text( CHANGING cs_itf = ). + + ENDLOOP. + + CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT' + EXPORTING + lf = 'X' + IMPORTING + stream_lines = lt_string + TABLES + itf_text = lt_itf + text_stream = lt_stream. + + LOOP AT lt_string INTO lv_string. + IF sy-tabix = 1. + rv_result = lv_string. + ELSE. + CONCATENATE rv_result lv_string + INTO rv_result + SEPARATED BY cl_abap_char_utilities=>newline. + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + METHOD raise. - DATA: lv_msgv1 TYPE symsgv, - lv_msgv2 TYPE symsgv, - lv_msgv3 TYPE symsgv, - lv_msgv4 TYPE symsgv, - ls_t100_key TYPE scx_t100key, - lv_text TYPE string. + + DATA lv_text TYPE string. IF iv_text IS INITIAL. lv_text = gc_generic_error_msg. @@ -158,29 +304,10 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. lv_text = iv_text. ENDIF. - CALL METHOD ('ZCL_ABAPGIT_MESSAGE_HELPER')=>set_msg_vars_for_clike - EXPORTING - iv_text = lv_text. + split_text_to_symsg( lv_text ). - ls_t100_key-msgid = sy-msgid. - ls_t100_key-msgno = sy-msgno. - ls_t100_key-attr1 = 'MSGV1'. - ls_t100_key-attr2 = 'MSGV2'. - ls_t100_key-attr3 = 'MSGV3'. - ls_t100_key-attr4 = 'MSGV4'. - lv_msgv1 = sy-msgv1. - lv_msgv2 = sy-msgv2. - lv_msgv3 = sy-msgv3. - lv_msgv4 = sy-msgv4. + raise_t100( ix_previous = ix_previous ). - RAISE EXCEPTION TYPE zcx_abapgit_exception - EXPORTING - textid = ls_t100_key - msgv1 = lv_msgv1 - msgv2 = lv_msgv2 - msgv3 = lv_msgv3 - msgv4 = lv_msgv4 - previous = ix_previous. ENDMETHOD. @@ -200,11 +327,12 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. RAISE EXCEPTION TYPE zcx_abapgit_exception EXPORTING - textid = ls_t100_key - msgv1 = iv_msgv1 - msgv2 = iv_msgv2 - msgv3 = iv_msgv3 - msgv4 = iv_msgv4. + textid = ls_t100_key + msgv1 = iv_msgv1 + msgv2 = iv_msgv2 + msgv3 = iv_msgv3 + msgv4 = iv_msgv4 + previous = ix_previous. ENDMETHOD. @@ -215,6 +343,31 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. ENDMETHOD. + METHOD remove_empty_section. + IF iv_tabix_to BETWEEN iv_tabix_from AND lines( ct_itf ). + DELETE ct_itf FROM iv_tabix_from TO iv_tabix_to. + ELSE. + DELETE ct_itf FROM iv_tabix_from. + ENDIF. + ENDMETHOD. + + + METHOD replace_section_head_with_text. + + CASE cs_itf-tdline. + WHEN gc_section_token-cause. + cs_itf-tdline = gc_section_text-cause. + WHEN gc_section_token-system_response. + cs_itf-tdline = gc_section_text-system_response. + WHEN gc_section_token-what_to_do. + cs_itf-tdline = gc_section_text-what_to_do. + WHEN gc_section_token-sys_admin. + cs_itf-tdline = gc_section_text-sys_admin. + ENDCASE. + + ENDMETHOD. + + METHOD save_callstack. FIELD-SYMBOLS: TYPE abap_callstack_line. @@ -243,4 +396,59 @@ CLASS ZCX_ABAPGIT_EXCEPTION IMPLEMENTATION. ENDLOOP. ENDMETHOD. + + + METHOD split_text_to_symsg. + + CONSTANTS: + lc_length_of_msgv TYPE i VALUE 50, + lc_offset_of_last_character TYPE i VALUE 49. + + DATA: + lv_text TYPE c LENGTH 200, + lv_rest TYPE c LENGTH 200, + ls_msg TYPE symsg, + lv_msg_var TYPE c LENGTH lc_length_of_msgv, + lv_index TYPE sy-index. + + lv_text = iv_text. + + DO 4 TIMES. + + lv_index = sy-index. + + CALL FUNCTION 'TEXT_SPLIT' + EXPORTING + length = lc_length_of_msgv + text = lv_text + IMPORTING + line = lv_msg_var + rest = lv_rest. + + IF lv_msg_var+lc_offset_of_last_character(1) = space OR + lv_text+lc_length_of_msgv(1) = space. + " keep the space at the beginning of the rest + " because otherwise it's lost + lv_rest = | { lv_rest }|. + ENDIF. + + lv_text = lv_rest. + + CASE lv_index. + WHEN 1. + ls_msg-msgv1 = lv_msg_var. + WHEN 2. + ls_msg-msgv2 = lv_msg_var. + WHEN 3. + ls_msg-msgv3 = lv_msg_var. + WHEN 4. + ls_msg-msgv4 = lv_msg_var. + ENDCASE. + + ENDDO. + + " Set syst using generic error message + MESSAGE e001(00) WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO sy-lisel. + + ENDMETHOD. ENDCLASS. diff --git a/src/zcx_abapgit_exception.clas.testclasses.abap b/src/zcx_abapgit_exception.clas.testclasses.abap index 47200ea02..4329b9d52 100644 --- a/src/zcx_abapgit_exception.clas.testclasses.abap +++ b/src/zcx_abapgit_exception.clas.testclasses.abap @@ -1,5 +1,6 @@ CLASS ltcl_test DEFINITION DEFERRED. -CLASS zcx_abapgit_exception DEFINITION LOCAL FRIENDS ltcl_test. +CLASS ltcl_split_text DEFINITION DEFERRED. +CLASS zcx_abapgit_exception DEFINITION LOCAL FRIENDS ltcl_test ltcl_split_text. CLASS ltcl_test DEFINITION FOR TESTING @@ -303,3 +304,151 @@ CLASS ltcl_test IMPLEMENTATION. INTO rv_text. ENDMETHOD. ENDCLASS. + +CLASS ltcl_get_t100_longtext DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. + + PUBLIC SECTION. + METHODS test01 FOR TESTING. + +ENDCLASS. + +CLASS ltcl_get_t100_longtext IMPLEMENTATION. + + METHOD test01. + + DATA: lx_err TYPE REF TO zcx_abapgit_exception, + lv_dummy TYPE string, + lv_result TYPE string. + + TRY. + MESSAGE e058(00) WITH 'Value_1' 'Value_2' 'Value_3' 'Value_4' INTO lv_dummy. + zcx_abapgit_exception=>raise_t100( ). + CATCH zcx_abapgit_exception INTO lx_err. + lv_result = lx_err->get_longtext( ). + ENDTRY. + + cl_abap_unit_assert=>assert_not_initial( lv_result ). + + IF lv_result NS 'Value_1'. + cl_abap_unit_assert=>fail( ). + ENDIF. + IF lv_result NS 'Value_2'. + cl_abap_unit_assert=>fail( ). + ENDIF. + IF lv_result NS 'Value_3'. + cl_abap_unit_assert=>fail( ). + ENDIF. + IF lv_result NS 'Value_4'. + cl_abap_unit_assert=>fail( ). + ENDIF. + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_split_text DEFINITION + FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PUBLIC SECTION. + METHODS: + test_set_msg_b FOR TESTING, + test_set_msg_c FOR TESTING, + test_set_msg_d FOR TESTING, + test_set_msg_e FOR TESTING, + test_set_msg_z FOR TESTING. + PROTECTED SECTION. + PRIVATE SECTION. + TYPES: + BEGIN OF ty_msg, + v1 TYPE sy-msgv1, + v2 TYPE sy-msgv2, + v3 TYPE sy-msgv3, + v4 TYPE sy-msgv4, + END OF ty_msg. + CLASS-METHODS: + test_set_msg_vars + IMPORTING + iv_text TYPE string + is_msg TYPE ty_msg. +ENDCLASS. + +CLASS ltcl_split_text IMPLEMENTATION. + METHOD test_set_msg_b. + CONSTANTS: + lc_text_b TYPE string VALUE '0123456789012345678901234567890123456789012345678 0123456789', + BEGIN OF lc_msg_b, + v1 TYPE sy-msgv1 VALUE '0123456789012345678901234567890123456789012345678', + v2 TYPE sy-msgv2 VALUE ' 0123456789', + v3 TYPE sy-msgv3 VALUE '', + v4 TYPE sy-msgv4 VALUE '', + END OF lc_msg_b. + test_set_msg_vars( iv_text = lc_text_b + is_msg = lc_msg_b ). + ENDMETHOD. + METHOD test_set_msg_c. + CONSTANTS: + lc_text_c TYPE string VALUE '01234567890123456789012345678901234567890123456789 123456789', + BEGIN OF lc_msg_c, + v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789', + v2 TYPE sy-msgv2 VALUE ' 123456789', + v3 TYPE sy-msgv3 VALUE '', + v4 TYPE sy-msgv4 VALUE '', + END OF lc_msg_c. + test_set_msg_vars( iv_text = lc_text_c + is_msg = lc_msg_c ). + ENDMETHOD. + METHOD test_set_msg_d. + CONSTANTS: + lc_text_d TYPE string VALUE '012345678901234567890123456789012345678901234567890 23456789', + BEGIN OF lc_msg_d, + v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789', + v2 TYPE sy-msgv2 VALUE '0 23456789', + v3 TYPE sy-msgv3 VALUE '', + v4 TYPE sy-msgv4 VALUE '', + END OF lc_msg_d. + test_set_msg_vars( iv_text = lc_text_d + is_msg = lc_msg_d ). + ENDMETHOD. + METHOD test_set_msg_e. + CONSTANTS: + lc_text_e TYPE string VALUE '012345678901234567890123456789012345678901234567890123456789', + BEGIN OF lc_msg_e, + v1 TYPE sy-msgv1 VALUE '01234567890123456789012345678901234567890123456789', + v2 TYPE sy-msgv2 VALUE '0123456789', + v3 TYPE sy-msgv3 VALUE '', + v4 TYPE sy-msgv4 VALUE '', + END OF lc_msg_e. + test_set_msg_vars( iv_text = lc_text_e + is_msg = lc_msg_e ). + ENDMETHOD. + METHOD test_set_msg_z. + CONSTANTS: + lc_text_x TYPE string VALUE `Here is a very long text more than 200 characters and we have to invent `, + lc_text_y TYPE string VALUE `a nice story about abapGit to fill this long message. abapGit is simply `, + lc_text_z TYPE string VALUE `the greatest! #abapGit #awesome #community #opensource`, + BEGIN OF lc_msg_z, + v1 TYPE sy-msgv1 VALUE `Here is a very long text more than 200 characters`, + v2 TYPE sy-msgv2 VALUE ` and we have to invent a nice story about abapGit`, + v3 TYPE sy-msgv3 VALUE ` to fill this long message. abapGit is simply the`, + v4 TYPE sy-msgv4 VALUE ` greatest! #abapGit #awesome #community`, + END OF lc_msg_z. + test_set_msg_vars( iv_text = lc_text_x && lc_text_y && lc_text_z + is_msg = lc_msg_z ). + ENDMETHOD. + METHOD test_set_msg_vars. + + zcx_abapgit_exception=>split_text_to_symsg( iv_text ). + + cl_abap_unit_assert=>assert_equals( act = sy-msgv1 + exp = is_msg-v1 ). + cl_abap_unit_assert=>assert_equals( act = sy-msgv2 + exp = is_msg-v2 ). + cl_abap_unit_assert=>assert_equals( act = sy-msgv3 + exp = is_msg-v3 ). + cl_abap_unit_assert=>assert_equals( act = sy-msgv4 + exp = is_msg-v4 ). + + ENDMETHOD. +ENDCLASS.