srtti added (#1720)

* fix (#1718) (#1719)

* add srtti

* update

* Create srtti_mirror.yaml

* Update srtti_mirror.yaml

* update github actions

* update

* update
This commit is contained in:
oblomov-dev 2025-01-31 12:21:29 +01:00 committed by GitHub
parent dc2d98dc9a
commit 9392449034
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 881 additions and 13 deletions

View File

@ -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

43
.github/workflows/mirror_srtti.yaml vendored Normal file
View File

@ -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

View File

@ -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 <variable1> 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 <variable2> TYPE any.
ASSIGN variable TO <variable1>.
rtti1 = cl_abap_typedescr=>describe_by_data( <variable1> ).
srtti1 = z2ui5_cl_srt_typedescr=>create_by_data_object( <variable1> ).
CALL TRANSFORMATION id
SOURCE srtti = srtti1
dobj = <variable1>
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 <variable2>.
CALL TRANSFORMATION id
SOURCE XML xstring
RESULT dobj = <variable2>.
cl_abap_unit_assert=>assert_equals( exp = rtti1 act = rtti2 ).
cl_abap_unit_assert=>assert_equals( exp = <variable1> act = <variable2> ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_AUNIT</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Test class</DESCRIPT>
<CATEGORY>05</CATEGORY>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,26 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI class</p>
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_CLASSDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI class</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,15 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI complex type</p>
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_COMPLEXDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI complex type</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,15 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI data object</p>
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_DATADESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI data object</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,95 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI elementary type</p>
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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_ELEMDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI elementary type</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,24 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI interface</p>
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_INTFDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI interface</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,41 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI object type</p>
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_OBJECTDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI object type</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,42 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI reference</p>
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_REFDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI reference</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,84 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI structure</p>
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 <component> 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 <component>.
CLEAR scomponent.
scomponent-name = <component>-name.
scomponent_rtti ?= z2ui5_cl_srt_datadescr=>create_by_rtti( <component>-type ).
scomponent-type = scomponent_rtti.
scomponent-as_include = <component>-as_include.
scomponent-suffix = <component>-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 <component> TYPE sabap_componentdescr.
CLEAR components_rtti.
LOOP AT components ASSIGNING <component>.
CLEAR component_rtti.
component_rtti-name = <component>-name.
component_rtti-type ?= <component>-type->get_rtti( ).
component_rtti-as_include = <component>-as_include.
component_rtti-suffix = <component>-suffix.
APPEND component_rtti TO components_rtti.
ENDLOOP.
rtti = cl_abap_structdescr=>create( components_rtti ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_STRUCTDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI structure</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,70 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI table</p>
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 <lt_key> TYPE abap_keydescr_tab.
CLEAR lt_empty_key.
CASE key_defkind.
WHEN cl_abap_tabledescr=>keydefkind_user.
ASSIGN key TO <lt_key>.
WHEN OTHERS.
ASSIGN lt_empty_key TO <lt_key>.
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 = <lt_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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_TABLEDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI table</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,117 @@
"! <p class="shorttext synchronized" lang="en">Serializable RTTI any type</p>
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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_SRT_TYPEDESCR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>Serializable RTTI any type</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CX_SRT</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>General exception</DESCRIPT>
<CATEGORY>40</CATEGORY>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -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.