CLASS z2ui5_cl_fw_db DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. TYPES: BEGIN OF ty_s_db, id TYPE string, id_prev TYPE string, id_prev_app TYPE string, id_prev_app_stack TYPE string, t_attri TYPE z2ui5_cl_fw_binding=>ty_t_attri, check_attri type abap_bool, app TYPE REF TO z2ui5_if_app, END OF ty_s_db . CLASS-METHODS create IMPORTING !id TYPE string !db TYPE ty_s_db . CLASS-METHODS load_app IMPORTING !id TYPE clike RETURNING VALUE(result) TYPE ty_s_db . CLASS-METHODS read IMPORTING !id TYPE clike !check_load_app TYPE abap_bool DEFAULT abap_true RETURNING VALUE(result) TYPE z2ui5_t_draft . CLASS-METHODS cleanup. CLASS-METHODS trans_any_2_xml IMPORTING !db TYPE ty_s_db RETURNING VALUE(result) TYPE string. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS z2ui5_cl_fw_db IMPLEMENTATION. METHOD cleanup. DATA(lv_time) = z2ui5_cl_fw_utility=>time_get_timestampl( ). DATA(lv_four_hours_ago) = z2ui5_cl_fw_utility=>time_substract_seconds( time = lv_time seconds = 60 * 60 * 4 ). DELETE FROM z2ui5_t_draft WHERE timestampl < @lv_four_hours_ago. COMMIT WORK. ENDMETHOD. METHOD create. DATA(lv_xml) = trans_any_2_xml( db ). DATA(ls_draft) = VALUE z2ui5_t_draft( uuid = id uuid_prev = db-id_prev uuid_prev_app = db-id_prev_app uuid_prev_app_stack = db-id_prev_app_stack uname = z2ui5_cl_fw_utility=>func_get_user_tech( ) timestampl = z2ui5_cl_fw_utility=>time_get_timestampl( ) data = lv_xml ). MODIFY z2ui5_t_draft FROM @ls_draft. IF sy-subrc <> 0. RAISE EXCEPTION TYPE z2ui5_cx_fw_error EXPORTING val = `CREATE_OF_DRAFT_ENTRY_ON_DATABASE_FAILED`. ENDIF. COMMIT WORK AND WAIT. ENDMETHOD. METHOD load_app. DATA(ls_db) = read( id ). z2ui5_cl_fw_utility=>trans_xml_2_any( EXPORTING xml = ls_db-data IMPORTING any = result ). DATA(lo_app) = CAST object( result-app ) ##NEEDED. LOOP AT result-t_attri REFERENCE INTO DATA(lr_attri) WHERE data_rtti IS NOT INITIAL AND type_kind = cl_abap_classdescr=>typekind_dref. FIELD-SYMBOLS TYPE any. DATA(lv_assign) = 'LO_APP->' && lr_attri->name. ASSIGN (lv_assign) TO . z2ui5_cl_fw_utility=>rtti_xml_set_to_data( EXPORTING rtti_data = lr_attri->data_rtti IMPORTING e_data = ). CLEAR lr_attri->data_rtti. ENDLOOP. ENDMETHOD. METHOD read. IF check_load_app = abap_true. SELECT SINGLE * FROM z2ui5_t_draft WHERE uuid = @id INTO @result. ELSE. SELECT SINGLE uuid, uuid_prev, uuid_prev_app, uuid_prev_app_stack FROM z2ui5_t_draft WHERE uuid = @id INTO CORRESPONDING FIELDS OF @result. ENDIF. IF sy-subrc <> 0. RAISE EXCEPTION TYPE z2ui5_cx_fw_error EXPORTING val = `NO_DRAFT_ENTRY_OF_PREVIOUS_REQUEST_FOUND`. ENDIF. ENDMETHOD. METHOD trans_any_2_xml. TRY. result = z2ui5_cl_fw_utility=>trans_xml_any_2( db ). CATCH cx_xslt_serialization_error INTO DATA(x). TRY. DATA(ls_db) = db. DATA(lo_app) = CAST object( ls_db-app ). IF NOT line_exists( ls_db-t_attri[ type_kind = cl_abap_classdescr=>typekind_dref ] ). ls_db-t_attri = z2ui5_cl_fw_binding=>update_attri( t_attri = ls_db-t_attri app = ls_db-app ). ENDIF. lo_app = CAST object( ls_db-app ). LOOP AT ls_db-t_attri REFERENCE INTO DATA(lr_attri) WHERE type_kind = cl_abap_classdescr=>typekind_dref. DATA(lv_assign) = 'LO_APP->' && lr_attri->name. FIELD-SYMBOLS TYPE any. FIELD-SYMBOLS TYPE any. ASSIGN (lv_assign) TO . ASSIGN ->* TO . IF sy-subrc <> 0 OR IS INITIAL. CONTINUE. ENDIF. lr_attri->data_rtti = z2ui5_cl_fw_utility=>rtti_xml_get_by_data( ). CLEAR . CLEAR . ENDLOOP. result = z2ui5_cl_fw_utility=>trans_xml_any_2( ls_db ). CATCH cx_root INTO DATA(x2). RAISE EXCEPTION TYPE z2ui5_cx_fw_error EXPORTING val = x->get_text( ) && `

` && x->previous->get_text( ) && `

` && x2->get_text( ). ENDTRY. ENDTRY. ENDMETHOD. ENDCLASS.