*&---------------------------------------------------------------------* *& Include ZABAPGIT_SAP_PACKAGE *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_package DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_sap_package DEFINITION FINAL CREATE PRIVATE. PUBLIC SECTION. TYPES: ty_devclass_tt TYPE STANDARD TABLE OF devclass WITH DEFAULT KEY. CLASS-METHODS: get IMPORTING iv_package TYPE devclass RETURNING VALUE(ro_package) TYPE REF TO lcl_sap_package, create IMPORTING is_package TYPE scompkdtln RETURNING VALUE(ri_package) TYPE REF TO if_package RAISING lcx_exception, create_local IMPORTING iv_package TYPE devclass RAISING lcx_exception. METHODS: constructor IMPORTING iv_package TYPE devclass. METHODS: list_subpackages RETURNING VALUE(rt_list) TYPE ty_devclass_tt, list_superpackages RETURNING VALUE(rt_list) TYPE ty_devclass_tt, * todo, read parent? create_child IMPORTING iv_child TYPE devclass RAISING lcx_exception, * todo, exception instead? exists RETURNING VALUE(rv_bool) TYPE abap_bool. PRIVATE SECTION. DATA: mv_package TYPE devclass. ENDCLASS. "lcl_package DEFINITION *----------------------------------------------------------------------* * CLASS lcl_package IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_sap_package IMPLEMENTATION. METHOD get. CREATE OBJECT ro_package TYPE lcl_sap_package EXPORTING iv_package = iv_package. ENDMETHOD. METHOD constructor. mv_package = iv_package. ENDMETHOD. METHOD exists. cl_package_factory=>load_package( EXPORTING i_package_name = mv_package EXCEPTIONS object_not_existing = 1 unexpected_error = 2 intern_err = 3 no_access = 4 object_locked_and_modified = 5 ). rv_bool = boolc( sy-subrc <> 1 ). ENDMETHOD. METHOD create_child. DATA: li_parent TYPE REF TO if_package, ls_child TYPE scompkdtln. cl_package_factory=>load_package( EXPORTING i_package_name = mv_package IMPORTING e_package = li_parent EXCEPTIONS object_not_existing = 1 unexpected_error = 2 intern_err = 3 no_access = 4 object_locked_and_modified = 5 ). IF sy-subrc <> 0. lcx_exception=>raise( 'error reading parent package' ). ENDIF. ls_child-devclass = iv_child. ls_child-dlvunit = li_parent->software_component. ls_child-ctext = iv_child. ls_child-parentcl = mv_package. ls_child-pdevclass = li_parent->transport_layer. ls_child-as4user = sy-uname. create( ls_child ). ENDMETHOD. METHOD create. DATA: lv_err TYPE string, ls_package LIKE is_package. ASSERT NOT is_package-devclass IS INITIAL. cl_package_factory=>load_package( EXPORTING i_package_name = is_package-devclass EXCEPTIONS object_not_existing = 1 unexpected_error = 2 intern_err = 3 no_access = 4 object_locked_and_modified = 5 ). IF sy-subrc = 0. RETURN. "Package already exists. We assume this is fine ENDIF. ls_package = is_package. " Set software component to 'HOME' if none is set at this point. " Otherwise SOFTWARE_COMPONENT_INVALID will be raised. IF ls_package-dlvunit IS INITIAL. ls_package-dlvunit = 'HOME'. ENDIF. cl_package_factory=>create_new_package( EXPORTING i_reuse_deleted_object = abap_true * i_suppress_dialog = abap_true " does not exist in 730 IMPORTING e_package = ri_package CHANGING c_package_data = ls_package 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 * wrong_mainpack_value = 19 * superpackage_invalid = 20 * error_in_cts_checks = 21 OTHERS = 18 ). IF sy-subrc <> 0. lcx_exception=>raise( |Package { is_package-devclass } could not be created| ). ENDIF. ri_package->save( * EXPORTING * i_suppress_dialog = abap_true " Controls whether popups can be transmitted EXCEPTIONS object_invalid = 1 object_not_changeable = 2 cancelled_in_corr = 3 permission_failure = 4 unexpected_error = 5 intern_err = 6 OTHERS = 7 ). IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_err. lcx_exception=>raise( lv_err ). ENDIF. ri_package->set_changeable( abap_false ). ENDMETHOD. METHOD list_superpackages. DATA: lt_list LIKE rt_list, lv_parent TYPE tdevc-parentcl, lv_devclass LIKE LINE OF rt_list. APPEND mv_package TO rt_list. SELECT SINGLE parentcl INTO lv_parent FROM tdevc WHERE devclass = mv_package. "#EC CI_GENBUFF IF NOT lv_parent IS INITIAL. APPEND lv_parent TO rt_list. lt_list = get( lv_devclass )->list_superpackages( ). APPEND LINES OF lt_list TO rt_list. ENDIF. ENDMETHOD. METHOD list_subpackages. DATA: lt_list LIKE rt_list, lv_devclass LIKE LINE OF rt_list. SELECT devclass INTO TABLE rt_list FROM tdevc WHERE parentcl = mv_package. "#EC CI_GENBUFF * note the recursion, since packages are added to the list LOOP AT rt_list INTO lv_devclass. lt_list = get( lv_devclass )->list_subpackages( ). APPEND LINES OF lt_list TO rt_list. ENDLOOP. ENDMETHOD. METHOD create_local. DATA: ls_package TYPE scompkdtln. ls_package-devclass = iv_package. ls_package-ctext = iv_package. ls_package-parentcl = '$TMP'. ls_package-dlvunit = 'LOCAL'. ls_package-as4user = sy-uname. create( ls_package ). ENDMETHOD. "create ENDCLASS. "lcl_package IMPLEMENTATION