diff --git a/src/kernel/call_transformation/kernel_call_transformation.clas.abap b/src/kernel/call_transformation/kernel_call_transformation.clas.abap index f88d099d..d0c8cbc8 100644 --- a/src/kernel/call_transformation/kernel_call_transformation.clas.abap +++ b/src/kernel/call_transformation/kernel_call_transformation.clas.abap @@ -42,10 +42,17 @@ CLASS kernel_call_transformation IMPLEMENTATION. DATA lv_dummy TYPE string. DATA li_writer TYPE REF TO if_sxml_writer. DATA li_doc TYPE REF TO if_ixml_document. + DATA lv_str_bom TYPE string. + DATA lv_hex_bom TYPE xstring. CLEAR mi_doc. + lv_hex_bom = cl_abap_char_utilities=>byte_order_mark_big. + lv_str_bom = cl_abap_codepage=>convert_from( + source = lv_hex_bom + codepage = 'UTF-16' ). + * WRITE '@KERNEL console.dir(INPUT);'. * only the ID transformation is implemented @@ -58,7 +65,7 @@ CLASS kernel_call_transformation IMPLEMENTATION. WRITE '@KERNEL if (INPUT.sourceXML?.constructor.name === "ABAPObject") this.mi_doc.set(INPUT.sourceXML);'. WRITE '@KERNEL if (INPUT.sourceXML?.constructor.name === "String") lv_source.set(INPUT.sourceXML);'. IF lv_source IS NOT INITIAL. - IF lv_source(1) = '<'. + IF lv_source(1) = '<' OR ( strlen( lv_source ) > 1 AND lv_source(1) = lv_str_bom AND lv_source+1(1) = '<' ). lv_type = 'XML'. parse_xml( lv_source ). ELSEIF lv_source(1) = '{' OR lv_source(1) = '['. diff --git a/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap b/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap index ab15d497..03ff83a3 100644 --- a/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap +++ b/src/kernel/call_transformation/kernel_call_transformation.clas.testclasses.abap @@ -129,6 +129,7 @@ CLASS ltcl_call_transformation DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATI METHODS xml_to_xml FOR TESTING RAISING cx_static_check. METHODS xml_to_xml_rm_header FOR TESTING RAISING cx_static_check. METHODS xml_to_xml_rm_header_bom FOR TESTING RAISING cx_static_check. + METHODS byte_order_mark FOR TESTING RAISING cx_static_check. ENDCLASS. CLASS ltcl_call_transformation IMPLEMENTATION. @@ -1142,4 +1143,30 @@ CLASS ltcl_call_transformation IMPLEMENTATION. ENDMETHOD. + METHOD byte_order_mark. + + DATA: BEGIN OF ls_data, + foo TYPE i, + END OF ls_data. + DATA lv_xml TYPE string. + DATA lv_str_bom TYPE string. + DATA lv_hex_bom TYPE xstring. + + lv_hex_bom = cl_abap_char_utilities=>byte_order_mark_big. + lv_str_bom = cl_abap_codepage=>convert_from( + source = lv_hex_bom + codepage = 'UTF-16' ). + + lv_xml = |{ lv_str_bom }| && + || && + || && + ||. + + CALL TRANSFORMATION id + OPTIONS value_handling = 'accept_data_loss' + SOURCE XML lv_xml + RESULT repo = ls_data. + + ENDMETHOD. + ENDCLASS. \ No newline at end of file