Serializable RTTI class
+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. diff --git a/src/00/02/z2ui5_cl_srtti_classdescr.clas.xml b/src/00/02/z2ui5_cl_srtti_classdescr.clas.xml new file mode 100644 index 00000000..a2c7b2da --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_classdescr.clas.xml @@ -0,0 +1,16 @@ + +Serializable RTTI complex type
+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. diff --git a/src/00/02/z2ui5_cl_srtti_complexdescr.clas.xml b/src/00/02/z2ui5_cl_srtti_complexdescr.clas.xml new file mode 100644 index 00000000..ccde27c8 --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_complexdescr.clas.xml @@ -0,0 +1,16 @@ + +Serializable RTTI data object
+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. diff --git a/src/00/02/z2ui5_cl_srtti_datadescr.clas.xml b/src/00/02/z2ui5_cl_srtti_datadescr.clas.xml new file mode 100644 index 00000000..f7c55390 --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_datadescr.clas.xml @@ -0,0 +1,16 @@ + +Serializable RTTI elementary type
+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. diff --git a/src/00/02/z2ui5_cl_srtti_elemdescr.clas.testclasses.abap b/src/00/02/z2ui5_cl_srtti_elemdescr.clas.testclasses.abap new file mode 100644 index 00000000..7b241323 --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_elemdescr.clas.testclasses.abap @@ -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. diff --git a/src/00/02/z2ui5_cl_srtti_elemdescr.clas.xml b/src/00/02/z2ui5_cl_srtti_elemdescr.clas.xml new file mode 100644 index 00000000..49ec15be --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_elemdescr.clas.xml @@ -0,0 +1,17 @@ + +Serializable RTTI interface
+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. diff --git a/src/00/02/z2ui5_cl_srtti_intfdescr.clas.xml b/src/00/02/z2ui5_cl_srtti_intfdescr.clas.xml new file mode 100644 index 00000000..8f34a72b --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_intfdescr.clas.xml @@ -0,0 +1,16 @@ + +Serializable RTTI object type
+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. diff --git a/src/00/02/z2ui5_cl_srtti_objectdescr.clas.xml b/src/00/02/z2ui5_cl_srtti_objectdescr.clas.xml new file mode 100644 index 00000000..e8740851 --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_objectdescr.clas.xml @@ -0,0 +1,16 @@ + +Serializable RTTI reference
+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. diff --git a/src/00/02/z2ui5_cl_srtti_refdescr.clas.xml b/src/00/02/z2ui5_cl_srtti_refdescr.clas.xml new file mode 100644 index 00000000..857409c0 --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_refdescr.clas.xml @@ -0,0 +1,16 @@ + +Serializable RTTI structure
+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-SYMBOLSSerializable RTTI table
+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-SYMBOLSSerializable RTTI any type
+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. diff --git a/src/00/02/z2ui5_cl_srtti_typedescr.clas.testclasses.abap b/src/00/02/z2ui5_cl_srtti_typedescr.clas.testclasses.abap new file mode 100644 index 00000000..f635e17c --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_typedescr.clas.testclasses.abap @@ -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. diff --git a/src/00/02/z2ui5_cl_srtti_typedescr.clas.xml b/src/00/02/z2ui5_cl_srtti_typedescr.clas.xml new file mode 100644 index 00000000..09f6f564 --- /dev/null +++ b/src/00/02/z2ui5_cl_srtti_typedescr.clas.xml @@ -0,0 +1,17 @@ + +