mapper for front to back direction (#847)

* mapper for front to back direction

* lint fixes
This commit is contained in:
oblomov 2024-02-03 09:06:38 +01:00 committed by GitHub
parent 0c7130cfc2
commit a11d447aeb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 64 additions and 259 deletions

View File

@ -201,20 +201,6 @@ CLASS z2ui5_cl_util_func DEFINITION
CHANGING CHANGING
!data TYPE any. !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 CLASS-METHODS c_trim_upper
IMPORTING IMPORTING
!val TYPE clike !val TYPE clike
@ -1264,197 +1250,12 @@ CLASS z2ui5_cl_util_func IMPLEMENTATION.
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
METHOD trans_ref_struc_2_struc.
FIELD-SYMBOLS <ls_from> TYPE any.
FIELD-SYMBOLS <comp_from_deref> TYPE any.
ASSIGN ir_struc_from->* TO <ls_from>.
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 <ls_from> TO FIELD-SYMBOL(<comp_from>).
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ASSIGN COMPONENT ls_comp-name OF STRUCTURE r_result TO FIELD-SYMBOL(<comp_to>).
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ASSIGN <comp_from>->* TO <comp_from_deref>.
DATA(lv_type_kind) = rtti_get_type_kind( <comp_to> ).
IF <comp_from_deref> IS INITIAL.
CONTINUE.
ENDIF.
CASE lv_type_kind.
WHEN cl_abap_typedescr=>typekind_table.
trans_ref_tab_2_tab(
EXPORTING
ir_tab_from = <comp_from>
pretty_name = pretty_name
IMPORTING
t_result = <comp_to> ).
WHEN cl_abap_typedescr=>typekind_struct1 OR cl_abap_typedescr=>typekind_struct2.
trans_ref_struc_2_struc(
EXPORTING
ir_struc_from = <comp_from>
pretty_name = pretty_name
IMPORTING
r_result = <comp_to> ).
WHEN OTHERS.
<comp_to> = <comp_from_deref>.
ENDCASE.
ENDLOOP.
ENDMETHOD.
METHOD trans_ref_tab_2_tab.
TYPES ty_t_ref TYPE STANDARD TABLE OF REF TO data.
FIELD-SYMBOLS <lt_from> TYPE ty_t_ref.
DATA lr_row TYPE REF TO data.
FIELD-SYMBOLS <comp> TYPE data.
FIELD-SYMBOLS <comp_ui5> TYPE data.
DATA match TYPE i.
ASSIGN ir_tab_from->* TO <lt_from>.
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 <lt_from> INTO DATA(lr_string).
ASSIGN lr_string->* TO FIELD-SYMBOL(<row_string>).
INSERT <row_string> 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 <lt_from> INTO DATA(lr_from).
CREATE DATA lr_row TYPE HANDLE lo_struc.
ASSIGN lr_row->* TO FIELD-SYMBOL(<row>).
IF sy-subrc <> 0.
EXIT.
ENDIF.
ASSIGN lr_from->* TO FIELD-SYMBOL(<row_ui5>).
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 <row> TO <comp>.
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 <row_ui5> TO <comp_ui5>.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ASSIGN <comp_ui5>->* TO FIELD-SYMBOL(<ls_data_ui5>).
IF sy-subrc = 0.
CASE ls_comp-type->kind.
WHEN cl_abap_typedescr=>kind_table.
trans_ref_tab_2_tab(
EXPORTING
ir_tab_from = <comp_ui5>
pretty_name = pretty_name
IMPORTING
t_result = <comp> ).
WHEN cl_abap_typedescr=>kind_struct.
trans_ref_struc_2_struc(
EXPORTING
ir_struc_from = <comp_ui5>
pretty_name = pretty_name
IMPORTING
r_result = <comp> ).
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 <ls_data_ui5> WITH `$1$2$3`
REPLACEMENT LENGTH match. "#EC NOTEXT
<comp> = <ls_data_ui5>.
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 <ls_data_ui5> WITH `$1$2$3`
REPLACEMENT LENGTH match. "#EC NOTEXT
<comp> = <ls_data_ui5>.
WHEN OTHERS.
<comp> = <ls_data_ui5>.
ENDCASE.
WHEN OTHERS.
<comp> = <ls_data_ui5>.
ENDCASE.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDLOOP.
INSERT <row> INTO TABLE t_result.
ENDLOOP.
ENDMETHOD.
METHOD trans_srtti_xml_2_data. METHOD trans_srtti_xml_2_data.
DATA srtti TYPE REF TO object. DATA srtti TYPE REF TO object.
DATA rtti_type TYPE REF TO cl_abap_typedescr. DATA rtti_type TYPE REF TO cl_abap_typedescr.
DATA lo_datadescr TYPE REF TO cl_abap_datadescr. DATA lo_datadescr TYPE REF TO cl_abap_datadescr.
IF rtti_check_class_exists( 'ZCL_SRTTI_TYPEDESCR' ) = abap_false. IF rtti_check_class_exists( 'ZCL_SRTTI_TYPEDESCR' ) = abap_false.
DATA(lv_link) = `https://github.com/sandraros/S-RTTI`. DATA(lv_link) = `https://github.com/sandraros/S-RTTI`.
@ -1467,23 +1268,18 @@ CLASS z2ui5_cl_util_func IMPLEMENTATION.
ENDIF. ENDIF.
CALL TRANSFORMATION id SOURCE XML rtti_data RESULT srtti = srtti. CALL TRANSFORMATION id SOURCE XML rtti_data RESULT srtti = srtti.
CALL METHOD srtti->('GET_RTTI') CALL METHOD srtti->('GET_RTTI')
RECEIVING RECEIVING
rtti = rtti_type. rtti = rtti_type.
lo_datadescr ?= rtti_type. lo_datadescr ?= rtti_type.
CREATE DATA e_data TYPE HANDLE lo_datadescr. CREATE DATA e_data TYPE HANDLE lo_datadescr.
ASSIGN e_data->* TO FIELD-SYMBOL(<variable>). ASSIGN e_data->* TO FIELD-SYMBOL(<variable>).
CALL TRANSFORMATION id SOURCE XML rtti_data RESULT dobj = <variable>. CALL TRANSFORMATION id SOURCE XML rtti_data RESULT dobj = <variable>.
ENDMETHOD. ENDMETHOD.

View File

@ -27,13 +27,11 @@ CLASS z2ui5_cl_fw_binding DEFINITION
check_dissolved TYPE abap_bool, check_dissolved TYPE abap_bool,
check_temp TYPE abap_bool, check_temp TYPE abap_bool,
viewname TYPE string, viewname TYPE string,
pretty_name TYPE abap_bool,
compress TYPE string,
* compress_custom TYPE string,
depth TYPE i, depth TYPE i,
ajson_local TYPE REF TO z2ui5_if_ajson, json_bind_local TYPE REF TO z2ui5_if_ajson,
custom_filter TYPE REF TO z2ui5_if_ajson_filter, custom_filter TYPE REF TO z2ui5_if_ajson_filter,
custom_mapper TYPE REF TO z2ui5_if_ajson_mapping, custom_mapper TYPE REF TO z2ui5_if_ajson_mapping,
custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping,
END OF ty_s_attri. END OF ty_s_attri.
TYPES ty_t_attri TYPE SORTED TABLE OF ty_s_attri WITH UNIQUE KEY name. TYPES ty_t_attri TYPE SORTED TABLE OF ty_s_attri WITH UNIQUE KEY name.
@ -47,6 +45,7 @@ CLASS z2ui5_cl_fw_binding DEFINITION
view TYPE clike OPTIONAL view TYPE clike OPTIONAL
custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL
custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL
custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL
RETURNING RETURNING
VALUE(r_result) TYPE REF TO z2ui5_cl_fw_binding. VALUE(r_result) TYPE REF TO z2ui5_cl_fw_binding.
@ -60,11 +59,9 @@ CLASS z2ui5_cl_fw_binding DEFINITION
DATA mr_data TYPE REF TO data. DATA mr_data TYPE REF TO data.
DATA mv_check_attri TYPE abap_bool. DATA mv_check_attri TYPE abap_bool.
DATA mv_view TYPE string. 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_filter TYPE REF TO z2ui5_if_ajson_filter.
DATA mo_custom_mapper TYPE REF TO z2ui5_if_ajson_mapping. 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 CLASS-METHODS update_attri
IMPORTING IMPORTING
@ -135,7 +132,7 @@ ENDCLASS.
CLASS z2ui5_cl_fw_binding IMPLEMENTATION. CLASS Z2UI5_CL_FW_BINDING IMPLEMENTATION.
METHOD bind. METHOD bind.
@ -160,10 +157,22 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
val = `<p>Binding Error - Two different binding types for same attribute used (` && bind->name && `).`. val = `<p>Binding Error - Two different binding types for same attribute used (` && bind->name && `).`.
ENDIF. 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 RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING EXPORTING
val = `<p>Binding Error - Two different pretty types for same attribute used (` && bind->name && `).`. val = `<p>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 = `<p>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 = `<p>Binding Error - Two different filter for same attribute used (` && bind->name && `).`.
ENDIF. ENDIF.
IF bind->bind_type IS NOT INITIAL. IF bind->bind_type IS NOT INITIAL.
@ -172,11 +181,10 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
ENDIF. ENDIF.
bind->bind_type = mv_type. bind->bind_type = mv_type.
bind->pretty_name = mv_pretty_name.
bind->compress = mv_compress.
bind->viewname = mv_view. bind->viewname = mv_view.
bind->custom_filter = mo_custom_filter. bind->custom_filter = mo_custom_filter.
bind->custom_mapper = mo_custom_mapper. 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 sub = `-` with = `/` ).
bind->name_front = replace( val = bind->name_front 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 INSERT VALUE #( name_front = lv_id
name = lv_id name = lv_id
ajson_local = ajson->set( iv_path = `/` iv_val = <any> ) json_bind_local = ajson->set( iv_path = `/` iv_val = <any> )
bind_type = cs_bind_type-one_time bind_type = cs_bind_type-one_time
pretty_name = mv_pretty_name
compress = mv_compress
) )
INTO TABLE mt_attri. INTO TABLE mt_attri.
@ -294,6 +300,7 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
r_result->mv_view = view. r_result->mv_view = view.
r_result->mo_custom_filter = custom_filter. r_result->mo_custom_filter = custom_filter.
r_result->mo_custom_mapper = custom_mapper. 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 ). IF z2ui5_cl_util_func=>rtti_check_type_kind_dref( data ).
RAISE EXCEPTION TYPE z2ui5_cx_util_error RAISE EXCEPTION TYPE z2ui5_cx_util_error
@ -465,6 +472,7 @@ CLASS z2ui5_cl_fw_binding IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD search_binding. METHOD search_binding.
set_attri_ready( REF #( mt_attri ) ). set_attri_ready( REF #( mt_attri ) ).

View File

@ -405,6 +405,7 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
data = val data = val
view = view view = view
custom_mapper = custom_mapper custom_mapper = custom_mapper
custom_mapper_back = custom_mapper_back
custom_filter = custom_filter custom_filter = custom_filter
). ).

View File

@ -94,7 +94,7 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_time. WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_time.
DATA(lv_path) = lr_attri->name_front. 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. WHEN z2ui5_cl_fw_binding=>cs_bind_type-one_way.
lv_path = lr_attri->name_front. lv_path = lr_attri->name_front.
@ -137,7 +137,6 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
LOOP AT t_attri REFERENCE INTO DATA(lr_attri) LOOP AT t_attri REFERENCE INTO DATA(lr_attri)
WHERE bind_type = z2ui5_cl_fw_binding=>cs_bind_type-two_way WHERE bind_type = z2ui5_cl_fw_binding=>cs_bind_type-two_way
AND viewname = viewname. AND viewname = viewname.
TRY. TRY.
DATA(lv_name_back) = `APP->` && lr_attri->name. DATA(lv_name_back) = `APP->` && lr_attri->name.
@ -147,8 +146,8 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
DATA(ajson_val) = ajson->slice( `/` && lr_attri->name_front ). DATA(ajson_val) = ajson->slice( `/` && lr_attri->name_front ).
IF lr_attri->custom_mapper IS BOUND. IF lr_attri->custom_mapper_back IS BOUND.
ajson_val = ajson_val->map( lr_attri->custom_mapper ). ajson_val = ajson_val->map( lr_attri->custom_mapper_back ).
ENDIF. ENDIF.
ajson_val->to_abap( ajson_val->to_abap(

View File

@ -176,6 +176,7 @@ INTERFACE z2ui5_if_client
path TYPE abap_bool DEFAULT abap_false path TYPE abap_bool DEFAULT abap_false
view TYPE string DEFAULT cs_view-main view TYPE string DEFAULT cs_view-main
custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL 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 custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL
tab TYPE STANDARD TABLE OPTIONAL tab TYPE STANDARD TABLE OPTIONAL
tab_index TYPE i OPTIONAL tab_index TYPE i OPTIONAL