abap2UI5/src/00/z2ui5_cl_fw_utility.clas.abap
oblomov c8180a5aee
Dev (#548)
* busy indicator extension

* Update README.md

* Update README.md

* update binding

* Update README.md

* update binding

* update

* Update package.json

* Update package-lock.json
2023-09-18 14:48:54 +02:00

634 lines
15 KiB
ABAP

CLASS z2ui5_cl_fw_utility DEFINITION PUBLIC
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS url_param_get
IMPORTING
val TYPE string
url TYPE string
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS url_param_create_url
IMPORTING
t_params TYPE z2ui5_if_client=>ty_t_name_value
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS url_param_set
IMPORTING
url TYPE string
name TYPE string
value TYPE string
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS rtti_get_classname_by_ref
IMPORTING
in TYPE REF TO object
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS x_check_raise
IMPORTING
v TYPE clike DEFAULT `CX_SY_SUBRC`
when TYPE abap_bool.
CLASS-METHODS x_raise
IMPORTING
v TYPE clike DEFAULT `CX_SY_SUBRC`
PREFERRED PARAMETER v.
CLASS-METHODS func_get_uuid_32
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS func_get_uuid_22
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS func_get_user_tech
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS trans_json_any_2
IMPORTING
any TYPE any
pretty_name type clike default /ui2/cl_json=>pretty_mode-none
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS trans_xml_2_any
IMPORTING
xml TYPE clike
EXPORTING
any TYPE any.
CLASS-METHODS trans_xml_any_2
IMPORTING
any TYPE any
RETURNING
VALUE(result) TYPE string
RAISING
cx_xslt_serialization_error.
CLASS-METHODS boolean_check
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE abap_bool.
CLASS-METHODS boolean_abap_2_json
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS c_replace_assign_struc
IMPORTING
iv_attri TYPE clike
RETURNING
VALUE(rv_attri) TYPE string.
CLASS-METHODS trans_json_2_any
IMPORTING
val TYPE any
CHANGING
data TYPE any.
CLASS-METHODS trans_ref_tab_2_tab
IMPORTING
ir_tab_from TYPE REF TO data
EXPORTING
t_result TYPE STANDARD TABLE.
CLASS-METHODS c_trim_upper
IMPORTING
val TYPE clike
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS rtti_xml_get_by_data
IMPORTING
data TYPE any
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS rtti_xml_set_to_data
IMPORTING
rtti_data TYPE clike
EXPORTING
e_data TYPE REF TO data.
CLASS-METHODS time_get_timestampl
RETURNING
VALUE(result) TYPE timestampl.
CLASS-METHODS time_substract_seconds
IMPORTING
time TYPE timestampl
seconds TYPE i
RETURNING
VALUE(result) TYPE timestampl.
CLASS-METHODS c_trim
IMPORTING
val TYPE clike
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS c_trim_lower
IMPORTING
val TYPE clike
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS url_param_get_tab
IMPORTING
i_val TYPE clike
RETURNING
VALUE(rt_params) TYPE z2ui5_if_client=>ty_t_name_value.
CLASS-METHODS rtti_get_t_attri_by_object
IMPORTING
val TYPE REF TO object
RETURNING
VALUE(result) TYPE abap_attrdescr_tab.
CLASS-METHODS rtti_get_t_comp_by_struc
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE cl_abap_structdescr=>component_table.
CLASS-METHODS rtti_get_type_name
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS rtti_check_type_kind_dref
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE abap_bool.
CLASS-METHODS rtti_get_type_kind
IMPORTING
val TYPE any
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_fw_utility IMPLEMENTATION.
METHOD boolean_abap_2_json.
IF boolean_check( val ).
result = COND #( WHEN val = abap_true THEN `true` ELSE `false` ).
ELSE.
result = val.
ENDIF.
ENDMETHOD.
METHOD boolean_check.
TRY.
DATA(lv_type_name) = rtti_get_type_name( val ).
CASE lv_type_name.
WHEN `ABAP_BOOL` OR `XSDBOOLEAN`.
result = abap_true.
ENDCASE.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD c_trim.
result = shift_left( shift_right( CONV string( val ) ) ).
result = shift_right( val = result sub = cl_abap_char_utilities=>horizontal_tab ).
result = shift_left( val = result sub = cl_abap_char_utilities=>horizontal_tab ).
result = shift_left( shift_right( CONV string( val ) ) ).
ENDMETHOD.
METHOD c_trim_lower.
result = to_lower( c_trim( CONV string( val ) ) ).
ENDMETHOD.
METHOD c_trim_upper.
result = to_upper( c_trim( CONV string( val ) ) ).
ENDMETHOD.
METHOD time_get_timestampl.
GET TIME STAMP FIELD result.
ENDMETHOD.
METHOD time_substract_seconds.
result = cl_abap_tstmp=>subtractsecs( tstmp = time secs = seconds ).
ENDMETHOD.
METHOD func_get_user_tech.
result = sy-uname.
ENDMETHOD.
METHOD func_get_uuid_32.
TRY.
DATA uuid TYPE c LENGTH 32.
TRY.
CALL METHOD (`CL_SYSTEM_UUID`)=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = uuid.
CATCH cx_sy_dyn_call_illegal_class.
DATA(lv_fm) = `GUID_CREATE`.
CALL FUNCTION lv_fm
IMPORTING
ev_guid_32 = uuid.
ENDTRY.
result = uuid.
CATCH cx_root.
ASSERT 1 = 0.
ENDTRY.
ENDMETHOD.
METHOD func_get_uuid_22.
TRY.
DATA uuid TYPE c LENGTH 22.
TRY.
CALL METHOD (`CL_SYSTEM_UUID`)=>if_system_uuid_static~create_uuid_c22
RECEIVING
uuid = uuid.
CATCH cx_sy_dyn_call_illegal_class.
DATA(lv_fm) = `GUID_CREATE`.
CALL FUNCTION lv_fm
IMPORTING
ev_guid_22 = uuid.
ENDTRY.
result = uuid.
CATCH cx_root.
ASSERT 1 = 0.
ENDTRY.
result = replace( val = result sub = `}` with = `0` occ = 0 ).
result = replace( val = result sub = `{` with = `0` occ = 0 ).
result = replace( val = result sub = `"` with = `0` occ = 0 ).
result = replace( val = result sub = `'` with = `0` occ = 0 ).
ENDMETHOD.
METHOD rtti_get_classname_by_ref.
DATA(lv_classname) = cl_abap_classdescr=>get_class_name( in ).
result = substring_after( val = lv_classname
sub = `\CLASS=` ).
ENDMETHOD.
METHOD rtti_get_type_kind.
result = cl_abap_datadescr=>get_data_type_kind( val ).
ENDMETHOD.
METHOD rtti_check_type_kind_dref.
DATA(lv_type_kind) = cl_abap_datadescr=>get_data_type_kind( val ).
result = xsdbool( lv_type_kind = cl_abap_typedescr=>typekind_dref ).
ENDMETHOD.
METHOD rtti_get_type_name.
DATA(lo_descr) = cl_abap_elemdescr=>describe_by_data( val ).
DATA(lo_ele) = CAST cl_abap_elemdescr( lo_descr ).
result = lo_ele->get_relative_name( ).
ENDMETHOD.
METHOD rtti_get_t_attri_by_object.
DATA(lo_obj_ref) = cl_abap_objectdescr=>describe_by_object_ref( val ).
result = CAST cl_abap_classdescr( lo_obj_ref )->attributes.
ENDMETHOD.
METHOD rtti_get_t_comp_by_struc.
DATA(lo_type) = cl_abap_structdescr=>describe_by_data( val ).
DATA(lo_struct) = CAST cl_abap_structdescr( lo_type ).
result = lo_struct->get_components( ).
ENDMETHOD.
METHOD rtti_xml_get_by_data.
TRY.
DATA srtti TYPE REF TO object.
CALL METHOD ('ZCL_SRTTI_TYPEDESCR')=>('CREATE_BY_DATA_OBJECT')
EXPORTING
data_object = data
RECEIVING
srtti = srtti.
CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result.
CATCH cx_root.
DATA(lv_link) = `https://github.com/sandraros/S-RTTI`.
DATA(lv_text) = `<p>Please install the open-source project S-RTTI by sandraros and try again: <a href="` &&
lv_link && `" style="color:blue; font-weight:600;">(link)</a></p>`.
RAISE EXCEPTION TYPE z2ui5_cx_fw_error
EXPORTING
val = lv_text.
ENDTRY.
ENDMETHOD.
METHOD rtti_xml_set_to_data.
TRY.
DATA srtti TYPE REF TO object.
CALL TRANSFORMATION id SOURCE XML rtti_data RESULT srtti = srtti.
DATA rtti_type TYPE REF TO cl_abap_typedescr.
CALL METHOD srtti->('GET_RTTI')
RECEIVING
rtti = rtti_type.
DATA lo_datadescr TYPE REF TO cl_abap_datadescr.
lo_datadescr ?= rtti_type.
CREATE DATA e_data TYPE HANDLE lo_datadescr.
ASSIGN e_data->* TO FIELD-SYMBOL(<variable>).
CALL TRANSFORMATION id SOURCE XML rtti_data RESULT dobj = <variable>.
CATCH cx_root.
DATA(lv_link) = `https://github.com/sandraros/S-RTTI`.
DATA(lv_text) = `<p>Please install the open-source project S-RTTI by sandraros and try again: <a href="` && lv_link && `" style="color:blue; font-weight:600;">(link)</a></p>`.
RAISE EXCEPTION TYPE z2ui5_cx_fw_error
EXPORTING
val = lv_text.
ENDTRY.
ENDMETHOD.
METHOD trans_json_any_2.
result = /ui2/cl_json=>serialize( data = any pretty_name = conv #( pretty_name ) ).
ENDMETHOD.
METHOD trans_xml_any_2.
CALL TRANSFORMATION id
SOURCE data = any
RESULT XML result
OPTIONS data_refs = `heap-or-create`.
ENDMETHOD.
METHOD c_replace_assign_struc.
rv_attri = iv_attri.
DATA(lv_length) = strlen( rv_attri ) - 2.
DATA(lv_attri_end) = rv_attri+lv_length.
IF lv_attri_end = `>*`.
lv_attri_end = `>`.
lv_length = lv_length.
ELSE.
lv_attri_end = `-`.
lv_length = lv_length + 2.
ENDIF.
rv_attri = rv_attri(lv_length) && lv_attri_end.
ENDMETHOD.
METHOD trans_json_2_any.
/ui2/cl_json=>deserialize(
EXPORTING
json = CONV string( val )
assoc_arrays = abap_true
CHANGING
data = data ).
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.
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 ) ).
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).
DATA lr_row TYPE REF TO data.
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( when = 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.
FIELD-SYMBOLS <comp> TYPE data.
ASSIGN COMPONENT ls_comp-name OF STRUCTURE <row> TO <comp>.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
FIELD-SYMBOLS <comp_ui5> TYPE data.
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>
IMPORTING t_result = <comp> ).
WHEN OTHERS.
<comp> = <ls_data_ui5>.
ENDCASE.
ENDIF.
CATCH cx_root.
ENDTRY.
ENDLOOP.
INSERT <row> INTO TABLE t_result.
ENDLOOP.
ENDMETHOD.
METHOD trans_xml_2_any.
CALL TRANSFORMATION id
SOURCE XML xml
RESULT data = any.
ENDMETHOD.
METHOD url_param_create_url.
LOOP AT t_params INTO DATA(ls_param).
result = result && ls_param-n && `=` && ls_param-v && `&`.
ENDLOOP.
result = shift_right( val = result sub = `&` ).
ENDMETHOD.
METHOD url_param_get.
DATA(lt_params) = url_param_get_tab( url ).
DATA(lv_val) = c_trim_lower( val ).
result = VALUE #( lt_params[ n = lv_val ]-v OPTIONAL ).
ENDMETHOD.
METHOD url_param_get_tab.
DATA(lv_search) = replace( val = i_val sub = `%3D` with = '=' occ = 0 ).
lv_search = shift_left( val = lv_search sub = `?` ).
lv_search = c_trim_lower( lv_search ).
DATA(lv_search2) = substring_after( val = lv_search
sub = `&sap-startup-params=` ).
lv_search = COND #( WHEN lv_search2 IS NOT INITIAL THEN lv_search2 ELSE lv_search ).
lv_search2 = substring_after( val = c_trim_lower( lv_search ) sub = `?` ).
IF lv_search2 IS NOT INITIAL.
lv_search = lv_search2.
ENDIF.
SPLIT lv_search AT `&` INTO TABLE DATA(lt_param).
LOOP AT lt_param REFERENCE INTO DATA(lr_param).
SPLIT lr_param->* AT `=` INTO DATA(lv_name) DATA(lv_value).
INSERT VALUE #( n = c_trim_lower( lv_name ) v = c_trim_lower( lv_value ) ) INTO TABLE rt_params.
ENDLOOP.
ENDMETHOD.
METHOD url_param_set.
DATA(lt_params) = url_param_get_tab( url ).
DATA(lv_n) = c_trim_lower( name ).
LOOP AT lt_params REFERENCE INTO DATA(lr_params)
WHERE n = lv_n.
lr_params->v = c_trim_lower( value ).
ENDLOOP.
IF sy-subrc <> 0.
INSERT VALUE #( n = lv_n v = c_trim_lower( value ) ) INTO TABLE lt_params.
ENDIF.
result = url_param_create_url( lt_params ).
ENDMETHOD.
METHOD x_check_raise.
IF when = abap_true.
RAISE EXCEPTION TYPE z2ui5_cx_fw_error EXPORTING val = v.
ENDIF.
ENDMETHOD.
METHOD x_raise.
RAISE EXCEPTION TYPE z2ui5_cx_fw_error EXPORTING val = v.
ENDMETHOD.
ENDCLASS.