upport zcl_abapgit_convert (#6406)

This commit is contained in:
Lars Hvam 2023-08-16 17:24:28 +02:00 committed by GitHub
parent 83e43dfc04
commit 9284a7342e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 190 additions and 104 deletions

View File

@ -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 <lg_line>.
<lg_line> = iv_str.
DESCRIBE FIELD <lg_line> LENGTH lv_length IN CHARACTER MODE.
lv_length = cl_abap_typedescr=>describe_by_data( <lg_line> )->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 <lg_line>.
<lg_line> = iv_xstr.
DESCRIBE FIELD <lg_line> LENGTH lv_length IN BYTE MODE.
lv_length = cl_abap_typedescr=>describe_by_data( <lg_line> )->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.

View File

@ -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.