Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 99x 99x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 89x 89x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 104x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | "! abapGit general error CLASS zcx_abapgit_exception DEFINITION PUBLIC INHERITING FROM cx_static_check CREATE PUBLIC . PUBLIC SECTION. INTERFACES if_t100_message . CONSTANTS: BEGIN OF c_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 c_section_text . CONSTANTS: BEGIN OF c_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 c_section_token . CLASS-DATA null TYPE string. DATA msgv1 TYPE symsgv READ-ONLY . DATA msgv2 TYPE symsgv READ-ONLY . DATA msgv3 TYPE symsgv READ-ONLY . DATA msgv4 TYPE symsgv READ-ONLY . DATA mv_longtext TYPE string READ-ONLY. DATA mt_callstack TYPE abap_callstack READ-ONLY. DATA mi_log TYPE REF TO zif_abapgit_log READ-ONLY. "! Raise exception with text "! @parameter iv_text | Text "! @parameter ix_previous | Previous exception "! @parameter ii_log | Log "! @parameter iv_longtext | Longtext "! @raising zcx_abapgit_exception | Exception CLASS-METHODS raise IMPORTING !iv_text TYPE clike !ix_previous TYPE REF TO cx_root OPTIONAL !ii_log TYPE REF TO zif_abapgit_log OPTIONAL !iv_longtext TYPE csequence OPTIONAL RAISING zcx_abapgit_exception . "! Raise exception with T100 message "! <p> "! Will default to sy-msg* variables. These need to be set right before calling this method. "! </p> "! @parameter iv_msgid | Message ID "! @parameter iv_msgno | Message number "! @parameter iv_msgv1 | Message variable 1 "! @parameter iv_msgv2 | Message variable 2 "! @parameter iv_msgv3 | Message variable 3 "! @parameter iv_msgv4 | Message variable 4 "! @parameter ii_log | Log "! @parameter ix_previous | Previous exception "! @parameter iv_longtext | Longtext "! @raising zcx_abapgit_exception | Exception CLASS-METHODS raise_t100 IMPORTING !iv_msgid TYPE symsgid DEFAULT sy-msgid !iv_msgno TYPE symsgno DEFAULT sy-msgno !iv_msgv1 TYPE symsgv DEFAULT sy-msgv1 !iv_msgv2 TYPE symsgv DEFAULT sy-msgv2 !iv_msgv3 TYPE symsgv DEFAULT sy-msgv3 !iv_msgv4 TYPE symsgv DEFAULT sy-msgv4 !ii_log TYPE REF TO zif_abapgit_log OPTIONAL !ix_previous TYPE REF TO cx_root OPTIONAL !iv_longtext TYPE csequence OPTIONAL RAISING zcx_abapgit_exception . "! Raise with text from previous exception "! @parameter ix_previous | Previous exception "! @parameter iv_longtext | Longtext "! @raising zcx_abapgit_exception | Exception CLASS-METHODS raise_with_text IMPORTING !ix_previous TYPE REF TO cx_root !iv_longtext TYPE csequence OPTIONAL RAISING zcx_abapgit_exception . METHODS constructor IMPORTING !textid LIKE if_t100_message=>t100key OPTIONAL !previous LIKE previous OPTIONAL !log TYPE REF TO zif_abapgit_log OPTIONAL !msgv1 TYPE symsgv OPTIONAL !msgv2 TYPE symsgv OPTIONAL !msgv3 TYPE symsgv OPTIONAL !msgv4 TYPE symsgv OPTIONAL !longtext TYPE csequence OPTIONAL . METHODS get_source_position REDEFINITION . METHODS if_message~get_longtext REDEFINITION . PROTECTED SECTION. PRIVATE SECTION. CONSTANTS c_generic_error_msg TYPE string VALUE `An error occurred (ZCX_ABAPGIT_EXCEPTION)`. 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 . CLASS-METHODS remove_newlines_from_string IMPORTING iv_string TYPE string RETURNING VALUE(rv_result) TYPE string. ENDCLASS. CLASS zcx_abapgit_exception IMPLEMENTATION. METHOD constructor ##ADT_SUPPRESS_GENERATION. super->constructor( previous = previous ). me->msgv1 = msgv1. me->msgv2 = msgv2. me->msgv3 = msgv3. me->msgv4 = msgv4. mi_log = log. mv_longtext = longtext. CLEAR me->textid. IF textid IS INITIAL. if_t100_message~t100key = if_t100_message=>default_textid. ELSE. if_t100_message~t100key = textid. ENDIF. save_callstack( ). ENDMETHOD. METHOD get_source_position. FIELD-SYMBOLS: <ls_callstack> LIKE LINE OF mt_callstack. READ TABLE mt_callstack ASSIGNING <ls_callstack> INDEX 1. IF sy-subrc = 0. program_name = <ls_callstack>-mainprogram. include_name = <ls_callstack>-include. source_line = <ls_callstack>-line. ELSE. super->get_source_position( IMPORTING program_name = program_name include_name = include_name source_line = source_line ). ENDIF. ENDMETHOD. METHOD get_t100_longtext_itf. DATA: lv_docu_key TYPE doku_obj. FIELD-SYMBOLS <lv_msgv> 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 <lv_msgv>. IF sy-subrc = 0. REPLACE ALL OCCURRENCES OF '&V1&' IN TABLE rt_itf WITH <lv_msgv>. ENDIF. ASSIGN me->(if_t100_message~t100key-attr2) TO <lv_msgv>. IF sy-subrc = 0. REPLACE ALL OCCURRENCES OF '&V2&' IN TABLE rt_itf WITH <lv_msgv>. ENDIF. ASSIGN me->(if_t100_message~t100key-attr3) TO <lv_msgv>. IF sy-subrc = 0. REPLACE ALL OCCURRENCES OF '&V3&' IN TABLE rt_itf WITH <lv_msgv>. ENDIF. ASSIGN me->(if_t100_message~t100key-attr4) TO <lv_msgv>. IF sy-subrc = 0. REPLACE ALL OCCURRENCES OF '&V4&' IN TABLE rt_itf WITH <lv_msgv>. ENDIF. ENDIF. ENDMETHOD. METHOD if_message~get_longtext. DATA: lv_preserve_newlines_handled TYPE abap_bool VALUE abap_false. IF mv_longtext IS NOT INITIAL. result = mv_longtext. ELSEIF if_t100_message~t100key IS NOT INITIAL. result = itf_to_string( get_t100_longtext_itf( ) ). ELSE. result = super->get_longtext( preserve_newlines ). lv_preserve_newlines_handled = abap_true. ENDIF. IF lv_preserve_newlines_handled = abap_false AND preserve_newlines = abap_false. result = remove_newlines_from_string( result ). 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: <ls_itf_section> TYPE tline, <ls_itf_section_item> 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 <ls_itf_section> WHERE tdformat = lc_format_section. CLEAR: lv_has_content, lv_tabix_to. lv_tabix_from = sy-tabix. LOOP AT lt_itf ASSIGNING <ls_itf_section_item> FROM sy-tabix + 1. IF <ls_itf_section_item>-tdformat = lc_format_section. lv_tabix_to = sy-tabix. EXIT. ELSEIF <ls_itf_section_item>-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 = <ls_itf_section> ). 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_text TYPE string. IF iv_text IS INITIAL. lv_text = c_generic_error_msg. ELSE. lv_text = iv_text. ENDIF. split_text_to_symsg( lv_text ). raise_t100( ii_log = ii_log ix_previous = ix_previous iv_longtext = iv_longtext ). ENDMETHOD. METHOD raise_t100. DATA: ls_t100_key TYPE scx_t100key. ls_t100_key-msgid = iv_msgid. ls_t100_key-msgno = iv_msgno. ls_t100_key-attr1 = 'MSGV1'. ls_t100_key-attr2 = 'MSGV2'. ls_t100_key-attr3 = 'MSGV3'. ls_t100_key-attr4 = 'MSGV4'. IF iv_msgid IS INITIAL. CLEAR ls_t100_key. ENDIF. RAISE EXCEPTION TYPE zcx_abapgit_exception EXPORTING textid = ls_t100_key log = ii_log msgv1 = iv_msgv1 msgv2 = iv_msgv2 msgv3 = iv_msgv3 msgv4 = iv_msgv4 previous = ix_previous longtext = iv_longtext. ENDMETHOD. METHOD raise_with_text. raise( iv_text = ix_previous->get_text( ) ix_previous = ix_previous iv_longtext = iv_longtext ). 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 remove_newlines_from_string. rv_result = iv_string. REPLACE ALL OCCURRENCES OF ` ` && cl_abap_char_utilities=>cr_lf IN rv_result WITH ` `. REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN rv_result WITH ` `. REPLACE ALL OCCURRENCES OF ` ` && cl_abap_char_utilities=>newline IN rv_result WITH ` `. REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN rv_result WITH ` `. ENDMETHOD. METHOD replace_section_head_with_text. CASE cs_itf-tdline. WHEN c_section_token-cause. cs_itf-tdline = c_section_text-cause. WHEN c_section_token-system_response. cs_itf-tdline = c_section_text-system_response. WHEN c_section_token-what_to_do. cs_itf-tdline = c_section_text-what_to_do. WHEN c_section_token-sys_admin. cs_itf-tdline = c_section_text-sys_admin. ENDCASE. ENDMETHOD. METHOD save_callstack. FIELD-SYMBOLS: <ls_callstack> LIKE LINE OF mt_callstack. CALL FUNCTION 'SYSTEM_CALLSTACK' IMPORTING callstack = mt_callstack. " You should remember that the first lines are from zcx_abapgit_exception " and are removed so that highest level in the callstack is the position where " the exception is raised. " " For the merged report it's hard to do that, because zcx_abapgit_exception " isn't visible in the callstack. Therefore we have to check the Events. LOOP AT mt_callstack ASSIGNING <ls_callstack>. IF <ls_callstack>-mainprogram CP |ZCX_ABAPGIT_EXCEPTION*| " full OR <ls_callstack>-blockname = `SAVE_CALLSTACK` " merged OR <ls_callstack>-blockname = `CONSTRUCTOR` " merged OR <ls_callstack>-blockname CP `RAISE*`. "merged DELETE TABLE mt_callstack FROM <ls_callstack>. ELSE. EXIT. ENDIF. ENDLOOP. ENDMETHOD. METHOD split_text_to_symsg. DATA ls_msg TYPE symsg. cl_message_helper=>set_msg_vars_for_clike( iv_text ). ls_msg-msgv1 = sy-msgv1. ls_msg-msgv2 = sy-msgv2. ls_msg-msgv3 = sy-msgv3. ls_msg-msgv4 = sy-msgv4. " Set syst using generic error message MESSAGE e001(00) WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO null. rs_msg = ls_msg. ENDMETHOD. ENDCLASS. |