Refactor: BOM handling (#5878)

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Marc Bernard 2022-11-22 13:14:07 -05:00 committed by GitHub
parent ba3d9e43cb
commit a6ec3e0c3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 43 deletions

View File

@ -221,6 +221,11 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD get_version_constant.
rv_version_constant = ms_data-version_constant.
ENDMETHOD.
METHOD is_ignored. METHOD is_ignored.
DATA: lv_name TYPE string, DATA: lv_name TYPE string,
@ -277,22 +282,10 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION.
METHOD serialize. METHOD serialize.
DATA: lv_xml TYPE string, DATA lv_xml TYPE string.
lv_mark TYPE string.
lv_xml = to_xml( ms_data ). 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 ). rv_xstr = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_xml ).
ENDMETHOD. ENDMETHOD.
@ -317,14 +310,12 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION.
ms_data-starting_folder = iv_path. ms_data-starting_folder = iv_path.
ENDMETHOD. ENDMETHOD.
METHOD get_version_constant.
rv_version_constant = ms_data-version_constant.
ENDMETHOD.
METHOD set_version_constant. METHOD set_version_constant.
ms_data-version_constant = iv_version_constant. ms_data-version_constant = iv_version_constant.
ENDMETHOD. ENDMETHOD.
METHOD to_file. METHOD to_file.
rs_file-path = zif_abapgit_definitions=>c_root_dir. rs_file-path = zif_abapgit_definitions=>c_root_dir.
rs_file-filename = zif_abapgit_definitions=>c_dot_abapgit. rs_file-filename = zif_abapgit_definitions=>c_dot_abapgit.
@ -349,5 +340,4 @@ CLASS zcl_abapgit_dot_abapgit IMPLEMENTATION.
ASSERT sy-subrc = 0. ASSERT sy-subrc = 0.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -211,8 +211,10 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
ENDIF. ENDIF.
go_convert_out->convert( go_convert_out->convert(
EXPORTING data = iv_string EXPORTING
IMPORTING buffer = rv_xstring ). data = iv_string
IMPORTING
buffer = rv_xstring ).
CATCH cx_parameter_invalid_range CATCH cx_parameter_invalid_range
cx_sy_codepage_converter_init cx_sy_codepage_converter_init
@ -226,21 +228,15 @@ CLASS zcl_abapgit_convert IMPLEMENTATION.
METHOD string_to_xstring_utf8_bom. METHOD string_to_xstring_utf8_bom.
DATA: lv_hex TYPE x LENGTH 1 VALUE '23', IF iv_string IS INITIAL.
lv_hex_bom TYPE x LENGTH 3 VALUE 'EFBBBF'. RETURN.
ENDIF.
rv_xstring = string_to_xstring_utf8( iv_string ). rv_xstring = string_to_xstring_utf8( iv_string ).
"unicode systems always add the byte order mark to the xml, while non-unicode does not " Add UTF-8 BOM
"in class ZCL_ABAPGIT_XML~TO_XML byte order mark was added to XML as # IF xstrlen( rv_xstring ) < 3 OR rv_xstring(3) <> cl_abap_char_utilities=>byte_order_mark_utf8.
"In non-unicode systems zcl_abapgit_convert=>xstring_to_string_utf8( cl_abap_char_utilities=>byte_order_mark_utf8 ) rv_xstring = cl_abap_char_utilities=>byte_order_mark_utf8 && rv_xstring.
"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.
ENDIF. ENDIF.
ENDMETHOD. ENDMETHOD.

View File

@ -10,6 +10,7 @@ CLASS ltcl_convert DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FIN
METHODS split_string FOR TESTING. METHODS split_string FOR TESTING.
METHODS convert_bitbyte FOR TESTING RAISING zcx_abapgit_exception. 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 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_utf8 FOR TESTING RAISING zcx_abapgit_exception.
METHODS xstring_to_string_not_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. METHODS base64_to_xstring FOR TESTING.
@ -113,6 +114,12 @@ CLASS ltcl_convert IMPLEMENTATION.
DATA lv_result TYPE xstring. 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' ). lv_result = zcl_abapgit_convert=>string_to_xstring_utf8( 'abc' ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(
@ -121,10 +128,40 @@ CLASS ltcl_convert IMPLEMENTATION.
ENDMETHOD. 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. METHOD xstring_to_string_utf8.
DATA lv_result TYPE string. 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' ). lv_result = zcl_abapgit_convert=>xstring_to_string_utf8( '616263' ).
cl_abap_unit_assert=>assert_equals( cl_abap_unit_assert=>assert_equals(

View File

@ -148,10 +148,8 @@ CLASS zcl_abapgit_xml IMPLEMENTATION.
DATA: li_ostream TYPE REF TO if_ixml_ostream, DATA: li_ostream TYPE REF TO if_ixml_ostream,
li_renderer TYPE REF TO if_ixml_renderer, li_renderer TYPE REF TO if_ixml_renderer,
lv_mark TYPE string,
li_streamfactory TYPE REF TO if_ixml_stream_factory. li_streamfactory TYPE REF TO if_ixml_stream_factory.
li_streamfactory = mi_ixml->create_stream_factory( ). li_streamfactory = mi_ixml->create_stream_factory( ).
li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ). li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ).
@ -162,16 +160,7 @@ CLASS zcl_abapgit_xml IMPLEMENTATION.
li_renderer->render( ). li_renderer->render( ).
"unicode systems always add the byte order mark to the xml, while non-unicode does not " handling of BOM moved to zcl_abapgit_convert=>string_to_xstring_utf8_bom
"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.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.