From 1e5befc44a1ee15b865ae91efe34724953da2610 Mon Sep 17 00:00:00 2001 From: g-back <27279305+g-back@users.noreply.github.com> Date: Wed, 20 Oct 2021 17:54:23 +0200 Subject: [PATCH] Decouple `cl_gui_frontend_services` (#5046) * add additional methods * fix whitespace * add parameter prefixes * zip: refactor usage of frontend_services * debug info: refactor usage of frontend_services * services basis: refactor frontend_services usage * objects_super: refactor usage of frontend_services * router: refactor usage of frontend_services * services_abapgit: refactor usage of frontend_serv Co-authored-by: Lars Hvam --- .../zcl_abapgit_objects_super.clas.abap | 8 +- .../zcl_abapgit_frontend_services.clas.abap | 99 ++++++++++++++++++- .../zcl_abapgit_gui_page_debuginfo.clas.abap | 23 +++-- src/ui/zcl_abapgit_gui_router.clas.abap | 28 +----- src/ui/zcl_abapgit_services_abapgit.clas.abap | 54 +++++----- src/ui/zcl_abapgit_services_basis.clas.abap | 36 +------ .../zif_abapgit_frontend_services.intf.abap | 45 +++++++++ src/zcl_abapgit_zip.clas.abap | 20 ++-- 8 files changed, 197 insertions(+), 116 deletions(-) diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap b/src/objects/zcl_abapgit_objects_super.clas.abap index 987f224c0..abb3a2ecf 100644 --- a/src/objects/zcl_abapgit_objects_super.clas.abap +++ b/src/objects/zcl_abapgit_objects_super.clas.abap @@ -306,13 +306,7 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. iv_sub_obj_name = iv_sub_obj_name iv_line_number = iv_line_number ). - cl_gui_frontend_services=>execute( - EXPORTING document = lv_adt_link - EXCEPTIONS OTHERS = 1 ). - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |ADT Jump Error - failed to open link { lv_adt_link }. Subrc={ sy-subrc }| ). - ENDIF. + zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ). CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = 'ADT Jump Error' diff --git a/src/ui/zcl_abapgit_frontend_services.clas.abap b/src/ui/zcl_abapgit_frontend_services.clas.abap index 8bc33520f..b2a3cc28f 100644 --- a/src/ui/zcl_abapgit_frontend_services.clas.abap +++ b/src/ui/zcl_abapgit_frontend_services.clas.abap @@ -1,11 +1,11 @@ CLASS zcl_abapgit_frontend_services DEFINITION PUBLIC CREATE PRIVATE - GLOBAL FRIENDS zcl_abapgit_ui_factory . + GLOBAL FRIENDS zcl_abapgit_ui_factory. PUBLIC SECTION. - INTERFACES zif_abapgit_frontend_services . + INTERFACES zif_abapgit_frontend_services. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. @@ -193,9 +193,9 @@ CLASS ZCL_ABAPGIT_FRONTEND_SERVICES IMPLEMENTATION. " Note: do not use a string table for 'it_data'! cl_gui_frontend_services=>clipboard_export( EXPORTING - no_auth_check = iv_no_auth_check + no_auth_check = iv_no_auth_check IMPORTING - data = it_data + data = it_data CHANGING rc = lv_rc EXCEPTIONS @@ -208,4 +208,95 @@ CLASS ZCL_ABAPGIT_FRONTEND_SERVICES IMPLEMENTATION. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. + + METHOD zif_abapgit_frontend_services~execute. + cl_gui_frontend_services=>execute( + EXPORTING + document = iv_document + application = iv_application + parameter = iv_parameter + default_directory = iv_default_directory + maximized = iv_maximized + minimized = iv_minimized + synchronous = iv_synchronous + operation = iv_operation + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + bad_parameter = 3 + file_not_found = 4 + path_not_found = 5 + file_extension_unknown = 6 + error_execute_failed = 7 + synchronous_failed = 8 + not_supported_by_gui = 9 + OTHERS = 10 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + ENDMETHOD. + + METHOD zif_abapgit_frontend_services~get_system_directory. + cl_gui_frontend_services=>get_system_directory( + CHANGING + system_directory = cv_system_directory + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + ENDMETHOD. + + METHOD zif_abapgit_frontend_services~directory_browse. + cl_gui_frontend_services=>directory_browse( + EXPORTING + window_title = iv_window_title + initial_folder = iv_initial_folder + CHANGING + selected_folder = cv_selected_folder + EXCEPTIONS + cntl_error = 1 + error_no_gui = 2 + not_supported_by_gui = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + ENDMETHOD. + + METHOD zif_abapgit_frontend_services~get_file_separator. + cl_gui_frontend_services=>get_file_separator( + CHANGING + file_separator = cv_file_separator + EXCEPTIONS + not_supported_by_gui = 1 + error_no_gui = 2 + cntl_error = 3 + OTHERS = 4 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + ENDMETHOD. + + METHOD zif_abapgit_frontend_services~get_gui_version. + cl_gui_frontend_services=>get_gui_version( + CHANGING + version_table = ct_version_table + rc = cv_rc + EXCEPTIONS + get_gui_version_failed = 1 + cant_write_version_table = 2 + gui_no_version = 3 + cntl_error = 4 + error_no_gui = 5 + not_supported_by_gui = 6 + OTHERS = 7 ). + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise_t100( ). + ENDIF. + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_gui_page_debuginfo.clas.abap b/src/ui/zcl_abapgit_gui_page_debuginfo.clas.abap index f5d181d15..f46b438f0 100644 --- a/src/ui/zcl_abapgit_gui_page_debuginfo.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_debuginfo.clas.abap @@ -123,16 +123,21 @@ CLASS zcl_abapgit_gui_page_debuginfo IMPLEMENTATION. METHOD render_debug_info. - DATA: lt_ver_tab TYPE filetable, - lv_rc TYPE i, - ls_release TYPE zif_abapgit_environment=>ty_release_sp, - lv_gui_version TYPE string, - ls_version LIKE LINE OF lt_ver_tab, - lv_devclass TYPE devclass. + DATA: lt_ver_tab TYPE filetable, + lv_rc TYPE i, + ls_release TYPE zif_abapgit_environment=>ty_release_sp, + lv_gui_version TYPE string, + ls_version LIKE LINE OF lt_ver_tab, + lv_devclass TYPE devclass, + lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services. + + lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ). + TRY. + lo_frontend_serv->get_gui_version( CHANGING ct_version_table = lt_ver_tab cv_rc = lv_rc ). + CATCH zcx_abapgit_exception ##NO_HANDLER. + " Continue rendering even if this fails + ENDTRY. - cl_gui_frontend_services=>get_gui_version( - CHANGING version_table = lt_ver_tab rc = lv_rc - EXCEPTIONS OTHERS = 1 ). READ TABLE lt_ver_tab INTO ls_version INDEX 1. " gui release lv_gui_version = ls_version-filename. READ TABLE lt_ver_tab INTO ls_version INDEX 2. " gui sp diff --git a/src/ui/zcl_abapgit_gui_router.clas.abap b/src/ui/zcl_abapgit_gui_router.clas.abap index 34be6cfb9..8a87a373b 100644 --- a/src/ui/zcl_abapgit_gui_router.clas.abap +++ b/src/ui/zcl_abapgit_gui_router.clas.abap @@ -147,24 +147,7 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. METHOD call_browser. - cl_gui_frontend_services=>execute( - EXPORTING - document = |{ iv_url }| - EXCEPTIONS - cntl_error = 1 - error_no_gui = 2 - bad_parameter = 3 - file_not_found = 4 - path_not_found = 5 - file_extension_unknown = 6 - error_execute_failed = 7 - synchronous_failed = 8 - not_supported_by_gui = 9 - OTHERS = 10 ). - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise_t100( ). - ENDIF. + zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = |{ iv_url }| ). ENDMETHOD. @@ -537,13 +520,10 @@ CLASS zcl_abapgit_gui_router IMPLEMENTATION. trnumber = iv_transport RECEIVING result = lv_transport_adt_uri. - lv_adt_link = |adt://{ sy-sysid }{ lv_transport_adt_uri }|. - cl_gui_frontend_services=>execute( EXPORTING document = lv_adt_link - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'ADT Jump Error' ). - ENDIF. + lv_adt_link = |adt://{ sy-sysid }{ lv_transport_adt_uri }|. + zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ). + CATCH cx_root. CALL FUNCTION 'TR_DISPLAY_REQUEST' EXPORTING diff --git a/src/ui/zcl_abapgit_services_abapgit.clas.abap b/src/ui/zcl_abapgit_services_abapgit.clas.abap index 9b7ae6d7f..4311b749d 100644 --- a/src/ui/zcl_abapgit_services_abapgit.clas.abap +++ b/src/ui/zcl_abapgit_services_abapgit.clas.abap @@ -10,6 +10,7 @@ CLASS zcl_abapgit_services_abapgit DEFINITION CONSTANTS c_abapgit_wikipage TYPE string VALUE 'https://docs.abapgit.org' ##NO_TEXT. CONSTANTS c_dotabap_homepage TYPE string VALUE 'https://dotabap.org' ##NO_TEXT. CONSTANTS c_abapgit_class TYPE seoclsname VALUE `ZCX_ABAPGIT_EXCEPTION` ##NO_TEXT. + CONSTANTS c_changelog_path TYPE string VALUE '/blob/main/changelog.txt' ##NO_TEXT. CLASS-METHODS open_abapgit_homepage RAISING @@ -43,6 +44,11 @@ CLASS zcl_abapgit_services_abapgit DEFINITION CLASS-METHODS check_sapgui RAISING zcx_abapgit_exception . + CLASS-METHODS open_url_in_browser + IMPORTING + !iv_url TYPE string + RAISING + zcx_abapgit_exception. ENDCLASS. @@ -158,50 +164,22 @@ CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. METHOD open_abapgit_changelog. - - cl_gui_frontend_services=>execute( - EXPORTING document = c_abapgit_repo && '/blob/main/changelog.txt' - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Opening page in external browser failed.' ). - ENDIF. - + open_url_in_browser( |{ c_abapgit_repo }{ c_changelog_path }| ). ENDMETHOD. METHOD open_abapgit_homepage. - - cl_gui_frontend_services=>execute( - EXPORTING document = c_abapgit_homepage - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Opening page in external browser failed.' ). - ENDIF. - + open_url_in_browser( c_abapgit_homepage ). ENDMETHOD. METHOD open_abapgit_wikipage. - - cl_gui_frontend_services=>execute( - EXPORTING document = c_abapgit_wikipage - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Opening page in external browser failed.' ). - ENDIF. - + open_url_in_browser( c_abapgit_wikipage ). ENDMETHOD. METHOD open_dotabap_homepage. - - cl_gui_frontend_services=>execute( - EXPORTING document = c_dotabap_homepage - EXCEPTIONS OTHERS = 1 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'Opening page in external browser failed.' ). - ENDIF. - + open_url_in_browser( c_dotabap_homepage ). ENDMETHOD. @@ -294,4 +272,16 @@ CLASS ZCL_ABAPGIT_SERVICES_ABAPGIT IMPLEMENTATION. ENDIF. ENDMETHOD. + + METHOD open_url_in_browser. + DATA lx_error TYPE REF TO zcx_abapgit_exception. + + TRY. + zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = iv_url ). + CATCH zcx_abapgit_exception INTO lx_error. + zcx_abapgit_exception=>raise( iv_text = 'Opening page in external browser failed.' + ix_previous = lx_error ). + ENDTRY. + ENDMETHOD. + ENDCLASS. diff --git a/src/ui/zcl_abapgit_services_basis.clas.abap b/src/ui/zcl_abapgit_services_basis.clas.abap index 8b8a4f22e..ad528d8b6 100644 --- a/src/ui/zcl_abapgit_services_basis.clas.abap +++ b/src/ui/zcl_abapgit_services_basis.clas.abap @@ -57,46 +57,20 @@ CLASS ZCL_ABAPGIT_SERVICES_BASIS IMPLEMENTATION. METHOD open_ie_devtools. DATA: lv_system_directory TYPE string, - lv_exe_full_path TYPE string. + lv_exe_full_path TYPE string, + lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services. IF zcl_abapgit_ui_factory=>get_gui_functions( )->is_sapgui_for_windows( ) = abap_false. zcx_abapgit_exception=>raise( |IE DevTools not supported on frontend OS| ). ENDIF. - cl_gui_frontend_services=>get_system_directory( - CHANGING - system_directory = lv_system_directory - EXCEPTIONS - cntl_error = 1 - error_no_gui = 2 - not_supported_by_gui = 3 - OTHERS = 4 ). - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Error from GET_SYSTEM_DIRECTORY sy-subrc: { sy-subrc }| ). - ENDIF. + lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ). + lo_frontend_serv->get_system_directory( CHANGING cv_system_directory = lv_system_directory ). cl_gui_cfw=>flush( ). lv_exe_full_path = lv_system_directory && `\F12\IEChooser.exe`. - - cl_gui_frontend_services=>execute( - EXPORTING - application = lv_exe_full_path - EXCEPTIONS - cntl_error = 1 - error_no_gui = 2 - bad_parameter = 3 - file_not_found = 4 - path_not_found = 5 - file_extension_unknown = 6 - error_execute_failed = 7 - synchronous_failed = 8 - not_supported_by_gui = 9 - OTHERS = 10 ). - IF sy-subrc <> 0. - " IEChooser is only available on Windows 10 - zcx_abapgit_exception=>raise( |Error from EXECUTE sy-subrc: { sy-subrc }| ). - ENDIF. + lo_frontend_serv->execute( iv_application = lv_exe_full_path ). ENDMETHOD. diff --git a/src/ui/zif_abapgit_frontend_services.intf.abap b/src/ui/zif_abapgit_frontend_services.intf.abap index 9e1ebffd9..f54c39cb9 100644 --- a/src/ui/zif_abapgit_frontend_services.intf.abap +++ b/src/ui/zif_abapgit_frontend_services.intf.abap @@ -1,4 +1,7 @@ INTERFACE zif_abapgit_frontend_services PUBLIC. + + TYPES ty_char1 TYPE c LENGTH 1. + METHODS file_upload IMPORTING !iv_path TYPE string @@ -37,4 +40,46 @@ INTERFACE zif_abapgit_frontend_services PUBLIC. VALUE(it_data) TYPE STANDARD TABLE RAISING zcx_abapgit_exception. + + METHODS execute + IMPORTING + !iv_document TYPE string OPTIONAL + !iv_application TYPE string OPTIONAL + !iv_parameter TYPE string OPTIONAL + !iv_default_directory TYPE string OPTIONAL + !iv_maximized TYPE string OPTIONAL + !iv_minimized TYPE string OPTIONAL + !iv_synchronous TYPE string OPTIONAL + !iv_operation TYPE string DEFAULT 'OPEN' + RAISING + zcx_abapgit_exception. + + METHODS get_system_directory + CHANGING + !cv_system_directory TYPE string + RAISING + zcx_abapgit_exception. + + METHODS directory_browse + IMPORTING + iv_window_title TYPE string OPTIONAL + iv_initial_folder TYPE string OPTIONAL + CHANGING + cv_selected_folder TYPE string + RAISING + zcx_abapgit_exception. + + METHODS get_file_separator + CHANGING + cv_file_separator TYPE ty_char1 + RAISING + zcx_abapgit_exception. + + METHODS get_gui_version + CHANGING + ct_version_table TYPE filetable + cv_rc TYPE i + RAISING + zcx_abapgit_exception. + ENDINTERFACE. diff --git a/src/zcl_abapgit_zip.clas.abap b/src/zcl_abapgit_zip.clas.abap index 4329f7f5a..b8755d96e 100644 --- a/src/zcl_abapgit_zip.clas.abap +++ b/src/zcl_abapgit_zip.clas.abap @@ -144,11 +144,12 @@ CLASS zcl_abapgit_zip IMPLEMENTATION. METHOD export_object. - DATA: ls_tadir TYPE zif_abapgit_definitions=>ty_tadir, - lv_folder TYPE string, - lv_fullpath TYPE string, - lv_sep TYPE c LENGTH 1, - ls_files_item TYPE zcl_abapgit_objects=>ty_serialization. + DATA: ls_tadir TYPE zif_abapgit_definitions=>ty_tadir, + lv_folder TYPE string, + lv_fullpath TYPE string, + lv_sep TYPE c LENGTH 1, + ls_files_item TYPE zcl_abapgit_objects=>ty_serialization, + lo_frontend_serv TYPE REF TO zif_abapgit_frontend_services. FIELD-SYMBOLS: LIKE LINE OF ls_files_item-files. @@ -170,17 +171,18 @@ CLASS zcl_abapgit_zip IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Empty' ). ENDIF. - cl_gui_frontend_services=>directory_browse( + lo_frontend_serv = zcl_abapgit_ui_factory=>get_frontend_services( ). + lo_frontend_serv->directory_browse( EXPORTING - initial_folder = gv_prev + iv_initial_folder = gv_prev CHANGING - selected_folder = lv_folder ). + cv_selected_folder = lv_folder ). IF lv_folder IS INITIAL. RAISE EXCEPTION TYPE zcx_abapgit_cancel. ENDIF. gv_prev = lv_folder. - cl_gui_frontend_services=>get_file_separator( CHANGING file_separator = lv_sep ). + lo_frontend_serv->get_file_separator( CHANGING cv_file_separator = lv_sep ). LOOP AT ls_files_item-files ASSIGNING . lv_fullpath = |{ lv_folder }{ lv_sep }{ -filename }|.