From a7f9ceedea043f607c72ec3582756b5585da97e3 Mon Sep 17 00:00:00 2001 From: Albert Mink Date: Wed, 21 Feb 2024 10:50:48 +0100 Subject: [PATCH] Translation for INTF in AFF (#6774) Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com> Co-authored-by: Lars Hvam --- .../aff/zcl_abapgit_json_path.clas.abap | 39 ++++ ...zcl_abapgit_json_path.clas.locals_imp.abap | 182 ++++++++++++++++++ ...cl_abapgit_json_path.clas.testclasses.abap | 142 ++++++++++++++ .../aff/zcl_abapgit_json_path.clas.xml | 17 ++ .../zcl_abapgit_properties_file.clas.abap | 70 +++++++ .../zcl_abapgit_properties_file.clas.xml | 16 ++ src/objects/zcl_abapgit_object_intf.clas.abap | 14 +- ...l_abapgit_object_intf.clas.locals_imp.abap | 114 ++++++++--- .../zcl_abapgit_objects.clas.testclasses.abap | 75 +++++++- test/abap_transpile.json | 1 + 10 files changed, 644 insertions(+), 26 deletions(-) create mode 100644 src/objects/aff/zcl_abapgit_json_path.clas.abap create mode 100644 src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap create mode 100644 src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap create mode 100644 src/objects/aff/zcl_abapgit_json_path.clas.xml create mode 100644 src/objects/texts/zcl_abapgit_properties_file.clas.abap create mode 100644 src/objects/texts/zcl_abapgit_properties_file.clas.xml diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.abap b/src/objects/aff/zcl_abapgit_json_path.clas.abap new file mode 100644 index 000000000..47f65ca64 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_json_path.clas.abap @@ -0,0 +1,39 @@ +CLASS zcl_abapgit_json_path DEFINITION PUBLIC CREATE PUBLIC. + PUBLIC SECTION. + METHODS: serialize + IMPORTING iv_json TYPE string + RETURNING VALUE(rt_result) TYPE string_table + RAISING zcx_abapgit_exception. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + +CLASS zcl_abapgit_json_path IMPLEMENTATION. + + METHOD serialize. + DATA: lo_json_path TYPE REF TO lcl_json_path, + lv_json_xstring TYPE xstring, + lt_root_path TYPE string_table, + lo_reader TYPE REF TO if_sxml_reader, + lx_parse_error TYPE REF TO cx_sxml_parse_error. + + lv_json_xstring = zcl_abapgit_convert=>string_to_xstring_utf8( iv_json ). + lo_reader = cl_sxml_string_reader=>create( input = lv_json_xstring ). + + TRY. + IF lo_reader->read_next_node( ) IS INITIAL. + RETURN. + ENDIF. + CATCH cx_sxml_parse_error INTO lx_parse_error. + zcx_abapgit_exception=>raise_with_text( lx_parse_error ). + ENDTRY. + + APPEND `$` TO lt_root_path. + + CREATE OBJECT lo_json_path. + lo_json_path->serialize_rec( EXPORTING io_reader = lo_reader + it_path = lt_root_path + CHANGING ct_json_paths = rt_result ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap b/src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap new file mode 100644 index 000000000..c19685295 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_json_path.clas.locals_imp.abap @@ -0,0 +1,182 @@ +*"* use this source file for the definition and implementation of +*"* local helper classes, interface definitions and type +*"* declarations + +CLASS lcl_json_path DEFINITION CREATE PUBLIC. + + PUBLIC SECTION. + METHODS: + serialize_rec + IMPORTING io_reader TYPE REF TO if_sxml_reader + it_path TYPE string_table + CHANGING ct_json_paths TYPE string_table. + + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS: + is_array + IMPORTING io_reader TYPE REF TO if_sxml_reader + RETURNING VALUE(rv_result) TYPE abap_bool. + METHODS: + is_string_open + IMPORTING io_reader TYPE REF TO if_sxml_reader + RETURNING VALUE(rv_result) TYPE abap_bool. + METHODS: + is_object + IMPORTING io_reader TYPE REF TO if_sxml_reader + RETURNING VALUE(rv_result) TYPE abap_bool. + METHODS: + serialize_rec_array + IMPORTING io_reader TYPE REF TO if_sxml_reader + it_path TYPE string_table + CHANGING ct_json_paths TYPE string_table. + METHODS: + get_json_path + IMPORTING it_path TYPE string_table + RETURNING VALUE(rv_result) TYPE string. + +ENDCLASS. + +CLASS lcl_json_path IMPLEMENTATION. + + METHOD is_array. + rv_result = boolc( io_reader->name = 'array' ). + ENDMETHOD. + + METHOD is_string_open. + rv_result = boolc( io_reader->name = 'str' AND io_reader->node_type = if_sxml_node=>co_nt_element_open ). + ENDMETHOD. + + METHOD is_object. + rv_result = boolc( io_reader->name = 'object' ). + ENDMETHOD. + + METHOD serialize_rec. + DATA: lt_new_path TYPE string_table, + lv_key TYPE string. + + lt_new_path = it_path. + + IF io_reader->read_next_node( ) IS INITIAL. + RETURN. + ENDIF. + + IF is_string_open( io_reader ) = abap_true. + + APPEND io_reader->value TO lt_new_path. + lv_key = get_json_path( lt_new_path ). + + io_reader->read_next_node( ). + lv_key = |{ lv_key }={ io_reader->value }|. + APPEND lv_key TO ct_json_paths. + + io_reader->read_next_node( ). + DELETE lt_new_path INDEX lines( lt_new_path ). + + serialize_rec( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ELSEIF is_object( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open. + + APPEND io_reader->value TO lt_new_path. + serialize_rec( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ELSEIF is_array( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open. + + APPEND io_reader->value TO lt_new_path. + serialize_rec_array( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ELSEIF ( is_object( io_reader ) = abap_true OR is_array( io_reader ) = abap_true ) + AND io_reader->node_type = if_sxml_node=>co_nt_element_close. + + DELETE lt_new_path INDEX lines( lt_new_path ). + serialize_rec( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ENDIF. + + ENDMETHOD. + + + METHOD serialize_rec_array. + DATA: lt_new_path TYPE string_table, + lv_json_path TYPE string, + lv_array_key TYPE string. + + lt_new_path = it_path. + + IF io_reader->read_next_node( ) IS INITIAL. + RETURN. + ENDIF. + + IF is_string_open( io_reader ) = abap_true. + + APPEND io_reader->value TO lt_new_path. + lv_json_path = get_json_path( lt_new_path ). + + io_reader->read_next_node( ). + lv_json_path = |{ lv_json_path }={ io_reader->value }|. + APPEND lv_json_path TO ct_json_paths. + io_reader->read_next_node( ). + + serialize_rec( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ELSEIF is_object( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open. + + io_reader->read_next_node( ). + lv_array_key = io_reader->value. + io_reader->read_next_node( ). + lv_array_key = |[?(@.{ lv_array_key }=='{ io_reader->value }')]|. + APPEND lv_array_key TO lt_new_path. + io_reader->read_next_node( ). + + io_reader->read_next_node( ). + APPEND io_reader->value TO lt_new_path. + lv_json_path = get_json_path( lt_new_path ). + + io_reader->read_next_node( ). + lv_json_path = |{ lv_json_path }={ io_reader->value }|. + APPEND lv_json_path TO ct_json_paths. + io_reader->read_next_node( ). + + DELETE lt_new_path INDEX lines( lt_new_path ). + serialize_rec_array( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ELSEIF is_array( io_reader ) = abap_true AND io_reader->node_type = if_sxml_node=>co_nt_element_open. + + APPEND io_reader->value TO lt_new_path. + serialize_rec_array( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ELSEIF ( is_object( io_reader ) = abap_true OR is_array( io_reader ) = abap_true ) + AND io_reader->node_type = if_sxml_node=>co_nt_element_close. + + DELETE lt_new_path INDEX lines( lt_new_path ). + serialize_rec_array( EXPORTING io_reader = io_reader + it_path = lt_new_path + CHANGING ct_json_paths = ct_json_paths ). + + ENDIF. + + ENDMETHOD. + + METHOD get_json_path. + rv_result = concat_lines_of( table = it_path + sep = `.` ). + REPLACE ALL OCCURRENCES OF `.[` IN rv_result WITH `[`. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap b/src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap new file mode 100644 index 000000000..3300b75d0 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_json_path.clas.testclasses.abap @@ -0,0 +1,142 @@ +CLASS ltcl_json_path DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + DATA: mt_act TYPE string_table, + mt_exp TYPE string_table, + ms_data TYPE zif_abapgit_aff_intf_v1=>ty_main. + METHODS: + flat_structure FOR TESTING RAISING cx_static_check, + array FOR TESTING RAISING cx_static_check, + array_nested FOR TESTING RAISING cx_static_check. + METHODS: + serialize + IMPORTING is_data TYPE zif_abapgit_aff_intf_v1=>ty_main + RETURNING VALUE(rt_result) TYPE string_table + RAISING zcx_abapgit_ajson_error + zcx_abapgit_exception. +ENDCLASS. + + +CLASS ltcl_json_path IMPLEMENTATION. + + METHOD serialize. + DATA: + lo_ajson TYPE REF TO zif_abapgit_ajson, + lo_cut TYPE REF TO zcl_abapgit_json_path. + + + lo_ajson = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true + )->set( iv_path = '/' + iv_val = is_data + )->map( zcl_abapgit_ajson_mapping=>create_to_camel_case( ) + )->filter( zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ). + + lo_ajson->delete( '/category/' ). + lo_ajson->delete( '/proxy/' ). + + CREATE OBJECT lo_cut. + rt_result = lo_cut->serialize( lo_ajson->stringify( ) ). + ENDMETHOD. + + + METHOD flat_structure. + DATA lv_header_descr TYPE string. + lv_header_descr = `$.header.description=Text`. + + ms_data-header-description = 'Text'. + + mt_act = serialize( ms_data ). + APPEND lv_header_descr TO mt_exp. + + cl_abap_unit_assert=>assert_equals( exp = mt_exp + act = mt_act ). + + ENDMETHOD. + + METHOD array. + DATA lv_header_descr TYPE string. + DATA lv_descr_meth_1 TYPE string. + DATA lv_descr_meth_2 TYPE string. + DATA ls_meth_desc TYPE zif_abapgit_aff_oo_types_v1=>ty_method. + + lv_header_descr = `$.header.description=Text`. + lv_descr_meth_1 = `$.descriptions.methods[?(@.name=='METH1')].description=Sonne`. + lv_descr_meth_2 = `$.descriptions.methods[?(@.name=='METH2')].description=Mond`. + + APPEND lv_header_descr TO mt_exp. + APPEND lv_descr_meth_1 TO mt_exp. + APPEND lv_descr_meth_2 TO mt_exp. + + + ms_data-header-description = 'Text'. + + ls_meth_desc-name = `METH1`. + ls_meth_desc-description = `Sonne`. + APPEND ls_meth_desc TO ms_data-descriptions-methods. + CLEAR ls_meth_desc. + ls_meth_desc-name = `METH2`. + ls_meth_desc-description = `Mond`. + APPEND ls_meth_desc TO ms_data-descriptions-methods. + + + mt_act = serialize( ms_data ). + + cl_abap_unit_assert=>assert_equals( exp = mt_exp + act = mt_act ). + + ENDMETHOD. + + METHOD array_nested. + DATA lv_header_descr TYPE string. + DATA lv_descr_meth_1 TYPE string. + DATA lv_descr_meth_1_param_1 TYPE string. + DATA lv_descr_meth_1_param_2 TYPE string. + DATA lv_descr_meth_2 TYPE string. + DATA ls_meth_desc TYPE zif_abapgit_aff_oo_types_v1=>ty_method. + DATA ls_meth_param TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. + + lv_header_descr = `$.header.description=Text`. + lv_descr_meth_1 = `$.descriptions.methods[?(@.name=='METH1')].description=Sonne`. + lv_descr_meth_1_param_1 = + `$.descriptions.methods[?(@.name=='METH1')].parameters[?(@.name=='param1')].description=Parameter A`. + lv_descr_meth_1_param_2 = + `$.descriptions.methods[?(@.name=='METH1')].parameters[?(@.name=='param2')].description=Parameter B`. + lv_descr_meth_2 = `$.descriptions.methods[?(@.name=='METH2')].description=Mond`. + + APPEND lv_header_descr TO mt_exp. + APPEND lv_descr_meth_1 TO mt_exp. + APPEND lv_descr_meth_1_param_1 TO mt_exp. + APPEND lv_descr_meth_1_param_2 TO mt_exp. + APPEND lv_descr_meth_2 TO mt_exp. + + + + ls_meth_param-name = 'param1'. + ls_meth_param-description = 'Parameter A'. + APPEND ls_meth_param TO ls_meth_desc-parameters. + + ls_meth_param-name = 'param2'. + ls_meth_param-description = 'Parameter B'. + APPEND ls_meth_param TO ls_meth_desc-parameters. + + ls_meth_desc-name = `METH1`. + ls_meth_desc-description = `Sonne`. + APPEND ls_meth_desc TO ms_data-descriptions-methods. + CLEAR ls_meth_desc. + + ls_meth_desc-name = `METH2`. + ls_meth_desc-description = `Mond`. + APPEND ls_meth_desc TO ms_data-descriptions-methods. + + ms_data-header-description = 'Text'. + + mt_act = serialize( ms_data ). + + cl_abap_unit_assert=>assert_equals( exp = mt_exp + act = mt_act ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/aff/zcl_abapgit_json_path.clas.xml b/src/objects/aff/zcl_abapgit_json_path.clas.xml new file mode 100644 index 000000000..263d7e255 --- /dev/null +++ b/src/objects/aff/zcl_abapgit_json_path.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_JSON_PATH + E + abapGit - de-/serializes JSON string to JSON paths + 1 + X + X + X + X + + + + diff --git a/src/objects/texts/zcl_abapgit_properties_file.clas.abap b/src/objects/texts/zcl_abapgit_properties_file.clas.abap new file mode 100644 index 000000000..23af7eeeb --- /dev/null +++ b/src/objects/texts/zcl_abapgit_properties_file.clas.abap @@ -0,0 +1,70 @@ +CLASS zcl_abapgit_properties_file DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES zif_abapgit_i18n_file. + + CONSTANTS: + c_properties_feature TYPE string VALUE 'TRANSL'. + + METHODS constructor + IMPORTING iv_lang TYPE laiso. + + METHODS push_text_pairs + IMPORTING it_translation TYPE string_table. + + PROTECTED SECTION. + PRIVATE SECTION. + + DATA mv_lang TYPE laiso. + DATA mt_translation TYPE string_table. + +ENDCLASS. + + + +CLASS zcl_abapgit_properties_file IMPLEMENTATION. + + + + METHOD constructor. + mv_lang = to_lower( iv_lang ). + ENDMETHOD. + + + METHOD push_text_pairs. + mt_translation = it_translation. + ENDMETHOD. + + + METHOD zif_abapgit_i18n_file~ext. + rv_ext = 'properties'. + ENDMETHOD. + + + METHOD zif_abapgit_i18n_file~lang. + rv_lang = mv_lang. + ENDMETHOD. + + + METHOD zif_abapgit_i18n_file~render. + DATA: lv_translation TYPE string, + lo_buf TYPE REF TO zcl_abapgit_string_buffer, + lv_str TYPE string. + + lv_translation = concat_lines_of( table = mt_translation + sep = cl_abap_char_utilities=>newline ). + CREATE OBJECT lo_buf. + lo_buf->add( lv_translation ). + + lv_str = lo_buf->join_w_newline_and_flush( ) && cl_abap_char_utilities=>newline. + rv_data = zcl_abapgit_convert=>string_to_xstring_utf8_bom( lv_str ). + + ENDMETHOD. + + + METHOD zif_abapgit_i18n_file~translate. + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/texts/zcl_abapgit_properties_file.clas.xml b/src/objects/texts/zcl_abapgit_properties_file.clas.xml new file mode 100644 index 000000000..a5f8100fb --- /dev/null +++ b/src/objects/texts/zcl_abapgit_properties_file.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_PROPERTIES_FILE + E + abapGit - Properties file serializer + 1 + X + X + X + + + + diff --git a/src/objects/zcl_abapgit_object_intf.clas.abap b/src/objects/zcl_abapgit_object_intf.clas.abap index a3db0dd4c..0ed280a66 100644 --- a/src/objects/zcl_abapgit_object_intf.clas.abap +++ b/src/objects/zcl_abapgit_object_intf.clas.abap @@ -270,9 +270,9 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION. ls_intf_aff = lcl_aff_metadata_handler=>deserialize( lv_json_data ). CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping. - lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff + lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff iv_object_name = ms_item-obj_name - IMPORTING es_data = rs_intf ). + IMPORTING es_data = rs_intf ). ENDMETHOD. @@ -392,7 +392,9 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION. ls_intf TYPE ty_intf, ls_clskey TYPE seoclskey, lv_serialized_data TYPE xstring, - lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus. + lt_langu_additional TYPE zif_abapgit_lang_definitions=>ty_langus, + lt_i18n_file TYPE zif_abapgit_i18n_file=>ty_table_of, + lo_i18n_file TYPE REF TO zif_abapgit_i18n_file. ls_clskey-clsname = ms_item-obj_name. @@ -422,7 +424,13 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION. lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ). mo_files->add_raw( iv_ext = 'json' iv_data = lv_serialized_data ). + lt_i18n_file = lcl_aff_metadata_handler=>serialize_translations( + is_intf = ls_intf + it_language = mo_i18n_params->ms_params-translation_languages ). + LOOP AT lt_i18n_file INTO lo_i18n_file. + mo_files->add_i18n_file( lo_i18n_file ). + ENDLOOP. ELSE. io_xml->add( iv_name = 'VSEOINTERF' ig_data = ls_intf-vseointerf ). diff --git a/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap b/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap index a788e3e00..5edfcdd90 100644 --- a/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap +++ b/src/objects/zcl_abapgit_object_intf.clas.locals_imp.abap @@ -102,9 +102,9 @@ CLASS lcl_aff_helper IMPLEMENTATION. rs_properties-attributes = get_attributes( lt_components ). - rs_properties-methods = get_methods( is_components = lt_components + rs_properties-methods = get_methods( is_components = lt_components is_sub_components = lt_sub_components ). - rs_properties-events = get_events( is_components = lt_components + rs_properties-events = get_events( is_components = lt_components is_sub_components = lt_sub_components ). rs_properties-types = get_types( lt_components ). ENDMETHOD. @@ -133,7 +133,7 @@ CLASS lcl_aff_helper IMPLEMENTATION. ON component~cmpname = component_text~cmpname AND component~clsname = component_text~clsname AND component_text~langu = iv_language WHERE component~clsname = iv_clif_name - ORDER BY component~cmpname. "#EC CI_BUFFJOIN + ORDER BY component~cmpname. "#EC CI_BUFFJOIN SELECT sub_component~cmpname sub_component~sconame sub_component_text~descript sub_component~scotype INTO TABLE lt_sub_components @@ -152,9 +152,9 @@ CLASS lcl_aff_helper IMPLEMENTATION. ENDLOOP. rs_properties-attributes = get_attributes( lt_components_exp ). - rs_properties-methods = get_methods( is_components = lt_components_exp + rs_properties-methods = get_methods( is_components = lt_components_exp is_sub_components = lt_sub_components ). - rs_properties-events = get_events( is_components = lt_components_exp + rs_properties-events = get_events( is_components = lt_components_exp is_sub_components = lt_sub_components ). rs_properties-types = get_types( lt_components_exp ). @@ -339,17 +339,17 @@ CLASS lcl_aff_helper IMPLEMENTATION. METHOD set_descriptions_compo_subco. set_attributes( is_properties = is_properties - iv_clif_name = iv_clif_name - iv_language = iv_language ). + iv_clif_name = iv_clif_name + iv_language = iv_language ). set_methods( is_properties = is_properties - iv_clif_name = iv_clif_name - iv_language = iv_language ). + iv_clif_name = iv_clif_name + iv_language = iv_language ). set_events( is_properties = is_properties - iv_clif_name = iv_clif_name - iv_language = iv_language ). + iv_clif_name = iv_clif_name + iv_language = iv_language ). set_types( is_properties = is_properties - iv_clif_name = iv_clif_name - iv_language = iv_language ). + iv_clif_name = iv_clif_name + iv_language = iv_language ). ENDMETHOD. ENDCLASS. @@ -387,8 +387,8 @@ CLASS lcl_aff_type_mapping IMPLEMENTATION. " get descriptions ls_data_aff-descriptions = lcl_aff_helper=>get_descriptions_compo_subco( - iv_language = ls_data_aff-header-original_language - iv_clif_name = ls_data_abapgit-vseointerf-clsname ). + iv_language = ls_data_aff-header-original_language + iv_clif_name = ls_data_abapgit-vseointerf-clsname ). es_data = ls_data_aff. ENDMETHOD. @@ -502,6 +502,11 @@ CLASS lcl_aff_metadata_handler DEFINITION. IMPORTING is_intf TYPE zcl_abapgit_object_intf=>ty_intf RETURNING VALUE(rv_result) TYPE xstring RAISING zcx_abapgit_exception. + CLASS-METHODS serialize_translations + IMPORTING is_intf TYPE zcl_abapgit_object_intf=>ty_intf + it_language TYPE zif_abapgit_definitions=>ty_languages + RETURNING VALUE(rt_result) TYPE zif_abapgit_i18n_file=>ty_table_of + RAISING zcx_abapgit_exception. CLASS-METHODS deserialize IMPORTING iv_data TYPE xstring RETURNING VALUE(rv_result) TYPE zif_abapgit_aff_intf_v1=>ty_main @@ -515,7 +520,11 @@ CLASS lcl_aff_metadata_handler DEFINITION. "! For serialization "! @parameter rt_result | Paths that will not be serialized (depending on value) get_paths_to_skip - RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_skip_paths. + RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_skip_paths, + fill_translation + IMPORTING iv_name TYPE seoclsname + iv_language TYPE laiso + RETURNING VALUE(rt_result) TYPE zif_abapgit_aff_intf_v1=>ty_main. ENDCLASS. CLASS lcl_aff_metadata_handler IMPLEMENTATION. @@ -609,16 +618,77 @@ CLASS lcl_aff_metadata_handler IMPLEMENTATION. CREATE OBJECT lo_ajson. TRY. lo_ajson->deserialize( - EXPORTING - iv_content = iv_data - iv_defaults = lt_values_for_initial - iv_enum_mappings = lt_enum_mappings - IMPORTING - ev_data = rv_result ). + EXPORTING + iv_content = iv_data + iv_defaults = lt_values_for_initial + iv_enum_mappings = lt_enum_mappings + IMPORTING + ev_data = rv_result ). CATCH cx_static_check INTO lx_exception. zcx_abapgit_exception=>raise_with_text( lx_exception ). ENDTRY. ENDMETHOD. + METHOD serialize_translations. + DATA: ls_data TYPE zif_abapgit_aff_intf_v1=>ty_main, + lv_langu TYPE laiso, + lv_json TYPE string, + lo_ajson TYPE REF TO zif_abapgit_ajson, + lo_json_path TYPE REF TO zcl_abapgit_json_path, + lt_translation TYPE string_table, + lx_exception TYPE REF TO zcx_abapgit_ajson_error, + lo_trans_file TYPE REF TO zcl_abapgit_properties_file. + + + LOOP AT it_language INTO lv_langu. + + ls_data = fill_translation( iv_name = is_intf-vseointerf-clsname + iv_language = lv_langu ). + + " convert AFF type to JSON + TRY. + lo_ajson = zcl_abapgit_ajson=>new( iv_keep_item_order = abap_true + )->set( iv_path = '/' + iv_val = ls_data + )->map( zcl_abapgit_ajson_mapping=>create_to_camel_case( ) + )->filter( zcl_abapgit_ajson_filter_lib=>create_empty_filter( ) ). + " remove manually the non-primitive types that are initial or not relevant for translation + lo_ajson->delete( '/category/' ). + lo_ajson->delete( '/proxy/' ). + lv_json = lo_ajson->stringify( ). + CATCH zcx_abapgit_ajson_error INTO lx_exception. + zcx_abapgit_exception=>raise_with_text( lx_exception ). + ENDTRY. + + + CREATE OBJECT lo_json_path. + lt_translation = lo_json_path->serialize( lv_json ). + + CREATE OBJECT lo_trans_file + EXPORTING iv_lang = lv_langu. + + lo_trans_file->push_text_pairs( lt_translation ). + + APPEND lo_trans_file TO rt_result. + ENDLOOP. + + ENDMETHOD. + + + METHOD fill_translation. + DATA: lv_langu_sap1 TYPE sy-langu. + + lv_langu_sap1 = zcl_abapgit_convert=>language_sap2_to_sap1( iv_language ). + + rt_result-descriptions = lcl_aff_helper=>get_descriptions_compo_subco( + iv_clif_name = iv_name + iv_language = lv_langu_sap1 ). + + SELECT SINGLE descript FROM seoclasstx INTO rt_result-header-description + WHERE clsname = iv_name AND + langu = lv_langu_sap1. + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/zcl_abapgit_objects.clas.testclasses.abap b/src/objects/zcl_abapgit_objects.clas.testclasses.abap index 364dcdb41..ed2b3c1a0 100644 --- a/src/objects/zcl_abapgit_objects.clas.testclasses.abap +++ b/src/objects/zcl_abapgit_objects.clas.testclasses.abap @@ -55,6 +55,36 @@ CLASS ltcl_object_types IMPLEMENTATION. ENDCLASS. + +CLASS lcl_settings_with_features DEFINITION. + PUBLIC SECTION. + INTERFACES zif_abapgit_persist_settings. + METHODS: constructor + IMPORTING iv_features TYPE string. + PRIVATE SECTION. + DATA mv_features TYPE string. +ENDCLASS. + +CLASS lcl_settings_with_features IMPLEMENTATION. + + METHOD zif_abapgit_persist_settings~modify. + RETURN. + ENDMETHOD. + + METHOD zif_abapgit_persist_settings~read. + + CREATE OBJECT ro_settings. + ro_settings->set_experimental_features( mv_features ). + + ENDMETHOD. + + METHOD constructor. + mv_features = iv_features. + ENDMETHOD. + +ENDCLASS. + + *----------------------------------------------------------------------* * CLASS ltcl_serialize DEFINITION *----------------------------------------------------------------------* @@ -80,7 +110,8 @@ CLASS ltcl_serialize DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT F serialize_msag FOR TESTING RAISING zcx_abapgit_exception, serialize_prog FOR TESTING RAISING zcx_abapgit_exception, serialize_tran FOR TESTING RAISING zcx_abapgit_exception, - serialize_ttyp FOR TESTING RAISING zcx_abapgit_exception. + serialize_ttyp FOR TESTING RAISING zcx_abapgit_exception, + serialize_intf_aff_translate FOR TESTING RAISING cx_static_check. ENDCLASS. @@ -162,6 +193,48 @@ CLASS ltcl_serialize IMPLEMENTATION. ENDMETHOD. + + METHOD serialize_intf_aff_translate. + + DATA: ls_item TYPE zif_abapgit_definitions=>ty_item, + lo_settings TYPE REF TO lcl_settings_with_features, + ls_act TYPE zif_abapgit_objects=>ty_serialization, + ls_translation_de TYPE zif_abapgit_git_definitions=>ty_file, + lt_target_langu TYPE zif_abapgit_definitions=>ty_languages, + lo_i18n_params TYPE REF TO zcl_abapgit_i18n_params, + lv_features TYPE string, + lv_filename TYPE string. + + ls_item-obj_type = 'INTF'. + ls_item-obj_name = 'IF_BADI_TADIR_CHANGED'. + + lv_features = |{ zcl_abapgit_aff_registry=>c_aff_feature }, { zcl_abapgit_properties_file=>c_properties_feature }|. + CREATE OBJECT lo_settings + EXPORTING + iv_features = lv_features. + + zcl_abapgit_persist_injector=>set_settings( lo_settings ). + + APPEND `DE` TO lt_target_langu. + lo_i18n_params = zcl_abapgit_i18n_params=>new( iv_main_language = zif_abapgit_definitions=>c_english + it_translation_langs = lt_target_langu + iv_use_lxe = abap_true ). + ls_act = zcl_abapgit_objects=>serialize( + is_item = ls_item + io_i18n_params = lo_i18n_params ). + + cl_abap_unit_assert=>assert_not_initial( ls_act-files ). + cl_abap_unit_assert=>assert_equals( act = ls_act-item + exp = ls_item ). + + + lv_filename = 'if_badi_tadir_changed.intf.i18n.de.properties'. + READ TABLE ls_act-files WITH KEY filename = lv_filename INTO ls_translation_de. + + cl_abap_unit_assert=>assert_not_initial( ls_translation_de ). + + ENDMETHOD. + METHOD serialize_doma. DATA: ls_item TYPE zif_abapgit_definitions=>ty_item. diff --git a/test/abap_transpile.json b/test/abap_transpile.json index ba0a580a0..4a63ddd1d 100644 --- a/test/abap_transpile.json +++ b/test/abap_transpile.json @@ -174,6 +174,7 @@ {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_prog", "note": "no such table: seometarel"}, {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_tran", "note": "no such table: seometarel"}, {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_ttyp", "note": "no such table: seometarel"}, + {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_serialize", "method": "serialize_intf_aff_translate", "note": "Void type: SEOCLASSDF"}, {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_check_objects_locked", "method": "throw_excp_if_object_is_locked", "note": "no such table: seometarel"}, {"object": "ZCL_ABAPGIT_OBJECTS", "class": "ltcl_check_objects_locked", "method": "no_excp_if_obj_is_not_locked", "note": "no such table: seometarel"},