abapGit/src/objects/zcl_abapgit_object_enho_hook.clas.abap
sandra rossi 6839f81c93 DIFF shown after pull ENHO of implicit enh. #2579
Issue #2579: diff still shown after pull of ENHO hooks (implicit enhancements i.e. code added at start/end of existing methods, etc.)

Reason: if the author has created and deleted implicit enhancements in the original system, the numbering doesn't start from 1 (this is the numbering we can see for the statement ENHANCEMENT, for instance ENHANCEMENT 1. ... ENDENHANCEMENT.) When pulling in another system, the numbering will start from 1, so it will differ from the source. As this enhancement number is serialized by abapGit in the XML, it will detect a difference.

Correction: the method SERIALIZE of class ZCL_ABAPGIT_OBJECT_ENHO_HOOK is changed so that to not serialize the enhancement number.
2019-03-30 03:23:26 -07:00

204 lines
7.0 KiB
ABAP

CLASS zcl_abapgit_object_enho_hook DEFINITION PUBLIC.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
is_item TYPE zif_abapgit_definitions=>ty_item
io_files TYPE REF TO zcl_abapgit_objects_files.
INTERFACES: zif_abapgit_object_enho.
PRIVATE SECTION.
TYPES: BEGIN OF ty_spaces,
full_name TYPE string.
TYPES: spaces TYPE STANDARD TABLE OF i WITH DEFAULT KEY,
END OF ty_spaces.
TYPES: ty_spaces_tt TYPE STANDARD TABLE OF ty_spaces WITH DEFAULT KEY.
DATA: ms_item TYPE zif_abapgit_definitions=>ty_item.
DATA: mo_files TYPE REF TO zcl_abapgit_objects_files.
METHODS hook_impl_deserialize
IMPORTING it_spaces TYPE ty_spaces_tt
CHANGING ct_impl TYPE enh_hook_impl_it
RAISING zcx_abapgit_exception.
METHODS hook_impl_serialize
EXPORTING et_spaces TYPE ty_spaces_tt
CHANGING ct_impl TYPE enh_hook_impl_it
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS zcl_abapgit_object_enho_hook IMPLEMENTATION.
METHOD constructor.
ms_item = is_item.
mo_files = io_files.
ENDMETHOD.
METHOD zif_abapgit_object_enho~serialize.
DATA: lv_shorttext TYPE string,
lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl,
ls_original_object TYPE enh_hook_admin,
lt_spaces TYPE ty_spaces_tt,
lt_enhancements TYPE enh_hook_impl_it.
FIELD-SYMBOLS: <ls_enhancement> LIKE LINE OF lt_enhancements.
lo_hook_impl ?= ii_enh_tool.
lv_shorttext = lo_hook_impl->if_enh_object_docu~get_shorttext( ).
lo_hook_impl->get_original_object(
IMPORTING
pgmid = ls_original_object-pgmid
obj_name = ls_original_object-org_obj_name
obj_type = ls_original_object-org_obj_type
main_type = ls_original_object-org_main_type
main_name = ls_original_object-org_main_name
program = ls_original_object-programname ).
ls_original_object-include_bound = lo_hook_impl->get_include_bound( ).
lt_enhancements = lo_hook_impl->get_hook_impls( ).
LOOP AT lt_enhancements ASSIGNING <ls_enhancement>.
CLEAR: <ls_enhancement>-extid,
<ls_enhancement>-id.
ENDLOOP.
hook_impl_serialize(
IMPORTING et_spaces = lt_spaces
CHANGING ct_impl = lt_enhancements ).
io_xml->add( iv_name = 'TOOL'
ig_data = ii_enh_tool->get_tool( ) ).
io_xml->add( ig_data = lv_shorttext
iv_name = 'SHORTTEXT' ).
io_xml->add( ig_data = ls_original_object
iv_name = 'ORIGINAL_OBJECT' ).
io_xml->add( iv_name = 'ENHANCEMENTS'
ig_data = lt_enhancements ).
io_xml->add( iv_name = 'SPACES'
ig_data = lt_spaces ).
ENDMETHOD.
METHOD hook_impl_serialize.
* handle normalization of XML values
* i.e. remove leading spaces
FIELD-SYMBOLS: <ls_impl> LIKE LINE OF ct_impl,
<ls_space> LIKE LINE OF et_spaces,
<lv_space> TYPE i,
<lv_line> TYPE string.
LOOP AT ct_impl ASSIGNING <ls_impl>.
APPEND INITIAL LINE TO et_spaces ASSIGNING <ls_space>.
<ls_space>-full_name = <ls_impl>-full_name.
LOOP AT <ls_impl>-source ASSIGNING <lv_line>.
APPEND INITIAL LINE TO <ls_space>-spaces ASSIGNING <lv_space>.
WHILE strlen( <lv_line> ) >= 1 AND <lv_line>(1) = ` `.
<lv_line> = <lv_line>+1.
<lv_space> = <lv_space> + 1.
ENDWHILE.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
METHOD hook_impl_deserialize.
FIELD-SYMBOLS: <ls_impl> LIKE LINE OF ct_impl,
<lv_line> TYPE string,
<lv_space> TYPE i,
<ls_spaces> LIKE LINE OF it_spaces.
LOOP AT ct_impl ASSIGNING <ls_impl>.
READ TABLE it_spaces ASSIGNING <ls_spaces> WITH KEY full_name = <ls_impl>-full_name.
IF sy-subrc = 0.
LOOP AT <ls_impl>-source ASSIGNING <lv_line>.
READ TABLE <ls_spaces>-spaces ASSIGNING <lv_space> INDEX sy-tabix.
IF sy-subrc = 0 AND <lv_space> > 0.
DO <lv_space> TIMES.
CONCATENATE space <lv_line> INTO <lv_line> RESPECTING BLANKS.
ENDDO.
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_object_enho~deserialize.
DATA: lv_shorttext TYPE string,
lo_hook_impl TYPE REF TO cl_enh_tool_hook_impl,
li_tool TYPE REF TO if_enh_tool,
lv_enhname TYPE enhname,
lv_package TYPE devclass,
ls_original_object TYPE enh_hook_admin,
lt_spaces TYPE ty_spaces_tt,
lt_enhancements TYPE enh_hook_impl_it,
lx_enh_root TYPE REF TO cx_enh_root.
FIELD-SYMBOLS: <ls_enhancement> LIKE LINE OF lt_enhancements.
io_xml->read( EXPORTING iv_name = 'SHORTTEXT'
CHANGING cg_data = lv_shorttext ).
io_xml->read( EXPORTING iv_name = 'ORIGINAL_OBJECT'
CHANGING cg_data = ls_original_object ).
io_xml->read( EXPORTING iv_name = 'ENHANCEMENTS'
CHANGING cg_data = lt_enhancements ).
io_xml->read( EXPORTING iv_name = 'SPACES'
CHANGING cg_data = lt_spaces ).
hook_impl_deserialize( EXPORTING it_spaces = lt_spaces
CHANGING ct_impl = lt_enhancements ).
lv_enhname = ms_item-obj_name.
lv_package = iv_package.
TRY.
cl_enh_factory=>create_enhancement(
EXPORTING
enhname = lv_enhname
enhtype = cl_abstract_enh_tool_redef=>credefinition
enhtooltype = cl_enh_tool_hook_impl=>tooltype
IMPORTING
enhancement = li_tool
CHANGING
devclass = lv_package ).
lo_hook_impl ?= li_tool.
lo_hook_impl->if_enh_object_docu~set_shorttext( lv_shorttext ).
lo_hook_impl->set_original_object(
pgmid = ls_original_object-pgmid
obj_name = ls_original_object-org_obj_name
obj_type = ls_original_object-org_obj_type
program = ls_original_object-programname
main_type = ls_original_object-org_main_type
main_name = ls_original_object-org_main_name ).
lo_hook_impl->set_include_bound( ls_original_object-include_bound ).
LOOP AT lt_enhancements ASSIGNING <ls_enhancement>.
lo_hook_impl->add_hook_impl(
overwrite = <ls_enhancement>-overwrite
method = <ls_enhancement>-method
enhmode = <ls_enhancement>-enhmode
full_name = <ls_enhancement>-full_name
source = <ls_enhancement>-source
spot = <ls_enhancement>-spotname
parent_full_name = <ls_enhancement>-parent_full_name ).
ENDLOOP.
lo_hook_impl->if_enh_object~save( run_dark = abap_true ).
lo_hook_impl->if_enh_object~unlock( ).
CATCH cx_enh_root INTO lx_enh_root.
zcx_abapgit_exception=>raise( lx_enh_root->get_text( ) ).
ENDTRY.
ENDMETHOD.
ENDCLASS.