CLASS zcl_abapgit_object_smim DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. PROTECTED SECTION. 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 zcx_abapgit_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 abap_bool RAISING zcx_abapgit_not_found zcx_abapgit_exception. ENDCLASS. CLASS zcl_abapgit_object_smim IMPLEMENTATION. 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. METHOD find_content. DATA: lv_filename TYPE string, lt_files TYPE zif_abapgit_git_definitions=>ty_files_tt. FIELD-SYMBOLS: LIKE LINE OF lt_files. lv_filename = get_filename( iv_url ). lv_filename = build_filename( lv_filename ). lt_files = zif_abapgit_object~mo_files->get_files( ). READ TABLE lt_files ASSIGNING WITH KEY file COMPONENTS filename = lv_filename. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'SMIM, file not found' ). ENDIF. rv_content = -data. ENDMETHOD. 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. 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 zcx_abapgit_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. METHOD zif_abapgit_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. SELECT SINGLE chng_user FROM smimphio 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. ENDIF. ENDMETHOD. METHOD zif_abapgit_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 zcx_abapgit_not_found. " Deleted already (maybe by "folder with children") but record deletion in transport corr_insert( iv_package ). 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. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD zif_abapgit_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 = mv_language 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. zcx_abapgit_exception=>raise_t100( ). 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. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_loio TYPE sdok_docid. lv_loio = ms_item-obj_name. SELECT SINGLE loio_id FROM smimloio INTO lv_loio WHERE loio_id = lv_loio. "#EC CI_GENBUFF rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_object~get_comparator. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_order. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_steps. APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps. ENDMETHOD. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. METHOD zif_abapgit_object~is_active. rv_active = is_active( ). ENDMETHOD. METHOD zif_abapgit_object~is_locked. rv_is_locked = abap_false. ENDMETHOD. METHOD zif_abapgit_object~jump. " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP ENDMETHOD. METHOD zif_abapgit_object~map_filename_to_object. RETURN. ENDMETHOD. METHOD zif_abapgit_object~map_object_to_filename. RETURN. ENDMETHOD. METHOD zif_abapgit_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 zif_abapgit_git_definitions=>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 zcx_abapgit_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. zcx_abapgit_exception=>raise_t100( ). 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. zif_abapgit_object~mo_files->add( ls_file ). SELECT SINGLE lo_class FROM smimloio INTO lv_class WHERE loio_id = lv_loio. "#EC CI_GENBUFF 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. ENDCLASS.