From 920b9c077d8b158a8087e43b4f44120344c22c40 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Sat, 11 Jul 2015 12:10:42 +0200 Subject: [PATCH] SICF support, close #76 --- zabapgit.abap | 255 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 214 insertions(+), 41 deletions(-) diff --git a/zabapgit.abap b/zabapgit.abap index 52a4bc0de..3d1230f4e 100644 --- a/zabapgit.abap +++ b/zabapgit.abap @@ -3,7 +3,7 @@ REPORT zabapgit. * See https://github.com/larshp/abapGit/ CONSTANTS: gc_xml_version TYPE string VALUE 'v0.2-alpha', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v0.40'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v0.41'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -97,6 +97,8 @@ TYPES: tt_diffs TYPE STANDARD TABLE OF st_diff WITH DEFAULT KEY. TYPES: tt_tadir TYPE STANDARD TABLE OF tadir WITH DEFAULT KEY. +TYPES: tt_icfhandler TYPE STANDARD TABLE OF icfhandler WITH DEFAULT KEY. + TYPES: tt_rs38l_incl TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY. TYPES: tt_string TYPE STANDARD TABLE OF string WITH DEFAULT KEY. @@ -174,6 +176,33 @@ CLASS lcx_exception IMPLEMENTATION. ENDCLASS. "lcx_exception IMPLEMENTATION +CLASS lcl_tadir DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS read IMPORTING iv_package TYPE tadir-devclass + RETURNING VALUE(rt_tadir) TYPE tt_tadir. + +ENDCLASS. + +CLASS lcl_tadir IMPLEMENTATION. + + METHOD read. + + FIELD-SYMBOLS: LIKE LINE OF rt_tadir. + + + SELECT * FROM tadir INTO TABLE rt_tadir + WHERE devclass = iv_package + AND object <> 'DEVC'. "#EC CI_GENBUFF "#EC CI_SUBRC + + LOOP AT rt_tadir ASSIGNING WHERE object = 'SICF'. + -obj_name = -obj_name(15). + ENDLOOP. + + ENDMETHOD. + +ENDCLASS. + *----------------------------------------------------------------------* * CLASS lcl_user DEFINITION *----------------------------------------------------------------------* @@ -376,7 +405,7 @@ CLASS lcl_xml DEFINITION FINAL. RAISING lcx_exception. METHODS table_add - IMPORTING it_table TYPE ANY TABLE + IMPORTING it_table TYPE STANDARD TABLE iv_name TYPE string OPTIONAL ii_root TYPE REF TO if_ixml_element OPTIONAL RAISING lcx_exception. @@ -546,7 +575,7 @@ CLASS lcl_xml IMPLEMENTATION. APPEND INITIAL LINE TO ct_table ASSIGNING . CASE lv_kind. WHEN cl_abap_typedescr=>kind_struct. - structure_read( EXPORTING ii_root = li_root + structure_read( EXPORTING ii_root = li_root IMPORTING ev_success = lv_success CHANGING cg_structure = ). WHEN cl_abap_typedescr=>kind_elem. @@ -3105,7 +3134,33 @@ CLASS lcl_object_sicf DEFINITION INHERITING FROM lcl_objects_common FINAL. IMPORTING is_item TYPE st_item EXPORTING es_icfservice TYPE icfservice es_icfdocu TYPE icfdocu - et_icfhandler TYPE icfhandtbl + et_icfhandler TYPE tt_icfhandler + ev_url TYPE string + RAISING lcx_exception. + + CLASS-METHODS insert_sicf + IMPORTING is_icfservice TYPE icfservice + is_icfdocu TYPE icfdocu + it_icfhandler TYPE tt_icfhandler + iv_package TYPE devclass + iv_url TYPE string + RAISING lcx_exception. + + CLASS-METHODS change_sicf + IMPORTING is_icfservice TYPE icfservice + is_icfdocu TYPE icfdocu + it_icfhandler TYPE tt_icfhandler + iv_package TYPE devclass + iv_parent TYPE icfparguid + RAISING lcx_exception. + + CLASS-METHODS to_icfhndlist + IMPORTING it_list TYPE tt_icfhandler + RETURNING VALUE(rt_list) TYPE icfhndlist. + + CLASS-METHODS find_parent + IMPORTING iv_url TYPE string + RETURNING VALUE(rv_parent) TYPE icfparguid RAISING lcx_exception. ENDCLASS. @@ -3116,29 +3171,39 @@ CLASS lcl_object_sicf IMPLEMENTATION. DATA: ls_icfservice TYPE icfservice, ls_icfdocu TYPE icfdocu, + lv_url TYPE string, + ls_item LIKE is_item, lo_xml TYPE REF TO lcl_xml, ls_file LIKE LINE OF rt_files, - lt_icfhandler TYPE icfhandtbl. + lt_icfhandler TYPE TABLE OF icfhandler. read( EXPORTING is_item = is_item IMPORTING es_icfservice = ls_icfservice es_icfdocu = ls_icfdocu - et_icfhandler = lt_icfhandler ). + et_icfhandler = lt_icfhandler + ev_url = lv_url ). + + IF ls_icfservice IS INITIAL. + RETURN. + ENDIF. CLEAR ls_icfservice-icfnodguid. + CLEAR ls_icfservice-icfparguid. CREATE OBJECT lo_xml. + lo_xml->element_add( lv_url ). lo_xml->structure_add( ls_icfservice ). lo_xml->structure_add( ls_icfdocu ). - lo_xml->table_add( lt_icfhandler ). + lo_xml->table_add( iv_name = 'ICFHANDLER_TABLE' it_table = lt_icfhandler ). - ls_file = xml_to_file( is_item = is_item +* multiple SICF nodes with same name cannot be added to repository + MOVE-CORRESPONDING is_item TO ls_item. + ls_item-obj_name = ls_icfservice-icf_name. + ls_file = xml_to_file( is_item = ls_item io_xml = lo_xml ). APPEND ls_file TO rt_files. - _raise 'todo, SICF'. - ENDMETHOD. METHOD read. @@ -3147,8 +3212,20 @@ CLASS lcl_object_sicf IMPLEMENTATION. ls_serv_info LIKE LINE OF lt_serv_info, ls_key TYPE ty_sicf_key. + FIELD-SYMBOLS: LIKE LINE OF et_icfhandler. + ls_key = is_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 @@ -3158,6 +3235,7 @@ CLASS lcl_object_sicf IMPLEMENTATION. IMPORTING serv_info = lt_serv_info icfdocu = es_icfdocu + url = ev_url EXCEPTIONS wrong_name = 1 wrong_parguid = 2 @@ -3178,26 +3256,112 @@ CLASS lcl_object_sicf IMPLEMENTATION. CLEAR es_icfservice-icf_muser. CLEAR es_icfservice-icf_mdate. + CLEAR es_icfdocu-icfparguid. + APPEND LINES OF ls_serv_info-handlertbl TO et_icfhandler. + LOOP AT et_icfhandler ASSIGNING . + CLEAR -icfparguid. + ENDLOOP. ENDMETHOD. METHOD deserialize. - DATA: ls_icfservice TYPE icfservice, + DATA: lo_xml TYPE REF TO lcl_xml, + ls_icfservice TYPE icfservice, + ls_read TYPE icfservice, ls_icfdocu TYPE icfdocu, - lt_icfhandler TYPE icfhandtbl. + lv_url TYPE string, + lt_icfhandler TYPE TABLE OF icfhandler. + lo_xml = read_xml( is_item = is_item + it_files = it_files ). + + lo_xml->element_read( CHANGING cg_element = lv_url ). + lo_xml->structure_read( CHANGING cg_structure = ls_icfservice ). + lo_xml->structure_read( CHANGING cg_structure = ls_icfdocu ). + lo_xml->table_read( EXPORTING iv_name = 'ICFHANDLER_TABLE' + CHANGING ct_table = lt_icfhandler ). + + read( EXPORTING is_item = is_item + 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. + + 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 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. + _raise 'error from service_from_url'. + 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 = ls_icfservice-icf_name - icfparguid = ls_icfservice-icfparguid + icf_name = is_icfservice-orig_name + icfparguid = lv_parent icfdocu = ls_icfdocu doculang = gc_english -* icfhandlst = lt_icfhandler todo + icfhandlst = lt_icfhndlist package = iv_package application = space + icfserdesc = ls_icfserdesc + icfactive = abap_true EXCEPTIONS empty_icf_name = 1 no_new_virtual_host = 2 @@ -3230,15 +3394,33 @@ CLASS lcl_object_sicf IMPLEMENTATION. _raise 'error from insert_node'. ENDIF. + ENDMETHOD. + + METHOD change_sicf. + + DATA: lt_icfhndlist TYPE icfhndlist, + ls_icfserdesc TYPE icfserdesc, + ls_icfdocu TYPE icfdocu. + + + lt_icfhndlist = to_icfhndlist( it_icfhandler ). + +* 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~change_node( EXPORTING - icf_name = ls_icfservice-icf_name - icfparguid = ls_icfservice-icfparguid - icfdocu = ls_icfdocu + icf_name = is_icfservice-orig_name + icfparguid = iv_parent + icfdocu = is_icfdocu doculang = gc_english -* icfhandlst = lt_icfhandler todo + icfhandlst = lt_icfhndlist package = iv_package application = space + icfserdesc = ls_icfserdesc + icfactive = abap_true EXCEPTIONS empty_icf_name = 1 no_new_virtual_host = 2 @@ -3271,8 +3453,6 @@ CLASS lcl_object_sicf IMPLEMENTATION. _raise 'error from change_node'. ENDIF. - _raise 'todo, SICF'. - ENDMETHOD. METHOD delete. @@ -3280,12 +3460,14 @@ CLASS lcl_object_sicf IMPLEMENTATION. DATA: ls_icfservice TYPE icfservice. - read( EXPORTING is_item = is_item + read( EXPORTING is_item = is_item IMPORTING es_icfservice = ls_icfservice ). cl_icf_tree=>if_icf_tree~delete_node( EXPORTING - icfparguid = ls_icfservice-icfnodguid + icfparguid = ls_icfservice-icfparguid + CHANGING + icf_name = ls_icfservice-icf_name EXCEPTIONS no_virtual_host_delete = 1 special_service_error = 2 @@ -3303,8 +3485,6 @@ CLASS lcl_object_sicf IMPLEMENTATION. _raise 'error from delete_node'. ENDIF. - _raise 'todo, SICF'. - ENDMETHOD. METHOD jump. @@ -5044,7 +5224,7 @@ CLASS lcl_object_msag IMPLEMENTATION. ASSERT sy-subrc = 0. CLEAR ls_t100u. - MOVE-CORRESPONDING TO ls_t100u. + MOVE-CORRESPONDING TO ls_t100u ##ENH_OK. ls_t100u-name = sy-uname. ls_t100u-datum = sy-datum. ls_t100u-selfdef = '3'. @@ -6903,7 +7083,8 @@ CLASS lcl_objects IMPLEMENTATION. * find files only existing remotely, including non abapGit related LOOP AT it_files ASSIGNING . - READ TABLE rt_results WITH KEY filename = -filename TRANSPORTING NO FIELDS. + READ TABLE rt_results WITH KEY filename = -filename + TRANSPORTING NO FIELDS. IF sy-subrc <> 0. CLEAR ls_result. ls_result-match = abap_true. @@ -6914,9 +7095,7 @@ CLASS lcl_objects IMPLEMENTATION. * find objects only existing locally IF NOT iv_package IS INITIAL. - SELECT * FROM tadir INTO TABLE lt_tadir - WHERE devclass = iv_package - AND object <> 'DEVC'. "#EC CI_GENBUFF "#EC CI_SUBRC + lt_tadir = lcl_tadir=>read( iv_package ). LOOP AT lt_tadir ASSIGNING . READ TABLE rt_results WITH KEY obj_type = -object obj_name = -obj_name @@ -9079,9 +9258,7 @@ CLASS lcl_zip IMPLEMENTATION. FIELD-SYMBOLS: LIKE LINE OF lt_tadir. - SELECT * FROM tadir INTO TABLE lt_tadir - WHERE devclass = is_repo-package - AND object <> 'DEVC'. "#EC CI_GENBUFF "#EC CI_SUBRC + lt_tadir = lcl_tadir=>read( is_repo-package ). IF lt_tadir IS INITIAL. _raise 'Package is empty'. @@ -9195,13 +9372,13 @@ CLASS lcl_zip IMPLEMENTATION. error_execute_failed = 7 synchronous_failed = 8 not_supported_by_gui = 9 - OTHERS = 10 ). + OTHERS = 10 ). "#EC NOTEXT IF sy-subrc <> 0. _raise 'error from execute'. ENDIF. * make sure to set git user.email and user.name manually - lv_par = 'commit -m "' && lv_message && '"'. + lv_par = 'commit -m "' && lv_message && '"'. "#EC NOTEXT cl_gui_frontend_services=>execute( EXPORTING application = 'git' @@ -10086,9 +10263,7 @@ CLASS lcl_gui IMPLEMENTATION. lv_question TYPE c LENGTH 100. - SELECT * FROM tadir INTO TABLE lt_tadir - WHERE devclass = is_repo-package - AND object <> 'DEVC'. "#EC CI_GENBUFF "#EC CI_SUBRC + lt_tadir = lcl_tadir=>read( is_repo-package ). IF lines( lt_tadir ) > 0. lv_count = lines( lt_tadir ). @@ -10586,9 +10761,7 @@ CLASS lcl_gui IMPLEMENTATION. 'Local object' && gc_newline && '' && gc_newline. - SELECT * FROM tadir INTO TABLE lt_tadir - WHERE devclass = is_repo_persi-package - AND object <> 'DEVC'. "#EC CI_GENBUFF "#EC CI_SUBRC + lt_tadir = lcl_tadir=>read( is_repo_persi-package ). LOOP AT lt_tadir ASSIGNING . * todo, add jump link like in online rendering