From 9392449034546dce43ccb31a493f2843a9c912c0 Mon Sep 17 00:00:00 2001 From: oblomov-dev <102328295+oblomov-dev@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:21:29 +0100 Subject: [PATCH] srtti added (#1720) * fix (#1718) (#1719) * add srtti * update * Create srtti_mirror.yaml * Update srtti_mirror.yaml * update github actions * update * update --- .../{ajson_mirror.yaml => mirror_ajson.yaml} | 4 +- .github/workflows/mirror_srtti.yaml | 43 +++++++ src/00/02/z2ui5_cl_srt_aunit.clas.abap | 61 +++++++++ src/00/02/z2ui5_cl_srt_aunit.clas.xml | 17 +++ src/00/02/z2ui5_cl_srt_classdescr.clas.abap | 26 ++++ src/00/02/z2ui5_cl_srt_classdescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_complexdescr.clas.abap | 15 +++ src/00/02/z2ui5_cl_srt_complexdescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_datadescr.clas.abap | 15 +++ src/00/02/z2ui5_cl_srt_datadescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_elemdescr.clas.abap | 95 ++++++++++++++ src/00/02/z2ui5_cl_srt_elemdescr.clas.xml | 17 +++ src/00/02/z2ui5_cl_srt_intfdescr.clas.abap | 24 ++++ src/00/02/z2ui5_cl_srt_intfdescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_objectdescr.clas.abap | 41 ++++++ src/00/02/z2ui5_cl_srt_objectdescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_refdescr.clas.abap | 42 +++++++ src/00/02/z2ui5_cl_srt_refdescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_structdescr.clas.abap | 84 +++++++++++++ src/00/02/z2ui5_cl_srt_structdescr.clas.xml | 16 +++ src/00/02/z2ui5_cl_srt_tabledescr.clas.abap | 70 +++++++++++ src/00/02/z2ui5_cl_srt_tabledescr.clas.xml | 17 +++ src/00/02/z2ui5_cl_srt_typedescr.clas.abap | 117 ++++++++++++++++++ src/00/02/z2ui5_cl_srt_typedescr.clas.xml | 17 +++ src/00/02/z2ui5_cx_srt.clas.abap | 35 ++++++ src/00/02/z2ui5_cx_srt.clas.xml | 17 +++ src/00/03/z2ui5_cl_util.clas.abap | 25 ++-- 27 files changed, 881 insertions(+), 13 deletions(-) rename .github/workflows/{ajson_mirror.yaml => mirror_ajson.yaml} (93%) create mode 100644 .github/workflows/mirror_srtti.yaml create mode 100644 src/00/02/z2ui5_cl_srt_aunit.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_aunit.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_classdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_classdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_complexdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_complexdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_datadescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_datadescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_elemdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_elemdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_intfdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_intfdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_objectdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_objectdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_refdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_refdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_structdescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_structdescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_tabledescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_tabledescr.clas.xml create mode 100644 src/00/02/z2ui5_cl_srt_typedescr.clas.abap create mode 100644 src/00/02/z2ui5_cl_srt_typedescr.clas.xml create mode 100644 src/00/02/z2ui5_cx_srt.clas.abap create mode 100644 src/00/02/z2ui5_cx_srt.clas.xml diff --git a/.github/workflows/ajson_mirror.yaml b/.github/workflows/mirror_ajson.yaml similarity index 93% rename from .github/workflows/ajson_mirror.yaml rename to .github/workflows/mirror_ajson.yaml index 5539bbc5..73c69f07 100644 --- a/.github/workflows/ajson_mirror.yaml +++ b/.github/workflows/mirror_ajson.yaml @@ -25,8 +25,8 @@ jobs: run: | git clone https://github.com/abap2UI5/ajson_mirror.git ls -l - rm src/01/00/01/z* - cp ajson_mirror/src/z* src/01/00/01/ + rm src/00/01/z* + cp ajson_mirror/src/z* src/00/01/ rm -rf ajson_mirror git status - name: Open PR diff --git a/.github/workflows/mirror_srtti.yaml b/.github/workflows/mirror_srtti.yaml new file mode 100644 index 00000000..2b814ce2 --- /dev/null +++ b/.github/workflows/mirror_srtti.yaml @@ -0,0 +1,43 @@ +name: ajson mirror + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * 1' + +permissions: + contents: read + +jobs: + pr_ajson_changes: + # Origin repo only + permissions: + contents: write # for peter-evans/create-pull-request to create branch + pull-requests: write # for peter-evans/create-pull-request to create a PR + if: github.repository == 'abap2UI5/abap2UI5' + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + - name: run + run: | + git clone https://github.com/abap2UI5/srtti_mirror.git + ls -l + rm src/00/02/z* + cp srtti_mirror/src/z* src/00/02/ + rm -rf srtti_mirror + git status + - name: Open PR + uses: peter-evans/create-pull-request@v3 + with: + title: ajson, Automatic Update + branch: automatic/ajson + body: | + Automatic update from mirror + https://github.com/abap2UI5/ajson_mirror + + Make manual change to trigger CI + + Note: manual changes might be overwritten when the branch updates, so keep changes small, and merge fast diff --git a/src/00/02/z2ui5_cl_srt_aunit.clas.abap b/src/00/02/z2ui5_cl_srt_aunit.clas.abap new file mode 100644 index 00000000..decca52d --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_aunit.clas.abap @@ -0,0 +1,61 @@ +CLASS z2ui5_cl_srt_aunit DEFINITION + PUBLIC + FOR TESTING + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + CLASS-METHODS serialize_deserialize IMPORTING variable TYPE any. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cl_srt_aunit IMPLEMENTATION. + + METHOD serialize_deserialize. + " Serialize: both type and value at the same time. + FIELD-SYMBOLS TYPE any. + DATA rtti1 TYPE REF TO cl_abap_typedescr. + DATA srtti1 TYPE REF TO z2ui5_cl_srt_typedescr. + DATA xstring TYPE xstring. + DATA srtti2 TYPE REF TO z2ui5_cl_srt_typedescr. + DATA temp1 TYPE REF TO cl_abap_datadescr. + DATA rtti2 LIKE temp1. + DATA ref_variable2 TYPE REF TO data. + FIELD-SYMBOLS TYPE any. + ASSIGN variable TO . + + rtti1 = cl_abap_typedescr=>describe_by_data( ). + + srtti1 = z2ui5_cl_srt_typedescr=>create_by_data_object( ). + + CALL TRANSFORMATION id + SOURCE srtti = srtti1 + dobj = + RESULT XML xstring + OPTIONS data_refs = 'heap-or-create'. + + " Deserialize: (1) the type, to create the variable (2) then the value. + + CALL TRANSFORMATION id + SOURCE XML xstring + RESULT srtti = srtti2. + + temp1 ?= srtti2->get_rtti( ). + + rtti2 = temp1. + + CREATE DATA ref_variable2 TYPE HANDLE rtti2. + + ASSIGN ref_variable2->* TO . + CALL TRANSFORMATION id + SOURCE XML xstring + RESULT dobj = . + + cl_abap_unit_assert=>assert_equals( exp = rtti1 act = rtti2 ). + cl_abap_unit_assert=>assert_equals( exp = act = ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_aunit.clas.xml b/src/00/02/z2ui5_cl_srt_aunit.clas.xml new file mode 100644 index 00000000..06b87a21 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_aunit.clas.xml @@ -0,0 +1,17 @@ + + + + + + Z2UI5_CL_SRT_AUNIT + E + Test class + 05 + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_classdescr.clas.abap b/src/00/02/z2ui5_cl_srt_classdescr.clas.abap new file mode 100644 index 00000000..2d096549 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_classdescr.clas.abap @@ -0,0 +1,26 @@ +"!

Serializable RTTI class

+CLASS z2ui5_cl_srt_classdescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_objectdescr + CREATE PUBLIC. + + PUBLIC SECTION. + + DATA class_kind LIKE cl_abap_classdescr=>class_kind. + DATA create_visibility LIKE cl_abap_classdescr=>create_visibility. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_classdescr. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + +CLASS z2ui5_cl_srt_classdescr IMPLEMENTATION. + METHOD constructor. + super->constructor( rtti ). + class_kind = rtti->class_kind. + create_visibility = rtti->create_visibility. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_classdescr.clas.xml b/src/00/02/z2ui5_cl_srt_classdescr.clas.xml new file mode 100644 index 00000000..7b41e766 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_classdescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_CLASSDESCR + E + Serializable RTTI class + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_complexdescr.clas.abap b/src/00/02/z2ui5_cl_srt_complexdescr.clas.abap new file mode 100644 index 00000000..ba8c0f04 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_complexdescr.clas.abap @@ -0,0 +1,15 @@ +"!

Serializable RTTI complex type

+CLASS z2ui5_cl_srt_complexdescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_datadescr + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cl_srt_complexdescr IMPLEMENTATION. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_complexdescr.clas.xml b/src/00/02/z2ui5_cl_srt_complexdescr.clas.xml new file mode 100644 index 00000000..6e50ebcc --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_complexdescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_COMPLEXDESCR + E + Serializable RTTI complex type + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_datadescr.clas.abap b/src/00/02/z2ui5_cl_srt_datadescr.clas.abap new file mode 100644 index 00000000..0c2719a5 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_datadescr.clas.abap @@ -0,0 +1,15 @@ +"!

Serializable RTTI data object

+CLASS z2ui5_cl_srt_datadescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_typedescr + CREATE PUBLIC . + + PUBLIC SECTION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cl_srt_datadescr IMPLEMENTATION. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_datadescr.clas.xml b/src/00/02/z2ui5_cl_srt_datadescr.clas.xml new file mode 100644 index 00000000..4be2f77c --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_datadescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_DATADESCR + E + Serializable RTTI data object + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_elemdescr.clas.abap b/src/00/02/z2ui5_cl_srt_elemdescr.clas.abap new file mode 100644 index 00000000..7b3a311b --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_elemdescr.clas.abap @@ -0,0 +1,95 @@ +"!

Serializable RTTI elementary type

+CLASS z2ui5_cl_srt_elemdescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_datadescr + CREATE PUBLIC. + + PUBLIC SECTION. + + DATA edit_mask LIKE cl_abap_elemdescr=>edit_mask. + DATA help_id LIKE cl_abap_elemdescr=>help_id. + DATA output_length LIKE cl_abap_elemdescr=>output_length. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_elemdescr. + + METHODS get_rtti + REDEFINITION. + PROTECTED SECTION. + METHODS get_rtti_by_type_kind + IMPORTING + i_type_kind LIKE cl_abap_typedescr=>type_kind + RETURNING + VALUE(rtti) TYPE REF TO cl_abap_typedescr. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cl_srt_elemdescr IMPLEMENTATION. + + + METHOD constructor. + super->constructor( rtti ). + + edit_mask = rtti->edit_mask. + help_id = rtti->help_id. + output_length = rtti->output_length. + ENDMETHOD. + + + METHOD get_rtti. + rtti = super->get_rtti( ). + IF rtti IS BOUND. + RETURN. + ENDIF. + + IF is_ddic_type = abap_true + AND technical_type = abap_false. + " If XML transformations are used, they may be based on + " the data element, for instance XSDBOOLEAN will convert "true" + " into "X" during deserialization. + rtti = cl_abap_typedescr=>describe_by_name( absolute_name ). + ELSE. + rtti = get_rtti_by_type_kind( type_kind ). + ENDIF. + ENDMETHOD. + + + METHOD get_rtti_by_type_kind. + DATA l_length TYPE i. + + CASE i_type_kind. + WHEN cl_abap_typedescr=>typekind_num. + l_length = length / cl_abap_char_utilities=>charsize. + rtti = cl_abap_elemdescr=>get_n( l_length ). + WHEN cl_abap_typedescr=>typekind_char. + l_length = length / cl_abap_char_utilities=>charsize. + rtti = cl_abap_elemdescr=>get_c( l_length ). + WHEN cl_abap_typedescr=>typekind_string. + rtti = cl_abap_elemdescr=>get_string( ). + WHEN cl_abap_typedescr=>typekind_xstring. + rtti = cl_abap_elemdescr=>get_xstring( ). + WHEN cl_abap_typedescr=>typekind_int. + rtti = cl_abap_elemdescr=>get_i( ). + WHEN cl_abap_typedescr=>typekind_float. + rtti = cl_abap_elemdescr=>get_f( ). + WHEN cl_abap_typedescr=>typekind_date. + rtti = cl_abap_elemdescr=>get_d( ). + WHEN cl_abap_typedescr=>typekind_time. + rtti = cl_abap_elemdescr=>get_t( ). + WHEN cl_abap_typedescr=>typekind_hex. + rtti = cl_abap_elemdescr=>get_x( length ). + WHEN cl_abap_typedescr=>typekind_packed. + rtti = cl_abap_elemdescr=>get_p( p_length = length + p_decimals = decimals ). + WHEN cl_abap_typedescr=>typekind_decfloat16. + rtti = cl_abap_elemdescr=>get_decfloat16( ). + WHEN cl_abap_typedescr=>typekind_decfloat34. + rtti = cl_abap_elemdescr=>get_decfloat34( ). + WHEN OTHERS. + RAISE EXCEPTION TYPE z2ui5_cx_srt. + ENDCASE. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_elemdescr.clas.xml b/src/00/02/z2ui5_cl_srt_elemdescr.clas.xml new file mode 100644 index 00000000..c20bb4d5 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_elemdescr.clas.xml @@ -0,0 +1,17 @@ + + + + + + Z2UI5_CL_SRT_ELEMDESCR + E + Serializable RTTI elementary type + 1 + X + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_intfdescr.clas.abap b/src/00/02/z2ui5_cl_srt_intfdescr.clas.abap new file mode 100644 index 00000000..4ad661fd --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_intfdescr.clas.abap @@ -0,0 +1,24 @@ +"!

Serializable RTTI interface

+CLASS z2ui5_cl_srt_intfdescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_objectdescr + CREATE PUBLIC. + + PUBLIC SECTION. + + DATA intf_kind LIKE cl_abap_intfdescr=>intf_kind. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_intfdescr. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + +CLASS z2ui5_cl_srt_intfdescr IMPLEMENTATION. + METHOD constructor. + super->constructor( rtti ). + intf_kind = rtti->intf_kind. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_intfdescr.clas.xml b/src/00/02/z2ui5_cl_srt_intfdescr.clas.xml new file mode 100644 index 00000000..b899b105 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_intfdescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_INTFDESCR + E + Serializable RTTI interface + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_objectdescr.clas.abap b/src/00/02/z2ui5_cl_srt_objectdescr.clas.abap new file mode 100644 index 00000000..80ed725f --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_objectdescr.clas.abap @@ -0,0 +1,41 @@ +"!

Serializable RTTI object type

+class z2ui5_cl_srt_objectdescr definition + public + inheriting from z2ui5_cl_srt_typedescr + create public . + +public section. + + data INTERFACES like CL_ABAP_OBJECTDESCR=>INTERFACES . + data TYPES like CL_ABAP_OBJECTDESCR=>TYPES . + data ATTRIBUTES like CL_ABAP_OBJECTDESCR=>ATTRIBUTES . + data METHODS like CL_ABAP_OBJECTDESCR=>METHODS . + data EVENTS like CL_ABAP_OBJECTDESCR=>EVENTS . + + methods CONSTRUCTOR + importing + !RTTI type ref to CL_ABAP_OBJECTDESCR . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cl_srt_objectdescr IMPLEMENTATION. + + + METHOD constructor. + super->constructor( rtti ). + + interfaces = rtti->interfaces. + types = rtti->types. + attributes = rtti->attributes. + methods = rtti->methods. + events = rtti->events. + + READ TABLE interfaces WITH KEY name = 'IF_SERIALIZABLE_OBJECT' TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + not_serializable = abap_true. + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_objectdescr.clas.xml b/src/00/02/z2ui5_cl_srt_objectdescr.clas.xml new file mode 100644 index 00000000..dbf77a1d --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_objectdescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_OBJECTDESCR + E + Serializable RTTI object type + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_refdescr.clas.abap b/src/00/02/z2ui5_cl_srt_refdescr.clas.abap new file mode 100644 index 00000000..1f4dd35f --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_refdescr.clas.abap @@ -0,0 +1,42 @@ +"!

Serializable RTTI reference

+CLASS z2ui5_cl_srt_refdescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_datadescr + CREATE PUBLIC. + + PUBLIC SECTION. + + DATA referenced_type TYPE REF TO z2ui5_cl_srt_typedescr. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_refdescr. + + METHODS get_rtti + REDEFINITION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + +CLASS z2ui5_cl_srt_refdescr IMPLEMENTATION. + METHOD constructor. + super->constructor( rtti ). + CREATE OBJECT referenced_type TYPE z2ui5_cl_srt_typedescr + EXPORTING rtti = rtti->get_referenced_type( ). + IF referenced_type->not_serializable = abap_true. + not_serializable = abap_true. + ENDIF. + ENDMETHOD. + + METHOD get_rtti. + IF referenced_type->type_kind = cl_abap_typedescr=>typekind_data. + rtti = cl_abap_refdescr=>get_ref_to_data( ). + ELSEIF referenced_type->absolute_name = '\CLASS=OBJECT'. + rtti = cl_abap_refdescr=>get_ref_to_object( ). + ELSE. + rtti = referenced_type->get_rtti( ). + ENDIF. + rtti = cl_abap_refdescr=>create( rtti ). + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_refdescr.clas.xml b/src/00/02/z2ui5_cl_srt_refdescr.clas.xml new file mode 100644 index 00000000..0ce991de --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_refdescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_REFDESCR + E + Serializable RTTI reference + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_structdescr.clas.abap b/src/00/02/z2ui5_cl_srt_structdescr.clas.abap new file mode 100644 index 00000000..3bdeb559 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_structdescr.clas.abap @@ -0,0 +1,84 @@ +"!

Serializable RTTI structure

+CLASS z2ui5_cl_srt_structdescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_complexdescr + CREATE PUBLIC. + + PUBLIC SECTION. + + TYPES: + BEGIN OF sabap_componentdescr, + name TYPE string, + type TYPE REF TO z2ui5_cl_srt_datadescr, + as_include TYPE abap_bool, + suffix TYPE string, + END OF sabap_componentdescr. + TYPES sabap_component_tab TYPE STANDARD TABLE OF sabap_componentdescr WITH DEFAULT KEY. + + DATA struct_kind LIKE cl_abap_structdescr=>struct_kind READ-ONLY. + DATA components TYPE sabap_component_tab READ-ONLY. + DATA has_include LIKE cl_abap_structdescr=>has_include READ-ONLY. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_structdescr. + + METHODS get_rtti + REDEFINITION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + +CLASS z2ui5_cl_srt_structdescr IMPLEMENTATION. + METHOD constructor. + DATA components_rtti TYPE abap_component_tab. + DATA scomponent TYPE sabap_componentdescr. + DATA scomponent_rtti TYPE REF TO z2ui5_cl_srt_datadescr. + + FIELD-SYMBOLS TYPE abap_componentdescr. + + super->constructor( rtti ). + + struct_kind = rtti->struct_kind. + has_include = rtti->has_include. + + components_rtti = rtti->get_components( ). + + LOOP AT components_rtti ASSIGNING . + + CLEAR scomponent. + scomponent-name = -name. + + scomponent_rtti ?= z2ui5_cl_srt_datadescr=>create_by_rtti( -type ). + scomponent-type = scomponent_rtti. + scomponent-as_include = -as_include. + scomponent-suffix = -suffix. + + APPEND scomponent TO components. + IF scomponent-type->not_serializable = abap_true. + not_serializable = abap_true. + ENDIF. + ENDLOOP. + ENDMETHOD. + + METHOD get_rtti. + DATA components_rtti TYPE cl_abap_structdescr=>component_table. + DATA component_rtti TYPE abap_componentdescr. + + FIELD-SYMBOLS TYPE sabap_componentdescr. + + CLEAR components_rtti. + LOOP AT components ASSIGNING . + + CLEAR component_rtti. + component_rtti-name = -name. + component_rtti-type ?= -type->get_rtti( ). + component_rtti-as_include = -as_include. + component_rtti-suffix = -suffix. + + APPEND component_rtti TO components_rtti. + ENDLOOP. + rtti = cl_abap_structdescr=>create( components_rtti ). + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_structdescr.clas.xml b/src/00/02/z2ui5_cl_srt_structdescr.clas.xml new file mode 100644 index 00000000..42b8d2ed --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_structdescr.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_SRT_STRUCTDESCR + E + Serializable RTTI structure + 1 + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_tabledescr.clas.abap b/src/00/02/z2ui5_cl_srt_tabledescr.clas.abap new file mode 100644 index 00000000..b81a760d --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_tabledescr.clas.abap @@ -0,0 +1,70 @@ +"!

Serializable RTTI table

+CLASS z2ui5_cl_srt_tabledescr DEFINITION + PUBLIC + INHERITING FROM z2ui5_cl_srt_complexdescr + CREATE PUBLIC. + + PUBLIC SECTION. + + DATA key LIKE cl_abap_tabledescr=>key. + DATA initial_size LIKE cl_abap_tabledescr=>initial_size. + DATA key_defkind LIKE cl_abap_tabledescr=>key_defkind. + DATA has_unique_key LIKE cl_abap_tabledescr=>has_unique_key. + DATA table_kind LIKE cl_abap_tabledescr=>table_kind. + DATA line_type TYPE REF TO z2ui5_cl_srt_datadescr. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_tabledescr. + + METHODS get_rtti + REDEFINITION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + +CLASS z2ui5_cl_srt_tabledescr IMPLEMENTATION. + METHOD constructor. + super->constructor( rtti ). + key = rtti->key. + initial_size = rtti->initial_size. + key_defkind = rtti->key_defkind. + has_unique_key = rtti->has_unique_key. + table_kind = rtti->table_kind. + + line_type ?= z2ui5_cl_srt_typedescr=>create_by_rtti( rtti->get_table_line_type( ) ). + IF line_type->not_serializable = abap_true. + not_serializable = abap_true. + ENDIF. + ENDMETHOD. + + METHOD get_rtti. + DATA lt_empty_key TYPE abap_keydescr_tab. + DATA lo_data_rtti TYPE REF TO cl_abap_datadescr. + DATA lo_error TYPE REF TO cx_sy_table_creation. + + FIELD-SYMBOLS TYPE abap_keydescr_tab. + + CLEAR lt_empty_key. + CASE key_defkind. + WHEN cl_abap_tabledescr=>keydefkind_user. + ASSIGN key TO . + WHEN OTHERS. + ASSIGN lt_empty_key TO . + ENDCASE. + TRY. + + lo_data_rtti ?= line_type->get_rtti( ). + rtti = cl_abap_tabledescr=>create( p_line_type = lo_data_rtti + p_table_kind = table_kind + p_unique = has_unique_key + p_key = + p_key_kind = key_defkind ). + + CATCH cx_sy_table_creation INTO lo_error. + RAISE EXCEPTION TYPE z2ui5_cx_srt + EXPORTING previous = lo_error. + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_tabledescr.clas.xml b/src/00/02/z2ui5_cl_srt_tabledescr.clas.xml new file mode 100644 index 00000000..8cabc14f --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_tabledescr.clas.xml @@ -0,0 +1,17 @@ + + + + + + Z2UI5_CL_SRT_TABLEDESCR + E + Serializable RTTI table + 1 + X + X + X + X + + + + diff --git a/src/00/02/z2ui5_cl_srt_typedescr.clas.abap b/src/00/02/z2ui5_cl_srt_typedescr.clas.abap new file mode 100644 index 00000000..235033e4 --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_typedescr.clas.abap @@ -0,0 +1,117 @@ +"!

Serializable RTTI any type

+CLASS z2ui5_cl_srt_typedescr DEFINITION + PUBLIC + CREATE PUBLIC. + + PUBLIC SECTION. + + INTERFACES if_serializable_object. + + DATA absolute_name LIKE cl_abap_typedescr=>absolute_name READ-ONLY. + DATA type_kind LIKE cl_abap_typedescr=>type_kind READ-ONLY. + DATA length LIKE cl_abap_typedescr=>length READ-ONLY. + DATA decimals LIKE cl_abap_typedescr=>decimals READ-ONLY. + DATA kind LIKE cl_abap_typedescr=>kind READ-ONLY. + "! True if it's an object type which doesn't implement the interface IF_SERIALIZABLE_OBJECT + DATA not_serializable TYPE abap_bool READ-ONLY. + DATA is_ddic_type TYPE abap_bool READ-ONLY. + "! True if the absolute name is %_T... + DATA technical_type TYPE abap_bool READ-ONLY. + + METHODS constructor + IMPORTING + !rtti TYPE REF TO cl_abap_typedescr. + METHODS get_rtti + RETURNING + VALUE(rtti) TYPE REF TO cl_abap_typedescr. + CLASS-METHODS create_by_rtti + IMPORTING + !rtti TYPE REF TO cl_abap_typedescr + RETURNING + VALUE(srtti) TYPE REF TO z2ui5_cl_srt_typedescr. + CLASS-METHODS create_by_data_object + IMPORTING + !data_object TYPE any + RETURNING + VALUE(srtti) TYPE REF TO z2ui5_cl_srt_typedescr. + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + + +CLASS z2ui5_cl_srt_typedescr IMPLEMENTATION. + METHOD constructor. + absolute_name = rtti->absolute_name. + type_kind = rtti->type_kind. + length = rtti->length. + decimals = rtti->decimals. + kind = rtti->kind. + is_ddic_type = rtti->is_ddic_type( ). + IF rtti->absolute_name CP '\TYPE=%_T*'. + technical_type = abap_true. + ENDIF. + ENDMETHOD. + + METHOD create_by_data_object. + srtti = create_by_rtti( cl_abap_typedescr=>describe_by_data( data_object ) ). + ENDMETHOD. + + METHOD create_by_rtti. + DATA elem_rtti TYPE REF TO cl_abap_elemdescr. + DATA struct_rtti TYPE REF TO cl_abap_structdescr. + DATA table_rtti TYPE REF TO cl_abap_tabledescr. + DATA ref_rtti TYPE REF TO cl_abap_refdescr. + DATA class_rtti TYPE REF TO cl_abap_classdescr. + DATA intf_rtti TYPE REF TO cl_abap_intfdescr. + + CASE rtti->kind. + WHEN cl_abap_typedescr=>kind_elem. + + elem_rtti ?= rtti. + CREATE OBJECT srtti TYPE z2ui5_cl_srt_elemdescr + EXPORTING rtti = elem_rtti. + + WHEN cl_abap_typedescr=>kind_struct. + + struct_rtti ?= rtti. + CREATE OBJECT srtti TYPE z2ui5_cl_srt_structdescr + EXPORTING rtti = struct_rtti. + + WHEN cl_abap_typedescr=>kind_table. + + table_rtti ?= rtti. + CREATE OBJECT srtti TYPE z2ui5_cl_srt_tabledescr + EXPORTING rtti = table_rtti. + + WHEN cl_abap_typedescr=>kind_ref. + + ref_rtti ?= rtti. + CREATE OBJECT srtti TYPE z2ui5_cl_srt_refdescr + EXPORTING rtti = ref_rtti. + + WHEN cl_abap_typedescr=>kind_class. + + class_rtti ?= rtti. + CREATE OBJECT srtti TYPE z2ui5_cl_srt_classdescr + EXPORTING rtti = class_rtti. + + WHEN cl_abap_typedescr=>kind_intf. + + intf_rtti ?= rtti. + CREATE OBJECT srtti TYPE z2ui5_cl_srt_intfdescr + EXPORTING rtti = intf_rtti. + + WHEN OTHERS. + " Unsupported (new ABAP features in the future) + RAISE EXCEPTION TYPE z2ui5_cx_srt. + ENDCASE. + ENDMETHOD. + + METHOD get_rtti. + " default behavior + IF technical_type = abap_false. + rtti = cl_abap_typedescr=>describe_by_name( absolute_name ). + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cl_srt_typedescr.clas.xml b/src/00/02/z2ui5_cl_srt_typedescr.clas.xml new file mode 100644 index 00000000..a9f0ab5e --- /dev/null +++ b/src/00/02/z2ui5_cl_srt_typedescr.clas.xml @@ -0,0 +1,17 @@ + + + + + + Z2UI5_CL_SRT_TYPEDESCR + E + Serializable RTTI any type + 1 + X + X + X + X + + + + diff --git a/src/00/02/z2ui5_cx_srt.clas.abap b/src/00/02/z2ui5_cx_srt.clas.abap new file mode 100644 index 00000000..d30b753d --- /dev/null +++ b/src/00/02/z2ui5_cx_srt.clas.abap @@ -0,0 +1,35 @@ +class z2ui5_cx_srt definition + public + inheriting from CX_NO_CHECK + final + create public . + +public section. + + interfaces IF_T100_MESSAGE . + + methods CONSTRUCTOR + importing + !TEXTID like IF_T100_MESSAGE=>T100KEY optional + !PREVIOUS like PREVIOUS optional . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS z2ui5_cx_srt IMPLEMENTATION. + + + METHOD constructor ##ADT_SUPPRESS_GENERATION. + CALL METHOD super->constructor + EXPORTING + previous = previous. + CLEAR me->textid. + IF textid IS INITIAL. + if_t100_message~t100key = if_t100_message=>default_textid. + ELSE. + if_t100_message~t100key = textid. + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/00/02/z2ui5_cx_srt.clas.xml b/src/00/02/z2ui5_cx_srt.clas.xml new file mode 100644 index 00000000..f4545e6a --- /dev/null +++ b/src/00/02/z2ui5_cx_srt.clas.xml @@ -0,0 +1,17 @@ + + + + + + Z2UI5_CX_SRT + E + General exception + 40 + 1 + X + X + X + + + + diff --git a/src/00/03/z2ui5_cl_util.clas.abap b/src/00/03/z2ui5_cl_util.clas.abap index 30ec4a67..dcd221b2 100644 --- a/src/00/03/z2ui5_cl_util.clas.abap +++ b/src/00/03/z2ui5_cl_util.clas.abap @@ -71,7 +71,7 @@ CLASS z2ui5_cl_util DEFINITION v4 TYPE string, timestampl TYPE timestampl, END OF ty_s_msg, - ty_t_msg TYPE STANDARD TABLE OF ty_S_msg WITH EMPTY KEY. + ty_t_msg TYPE STANDARD TABLE OF ty_s_msg WITH EMPTY KEY. CLASS-METHODS ui5_get_msg_type IMPORTING @@ -1239,23 +1239,26 @@ CLASS z2ui5_cl_util IMPLEMENTATION. CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result. - ELSEIF rtti_check_class_exists( 'Z2UI5_CL_SRTTI_TYPEDESCR' ) = abap_true.. + ELSE. - "DATA srtti TYPE REF TO object. - lv_classname = 'Z2UI5_CL_SRTTI_TYPEDESCR'. - CALL METHOD (lv_classname)=>('CREATE_BY_DATA_OBJECT') + TRY. + CALL METHOD z2ui5_cl_srt_typedescr=>('CREATE_BY_DATA_OBJECT') EXPORTING data_object = data RECEIVING srtti = srtti. - CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result. + CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result. - ELSE. - DATA(lv_text) = `UNSUPPORTED_FEATURE - Please install the open-source project S-RTTI by sandraros and try again: https://github.com/sandraros/S-RTTI`. - RAISE EXCEPTION TYPE z2ui5_cx_util_error - EXPORTING - val = lv_text. + CATCH cx_root. + + DATA(lv_text) = `UNSUPPORTED_FEATURE - Please install the open-source project S-RTTI by sandraros and try again: https://github.com/sandraros/S-RTTI`. + RAISE EXCEPTION TYPE z2ui5_cx_util_error + EXPORTING + val = lv_text. + + ENDTRY. + ENDIF. ENDMETHOD.