CLASS zcl_abapgit_object_devc DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES: zif_abapgit_object. METHODS constructor IMPORTING !is_item TYPE zif_abapgit_definitions=>ty_item !iv_language TYPE spras !io_files TYPE REF TO zcl_abapgit_objects_files OPTIONAL !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params OPTIONAL RAISING zcx_abapgit_exception. PROTECTED SECTION. PRIVATE SECTION. DATA mv_local_devclass TYPE devclass . METHODS get_package RETURNING VALUE(ri_package) TYPE REF TO if_package RAISING zcx_abapgit_exception . METHODS update_pinf_usages IMPORTING !ii_package TYPE REF TO if_package !it_usage_data TYPE scomppdata RAISING zcx_abapgit_exception . METHODS set_lock IMPORTING !ii_package TYPE REF TO if_package !iv_lock TYPE abap_bool RAISING zcx_abapgit_exception . METHODS unlock_and_raise_error IMPORTING !ii_package TYPE REF TO if_package RAISING zcx_abapgit_exception . METHODS is_empty IMPORTING !iv_package_name TYPE devclass RETURNING VALUE(rv_is_empty) TYPE abap_bool RAISING zcx_abapgit_exception . METHODS load_package IMPORTING !iv_package_name TYPE devclass RETURNING VALUE(ri_package) TYPE REF TO if_package RAISING zcx_abapgit_exception . METHODS is_local IMPORTING !iv_package_name TYPE devclass RETURNING VALUE(rv_is_local) TYPE abap_bool . METHODS remove_obsolete_tadir IMPORTING !iv_package_name TYPE devclass . METHODS adjust_sw_component CHANGING cv_dlvunit TYPE dlvunit. ENDCLASS. CLASS zcl_abapgit_object_devc IMPLEMENTATION. METHOD adjust_sw_component. DATA: lv_namespace TYPE namespace, lv_comp_type TYPE c LENGTH 1. " Keep software component of a package for ABAP add-ons (customer and partner developments)... SELECT SINGLE comp_type FROM cvers INTO lv_comp_type WHERE component = cv_dlvunit. IF sy-subrc = 0 AND lv_comp_type = 'A'. " ... with a matching namespace (typical Add-on Assembly Kit scenario) lv_namespace = |/{ cv_dlvunit }/|. SELECT SINGLE namespace FROM trnspace INTO lv_namespace WHERE namespace = lv_namespace. IF sy-subrc <> 0. CLEAR cv_dlvunit. ENDIF. ELSE. CLEAR cv_dlvunit. ENDIF. ENDMETHOD. METHOD constructor. super->constructor( is_item = is_item iv_language = iv_language io_files = io_files io_i18n_params = io_i18n_params ). IF is_item-devclass IS NOT INITIAL. mv_local_devclass = is_item-devclass. ELSE. mv_local_devclass = is_item-obj_name. ENDIF. ENDMETHOD. METHOD get_package. IF zif_abapgit_object~exists( ) = abap_true. ri_package = load_package( mv_local_devclass ). ENDIF. ENDMETHOD. METHOD is_empty. DATA: lv_object_name TYPE tadir-obj_name, lt_subpackages TYPE zif_abapgit_sap_package=>ty_devclass_tt. lt_subpackages = zcl_abapgit_factory=>get_sap_package( iv_package_name )->list_subpackages( ). IF lines( lt_subpackages ) > 0. rv_is_empty = abap_false. RETURN. ENDIF. " Ignore the SOTR if is linked to the current SAP package (DEVC) SELECT SINGLE obj_name FROM tadir INTO lv_object_name WHERE pgmid = 'R3TR' AND NOT ( ( object = 'DEVC' OR object = 'SOTR' ) AND obj_name = iv_package_name ) AND devclass = iv_package_name. rv_is_empty = boolc( sy-subrc <> 0 ). ENDMETHOD. METHOD is_local. DATA lv_dlvunit TYPE tdevc-dlvunit. SELECT SINGLE dlvunit FROM tdevc INTO lv_dlvunit WHERE devclass = iv_package_name AND intsys <> 'SAP'. IF sy-subrc = 0 AND lv_dlvunit = 'LOCAL'. rv_is_local = abap_true. ENDIF. ENDMETHOD. METHOD load_package. cl_package_factory=>load_package( EXPORTING i_package_name = iv_package_name i_force_reload = abap_true IMPORTING e_package = ri_package EXCEPTIONS object_not_existing = 1 unexpected_error = 2 intern_err = 3 no_access = 4 object_locked_and_modified = 5 OTHERS = 6 ). IF sy-subrc = 1. RETURN. ELSEIF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD remove_obsolete_tadir. DATA: lv_pack TYPE devclass, lt_pack TYPE STANDARD TABLE OF devclass, ls_tadir TYPE zif_abapgit_definitions=>ty_tadir, lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, ls_item TYPE zif_abapgit_definitions=>ty_item. " TADIR entries must remain for transportable packages IF is_local( iv_package_name ) = abap_false. RETURN. ENDIF. " Clean-up sub packages first SELECT devclass FROM tdevc INTO TABLE lt_pack WHERE parentcl = iv_package_name ORDER BY PRIMARY KEY. LOOP AT lt_pack INTO lv_pack. remove_obsolete_tadir( lv_pack ). ENDLOOP. " Remove TADIR entries for objects that do not exist anymore SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE lt_tadir WHERE devclass = iv_package_name ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. LOOP AT lt_tadir INTO ls_tadir. ls_item-obj_type = ls_tadir-object. ls_item-obj_name = ls_tadir-obj_name. IF zcl_abapgit_objects=>exists( ls_item ) = abap_false. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_delete_tadir_entry = abap_true wi_tadir_pgmid = 'R3TR' wi_tadir_object = ls_tadir-object wi_tadir_obj_name = ls_tadir-obj_name wi_test_modus = abap_false EXCEPTIONS OTHERS = 1 ##FM_SUBRC_OK. ENDIF. ENDLOOP. ENDMETHOD. METHOD set_lock. DATA: lv_changeable TYPE abap_bool. ii_package->get_changeable( IMPORTING e_changeable = lv_changeable ). IF lv_changeable <> iv_lock. TRY. CALL METHOD ii_package->('SET_CHANGEABLE') EXPORTING i_changeable = iv_lock i_suppress_dialog = abap_true " Parameter missing in 702 EXCEPTIONS object_locked_by_other_user = 1 permission_failure = 2 object_already_changeable = 3 object_already_unlocked = 4 object_just_created = 5 object_deleted = 6 object_modified = 7 object_not_existing = 8 object_invalid = 9 unexpected_error = 10 OTHERS = 11. CATCH cx_sy_dyn_call_param_not_found. ii_package->set_changeable( EXPORTING i_changeable = iv_lock EXCEPTIONS object_locked_by_other_user = 1 permission_failure = 2 object_already_changeable = 3 object_already_unlocked = 4 object_just_created = 5 object_deleted = 6 object_modified = 7 object_not_existing = 8 object_invalid = 9 unexpected_error = 10 OTHERS = 11 ). ENDTRY. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. TRY. CALL METHOD ii_package->('SET_PERMISSIONS_CHANGEABLE') EXPORTING i_changeable = iv_lock i_suppress_dialog = abap_true " Parameter missing in 702 EXCEPTIONS object_already_changeable = 1 object_already_unlocked = 2 object_locked_by_other_user = 3 object_modified = 4 object_just_created = 5 object_deleted = 6 permission_failure = 7 object_invalid = 8 unexpected_error = 9 OTHERS = 10. CATCH cx_sy_dyn_call_param_not_found. ii_package->set_permissions_changeable( EXPORTING i_changeable = iv_lock EXCEPTIONS object_already_changeable = 1 object_already_unlocked = 2 object_locked_by_other_user = 3 object_modified = 4 object_just_created = 5 object_deleted = 6 permission_failure = 7 object_invalid = 8 unexpected_error = 9 OTHERS = 10 ). ENDTRY. IF ( sy-subrc = 1 AND iv_lock = abap_true ) OR ( sy-subrc = 2 AND iv_lock = abap_false ). " There's no getter to find out beforehand... ELSEIF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD unlock_and_raise_error. DATA ls_msg TYPE bal_s_msg. " Remember message since unlock overwrites it (for example with XT465) MOVE-CORRESPONDING sy TO ls_msg. set_lock( ii_package = ii_package iv_lock = abap_false ). zcx_abapgit_exception=>raise_t100( iv_msgid = ls_msg-msgid iv_msgno = ls_msg-msgno iv_msgv1 = ls_msg-msgv1 iv_msgv2 = ls_msg-msgv2 iv_msgv3 = ls_msg-msgv3 iv_msgv4 = ls_msg-msgv4 ). ENDMETHOD. METHOD update_pinf_usages. DATA: lt_current_permissions TYPE tpak_permission_to_use_list, li_usage TYPE REF TO if_package_permission_to_use, ls_data_sign TYPE scomppsign, ls_add_permission_data TYPE pkgpermdat, lt_handled TYPE SORTED TABLE OF i WITH UNIQUE KEY table_line. FIELD-SYMBOLS: LIKE LINE OF it_usage_data. " Get the current permissions ii_package->get_permissions_to_use( IMPORTING e_permissions = lt_current_permissions EXCEPTIONS object_invalid = 1 unexpected_error = 2 OTHERS = 3 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ls_data_sign-err_sever = abap_true. " New permissions LOOP AT it_usage_data ASSIGNING . READ TABLE lt_current_permissions WITH KEY table_line->package_interface_name = -intf_name INTO li_usage. IF sy-subrc = 0 AND li_usage IS BOUND. INSERT sy-tabix INTO TABLE lt_handled. " Permission already exists, update attributes li_usage->set_all_attributes( EXPORTING i_permission_data = i_data_sign = ls_data_sign EXCEPTIONS object_not_changeable = 1 object_invalid = 2 intern_err = 3 OTHERS = 4 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ELSE. " Permission does not exist yet, add it MOVE-CORRESPONDING TO ls_add_permission_data. ii_package->add_permission_to_use( EXPORTING i_pkg_permission_data = ls_add_permission_data EXCEPTIONS object_not_changeable = 1 object_access_error = 2 object_already_existing = 3 object_invalid = 4 unexpected_error = 5 OTHERS = 6 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. FREE li_usage. ENDLOOP. " Delete missing usages LOOP AT lt_current_permissions INTO li_usage. READ TABLE lt_handled WITH TABLE KEY table_line = sy-tabix TRANSPORTING NO FIELDS. IF sy-subrc = 0. CONTINUE. ENDIF. li_usage->delete( EXCEPTIONS object_not_changeable = 1 object_invalid = 2 * deletion_not_allowed = 3 downport, does not exist in 7.30 intern_err = 4 OTHERS = 5 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDLOOP. ENDMETHOD. METHOD zif_abapgit_object~changed_by. DATA li_package TYPE REF TO if_package. li_package = get_package( ). IF li_package IS BOUND. rv_user = li_package->changed_by. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: li_package TYPE REF TO if_package, lv_package TYPE devclass. " Package deletion is a bit tricky. A package can only be deleted if there are no objects " contained in it. This includes subpackages, so first the leaf packages need to be deleted. " Unfortunately deleted objects that are still contained in an unreleased transport request " also count towards the contained objects counter. " -> Currently we delete only empty packages " " If objects are deleted, the TADIR entry is deleted when the transport request is released. " So before we can delete the package, the transport which deletes the objects " in the package has to be released. lv_package = ms_item-obj_name. " Remove remaining OTR entries zcl_abapgit_sotr_handler=>delete_sotr_package( iv_package ). remove_obsolete_tadir( lv_package ). IF is_empty( lv_package ) = abap_true. li_package = load_package( lv_package ). IF li_package IS NOT BOUND. RETURN. ENDIF. IF lv_package(1) = '$'. zcl_abapgit_persist_packages=>get_instance( )->modify( lv_package ). ENDIF. set_lock( ii_package = li_package iv_lock = abap_true ). TRY. CALL METHOD li_package->('DELETE') EXPORTING i_suppress_dialog = abap_true " Parameter missing in 702 EXCEPTIONS object_not_empty = 1 object_not_changeable = 2 object_invalid = 3 intern_err = 4 OTHERS = 5. CATCH cx_sy_dyn_call_param_not_found. li_package->delete( EXCEPTIONS object_not_empty = 1 object_not_changeable = 2 object_invalid = 3 intern_err = 4 OTHERS = 5 ). ENDTRY. IF sy-subrc <> 0. unlock_and_raise_error( li_package ). ENDIF. TRY. CALL METHOD li_package->('SAVE') EXPORTING i_suppress_dialog = abap_true EXCEPTIONS object_invalid = 1 object_not_changeable = 2 cancelled_in_corr = 3 permission_failure = 4 unexpected_error = 5 intern_err = 6 OTHERS = 7. CATCH cx_sy_dyn_call_param_not_found. li_package->save( EXCEPTIONS object_invalid = 1 object_not_changeable = 2 cancelled_in_corr = 3 permission_failure = 4 unexpected_error = 5 intern_err = 6 OTHERS = 7 ). ENDTRY. IF sy-subrc <> 0. unlock_and_raise_error( li_package ). ENDIF. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: li_package TYPE REF TO if_package, ls_package_data TYPE scompkdtln, ls_data_sign TYPE scompksign, lt_usage_data TYPE scomppdata, ls_save_sign TYPE paksavsign. FIELD-SYMBOLS: TYPE scomppdtln. FIELD-SYMBOLS: TYPE any. mv_local_devclass = iv_package. io_xml->read( EXPORTING iv_name = 'DEVC' CHANGING cg_data = ls_package_data ). IF mv_local_devclass(1) = '$'. IF ls_package_data-mainpack = 'X'. zcx_abapgit_exception=>raise( |Main package { iv_package } cannot be used in local package| ). ELSEIF ls_package_data-mainpack = 'S'. zcx_abapgit_exception=>raise( |Structure package { iv_package } cannot be used in local package| ). ENDIF. ENDIF. li_package = get_package( ). " Swap out repository package name with the local installation package name ls_package_data-devclass = mv_local_devclass. IF li_package IS BOUND. ls_package_data-pdevclass = li_package->transport_layer. ENDIF. " For local packages store application component IF ls_package_data-devclass(1) = '$'. zcl_abapgit_persist_packages=>get_instance( )->modify( iv_package = ls_package_data-devclass iv_component = ls_package_data-component iv_comp_posid = ls_package_data-comp_posid ). ENDIF. " Parent package is not changed. Assume the folder logic already created the package and set " the hierarchy before. CLEAR ls_package_data-parentcl. ASSIGN COMPONENT 'PACKKIND' OF STRUCTURE ls_package_data TO . IF sy-subrc = 0. set_abap_language_version( CHANGING cv_abap_language_version = ). ENDIF. ASSIGN COMPONENT 'PACKKIND' OF STRUCTURE ls_data_sign TO . IF sy-subrc = 0. = abap_true. ENDIF. * Fields not set: * korrflag * parentcl * cli_check * intprefx IF ls_package_data-dlvunit IS NOT INITIAL. ls_data_sign-dlvunit = abap_true. ENDIF. ls_data_sign-ctext = abap_true. ls_data_sign-as4user = abap_true. ls_data_sign-pdevclass = abap_true. ls_data_sign-comp_posid = abap_true. ls_data_sign-component = abap_true. ls_data_sign-perminher = abap_true. ls_data_sign-packtype = abap_true. ls_data_sign-restricted = abap_true. ls_data_sign-mainpack = abap_true. ls_data_sign-srv_check = abap_true. ls_data_sign-ext_alias = abap_true. ls_data_sign-project_guid = abap_true. ls_data_sign-project_id = abap_true. ls_data_sign-project_passdown = abap_true. IF ls_package_data-ctext IS INITIAL. ls_package_data-ctext = mv_local_devclass. ENDIF. IF ls_package_data-dlvunit IS INITIAL. ls_package_data-dlvunit = 'HOME'. ENDIF. ls_package_data-as4user = sy-uname. IF li_package IS BOUND. " Package already exists, change it set_lock( ii_package = li_package iv_lock = abap_true ). li_package->set_all_attributes( EXPORTING i_package_data = ls_package_data i_data_sign = ls_data_sign EXCEPTIONS object_not_changeable = 1 object_deleted = 2 object_invalid = 3 short_text_missing = 4 author_not_existing = 5 local_package = 6 software_component_invalid = 7 layer_invalid = 8 korrflag_invalid = 9 component_not_existing = 10 component_missing = 11 authorize_failure = 12 prefix_in_use = 13 unexpected_error = 14 intern_err = 15 * wrong_mainpack_value = 16 downport, does not exist in 7.30 * superpackage_invalid = 17 downport, does not exist in 7.30 OTHERS = 18 ). IF sy-subrc <> 0. unlock_and_raise_error( li_package ). ENDIF. ELSE. " Package does not exist yet, create it " This shouldn't really happen, because the folder logic initially creates the packages. cl_package_factory=>create_new_package( IMPORTING e_package = li_package CHANGING c_package_data = ls_package_data EXCEPTIONS object_already_existing = 1 object_just_created = 2 not_authorized = 3 wrong_name_prefix = 4 undefined_name = 5 reserved_local_name = 6 invalid_package_name = 7 short_text_missing = 8 software_component_invalid = 9 layer_invalid = 10 author_not_existing = 11 component_not_existing = 12 component_missing = 13 prefix_in_use = 14 unexpected_error = 15 intern_err = 16 no_access = 17 * invalid_translation_depth = 18 downport, does not exist in 7.30 * wrong_mainpack_value = 19 downport, does not exist in 7.30 * superpackage_invalid = 20 downport, does not exist in 7.30 * error_in_cts_checks = 21 downport, does not exist in 7.31 OTHERS = 22 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. " Load package interface usages TRY. io_xml->read( EXPORTING iv_name = 'PERMISSION' CHANGING cg_data = lt_usage_data ). CATCH zcx_abapgit_exception ##NO_HANDLER. " No permissions saved ENDTRY. LOOP AT lt_usage_data ASSIGNING . -client_pak = mv_local_devclass. ENDLOOP. update_pinf_usages( ii_package = li_package it_usage_data = lt_usage_data ). ls_save_sign-pack = abap_true. ls_save_sign-permis = abap_true. ls_save_sign-elems = abap_true. ls_save_sign-interf = abap_true. li_package->save_generic( EXPORTING i_save_sign = ls_save_sign i_transport_request = iv_transport i_suppress_dialog = abap_true EXCEPTIONS cancelled_in_corr = 1 permission_failure = 2 object_not_changeable = 3 object_invalid = 4 OTHERS = 5 ). IF sy-subrc <> 0. unlock_and_raise_error( li_package ). ENDIF. set_lock( ii_package = li_package iv_lock = abap_false ). ENDMETHOD. METHOD zif_abapgit_object~exists. " Check remote package if deserialize has not been called before this IF mv_local_devclass IS INITIAL. rv_bool = abap_false. ELSE. cl_package_helper=>check_package_existence( EXPORTING i_package_name = mv_local_devclass IMPORTING e_package_exists = rv_bool EXCEPTIONS intern_err = 1 OTHERS = 2 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDIF. 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-abap 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 = 'EEUDB' iv_argument = ms_item-obj_name iv_prefix = 'DV' ). ENDMETHOD. METHOD zif_abapgit_object~jump. " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP ENDMETHOD. METHOD zif_abapgit_object~map_filename_to_object. IF iv_filename <> zcl_abapgit_filename_logic=>c_package_file. zcx_abapgit_exception=>raise( |Unexpected filename for package { cs_item-obj_name }| ). ENDIF. " Try to get a unique package name for DEVC by using the path cs_item-obj_name = zcl_abapgit_folder_logic=>get_instance( )->path_to_package( iv_top = iv_package io_dot = io_dot iv_create_if_not_exists = abap_false iv_path = iv_path ). ENDMETHOD. METHOD zif_abapgit_object~map_object_to_filename. " Packages have a fixed filename so that the repository can be installed to a different " package(-hierarchy) on the client and not show up as a different package in the repo. cv_filename = zcl_abapgit_filename_logic=>c_package_file. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: ls_package_data TYPE scompkdtln, ls_package_comp TYPE zcl_abapgit_persist_packages=>ty_package, li_package TYPE REF TO if_package, lt_intf_usages TYPE tpak_permission_to_use_list, lt_usage_data TYPE scomppdata, ls_usage_data TYPE scomppdtln, li_usage TYPE REF TO if_package_permission_to_use. FIELD-SYMBOLS: TYPE any. li_package = get_package( ). IF li_package IS NOT BOUND. zcx_abapgit_exception=>raise( |Could not find package to serialize.| ). ENDIF. li_package->get_all_attributes( IMPORTING e_package_data = ls_package_data EXCEPTIONS object_invalid = 1 package_deleted = 2 intern_err = 3 OTHERS = 4 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. " For local packages get application component IF is_local( ls_package_data-devclass ) = abap_true. ls_package_comp = zcl_abapgit_persist_packages=>get_instance( )->read( ls_package_data-devclass ). ls_package_data-component = ls_package_comp-component. ls_package_data-comp_posid = ls_package_comp-comp_posid. ENDIF. CLEAR: ls_package_data-devclass, ls_package_data-parentcl. " Clear administrative data to prevent diffs CLEAR: ls_package_data-created_by, ls_package_data-created_on, ls_package_data-changed_by, ls_package_data-changed_on, ls_package_data-as4user. " Clear text descriptions that might be localized CLEAR: ls_package_data-comp_text, ls_package_data-dlvu_text, ls_package_data-layer_text. " Clear obsolete fields CLEAR: ls_package_data-intfprefx, ls_package_data-cli_check. " If software component is related to add-on and a valid namespace, then keep it adjust_sw_component( CHANGING cv_dlvunit = ls_package_data-dlvunit ). ASSIGN COMPONENT 'TRANSLATION_DEPTH_TEXT' OF STRUCTURE ls_package_data TO . IF sy-subrc = 0. CLEAR: . ENDIF. ASSIGN COMPONENT 'TRANSLATION_GRAPH_DEPTH_TEXT' OF STRUCTURE ls_package_data TO . IF sy-subrc = 0. CLEAR: . ENDIF. " Clear things related to local installation package CLEAR: ls_package_data-namespace, ls_package_data-dlvunit, ls_package_data-tpclass, ls_package_data-pdevclass. " Not usable on customer systems ASSIGN COMPONENT 'TRANSLATION_DEPTH' OF STRUCTURE ls_package_data TO . IF sy-subrc = 0. CLEAR: . ENDIF. ASSIGN COMPONENT 'TRANSLATION_GRAPH_DEPTH' OF STRUCTURE ls_package_data TO . IF sy-subrc = 0. CLEAR: . ENDIF. CLEAR: ls_package_data-korrflag. ASSIGN COMPONENT 'PACKKIND' OF STRUCTURE ls_package_data TO . IF sy-subrc = 0. clear_abap_language_version( CHANGING cv_abap_language_version = ). ENDIF. io_xml->add( iv_name = 'DEVC' ig_data = ls_package_data ). " Save package interface usages li_package->get_permissions_to_use( IMPORTING e_permissions = lt_intf_usages EXCEPTIONS object_invalid = 1 unexpected_error = 2 OTHERS = 3 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. LOOP AT lt_intf_usages INTO li_usage. li_usage->get_all_attributes( IMPORTING e_permission_data = ls_usage_data EXCEPTIONS object_invalid = 1 intern_err = 2 OTHERS = 3 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. CLEAR: ls_usage_data-pack_name, ls_usage_data-client_pak. APPEND ls_usage_data TO lt_usage_data. ENDLOOP. IF lt_usage_data IS NOT INITIAL. io_xml->add( iv_name = 'PERMISSION' ig_data = lt_usage_data ). ENDIF. ENDMETHOD. ENDCLASS.