From 17f5585ead4db74f83f65a736d56d44f2b6fa61b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20G=C3=BCnter?= Date: Mon, 22 Jan 2018 20:43:28 +0100 Subject: [PATCH] lcl_requirement_helper to global --- .../zcl_abapgit_requirement_helper.clas.abap | 236 ++++++++++++++++++ .../zcl_abapgit_requirement_helper.clas.xml | 56 +++++ src/zabapgit_repo_impl.prog.abap | 4 +- src/zabapgit_requirements.prog.abap | 218 +--------------- 4 files changed, 295 insertions(+), 219 deletions(-) create mode 100644 src/utils/zcl_abapgit_requirement_helper.clas.abap create mode 100644 src/utils/zcl_abapgit_requirement_helper.clas.xml diff --git a/src/utils/zcl_abapgit_requirement_helper.clas.abap b/src/utils/zcl_abapgit_requirement_helper.clas.abap new file mode 100644 index 000000000..22d21130b --- /dev/null +++ b/src/utils/zcl_abapgit_requirement_helper.clas.abap @@ -0,0 +1,236 @@ +CLASS zcl_abapgit_requirement_helper DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + TYPES: + BEGIN OF ty_requirement_status, + met TYPE abap_bool, + component TYPE dlvunit, + description TYPE text80, + installed_release TYPE saprelease, + installed_patch TYPE sappatchlv, + required_release TYPE saprelease, + required_patch TYPE sappatchlv, + END OF ty_requirement_status . + + TYPES: + ty_requirement_status_tt TYPE STANDARD TABLE OF ty_requirement_status WITH DEFAULT KEY . + + CLASS-METHODS: + check_requirements + IMPORTING + !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt + !iv_show_popup TYPE abap_bool DEFAULT abap_true + RAISING + zcx_abapgit_exception, + + get_requirement_met_status + IMPORTING + !it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt + RETURNING + VALUE(rt_status) TYPE ty_requirement_status_tt + RAISING + zcx_abapgit_exception . + + PRIVATE SECTION. + + CLASS-METHODS: + show_requirement_popup + IMPORTING + !it_requirements TYPE ty_requirement_status_tt + RAISING + zcx_abapgit_exception, + + version_greater_or_equal + IMPORTING + !is_status TYPE ty_requirement_status + RETURNING + VALUE(rv_true) TYPE abap_bool . + +ENDCLASS. + + + +CLASS zcl_abapgit_requirement_helper IMPLEMENTATION. + + + METHOD check_requirements. + + DATA: lt_met_status TYPE ty_requirement_status_tt, + lv_answer TYPE c LENGTH 1. + + lt_met_status = get_requirement_met_status( it_requirements ). + + IF iv_show_popup = abap_true. + show_requirement_popup( lt_met_status ). + ENDIF. + + LOOP AT lt_met_status TRANSPORTING NO FIELDS WHERE met = abap_false. + EXIT. + ENDLOOP. + + IF sy-subrc = 0. + CALL FUNCTION 'POPUP_TO_CONFIRM' + EXPORTING + text_question = 'The project has unmet requirements. Do you want to continue?' + IMPORTING + answer = lv_answer. + IF lv_answer <> '1'. + zcx_abapgit_exception=>raise( 'Cancelling because of unmet requirements.' ). + ENDIF. + ENDIF. + + ENDMETHOD. + + + METHOD get_requirement_met_status. + + + DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu. + + FIELD-SYMBOLS: TYPE zif_abapgit_dot_abapgit=>ty_requirement, + TYPE ty_requirement_status, + TYPE cvers_sdu. + + + CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS' + TABLES + tt_comptab = lt_installed + EXCEPTIONS + no_release_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ) ##no_text. + ENDIF. + + LOOP AT it_requirements ASSIGNING . + APPEND INITIAL LINE TO rt_status ASSIGNING . + -component = -component. + -required_release = -min_release. + -required_patch = -min_patch. + + READ TABLE lt_installed WITH KEY component = -component + ASSIGNING . + IF sy-subrc = 0. + " Component is installed, requirement is met if the installed version is greater or equal + " to the required one. + -installed_release = -release. + -installed_patch = -extrelease. + -description = -desc_text. + -met = version_greater_or_equal( ). + ELSE. + " Component is not installed at all + -met = abap_false. + ENDIF. + + UNASSIGN . + ENDLOOP. + + ENDMETHOD. + + + METHOD show_requirement_popup. + + + TYPES: BEGIN OF lty_color_line, + color TYPE lvc_t_scol. + INCLUDE TYPE ty_requirement_status. + TYPES: END OF lty_color_line, + lty_color_tab TYPE STANDARD TABLE OF lty_color_line WITH DEFAULT KEY. + + DATA: lo_alv TYPE REF TO cl_salv_table, + lo_column TYPE REF TO cl_salv_column, + lo_columns TYPE REF TO cl_salv_columns_table, + lt_color_table TYPE lty_color_tab, + lt_color_negative TYPE lvc_t_scol, + lt_color_positive TYPE lvc_t_scol, + ls_color TYPE lvc_s_scol, + lx_ex TYPE REF TO cx_root. + + FIELD-SYMBOLS: TYPE lty_color_line, + LIKE LINE OF it_requirements. + + + ls_color-color-col = col_negative. + APPEND ls_color TO lt_color_negative. + + ls_color-color-col = col_positive. + APPEND ls_color TO lt_color_positive. + + CLEAR ls_color. + + LOOP AT it_requirements ASSIGNING . + APPEND INITIAL LINE TO lt_color_table ASSIGNING . + MOVE-CORRESPONDING TO . + ENDLOOP. + + LOOP AT lt_color_table ASSIGNING . + IF -met = abap_false. + -color = lt_color_negative. + ELSE. + -color = lt_color_positive. + ENDIF. + ENDLOOP. + UNASSIGN . + + TRY. + cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv + CHANGING t_table = lt_color_table ). + + lo_columns = lo_alv->get_columns( ). + lo_columns->get_column( 'MET' )->set_short_text( 'Met' ). + lo_columns->set_color_column( 'COLOR' ). + lo_columns->set_optimize( ). + + lo_column = lo_columns->get_column( 'REQUIRED_RELEASE' ). +* lo_column->set_fixed_header_text( 'S' ). + lo_column->set_short_text( 'Req. Rel.' ). + + lo_column = lo_columns->get_column( 'REQUIRED_PATCH' ). +* lo_column->set_fixed_header_text( 'S' ). + lo_column->set_short_text( 'Req. SP L.' ). + + lo_alv->set_screen_popup( start_column = 30 + end_column = 100 + start_line = 10 + end_line = 20 ). + lo_alv->get_display_settings( )->set_list_header( 'Requirements' ). + lo_alv->display( ). + + CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex. + zcx_abapgit_exception=>raise( lx_ex->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + + METHOD version_greater_or_equal. + + DATA: lv_number TYPE numc4 ##NEEDED. + + TRY. + MOVE EXACT: is_status-installed_release TO lv_number, + is_status-installed_patch TO lv_number, + is_status-required_release TO lv_number, + is_status-required_patch TO lv_number. + CATCH cx_sy_conversion_error. + " Cannot compare by number, assume requirement not fullfilled (user can force install + " anyways if this was an error) + rv_true = abap_false. + RETURN. + ENDTRY. + + " Versions are comparable by number, compare release and if necessary patch level + IF is_status-installed_release > is_status-required_release + OR ( is_status-installed_release = is_status-required_release + AND ( is_status-required_patch IS INITIAL OR + is_status-installed_patch >= is_status-required_patch ) ). + + rv_true = abap_true. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/utils/zcl_abapgit_requirement_helper.clas.xml b/src/utils/zcl_abapgit_requirement_helper.clas.xml new file mode 100644 index 000000000..b3883eb7c --- /dev/null +++ b/src/utils/zcl_abapgit_requirement_helper.clas.xml @@ -0,0 +1,56 @@ + + + + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + 1 + E + 2 + 1 + X + X + X + X + + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + CHECK_REQUIREMENTS + E + CHECK_REQUIREMENTS + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + GET_REQUIREMENT_MET_STATUS + E + GET_REQUIREMENT_MET_STATUS + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + SHOW_REQUIREMENT_POPUP + E + SHOW_REQUIREMENT_POPUP + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + TY_REQUIREMENT_STATUS + E + TY_REQUIREMENT_STATUS + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + TY_REQUIREMENT_STATUS_TT + E + TY_REQUIREMENT_STATUS_TT + + + ZCL_ABAPGIT_REQUIREMENT_HELPER + VERSION_GREATER_OR_EQUAL + E + VERSION_GREATER_OR_EQUAL + + + + + diff --git a/src/zabapgit_repo_impl.prog.abap b/src/zabapgit_repo_impl.prog.abap index 0f208f423..c95ce13a4 100644 --- a/src/zabapgit_repo_impl.prog.abap +++ b/src/zabapgit_repo_impl.prog.abap @@ -569,8 +569,8 @@ CLASS lcl_repo IMPLEMENTATION. lt_requirements = get_dot_abapgit( )->get_data( )-requirements. IF lt_requirements IS NOT INITIAL. - lcl_requirement_helper=>check_requirements( it_requirements = lt_requirements - iv_show_popup = abap_true ). + zcl_abapgit_requirement_helper=>check_requirements( it_requirements = lt_requirements + iv_show_popup = abap_true ). ENDIF. TRY. diff --git a/src/zabapgit_requirements.prog.abap b/src/zabapgit_requirements.prog.abap index daf9489c3..550fc0502 100644 --- a/src/zabapgit_requirements.prog.abap +++ b/src/zabapgit_requirements.prog.abap @@ -2,220 +2,4 @@ *& Include zabapgit_requirements *&---------------------------------------------------------------------* -*----------------------------------------------------------------------* -* CLASS lcl_requirement_helper DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_requirement_helper DEFINITION FINAL. - PUBLIC SECTION. - TYPES: - BEGIN OF ty_requirement_status, - met TYPE abap_bool, - component TYPE dlvunit, - description TYPE text80, - installed_release TYPE saprelease, - installed_patch TYPE sappatchlv, - required_release TYPE saprelease, - required_patch TYPE sappatchlv, - END OF ty_requirement_status, - ty_requirement_status_tt TYPE STANDARD TABLE OF ty_requirement_status WITH DEFAULT KEY. - CLASS-METHODS: - "! Check if the given requirements are met with user interaction - "!

- "! Shows a popup if requested and asks the user if he wants to continue if there are unmet - "! requirements. If not an exception is raised. - "!

- "! @parameter it_requirements | The requirements to check - "! @parameter iv_show_popup | Show popup with requirements - "! @raising zcx_abapgit_exception | Cancelled by user or internal error - check_requirements IMPORTING it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt - iv_show_popup TYPE abap_bool DEFAULT abap_true - RAISING zcx_abapgit_exception, - "! Get a table with information about each requirement - "! @parameter it_requirements | Requirements - "! @parameter rt_status | Result - "! @raising zcx_abapgit_exception | Internal error - get_requirement_met_status IMPORTING it_requirements TYPE zif_abapgit_dot_abapgit=>ty_requirement_tt - RETURNING VALUE(rt_status) TYPE ty_requirement_status_tt - RAISING zcx_abapgit_exception. - PRIVATE SECTION. - CLASS-METHODS: - show_requirement_popup IMPORTING it_requirements TYPE ty_requirement_status_tt - RAISING zcx_abapgit_exception, - version_greater_or_equal IMPORTING is_status TYPE ty_requirement_status - RETURNING VALUE(rv_true) TYPE abap_bool. -ENDCLASS. "lcl_requirement_helper DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_requirement_helper IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_requirement_helper IMPLEMENTATION. - METHOD check_requirements. - DATA: lt_met_status TYPE ty_requirement_status_tt, - lv_answer TYPE c LENGTH 1. - - lt_met_status = get_requirement_met_status( it_requirements ). - - IF iv_show_popup = abap_true. - show_requirement_popup( lt_met_status ). - ENDIF. - - LOOP AT lt_met_status TRANSPORTING NO FIELDS WHERE met = abap_false. - EXIT. - ENDLOOP. - - IF sy-subrc = 0. - CALL FUNCTION 'POPUP_TO_CONFIRM' - EXPORTING - text_question = 'The project has unmet requirements. Do you want to continue?' - IMPORTING - answer = lv_answer. - IF lv_answer <> '1'. - zcx_abapgit_exception=>raise( 'Cancelling because of unmet requirements.' ). - ENDIF. - ENDIF. - ENDMETHOD. "check_requirements - - METHOD get_requirement_met_status. - - DATA: lt_installed TYPE STANDARD TABLE OF cvers_sdu. - - FIELD-SYMBOLS: TYPE zif_abapgit_dot_abapgit=>ty_requirement, - TYPE ty_requirement_status, - TYPE cvers_sdu. - - - CALL FUNCTION 'DELIVERY_GET_INSTALLED_COMPS' - TABLES - tt_comptab = lt_installed - EXCEPTIONS - no_release_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( |Error from DELIVERY_GET_INSTALLED_COMPS { sy-subrc }| ) ##no_text. - ENDIF. - - LOOP AT it_requirements ASSIGNING . - APPEND INITIAL LINE TO rt_status ASSIGNING . - -component = -component. - -required_release = -min_release. - -required_patch = -min_patch. - - READ TABLE lt_installed WITH KEY component = -component - ASSIGNING . - IF sy-subrc = 0. - " Component is installed, requirement is met if the installed version is greater or equal - " to the required one. - -installed_release = -release. - -installed_patch = -extrelease. - -description = -desc_text. - -met = version_greater_or_equal( ). - ELSE. - " Component is not installed at all - -met = abap_false. - ENDIF. - - UNASSIGN . - ENDLOOP. - ENDMETHOD. "get_requirement_met_status - - METHOD version_greater_or_equal. - DATA: lv_number TYPE numc4 ##NEEDED. - - TRY. - MOVE EXACT: is_status-installed_release TO lv_number, - is_status-installed_patch TO lv_number, - is_status-required_release TO lv_number, - is_status-required_patch TO lv_number. - CATCH cx_sy_conversion_error. - " Cannot compare by number, assume requirement not fullfilled (user can force install - " anyways if this was an error) - rv_true = abap_false. - RETURN. - ENDTRY. - - " Versions are comparable by number, compare release and if necessary patch level - IF is_status-installed_release > is_status-required_release - OR ( is_status-installed_release = is_status-required_release - AND ( is_status-required_patch IS INITIAL OR - is_status-installed_patch >= is_status-required_patch ) ). - - rv_true = abap_true. - ENDIF. - ENDMETHOD. "version_greater_or_equal - - METHOD show_requirement_popup. - - TYPES: BEGIN OF lty_color_line, - color TYPE lvc_t_scol. - INCLUDE TYPE ty_requirement_status. - TYPES: END OF lty_color_line, - lty_color_tab TYPE STANDARD TABLE OF lty_color_line WITH DEFAULT KEY. - - DATA: lo_alv TYPE REF TO cl_salv_table, - lo_column TYPE REF TO cl_salv_column, - lo_columns TYPE REF TO cl_salv_columns_table, - lt_color_table TYPE lty_color_tab, - lt_color_negative TYPE lvc_t_scol, - lt_color_positive TYPE lvc_t_scol, - ls_color TYPE lvc_s_scol, - lx_ex TYPE REF TO cx_root. - - FIELD-SYMBOLS: TYPE lty_color_line, - LIKE LINE OF it_requirements. - - - ls_color-color-col = col_negative. - APPEND ls_color TO lt_color_negative. - - ls_color-color-col = col_positive. - APPEND ls_color TO lt_color_positive. - - CLEAR ls_color. - - LOOP AT it_requirements ASSIGNING . - APPEND INITIAL LINE TO lt_color_table ASSIGNING . - MOVE-CORRESPONDING TO . - ENDLOOP. - - LOOP AT lt_color_table ASSIGNING . - IF -met = abap_false. - -color = lt_color_negative. - ELSE. - -color = lt_color_positive. - ENDIF. - ENDLOOP. - UNASSIGN . - - TRY. - cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv - CHANGING t_table = lt_color_table ). - - lo_columns = lo_alv->get_columns( ). - lo_columns->get_column( 'MET' )->set_short_text( 'Met' ). - lo_columns->set_color_column( 'COLOR' ). - lo_columns->set_optimize( ). - - lo_column = lo_columns->get_column( 'REQUIRED_RELEASE' ). -* lo_column->set_fixed_header_text( 'S' ). - lo_column->set_short_text( 'Req. Rel.' ). - - lo_column = lo_columns->get_column( 'REQUIRED_PATCH' ). -* lo_column->set_fixed_header_text( 'S' ). - lo_column->set_short_text( 'Req. SP L.' ). - - lo_alv->set_screen_popup( start_column = 30 - end_column = 100 - start_line = 10 - end_line = 20 ). - lo_alv->get_display_settings( )->set_list_header( 'Requirements' ). - lo_alv->display( ). - - CATCH cx_salv_msg cx_salv_not_found cx_salv_data_error INTO lx_ex. - zcx_abapgit_exception=>raise( lx_ex->get_text( ) ). - ENDTRY. - ENDMETHOD. "show_requirement_popup -ENDCLASS. "lcl_requirement_helper IMPLEMENTATION +* todo, include will be deleted later