diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index 21d37a603..873d73425 100644 --- a/src/zabapgit_object_serializing.prog.abap +++ b/src/zabapgit_object_serializing.prog.abap @@ -42,6 +42,7 @@ INCLUDE zabapgit_object_sfpi. INCLUDE zabapgit_object_sfsw. INCLUDE zabapgit_object_shi3. INCLUDE zabapgit_object_shlp. +INCLUDE zabapgit_object_shma. INCLUDE zabapgit_object_sicf. INCLUDE zabapgit_object_smim. INCLUDE zabapgit_object_splo. diff --git a/src/zabapgit_object_shma.prog.abap b/src/zabapgit_object_shma.prog.abap new file mode 100644 index 000000000..a35a90b4c --- /dev/null +++ b/src/zabapgit_object_shma.prog.abap @@ -0,0 +1,273 @@ +*&---------------------------------------------------------------------* +*& Include zabapgit_object_shma +*&---------------------------------------------------------------------* + +CLASS lcl_object_shma DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + +ENDCLASS. + +CLASS lcl_object_shma IMPLEMENTATION. + + METHOD lif_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + + METHOD lif_object~changed_by. + + rv_user = c_user_unknown. + + ENDMETHOD. + + METHOD lif_object~get_metadata. + + rs_metadata = get_metadata( ). + + ENDMETHOD. + + METHOD lif_object~exists. + + DATA: lv_area_name TYPE shm_area_name. + + SELECT SINGLE area_name + FROM shma_attributes + INTO lv_area_name + WHERE area_name = ms_item-obj_name. + + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + METHOD lif_object~serialize. + + DATA: lv_area_name TYPE shm_area_name, + ls_area_attributes TYPE shma_attributes. + + lv_area_name = ms_item-obj_name. + + TRY. + CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('READ_AREA_ATTRIBUTES_ALL') + EXPORTING + area_name = lv_area_name + IMPORTING + area_attributes = ls_area_attributes. + + CLEAR: ls_area_attributes-chg_user, + ls_area_attributes-chg_date, + ls_area_attributes-chg_time, + ls_area_attributes-cls_gen_user , + ls_area_attributes-cls_gen_date , + ls_area_attributes-cls_gen_time. + + io_xml->add( iv_name = 'AREA_ATTRIBUTES' + ig_data = ls_area_attributes ). + + CATCH cx_root. + lcx_exception=>raise( |Error serializing SHMA { ms_item-obj_name }| ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~deserialize. + + DATA: lv_area_name TYPE shm_area_name, + ls_area_attributes TYPE shma_attributes. + + lv_area_name = ms_item-obj_name. + + io_xml->read( + EXPORTING + iv_name = 'AREA_ATTRIBUTES' + CHANGING + cg_data = ls_area_attributes ). + + TRY. + CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('INSERT_AREA') + EXPORTING + area_name = lv_area_name + attributes = ls_area_attributes + force_overwrite = abap_true + no_class_generation = abap_true + silent_mode = abap_true. + + CATCH cx_root. + lcx_exception=>raise( |Error serializing SHMA { ms_item-obj_name }| ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~delete. + + " We can't use FM SHMA_DELETE_AREA because it depends + " on the corresponding class, but in abapGit it has its own + " lifecycle. Therefore we have to reimplement most of the + " FMs logic + + CONSTANTS: lc_request_delete TYPE i VALUE '4'. + + DATA: lv_request TYPE i, + lv_area_name TYPE shm_area_name, + lv_order TYPE e070-trkorr, + lv_korrnum TYPE tadir-korrnum, + lv_objname TYPE tadir-obj_name, + lv_task TYPE e070-trkorr, + lv_append TYPE abap_bool, + ls_tadir TYPE tadir, + ls_tdevc TYPE tdevc, + lo_cts_if TYPE REF TO object. + + lv_area_name = ms_item-obj_name. + + TRY. + CALL FUNCTION 'ENQUEUE_E_SHM_AREA' + EXPORTING + mode_shma_attributes = 'E' + area_name = lv_area_name + x_area_name = ' ' + _scope = '2' + _wait = ' ' + _collect = ' ' + EXCEPTIONS + foreign_lock = 1 + system_failure = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ). + ENDIF. + + CALL METHOD ('\PROGRAM=SAPMSHM_MONITOR\CLASS=LCL_SHMM')=>('FREE_AREA_BY_NAME') + EXPORTING + area_name = lv_area_name + affect_server = cl_shm_area=>affect_all_servers. + + CREATE OBJECT lo_cts_if TYPE ('\FUNCTION-POOL=SHMA\CLASS=LCL_CTS_INTERFACE') + EXPORTING + area = lv_area_name. + + CALL METHOD lo_cts_if->('CHECK_AREA') + EXPORTING + request = lc_request_delete + IMPORTING + access_mode = lv_request + appendable = lv_append. + + IF lv_request <> lc_request_delete. + lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ). + ENDIF. + + CALL METHOD lo_cts_if->('INSERT_AREA') + EXPORTING + request = lc_request_delete + IMPORTING + order = lv_order + task = lv_task. + + DELETE FROM shma_attributes WHERE area_name = lv_area_name. + DELETE FROM shma_start WHERE area_name = lv_area_name. + + lv_korrnum = lv_order. + lv_objname = lv_area_name. + + CALL FUNCTION 'TR_TADIR_INTERFACE' + EXPORTING + wi_read_only = abap_true + wi_tadir_pgmid = 'R3TR' + wi_tadir_object = 'SHMA' + wi_tadir_obj_name = lv_objname + IMPORTING + new_tadir_entry = ls_tadir + EXCEPTIONS + OTHERS = 0. + + CALL FUNCTION 'TR_DEVCLASS_GET' + EXPORTING + iv_devclass = ls_tadir-devclass + IMPORTING + es_tdevc = ls_tdevc + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc = 0 AND ls_tdevc-korrflag IS INITIAL. + + " TADIR entries for local objects must be deleted 'by hand' + + CALL FUNCTION 'TR_TADIR_INTERFACE' + EXPORTING + wi_test_modus = abap_false + wi_delete_tadir_entry = abap_true + wi_tadir_pgmid = 'R3TR' + wi_tadir_object = 'SHMA' + wi_tadir_obj_name = lv_objname + wi_tadir_korrnum = lv_korrnum + EXCEPTIONS + OTHERS = 0. + + ENDIF. + + CALL METHOD ('\PROGRAM=SAPLSHMA\CLASS=LCL_SHMA_HELPER')=>('DELETE_RUNTIME_SETTINGS') + EXPORTING + area_name = lv_area_name. + + CALL FUNCTION 'DEQUEUE_E_SHM_AREA' + EXPORTING + mode_shma_attributes = 'E' + area_name = lv_area_name + x_area_name = ' ' + _scope = '3' + _synchron = ' ' + _collect = ' '. + + CATCH cx_root. + lcx_exception=>raise( |Error deleting SHMA { ms_item-obj_name }| ). + ENDTRY. + + ENDMETHOD. + + METHOD lif_object~jump. + + DATA: ls_bcdata TYPE bdcdata, + lt_bcdata TYPE STANDARD TABLE OF bdcdata. + + ls_bcdata-program = 'SAPLSHMA'. + ls_bcdata-dynpro = '0100'. + ls_bcdata-dynbegin = 'X'. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'SHMA_ATTRIBUTES-AREA_NAME'. + ls_bcdata-fval = ms_item-obj_name. + APPEND ls_bcdata TO lt_bcdata. + + CLEAR ls_bcdata. + ls_bcdata-fnam = 'BDC_OKCODE'. + ls_bcdata-fval = '=SHOW'. + APPEND ls_bcdata TO lt_bcdata. + + CALL FUNCTION 'ABAP4_CALL_TRANSACTION' + STARTING NEW TASK 'GIT' + EXPORTING + tcode = 'SHMA' + mode_val = 'E' + TABLES + using_tab = lt_bcdata + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, SHMA' ). + ENDIF. + + ENDMETHOD. + + METHOD lif_object~compare_to_remote_version. + + CREATE OBJECT ro_comparison_result TYPE lcl_comparison_null. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/zabapgit_object_shma.prog.xml b/src/zabapgit_object_shma.prog.xml new file mode 100644 index 000000000..aa960866e --- /dev/null +++ b/src/zabapgit_object_shma.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_OBJECT_SHMA + A + X + S + D$ + I + X + D$S + X + + + + R + ZABAPGIT_OBJECT_SHMA + 20 + + + + +