From 468a1f3df8e2cad5408b812d2da91bdaf98d9900 Mon Sep 17 00:00:00 2001 From: ThomasPloski <39330834+ThomasPloski@users.noreply.github.com> Date: Wed, 13 Jan 2021 08:10:27 +0100 Subject: [PATCH] Adjustment to BDEF Object Handler (#4012) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adjustment to BDEF Object Handler Adjustment to BDEF Object Handler regarding exchange file format * fix abaplint stuff * fix abaplint issue * adaptation in deserialize method * fix abaplint issues * fixes abaplinter issues * requested changes * fix type issue * fix type issue * delete unused method FILL_METADATA_FROM_DB * enhance signature with exception information * change reference type * change to initial activation logic * change to abap step for activation * change of reference type as part of create Service Co-authored-by: Christian Günter Co-authored-by: Lars Hvam --- src/objects/zcl_abapgit_object_bdef.clas.abap | 488 ++++++++++++------ 1 file changed, 324 insertions(+), 164 deletions(-) diff --git a/src/objects/zcl_abapgit_object_bdef.clas.abap b/src/objects/zcl_abapgit_object_bdef.clas.abap index 44767d5a3..75b0ac83e 100644 --- a/src/objects/zcl_abapgit_object_bdef.clas.abap +++ b/src/objects/zcl_abapgit_object_bdef.clas.abap @@ -11,54 +11,60 @@ CLASS zcl_abapgit_object_bdef DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje RAISING zcx_abapgit_exception. + PROTECTED SECTION. PRIVATE SECTION. - METHODS: - clear_fields - CHANGING - cs_behaviour_definition TYPE any, - clear_field - IMPORTING - iv_fieldname TYPE csequence - CHANGING - cs_behaviour_definition TYPE any, - - fill_metadata_from_db - CHANGING - cs_behaviour_definition TYPE any - RAISING - zcx_abapgit_exception, - - get_transport_req_if_needed - IMPORTING - iv_package TYPE devclass - RETURNING - VALUE(rv_transport_request) TYPE trkorr - RAISING - zcx_abapgit_exception, - - get_wb_object_operator - RETURNING - VALUE(ri_wb_object_operator) TYPE REF TO object - RAISING - zcx_abapgit_exception. - - DATA: - mi_persistence TYPE REF TO if_wb_object_persist, - mi_wb_object_operator TYPE REF TO object, - mv_behaviour_definition_key TYPE seu_objkey, - mr_behaviour_definition TYPE REF TO data. + DATA mi_persistence TYPE REF TO if_wb_object_persist . + DATA mi_wb_object_operator TYPE REF TO object . + DATA mv_behaviour_definition_key TYPE seu_objkey . + DATA mr_behaviour_definition TYPE REF TO data . + METHODS clear_fields + CHANGING + !cs_metadata TYPE any . + METHODS clear_field + IMPORTING + !iv_fieldname TYPE csequence + CHANGING + !cs_metadata TYPE any . + METHODS get_transport_req_if_needed + IMPORTING + !iv_package TYPE devclass + RETURNING + VALUE(rv_transport_request) TYPE trkorr + RAISING + zcx_abapgit_exception . + METHODS get_wb_object_operator + RETURNING + VALUE(ri_wb_object_operator) TYPE REF TO object + RAISING + zcx_abapgit_exception . + METHODS merge_object_data + IMPORTING + !io_object_data TYPE REF TO object + RETURNING + VALUE(ro_object_data_merged) TYPE REF TO if_wb_object_data_model + RAISING + zcx_abapgit_exception . + METHODS get_object_data + IMPORTING + !io_xml TYPE REF TO zif_abapgit_xml_input + RETURNING + VALUE(ro_object_data) TYPE REF TO if_wb_object_data_model + RAISING + zcx_abapgit_exception . ENDCLASS. -CLASS zcl_abapgit_object_bdef IMPLEMENTATION. + +CLASS ZCL_ABAPGIT_OBJECT_BDEF IMPLEMENTATION. + METHOD clear_field. FIELD-SYMBOLS: TYPE data. - ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_behaviour_definition + ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_metadata TO . ASSERT sy-subrc = 0. @@ -69,65 +75,126 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. METHOD clear_fields. - clear_field( - EXPORTING - iv_fieldname = 'METADATA-CREATED_AT' - CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + FIELD-SYMBOLS: TYPE ANY TABLE. + FIELD-SYMBOLS: TYPE data. + FIELD-SYMBOLS TYPE any. clear_field( EXPORTING - iv_fieldname = 'METADATA-CREATED_BY' + iv_fieldname = 'VERSION' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-CHANGED_AT' + iv_fieldname = 'CREATED_AT' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-CHANGED_BY' + iv_fieldname = 'CREATED_BY' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-LANGUAGE' + iv_fieldname = 'CHANGED_AT' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-MASTER_LANGUAGE' + iv_fieldname = 'CHANGED_BY' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-MASTER_SYSTEM' + iv_fieldname = 'RESPONSIBLE' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-RESPONSIBLE' + iv_fieldname = 'PACKAGE_REF' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'METADATA-PACKAGE_REF' + iv_fieldname = 'CONTAINER_REF' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). clear_field( EXPORTING - iv_fieldname = 'CONTENT-SOURCE' + iv_fieldname = 'MASTER_SYSTEM' CHANGING - cs_behaviour_definition = cs_behaviour_definition ). + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-CHANGED_AT' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-CHANGED_BY' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-CREATED_AT' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-CREATED_BY' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-RESPONSIBLE' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-PACKAGE_REF' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-CONTAINER_REF' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MAIN_OBJECT-MASTER_SYSTEM' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'SYNTAX_CONFIGURATION' + CHANGING + cs_metadata = cs_metadata ). + + ASSIGN COMPONENT 'LINKS' OF STRUCTURE cs_metadata TO . + ASSERT sy-subrc = 0. + + LOOP AT ASSIGNING . + ASSIGN COMPONENT 'COMMON_ATTRIBUTES' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + CLEAR: . + ENDLOOP. ENDMETHOD. @@ -204,71 +271,98 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. METHOD zif_abapgit_object~deserialize. DATA: - li_object_data_model TYPE REF TO if_wb_object_data_model, - li_wb_object_operator TYPE REF TO object, + lo_object_data TYPE REF TO if_wb_object_data_model, + lo_object_data_merged TYPE REF TO if_wb_object_data_model, + lo_wb_object_operator TYPE REF TO object, lx_error TYPE REF TO cx_root, - lv_transport_request TYPE trkorr. + lv_transport_request TYPE trkorr, + lr_wbobjtype TYPE REF TO data, + lr_category TYPE REF TO data. FIELD-SYMBOLS: - TYPE any, - TYPE data. - - ASSIGN mr_behaviour_definition->* TO . - ASSERT sy-subrc = 0. - - io_xml->read( - EXPORTING - iv_name = 'BDEF' - CHANGING - cg_data = ). - - li_wb_object_operator = get_wb_object_operator( ). + TYPE any, + TYPE any, + TYPE any. TRY. - CREATE OBJECT li_object_data_model TYPE ('CL_BLUE_SOURCE_OBJECT_DATA'). - ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE - TO . - ASSERT sy-subrc = 0. + lo_object_data = get_object_data( io_xml ). + lv_transport_request = get_transport_req_if_needed( iv_package ). - = mo_files->read_string( 'asbdef' ). + CREATE DATA lr_wbobjtype TYPE ('WBOBJTYPE'). + ASSIGN lr_wbobjtype->* TO . + ASSIGN COMPONENT 'OBJTYPE_TR' OF STRUCTURE TO . + = 'BDEF'. + ASSIGN COMPONENT 'SUBTYPE_WB' OF STRUCTURE TO . + = 'BDO'. + + CREATE DATA lr_category TYPE ('WBADT_RESOURCE_CATEGORY'). + ASSIGN lr_category->* TO . + + CALL METHOD ('CL_BLUE_WB_UTILITY')=>('GET_RESOURCE_CATEGORY') + EXPORTING + is_object_type = + RECEIVING + result = . + + lo_wb_object_operator = get_wb_object_operator( ). tadir_insert( iv_package ). - lv_transport_request = get_transport_req_if_needed( iv_package ). - - IF zif_abapgit_object~exists( ) = abap_true. - - " We need to populate created_at, created_by, because otherwise update is not possible - fill_metadata_from_db( CHANGING cs_behaviour_definition = ). - li_object_data_model->set_data( ). - - CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') - EXPORTING - io_object_data = li_object_data_model - transport_request = lv_transport_request. + IF zif_abapgit_object~exists( ) = abap_false. + CASE . + WHEN '1'. "if_wb_adt_plugin_resource_co=>co_sfs_res_category_atomic. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~CREATE') + EXPORTING + io_object_data = lo_object_data + data_selection = 'AL' " if_wb_object_data_selection_co=>c_all_data + version = 'I' + package = iv_package + transport_request = lv_transport_request. + WHEN '2'. "if_wb_adt_plugin_resource_co=>co_sfs_res_category_compound_s. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~CREATE') + EXPORTING + io_object_data = lo_object_data + data_selection = 'P' " if_wb_object_data_selection_co=>c_properties + version = 'I' + package = iv_package + transport_request = lv_transport_request. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_object_data + data_selection = 'D' "if_wb_object_data_selection_co=>c_data_content + version = 'I' + transport_request = lv_transport_request. + WHEN OTHERS. + ENDCASE. ELSE. - - li_object_data_model->set_data( ). - - CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~CREATE') - EXPORTING - io_object_data = li_object_data_model - data_selection = 'P' " if_wb_object_data_selection_co=>c_properties - package = iv_package - transport_request = lv_transport_request. - - CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') - EXPORTING - io_object_data = li_object_data_model - data_selection = 'D' " if_wb_object_data_selection_co=>c_data_content - transport_request = lv_transport_request. - + lo_object_data_merged = merge_object_data( lo_object_data ). + CASE . + WHEN '1'. "if_wb_adt_plugin_resource_co=>co_sfs_res_category_atomic. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_object_data_merged + data_selection = 'AL' "if_wb_object_data_selection_co=>c_all_data + version = 'I' + transport_request = lv_transport_request. + WHEN '2'. "if_wb_adt_plugin_resource_co=>co_sfs_res_category_compound_s. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_object_data_merged + data_selection = 'P' "if_wb_object_data_selection_co=>c_properties + version = 'I' + transport_request = lv_transport_request. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_object_data_merged + data_selection = 'D' "if_wb_object_data_selection_co=>c_data_content + version = 'I' + transport_request = lv_transport_request. + WHEN OTHERS. + ENDCASE. ENDIF. - CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~ACTIVATE'). - corr_insert( iv_package ). CATCH cx_root INTO lx_error. @@ -277,6 +371,8 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. ix_previous = lx_error ). ENDTRY. + zcl_abapgit_objects_activation=>add_item( ms_item ). + ENDMETHOD. @@ -302,14 +398,13 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. METHOD zif_abapgit_object~get_deserialize_steps. - APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps. + APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps. ENDMETHOD. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). - - rs_metadata-ddic = abap_true. + rs_metadata-ddic = abap_false. rs_metadata-delete_tadir = abap_true. ENDMETHOD. @@ -321,7 +416,7 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. METHOD zif_abapgit_object~is_locked. - rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESWB_EO' + rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESDIC' iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). ENDMETHOD. @@ -357,6 +452,7 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. FIELD-SYMBOLS: TYPE any, + TYPE any, TYPE string. ASSIGN mr_behaviour_definition->* TO . @@ -372,14 +468,14 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. data = eo_object_data = li_object_data_model. - ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE - TO . + ASSIGN COMPONENT 'METADATA' OF STRUCTURE TO . ASSERT sy-subrc = 0. + clear_fields( CHANGING cs_metadata = ). + ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . + ASSERT sy-subrc = 0. lv_source = . - clear_fields( CHANGING cs_behaviour_definition = ). - CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) @@ -388,7 +484,7 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. io_xml->add( iv_name = 'BDEF' - ig_data = ). + ig_data = ). mo_files->add_string( iv_ext = 'asbdef' @@ -396,50 +492,6 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. ENDMETHOD. - METHOD fill_metadata_from_db. - - DATA: - li_wb_object_operator TYPE REF TO object, - lr_behaviour_definition_old TYPE REF TO data. - - FIELD-SYMBOLS: - TYPE any, - TYPE xsddatetime_z, - TYPE syuname, - TYPE xsddatetime_z, - TYPE syuname. - - li_wb_object_operator = get_wb_object_operator( ). - - CREATE DATA lr_behaviour_definition_old TYPE ('CL_BLUE_SOURCE_OBJECT_DATA=>TY_OBJECT_DATA'). - ASSIGN lr_behaviour_definition_old->* TO . - ASSERT sy-subrc = 0. - - CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') - IMPORTING - data = . - - ASSIGN COMPONENT 'METADATA-CREATED_BY' OF STRUCTURE cs_behaviour_definition - TO . - ASSERT sy-subrc = 0. - - ASSIGN COMPONENT 'METADATA-CREATED_AT' OF STRUCTURE cs_behaviour_definition - TO . - ASSERT sy-subrc = 0. - - ASSIGN COMPONENT 'METADATA-CREATED_BY' OF STRUCTURE - TO . - ASSERT sy-subrc = 0. - - ASSIGN COMPONENT 'METADATA-CREATED_AT' OF STRUCTURE - TO . - ASSERT sy-subrc = 0. - - = . - = . - - ENDMETHOD. - METHOD get_transport_req_if_needed. @@ -485,4 +537,112 @@ CLASS zcl_abapgit_object_bdef IMPLEMENTATION. ENDMETHOD. + + METHOD get_object_data. + + DATA: + lo_object_data TYPE REF TO object, + lr_metadata TYPE REF TO data, + lr_data TYPE REF TO data. + + FIELD-SYMBOLS: + TYPE any, + TYPE any, + TYPE any, + TYPE any. + + CREATE DATA lr_data TYPE ('CL_BLUE_SOURCE_OBJECT_DATA=>TY_OBJECT_DATA'). + ASSIGN lr_data->* TO . + ASSERT sy-subrc = 0. + + ASSIGN COMPONENT 'METADATA' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + + CREATE DATA lr_metadata TYPE ('IF_ADT_TOOLS_CORE_SOURCE_TYPES=>TY_ABAP_SOURCE_MAIN_OBJECT'). + ASSIGN lr_metadata->* TO . + ASSERT sy-subrc = 0. + + io_xml->read( + EXPORTING + iv_name = 'BDEF' + CHANGING + cg_data = ). + + = . + + ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + + = mo_files->read_string( 'asbdef' ). + + CREATE OBJECT ro_object_data TYPE ('CL_BLUE_SOURCE_OBJECT_DATA'). + + ro_object_data->set_data( p_data = ). + + ENDMETHOD. + + + METHOD merge_object_data. + + DATA: + lo_object_data TYPE REF TO object, + lo_object_data_old TYPE REF TO if_wb_object_data_model, + lr_new TYPE REF TO data, + lr_old TYPE REF TO data, + lo_wb_object_operator TYPE REF TO object, + ls_old TYPE cl_blue_source_object_data=>ty_object_data. + + FIELD-SYMBOLS: + TYPE any, + TYPE any, + TYPE any, + TYPE any. + + CREATE OBJECT lo_object_data TYPE ('CL_BLUE_SOURCE_OBJECT_DATA'). + lo_object_data = io_object_data. + + CREATE DATA lr_new TYPE ('CL_BLUE_SOURCE_OBJECT_DATA=>TY_OBJECT_DATA'). + ASSIGN lr_new->* TO . + ASSERT sy-subrc = 0. + + CREATE DATA lr_old TYPE ('CL_BLUE_SOURCE_OBJECT_DATA=>TY_OBJECT_DATA'). + ASSIGN lr_old->* TO . + ASSERT sy-subrc = 0. + + CALL METHOD lo_object_data->('IF_WB_OBJECT_DATA_MODEL~GET_DATA') + EXPORTING + p_metadata_only = abap_false + p_data_selection = 'AL' + IMPORTING + p_data = . + + lo_wb_object_operator = get_wb_object_operator( ). + + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') + EXPORTING + data_selection = 'AL' " if_wb_object_data_selection_co=>c_all_data + IMPORTING + eo_object_data = lo_object_data_old. + + CALL METHOD lo_object_data_old->('GET_DATA') + EXPORTING + p_metadata_only = abap_false + p_data_selection = 'AL' " if_wb_object_data_selection_co=>c_all_data + IMPORTING + p_data = . + + ASSIGN COMPONENT 'METADATA-DESCRIPTION' OF STRUCTURE TO . + ASSIGN COMPONENT 'METADATA-DESCRIPTION' OF STRUCTURE TO . + = . + + ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . + ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . + = . + + CREATE OBJECT ro_object_data_merged TYPE ('CL_BLUE_SOURCE_OBJECT_DATA'). + + CALL METHOD ro_object_data_merged->('SET_DATA') + EXPORTING + p_data = . + ENDMETHOD. ENDCLASS.