From a6ec3e0c3ee0dd36cc281e5c2e793f374f051716 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Tue, 22 Nov 2022 13:14:07 -0500 Subject: [PATCH] Refactor: BOM handling (#5878) Co-authored-by: Lars Hvam --- src/repo/zcl_abapgit_dot_abapgit.clas.abap | 24 ++++-------- src/utils/zcl_abapgit_convert.clas.abap | 24 +++++------- .../zcl_abapgit_convert.clas.testclasses.abap | 37 +++++++++++++++++++ src/xml/zcl_abapgit_xml.clas.abap | 13 +------ 4 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/repo/zcl_abapgit_dot_abapgit.clas.abap b/src/repo/zcl_abapgit_dot_abapgit.clas.abap index d87836ecb..490a495eb 100644 --- a/src/repo/zcl_abapgit_dot_abapgit.clas.abap +++ b/src/repo/zcl_abapgit_dot_abapgit.clas.abap @@ -221,6 +221,11 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. ENDMETHOD. + METHOD get_version_constant. + rv_version_constant = ms_data-version_constant. + ENDMETHOD. + + METHOD is_ignored. DATA: lv_name TYPE string, @@ -277,22 +282,10 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. METHOD serialize. - DATA: lv_xml TYPE string, - lv_mark TYPE string. + DATA lv_xml TYPE string. lv_xml = to_xml( ms_data ). - "unicode systems always add the byte order mark to the xml, while non-unicode does not - "this code will always add the byte order mark if it is not in the xml - TRY. - lv_mark = zcl_abapgit_convert=>xstring_to_string_utf8( cl_abap_char_utilities=>byte_order_mark_utf8 ). - CATCH zcx_abapgit_exception ##NO_HANDLER. -* In non-unicode systems, the byte order mark throws an error - ENDTRY. - IF lv_xml(1) <> lv_mark. - CONCATENATE lv_mark lv_xml INTO lv_xml. - ENDIF. - rv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_xml ). ENDMETHOD. @@ -317,14 +310,12 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. ms_data-starting_folder = iv_path. ENDMETHOD. - METHOD get_version_constant. - rv_version_constant = ms_data-version_constant. - ENDMETHOD. METHOD set_version_constant. ms_data-version_constant = iv_version_constant. ENDMETHOD. + METHOD to_file. rs_file-path = zif_abapgit_definitions=>c_root_dir. rs_file-filename = zif_abapgit_definitions=>c_dot_abapgit. @@ -349,5 +340,4 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION. ASSERT sy-subrc = 0. ENDMETHOD. - ENDCLASS. diff --git a/src/utils/zcl_abapgit_convert.clas.abap b/src/utils/zcl_abapgit_convert.clas.abap index 8e0892f6c..1acdee17d 100644 --- a/src/utils/zcl_abapgit_convert.clas.abap +++ b/src/utils/zcl_abapgit_convert.clas.abap @@ -211,8 +211,10 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. ENDIF. go_convert_out->convert( - EXPORTING data = iv_string - IMPORTING buffer = rv_xstring ). + EXPORTING + data = iv_string + IMPORTING + buffer = rv_xstring ). CATCH cx_parameter_invalid_range cx_sy_codepage_converter_init @@ -226,21 +228,15 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. METHOD string_to_xstring_utf8_bom. - DATA: lv_hex TYPE x LENGTH 1 VALUE '23', - lv_hex_bom TYPE x LENGTH 3 VALUE 'EFBBBF'. + IF iv_string IS INITIAL. + RETURN. + ENDIF. rv_xstring = string_to_xstring_utf8( iv_string ). - "unicode systems always add the byte order mark to the xml, while non-unicode does not - "in class ZCL_ABAPGIT_XML~TO_XML byte order mark was added to XML as # - "In non-unicode systems zcl_abapgit_convert=>xstring_to_string_utf8( cl_abap_char_utilities=>byte_order_mark_utf8 ) - "has result # as HEX 23 and not HEX EFBBBF. - "So we have to remove 23 first and add EFBBBF after to serialized string - IF rv_xstring(3) <> cl_abap_char_utilities=>byte_order_mark_utf8 - AND rv_xstring(1) = lv_hex. - REPLACE FIRST OCCURRENCE - OF lv_hex IN rv_xstring WITH lv_hex_bom IN BYTE MODE. - ASSERT sy-subrc = 0. + " Add UTF-8 BOM + IF xstrlen( rv_xstring ) < 3 OR rv_xstring(3) <> cl_abap_char_utilities=>byte_order_mark_utf8. + rv_xstring = cl_abap_char_utilities=>byte_order_mark_utf8 && rv_xstring. ENDIF. ENDMETHOD. diff --git a/src/utils/zcl_abapgit_convert.clas.testclasses.abap b/src/utils/zcl_abapgit_convert.clas.testclasses.abap index 2acebabd2..4d90af4b6 100644 --- a/src/utils/zcl_abapgit_convert.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_convert.clas.testclasses.abap @@ -10,6 +10,7 @@ CLASS ltcl_convert DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FIN METHODS split_string FOR TESTING. METHODS convert_bitbyte FOR TESTING RAISING zcx_abapgit_exception. METHODS string_to_xstring_utf8 FOR TESTING RAISING zcx_abapgit_exception. + METHODS string_to_xstring_utf8_bom FOR TESTING RAISING zcx_abapgit_exception. METHODS xstring_to_string_utf8 FOR TESTING RAISING zcx_abapgit_exception. METHODS xstring_to_string_not_utf8 FOR TESTING RAISING zcx_abapgit_exception. METHODS base64_to_xstring FOR TESTING. @@ -113,6 +114,12 @@ CLASS ltcl_convert IMPLEMENTATION. DATA lv_result TYPE xstring. + lv_result = zcl_abapgit_convert=>string_to_xstring_utf8( `` ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = `` ). + lv_result = zcl_abapgit_convert=>string_to_xstring_utf8( 'abc' ). cl_abap_unit_assert=>assert_equals( @@ -121,10 +128,40 @@ CLASS ltcl_convert IMPLEMENTATION. ENDMETHOD. + METHOD string_to_xstring_utf8_bom. + + DATA lv_result TYPE xstring. + + lv_result = zcl_abapgit_convert=>string_to_xstring_utf8_bom( `` ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = `` ). + + lv_result = zcl_abapgit_convert=>string_to_xstring_utf8_bom( 'a' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = 'EFBBBF61' ). + + lv_result = zcl_abapgit_convert=>string_to_xstring_utf8_bom( 'abcd' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = 'EFBBBF61626364' ). + + ENDMETHOD. + METHOD xstring_to_string_utf8. DATA lv_result TYPE string. + lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( `` ). + + cl_abap_unit_assert=>assert_equals( + act = lv_result + exp = `` ). + lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( '616263' ). cl_abap_unit_assert=>assert_equals( diff --git a/src/xml/zcl_abapgit_xml.clas.abap b/src/xml/zcl_abapgit_xml.clas.abap index aa70e5fec..30111cef6 100644 --- a/src/xml/zcl_abapgit_xml.clas.abap +++ b/src/xml/zcl_abapgit_xml.clas.abap @@ -148,10 +148,8 @@ CLASS zcl_abapgit_xml IMPLEMENTATION. DATA: li_ostream TYPE REF TO if_ixml_ostream, li_renderer TYPE REF TO if_ixml_renderer, - lv_mark TYPE string, li_streamfactory TYPE REF TO if_ixml_stream_factory. - li_streamfactory = mi_ixml->create_stream_factory( ). li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ). @@ -162,16 +160,7 @@ CLASS zcl_abapgit_xml IMPLEMENTATION. li_renderer->render( ). - "unicode systems always add the byte order mark to the xml, while non-unicode does not - "this code will always add the byte order mark if it is not in the xml - TRY. - lv_mark = zcl_abapgit_convert=>xstring_to_string_utf8( cl_abap_char_utilities=>byte_order_mark_utf8 ). - CATCH zcx_abapgit_exception ##NO_HANDLER. - ASSERT 0 = 1. - ENDTRY. - IF rv_xml(1) <> lv_mark. - CONCATENATE lv_mark rv_xml INTO rv_xml. - ENDIF. + " handling of BOM moved to zcl_abapgit_convert=>string_to_xstring_utf8_bom ENDMETHOD. ENDCLASS.