Improve object handler for CDS metadata extension (DDLX) (#2816)

* fixes issue #2815

The existing object handler for CDS metadata extension (DDLX) has been reviewed by an expert.
Doing this, the following feedback has been provided:

enable existing logging capability
include environment specific logic (e.g. import of an inactive version)
improve exception handling so that the related object information can be displayed in log
assign package information to handle abap language version ina proper way
adapt lock object

* fixes saplint issues

* fixes saplint issues

* fixes saplint issues

* extract dependency injection for TADIR_INSERT

* fixes saplint issues

* zcl_abapgit_environment.clas.testclasses.abap set to master version

* changes related to code review

* redo changes

* redo changes

* back to master version
This commit is contained in:
ThomasPloski 2019-08-02 16:26:55 +02:00 committed by Lars Hvam
parent 88a5b4cd50
commit d623d20d03

View File

@ -3,28 +3,21 @@ CLASS zcl_abapgit_object_ddlx DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES zif_abapgit_object. INTERFACES zif_abapgit_object.
ALIASES mo_files FOR zif_abapgit_object~mo_files. ALIASES mo_files FOR zif_abapgit_object~mo_files.
PROTECTED SECTION.
DATA: mo_persistence TYPE REF TO if_wb_object_persist.
PRIVATE SECTION. PRIVATE SECTION.
METHODS: DATA mo_persistence TYPE REF TO if_wb_object_persist .
get_persistence METHODS get_persistence
RETURNING RETURNING
VALUE(ri_persistence) TYPE REF TO if_wb_object_persist VALUE(ri_persistence) TYPE REF TO if_wb_object_persist
RAISING RAISING
zcx_abapgit_exception, zcx_abapgit_exception .
METHODS clear_fields
clear_fields
CHANGING CHANGING
cs_data TYPE any, !cs_data TYPE any .
METHODS clear_field
clear_field
IMPORTING IMPORTING
iv_fieldname TYPE csequence !iv_fieldname TYPE csequence
CHANGING CHANGING
cs_metadata TYPE any. !cs_metadata TYPE any .
ENDCLASS. ENDCLASS.
@ -118,21 +111,19 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
METHOD zif_abapgit_object~delete. METHOD zif_abapgit_object~delete.
DATA: lv_object_key TYPE seu_objkey, DATA: lv_object_key TYPE seu_objkey,
li_data_model TYPE REF TO if_wb_object_data_model,
lx_error TYPE REF TO cx_root. lx_error TYPE REF TO cx_root.
lv_object_key = ms_item-obj_name. lv_object_key = ms_item-obj_name.
TRY. TRY.
CREATE OBJECT li_data_model TYPE ('CL_DDLX_WB_OBJECT_DATA').
get_persistence( )->delete( p_object_key = lv_object_key get_persistence( )->delete( p_object_key = lv_object_key
p_version = swbm_version_active ). p_version = swbm_version_active ).
CATCH cx_root INTO lx_error. CATCH cx_root INTO lx_error.
zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( )
ix_previous = lx_error ). ix_previous = lx_error->previous ).
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
@ -146,7 +137,8 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
FIELD-SYMBOLS: <lg_data> TYPE any, FIELD-SYMBOLS: <lg_data> TYPE any,
<lg_source> TYPE data, <lg_source> TYPE data,
<lg_version> TYPE data. <lg_version> TYPE data,
<lg_package> TYPE data.
TRY. TRY.
CREATE DATA lr_data CREATE DATA lr_data
@ -166,7 +158,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
" If the file doesn't exist that's ok, because previously " If the file doesn't exist that's ok, because previously
" the source code was stored in the xml. We are downward compatible. " the source code was stored in the xml. We are downward compatible.
<lg_source> = mo_files->read_string( 'asddlxs' ) ##no_text. <lg_source> = mo_files->read_string( 'asddlxs' ) ##no_text.
CATCH zcx_abapgit_exception. CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY. ENDTRY.
CREATE OBJECT li_data_model CREATE OBJECT li_data_model
@ -179,6 +171,12 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
" and also creates transport request entry if necessary " and also creates transport request entry if necessary
<lg_version> = 'inactive'. <lg_version> = 'inactive'.
"package needed to be able to determine ABAP language version
ASSIGN COMPONENT 'METADATA-PACKAGE_REF-NAME' OF STRUCTURE <lg_data> TO <lg_package>.
IF <lg_package> IS ASSIGNED.
<lg_package> = iv_package.
ENDIF.
li_data_model->set_data( <lg_data> ). li_data_model->set_data( <lg_data> ).
get_persistence( )->save( li_data_model ). get_persistence( )->save( li_data_model ).
@ -187,7 +185,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
CATCH cx_root INTO lx_error. CATCH cx_root INTO lx_error.
zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( )
ix_previous = lx_error ). ix_previous = lx_error->previous ).
ENDTRY. ENDTRY.
zcl_abapgit_objects_activation=>add_item( ms_item ). zcl_abapgit_objects_activation=>add_item( ms_item ).
@ -238,7 +236,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
METHOD zif_abapgit_object~is_locked. METHOD zif_abapgit_object~is_locked.
rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDICT' rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESWB_EO'
iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ).
ENDMETHOD. ENDMETHOD.
@ -279,12 +277,33 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
TYPE ('CL_DDLX_WB_OBJECT_DATA'). TYPE ('CL_DDLX_WB_OBJECT_DATA').
li_persistence = get_persistence( ). li_persistence = get_persistence( ).
IF zcl_abapgit_factory=>get_environment( )->compare_with_inactive( ) = abap_true.
"Retrieve inactive version
li_persistence->get(
EXPORTING
p_object_key = lv_object_key
p_version = swbm_version_inactive
CHANGING
p_object_data = li_data_model ).
IF li_data_model->get_object_name( ) IS INITIAL.
"Fallback: retrieve active version
li_persistence->get( li_persistence->get(
EXPORTING EXPORTING
p_object_key = lv_object_key p_object_key = lv_object_key
p_version = swbm_version_active p_version = swbm_version_active
CHANGING CHANGING
p_object_data = li_data_model ). p_object_data = li_data_model ).
ENDIF.
ELSE.
"Retrieve active version
li_persistence->get(
EXPORTING
p_object_key = lv_object_key
p_version = swbm_version_active
CHANGING
p_object_data = li_data_model ).
ENDIF.
li_data_model->get_data( li_data_model->get_data(
IMPORTING IMPORTING
@ -305,7 +324,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DDLX IMPLEMENTATION.
CATCH cx_root INTO lx_error. CATCH cx_root INTO lx_error.
zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( )
ix_previous = lx_error ). ix_previous = lx_error->previous ).
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.