diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 181c088b8..b33fa7940 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit LINE-SIZE 100. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.16.3'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.17.0'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -82,6 +82,7 @@ INCLUDE zabapgit_object_iatu. INCLUDE zabapgit_object_msag. INCLUDE zabapgit_object_nrob. INCLUDE zabapgit_object_para. +INCLUDE zabapgit_object_pinf. INCLUDE zabapgit_object_sfbf. INCLUDE zabapgit_object_sfbs. INCLUDE zabapgit_object_sfsw. diff --git a/src/zabapgit_object_pinf.prog.abap b/src/zabapgit_object_pinf.prog.abap new file mode 100644 index 000000000..3ed3be3ab --- /dev/null +++ b/src/zabapgit_object_pinf.prog.abap @@ -0,0 +1,350 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_OBJECT_PINF +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_object_PINF DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_pinf DEFINITION INHERITING FROM lcl_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES lif_object. + + PRIVATE SECTION. + TYPES: BEGIN OF ty_pinf, + attributes TYPE scompidtln, + elements TYPE STANDARD TABLE OF scomeldtln WITH DEFAULT KEY, + END OF ty_pinf. + + TYPES: ty_elements TYPE STANDARD TABLE OF tpak_package_interf_elem_ref WITH DEFAULT KEY. + + METHODS: + create_or_load + IMPORTING is_pinf TYPE ty_pinf + iv_package TYPE devclass + RETURNING VALUE(ri_interface) TYPE REF TO if_package_interface + RAISING lcx_exception, + delete_elements + IMPORTING ii_interface TYPE REF TO if_package_interface + RAISING lcx_exception, + update_attributes + IMPORTING is_pinf TYPE ty_pinf + ii_interface TYPE REF TO if_package_interface + RAISING lcx_exception, + update_elements + IMPORTING is_pinf TYPE ty_pinf + ii_interface TYPE REF TO if_package_interface + RAISING lcx_exception. + +ENDCLASS. "lcl_object_PINF DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_object_PINF IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_object_pinf IMPLEMENTATION. + + METHOD lif_object~changed_by. + + SELECT SINGLE changed_by FROM intf INTO rv_user + WHERE intf_name = ms_item-obj_name. + IF sy-subrc <> 0. + rv_user = c_user_unknown. + ENDIF. + + ENDMETHOD. + + METHOD lif_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. "lif_object~get_metadata + + METHOD lif_object~exists. + + DATA: lv_intf_name TYPE intf-intf_name. + + + SELECT SINGLE intf_name FROM intf INTO lv_intf_name + WHERE intf_name = ms_item-obj_name. + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. "lif_object~exists + + METHOD lif_object~serialize. + + DATA: ls_pinf TYPE ty_pinf, + lv_name TYPE scomifnam, + lt_elements TYPE ty_elements, + li_interface TYPE REF TO if_package_interface. + + FIELD-SYMBOLS: TYPE any, + LIKE LINE OF lt_elements, + LIKE LINE OF ls_pinf-elements. + + + lv_name = ms_item-obj_name. + + cl_package_interface=>load_package_interface( + EXPORTING + i_package_interface_name = lv_name + i_force_reload = abap_true + IMPORTING + e_package_interface = li_interface ). + + li_interface->get_all_attributes( + IMPORTING e_package_interface_data = ls_pinf-attributes ). + + CLEAR: ls_pinf-attributes-pack_name, + ls_pinf-attributes-author, + ls_pinf-attributes-created_by, + ls_pinf-attributes-created_on, + ls_pinf-attributes-changed_by, + ls_pinf-attributes-changed_on, + ls_pinf-attributes-tadir_devc. + +* fields does not exist in older SAP versions + ASSIGN COMPONENT 'SW_COMP_LOGICAL_PACKAGE' OF STRUCTURE ls_pinf-attributes TO . + IF sy-subrc = 0. + CLEAR . + ENDIF. + ASSIGN COMPONENT 'SW_COMP_TADIR_PACKAGE' OF STRUCTURE ls_pinf-attributes TO . + IF sy-subrc = 0. + CLEAR . + ENDIF. + + li_interface->get_elements( IMPORTING e_elements = lt_elements ). + + LOOP AT lt_elements ASSIGNING . + APPEND INITIAL LINE TO ls_pinf-elements ASSIGNING . + ->get_all_attributes( IMPORTING e_element_data = ). + CLEAR -elem_pack. + ENDLOOP. + + io_xml->add( ig_data = ls_pinf + iv_name = 'PINF' ). + + ENDMETHOD. "serialize + + METHOD lif_object~deserialize. + + DATA: li_interface TYPE REF TO if_package_interface, + ls_pinf TYPE ty_pinf. + + + io_xml->read( EXPORTING iv_name = 'PINF' + CHANGING cg_data = ls_pinf ). + + li_interface = create_or_load( + is_pinf = ls_pinf + iv_package = iv_package ). + + update_attributes( + is_pinf = ls_pinf + ii_interface = li_interface ). + + update_elements( + is_pinf = ls_pinf + ii_interface = li_interface ). + + ENDMETHOD. "deserialize + + METHOD update_attributes. + + DATA: ls_sign TYPE scompisign, + lv_changeable TYPE flag. + + + ii_interface->get_changeable( IMPORTING e_changeable = lv_changeable ). + IF lv_changeable = abap_false. +* at creation the object is already in change mode + ii_interface->set_changeable( abap_true ). + ENDIF. + + ls_sign-descript = abap_true. + ls_sign-pinftype = abap_true. + ls_sign-restricted = abap_true. + ls_sign-default_if = abap_true. + ls_sign-def_sever = abap_true. + ls_sign-acl_flag = abap_true. + ls_sign-pifstablty = abap_true. + ls_sign-release_status = abap_true. + + ii_interface->set_all_attributes( + i_package_interface_data = is_pinf-attributes + i_data_sign = ls_sign ). + +* looks like setting "i_suppress_dialog = abap_true" will make +* it fail for local($) packages + ii_interface->save( ). + + ii_interface->set_changeable( abap_false ). + + ENDMETHOD. + + METHOD update_elements. + + DATA: lt_existing TYPE ty_elements, + lt_add TYPE scomeldata, + lv_index TYPE i, + lv_found TYPE abap_bool, + ls_sign TYPE scomelsign, + ls_attr TYPE scomeldtln. + + FIELD-SYMBOLS: LIKE LINE OF lt_existing, + LIKE LINE OF is_pinf-elements. + + + ls_sign-usag_restr = abap_true. + ls_sign-stability = abap_true. + ls_sign-no_check = abap_true. + ls_sign-useastype = abap_true. + ls_sign-asforgnkey = abap_true. +* ls_sign-deprecation_type = abap_true. backport +* ls_sign-replacement_object_type = abap_true. backport +* ls_sign-replacement_object_name = abap_true. backport +* ls_sign-replacement_subobject_type = abap_true. backport +* ls_sign-replacement_subobject_name = abap_true. backport + + ii_interface->set_elements_changeable( abap_true ). + + ii_interface->get_elements( IMPORTING e_elements = lt_existing ). + + LOOP AT is_pinf-elements ASSIGNING . + + lv_found = abap_false. + LOOP AT lt_existing ASSIGNING . + lv_index = sy-tabix. + ->get_all_attributes( IMPORTING e_element_data = ls_attr ). + IF -elem_type = ls_attr-elem_type + AND -elem_key = ls_attr-elem_key. + ->set_all_attributes( + i_element_data = + i_data_sign = ls_sign ). + lv_found = abap_true. + EXIT. " current loop + ENDIF. + ENDLOOP. + + IF lv_found = abap_false. + APPEND TO lt_add. + ENDIF. + ENDLOOP. + + ii_interface->add_elements( lt_add ). + + ii_interface->remove_elements( lt_existing ). + + ii_interface->save_elements( ). + + ii_interface->set_elements_changeable( abap_false ). + + ENDMETHOD. + + METHOD create_or_load. + + IF lif_object~exists( ) = abap_false. + cl_package_interface=>create_new_package_interface( + EXPORTING + i_pkg_interface_name = is_pinf-attributes-intf_name + i_publisher_pkg_name = iv_package + IMPORTING + e_package_interface = ri_interface + EXCEPTIONS + object_already_existing = 1 + object_just_created = 2 + interface_name_invalid = 3 + unexpected_error = 4 + OTHERS = 7 ). + IF sy-subrc <> 0. + _raise 'error creating new package interface'. + ENDIF. + ELSE. + cl_package_interface=>load_package_interface( + EXPORTING + i_package_interface_name = is_pinf-attributes-intf_name + i_force_reload = abap_true + IMPORTING + e_package_interface = ri_interface + EXCEPTIONS + db_read_error = 1 + unexpected_error = 2 + object_not_existing = 3 + shorttext_not_existing = 4 + object_locked_and_modified = 5 + OTHERS = 6 ). + IF sy-subrc <> 0. + _raise 'error loading package interface'. + ENDIF. + ENDIF. + + ENDMETHOD. + + METHOD delete_elements. + + DATA: lt_elements TYPE ty_elements. + + FIELD-SYMBOLS: LIKE LINE OF lt_elements. + + + ii_interface->set_elements_changeable( abap_true ). + + ii_interface->get_elements( IMPORTING e_elements = lt_elements ). + + LOOP AT lt_elements ASSIGNING . + ->delete( ). + ENDLOOP. + + ii_interface->save_elements( ). + + ENDMETHOD. + + METHOD lif_object~delete. + + DATA: lv_name TYPE scomifnam, + li_interface TYPE REF TO if_package_interface. + + + lv_name = ms_item-obj_name. + + cl_package_interface=>load_package_interface( + EXPORTING + i_package_interface_name = lv_name + IMPORTING + e_package_interface = li_interface + EXCEPTIONS + db_read_error = 1 + unexpected_error = 2 + object_not_existing = 3 + shorttext_not_existing = 4 + object_locked_and_modified = 5 + OTHERS = 6 ). + IF sy-subrc <> 0. + _raise 'error loading package interface, delete'. + ENDIF. + +* elements must be deleted before the package interface +* can be deleted + delete_elements( li_interface ). + + li_interface->set_changeable( abap_true ). + + li_interface->delete( ). + + li_interface->save( ). + + ENDMETHOD. "delete + + METHOD lif_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = 'PINF' + in_new_window = abap_true. + + ENDMETHOD. "jump + +ENDCLASS. "lcl_object_PINF IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_object_pinf.prog.xml b/src/zabapgit_object_pinf.prog.xml new file mode 100644 index 000000000..b9cb78ec0 --- /dev/null +++ b/src/zabapgit_object_pinf.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_OBJECT_PINF + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_OBJECT_PINF + 28 + + + + + +