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 <larshp@hotmail.com>
This commit is contained in:
Mike Pokraka 2021-04-27 17:53:26 +01:00 committed by GitHub
parent 2884cf21ba
commit 58956a1059
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 317 additions and 211 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,17 @@
<?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_OBJECT_PDXX_SUPER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>PDXX - PD Objects</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>