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 |
| ).
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.