added srtti renamed to abap2ui5 (#1717)

* srtti

* fixes

* update

* update

* update

* update

* update

---------

Co-authored-by: oblomov-dev@outlook.com <>
This commit is contained in:
oblomov-dev 2025-01-29 14:57:47 +01:00 committed by GitHub
parent be659a5efd
commit 8c75009b2f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
78 changed files with 1311 additions and 22 deletions

View File

@ -1,7 +1,7 @@
{
"global": {
"files": "/src/**/*.*",
"noIssues": [ "/src/01/00/01" ]
"noIssues": [ "/src/00" ]
},
"dependencies": [
{

View File

@ -1,7 +1,7 @@
{
"global": {
"files": "/src/**/*.*",
"noIssues": [ "/src/01/00" ]
"noIssues": [ "/src/00" ]
},
"dependencies": [
{

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DEVC>
<CTEXT>srtti - https://github.com/sandraros/S-RTTI</CTEXT>
</DEVC>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,61 @@
CLASS z2ui5_cl_srtti_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_srtti_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_srtti_typedescr.
DATA xstring TYPE xstring.
DATA srtti2 TYPE REF TO z2ui5_cl_srtti_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_srtti_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_SRTTI_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_srtti_classdescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_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_srtti_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_SRTTI_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_srtti_complexdescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_datadescr
CREATE PUBLIC .
PUBLIC SECTION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_srtti_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_SRTTI_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_srtti_datadescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_typedescr
CREATE PUBLIC .
PUBLIC SECTION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_srtti_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_SRTTI_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_srtti_elemdescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_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_srtti_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_srtti.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,98 @@
*"* use this source file for your ABAP unit test classes
CLASS ltc_subclass DEFINITION INHERITING FROM z2ui5_cl_srtti_elemdescr.
PUBLIC SECTION.
METHODS get_rtti_by_type_kind_2
IMPORTING
i_type_kind LIKE cl_abap_typedescr=>type_kind
RETURNING
VALUE(rtti) TYPE REF TO cl_abap_typedescr.
ENDCLASS.
CLASS ltc_subclass IMPLEMENTATION.
METHOD get_rtti_by_type_kind_2.
rtti = get_rtti_by_type_kind( i_type_kind ).
ENDMETHOD.
ENDCLASS.
CLASS ltc_main DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS serialize_deserialize FOR TESTING.
METHODS get_rtti_by_type_kind FOR TESTING.
METHODS get_rtti_by_type_kind_assert
IMPORTING
variable TYPE simple.
ENDCLASS.
CLASS ltc_main IMPLEMENTATION.
METHOD serialize_deserialize.
DATA variable TYPE c LENGTH 20.
variable = 'Hello World'.
z2ui5_cl_srtti_aunit=>serialize_deserialize( variable ).
ENDMETHOD.
METHOD get_rtti_by_type_kind_assert.
DATA rtti TYPE REF TO cl_abap_elemdescr.
DATA lo_subclass TYPE REF TO ltc_subclass.
DATA rtti2 TYPE REF TO cl_abap_typedescr.
rtti ?= cl_abap_typedescr=>describe_by_data( variable ).
CREATE OBJECT lo_subclass
EXPORTING rtti = rtti.
rtti2 = lo_subclass->get_rtti_by_type_kind_2( i_type_kind = rtti->type_kind ).
cl_abap_unit_assert=>assert_equals( msg = 'decimals'
exp = rtti->decimals
act = rtti2->decimals ).
cl_abap_unit_assert=>assert_equals( msg = 'type_kind'
exp = rtti->type_kind
act = rtti2->type_kind ).
cl_abap_unit_assert=>assert_equals( msg = 'length'
exp = rtti->length
act = rtti2->length ).
ENDMETHOD.
METHOD get_rtti_by_type_kind.
DATA n TYPE n LENGTH 20.
DATA c TYPE c LENGTH 20.
DATA string TYPE string.
DATA xstring TYPE xstring.
DATA i TYPE i.
DATA f TYPE f.
DATA d TYPE d.
DATA t TYPE t.
DATA x TYPE x LENGTH 20.
DATA p TYPE p LENGTH 10 DECIMALS 3.
DATA int1 TYPE int1.
DATA int2 TYPE int2.
DATA decfloat16 TYPE decfloat16.
DATA decfloat34 TYPE decfloat34.
get_rtti_by_type_kind_assert( n ).
get_rtti_by_type_kind_assert( c ).
get_rtti_by_type_kind_assert( string ).
get_rtti_by_type_kind_assert( xstring ).
get_rtti_by_type_kind_assert( i ).
get_rtti_by_type_kind_assert( f ).
get_rtti_by_type_kind_assert( d ).
get_rtti_by_type_kind_assert( t ).
get_rtti_by_type_kind_assert( x ).
get_rtti_by_type_kind_assert( p ).
get_rtti_by_type_kind_assert( int1 ).
get_rtti_by_type_kind_assert( int2 ).
get_rtti_by_type_kind_assert( decfloat16 ).
get_rtti_by_type_kind_assert( decfloat34 ).
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_SRTTI_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_srtti_intfdescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_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_srtti_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_SRTTI_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_srtti_objectdescr definition
public
inheriting from z2ui5_cl_srtti_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_srtti_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_SRTTI_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_srtti_refdescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_datadescr
CREATE PUBLIC.
PUBLIC SECTION.
DATA referenced_type TYPE REF TO z2ui5_cl_srtti_typedescr.
METHODS constructor
IMPORTING
!rtti TYPE REF TO cl_abap_refdescr.
METHODS get_rtti
REDEFINITION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_srtti_refdescr IMPLEMENTATION.
METHOD constructor.
super->constructor( rtti ).
CREATE OBJECT referenced_type TYPE z2ui5_cl_srtti_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_SRTTI_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_srtti_structdescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_complexdescr
CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF sabap_componentdescr,
name TYPE string,
type TYPE REF TO z2ui5_cl_srtti_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_srtti_structdescr IMPLEMENTATION.
METHOD constructor.
DATA components_rtti TYPE abap_component_tab.
DATA scomponent TYPE sabap_componentdescr.
DATA scomponent_rtti TYPE REF TO z2ui5_cl_srtti_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_srtti_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_SRTTI_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_srtti_tabledescr DEFINITION
PUBLIC
INHERITING FROM z2ui5_cl_srtti_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_srtti_datadescr.
METHODS constructor
IMPORTING
!rtti TYPE REF TO cl_abap_tabledescr.
METHODS get_rtti
REDEFINITION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_srtti_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_srtti_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_srtti
EXPORTING previous = lo_error.
ENDTRY.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,117 @@
*"* use this source file for your ABAP unit test classes
CLASS ltc_main DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES: BEGIN OF ty_line_with_components,
very__very_long_component_name TYPE i,
END OF ty_line_with_components.
TYPES ty_std_table_comps_default_key TYPE STANDARD TABLE OF ty_line_with_components WITH DEFAULT KEY.
METHODS check_instantiated_classes FOR TESTING.
METHODS bound_line_type FOR TESTING.
METHODS assert_copy_equals_original
IMPORTING
srtti TYPE REF TO z2ui5_cl_srtti_typedescr
original TYPE ty_std_table_comps_default_key.
ENDCLASS.
CLASS ltc_main IMPLEMENTATION.
METHOD assert_copy_equals_original.
DATA rtti TYPE REF TO cl_abap_tabledescr.
DATA dref TYPE REF TO data.
FIELD-SYMBOLS <copy> TYPE any.
rtti ?= srtti->get_rtti( ).
CREATE DATA dref TYPE HANDLE rtti.
ASSIGN dref->* TO <copy>.
<copy> = original.
cl_abap_unit_assert=>assert_equals( act = <copy>
exp = original ).
ENDMETHOD.
METHOD bound_line_type.
DATA line_with_components TYPE ty_line_with_components.
DATA std_table_comps_default_key TYPE ty_std_table_comps_default_key.
DATA component TYPE abap_componentdescr.
DATA components TYPE abap_component_tab.
DATA rtti TYPE REF TO cl_abap_tabledescr.
DATA dref TYPE REF TO data.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
FIELD-SYMBOLS <original_table> TYPE ANY TABLE.
FIELD-SYMBOLS <original_line> TYPE any.
FIELD-SYMBOLS <line_with_components> TYPE ty_line_with_components.
line_with_components-very__very_long_component_name = 25.
INSERT line_with_components INTO TABLE std_table_comps_default_key.
line_with_components-very__very_long_component_name = 37.
INSERT line_with_components INTO TABLE std_table_comps_default_key.
component-name = 'VERY__VERY_LONG_COMPONENT_NAME'.
component-type = cl_abap_elemdescr=>get_i( ).
INSERT component INTO TABLE components.
rtti = cl_abap_tabledescr=>create( p_line_type = cl_abap_structdescr=>create( p_components = components ) ).
CREATE DATA dref TYPE HANDLE rtti.
ASSIGN dref->* TO <original_table>.
CREATE DATA dref LIKE LINE OF <original_table>.
ASSIGN dref->* TO <original_line>.
LOOP AT std_table_comps_default_key ASSIGNING <line_with_components>.
MOVE-CORRESPONDING <line_with_components> TO <original_line>.
INSERT <original_line> INTO TABLE <original_table>.
ENDLOOP.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( <original_table> ).
assert_copy_equals_original( srtti = srtti
original = <original_table> ).
ENDMETHOD.
METHOD check_instantiated_classes.
DATA comp_row TYPE LINE OF abap_component_tab.
DATA comp_tab TYPE abap_component_tab.
DATA struct_rtti TYPE REF TO cl_abap_structdescr.
DATA table_rtti TYPE REF TO cl_abap_tabledescr.
DATA dref TYPE REF TO data.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA test TYPE REF TO z2ui5_cl_srtti_tabledescr.
DATA srtti_tab TYPE REF TO z2ui5_cl_srtti_tabledescr.
DATA srtti2 TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA test2 TYPE REF TO z2ui5_cl_srtti_structdescr.
FIELD-SYMBOLS <original> TYPE any.
comp_row-name = 'VERY__VERY_LONG_COMPONENT_NAME'.
comp_row-type = cl_abap_elemdescr=>get_i( ).
INSERT comp_row INTO TABLE comp_tab.
struct_rtti = cl_abap_structdescr=>create( p_components = comp_tab ).
table_rtti = cl_abap_tabledescr=>create( p_line_type = struct_rtti ).
CREATE DATA dref TYPE HANDLE table_rtti.
ASSIGN dref->* TO <original>.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( <original> ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( ).
ENDTRY.
srtti_tab ?= srtti.
srtti2 = srtti_tab->line_type.
TRY.
test2 ?= srtti2.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( ).
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_SRTTI_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_srtti_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_srtti_typedescr.
CLASS-METHODS create_by_data_object
IMPORTING
!data_object TYPE any
RETURNING
VALUE(srtti) TYPE REF TO z2ui5_cl_srtti_typedescr.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_srtti_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_srtti_elemdescr
EXPORTING rtti = elem_rtti.
WHEN cl_abap_typedescr=>kind_struct.
struct_rtti ?= rtti.
CREATE OBJECT srtti TYPE z2ui5_cl_srtti_structdescr
EXPORTING rtti = struct_rtti.
WHEN cl_abap_typedescr=>kind_table.
table_rtti ?= rtti.
CREATE OBJECT srtti TYPE z2ui5_cl_srtti_tabledescr
EXPORTING rtti = table_rtti.
WHEN cl_abap_typedescr=>kind_ref.
ref_rtti ?= rtti.
CREATE OBJECT srtti TYPE z2ui5_cl_srtti_refdescr
EXPORTING rtti = ref_rtti.
WHEN cl_abap_typedescr=>kind_class.
class_rtti ?= rtti.
CREATE OBJECT srtti TYPE z2ui5_cl_srtti_classdescr
EXPORTING rtti = class_rtti.
WHEN cl_abap_typedescr=>kind_intf.
intf_rtti ?= rtti.
CREATE OBJECT srtti TYPE z2ui5_cl_srtti_intfdescr
EXPORTING rtti = intf_rtti.
WHEN OTHERS.
" Unsupported (new ABAP features in the future)
RAISE EXCEPTION TYPE z2ui5_cx_srtti.
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,229 @@
*"* use this source file for your ABAP unit test classes
INTERFACE lif_any.
ENDINTERFACE.
CLASS lcl_any DEFINITION.
PUBLIC SECTION.
INTERFACES lif_any.
ENDCLASS.
CLASS ltc_main DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS technical_type FOR TESTING.
METHODS create_by_rtti_elem FOR TESTING RAISING cx_static_check.
METHODS create_by_rtti_struct FOR TESTING RAISING cx_static_check.
METHODS create_by_rtti_table FOR TESTING RAISING cx_static_check.
METHODS create_by_rtti_ref FOR TESTING RAISING cx_static_check.
METHODS create_by_rtti_class FOR TESTING RAISING cx_static_check.
METHODS create_by_rtti_intf FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltc_serialize_deserialize DEFINITION
FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS class FOR TESTING.
METHODS elem FOR TESTING.
METHODS intf FOR TESTING.
METHODS ref FOR TESTING.
METHODS structure FOR TESTING.
METHODS table FOR TESTING.
TYPES ty_char_10 TYPE c LENGTH 10.
DATA: BEGIN OF variables,
char_10 TYPE ty_char_10,
ref_to_class TYPE REF TO lcl_any,
ref_to_intf TYPE REF TO lif_any,
BEGIN OF structure,
comp1 TYPE i,
END OF structure,
table TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
dref TYPE REF TO ty_char_10,
END OF variables.
DATA rtti_before TYPE REF TO cl_abap_typedescr.
METHODS assert_equal_serializ_deserial.
ENDCLASS.
CLASS ltc_main IMPLEMENTATION.
METHOD create_by_rtti_class.
DATA variable TYPE REF TO lcl_any.
DATA typedescr TYPE REF TO cl_abap_typedescr.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA test TYPE REF TO z2ui5_cl_srtti_classdescr.
CREATE OBJECT variable TYPE lcl_any.
typedescr ?= cl_abap_typedescr=>describe_by_object_ref( variable ).
srtti = z2ui5_cl_srtti_typedescr=>create_by_rtti( typedescr ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( 'is instance of zcl_srtti_classdescr' ).
ENDTRY.
ENDMETHOD.
METHOD create_by_rtti_elem.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA variable TYPE c LENGTH 20.
DATA test TYPE REF TO z2ui5_cl_srtti_elemdescr.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( variable ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( 'is instance of zcl_srtti_elemdescr' ).
ENDTRY.
ENDMETHOD.
METHOD create_by_rtti_intf.
DATA variable TYPE REF TO lcl_any.
DATA rtti_classdescr TYPE REF TO cl_abap_classdescr.
DATA rtti_intf TYPE REF TO cl_abap_intfdescr.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA test TYPE REF TO z2ui5_cl_srtti_intfdescr.
CREATE OBJECT variable TYPE lcl_any.
rtti_classdescr ?= cl_abap_typedescr=>describe_by_object_ref( variable ).
rtti_intf = rtti_classdescr->get_interface_type( 'LIF_ANY' ).
srtti = z2ui5_cl_srtti_typedescr=>create_by_rtti( rtti_intf ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( 'is instance of zcl_srtti_intfdescr' ).
ENDTRY.
ENDMETHOD.
METHOD create_by_rtti_struct.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA test TYPE REF TO z2ui5_cl_srtti_structdescr.
DATA:
BEGIN OF variable,
comp1 TYPE c LENGTH 20,
END OF variable.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( variable ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( 'is instance of zcl_srtti_structdescr' ).
ENDTRY.
ENDMETHOD.
METHOD create_by_rtti_table.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA test TYPE REF TO z2ui5_cl_srtti_structdescr.
DATA:
BEGIN OF variable,
comp1 TYPE c LENGTH 20,
END OF variable.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( variable ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( 'is instance of zcl_srtti_structdescr' ).
ENDTRY.
ENDMETHOD.
METHOD create_by_rtti_ref.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA variable TYPE REF TO flag.
DATA test TYPE REF TO z2ui5_cl_srtti_refdescr.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( variable ).
TRY.
test ?= srtti.
CATCH cx_sy_move_cast_error.
cl_abap_unit_assert=>fail( 'is instance of zcl_srtti_refdescr' ).
ENDTRY.
ENDMETHOD.
METHOD technical_type.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA dobj_with_bound_data_type TYPE c LENGTH 20.
srtti = z2ui5_cl_srtti_typedescr=>create_by_data_object( dobj_with_bound_data_type ).
cl_abap_unit_assert=>assert_true( msg = 'technical_type'
act = srtti->technical_type ).
ENDMETHOD.
ENDCLASS.
CLASS ltc_serialize_deserialize IMPLEMENTATION.
METHOD assert_equal_serializ_deserial.
DATA srtti TYPE REF TO z2ui5_cl_srtti_typedescr.
DATA rtti_after TYPE REF TO cl_abap_typedescr.
srtti = z2ui5_cl_srtti_typedescr=>create_by_rtti( rtti = rtti_before ).
rtti_after = srtti->get_rtti( ).
cl_abap_unit_assert=>assert_bound( msg = 'result bound'
act = rtti_after ).
cl_abap_unit_assert=>assert_equals( msg = 'Type kind'
exp = rtti_before->type_kind
act = rtti_after->type_kind ).
cl_abap_unit_assert=>assert_equals( msg = 'length'
exp = rtti_before->length
act = rtti_after->length ).
cl_abap_unit_assert=>assert_equals( msg = 'decimals'
exp = rtti_before->decimals
act = rtti_after->decimals ).
cl_abap_unit_assert=>assert_equals( msg = 'Kind'
exp = rtti_before->kind
act = rtti_after->kind ).
cl_abap_unit_assert=>assert_equals( msg = 'is_ddic_type'
exp = rtti_before->is_ddic_type( )
act = rtti_after->is_ddic_type( ) ).
ENDMETHOD.
METHOD class.
rtti_before = cl_abap_typedescr=>describe_by_data( variables-ref_to_class ).
assert_equal_serializ_deserial( ).
ENDMETHOD.
METHOD elem.
rtti_before = cl_abap_typedescr=>describe_by_data( variables-char_10 ).
assert_equal_serializ_deserial( ).
ENDMETHOD.
METHOD intf.
rtti_before = cl_abap_typedescr=>describe_by_data( variables-ref_to_intf ).
assert_equal_serializ_deserial( ).
ENDMETHOD.
METHOD ref.
rtti_before = cl_abap_typedescr=>describe_by_data( variables-dref ).
assert_equal_serializ_deserial( ).
ENDMETHOD.
METHOD structure.
rtti_before = cl_abap_typedescr=>describe_by_data( variables-structure ).
assert_equal_serializ_deserial( ).
ENDMETHOD.
METHOD table.
rtti_before = cl_abap_typedescr=>describe_by_data( variables-table ).
assert_equal_serializ_deserial( ).
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_SRTTI_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_srtti 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_srtti 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_SRTTI</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

@ -1210,7 +1210,7 @@ CLASS z2ui5_cl_util IMPLEMENTATION.
METHOD xml_srtti_parse.
check_raise_srtti_installed( ).
* check_raise_srtti_installed( ).
DATA srtti TYPE REF TO object.
CALL TRANSFORMATION id SOURCE XML rtti_data RESULT srtti = srtti.
@ -1231,17 +1231,39 @@ CLASS z2ui5_cl_util IMPLEMENTATION.
METHOD xml_srtti_stringify.
check_raise_srtti_installed( ).
TRY.
DATA(lv_check_srtti_installed) = abap_true.
check_raise_srtti_installed( ).
CATCH cx_root.
lv_check_srtti_installed = abap_false.
ENDTRY.
DATA srtti TYPE REF TO object.
DATA(lv_classname) = 'ZCL_SRTTI_TYPEDESCR'.
CALL METHOD (lv_classname)=>('CREATE_BY_DATA_OBJECT')
EXPORTING
data_object = data
RECEIVING
srtti = srtti.
IF lv_check_srtti_installed = abap_true.
CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result.
DATA srtti TYPE REF TO object.
DATA(lv_classname) = `ZCL_SRTTI_TYPEDESCR`.
CALL METHOD (lv_classname)=>('CREATE_BY_DATA_OBJECT')
EXPORTING
data_object = data
RECEIVING
srtti = srtti.
CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result.
ELSE.
"DATA srtti TYPE REF TO object.
lv_classname = 'Z2UI5_CL_SRTTI_TYPEDESCR'.
CALL METHOD (lv_classname)=>('CREATE_BY_DATA_OBJECT')
EXPORTING
data_object = data
RECEIVING
srtti = srtti.
CALL TRANSFORMATION id SOURCE srtti = srtti dobj = data RESULT XML result.
ENDIF.
ENDMETHOD.

View File

@ -180,15 +180,6 @@ CLASS z2ui5_cl_core_srv_attri IMPLEMENTATION.
TRY.
lr_attri->r_ref = attri_get_val_ref( lr_attri->name ).
lr_attri->o_typedescr = cl_abap_datadescr=>describe_by_data_ref( lr_attri->r_ref ).
* TRY.
* CAST cl_abap_refdescr( lr_attri->o_typedescr ).
* IF lr_attri->r_ref IS INITIAL.
* DELETE mt_attri->*.
* ENDIF.
* CATCH cx_root.
* ENDTRY.
CATCH cx_root.
ENDTRY.
ENDLOOP.

View File

@ -103,7 +103,7 @@ CLASS Z2UI5_CL_CORE_SRV_JSON IMPLEMENTATION.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
* ASSERT sy-subrc = 0.
ajson->set( iv_ignore_empty = abap_false
iv_path = `/`
iv_val = <attribute> ).