CLASS zcl_abapgit_object_shlp DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. PROTECTED SECTION. PRIVATE SECTION. METHODS handle_dependencies IMPORTING !iv_step TYPE zif_abapgit_objects=>ty_deserialization_step CHANGING !cv_exit TYPE dd30v-selmexit !cv_done TYPE abap_bool. METHODS adjust_exit CHANGING !cv_exit TYPE dd30v-selmexit. METHODS check_exit IMPORTING !iv_exit TYPE dd30v-selmexit RETURNING VALUE(rv_done) TYPE abap_bool. ENDCLASS. CLASS zcl_abapgit_object_shlp IMPLEMENTATION. METHOD adjust_exit. CONSTANTS lc_standard_exit TYPE dd30v-selmexit VALUE 'RS_DD_SELMEXIT'. IF cv_exit IS NOT INITIAL AND zcl_abapgit_factory=>get_function_module( )->function_exists( cv_exit ) = abap_false. " If exit function does not exist, replace it with standard SAP function " which exists in 7.02 and higher cv_exit = lc_standard_exit. ENDIF. ENDMETHOD. METHOD check_exit. DATA lv_exit TYPE dd30v-selmexit. rv_done = abap_true. IF iv_exit IS NOT INITIAL. " Check if exit function is set correctly SELECT SINGLE selmexit FROM dd30v INTO lv_exit WHERE shlpname = ms_item-obj_name. IF sy-subrc = 0 AND lv_exit <> iv_exit. rv_done = abap_false. ENDIF. ENDIF. ENDMETHOD. METHOD handle_dependencies. " For search helps with dependency on exit function, we use two phases: " 1) DDIC phase: " - If function does not exit, replace it with a standard SAP function " 2) LATE phase " - If function was replaced, change it to the correct exit function CASE iv_step. WHEN zif_abapgit_object=>gc_step_id-ddic. adjust_exit( CHANGING cv_exit = cv_exit ). WHEN zif_abapgit_object=>gc_step_id-late. cv_done = check_exit( cv_exit ). WHEN OTHERS. ASSERT 0 = 1. ENDCASE. ENDMETHOD. METHOD zif_abapgit_object~changed_by. SELECT SINGLE as4user FROM dd30l INTO rv_user WHERE shlpname = ms_item-obj_name AND as4local = 'A'. "#EC CI_GENBUFF IF sy-subrc <> 0. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. IF zif_abapgit_object~exists( ) = abap_false. RETURN. ENDIF. delete_ddic( 'H' ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: lv_name TYPE ddobjname, lv_done TYPE abap_bool, ls_dd30v TYPE dd30v, lt_dd31v TYPE TABLE OF dd31v, lt_dd32p TYPE TABLE OF dd32p, lt_dd33v TYPE TABLE OF dd33v. io_xml->read( EXPORTING iv_name = 'DD30V' CHANGING cg_data = ls_dd30v ). handle_dependencies( EXPORTING iv_step = iv_step CHANGING cv_exit = ls_dd30v-selmexit cv_done = lv_done ). IF lv_done = abap_true. RETURN. ENDIF. io_xml->read( EXPORTING iv_name = 'DD31V_TABLE' CHANGING cg_data = lt_dd31v ). io_xml->read( EXPORTING iv_name = 'DD32P_TABLE' CHANGING cg_data = lt_dd32p ). io_xml->read( EXPORTING iv_name = 'DD33V_TABLE' CHANGING cg_data = lt_dd33v ). corr_insert( iv_package = iv_package ig_object_class = 'DICT' ). lv_name = ms_item-obj_name. CALL FUNCTION 'DDIF_SHLP_PUT' EXPORTING name = lv_name dd30v_wa = ls_dd30v TABLES dd31v_tab = lt_dd31v dd32p_tab = lt_dd32p dd33v_tab = lt_dd33v EXCEPTIONS shlp_not_found = 1 name_inconsistent = 2 shlp_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. zcl_abapgit_objects_activation=>add_item( ms_item ). ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_shlpname TYPE dd30l-shlpname. SELECT SINGLE shlpname FROM dd30l INTO lv_shlpname WHERE shlpname = ms_item-obj_name. 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-ddic TO rt_steps. APPEND zif_abapgit_object=>gc_step_id-late 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_OBJECT=>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_name TYPE ddobjname, lv_state TYPE ddgotstate, ls_dd30v TYPE dd30v, lt_dd31v TYPE TABLE OF dd31v, lt_dd32p TYPE TABLE OF dd32p, lt_dd33v TYPE TABLE OF dd33v. FIELD-SYMBOLS: LIKE LINE OF lt_dd32p. lv_name = ms_item-obj_name. CALL FUNCTION 'DDIF_SHLP_GET' EXPORTING name = lv_name state = 'A' langu = mv_language IMPORTING gotstate = lv_state dd30v_wa = ls_dd30v TABLES dd31v_tab = lt_dd31v dd32p_tab = lt_dd32p dd33v_tab = lt_dd33v EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. IF ls_dd30v IS INITIAL OR lv_state <> 'A'. RETURN. ENDIF. CLEAR: ls_dd30v-as4user, ls_dd30v-as4date, ls_dd30v-as4time. LOOP AT lt_dd32p ASSIGNING . * clear information inherited from domain CLEAR: -domname, -headlen, -scrlen1, -scrlen2, -datatype, -leng, -outputlen, -decimals, -lowercase, -signflag, -convexit. ENDLOOP. io_xml->add( iv_name = 'DD30V' ig_data = ls_dd30v ). io_xml->add( ig_data = lt_dd31v iv_name = 'DD31V_TABLE' ). io_xml->add( ig_data = lt_dd32p iv_name = 'DD32P_TABLE' ). io_xml->add( ig_data = lt_dd33v iv_name = 'DD33V_TABLE' ). ENDMETHOD. ENDCLASS.