abapGit/src/ui/pages/zcl_abapgit_gui_page_codi_base.clas.abap
Lars Hvam 3a1403cece
move SCI result type to interface (#6208)
Co-authored-by: abaplint[bot] <24845621+abaplint[bot]@users.noreply.github.com>
2023-04-12 14:37:33 +02:00

339 lines
11 KiB
ABAP

CLASS zcl_abapgit_gui_page_codi_base DEFINITION PUBLIC ABSTRACT INHERITING FROM zcl_abapgit_gui_page.
PUBLIC SECTION.
METHODS:
zif_abapgit_gui_event_handler~on_event
REDEFINITION.
PROTECTED SECTION.
CONSTANTS:
BEGIN OF c_actions,
rerun TYPE string VALUE 'rerun' ##NO_TEXT,
sort_1 TYPE string VALUE 'sort_1' ##NO_TEXT,
sort_2 TYPE string VALUE 'sort_2' ##NO_TEXT,
sort_3 TYPE string VALUE 'sort_3' ##NO_TEXT,
stage TYPE string VALUE 'stage' ##NO_TEXT,
commit TYPE string VALUE 'commit' ##NO_TEXT,
END OF c_actions .
DATA mo_repo TYPE REF TO zcl_abapgit_repo .
DATA mt_result TYPE zif_abapgit_code_inspector=>ty_results .
DATA mv_summary TYPE string.
METHODS render_variant
IMPORTING
!iv_variant TYPE sci_chkv
!iv_summary TYPE string
RETURNING
VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS render_result
IMPORTING
!ii_html TYPE REF TO zif_abapgit_html
!it_result TYPE zif_abapgit_code_inspector=>ty_results .
METHODS render_result_line
IMPORTING
!ii_html TYPE REF TO zif_abapgit_html
!is_result TYPE zif_abapgit_code_inspector=>ty_result .
METHODS build_nav_link
IMPORTING
!is_result TYPE zif_abapgit_code_inspector=>ty_result
RETURNING
VALUE(rv_link) TYPE string .
METHODS jump
IMPORTING
!is_item TYPE zif_abapgit_definitions=>ty_item
!is_sub_item TYPE zif_abapgit_definitions=>ty_item
!iv_line_number TYPE i
RAISING
zcx_abapgit_exception .
METHODS build_base_menu
RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
PRIVATE SECTION.
CONSTANTS c_object_separator TYPE c LENGTH 1 VALUE '|'.
CONSTANTS c_ci_sig TYPE string VALUE 'cinav:'.
ENDCLASS.
CLASS ZCL_ABAPGIT_GUI_PAGE_CODI_BASE IMPLEMENTATION.
METHOD build_base_menu.
DATA:
lo_sort_menu TYPE REF TO zcl_abapgit_html_toolbar.
CREATE OBJECT lo_sort_menu.
lo_sort_menu->add(
iv_txt = 'By Object, Check, Sub-object'
iv_act = c_actions-sort_1
)->add(
iv_txt = 'By Object, Sub-object, Line'
iv_act = c_actions-sort_2
)->add(
iv_txt = 'By Check, Object, Sub-object'
iv_act = c_actions-sort_3 ).
CREATE OBJECT ro_menu.
ro_menu->add( iv_txt = 'Sort'
io_sub = lo_sort_menu ).
ro_menu->add( iv_txt = 'Re-Run'
iv_act = c_actions-rerun
iv_cur = abap_false ).
ENDMETHOD.
METHOD build_nav_link.
rv_link = |{ c_ci_sig }| &&
|{ is_result-objtype }{ is_result-objname }| &&
|{ c_object_separator }{ is_result-sobjtype }{ is_result-sobjname }| &&
|{ c_object_separator }{ is_result-line }|.
ENDMETHOD.
METHOD jump.
DATA: lo_test TYPE REF TO cl_ci_test_root,
ls_info TYPE scir_rest,
lo_result TYPE REF TO cl_ci_result_root,
lv_adt_jump_enabled TYPE abap_bool,
lv_line_number TYPE i,
ls_item TYPE zif_abapgit_definitions=>ty_item,
ls_sub_item TYPE zif_abapgit_definitions=>ty_item.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF mt_result.
IF is_sub_item IS NOT INITIAL.
READ TABLE mt_result WITH KEY objtype = is_item-obj_type
objname = is_item-obj_name
sobjtype = is_sub_item-obj_type
sobjname = is_sub_item-obj_name
line = iv_line_number
ASSIGNING <ls_result>.
ELSE.
READ TABLE mt_result WITH KEY objtype = is_item-obj_type
objname = is_item-obj_name
line = iv_line_number
ASSIGNING <ls_result>.
ENDIF.
ASSERT <ls_result> IS ASSIGNED.
ls_item-obj_name = <ls_result>-objname.
ls_item-obj_type = <ls_result>-objtype.
ls_sub_item-obj_name = <ls_result>-sobjname.
ls_sub_item-obj_type = <ls_result>-sobjtype.
" see SCI_LCL_DYNP_530 / HANDLE_DOUBLE_CLICK
lv_adt_jump_enabled = zcl_abapgit_persist_factory=>get_settings( )->read( )->get_adt_jump_enabled( ).
TRY.
IF lv_adt_jump_enabled = abap_true.
lv_line_number = <ls_result>-line.
zcl_abapgit_objects=>jump(
is_item = ls_item
iv_sub_obj_name = ls_sub_item-obj_name
iv_line_number = lv_line_number ).
RETURN.
ENDIF.
CATCH zcx_abapgit_exception.
ENDTRY.
TRY.
CALL METHOD ('CL_CI_TESTS')=>('GET_TEST_REF')
EXPORTING
p_test = <ls_result>-test
RECEIVING
p_result = lo_test.
CATCH cx_root.
zcx_abapgit_exception=>raise( |Jump to object not supported in your NW release| ).
ENDTRY.
lo_result = lo_test->get_result_node( <ls_result>-kind ).
MOVE-CORRESPONDING <ls_result> TO ls_info.
lo_result->set_info( ls_info ).
lo_result->if_ci_test~navigate( ).
ENDMETHOD.
METHOD render_result.
CONSTANTS: lc_limit TYPE i VALUE 500.
FIELD-SYMBOLS: <ls_result> LIKE LINE OF it_result.
ii_html->add( '<div class="ci-result">' ).
LOOP AT it_result ASSIGNING <ls_result> TO lc_limit.
render_result_line(
ii_html = ii_html
is_result = <ls_result> ).
ENDLOOP.
ii_html->add( '</div>' ).
IF lines( it_result ) > lc_limit.
ii_html->add( '<div class="dummydiv warning">' ).
ii_html->add( ii_html->icon( 'exclamation-triangle' ) ).
ii_html->add( |Only first { lc_limit } findings shown in list!| ).
ii_html->add( '</div>' ).
ENDIF.
ENDMETHOD.
METHOD render_result_line.
DATA: lv_class TYPE string,
lv_obj_txt TYPE string,
lv_msg TYPE string,
lv_line TYPE i,
ls_mtdkey TYPE seocpdkey.
CASE is_result-kind.
WHEN 'E'.
lv_class = 'ci-error'.
WHEN 'W'.
lv_class = 'ci-warning'.
WHEN OTHERS.
lv_class = 'ci-info'.
ENDCASE.
lv_msg = escape( val = is_result-text
format = cl_abap_format=>e_html_attr ).
IF is_result-sobjname IS INITIAL OR
( is_result-sobjname = is_result-objname AND
is_result-sobjtype = is_result-objtype ).
lv_obj_txt = |{ is_result-objtype } { is_result-objname }|.
ELSEIF is_result-objtype = 'CLAS' OR
( is_result-objtype = 'PROG' AND NOT is_result-sobjname+30(*) IS INITIAL ).
TRY.
CASE is_result-sobjname+30(*).
WHEN 'CCDEF'.
lv_obj_txt = |CLAS { is_result-objname } : Local Definitions|.
WHEN 'CCIMP'.
lv_obj_txt = |CLAS { is_result-objname } : Local Implementations|.
WHEN 'CCMAC'.
lv_obj_txt = |CLAS { is_result-objname } : Macros|.
WHEN 'CCAU'.
lv_obj_txt = |CLAS { is_result-objname } : Test Classes|.
WHEN 'CU'.
lv_obj_txt = |CLAS { is_result-objname } : Public Section|.
WHEN 'CO'.
lv_obj_txt = |CLAS { is_result-objname } : Protected Section|.
WHEN 'CI'.
lv_obj_txt = |CLAS { is_result-objname } : Private Section|.
WHEN OTHERS.
cl_oo_classname_service=>get_method_by_include(
EXPORTING
incname = is_result-sobjname
RECEIVING
mtdkey = ls_mtdkey
EXCEPTIONS
class_not_existing = 1
method_not_existing = 2
OTHERS = 3 ).
IF sy-subrc = 0.
lv_obj_txt = |CLAS { ls_mtdkey-clsname }->{ ls_mtdkey-cpdname }|.
ELSE.
lv_obj_txt = |{ is_result-objtype } { is_result-sobjname }|.
ENDIF.
ENDCASE.
CATCH cx_root.
lv_obj_txt = ''. "use default below
ENDTRY.
ENDIF.
IF lv_obj_txt IS INITIAL.
lv_obj_txt = |{ is_result-objtype } { is_result-objname } &gt; { is_result-sobjtype } { is_result-sobjname }|.
ENDIF.
lv_line = is_result-line. " convert from numc to integer
lv_obj_txt = |{ lv_obj_txt } [ @{ lv_line } ]|.
ii_html->add( |<li class="{ lv_class }">| ).
ii_html->add_a(
iv_txt = lv_obj_txt
iv_act = build_nav_link( is_result )
iv_typ = zif_abapgit_html=>c_action_type-sapevent ).
ii_html->add( |<span>{ lv_msg }</span>| ).
ii_html->add( '</li>' ).
ENDMETHOD.
METHOD render_variant.
CREATE OBJECT ri_html TYPE zcl_abapgit_html.
ri_html->add( '<div class="ci-head">' ).
ri_html->add( |Code inspector check variant <span class="ci-variant">{ iv_variant }</span>|
&& | completed ({ iv_summary })| ).
ri_html->add( `</div>` ).
ENDMETHOD.
METHOD zif_abapgit_gui_event_handler~on_event.
DATA: ls_item TYPE zif_abapgit_definitions=>ty_item,
ls_sub_item TYPE zif_abapgit_definitions=>ty_item,
lv_temp TYPE string,
lv_main_object TYPE string,
lv_sub_object TYPE string,
lv_line_number_s TYPE string,
lv_line_number TYPE i.
lv_temp = replace( val = ii_event->mv_action
regex = |^{ c_ci_sig }|
with = `` ).
IF lv_temp <> ii_event->mv_action. " CI navigation request detected
SPLIT lv_temp AT c_object_separator INTO lv_main_object lv_sub_object lv_line_number_s.
ls_item-obj_type = lv_main_object(4).
ls_item-obj_name = lv_main_object+4(*).
IF lv_sub_object IS NOT INITIAL.
ls_sub_item-obj_type = lv_sub_object(4).
ls_sub_item-obj_name = lv_sub_object+4(*).
ENDIF.
lv_line_number = lv_line_number_s.
jump( is_item = ls_item
is_sub_item = ls_sub_item
iv_line_number = lv_line_number ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
ENDIF.
CASE ii_event->mv_action.
WHEN c_actions-sort_1.
SORT mt_result BY objtype objname test code sobjtype sobjname line col.
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_actions-sort_2.
SORT mt_result BY objtype objname sobjtype sobjname line col test code.
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_actions-sort_3.
SORT mt_result BY test code objtype objname sobjtype sobjname line col.
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
ENDCASE.
ENDMETHOD.
ENDCLASS.