abapGit/src/objects/zcl_abapgit_object_smim.clas.abap
2023-04-20 17:34:03 +02:00

372 lines
9.2 KiB
ABAP

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: <ls_file> 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 <ls_file>
WITH KEY file
COMPONENTS filename = lv_filename.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'SMIM, file not found' ).
ENDIF.
rv_content = <ls_file>-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.