From 58956a105913b59a52ac06572c0ac754e49d2992 Mon Sep 17 00:00:00 2001 From: Mike Pokraka Date: Tue, 27 Apr 2021 17:53:26 +0100 Subject: [PATCH] Refactor PDTS into PDXX superclass (#4717) * Add superclass * Refactor into PDXX superclass * Unit tests respect experimental indicator * Lint * Lint * Lint+CHECK misbehaving Co-authored-by: Lars Hvam --- src/objects/zcl_abapgit_object_pdts.clas.abap | 134 +-------------- ...l_abapgit_object_pdts.clas.locals_imp.abap | 4 +- ..._abapgit_object_pdts.clas.testclasses.abap | 98 ++--------- .../zcl_abapgit_object_pdxx_super.clas.abap | 158 ++++++++++++++++++ ...it_object_pdxx_super.clas.testclasses.abap | 117 +++++++++++++ .../zcl_abapgit_object_pdxx_super.clas.xml | 17 ++ 6 files changed, 317 insertions(+), 211 deletions(-) create mode 100644 src/objects/zcl_abapgit_object_pdxx_super.clas.abap create mode 100644 src/objects/zcl_abapgit_object_pdxx_super.clas.testclasses.abap create mode 100644 src/objects/zcl_abapgit_object_pdxx_super.clas.xml diff --git a/src/objects/zcl_abapgit_object_pdts.clas.abap b/src/objects/zcl_abapgit_object_pdts.clas.abap index 2fddcc21a..8ef326ed3 100644 --- a/src/objects/zcl_abapgit_object_pdts.clas.abap +++ b/src/objects/zcl_abapgit_object_pdts.clas.abap @@ -1,33 +1,27 @@ CLASS zcl_abapgit_object_pdts DEFINITION PUBLIC - INHERITING FROM zcl_abapgit_objects_super + INHERITING FROM zcl_abapgit_object_pdxx_super FINAL CREATE PUBLIC. PUBLIC SECTION. - INTERFACES zif_abapgit_object. - ALIASES mo_files FOR zif_abapgit_object~mo_files. METHODS constructor IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item iv_language TYPE spras RAISING zcx_abapgit_exception. + METHODS zif_abapgit_object~serialize REDEFINITION. + METHODS zif_abapgit_object~deserialize REDEFINITION. + + PROTECTED SECTION. + PRIVATE SECTION. - DATA ms_objkey TYPE hrsobject. DATA mv_objid TYPE hrobjid. - METHODS check_subrc_for IMPORTING iv_call TYPE clike OPTIONAL - RAISING zcx_abapgit_exception. - - METHODS is_experimental RETURNING VALUE(rv_result) TYPE abap_bool. - METHODS get_container_xml - IMPORTING - ii_task TYPE REF TO lif_task_definition - RETURNING - VALUE(ri_first_element) TYPE REF TO if_ixml_element - RAISING - zcx_abapgit_exception. + METHODS get_container_xml IMPORTING ii_task TYPE REF TO lif_task_definition + RETURNING VALUE(ri_first_element) TYPE REF TO if_ixml_element + RAISING zcx_abapgit_exception. METHODS extract_container IMPORTING io_xml TYPE REF TO zif_abapgit_xml_input RETURNING VALUE(rv_result) TYPE xstring. @@ -205,114 +199,4 @@ CLASS zcl_abapgit_object_pdts IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_object~delete. - - CALL FUNCTION 'RH_HRSOBJECT_DELETE' - EXPORTING - act_otype = 'TS' - act_objid = mv_objid - no_confirmation_msg = abap_true - EXCEPTIONS - enqueue_failed = 1 - object_not_deleted = 2 - object_not_found = 3 - OTHERS = 4. "#EC SUBRC_OK - - check_subrc_for( `RH_HRSOBJECT_DELETE` ). - - ENDMETHOD. - - - METHOD zif_abapgit_object~exists. - - CALL FUNCTION 'RH_READ_OBJECT' - EXPORTING - plvar = '01' - otype = 'TS' - objid = mv_objid - istat = '1' - begda = sy-datum - endda = '99991231' - ointerval = 'X' - read_db = 'X' - EXCEPTIONS - not_found = 1 - OTHERS = 2. - - rv_bool = boolc( sy-subrc = 0 ). - - ENDMETHOD. - - - METHOD zif_abapgit_object~is_locked. - rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'HRSOBJECT' - iv_argument = 'TS' && mv_objid ). - ENDMETHOD. - - - METHOD zif_abapgit_object~is_active. - rv_active = abap_true. - ENDMETHOD. - - - METHOD zif_abapgit_object~changed_by. - - SELECT SINGLE uname - INTO rv_user - FROM hrs1201 - WHERE otype = 'TS' AND - objid = ms_item-obj_name. - - IF sy-subrc <> 0. - rv_user = c_user_unknown. - ENDIF. - - ENDMETHOD. - - - METHOD zif_abapgit_object~jump. - CALL FUNCTION 'RS_TOOL_ACCESS_REMOTE' - STARTING NEW TASK 'GIT' - EXPORTING - operation = 'SHOW' - object_name = ms_item-obj_name - object_type = ms_item-obj_type - EXCEPTIONS - OTHERS = 0. - ENDMETHOD. - - - METHOD zif_abapgit_object~get_metadata. - rs_metadata = get_metadata( ). - ENDMETHOD. - - - METHOD zif_abapgit_object~get_comparator. - RETURN. - ENDMETHOD. - - - METHOD zif_abapgit_object~get_deserialize_steps. - APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps. - ENDMETHOD. - - - METHOD check_subrc_for. - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( iv_call && ' returned ' && sy-subrc ). - ENDIF. - ENDMETHOD. - - - METHOD is_experimental. - - DATA lo_settings TYPE REF TO zcl_abapgit_settings. - DATA lo_settings_persistence TYPE REF TO zcl_abapgit_persist_settings. - - lo_settings_persistence = zcl_abapgit_persist_settings=>get_instance( ). - lo_settings = lo_settings_persistence->read( ). - rv_result = lo_settings->get_experimental_features( ). - - ENDMETHOD. - ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_pdts.clas.locals_imp.abap b/src/objects/zcl_abapgit_object_pdts.clas.locals_imp.abap index 3ba5b0edf..b470a85ea 100644 --- a/src/objects/zcl_abapgit_object_pdts.clas.locals_imp.abap +++ b/src/objects/zcl_abapgit_object_pdts.clas.locals_imp.abap @@ -339,7 +339,7 @@ CLASS lcl_task_definition IMPLEMENTATION. no_changes_allowed = 1 OTHERS = 2 ). "#EC SUBRC_OK - check_subrc_for( `CHANGE_TEXT` ). + check_subrc_for( `CHANGE_TERM_EVENTS_COMPLETE` ). mo_taskdef->change_term_evt_bind_complete( EXPORTING @@ -348,7 +348,7 @@ CLASS lcl_task_definition IMPLEMENTATION. no_changes_allowed = 1 OTHERS = 2 ). "#EC SUBRC_OK - check_subrc_for( `CHANGE_TERM_EVENTS_COMPLETE` ). + check_subrc_for( `CHANGE_TERM_EVT_BIND_COMPLETE` ). ENDMETHOD. diff --git a/src/objects/zcl_abapgit_object_pdts.clas.testclasses.abap b/src/objects/zcl_abapgit_object_pdts.clas.testclasses.abap index 95beb7c64..0f4dc296b 100644 --- a/src/objects/zcl_abapgit_object_pdts.clas.testclasses.abap +++ b/src/objects/zcl_abapgit_object_pdts.clas.testclasses.abap @@ -1,4 +1,3 @@ - CLASS ltc_ci DEFINITION FINAL FOR TESTING DURATION MEDIUM RISK LEVEL CRITICAL. @@ -14,6 +13,10 @@ CLASS ltc_ci IMPLEMENTATION. DATA lv_repo_url TYPE string. + IF zcl_abapgit_persist_settings=>get_instance( )->read( )->get_experimental_features( ) = abap_false. + RETURN. + ENDIF. + "Use STVARV to optionally override repo in local system SELECT SINGLE low INTO lv_repo_url @@ -29,89 +32,6 @@ CLASS ltc_ci IMPLEMENTATION. ENDCLASS. -CLASS ltc_lock DEFINITION - FINAL - FOR TESTING - DURATION MEDIUM - RISK LEVEL HARMLESS. - - PRIVATE SECTION. - - CONSTANTS c_ts TYPE hr_sotype VALUE 'TS'. - - METHODS enqueue_is_detected FOR TESTING RAISING cx_static_check. - METHODS get_any_task RETURNING VALUE(rv_taskid) TYPE hrobjid. - METHODS lock_task IMPORTING iv_taskid TYPE hrobjid. - -ENDCLASS. - - -CLASS ltc_lock IMPLEMENTATION. - - METHOD enqueue_is_detected. - - DATA: lv_taskid TYPE hrobjid, - lo_cut TYPE REF TO zif_abapgit_object, - ls_item TYPE zif_abapgit_definitions=>ty_item. - - lv_taskid = get_any_task( ). - lock_task( lv_taskid ). - - ls_item-obj_type = 'PDTS'. - ls_item-obj_name = 'TS' && lv_taskid. - - CREATE OBJECT lo_cut TYPE zcl_abapgit_object_pdts - EXPORTING - is_item = ls_item - iv_language = sy-langu. - - cl_abap_unit_assert=>assert_equals( act = lo_cut->is_locked( ) - exp = abap_true ). - - CALL FUNCTION 'DEQUEUE_HRSOBJECT' - EXPORTING - objid = lv_taskid - otype = c_ts - x_objid = ' ' - x_otype = ' ' - _scope = '2'. - - ENDMETHOD. - - - METHOD get_any_task. - - SELECT SINGLE objid - INTO rv_taskid - FROM hrs1000 - WHERE otype = c_ts ##WARN_OK. "#EC CI_NOORDER #EC CI_SGLSELECT - - cl_abap_unit_assert=>assert_subrc( exp = 0 - act = sy-subrc ). - - ENDMETHOD. - - - METHOD lock_task. - - CALL FUNCTION 'ENQUEUE_HRSOBJECT' - EXPORTING - objid = iv_taskid - otype = c_ts - x_objid = ' ' - x_otype = ' ' - _scope = '2' - _wait = ' ' - EXCEPTIONS - foreign_lock = 01 - system_failure = 02. - - cl_abap_unit_assert=>assert_subrc( exp = 0 - act = sy-subrc ). - - ENDMETHOD. - -ENDCLASS. CLASS ltc_smoke_test DEFINITION FINAL FOR TESTING DURATION SHORT @@ -130,8 +50,13 @@ ENDCLASS. CLASS ltc_smoke_test IMPLEMENTATION. METHOD setup. + DATA ls_item TYPE zif_abapgit_definitions=>ty_item. + IF zcl_abapgit_persist_settings=>get_instance( )->read( )->get_experimental_features( ) = abap_false. + RETURN. + ENDIF. + ls_item-obj_type = 'PDTS'. ls_item-obj_name = '99999999'. @@ -147,6 +72,11 @@ CLASS ltc_smoke_test IMPLEMENTATION. ENDMETHOD. METHOD run_simple_methods. + + IF zcl_abapgit_persist_settings=>get_instance( )->read( )->get_experimental_features( ) = abap_false. + RETURN. + ENDIF. + mo_cut->get_comparator( ). mo_cut->get_deserialize_steps( ). mo_cut->get_metadata( ). diff --git a/src/objects/zcl_abapgit_object_pdxx_super.clas.abap b/src/objects/zcl_abapgit_object_pdxx_super.clas.abap new file mode 100644 index 000000000..60fc815bd --- /dev/null +++ b/src/objects/zcl_abapgit_object_pdxx_super.clas.abap @@ -0,0 +1,158 @@ +CLASS zcl_abapgit_object_pdxx_super DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_objects_super + ABSTRACT. + + PUBLIC SECTION. + INTERFACES zif_abapgit_object. + ALIASES mo_files FOR zif_abapgit_object~mo_files. + + METHODS constructor IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras + RAISING zcx_abapgit_exception. + + PROTECTED SECTION. + DATA ms_objkey TYPE hrsobject. + + METHODS check_subrc_for IMPORTING iv_call TYPE clike OPTIONAL + RAISING zcx_abapgit_exception. + METHODS is_experimental RETURNING VALUE(rv_result) TYPE abap_bool. + + PRIVATE SECTION. + +ENDCLASS. + + + +CLASS zcl_abapgit_object_pdxx_super IMPLEMENTATION. + + METHOD is_experimental. + + DATA lo_settings TYPE REF TO zcl_abapgit_settings. + DATA lo_settings_persistence TYPE REF TO zcl_abapgit_persist_settings. + + lo_settings_persistence = zcl_abapgit_persist_settings=>get_instance( ). + lo_settings = lo_settings_persistence->read( ). + rv_result = lo_settings->get_experimental_features( ). + + ENDMETHOD. + + METHOD check_subrc_for. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( iv_call && ' returned ' && sy-subrc ). + ENDIF. + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + CALL FUNCTION 'RH_READ_OBJECT' + EXPORTING + plvar = '01' + otype = ms_objkey-otype + objid = ms_objkey-objid + istat = '1' + begda = sy-datum + endda = '99991231' + ointerval = 'X' + read_db = 'X' + EXCEPTIONS + not_found = 1 + OTHERS = 2. + + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + METHOD zif_abapgit_object~changed_by. + + SELECT SINGLE uname + INTO rv_user + FROM hrs1201 + WHERE otype = ms_item-obj_type AND + objid = ms_item-obj_name. + + IF sy-subrc <> 0. + rv_user = c_user_unknown. + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + + CALL FUNCTION 'RH_HRSOBJECT_DELETE' + EXPORTING + act_otype = ms_objkey-otype + act_objid = ms_objkey-objid + no_confirmation_msg = abap_true + EXCEPTIONS + enqueue_failed = 1 + object_not_deleted = 2 + object_not_found = 3 + OTHERS = 4. "#EC SUBRC_OK + + check_subrc_for( `RH_HRSOBJECT_DELETE` ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~deserialize. + ASSERT 1 = 2. "Must be redefined + ENDMETHOD. + + + METHOD zif_abapgit_object~get_comparator. + RETURN. + ENDMETHOD. + + + METHOD zif_abapgit_object~get_deserialize_steps. + APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps. + ENDMETHOD. + + + METHOD zif_abapgit_object~get_metadata. + rs_metadata = get_metadata( ). + ENDMETHOD. + + + METHOD zif_abapgit_object~is_active. + rv_active = abap_true. + ENDMETHOD. + + + METHOD zif_abapgit_object~is_locked. + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'HRSOBJECT' + iv_argument = ms_objkey-otype && ms_objkey-objid ). + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + CALL FUNCTION 'RS_TOOL_ACCESS_REMOTE' + STARTING NEW TASK 'GIT' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type + EXCEPTIONS + OTHERS = 0. + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + ASSERT 1 = 2. "Must be redefined + ENDMETHOD. + + + METHOD constructor. + + super->constructor( is_item = is_item + iv_language = iv_language ). + + ms_objkey-otype = is_item-obj_type+2(2). + ms_objkey-objid = ms_item-obj_name. + + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_pdxx_super.clas.testclasses.abap b/src/objects/zcl_abapgit_object_pdxx_super.clas.testclasses.abap new file mode 100644 index 000000000..69c8c38af --- /dev/null +++ b/src/objects/zcl_abapgit_object_pdxx_super.clas.testclasses.abap @@ -0,0 +1,117 @@ +CLASS lth_object_pdxx DEFINITION INHERITING FROM zcl_abapgit_object_pdxx_super + FINAL + FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PUBLIC SECTION. + METHODS get_objkey RETURNING VALUE(rv_result) TYPE hrsobject. +ENDCLASS. + +CLASS lth_object_pdxx IMPLEMENTATION. + + METHOD get_objkey. + rv_result = ms_objkey. + ENDMETHOD. + +ENDCLASS. + +CLASS ltc_lock DEFINITION + FINAL + FOR TESTING + DURATION MEDIUM + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + + CONSTANTS c_dummy_otype TYPE hr_sotype VALUE 'XX'. + + METHODS enqueue_is_detected FOR TESTING RAISING cx_static_check. + METHODS lock_object IMPORTING iv_taskid TYPE hrobjid. + +ENDCLASS. + + +CLASS ltc_lock IMPLEMENTATION. + + METHOD enqueue_is_detected. + + CONSTANTS lc_dummy TYPE hrobjid VALUE '99999999'. + + DATA: lo_cut TYPE REF TO zif_abapgit_object, + ls_item TYPE zif_abapgit_definitions=>ty_item. + + lock_object( lc_dummy ). + + ls_item-obj_type = 'PDXX'. + ls_item-obj_name = 'XX' && lc_dummy. + + CREATE OBJECT lo_cut TYPE lth_object_pdxx + EXPORTING + is_item = ls_item + iv_language = sy-langu. + + cl_abap_unit_assert=>assert_equals( act = lo_cut->is_locked( ) + exp = abap_true ). + + CALL FUNCTION 'DEQUEUE_HRSOBJECT' + EXPORTING + objid = lc_dummy + otype = c_dummy_otype + x_objid = ' ' + x_otype = ' ' + _scope = '2'. + + ENDMETHOD. + + + METHOD lock_object. + + CALL FUNCTION 'ENQUEUE_HRSOBJECT' + EXPORTING + objid = iv_taskid + otype = c_dummy_otype + x_objid = ' ' + x_otype = ' ' + _scope = '2' + _wait = ' ' + EXCEPTIONS + foreign_lock = 01 + system_failure = 02. + + cl_abap_unit_assert=>assert_subrc( exp = 0 + act = sy-subrc ). + + ENDMETHOD. + +ENDCLASS. + +CLASS ltc_general_tests DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PRIVATE SECTION. + METHODS: + hrobj_derived_from_otype FOR TESTING RAISING cx_static_check. +ENDCLASS. + + +CLASS ltc_general_tests IMPLEMENTATION. + + METHOD hrobj_derived_from_otype. + DATA: lo_cut TYPE REF TO lth_object_pdxx, + ls_item TYPE zif_abapgit_definitions=>ty_item. + + ls_item-obj_type = 'PDZZ'. + ls_item-obj_name = 'ZZ99999999'. + + CREATE OBJECT lo_cut TYPE lth_object_pdxx + EXPORTING + is_item = ls_item + iv_language = sy-langu. + + cl_abap_unit_assert=>assert_equals( act = lo_cut->get_objkey( )-otype + exp = 'ZZ' ). + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_pdxx_super.clas.xml b/src/objects/zcl_abapgit_object_pdxx_super.clas.xml new file mode 100644 index 000000000..adb2658c4 --- /dev/null +++ b/src/objects/zcl_abapgit_object_pdxx_super.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_OBJECT_PDXX_SUPER + E + PDXX - PD Objects + 1 + X + X + X + X + + + +