*&---------------------------------------------------------------------* *& Include ZABAPGIT_OBJECT_SICF *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_object_sicf DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_sicf DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. 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 lcx_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 lcx_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 lcx_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 lcx_exception. ENDCLASS. "lcl_object_sicf DEFINITION *----------------------------------------------------------------------* * CLASS lcl_object_sicf IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_sicf IMPLEMENTATION. METHOD lif_object~has_changed_since. rv_changed = abap_true. ENDMETHOD. "lif_object~has_changed_since METHOD lif_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. ENDMETHOD. METHOD lif_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. "lif_object~get_metadata METHOD lif_object~exists. DATA: ls_icfservice TYPE icfservice. read( IMPORTING es_icfservice = ls_icfservice ). rv_bool = boolc( NOT ls_icfservice IS INITIAL ). ENDMETHOD. "lif_object~exists METHOD lif_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-icfnodguid. CLEAR ls_icfservice-icfparguid. CLEAR ls_icfservice-icf_user. CLEAR ls_icfservice-icf_cclnt. CLEAR ls_icfservice-icf_mclnt. 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. "serialize 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 = ms_item-obj_name. IF ls_key-icfparguid IS INITIAL. * limitation: name must be unique SELECT SINGLE icfparguid FROM icfservice INTO ls_key-icfparguid WHERE icf_name = ls_key-icf_name AND icf_cuser <> 'SAP' ##warn_ok. IF sy-subrc <> 0. RETURN. ENDIF. ENDIF. 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. lcx_exception=>raise( 'error from get_info_from_serv' ). 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. "read METHOD lif_object~deserialize. DATA: ls_icfservice TYPE icfservice, ls_read TYPE icfservice, ls_icfdocu TYPE icfdocu, lv_url TYPE string, 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 ). read( IMPORTING es_icfservice = ls_read ). IF ls_read IS INITIAL. insert_sicf( is_icfservice = ls_icfservice is_icfdocu = ls_icfdocu it_icfhandler = lt_icfhandler iv_package = iv_package iv_url = lv_url ). ELSE. 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. "deserialize 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. "to_icfhndlist 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. lcx_exception=>raise( 'error from service_from_url' ). ENDIF. ENDMETHOD. "find_parent 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 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. lcx_exception=>raise( 'error from insert_node' ). ENDIF. ENDMETHOD. "insert_sicf 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. lcx_exception=>raise( 'error from change_node' ). ENDIF. ENDMETHOD. "change_sicf METHOD lif_object~delete. DATA: ls_icfservice TYPE icfservice. read( IMPORTING es_icfservice = ls_icfservice ). 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. lcx_exception=>raise( 'error from delete_node' ). ENDIF. ENDMETHOD. "delete METHOD lif_object~jump. lcx_exception=>raise( 'todo, SICF, jump' ). ENDMETHOD. "jump METHOD lif_object~compare_to_remote_version. CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result. ENDMETHOD. ENDCLASS. "lcl_object_sicf IMPLEMENTATION