CLASS zcl_abapgit_object_doma DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_dd01_text, ddlanguage TYPE dd01v-ddlanguage, ddtext TYPE dd01v-ddtext, END OF ty_dd01_text . TYPES: BEGIN OF ty_dd07_text, valpos TYPE dd07v-valpos, ddlanguage TYPE dd07v-ddlanguage, domvalue_l TYPE dd07v-domvalue_l, domvalue_h TYPE dd07v-domvalue_h, ddtext TYPE dd07v-ddtext, domval_ld TYPE dd07v-domval_ld, domval_hd TYPE dd07v-domval_hd, END OF ty_dd07_text . TYPES: ty_dd01_texts TYPE STANDARD TABLE OF ty_dd01_text . TYPES: ty_dd07_texts TYPE STANDARD TABLE OF ty_dd07_text . " Fields that are not part of dd01v TYPES: BEGIN OF ty_extra, abap_language_version TYPE c LENGTH 1, END OF ty_extra. CONSTANTS c_longtext_id_doma TYPE dokil-id VALUE 'DO' ##NO_TEXT. METHODS serialize_texts IMPORTING !ii_xml TYPE REF TO zif_abapgit_xml_output !it_dd07v TYPE dd07v_tab RAISING zcx_abapgit_exception . METHODS deserialize_texts IMPORTING !ii_xml TYPE REF TO zif_abapgit_xml_input !is_dd01v TYPE dd01v !it_dd07v TYPE dd07v_tab RAISING zcx_abapgit_exception . METHODS handle_dependencies IMPORTING !iv_step TYPE zif_abapgit_objects=>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. 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 IF zcl_abapgit_factory=>get_function_module( )->function_exists( lv_function ) = abap_false. 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, lv_valpos TYPE valpos, ls_dd01v_tmp TYPE dd01v, lt_dd07v_tmp TYPE TABLE OF dd07v, lt_i18n_langs TYPE TABLE OF langu, lt_dd01_texts TYPE ty_dd01_texts, lt_dd07_texts TYPE ty_dd07_texts. FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, LIKE LINE OF it_dd07v, LIKE LINE OF lt_dd01_texts, LIKE LINE OF lt_dd07_texts. lv_name = ms_item-obj_name. ii_xml->read( EXPORTING iv_name = 'I18N_LANGS' CHANGING cg_data = lt_i18n_langs ). ii_xml->read( EXPORTING iv_name = 'DD01_TEXTS' CHANGING cg_data = lt_dd01_texts ). ii_xml->read( EXPORTING iv_name = 'DD07_TEXTS' CHANGING cg_data = lt_dd07_texts ). mo_i18n_params->trim_saplang_list( CHANGING ct_sap_langs = lt_i18n_langs ). SORT lt_i18n_langs. SORT lt_dd07_texts BY ddlanguage. " Optimization LOOP AT lt_i18n_langs ASSIGNING . " Domain description ls_dd01v_tmp = is_dd01v. READ TABLE lt_dd01_texts ASSIGNING WITH KEY ddlanguage = . IF sy-subrc > 0. zcx_abapgit_exception=>raise( |DD01_TEXTS cannot find lang { } in XML| ). ENDIF. MOVE-CORRESPONDING TO ls_dd01v_tmp. " Domain values lt_dd07v_tmp = it_dd07v. LOOP AT lt_dd07v_tmp ASSIGNING . lv_valpos = -valpos. " it_dd07v was potentially renumbered so lookup by value READ TABLE lt_dd07_texts ASSIGNING WITH KEY ddlanguage = domvalue_l = -domvalue_l domvalue_h = -domvalue_h. IF sy-subrc = 0. MOVE-CORRESPONDING TO . -valpos = lv_valpos. DELETE lt_dd07_texts INDEX sy-tabix. " Optimization ELSE. " no translation -> keep entry but clear texts -ddlanguage = . CLEAR: -ddtext, -domval_ld, -domval_hd. ENDIF. ENDLOOP. CALL FUNCTION 'DDIF_DOMA_PUT' EXPORTING name = lv_name dd01v_wa = ls_dd01v_tmp TABLES dd07v_tab = lt_dd07v_tmp EXCEPTIONS doma_not_found = 1 name_inconsistent = 2 doma_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDLOOP. 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, lv_index TYPE i, ls_dd01v TYPE dd01v, lt_dd07v TYPE TABLE OF dd07v, lt_i18n_langs TYPE TABLE OF langu, lt_dd01_texts TYPE ty_dd01_texts, lt_dd07_texts TYPE ty_dd07_texts, lt_language_filter TYPE zif_abapgit_environment=>ty_system_language_filter. FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, LIKE LINE OF lt_dd07v, LIKE LINE OF lt_dd07v, LIKE LINE OF lt_dd01_texts, LIKE LINE OF lt_dd07_texts. IF mo_i18n_params->ms_params-main_language_only = abap_true. RETURN. ENDIF. lv_name = ms_item-obj_name. " Collect additional languages, skip main lang - it was serialized already lt_language_filter = mo_i18n_params->build_language_filter( ). SELECT DISTINCT ddlanguage AS langu INTO TABLE lt_i18n_langs FROM dd01v WHERE domname = lv_name AND ddlanguage IN lt_language_filter AND ddlanguage <> mv_language ORDER BY langu. "#EC CI_SUBRC SELECT DISTINCT ddlanguage AS langu APPENDING TABLE lt_i18n_langs FROM dd07v WHERE domname = lv_name AND ddlanguage IN lt_language_filter AND ddlanguage <> mv_language ORDER BY langu. "#EC CI_SUBRC SORT lt_i18n_langs. DELETE ADJACENT DUPLICATES FROM lt_i18n_langs. LOOP AT lt_i18n_langs ASSIGNING . lv_index = sy-tabix. CALL FUNCTION 'DDIF_DOMA_GET' EXPORTING name = lv_name langu = IMPORTING dd01v_wa = ls_dd01v TABLES dd07v_tab = lt_dd07v EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc <> 0. DELETE lt_i18n_langs INDEX lv_index. " Don't save this lang CONTINUE. ENDIF. IF ls_dd01v-ddlanguage IS INITIAL. ls_dd01v-ddlanguage = . ENDIF. APPEND INITIAL LINE TO lt_dd01_texts ASSIGNING . MOVE-CORRESPONDING ls_dd01v TO . " Process main language entries and find corresponding translation LOOP AT it_dd07v ASSIGNING WHERE NOT ddlanguage IS INITIAL. APPEND INITIAL LINE TO lt_dd07_texts ASSIGNING . READ TABLE lt_dd07v ASSIGNING WITH KEY ddlanguage = domvalue_l = -domvalue_l domvalue_h = -domvalue_h. IF sy-subrc = 0. MOVE-CORRESPONDING TO . ELSE. " no translation -> keep entry but clear texts MOVE-CORRESPONDING TO . -ddlanguage = . CLEAR: -ddtext, -domval_ld, -domval_hd. ENDIF. ENDLOOP. ENDLOOP. SORT lt_i18n_langs ASCENDING. SORT lt_dd01_texts BY ddlanguage ASCENDING. SORT lt_dd07_texts BY valpos ASCENDING ddlanguage ASCENDING. IF lines( lt_i18n_langs ) > 0. ii_xml->add( iv_name = 'I18N_LANGS' ig_data = lt_i18n_langs ). ii_xml->add( iv_name = 'DD01_TEXTS' ig_data = lt_dd01_texts ). ii_xml->add( iv_name = 'DD07_TEXTS' ig_data = lt_dd07_texts ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~changed_by. SELECT SINGLE as4user FROM dd01l INTO rv_user WHERE domname = ms_item-obj_name AND as4local = 'A' AND as4vers = '0000'. 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( iv_objtype = 'D' iv_no_ask_delete_append = abap_true ). delete_longtexts( c_longtext_id_doma ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. * package SEDD * package SDIC DATA: lv_name TYPE ddobjname, lv_done TYPE abap_bool, ls_dd01v TYPE dd01v, ls_extra TYPE ty_extra, lt_dd07v TYPE TABLE OF dd07v. FIELD-SYMBOLS TYPE dd07v. io_xml->read( EXPORTING iv_name = 'DD01V' CHANGING cg_data = ls_dd01v ). 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' ). lv_name = ms_item-obj_name. " type conversion LOOP AT lt_dd07v ASSIGNING . -domname = lv_name. -valpos = sy-tabix. ENDLOOP. CALL FUNCTION 'DDIF_DOMA_PUT' EXPORTING name = lv_name dd01v_wa = ls_dd01v TABLES dd07v_tab = lt_dd07v EXCEPTIONS doma_not_found = 1 name_inconsistent = 2 doma_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. " Fields that are not part of dd01v io_xml->read( EXPORTING iv_name = 'DD01L_EXTRA' CHANGING cg_data = ls_extra ). TRY. set_abap_language_version( CHANGING cv_abap_language_version = ls_extra-abap_language_version ). UPDATE ('DD01L') SET abap_language_version = ls_extra-abap_language_version WHERE domname = lv_name. CATCH cx_sy_dynamic_osql_semantics ##NO_HANDLER. ENDTRY. IF mo_i18n_params->is_lxe_applicable( ) = abap_false. deserialize_texts( ii_xml = io_xml is_dd01v = ls_dd01v it_dd07v = lt_dd07v ). ENDIF. deserialize_longtexts( ii_xml = io_xml iv_longtext_id = c_longtext_id_doma ). zcl_abapgit_objects_activation=>add_item( ms_item ). ENDMETHOD. METHOD zif_abapgit_object~exists. DATA lv_domname TYPE dd01l-domname. SELECT SINGLE domname FROM dd01l INTO lv_domname WHERE domname = 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 = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). 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_dd01v TYPE dd01v, ls_extra TYPE ty_extra, lv_masklen TYPE c LENGTH 4, lt_dd07v TYPE TABLE OF dd07v. FIELD-SYMBOLS TYPE dd07v. lv_name = ms_item-obj_name. CALL FUNCTION 'DDIF_DOMA_GET' EXPORTING name = lv_name state = 'A' langu = mv_language IMPORTING gotstate = lv_state dd01v_wa = ls_dd01v TABLES dd07v_tab = lt_dd07v EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. IF ls_dd01v IS INITIAL OR lv_state <> 'A'. RETURN. ENDIF. CLEAR: ls_dd01v-as4user, ls_dd01v-as4date, ls_dd01v-as4time, ls_dd01v-appexist. * make sure XML serialization does not dump if the field contains invalid data * note that this is a N field, so '' is not valid IF ls_dd01v-authclass = ''. CLEAR ls_dd01v-authclass. ENDIF. lv_masklen = ls_dd01v-masklen. IF lv_masklen = '' OR NOT lv_masklen CO '0123456789'. CLEAR ls_dd01v-masklen. ENDIF. DELETE lt_dd07v WHERE appval = abap_true. SORT lt_dd07v BY valpos ASCENDING ddlanguage ASCENDING. LOOP AT lt_dd07v ASSIGNING . CLEAR -domname. ENDLOOP. io_xml->add( iv_name = 'DD01V' ig_data = ls_dd01v ). io_xml->add( iv_name = 'DD07V_TAB' ig_data = lt_dd07v ). ls_extra-abap_language_version = get_abap_language_version( ). io_xml->add( iv_name = 'DD01L_EXTRA' ig_data = ls_extra ). IF mo_i18n_params->is_lxe_applicable( ) = abap_false. serialize_texts( ii_xml = io_xml it_dd07v = lt_dd07v ). ENDIF. serialize_longtexts( ii_xml = io_xml iv_longtext_id = c_longtext_id_doma ). ENDMETHOD. ENDCLASS.