From 9284a7342e4586e63fd3295bd2da35d9c8ddb521 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Wed, 16 Aug 2023 17:24:28 +0200 Subject: [PATCH] upport zcl_abapgit_convert (#6406) --- src/utils/zcl_abapgit_convert.clas.abap | 176 +++++++----------- .../zcl_abapgit_convert.clas.locals_imp.abap | 118 ++++++++++++ 2 files changed, 190 insertions(+), 104 deletions(-) create mode 100644 src/utils/zcl_abapgit_convert.clas.locals_imp.abap diff --git a/src/utils/zcl_abapgit_convert.clas.abap b/src/utils/zcl_abapgit_convert.clas.abap index 3fda961e0..fd5cab34b 100644 --- a/src/utils/zcl_abapgit_convert.clas.abap +++ b/src/utils/zcl_abapgit_convert.clas.abap @@ -101,10 +101,6 @@ CLASS zcl_abapgit_convert DEFINITION PROTECTED SECTION. PRIVATE SECTION. - - CLASS-DATA go_convert_out TYPE REF TO cl_abap_conv_out_ce . - CLASS-DATA go_convert_in TYPE REF TO cl_abap_conv_in_ce . - CLASS-METHODS xstring_remove_bom IMPORTING iv_xstr TYPE xsequence @@ -114,7 +110,7 @@ ENDCLASS. -CLASS zcl_abapgit_convert IMPLEMENTATION. +CLASS ZCL_ABAPGIT_CONVERT IMPLEMENTATION. METHOD base64_to_xstring. @@ -156,11 +152,14 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. METHOD conversion_exit_isola_output. - cl_gdt_conversion=>language_code_outbound( + language_sap1_to_sap2( EXPORTING - im_value = iv_spras - IMPORTING - ex_value = rv_spras ). + im_lang_sap1 = iv_spras + RECEIVING + re_lang_sap2 = rv_spras + EXCEPTIONS + no_assignment = 1 + OTHERS = 2 ). "#EC CI_SUBRC TRANSLATE rv_spras TO UPPER CASE. @@ -178,6 +177,62 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. ENDMETHOD. + METHOD language_sap1_to_sap2. + + DATA lv_class TYPE string. + + TRY. + SELECT SINGLE languageisocode FROM ('I_LANGUAGE') + INTO re_lang_sap2 + WHERE language = im_lang_sap1. + IF sy-subrc <> 0. + RAISE no_assignment. + ENDIF. + CATCH cx_sy_dynamic_osql_error. + lv_class = 'CL_I18N_LANGUAGES'. + CALL METHOD (lv_class)=>sap1_to_sap2 + EXPORTING + im_lang_sap1 = im_lang_sap1 + RECEIVING + re_lang_sap2 = re_lang_sap2 + EXCEPTIONS + no_assignment = 1 + OTHERS = 2. + IF sy-subrc = 1. + RAISE no_assignment. + ENDIF. + ENDTRY. + ENDMETHOD. + + + METHOD language_sap2_to_sap1. + + DATA lv_class TYPE string. + + TRY. + SELECT SINGLE language FROM ('I_LANGUAGE') + INTO re_lang_sap1 + WHERE languageisocode = im_lang_sap2. + IF sy-subrc <> 0. + RAISE no_assignment. + ENDIF. + CATCH cx_sy_dynamic_osql_error. + lv_class = 'CL_I18N_LANGUAGES'. + CALL METHOD (lv_class)=>sap2_to_sap1 + EXPORTING + im_lang_sap2 = im_lang_sap2 + RECEIVING + re_lang_sap1 = re_lang_sap1 + EXCEPTIONS + no_assignment = 1 + OTHERS = 2. + IF sy-subrc = 1. + RAISE no_assignment. + ENDIF. + ENDTRY. + ENDMETHOD. + + METHOD split_string. FIND FIRST OCCURRENCE OF cl_abap_char_utilities=>cr_lf IN iv_string. @@ -206,7 +261,7 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. APPEND INITIAL LINE TO et_tab ASSIGNING . = iv_str. - DESCRIBE FIELD LENGTH lv_length IN CHARACTER MODE. + lv_length = cl_abap_typedescr=>describe_by_data( )->length / cl_abap_char_utilities=>charsize. lv_iterations = ev_size DIV lv_length. DO lv_iterations TIMES. @@ -227,25 +282,7 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. METHOD string_to_xstring_utf8. - DATA lx_error TYPE REF TO cx_root. - - TRY. - IF go_convert_out IS INITIAL. - go_convert_out = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ). - ENDIF. - - go_convert_out->convert( - EXPORTING - data = iv_string - IMPORTING - buffer = rv_xstring ). - - CATCH cx_parameter_invalid_range - cx_sy_codepage_converter_init - cx_sy_conversion_codepage - cx_parameter_invalid_type INTO lx_error. - zcx_abapgit_exception=>raise_with_text( lx_error ). - ENDTRY. + rv_xstring = lcl_out=>convert( iv_string ). ENDMETHOD. @@ -295,7 +332,8 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. APPEND INITIAL LINE TO et_bintab ASSIGNING . = iv_xstr. - DESCRIBE FIELD LENGTH lv_length IN BYTE MODE. + + lv_length = cl_abap_typedescr=>describe_by_data( )->length. lv_iterations = ev_size DIV lv_length. DO lv_iterations TIMES. @@ -317,8 +355,7 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. METHOD xstring_to_string_utf8. - DATA lx_error TYPE REF TO cx_root. - DATA lv_data TYPE xstring. + DATA lv_data TYPE xstring. DATA lv_length TYPE i. " Remove BOM for non-Unicode systems @@ -329,24 +366,9 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. lv_length = xstrlen( lv_data ). ENDIF. - TRY. - IF go_convert_in IS INITIAL. - go_convert_in = cl_abap_conv_in_ce=>create( encoding = 'UTF-8' ). - ENDIF. - - go_convert_in->convert( - EXPORTING - input = lv_data - n = lv_length - IMPORTING - data = rv_string ). - - CATCH cx_parameter_invalid_range - cx_sy_codepage_converter_init - cx_sy_conversion_codepage - cx_parameter_invalid_type INTO lx_error. - zcx_abapgit_exception=>raise_with_text( lx_error ). - ENDTRY. + rv_string = lcl_in=>convert( + iv_data = lv_data + iv_length = lv_length ). ENDMETHOD. @@ -365,58 +387,4 @@ CLASS zcl_abapgit_convert IMPLEMENTATION. GET BIT 8 OF iv_x INTO rv_bitbyte+7(1). ENDMETHOD. - - METHOD language_sap1_to_sap2. - - DATA lv_class TYPE string. - - TRY. - SELECT SINGLE languageisocode FROM ('I_LANGUAGE') - INTO re_lang_sap2 - WHERE language = im_lang_sap1. - IF sy-subrc <> 0. - RAISE no_assignment. - ENDIF. - CATCH cx_sy_dynamic_osql_error. - lv_class = 'CL_I18N_LANGUAGES'. - CALL METHOD (lv_class)=>sap1_to_sap2 - EXPORTING - im_lang_sap1 = im_lang_sap1 - RECEIVING - re_lang_sap2 = re_lang_sap2 - EXCEPTIONS - no_assignment = 1 - OTHERS = 2. - IF sy-subrc = 1. - RAISE no_assignment. - ENDIF. - ENDTRY. - ENDMETHOD. - - METHOD language_sap2_to_sap1. - - DATA lv_class TYPE string. - - TRY. - SELECT SINGLE language FROM ('I_LANGUAGE') - INTO re_lang_sap1 - WHERE languageisocode = im_lang_sap2. - IF sy-subrc <> 0. - RAISE no_assignment. - ENDIF. - CATCH cx_sy_dynamic_osql_error. - lv_class = 'CL_I18N_LANGUAGES'. - CALL METHOD (lv_class)=>sap2_to_sap1 - EXPORTING - im_lang_sap2 = im_lang_sap2 - RECEIVING - re_lang_sap1 = re_lang_sap1 - EXCEPTIONS - no_assignment = 1 - OTHERS = 2. - IF sy-subrc = 1. - RAISE no_assignment. - ENDIF. - ENDTRY. - ENDMETHOD. ENDCLASS. diff --git a/src/utils/zcl_abapgit_convert.clas.locals_imp.abap b/src/utils/zcl_abapgit_convert.clas.locals_imp.abap new file mode 100644 index 000000000..6cf7ccdd4 --- /dev/null +++ b/src/utils/zcl_abapgit_convert.clas.locals_imp.abap @@ -0,0 +1,118 @@ +CLASS lcl_in DEFINITION. + PUBLIC SECTION. + CLASS-METHODS convert + IMPORTING + !iv_data TYPE xsequence + !iv_length TYPE i OPTIONAL + RETURNING + VALUE(rv_string) TYPE string + RAISING + zcx_abapgit_exception. + PRIVATE SECTION. + CLASS-DATA go_conv_new TYPE REF TO object. + CLASS-DATA go_conv_old TYPE REF TO object. +ENDCLASS. + +CLASS lcl_in IMPLEMENTATION. + METHOD convert. + + DATA lv_class TYPE string. + DATA lx_error TYPE REF TO cx_root. + + IF go_conv_new IS INITIAL AND go_conv_old IS INITIAL. + TRY. + CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_in + RECEIVING + instance = go_conv_new. + CATCH cx_sy_dyn_call_illegal_class. + lv_class = 'CL_ABAP_CONV_IN_CE'. + CALL METHOD (lv_class)=>create + EXPORTING + encoding = 'UTF-8' + RECEIVING + conv = go_conv_old. + ENDTRY. + ENDIF. + + TRY. + IF go_conv_new IS NOT INITIAL. + CALL METHOD go_conv_new->('IF_ABAP_CONV_IN~CONVERT') + EXPORTING + source = iv_data + RECEIVING + result = rv_string. + rv_string = rv_string(iv_length). + ELSE. + CALL METHOD go_conv_old->('CONVERT') + EXPORTING + input = iv_data + n = iv_length + IMPORTING + data = rv_string. + ENDIF. + CATCH cx_parameter_invalid_range + cx_sy_codepage_converter_init + cx_sy_conversion_codepage + cx_parameter_invalid_type INTO lx_error. + zcx_abapgit_exception=>raise_with_text( lx_error ). + ENDTRY. + + ENDMETHOD. +ENDCLASS. + +CLASS lcl_out DEFINITION. + PUBLIC SECTION. + CLASS-METHODS convert + IMPORTING + !iv_string TYPE string + RETURNING + VALUE(rv_xstring) TYPE xstring + RAISING + zcx_abapgit_exception. + PRIVATE SECTION. + CLASS-DATA go_conv_new TYPE REF TO object. + CLASS-DATA go_conv_old TYPE REF TO object. +ENDCLASS. + +CLASS lcl_out IMPLEMENTATION. + METHOD convert. + DATA lx_error TYPE REF TO cx_root. + DATA lv_class TYPE string. + + IF go_conv_new IS INITIAL AND go_conv_old IS INITIAL. + TRY. + CALL METHOD ('CL_ABAP_CONV_CODEPAGE')=>create_out + RECEIVING + instance = go_conv_new. + CATCH cx_sy_dyn_call_illegal_class. + lv_class = 'CL_ABAP_CONV_OUT_CE'. + CALL METHOD (lv_class)=>create + EXPORTING + encoding = 'UTF-8' + RECEIVING + conv = go_conv_old. + ENDTRY. + ENDIF. + + TRY. + IF go_conv_new IS NOT INITIAL. + CALL METHOD go_conv_new->('IF_ABAP_CONV_OUT~CONVERT') + EXPORTING + source = iv_string + RECEIVING + result = rv_xstring. + ELSE. + CALL METHOD go_conv_old->('CONVERT') + EXPORTING + data = iv_string + IMPORTING + buffer = rv_xstring. + ENDIF. + CATCH cx_parameter_invalid_range + cx_sy_codepage_converter_init + cx_sy_conversion_codepage + cx_parameter_invalid_type INTO lx_error. + zcx_abapgit_exception=>raise_with_text( lx_error ). + ENDTRY. + ENDMETHOD. +ENDCLASS.