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
This commit is contained in:
Marc Bernard 2021-11-07 02:15:08 -05:00 committed by GitHub
parent 9f689e4e4f
commit a37cf58e01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 338 additions and 97 deletions

View File

@ -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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_GUI_JUMPER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI Jump</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -898,14 +898,15 @@ CLASS zcl_abapgit_objects IMPLEMENTATION.
METHOD jump. METHOD jump.
DATA: li_obj TYPE REF TO zif_abapgit_object, DATA: li_obj TYPE REF TO zif_abapgit_object,
lv_adt_jump_enabled TYPE abap_bool. lv_exit TYPE abap_bool.
" Nothing to do for unsupported objects " Nothing to do for unsupported objects
IF is_type_supported( is_item-obj_type ) = abap_false. 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| ). zcx_abapgit_exception=>raise( |Object type { is_item-obj_type } is not supported by this system| ).
ENDIF. ENDIF.
" Nothing to do if object does not exist
li_obj = create_object( is_item = is_item li_obj = create_object( is_item = is_item
iv_language = zif_abapgit_definitions=>c_english ). 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| ). zcx_abapgit_exception=>raise( |Object { is_item-obj_type } { is_item-obj_name } doesn't exist| ).
ENDIF. 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. " If all fails, try object-specific handler
IF lv_exit IS INITIAL.
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.
li_obj->jump( ). li_obj->jump( ).
ENDIF. ENDIF.

View File

@ -295,23 +295,11 @@ CLASS zcl_abapgit_objects_super IMPLEMENTATION.
METHOD jump_adt. METHOD jump_adt.
DATA: lv_adt_link TYPE string, zcl_abapgit_adt_link=>jump(
lx_error TYPE REF TO cx_root. iv_obj_name = iv_obj_name
iv_obj_type = iv_obj_type
TRY. iv_sub_obj_name = iv_sub_obj_name
iv_line_number = iv_line_number ).
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.
ENDMETHOD. ENDMETHOD.

View File

@ -830,8 +830,8 @@ CLASS zcl_abapgit_gui_page_diff IMPLEMENTATION.
METHOD render_diff_head. METHOD render_diff_head.
DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count, DATA: ls_stats TYPE zif_abapgit_definitions=>ty_count,
lv_adt_link TYPE string. lv_link TYPE string.
CREATE OBJECT ri_html TYPE zcl_abapgit_html. 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 IF NOT ( is_diff-lstate = zif_abapgit_definitions=>c_state-unchanged AND
is_diff-rstate = zif_abapgit_definitions=>c_state-added ) AND is_diff-rstate = zif_abapgit_definitions=>c_state-added ) AND
NOT is_diff-lstate = zif_abapgit_definitions=>c_state-deleted. 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_txt = |{ is_diff-path }{ is_diff-filename }|
iv_typ = zif_abapgit_html=>c_action_type-sapevent iv_typ = zif_abapgit_html=>c_action_type-sapevent
iv_act = |jump?TYPE={ is_diff-obj_type }&NAME={ is_diff-obj_name }| ). iv_act = |jump?TYPE={ is_diff-obj_type }&NAME={ is_diff-obj_name }| ).
ENDIF. ENDIF.
IF lv_adt_link IS NOT INITIAL. IF lv_link IS NOT INITIAL.
ri_html->add( |<span class="diff_name">{ lv_adt_link }</span>| ). ri_html->add( |<span class="diff_name">{ lv_link }</span>| ).
ELSE. ELSE.
ri_html->add( |<span class="diff_name">{ is_diff-path }{ is_diff-filename }</span>| ). ri_html->add( |<span class="diff_name">{ is_diff-path }{ is_diff-filename }</span>| ).
ENDIF. ENDIF.

View File

@ -38,6 +38,9 @@ CLASS zcl_abapgit_ui_factory DEFINITION
!iv_disable_query_table TYPE abap_bool DEFAULT abap_true !iv_disable_query_table TYPE abap_bool DEFAULT abap_true
RETURNING RETURNING
VALUE(ri_viewer) TYPE REF TO zif_abapgit_html_viewer . 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. PROTECTED SECTION.
PRIVATE 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 go_gui TYPE REF TO zcl_abapgit_gui .
CLASS-DATA gi_fe_services TYPE REF TO zif_abapgit_frontend_services . 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_services TYPE REF TO zif_abapgit_gui_services .
CLASS-DATA gi_gui_jumper TYPE REF TO zif_abapgit_gui_jumper .
ENDCLASS. ENDCLASS.
@ -173,6 +177,17 @@ CLASS zcl_abapgit_ui_factory IMPLEMENTATION.
ENDMETHOD. 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. METHOD get_gui_services.
IF gi_gui_services IS NOT BOUND. IF gi_gui_services IS NOT BOUND.
gi_gui_services ?= get_gui( ). gi_gui_services ?= get_gui( ).

View File

@ -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.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_GUI_JUMPER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - GUI Jump</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -1,10 +1,21 @@
CLASS zcl_abapgit_adt_link DEFINITION CLASS zcl_abapgit_adt_link DEFINITION
PUBLIC PUBLIC
FINAL FINAL
CREATE PUBLIC . CREATE PUBLIC.
PUBLIC SECTION. 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 CLASS-METHODS generate
IMPORTING IMPORTING
!iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name !iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
@ -14,54 +25,58 @@ CLASS zcl_abapgit_adt_link DEFINITION
RETURNING RETURNING
VALUE(rv_result) TYPE string VALUE(rv_result) TYPE string
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception.
PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
CLASS-METHODS:
get_adt_objects_and_names CLASS-METHODS get_adt_objects_and_names
IMPORTING IMPORTING
iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name iv_obj_name TYPE zif_abapgit_definitions=>ty_item-obj_name
iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type iv_obj_type TYPE zif_abapgit_definitions=>ty_item-obj_type
EXPORTING EXPORTING
eo_adt_uri_mapper TYPE REF TO object eo_adt_uri_mapper TYPE REF TO object
eo_adt_objectref TYPE REF TO object eo_adt_objectref TYPE REF TO object
ev_program TYPE progname ev_program TYPE progname
ev_include TYPE progname ev_include TYPE progname
RAISING RAISING
zcx_abapgit_exception. 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. ENDCLASS.
CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION. CLASS zcl_abapgit_adt_link IMPLEMENTATION.
METHOD generate. METHOD generate.
DATA: lv_adt_link TYPE string. DATA: lv_adt_link TYPE string.
DATA: lo_adt_uri_mapper TYPE REF TO object ##needed. DATA: lo_adt_uri_mapper TYPE REF TO object.
DATA: lo_adt_objref TYPE REF TO object ##needed. DATA: lo_adt_objref TYPE REF TO object.
DATA: lo_adt_sub_objref TYPE REF TO object ##needed. DATA: lo_adt_sub_objref TYPE REF TO object.
DATA: lv_program TYPE progname. DATA: lv_program TYPE progname.
DATA: lv_include TYPE progname. DATA: lv_include TYPE progname.
FIELD-SYMBOLS: <lv_uri> TYPE string. FIELD-SYMBOLS: <lv_uri> TYPE string.
get_adt_objects_and_names( get_adt_objects_and_names(
EXPORTING EXPORTING
iv_obj_name = iv_obj_name iv_obj_name = iv_obj_name
iv_obj_type = iv_obj_type iv_obj_type = iv_obj_type
IMPORTING IMPORTING
eo_adt_uri_mapper = lo_adt_uri_mapper eo_adt_uri_mapper = lo_adt_uri_mapper
eo_adt_objectref = lo_adt_objref eo_adt_objectref = lo_adt_objref
ev_program = lv_program ev_program = lv_program
ev_include = lv_include ). ev_include = lv_include ).
TRY. TRY.
IF iv_sub_obj_name IS NOT INITIAL. IF iv_sub_obj_name IS NOT INITIAL.
@ -93,9 +108,11 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
CONCATENATE 'adt://' sy-sysid <lv_uri> INTO lv_adt_link. CONCATENATE 'adt://' sy-sysid <lv_uri> INTO lv_adt_link.
rv_result = lv_adt_link. rv_result = lv_adt_link.
CATCH cx_root. CATCH cx_root.
zcx_abapgit_exception=>raise( 'ADT Jump Error' ). zcx_abapgit_exception=>raise( 'ADT Jump Error' ).
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
@ -105,6 +122,7 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
DATA lv_obj_name TYPE trobj_name. DATA lv_obj_name TYPE trobj_name.
DATA lo_object TYPE REF TO cl_wb_object. DATA lo_object TYPE REF TO cl_wb_object.
DATA lo_adt TYPE REF TO object. DATA lo_adt TYPE REF TO object.
FIELD-SYMBOLS <lv_uri> TYPE string. FIELD-SYMBOLS <lv_uri> TYPE string.
lv_obj_name = iv_obj_name. lv_obj_name = iv_obj_name.
@ -197,4 +215,24 @@ CLASS ZCL_ABAPGIT_ADT_LINK IMPLEMENTATION.
ENDTRY. ENDTRY.
ENDMETHOD. 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. ENDCLASS.