CLASS zcl_abapgit_object_sicf DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_object . TYPES: ty_hash TYPE c LENGTH 25. CLASS-METHODS read_tadir_sicf IMPORTING !iv_pgmid TYPE tadir-pgmid DEFAULT 'R3TR' !iv_obj_name TYPE tadir-obj_name RETURNING VALUE(rs_tadir) TYPE zif_abapgit_definitions=>ty_tadir RAISING zcx_abapgit_exception . CLASS-METHODS read_sicf_url IMPORTING !iv_obj_name TYPE tadir-obj_name RETURNING VALUE(rv_hash) TYPE ty_hash RAISING zcx_abapgit_exception . PROTECTED SECTION. PRIVATE SECTION. TYPES: ty_icfhandler_tt TYPE STANDARD TABLE OF icfhandler WITH DEFAULT KEY . TYPES: BEGIN OF ty_sicf_key, icf_name TYPE icfservice-icf_name, icfparguid TYPE icfservice-icfparguid, END OF ty_sicf_key . METHODS read IMPORTING !iv_clear TYPE abap_bool DEFAULT abap_true EXPORTING !es_icfservice TYPE icfservice !es_icfdocu TYPE icfdocu !et_icfhandler TYPE ty_icfhandler_tt !ev_url TYPE string RAISING zcx_abapgit_exception . METHODS insert_sicf IMPORTING !is_icfservice TYPE icfservice !is_icfdocu TYPE icfdocu !it_icfhandler TYPE ty_icfhandler_tt !iv_package TYPE devclass !iv_url TYPE string RAISING zcx_abapgit_exception . METHODS change_sicf IMPORTING !is_icfservice TYPE icfservice !is_icfdocu TYPE icfdocu !it_icfhandler TYPE ty_icfhandler_tt !iv_package TYPE devclass !iv_parent TYPE icfparguid RAISING zcx_abapgit_exception . METHODS to_icfhndlist IMPORTING !it_list TYPE ty_icfhandler_tt RETURNING VALUE(rt_list) TYPE icfhndlist . METHODS find_parent IMPORTING !iv_url TYPE string RETURNING VALUE(rv_parent) TYPE icfparguid RAISING zcx_abapgit_exception . ENDCLASS. CLASS zcl_abapgit_object_sicf IMPLEMENTATION. METHOD change_sicf. DATA: lt_icfhndlist TYPE icfhndlist, lt_existing TYPE TABLE OF icfhandler, ls_icfserdesc TYPE icfserdesc. FIELD-SYMBOLS: LIKE LINE OF lt_existing. lt_icfhndlist = to_icfhndlist( it_icfhandler ). * Do not add handlers if they already exist, it will make the below * call to SAP standard code raise an exception SELECT * FROM icfhandler INTO TABLE lt_existing WHERE icf_name = is_icfservice-icf_name. LOOP AT lt_existing ASSIGNING . DELETE TABLE lt_icfhndlist FROM -icfhandler. ENDLOOP. MOVE-CORRESPONDING is_icfservice TO ls_icfserdesc. cl_icf_tree=>if_icf_tree~change_node( EXPORTING icf_name = is_icfservice-orig_name icfparguid = iv_parent icfdocu = is_icfdocu doculang = mv_language icfhandlst = lt_icfhndlist package = iv_package application = space icfserdesc = ls_icfserdesc icfactive = abap_true EXCEPTIONS empty_icf_name = 1 no_new_virtual_host = 2 special_service_error = 3 parent_not_existing = 4 enqueue_error = 5 node_already_existing = 6 empty_docu = 7 doculang_not_installed = 8 security_info_error = 9 user_password_error = 10 password_encryption_error = 11 invalid_url = 12 invalid_otr_concept = 13 formflg401_error = 14 handler_error = 15 transport_error = 16 tadir_error = 17 package_not_found = 18 wrong_application = 19 not_allow_application = 20 no_application = 21 invalid_icfparguid = 22 alt_name_invalid = 23 alternate_name_exist = 24 wrong_icf_name = 25 no_authority = 26 OTHERS = 27 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD find_parent. cl_icf_tree=>if_icf_tree~service_from_url( EXPORTING url = iv_url hostnumber = 0 IMPORTING icfnodguid = rv_parent EXCEPTIONS wrong_application = 1 no_application = 2 not_allow_application = 3 wrong_url = 4 no_authority = 5 OTHERS = 6 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD insert_sicf. DATA: lt_icfhndlist TYPE icfhndlist, ls_icfserdesc TYPE icfserdesc, ls_icfdocu TYPE icfdocu, lv_parent TYPE icfparguid. lt_icfhndlist = to_icfhndlist( it_icfhandler ). lv_parent = find_parent( iv_url ). * nice, it seems that the structure should be mistreated ls_icfdocu = is_icfdocu-icf_docu. MOVE-CORRESPONDING is_icfservice TO ls_icfserdesc. cl_icf_tree=>if_icf_tree~insert_node( EXPORTING icf_name = is_icfservice-orig_name icfparguid = lv_parent icfdocu = ls_icfdocu doculang = mv_language icfhandlst = lt_icfhndlist package = iv_package application = space icfserdesc = ls_icfserdesc icfactive = abap_true icfaltnme = is_icfservice-icfaltnme EXCEPTIONS empty_icf_name = 1 no_new_virtual_host = 2 special_service_error = 3 parent_not_existing = 4 enqueue_error = 5 node_already_existing = 6 empty_docu = 7 doculang_not_installed = 8 security_info_error = 9 user_password_error = 10 password_encryption_error = 11 invalid_url = 12 invalid_otr_concept = 13 formflg401_error = 14 handler_error = 15 transport_error = 16 tadir_error = 17 package_not_found = 18 wrong_application = 19 not_allow_application = 20 no_application = 21 invalid_icfparguid = 22 alt_name_invalid = 23 alternate_name_exist = 24 wrong_icf_name = 25 no_authority = 26 OTHERS = 27 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD read. DATA: lt_serv_info TYPE icfservtbl, ls_serv_info LIKE LINE OF lt_serv_info, ls_key TYPE ty_sicf_key. FIELD-SYMBOLS: LIKE LINE OF et_icfhandler. CLEAR es_icfservice. CLEAR es_icfdocu. CLEAR et_icfhandler. CLEAR ev_url. ls_key = read_tadir_sicf( ms_item-obj_name )-obj_name. cl_icf_tree=>if_icf_tree~get_info_from_serv( EXPORTING icf_name = ls_key-icf_name icfparguid = ls_key-icfparguid icf_langu = mv_language IMPORTING serv_info = lt_serv_info icfdocu = es_icfdocu url = ev_url EXCEPTIONS wrong_name = 1 wrong_parguid = 2 incorrect_service = 3 no_authority = 4 OTHERS = 5 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ASSERT lines( lt_serv_info ) = 1. READ TABLE lt_serv_info INDEX 1 INTO ls_serv_info. ASSERT sy-subrc = 0. MOVE-CORRESPONDING ls_serv_info-service TO es_icfservice. IF iv_clear = abap_true. CLEAR es_icfservice-icf_cuser. CLEAR es_icfservice-icf_cdate. CLEAR es_icfservice-icf_muser. CLEAR es_icfservice-icf_mdate. ENDIF. CLEAR es_icfdocu-icfparguid. APPEND LINES OF ls_serv_info-handlertbl TO et_icfhandler. LOOP AT et_icfhandler ASSIGNING . CLEAR -icfparguid. ENDLOOP. ENDMETHOD. METHOD read_sicf_url. * note: this method is called dynamically from some places DATA: lv_name TYPE icfservice-icf_name, lv_url TYPE icfurlbuf, lv_string TYPE string, lv_icfnodguid TYPE icfservice-icfnodguid, lv_parguid TYPE icfservice-icfparguid. lv_name = iv_obj_name. lv_parguid = iv_obj_name+15. SELECT SINGLE icfnodguid FROM icfservice INTO lv_icfnodguid WHERE icf_name = lv_name AND icfparguid = lv_parguid. CALL FUNCTION 'HTTP_GET_URL_FROM_NODGUID' EXPORTING nodguid = lv_icfnodguid IMPORTING url = lv_url EXCEPTIONS icf_inconst = 1 OTHERS = 2. IF sy-subrc = 0. lv_string = lv_url. rv_hash = zcl_abapgit_hash=>sha1_raw( zcl_abapgit_convert=>string_to_xstring_utf8( lv_string ) ). rv_hash = to_upper( rv_hash ). ENDIF. ENDMETHOD. METHOD read_tadir_sicf. * note: this method is called dynamically from some places DATA: lt_tadir TYPE zif_abapgit_definitions=>ty_tadir_tt, lv_hash TYPE ty_hash, lv_obj_name TYPE tadir-obj_name. FIELD-SYMBOLS: LIKE LINE OF lt_tadir. lv_hash = iv_obj_name+15. CONCATENATE iv_obj_name(15) '%' INTO lv_obj_name. SELECT * FROM tadir INTO CORRESPONDING FIELDS OF TABLE lt_tadir WHERE pgmid = iv_pgmid AND object = 'SICF' AND obj_name LIKE lv_obj_name ORDER BY PRIMARY KEY ##TOO_MANY_ITAB_FIELDS. "#EC CI_GENBUFF LOOP AT lt_tadir ASSIGNING . IF read_sicf_url( -obj_name ) = to_upper( lv_hash ). rs_tadir = . RETURN. ENDIF. ENDLOOP. ENDMETHOD. METHOD to_icfhndlist. FIELD-SYMBOLS: LIKE LINE OF it_list. * convert to sorted table LOOP AT it_list ASSIGNING . INSERT -icfhandler INTO TABLE rt_list. ENDLOOP. ENDMETHOD. METHOD zif_abapgit_object~changed_by. DATA: ls_icfservice TYPE icfservice. read( EXPORTING iv_clear = abap_false IMPORTING es_icfservice = ls_icfservice ). rv_user = ls_icfservice-icf_muser. IF rv_user IS INITIAL. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA ls_icfservice TYPE icfservice. read( IMPORTING es_icfservice = ls_icfservice ). IF ls_icfservice IS INITIAL. " It seems that the ICF service doesn't exist anymore. " But that's ok, because some objects like SAPC manage " the lifecycle of its ICF service by itself and already " deleted the service. RETURN. ENDIF. IF ls_icfservice-icfparguid CO '0'. " not supported by the SAP standard API zcx_abapgit_exception=>raise( 'SICF - cannot delete root node, delete node manually' ). ENDIF. " Delete Application Customizing Data the hard way, as it isn't done by the API. " If we wouldn't we would get errors from the API if entrys exist. " Transaction SICF does the same. DELETE FROM icfapplcust WHERE icf_name = ls_icfservice-icf_name AND icfparguid = ls_icfservice-icfparguid. cl_icf_tree=>if_icf_tree~delete_node( EXPORTING icfparguid = ls_icfservice-icfparguid CHANGING icf_name = ls_icfservice-icf_name EXCEPTIONS no_virtual_host_delete = 1 special_service_error = 2 enqueue_error = 3 node_not_existing = 4 node_has_childs = 5 node_is_aliased = 6 node_not_in_original_system = 7 transport_error = 8 tadir_error = 9 db_error = 10 no_authority = 11 OTHERS = 12 ). IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: ls_icfservice TYPE icfservice, ls_read TYPE icfservice, ls_icfdocu TYPE icfdocu, lv_url TYPE string, lv_exists TYPE abap_bool, lt_icfhandler TYPE TABLE OF icfhandler. io_xml->read( EXPORTING iv_name = 'URL' CHANGING cg_data = lv_url ). io_xml->read( EXPORTING iv_name = 'ICFSERVICE' CHANGING cg_data = ls_icfservice ). io_xml->read( EXPORTING iv_name = 'ICFDOCU' CHANGING cg_data = ls_icfdocu ). io_xml->read( EXPORTING iv_name = 'ICFHANDLER_TABLE' CHANGING cg_data = lt_icfhandler ). lv_exists = zif_abapgit_object~exists( ). IF lv_exists = abap_false. insert_sicf( is_icfservice = ls_icfservice is_icfdocu = ls_icfdocu it_icfhandler = lt_icfhandler iv_package = iv_package iv_url = lv_url ). ELSE. read( IMPORTING es_icfservice = ls_read ). change_sicf( is_icfservice = ls_icfservice is_icfdocu = ls_icfdocu it_icfhandler = lt_icfhandler iv_package = iv_package iv_parent = ls_read-icfparguid ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~exists. DATA ls_key TYPE ty_sicf_key. ls_key = read_tadir_sicf( ms_item-obj_name )-obj_name. IF ls_key IS NOT INITIAL. SELECT SINGLE icfaltnme FROM icfservice INTO ls_key-icf_name WHERE icf_name = ls_key-icf_name AND icfparguid = ls_key-icfparguid. rv_bool = boolc( sy-subrc = 0 ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~get_comparator. 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. DATA: lv_argument TYPE seqg3-garg. lv_argument = ms_item-obj_name(15). lv_argument+15(1) = '*'. rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESICFSER' iv_argument = lv_argument ). ENDMETHOD. METHOD zif_abapgit_object~jump. DATA: ls_bcdata TYPE bdcdata, lt_bcdata TYPE STANDARD TABLE OF bdcdata. ls_bcdata-program = 'RSICFTREE'. ls_bcdata-dynpro = '1000'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-dynpro = space. ls_bcdata-dynbegin = space. ls_bcdata-fnam = 'ICF_SERV'. ls_bcdata-fval = ms_item-obj_name. APPEND ls_bcdata TO lt_bcdata. ls_bcdata-fnam = 'BDC_OKCODE'. ls_bcdata-fval = '=ONLI'. APPEND ls_bcdata TO lt_bcdata. zcl_abapgit_ui_factory=>get_gui_jumper( )->jump_batch_input( iv_tcode = 'SICF' it_bdcdata = lt_bcdata ). rv_exit = abap_true. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: ls_icfservice TYPE icfservice, ls_icfdocu TYPE icfdocu, lv_url TYPE string, lt_icfhandler TYPE TABLE OF icfhandler. read( IMPORTING es_icfservice = ls_icfservice es_icfdocu = ls_icfdocu et_icfhandler = lt_icfhandler ev_url = lv_url ). IF ls_icfservice IS INITIAL. RETURN. ENDIF. CLEAR ls_icfservice-icf_mandt. CLEAR ls_icfservice-icfnodguid. CLEAR ls_icfservice-icfparguid. CLEAR ls_icfservice-icfchildno. CLEAR ls_icfservice-icfaliasno. CLEAR ls_icfservice-icf_user. CLEAR ls_icfservice-icf_cclnt. CLEAR ls_icfservice-icf_mclnt. CLEAR ls_icfservice-icfaltnme_orig. CLEAR ls_icfservice-icfbitmap. io_xml->add( iv_name = 'URL' ig_data = lv_url ). io_xml->add( iv_name = 'ICFSERVICE' ig_data = ls_icfservice ). io_xml->add( iv_name = 'ICFDOCU' ig_data = ls_icfdocu ). io_xml->add( iv_name = 'ICFHANDLER_TABLE' ig_data = lt_icfhandler ). ENDMETHOD. ENDCLASS.