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

297 lines
6.8 KiB
ABAP

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_definitions=>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.
" If exit function does not exist, replace it with standard SAP function
" which exists in 7.02 and higher
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = cv_exit
EXCEPTIONS
function_not_exist = 1
OTHERS = 2.
IF sy-subrc <> 0.
cv_exit = lc_standard_exit.
ENDIF.
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: <ls_dd32p> 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 <ls_dd32p>.
* clear information inherited from domain
CLEAR: <ls_dd32p>-domname,
<ls_dd32p>-headlen,
<ls_dd32p>-scrlen1,
<ls_dd32p>-scrlen2,
<ls_dd32p>-datatype,
<ls_dd32p>-leng,
<ls_dd32p>-outputlen,
<ls_dd32p>-decimals,
<ls_dd32p>-lowercase,
<ls_dd32p>-signflag,
<ls_dd32p>-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.