From a11d447aebcc58a74198dc82840a89488b7d4beb Mon Sep 17 00:00:00 2001 From: oblomov <102328295+oblomov-dev@users.noreply.github.com> Date: Sat, 3 Feb 2024 09:06:38 +0100 Subject: [PATCH] mapper for front to back direction (#847) * mapper for front to back direction * lint fixes --- src/01/01/z2ui5_cl_util_func.clas.abap | 206 +------------------- src/01/02/z2ui5_cl_fw_binding.clas.abap | 84 ++++---- src/01/02/z2ui5_cl_fw_client.clas.abap | 1 + src/01/02/z2ui5_cl_fw_model_ajson.clas.abap | 13 +- src/02/z2ui5_if_client.intf.abap | 19 +- 5 files changed, 64 insertions(+), 259 deletions(-) diff --git a/src/01/01/z2ui5_cl_util_func.clas.abap b/src/01/01/z2ui5_cl_util_func.clas.abap index aeecab77..376fe424 100644 --- a/src/01/01/z2ui5_cl_util_func.clas.abap +++ b/src/01/01/z2ui5_cl_util_func.clas.abap @@ -201,20 +201,6 @@ CLASS z2ui5_cl_util_func DEFINITION CHANGING !data TYPE any. - CLASS-METHODS trans_ref_tab_2_tab - IMPORTING - !ir_tab_from TYPE REF TO data - pretty_name TYPE abap_bool DEFAULT abap_false - EXPORTING - !t_result TYPE STANDARD TABLE. - - CLASS-METHODS trans_ref_struc_2_struc - IMPORTING - !ir_struc_from TYPE REF TO data - pretty_name TYPE abap_bool DEFAULT abap_false - EXPORTING - !r_result TYPE data. - CLASS-METHODS c_trim_upper IMPORTING !val TYPE clike @@ -1264,197 +1250,12 @@ CLASS z2ui5_cl_util_func IMPLEMENTATION. ENDTRY. ENDMETHOD. - - METHOD trans_ref_struc_2_struc. - - FIELD-SYMBOLS TYPE any. - FIELD-SYMBOLS TYPE any. - - ASSIGN ir_struc_from->* TO . - x_check_raise( xsdbool( sy-subrc <> 0 ) ). - CLEAR r_result. - - DATA(lo_struc) = CAST cl_abap_structdescr( cl_abap_datadescr=>describe_by_data( r_result ) ). - DATA(lt_components) = lo_struc->get_components( ). - LOOP AT lt_components INTO DATA(ls_comp). - - DATA(lv_from) = ls_comp-name. - IF pretty_name = abap_true. - REPLACE ALL OCCURRENCES OF `_` IN lv_from WITH ``. - ENDIF. - ASSIGN COMPONENT lv_from OF STRUCTURE TO FIELD-SYMBOL(). - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - ASSIGN COMPONENT ls_comp-name OF STRUCTURE r_result TO FIELD-SYMBOL(). - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - - ASSIGN ->* TO . - DATA(lv_type_kind) = rtti_get_type_kind( ). - - IF IS INITIAL. - CONTINUE. - ENDIF. - - CASE lv_type_kind. - - WHEN cl_abap_typedescr=>typekind_table. - trans_ref_tab_2_tab( - EXPORTING - ir_tab_from = - pretty_name = pretty_name - IMPORTING - t_result = ). - - WHEN cl_abap_typedescr=>typekind_struct1 OR cl_abap_typedescr=>typekind_struct2. - trans_ref_struc_2_struc( - EXPORTING - ir_struc_from = - pretty_name = pretty_name - IMPORTING - r_result = ). - - WHEN OTHERS. - = . - ENDCASE. - - ENDLOOP. - - ENDMETHOD. - - - METHOD trans_ref_tab_2_tab. - - TYPES ty_t_ref TYPE STANDARD TABLE OF REF TO data. - FIELD-SYMBOLS TYPE ty_t_ref. - DATA lr_row TYPE REF TO data. - FIELD-SYMBOLS TYPE data. - FIELD-SYMBOLS TYPE data. - DATA match TYPE i. - - ASSIGN ir_tab_from->* TO . - x_check_raise( xsdbool( sy-subrc <> 0 ) ). - CLEAR t_result. - - DATA(lo_tab) = CAST cl_abap_tabledescr( cl_abap_datadescr=>describe_by_data( t_result ) ). - IF lo_tab->absolute_name = `\TYPE=STRING_TABLE`. - LOOP AT INTO DATA(lr_string). - ASSIGN lr_string->* TO FIELD-SYMBOL(). - INSERT INTO TABLE t_result. - ENDLOOP. - RETURN. - ENDIF. - DATA(lo_struc) = CAST cl_abap_structdescr( lo_tab->get_table_line_type( ) ). - DATA(lt_components) = lo_struc->get_components( ). - - LOOP AT INTO DATA(lr_from). - - - CREATE DATA lr_row TYPE HANDLE lo_struc. - ASSIGN lr_row->* TO FIELD-SYMBOL(). - - IF sy-subrc <> 0. - EXIT. - ENDIF. - - ASSIGN lr_from->* TO FIELD-SYMBOL(). - x_check_raise( xsdbool( sy-subrc <> 0 ) ). - - DATA(lt_components_dissolved) = lt_components. - CLEAR lt_components_dissolved. - - LOOP AT lt_components INTO DATA(ls_comp). - - IF ls_comp-as_include = abap_false. - APPEND ls_comp TO lt_components_dissolved. - ELSE. - DATA(struct) = CAST cl_abap_structdescr( ls_comp-type ). - APPEND LINES OF struct->get_components( ) TO lt_components_dissolved. - - ENDIF. - ENDLOOP. - - LOOP AT lt_components_dissolved INTO ls_comp. - TRY. - - - ASSIGN COMPONENT ls_comp-name OF STRUCTURE TO . - - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - - - IF pretty_name = abap_true. - REPLACE ALL OCCURRENCES OF `_` IN ls_comp-name WITH ``. - ENDIF. - ASSIGN COMPONENT ls_comp-name OF STRUCTURE TO . - - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - - ASSIGN ->* TO FIELD-SYMBOL(). - - IF sy-subrc = 0. - CASE ls_comp-type->kind. - WHEN cl_abap_typedescr=>kind_table. - trans_ref_tab_2_tab( - EXPORTING - ir_tab_from = - pretty_name = pretty_name - IMPORTING - t_result = ). - WHEN cl_abap_typedescr=>kind_struct. - trans_ref_struc_2_struc( - EXPORTING - ir_struc_from = - pretty_name = pretty_name - IMPORTING - r_result = ). - WHEN cl_abap_typedescr=>kind_elem. - CASE ls_comp-type->absolute_name. - WHEN `\TYPE=D`. - - " support for ISO8601 => https://en.wikipedia.org/wiki/ISO_8601 - REPLACE FIRST OCCURRENCE OF REGEX `^(\d{4})-(\d{2})-(\d{2})` IN WITH `$1$2$3` - REPLACEMENT LENGTH match. "#EC NOTEXT - = . - - WHEN `\TYPE=T`. - - " support for ISO8601 => https://en.wikipedia.org/wiki/ISO_8601 - REPLACE FIRST OCCURRENCE OF REGEX `^(\d{2}):(\d{2}):(\d{2})` IN WITH `$1$2$3` - REPLACEMENT LENGTH match. "#EC NOTEXT - = . - - WHEN OTHERS. - = . - ENDCASE. - WHEN OTHERS. - = . - ENDCASE. - ENDIF. - - CATCH cx_root. - ENDTRY. - ENDLOOP. - - INSERT INTO TABLE t_result. - ENDLOOP. - - ENDMETHOD. - - METHOD trans_srtti_xml_2_data. + DATA srtti TYPE REF TO object. DATA rtti_type TYPE REF TO cl_abap_typedescr. DATA lo_datadescr TYPE REF TO cl_abap_datadescr. - - IF rtti_check_class_exists( 'ZCL_SRTTI_TYPEDESCR' ) = abap_false. DATA(lv_link) = `https://github.com/sandraros/S-RTTI`. @@ -1467,23 +1268,18 @@ CLASS z2ui5_cl_util_func IMPLEMENTATION. ENDIF. - CALL TRANSFORMATION id SOURCE XML rtti_data RESULT srtti = srtti. - CALL METHOD srtti->('GET_RTTI') RECEIVING rtti = rtti_type. - lo_datadescr ?= rtti_type. CREATE DATA e_data TYPE HANDLE lo_datadescr. ASSIGN e_data->* TO FIELD-SYMBOL(). CALL TRANSFORMATION id SOURCE XML rtti_data RESULT dobj = . - - ENDMETHOD. diff --git a/src/01/02/z2ui5_cl_fw_binding.clas.abap b/src/01/02/z2ui5_cl_fw_binding.clas.abap index 645a33e6..e3167242 100644 --- a/src/01/02/z2ui5_cl_fw_binding.clas.abap +++ b/src/01/02/z2ui5_cl_fw_binding.clas.abap @@ -16,39 +16,38 @@ CLASS z2ui5_cl_fw_binding DEFINITION TYPES: BEGIN OF ty_s_attri, - name TYPE string, - name_front TYPE string, - type_kind TYPE string, - type TYPE string, - bind_type TYPE string, - data_stringify TYPE string, - data_rtti TYPE string, - check_ready TYPE abap_bool, - check_dissolved TYPE abap_bool, - check_temp TYPE abap_bool, - viewname TYPE string, - pretty_name TYPE abap_bool, - compress TYPE string, -* compress_custom TYPE string, - depth TYPE i, - ajson_local TYPE REF TO z2ui5_if_ajson, - custom_filter TYPE REF TO z2ui5_if_ajson_filter, - custom_mapper TYPE REF TO z2ui5_if_ajson_mapping, + name TYPE string, + name_front TYPE string, + type_kind TYPE string, + type TYPE string, + bind_type TYPE string, + data_stringify TYPE string, + data_rtti TYPE string, + check_ready TYPE abap_bool, + check_dissolved TYPE abap_bool, + check_temp TYPE abap_bool, + viewname TYPE string, + depth TYPE i, + json_bind_local TYPE REF TO z2ui5_if_ajson, + custom_filter TYPE REF TO z2ui5_if_ajson_filter, + custom_mapper TYPE REF TO z2ui5_if_ajson_mapping, + custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping, END OF ty_s_attri. TYPES ty_t_attri TYPE SORTED TABLE OF ty_s_attri WITH UNIQUE KEY name. CLASS-METHODS factory IMPORTING - app TYPE REF TO object OPTIONAL - attri TYPE ty_t_attri OPTIONAL - type TYPE clike OPTIONAL - data TYPE data OPTIONAL - check_attri TYPE data OPTIONAL - view TYPE clike OPTIONAL - custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL - custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL + app TYPE REF TO object OPTIONAL + attri TYPE ty_t_attri OPTIONAL + type TYPE clike OPTIONAL + data TYPE data OPTIONAL + check_attri TYPE data OPTIONAL + view TYPE clike OPTIONAL + custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL + custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL + custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL RETURNING - VALUE(r_result) TYPE REF TO z2ui5_cl_fw_binding. + VALUE(r_result) TYPE REF TO z2ui5_cl_fw_binding. METHODS main RETURNING @@ -60,11 +59,9 @@ CLASS z2ui5_cl_fw_binding DEFINITION DATA mr_data TYPE REF TO data. DATA mv_check_attri TYPE abap_bool. DATA mv_view TYPE string. - DATA mv_pretty_name TYPE string. - DATA mv_compress TYPE string. -* DATA mv_compress_custom TYPE string. DATA mo_custom_filter TYPE REF TO z2ui5_if_ajson_filter. DATA mo_custom_mapper TYPE REF TO z2ui5_if_ajson_mapping. + DATA mo_custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping. CLASS-METHODS update_attri IMPORTING @@ -135,7 +132,7 @@ ENDCLASS. -CLASS z2ui5_cl_fw_binding IMPLEMENTATION. +CLASS Z2UI5_CL_FW_BINDING IMPLEMENTATION. METHOD bind. @@ -160,10 +157,22 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION. val = `

Binding Error - Two different binding types for same attribute used (` && bind->name && `).`. ENDIF. - IF bind->bind_type IS NOT INITIAL AND bind->pretty_name <> mv_pretty_name. + IF bind->custom_mapper IS BOUND AND bind->custom_mapper <> mo_custom_mapper. RAISE EXCEPTION TYPE z2ui5_cx_util_error EXPORTING - val = `

Binding Error - Two different pretty types for same attribute used (` && bind->name && `).`. + val = `

Binding Error - Two different mapper for same attribute used (` && bind->name && `).`. + ENDIF. + + IF bind->custom_mapper_back IS BOUND AND bind->custom_mapper_back <> mo_custom_mapper_back. + RAISE EXCEPTION TYPE z2ui5_cx_util_error + EXPORTING + val = `

Binding Error - Two different mapper back for same attribute used (` && bind->name && `).`. + ENDIF. + + IF bind->custom_filter IS BOUND AND bind->custom_filter <> mo_custom_filter. + RAISE EXCEPTION TYPE z2ui5_cx_util_error + EXPORTING + val = `

Binding Error - Two different filter for same attribute used (` && bind->name && `).`. ENDIF. IF bind->bind_type IS NOT INITIAL. @@ -172,11 +181,10 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION. ENDIF. bind->bind_type = mv_type. - bind->pretty_name = mv_pretty_name. - bind->compress = mv_compress. bind->viewname = mv_view. bind->custom_filter = mo_custom_filter. bind->custom_mapper = mo_custom_mapper. + bind->custom_mapper_back = mo_custom_mapper_back. bind->name_front = replace( val = bind->name sub = `-` with = `/` ). bind->name_front = replace( val = bind->name_front sub = `>` with = `` ). @@ -206,10 +214,8 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION. INSERT VALUE #( name_front = lv_id name = lv_id - ajson_local = ajson->set( iv_path = `/` iv_val = ) + json_bind_local = ajson->set( iv_path = `/` iv_val = ) bind_type = cs_bind_type-one_time - pretty_name = mv_pretty_name - compress = mv_compress ) INTO TABLE mt_attri. @@ -294,6 +300,7 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION. r_result->mv_view = view. r_result->mo_custom_filter = custom_filter. r_result->mo_custom_mapper = custom_mapper. + r_result->mo_custom_mapper_back = custom_mapper_back. IF z2ui5_cl_util_func=>rtti_check_type_kind_dref( data ). RAISE EXCEPTION TYPE z2ui5_cx_util_error @@ -465,6 +472,7 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION. ENDMETHOD. + METHOD search_binding. set_attri_ready( REF #( mt_attri ) ). diff --git a/src/01/02/z2ui5_cl_fw_client.clas.abap b/src/01/02/z2ui5_cl_fw_client.clas.abap index 63d3864f..a740fefa 100644 --- a/src/01/02/z2ui5_cl_fw_client.clas.abap +++ b/src/01/02/z2ui5_cl_fw_client.clas.abap @@ -405,6 +405,7 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION. data = val view = view custom_mapper = custom_mapper + custom_mapper_back = custom_mapper_back custom_filter = custom_filter ). diff --git a/src/01/02/z2ui5_cl_fw_model_ajson.clas.abap b/src/01/02/z2ui5_cl_fw_model_ajson.clas.abap index 405e1ac0..6f1235b6 100644 --- a/src/01/02/z2ui5_cl_fw_model_ajson.clas.abap +++ b/src/01/02/z2ui5_cl_fw_model_ajson.clas.abap @@ -94,7 +94,7 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION. WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_time. DATA(lv_path) = lr_attri->name_front. - ajson->set( iv_ignore_empty = abap_false iv_path = `/` iv_val = lr_attri->ajson_local ). + ajson->set( iv_ignore_empty = abap_false iv_path = `/` iv_val = lr_attri->json_bind_local ). WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_way. lv_path = lr_attri->name_front. @@ -135,9 +135,8 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION. DATA(ajson) = ajson_in->slice( `/EDIT` ). LOOP AT t_attri REFERENCE INTO DATA(lr_attri) - WHERE bind_type = z2ui5_cl_fw_binding=>cs_bind_type-two_way - AND viewname = viewname. - + WHERE bind_type = z2ui5_cl_fw_binding=>cs_bind_type-two_way + AND viewname = viewname. TRY. DATA(lv_name_back) = `APP->` && lr_attri->name. @@ -147,13 +146,13 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION. DATA(ajson_val) = ajson->slice( `/` && lr_attri->name_front ). - IF lr_attri->custom_mapper IS BOUND. - ajson_val = ajson_val->map( lr_attri->custom_mapper ). + IF lr_attri->custom_mapper_back IS BOUND. + ajson_val = ajson_val->map( lr_attri->custom_mapper_back ). ENDIF. ajson_val->to_abap( IMPORTING - ev_container = ). + ev_container = ). CATCH cx_root INTO DATA(x). ASSERT x IS BOUND. diff --git a/src/02/z2ui5_if_client.intf.abap b/src/02/z2ui5_if_client.intf.abap index ec8201a5..f6007641 100644 --- a/src/02/z2ui5_if_client.intf.abap +++ b/src/02/z2ui5_if_client.intf.abap @@ -172,16 +172,17 @@ INTERFACE z2ui5_if_client METHODS _bind_edit IMPORTING - val TYPE data - path TYPE abap_bool DEFAULT abap_false - view TYPE string DEFAULT cs_view-main - custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL - custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL - tab TYPE STANDARD TABLE OPTIONAL - tab_index TYPE i OPTIONAL - struc TYPE data OPTIONAL + val TYPE data + path TYPE abap_bool DEFAULT abap_false + view TYPE string DEFAULT cs_view-main + custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL + custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL + custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL + tab TYPE STANDARD TABLE OPTIONAL + tab_index TYPE i OPTIONAL + struc TYPE data OPTIONAL RETURNING - VALUE(result) TYPE string. + VALUE(result) TYPE string. METHODS _bind_local IMPORTING