From 408f127b4a6329297255abc96c0f2b005cd86d94 Mon Sep 17 00:00:00 2001 From: pokrakam Date: Wed, 5 Aug 2020 06:51:55 +0100 Subject: [PATCH] Add exception instead of popup for background XML errors (#3708) * Add exception/message logic, refactoring * De-lint * More de-linting Co-authored-by: Lars Hvam --- src/xml/zcl_abapgit_xml.clas.abap | 118 ++++++++++++------ src/xml/zcl_abapgit_xml.clas.testclasses.abap | 43 ++++++- 2 files changed, 114 insertions(+), 47 deletions(-) diff --git a/src/xml/zcl_abapgit_xml.clas.abap b/src/xml/zcl_abapgit_xml.clas.abap index b14977f0c..95a5299f9 100644 --- a/src/xml/zcl_abapgit_xml.clas.abap +++ b/src/xml/zcl_abapgit_xml.clas.abap @@ -31,7 +31,14 @@ CLASS zcl_abapgit_xml DEFINITION IMPORTING ii_parser TYPE REF TO if_ixml_parser RAISING zcx_abapgit_exception. METHODS display_version_mismatch - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception. + METHODS show_parser_errors + IMPORTING ii_parser TYPE REF TO if_ixml_parser. + METHODS raise_exception_for + IMPORTING + ii_error TYPE REF TO if_ixml_parse_error + RAISING + zcx_abapgit_exception. ENDCLASS. @@ -54,7 +61,7 @@ CLASS zcl_abapgit_xml IMPLEMENTATION. lv_version = |abapGit version: { zif_abapgit_version=>gc_abap_version }|. "#EC NOTEXT IF mv_filename IS NOT INITIAL. - lv_file = |File: { mv_filename }|. "#EC NOTEXT + lv_file = |File: { mv_filename }|. "#EC NOTEXT ENDIF. CALL FUNCTION 'POPUP_TO_INFORM' @@ -76,48 +83,14 @@ CLASS zcl_abapgit_xml IMPLEMENTATION. METHOD error. - DATA: lv_error TYPE i, - lv_column TYPE string, - lv_line TYPE string, - lv_reason TYPE string, - lv_txt1 TYPE string, - lv_txt2 TYPE string, - lv_txt3 TYPE string, - lv_txt4 TYPE string, - lv_times TYPE i, - li_error TYPE REF TO if_ixml_parse_error. - IF ii_parser->num_errors( ) <> 0. - lv_times = ii_parser->num_errors( ). - DO lv_times TIMES. - lv_error = sy-index - 1. - li_error = ii_parser->get_error( lv_error ). + IF zcl_abapgit_ui_factory=>get_gui_functions( )->gui_is_available( ) = abap_true. + show_parser_errors( ii_parser ). + ELSE. + raise_exception_for( ii_parser->get_error( 0 ) ). + ENDIF. - lv_column = li_error->get_column( ). - lv_line = li_error->get_line( ). - lv_reason = li_error->get_reason( ). - - IF mv_filename IS NOT INITIAL. - lv_txt1 = |File: { mv_filename }|. "#EC NOTEXT - lv_txt2 = |Column: { lv_column }|. "#EC NOTEXT - lv_txt3 = |Line: { lv_line }|. "#EC NOTEXT - lv_txt4 = lv_reason. - ELSE. - lv_txt1 = |Column: { lv_column }|. "#EC NOTEXT - lv_txt2 = |Line: { lv_line }|. "#EC NOTEXT - lv_txt3 = lv_reason. - CLEAR lv_txt4. - ENDIF. - - CALL FUNCTION 'POPUP_TO_INFORM' - EXPORTING - titel = 'Error from XML parser' "#EC NOTEXT - txt1 = lv_txt1 - txt2 = lv_txt2 - txt3 = lv_txt3 - txt4 = lv_txt4. - ENDDO. ENDIF. IF mv_filename IS INITIAL. @@ -195,4 +168,67 @@ CLASS zcl_abapgit_xml IMPLEMENTATION. ENDIF. ENDMETHOD. + + METHOD show_parser_errors. + + DATA lv_error TYPE i. + DATA lv_column TYPE string. + DATA lv_line TYPE string. + DATA lv_reason TYPE string. + DATA lv_txt1 TYPE string. + DATA lv_txt2 TYPE string. + DATA lv_txt3 TYPE string. + DATA lv_txt4 TYPE string. + DATA lv_times TYPE i. + DATA li_error TYPE REF TO if_ixml_parse_error. + + lv_times = ii_parser->num_errors( ). + + DO lv_times TIMES. + lv_error = sy-index - 1. + li_error = ii_parser->get_error( lv_error ). + + lv_column = li_error->get_column( ). + lv_line = li_error->get_line( ). + lv_reason = li_error->get_reason( ). + + IF mv_filename IS NOT INITIAL. + lv_txt1 = |File: { mv_filename }|. "#EC NOTEXT + lv_txt2 = |Column: { lv_column }|. "#EC NOTEXT + lv_txt3 = |Line: { lv_line }|. "#EC NOTEXT + lv_txt4 = lv_reason. + ELSE. + lv_txt1 = |Column: { lv_column }|. "#EC NOTEXT + lv_txt2 = |Line: { lv_line }|. "#EC NOTEXT + lv_txt3 = lv_reason. + CLEAR lv_txt4. + ENDIF. + + CALL FUNCTION 'POPUP_TO_INFORM' + EXPORTING + titel = 'Error from XML parser' "#EC NOTEXT + txt1 = lv_txt1 + txt2 = lv_txt2 + txt3 = lv_txt3 + txt4 = lv_txt4. + ENDDO. + + ENDMETHOD. + + + METHOD raise_exception_for. + DATA lv_message TYPE string. + + lv_message = |XML parser error: { ii_error->get_reason( ) }, | && + |Line { ii_error->get_line( ) } | && + |Col. { ii_error->get_column( ) }|. "#EC NOTEXT + + IF mv_filename IS NOT INITIAL. + lv_message = lv_message && | File { mv_filename }|. + ENDIF. + + zcx_abapgit_exception=>raise( lv_message ). "#EC NOTEXT + + ENDMETHOD. + ENDCLASS. diff --git a/src/xml/zcl_abapgit_xml.clas.testclasses.abap b/src/xml/zcl_abapgit_xml.clas.testclasses.abap index 409951a77..e4ce244e6 100644 --- a/src/xml/zcl_abapgit_xml.clas.testclasses.abap +++ b/src/xml/zcl_abapgit_xml.clas.testclasses.abap @@ -13,9 +13,12 @@ CLASS ltcl_xml DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. + METHODS setup. + METHODS: space_leading_trailing FOR TESTING - RAISING zcx_abapgit_exception. + RAISING zcx_abapgit_exception, + bad_xml_without_gui_raises_exc FOR TESTING RAISING cx_static_check. METHODS: parse_xml @@ -29,19 +32,20 @@ CLASS ltcl_xml DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. RETURNING VALUE(rv_xml) TYPE string. - DATA: mo_xml TYPE REF TO ltcl_xml_concrete. + DATA mo_xml TYPE REF TO ltcl_xml_concrete. ENDCLASS. CLASS ltcl_xml IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_xml. + ENDMETHOD. + METHOD parse_xml. - DATA: lv_xml TYPE string. - - - CREATE OBJECT mo_xml. + DATA lv_xml TYPE string. lv_xml = || && |<{ mo_xml->c_abapgit_tag } { mo_xml->c_attr_version }="{ zif_abapgit_version=>gc_xml_version }">| @@ -86,4 +90,31 @@ CLASS ltcl_xml IMPLEMENTATION. ENDMETHOD. + METHOD bad_xml_without_gui_raises_exc. + DATA: lv_xml TYPE string, + lo_error TYPE REF TO zcx_abapgit_exception, + lv_text TYPE string. + + IF zcl_abapgit_ui_factory=>get_gui_functions( )->gui_is_available( ) = abap_true. + RETURN. "Can only test with ADT or in background + ENDIF. + + lv_xml = || + && |<{ mo_xml->c_abapgit_tag } { mo_xml->c_attr_version }="{ zif_abapgit_version=>gc_xml_version }">| + && || + && |c_abapgit_tag }>|. + + TRY. + mo_xml->parse( iv_xml = lv_xml ). + cl_abap_unit_assert=>fail( msg = 'Exception not raised' ). + + CATCH zcx_abapgit_exception INTO lo_error. + lv_text = lo_error->get_text( ). + cl_abap_unit_assert=>assert_char_cp( + act = lv_text + exp = '*open_tag*' ). + ENDTRY. + + ENDMETHOD. + ENDCLASS.