mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
Refactor: BOM handling (#5878)
Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
parent
ba3d9e43cb
commit
a6ec3e0c3e
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue
Block a user