*&---------------------------------------------------------------------* *& Include ZABAPGIT_OBJECT_SMIM *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_object_smim DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_smim DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. PRIVATE SECTION. METHODS get_filename IMPORTING iv_url TYPE string RETURNING VALUE(rv_filename) TYPE string. METHODS find_content IMPORTING iv_url TYPE string RETURNING VALUE(rv_content) TYPE xstring RAISING lcx_exception. METHODS build_filename IMPORTING iv_filename TYPE string RETURNING VALUE(rv_filename) TYPE string. METHODS get_url_for_io EXPORTING ev_url TYPE string ev_is_folder TYPE boole_d RAISING lcx_not_found lcx_exception. ENDCLASS. "lcl_object_smim DEFINITION *----------------------------------------------------------------------* * CLASS lcl_object_smim IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_smim IMPLEMENTATION. METHOD lif_object~has_changed_since. rv_changed = abap_true. ENDMETHOD. "lif_object~has_changed_since METHOD lif_object~changed_by. DATA: lv_loio TYPE sdok_docid. lv_loio = ms_item-obj_name. SELECT SINGLE chng_user FROM smimloio INTO rv_user WHERE loio_id = lv_loio. "#EC CI_GENBUFF IF sy-subrc <> 0 OR rv_user IS INITIAL. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. TRY. get_url_for_io( ). rv_bool = abap_true. CATCH lcx_not_found. rv_bool = abap_false. ENDTRY. ENDMETHOD. "lif_object~exists METHOD get_url_for_io. DATA: ls_io TYPE skwf_io, lv_url TYPE skwf_url, ls_smimloio TYPE smimloio, lv_loio TYPE sdok_docid. lv_loio = ms_item-obj_name. CLEAR ev_url. CLEAR ev_is_folder. SELECT SINGLE * FROM smimloio INTO ls_smimloio WHERE loio_id = lv_loio. "#EC CI_GENBUFF IF sy-subrc <> 0. RAISE EXCEPTION TYPE lcx_not_found. ENDIF. IF ls_smimloio-lo_class = wbmr_c_skwf_folder_class. ev_is_folder = abap_true. ls_io-objtype = skwfc_obtype_folder. ELSE. ls_io-objtype = skwfc_obtype_loio. ENDIF. ls_io-class = ls_smimloio-lo_class. ls_io-objid = ls_smimloio-loio_id. CALL FUNCTION 'SKWF_NMSPC_IO_ADDRESS_GET' EXPORTING io = ls_io IMPORTING url = lv_url. ev_url = lv_url. ENDMETHOD. "get_url_for_io METHOD build_filename. CONCATENATE ms_item-obj_name ms_item-obj_type iv_filename INTO rv_filename SEPARATED BY '.'. TRANSLATE rv_filename TO LOWER CASE. ENDMETHOD. "build_filename METHOD find_content. DATA: lv_filename TYPE string, lt_files TYPE ty_files_tt. FIELD-SYMBOLS: LIKE LINE OF lt_files. lv_filename = get_filename( iv_url ). lv_filename = build_filename( lv_filename ). lt_files = mo_files->get_files( ). READ TABLE lt_files ASSIGNING WITH KEY filename = lv_filename. IF sy-subrc <> 0. lcx_exception=>raise( 'SMIM, file not found' ). ENDIF. rv_content = -data. ENDMETHOD. "find_content METHOD get_filename. DATA: lv_lines TYPE i, lt_strings TYPE TABLE OF string. SPLIT iv_url AT '/' INTO TABLE lt_strings. lv_lines = lines( lt_strings ). ASSERT lv_lines > 0. READ TABLE lt_strings INDEX lv_lines INTO rv_filename. ASSERT sy-subrc = 0. ENDMETHOD. "get_filename METHOD lif_object~serialize. DATA: lv_url TYPE string, lv_folder TYPE abap_bool, lv_filename TYPE string, lv_class TYPE smimloio-lo_class, ls_file TYPE ty_file, lv_content TYPE xstring, li_api TYPE REF TO if_mr_api, lv_loio TYPE sdok_docid. lv_loio = ms_item-obj_name. TRY. get_url_for_io( IMPORTING ev_url = lv_url ev_is_folder = lv_folder ). CATCH lcx_not_found. RETURN. ENDTRY. IF lv_folder = abap_false. li_api = cl_mime_repository_api=>if_mr_api~get_api( ). li_api->get( EXPORTING i_url = lv_url IMPORTING e_content = lv_content EXCEPTIONS parameter_missing = 1 error_occured = 2 not_found = 3 permission_failure = 4 OTHERS = 5 ). IF sy-subrc <> 0 AND sy-subrc <> 2 AND sy-subrc <> 3. lcx_exception=>raise( 'error from mime api->get:' && sy-msgv1 ). ENDIF. lv_filename = get_filename( lv_url ). CLEAR ls_file. ls_file-filename = build_filename( lv_filename ). ls_file-path = '/'. ls_file-data = lv_content. mo_files->add( ls_file ). SELECT SINGLE lo_class FROM smimloio INTO lv_class WHERE loio_id = lv_loio. ENDIF. io_xml->add( iv_name = 'URL' ig_data = lv_url ). io_xml->add( iv_name = 'FOLDER' ig_data = lv_folder ). io_xml->add( iv_name = 'CLASS' ig_data = lv_class ). ENDMETHOD. "serialize METHOD lif_object~deserialize. DATA: lv_url TYPE string, lv_folder TYPE abap_bool, lv_content TYPE xstring, lv_filename TYPE skwf_filnm, lv_io TYPE sdok_docid, lv_class TYPE smimloio-lo_class, ls_skwf_io TYPE skwf_io, li_api TYPE REF TO if_mr_api. li_api = cl_mime_repository_api=>if_mr_api~get_api( ). lv_io = ms_item-obj_name. io_xml->read( EXPORTING iv_name = 'URL' CHANGING cg_data = lv_url ). io_xml->read( EXPORTING iv_name = 'FOLDER' CHANGING cg_data = lv_folder ). io_xml->read( EXPORTING iv_name = 'CLASS' CHANGING cg_data = lv_class ). ls_skwf_io-objid = lv_io. IF lv_folder = abap_true. li_api->create_folder( EXPORTING i_url = lv_url i_language = sy-langu i_dev_package = iv_package i_folder_loio = ls_skwf_io EXCEPTIONS parameter_missing = 1 error_occured = 2 cancelled = 3 permission_failure = 4 folder_exists = 5 OTHERS = 6 ). IF sy-subrc <> 5 AND sy-subrc <> 0. lcx_exception=>raise( 'error frrom SMIM create_folder' ). ENDIF. ELSE. lv_filename = get_filename( lv_url ). ls_skwf_io-class = lv_class. IF ls_skwf_io-class IS INITIAL. cl_wb_mime_repository=>determine_io_class( EXPORTING filename = lv_filename IMPORTING io_class = ls_skwf_io-class ). CONCATENATE ls_skwf_io-class '_L' INTO ls_skwf_io-class. ENDIF. lv_content = find_content( lv_url ). li_api->put( EXPORTING i_url = lv_url i_content = lv_content i_dev_package = iv_package i_new_loio = ls_skwf_io EXCEPTIONS parameter_missing = 1 error_occured = 2 cancelled = 3 permission_failure = 4 data_inconsistency = 5 new_loio_already_exists = 6 is_folder = 7 OTHERS = 8 ). IF sy-subrc <> 0. lcx_exception=>raise( 'error from SMIM put' ). ENDIF. ENDIF. ENDMETHOD. "deserialize METHOD lif_object~delete. DATA: li_api TYPE REF TO if_mr_api, lv_url TYPE string. TRY. get_url_for_io( IMPORTING ev_url = lv_url ). CATCH lcx_not_found. RETURN. ENDTRY. li_api = cl_mime_repository_api=>if_mr_api~get_api( ). li_api->delete( EXPORTING i_url = lv_url i_delete_children = abap_true EXCEPTIONS parameter_missing = 1 error_occured = 2 cancelled = 3 permission_failure = 4 not_found = 5 OTHERS = 6 ). IF sy-subrc <> 0. lcx_exception=>raise( 'error from delete' ). ENDIF. ENDMETHOD. "delete METHOD lif_object~jump. lcx_exception=>raise( 'todo, SMIM, jump' ). ENDMETHOD. "jump METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. ENDCLASS. "lcl_object_smim IMPLEMENTATION