
In the next steps we will build something like this:
INTERFACE zif_serializable_object
PUBLIC .
INTERFACES if_serializable_object.
METHODS set_data
IMPORTING i_data TYPE any.
METHODS read_mock_data
RETURNING VALUE(r_result) TYPE REF TO data.
METHODS how_is_my_name
RETURNING VALUE(r_result) TYPE zmock_name.
ENDINTERFACE.
INTERFACE zif_mock_creater
PUBLIC .
METHODS: create_mock_obj
IMPORTING i_mock_name TYPE zmock_name
RETURNING VALUE(r_result) TYPE REF TO zif_serializable_object.
METHODS: read_mock_obj
IMPORTING i_mock_name TYPE zmock_name
RETURNING VALUE(r_result) TYPE REF TO zif_serializable_object.
METHODS: update_mock_obj
IMPORTING i_mock TYPE REF TO zif_serializable_object
i_data TYPE any
RETURNING VALUE(r_result) TYPE REF TO zif_serializable_object.
METHODS: delete_mock_obj
IMPORTING i_mock_name TYPE zmock_name
RETURNING VALUE(r_result) TYPE sy-subrc.
ENDINTERFACE.
CLASS zcl_mock DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_serializable_object.
METHODS constructor
IMPORTING
i_mock_name TYPE zmock_name.
PROTECTED SECTION.
PRIVATE SECTION.
DATA: mock_name TYPE zmock_name,
mock_data TYPE REF TO data.
ENDCLASS.
CLASS zcl_mock IMPLEMENTATION.
METHOD constructor.
me->mock_name = i_mock_name.
ENDMETHOD.
METHOD zif_serializable_object~how_is_my_name.
r_result = mock_name.
ENDMETHOD.
METHOD zif_serializable_object~set_data.
DATA: type_name TYPE string.
DATA(type) = cl_abap_typedescr=>describe_by_data( i_data ).
CASE type->kind.
WHEN cl_abap_typedescr=>kind_intf.
WHEN cl_abap_typedescr=>kind_class.
WHEN cl_abap_typedescr=>kind_elem.
DATA(type_descr) = cl_abap_elemdescr=>describe_by_data( i_data ).
type_name = type_descr->get_relative_name( ).
CREATE DATA mock_data TYPE (type_name).
WHEN cl_abap_typedescr=>kind_struct.
DATA(struc_descr) = CAST cl_abap_structdescr( cl_abap_datadescr=>describe_by_data( i_data ) ).
type_name = struc_descr->get_relative_name( ).
CREATE DATA mock_data TYPE (type_name).
WHEN cl_abap_typedescr=>kind_table.
DATA(table_descr) = CAST cl_abap_tabledescr( cl_abap_tabledescr=>describe_by_data( i_data ) ).
DATA(line_decr) = table_descr->get_table_line_type( ).
type_name = line_decr->get_relative_name( ).
TYPES ty_sflight_lines TYPE STANDARD TABLE OF sflight WITH EMPTY KEY.
CREATE DATA mock_data TYPE ty_sflight_lines.
WHEN cl_abap_typedescr=>kind_ref.
WHEN OTHERS.
RETURN.
ENDCASE.
FIELD-SYMBOLS <dref> TYPE any.
ASSIGN me->mock_data->* TO <dref>.
<dref> = i_data.
ENDMETHOD.
METHOD zif_serializable_object~read_mock_data.
r_result = mock_data.
ENDMETHOD.
ENDCLASS.
CLASS zcl_mock_creator DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_mock_creater.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_mock_creator IMPLEMENTATION.
METHOD zif_mock_creater~create_mock_obj.
r_result = NEW zcl_mock( i_mock_name ).
ENDMETHOD.
METHOD zif_mock_creater~read_mock_obj.
TRY.
DATA(deserialized_obj) = NEW zcl_mock_serializer( )->deserialize( i_mock_name ).
CATCH zcx_mock_err INTO DATA(exc).
ENDTRY.
r_result = deserialized_obj.
ENDMETHOD.
METHOD zif_mock_creater~update_mock_obj.
i_mock->set_data( i_data ).
DATA(serialized_mock) = NEW zcl_mock_serializer( )->serialize( i_mock ).
DATA(ser_line) = VALUE zmock_serialized( mock_name = i_mock->how_is_my_name( )
serialized = serialized_mock ).
MODIFY zmock_serialized FROM ser_line.
COMMIT WORK.
ENDMETHOD.
METHOD zif_mock_creater~delete_mock_obj.
DELETE FROM zmock_serialized WHERE mock_name = i_mock_name.
r_result = sy-subrc.
ENDMETHOD.
ENDCLASS.
CLASS zcl_mock_serializer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
METHODS serialize
IMPORTING i_object TYPE REF TO zif_serializable_object
RETURNING VALUE(r_result) TYPE xstring.
METHODS deserialize
IMPORTING i_mock_name TYPE zmock_name
RETURNING VALUE(r_result) TYPE REF TO zif_serializable_object
RAISING zcx_mock_err.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_mock_serializer IMPLEMENTATION.
METHOD serialize.
CALL TRANSFORMATION id SOURCE obj = i_object RESULT XML DATA(xstring)
OPTIONS data_refs = 'heap-or-create'.
r_result = xstring.
ENDMETHOD.
METHOD deserialize.
SELECT SINGLE serialized
FROM zmock_serialized
INTO @DATA(xstring)
WHERE mock_name = @i_mock_name.
IF xstring IS INITIAL.
RAISE EXCEPTION TYPE zcx_mock_err
EXPORTING
textid = zcx_mock_err=>dyn_mess
param1 = 'No serislized object was found.'.
ENDIF.
TRY.
DATA deserialized_object TYPE REF TO zif_serializable_object.
CALL TRANSFORMATION id SOURCE XML xstring RESULT obj = deserialized_object.
CATCH cx_xslt_runtime_error.
ROLLBACK WORK.
RETURN.
ENDTRY.
r_result = deserialized_object.
ENDMETHOD.
ENDCLASS.
REPORT.
FIELD-SYMBOLS <dref> TYPE any.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_rb1 RADIOBUTTON GROUP grp1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT (15) lbl1 FOR FIELD p_rb1.
PARAMETERS: p_rb2 RADIOBUTTON GROUP grp1.
SELECTION-SCREEN COMMENT (15) lbl2 FOR FIELD p_rb2.
PARAMETERS: p_rb3 RADIOBUTTON GROUP grp1.
SELECTION-SCREEN COMMENT (15) lbl3 FOR FIELD p_rb3.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
title = 'Datentyp auswählen'.
lbl1 = 'Integer:'.
lbl2 = 'Structure:'.
lbl3 = 'Table:'.
START-OF-SELECTION.
DATA(mock_builder) = NEW zcl_mock_creater( ).
* Any data type
CASE 'X'.
WHEN p_rb1.
DATA numb TYPE i VALUE 5.
WHEN p_rb2.
SELECT SINGLE * FROM MARA INTO @DATA(mara_record).
WHEN p_rb3.
SELECT * FROM sflight UP TO 10 ROWS INTO TABLE @DATA(sflight_tab).
ENDCASE.
* 1 Create
DATA(mock) = mock_builder->zif_mock_creater~create_mock_obj( 'MY_MOCK_OBJECT' ).
* 2 Update
CASE 'X'.
WHEN p_rb1.
mock_builder->zif_mock_creater~update_mock_obj( i_mock = mock i_data = numb ).
WHEN p_rb2.
mock_builder->zif_mock_creater~update_mock_obj( i_mock = mock i_data = mara_record ).
WHEN p_rb3.
mock_builder->zif_mock_creater~update_mock_obj( i_mock = mock i_data = sflight_tab ).
ENDCASE.
* 3 Read de-serialized from DB
DATA(mock_data) = mock_builder->zif_mock_creater~read_mock_obj( 'MY_MOCK_OBJECT' )->read_mock_data( ).
ASSIGN mock_data->* TO <dref>.
* 4 Delete
mock_builder->zif_mock_creater~delete_mock_obj( 'MY_MOCK_OBJECT' ).
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
20 | |
8 | |
3 | |
3 | |
3 | |
3 | |
2 | |
2 | |
2 | |
2 |