From a37cf58e016f5599d850da56a1d52b462c511230 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Sun, 7 Nov 2021 02:15:08 -0500 Subject: [PATCH] Refactor: Jump to Object Logic (#5114) * Refactor: Jump to Object Logic The goal is to greatly simplify the code to jump to an object, and to separate UI and object layers some more. This PR introduces GUI Jumper (`zcl/if_abapgit_gui_jumper`), which covers all generic options to show an object. It tries the following options in order: - ADT (if enabled) - Workbench with line number - Workbench without line number - Transport System (new) Only if all fail, abapGit will call the object-specific handler. Next steps: - Remove `jump_adt` and `jump_se11` from `zcl_abapgit_objects_super` and replace by GUI Jumper - Remove almost all object-specific jump handler since they are covered by GUI Jumper now * Add class * Lint * Misleading name --- .../core/zcl_abapgit_gui_jumper.clas.abap | 173 ++++++++++++++++++ .../core/zcl_abapgit_gui_jumper.clas.xml | 16 ++ src/objects/zcl_abapgit_objects.clas.abap | 52 ++---- .../zcl_abapgit_objects_super.clas.abap | 22 +-- src/ui/zcl_abapgit_gui_page_diff.clas.abap | 10 +- src/ui/zcl_abapgit_ui_factory.clas.abap | 15 ++ src/ui/zif_abapgit_gui_jumper.intf.abap | 26 +++ src/ui/zif_abapgit_gui_jumper.intf.xml | 15 ++ src/utils/zcl_abapgit_adt_link.clas.abap | 106 +++++++---- 9 files changed, 338 insertions(+), 97 deletions(-) create mode 100644 src/objects/core/zcl_abapgit_gui_jumper.clas.abap create mode 100644 src/objects/core/zcl_abapgit_gui_jumper.clas.xml create mode 100644 src/ui/zif_abapgit_gui_jumper.intf.abap create mode 100644 src/ui/zif_abapgit_gui_jumper.intf.xml diff --git a/src/objects/core/zcl_abapgit_gui_jumper.clas.abap b/src/objects/core/zcl_abapgit_gui_jumper.clas.abap new file mode 100644 index 000000000..63caa3fc5 --- /dev/null +++ b/src/objects/core/zcl_abapgit_gui_jumper.clas.abap @@ -0,0 +1,173 @@ +CLASS zcl_abapgit_gui_jumper DEFINITION + PUBLIC + FINAL + CREATE PUBLIC. + + PUBLIC SECTION. + + INTERFACES zif_abapgit_gui_jumper. + + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS jump_tr + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + RETURNING + VALUE(rv_exit) TYPE abap_bool. + + METHODS jump_wb + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_new_window TYPE abap_bool + RETURNING + VALUE(rv_exit) TYPE abap_bool. + + METHODS jump_wb_line + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name + !iv_sub_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type + !iv_line_number TYPE i + !iv_new_window TYPE abap_bool + RETURNING + VALUE(rv_exit) TYPE abap_bool. + +ENDCLASS. + + + +CLASS zcl_abapgit_gui_jumper IMPLEMENTATION. + + + METHOD jump_tr. + + DATA: + lv_e071_object TYPE e071-object, + lv_e071_obj_name TYPE e071-obj_name. + + lv_e071_object = is_item-obj_type. + lv_e071_obj_name = is_item-obj_name. + + CALL FUNCTION 'TR_OBJECT_JUMP_TO_TOOL' + EXPORTING + iv_action = 'SHOW' + iv_pgmid = 'R3TR' + iv_object = lv_e071_object + iv_obj_name = lv_e071_obj_name + EXCEPTIONS + jump_not_possible = 1 + OTHERS = 2. + + rv_exit = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD jump_wb. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = is_item-obj_name + object_type = is_item-obj_type + devclass = is_item-devclass + in_new_window = iv_new_window + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + rv_exit = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD jump_wb_line. + + IF iv_line_number IS NOT INITIAL AND iv_sub_obj_type IS NOT INITIAL AND iv_sub_obj_name IS NOT INITIAL. + + " For the line navigation we have to supply the sub object type (iv_sub_obj_type). + " If we use is_item-obj_type it navigates only to the object. + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = is_item-obj_name + object_type = iv_sub_obj_type + devclass = is_item-devclass + include = iv_sub_obj_name + position = iv_line_number + in_new_window = iv_new_window + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + rv_exit = boolc( sy-subrc = 0 ). + + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_gui_jumper~jump. + + " Try all generic jump options + + " 1) ADT Jump + rv_exit = zif_abapgit_gui_jumper~jump_adt( + is_item = is_item + iv_sub_obj_name = iv_sub_obj_name + iv_line_number = iv_line_number ). + + IF rv_exit = abap_true. + RETURN. + ENDIF. + + " 2) WB Jump with Line Number + rv_exit = jump_wb_line( + is_item = is_item + iv_sub_obj_name = iv_sub_obj_name + iv_sub_obj_type = iv_sub_obj_type + iv_line_number = iv_line_number + iv_new_window = iv_new_window ). + + IF rv_exit = abap_true. + RETURN. + ENDIF. + + " 3) WB Jump without Line Number + rv_exit = jump_wb( + is_item = is_item + iv_new_window = iv_new_window ). + + IF rv_exit = abap_true. + RETURN. + ENDIF. + + " 4) Transport Tool Jump + rv_exit = jump_tr( is_item ). + + ENDMETHOD. + + + METHOD zif_abapgit_gui_jumper~jump_adt. + + " Open object in ADT (if enabled) + + DATA lv_adt_jump_enabled TYPE abap_bool. + + lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ). + + IF lv_adt_jump_enabled = abap_true. + zcl_abapgit_adt_link=>jump( + iv_obj_name = is_item-obj_name + iv_obj_type = is_item-obj_type + iv_sub_obj_name = iv_sub_obj_name + iv_line_number = iv_line_number ). + + rv_exit = abap_true. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/core/zcl_abapgit_gui_jumper.clas.xml b/src/objects/core/zcl_abapgit_gui_jumper.clas.xml new file mode 100644 index 000000000..f5385ecbc --- /dev/null +++ b/src/objects/core/zcl_abapgit_gui_jumper.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_GUI_JUMPER + E + abapGit - GUI Jump + 1 + X + X + X + + + + diff --git a/src/objects/zcl_abapgit_objects.clas.abap b/src/objects/zcl_abapgit_objects.clas.abap index 7595acbbd..a36d5e6f7 100644 --- a/src/objects/zcl_abapgit_objects.clas.abap +++ b/src/objects/zcl_abapgit_objects.clas.abap @@ -898,14 +898,15 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. METHOD jump. - DATA: li_obj TYPE REF TO zif_abapgit_object, - lv_adt_jump_enabled TYPE abap_bool. + DATA: li_obj TYPE REF TO zif_abapgit_object, + lv_exit TYPE abap_bool. " Nothing to do for unsupported objects IF is_type_supported( is_item-obj_type ) = abap_false. zcx_abapgit_exception=>raise( |Object type { is_item-obj_type } is not supported by this system| ). ENDIF. + " Nothing to do if object does not exist li_obj = create_object( is_item = is_item iv_language = zif_abapgit_definitions=>c_english ). @@ -913,46 +914,15 @@ CLASS zcl_abapgit_objects IMPLEMENTATION. zcx_abapgit_exception=>raise( |Object { is_item-obj_type } { is_item-obj_name } doesn't exist| ). ENDIF. - lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ). + " Open object in new window + lv_exit = zcl_abapgit_ui_factory=>get_gui_jumper( )->jump( + is_item = is_item + iv_sub_obj_name = iv_sub_obj_name + iv_sub_obj_type = iv_sub_obj_type + iv_line_number = iv_line_number ). - IF lv_adt_jump_enabled = abap_true. - - TRY. - zcl_abapgit_objects_super=>jump_adt( - iv_obj_name = is_item-obj_name - iv_obj_type = is_item-obj_type - iv_sub_obj_name = iv_sub_obj_name - iv_sub_obj_type = iv_sub_obj_type - iv_line_number = iv_line_number ). - CATCH zcx_abapgit_exception. - li_obj->jump( ). - ENDTRY. - - ELSEIF iv_line_number IS NOT INITIAL - AND iv_sub_obj_type IS NOT INITIAL - AND iv_sub_obj_name IS NOT INITIAL. - - " For the line navigation we have to supply the sub object type (i_sub_obj_type). - " If we use is_item-obj_type it navigates only to the object. - - CALL FUNCTION 'RS_TOOL_ACCESS' - EXPORTING - operation = 'SHOW' - object_name = is_item-obj_name - object_type = iv_sub_obj_type - include = iv_sub_obj_name - position = iv_line_number - in_new_window = abap_true - EXCEPTIONS - not_executed = 1 - invalid_object_type = 2 - OTHERS = 3. - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise_t100( ). - ENDIF. - - ELSE. + " If all fails, try object-specific handler + IF lv_exit IS INITIAL. li_obj->jump( ). ENDIF. diff --git a/src/objects/zcl_abapgit_objects_super.clas.abap b/src/objects/zcl_abapgit_objects_super.clas.abap index abb3a2ecf..711cb886b 100644 --- a/src/objects/zcl_abapgit_objects_super.clas.abap +++ b/src/objects/zcl_abapgit_objects_super.clas.abap @@ -295,23 +295,11 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION. METHOD jump_adt. - DATA: lv_adt_link TYPE string, - lx_error TYPE REF TO cx_root. - - TRY. - - lv_adt_link = zcl_abapgit_adt_link=>generate( - iv_obj_name = iv_obj_name - iv_obj_type = iv_obj_type - iv_sub_obj_name = iv_sub_obj_name - iv_line_number = iv_line_number ). - - 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' - ix_previous = lx_error ). - ENDTRY. + zcl_abapgit_adt_link=>jump( + iv_obj_name = iv_obj_name + iv_obj_type = iv_obj_type + iv_sub_obj_name = iv_sub_obj_name + iv_line_number = iv_line_number ). ENDMETHOD. diff --git a/src/ui/zcl_abapgit_gui_page_diff.clas.abap b/src/ui/zcl_abapgit_gui_page_diff.clas.abap index 81021385f..b238d4378 100644 --- a/src/ui/zcl_abapgit_gui_page_diff.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_diff.clas.abap @@ -830,8 +830,8 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. METHOD render_diff_head. - DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count, - lv_adt_link TYPE string. + DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count, + lv_link TYPE string. CREATE OBJECT ri_html TYPE zcl_abapgit_html. @@ -859,14 +859,14 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION. IF NOT ( is_diff-lstate = zif_abapgit_definitions=>c_state-unchanged AND is_diff-rstate = zif_abapgit_definitions=>c_state-added ) AND NOT is_diff-lstate = zif_abapgit_definitions=>c_state-deleted. - lv_adt_link = ri_html->a( + lv_link = ri_html->a( iv_txt = |{ is_diff-path }{ is_diff-filename }| iv_typ = zif_abapgit_html=>c_action_type-sapevent iv_act = |jump?TYPE={ is_diff-obj_type }&NAME={ is_diff-obj_name }| ). ENDIF. - IF lv_adt_link IS NOT INITIAL. - ri_html->add( |{ lv_adt_link }| ). + IF lv_link IS NOT INITIAL. + ri_html->add( |{ lv_link }| ). ELSE. ri_html->add( |{ is_diff-path }{ is_diff-filename }| ). ENDIF. diff --git a/src/ui/zcl_abapgit_ui_factory.clas.abap b/src/ui/zcl_abapgit_ui_factory.clas.abap index d03807a12..ed19ee1ae 100644 --- a/src/ui/zcl_abapgit_ui_factory.clas.abap +++ b/src/ui/zcl_abapgit_ui_factory.clas.abap @@ -38,6 +38,9 @@ CLASS zcl_abapgit_ui_factory DEFINITION !iv_disable_query_table TYPE abap_bool DEFAULT abap_true RETURNING VALUE(ri_viewer) TYPE REF TO zif_abapgit_html_viewer . + CLASS-METHODS get_gui_jumper + RETURNING + VALUE(ri_gui_jumper) TYPE REF TO zif_abapgit_gui_jumper . PROTECTED SECTION. PRIVATE SECTION. @@ -48,6 +51,7 @@ CLASS zcl_abapgit_ui_factory DEFINITION CLASS-DATA go_gui TYPE REF TO zcl_abapgit_gui . CLASS-DATA gi_fe_services TYPE REF TO zif_abapgit_frontend_services . CLASS-DATA gi_gui_services TYPE REF TO zif_abapgit_gui_services . + CLASS-DATA gi_gui_jumper TYPE REF TO zif_abapgit_gui_jumper . ENDCLASS. @@ -173,6 +177,17 @@ CLASS zcl_abapgit_ui_factory IMPLEMENTATION. ENDMETHOD. + METHOD get_gui_jumper. + + IF gi_gui_jumper IS INITIAL. + CREATE OBJECT gi_gui_jumper TYPE zcl_abapgit_gui_jumper. + ENDIF. + + ri_gui_jumper = gi_gui_jumper. + + ENDMETHOD. + + METHOD get_gui_services. IF gi_gui_services IS NOT BOUND. gi_gui_services ?= get_gui( ). diff --git a/src/ui/zif_abapgit_gui_jumper.intf.abap b/src/ui/zif_abapgit_gui_jumper.intf.abap new file mode 100644 index 000000000..5622715ca --- /dev/null +++ b/src/ui/zif_abapgit_gui_jumper.intf.abap @@ -0,0 +1,26 @@ +INTERFACE zif_abapgit_gui_jumper + PUBLIC. + + METHODS jump + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL + !iv_sub_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type OPTIONAL + !iv_line_number TYPE i OPTIONAL + !iv_new_window TYPE abap_bool DEFAULT abap_true + RETURNING + VALUE(rv_exit) TYPE abap_bool + RAISING + zcx_abapgit_exception. + + METHODS jump_adt + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name + !iv_line_number TYPE i + RETURNING + VALUE(rv_exit) TYPE abap_bool + RAISING + zcx_abapgit_exception. + +ENDINTERFACE. diff --git a/src/ui/zif_abapgit_gui_jumper.intf.xml b/src/ui/zif_abapgit_gui_jumper.intf.xml new file mode 100644 index 000000000..81bcb4115 --- /dev/null +++ b/src/ui/zif_abapgit_gui_jumper.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_GUI_JUMPER + E + abapGit - GUI Jump + 2 + 1 + X + + + + diff --git a/src/utils/zcl_abapgit_adt_link.clas.abap b/src/utils/zcl_abapgit_adt_link.clas.abap index c4496df49..909437692 100644 --- a/src/utils/zcl_abapgit_adt_link.clas.abap +++ b/src/utils/zcl_abapgit_adt_link.clas.abap @@ -1,10 +1,21 @@ CLASS zcl_abapgit_adt_link DEFINITION PUBLIC FINAL - CREATE PUBLIC . + CREATE PUBLIC. PUBLIC SECTION. + CLASS-METHODS jump + IMPORTING + !iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name + !iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type + !iv_sub_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name OPTIONAL + !iv_line_number TYPE i OPTIONAL + RAISING + zcx_abapgit_exception. + + PROTECTED SECTION. + CLASS-METHODS generate IMPORTING !iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name @@ -14,54 +25,58 @@ CLASS zcl_abapgit_adt_link DEFINITION RETURNING VALUE(rv_result) TYPE string RAISING - zcx_abapgit_exception . - PROTECTED SECTION. - PRIVATE SECTION. - CLASS-METHODS: - get_adt_objects_and_names - IMPORTING - iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name - iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type - EXPORTING - eo_adt_uri_mapper TYPE REF TO object - eo_adt_objectref TYPE REF TO object - ev_program TYPE progname - ev_include TYPE progname - RAISING - zcx_abapgit_exception. + zcx_abapgit_exception. + + PRIVATE SECTION. + + CLASS-METHODS get_adt_objects_and_names + IMPORTING + iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name + iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type + EXPORTING + eo_adt_uri_mapper TYPE REF TO object + eo_adt_objectref TYPE REF TO object + ev_program TYPE progname + ev_include TYPE progname + RAISING + zcx_abapgit_exception. + + CLASS-METHODS is_adt_jump_possible + IMPORTING + io_object TYPE REF TO cl_wb_object + io_adt TYPE REF TO object + RETURNING + VALUE(rv_is_adt_jump_possible) TYPE abap_bool + RAISING + zcx_abapgit_exception. - CLASS-METHODS: - is_adt_jump_possible - IMPORTING io_object TYPE REF TO cl_wb_object - io_adt TYPE REF TO object - RETURNING VALUE(rv_is_adt_jump_possible) TYPE abap_bool - RAISING zcx_abapgit_exception. ENDCLASS. -CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION. +CLASS zcl_abapgit_adt_link IMPLEMENTATION. METHOD generate. DATA: lv_adt_link TYPE string. - DATA: lo_adt_uri_mapper TYPE REF TO object ##needed. - DATA: lo_adt_objref TYPE REF TO object ##needed. - DATA: lo_adt_sub_objref TYPE REF TO object ##needed. + DATA: lo_adt_uri_mapper TYPE REF TO object. + DATA: lo_adt_objref TYPE REF TO object. + DATA: lo_adt_sub_objref TYPE REF TO object. DATA: lv_program TYPE progname. DATA: lv_include TYPE progname. + FIELD-SYMBOLS: TYPE string. get_adt_objects_and_names( - EXPORTING - iv_obj_name = iv_obj_name - iv_obj_type = iv_obj_type - IMPORTING - eo_adt_uri_mapper = lo_adt_uri_mapper - eo_adt_objectref = lo_adt_objref - ev_program = lv_program - ev_include = lv_include ). + EXPORTING + iv_obj_name = iv_obj_name + iv_obj_type = iv_obj_type + IMPORTING + eo_adt_uri_mapper = lo_adt_uri_mapper + eo_adt_objectref = lo_adt_objref + ev_program = lv_program + ev_include = lv_include ). TRY. IF iv_sub_obj_name IS NOT INITIAL. @@ -93,9 +108,11 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION. CONCATENATE 'adt://' sy-sysid INTO lv_adt_link. rv_result = lv_adt_link. + CATCH cx_root. zcx_abapgit_exception=>raise( 'ADT Jump Error' ). ENDTRY. + ENDMETHOD. @@ -105,6 +122,7 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION. DATA lv_obj_name TYPE trobj_name. DATA lo_object TYPE REF TO cl_wb_object. DATA lo_adt TYPE REF TO object. + FIELD-SYMBOLS TYPE string. lv_obj_name = iv_obj_name. @@ -197,4 +215,24 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION. ENDTRY. ENDMETHOD. + + + METHOD jump. + + DATA lv_adt_link TYPE string. + + TRY. + lv_adt_link = generate( + iv_obj_name = iv_obj_name + iv_obj_type = iv_obj_type + iv_sub_obj_name = iv_sub_obj_name + iv_line_number = iv_line_number ). + + zcl_abapgit_ui_factory=>get_frontend_services( )->execute( iv_document = lv_adt_link ). + + CATCH cx_root. + zcx_abapgit_exception=>raise( 'ADT Jump Error' ). + ENDTRY. + + ENDMETHOD. ENDCLASS.