DOMA: Fix domains with custom conversion exit (#5998)

This commit is contained in:
Marc Bernard 2023-01-17 11:18:35 +01:00 committed by GitHub
parent 6f4f336437
commit 1a5199a5e3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -40,6 +40,24 @@ CLASS zcl_abapgit_object_doma DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
!it_dd07v TYPE dd07v_tab
RAISING
zcx_abapgit_exception .
METHODS handle_dependencies
IMPORTING
!iv_step TYPE zif_abapgit_definitions=>ty_deserialization_step
CHANGING
!cv_exit TYPE dd01v-convexit
!cv_done TYPE abap_bool.
METHODS adjust_exit
CHANGING
!cv_exit TYPE dd01v-convexit.
METHODS check_exit
IMPORTING
!iv_exit TYPE dd01v-convexit
RETURNING
VALUE(rv_done) TYPE abap_bool.
ENDCLASS.
@ -47,6 +65,45 @@ ENDCLASS.
CLASS zcl_abapgit_object_doma IMPLEMENTATION.
METHOD adjust_exit.
DATA lv_function TYPE funcname.
IF cv_exit IS NOT INITIAL.
lv_function = |CONVERSION_EXIT_{ cv_exit }_INPUT|.
" If exit function does not exist, remove it
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = lv_function
EXCEPTIONS
function_not_exist = 1
OTHERS = 2.
IF sy-subrc <> 0.
cv_exit = ''.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD check_exit.
DATA lv_exit TYPE dd01v-convexit.
rv_done = abap_true.
IF iv_exit IS NOT INITIAL.
" Check if exit function is set correctly
SELECT SINGLE convexit FROM dd01v INTO lv_exit WHERE domname = ms_item-obj_name.
IF sy-subrc = 0 AND lv_exit <> iv_exit.
rv_done = abap_false.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD deserialize_texts.
DATA: lv_name TYPE ddobjname,
@ -125,6 +182,27 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION.
ENDMETHOD.
METHOD handle_dependencies.
" For domains with dependency on conversion exit function, we use two phases:
" 1) DDIC phase:
" - If function does not exit, remove the exit function
" 2) LATE phase
" - If function was removed, 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 serialize_texts.
DATA: lv_name TYPE ddobjname,
@ -258,10 +336,8 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION.
* package SEDD
* package SDIC
* fm TR_TADIR_INTERFACE
* fm RS_CORR_INSERT ?
DATA: lv_name TYPE ddobjname,
lv_done TYPE abap_bool,
ls_dd01v TYPE dd01v,
lt_dd07v TYPE TABLE OF dd07v.
@ -272,6 +348,17 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION.
io_xml->read( EXPORTING iv_name = 'DD07V_TAB'
CHANGING cg_data = lt_dd07v ).
handle_dependencies(
EXPORTING
iv_step = iv_step
CHANGING
cv_exit = ls_dd01v-convexit
cv_done = lv_done ).
IF lv_done = abap_true.
RETURN.
ENDIF.
corr_insert( iv_package = iv_package
ig_object_class = 'DICT' ).
@ -329,6 +416,7 @@ CLASS zcl_abapgit_object_doma IMPLEMENTATION.
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.