diff --git a/src/objects/zcl_abapgit_object_srvd.clas.abap b/src/objects/zcl_abapgit_object_srvd.clas.abap index f26f5e134..c00503ac3 100644 --- a/src/objects/zcl_abapgit_object_srvd.clas.abap +++ b/src/objects/zcl_abapgit_object_srvd.clas.abap @@ -13,114 +13,94 @@ CLASS zcl_abapgit_object_srvd DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje PROTECTED SECTION. - PRIVATE SECTION. - METHODS: - clear_fields - CHANGING - cs_service_definition TYPE any, - clear_field - IMPORTING - iv_fieldname TYPE csequence - CHANGING - cs_service_definition TYPE any. + ALIASES c_abap_version_default + FOR zif_abapgit_object~c_abap_version_default . + ALIASES c_abap_version_sap_cp + FOR zif_abapgit_object~c_abap_version_sap_cp . + ALIASES gc_step_id + FOR zif_abapgit_object~gc_step_id . + ALIASES changed_by + FOR zif_abapgit_object~changed_by . + ALIASES delete + FOR zif_abapgit_object~delete . + ALIASES deserialize + FOR zif_abapgit_object~deserialize . + ALIASES exists + FOR zif_abapgit_object~exists . + ALIASES get_comparator + FOR zif_abapgit_object~get_comparator . + ALIASES get_deserialize_steps + FOR zif_abapgit_object~get_deserialize_steps . + ALIASES is_locked + FOR zif_abapgit_object~is_locked . + ALIASES jump + FOR zif_abapgit_object~jump . + ALIASES serialize + FOR zif_abapgit_object~serialize . - DATA: - mi_persistence TYPE REF TO if_wb_object_persist, - mv_service_definition_key TYPE seu_objkey, - mr_service_definition TYPE REF TO data. + DATA mv_service_definition_key TYPE seu_objkey . + DATA mr_service_definition TYPE REF TO data . + CONSTANTS mc_source_file TYPE string VALUE 'srvdsrv' ##NO_TEXT. + CONSTANTS mc_xml_parent_name TYPE string VALUE 'SRVD' ##NO_TEXT. + DATA mo_object_operator TYPE REF TO object . + METHODS clear_fields + CHANGING + !cs_metadata TYPE any . + METHODS clear_field + IMPORTING + !iv_fieldname TYPE csequence + CHANGING + !cs_metadata TYPE any . + 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 . + 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(ro_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 is_ddic + RETURNING + VALUE(rv_ddic) TYPE abap_bool . + METHODS is_delete_tadir + RETURNING + VALUE(rv_delete_tadir) TYPE abap_bool . ENDCLASS. -CLASS zcl_abapgit_object_srvd IMPLEMENTATION. - - - METHOD clear_field. - - FIELD-SYMBOLS: TYPE data. - - ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_service_definition - TO . - ASSERT sy-subrc = 0. - - CLEAR: . - - ENDMETHOD. - - - METHOD clear_fields. - - clear_field( - EXPORTING - iv_fieldname = 'CONTENT-SOURCE' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-CREATED_AT' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-CREATED_BY' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-CHANGED_AT' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-CHANGED_BY' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-MASTER_LANGUAGE' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-RESPONSIBLE' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-DT_UUID' - CHANGING - cs_service_definition = cs_service_definition ). - - clear_field( - EXPORTING - iv_fieldname = 'METADATA-PACKAGE_REF-NAME' - CHANGING - cs_service_definition = cs_service_definition ). - - ENDMETHOD. +CLASS ZCL_ABAPGIT_OBJECT_SRVD IMPLEMENTATION. METHOD constructor. - - super->constructor( - is_item = is_item - iv_language = iv_language ). + super->constructor( is_item = is_item + iv_language = iv_language ). mv_service_definition_key = ms_item-obj_name. TRY. CREATE DATA mr_service_definition TYPE ('CL_SRVD_WB_OBJECT_DATA=>TY_SRVD_OBJECT_DATA'). - CREATE OBJECT mi_persistence TYPE ('CL_SRVD_OBJECT_PERSIST'). CATCH cx_sy_create_error. zcx_abapgit_exception=>raise( |SRVD not supported by your NW release| ). @@ -132,94 +112,178 @@ CLASS zcl_abapgit_object_srvd IMPLEMENTATION. METHOD zif_abapgit_object~changed_by. DATA: - li_object_data_model TYPE REF TO if_wb_object_data_model. + li_object_data_model TYPE REF TO if_wb_object_data_model, + li_wb_object_operator TYPE REF TO object, + lx_error TYPE REF TO cx_root. + + li_wb_object_operator = get_wb_object_operator( ). TRY. - mi_persistence->get( - EXPORTING - p_object_key = mv_service_definition_key - p_version = 'A' - CHANGING - p_object_data = li_object_data_model ). + CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') + IMPORTING + eo_object_data = li_object_data_model. rv_user = li_object_data_model->get_changed_by( ). - CATCH cx_swb_exception. - rv_user = c_user_unknown. + CATCH cx_root INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = lx_error ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~delete. + DATA: + lx_error TYPE REF TO cx_root, + li_wb_object_operator TYPE REF TO object, + lv_transport_request TYPE trkorr. - DATA: lx_error TYPE REF TO cx_swb_exception. + lv_transport_request = get_transport_req_if_needed( iv_package ). + + li_wb_object_operator = get_wb_object_operator( ). TRY. - mi_persistence->delete( mv_service_definition_key ). + CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~DELETE') + EXPORTING + transport_request = lv_transport_request. - CATCH cx_swb_exception INTO lx_error. + CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. - ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: - li_object_data_model TYPE REF TO if_wb_object_data_model, - lx_error TYPE REF TO cx_swb_exception. + lo_object_data TYPE REF TO if_wb_object_data_model, + lx_error TYPE REF TO cx_root, + lv_transport_request TYPE trkorr, + lo_wb_object_operator TYPE REF TO object, + lo_merged_data_all TYPE REF TO if_wb_object_data_model, + lo_merged_data_prop TYPE REF TO if_wb_object_data_model, + lo_merged_data_cont TYPE REF TO if_wb_object_data_model, + lr_wbobjtype TYPE REF TO data, + lr_category TYPE REF TO data. FIELD-SYMBOLS: - TYPE any, - TYPE data. - - ASSIGN mr_service_definition->* TO . - ASSERT sy-subrc = 0. - - io_xml->read( - EXPORTING - iv_name = 'SRVD' - CHANGING - cg_data = ). - - ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE - TO . - ASSERT sy-subrc = 0. - - = mo_files->read_string( 'assrvd' ). + TYPE any, + TYPE any, + TYPE any. TRY. - CREATE OBJECT li_object_data_model TYPE ('CL_SRVD_WB_OBJECT_DATA'). - li_object_data_model->set_data( ). - mi_persistence->save( li_object_data_model ). + lo_object_data = get_object_data( io_xml ). + lv_transport_request = get_transport_req_if_needed( iv_package ). + lo_wb_object_operator = get_wb_object_operator( ). + + CREATE DATA lr_wbobjtype TYPE ('WBOBJTYPE'). + ASSIGN lr_wbobjtype->* TO . + ASSIGN COMPONENT 'OBJTYPE_TR' OF STRUCTURE TO . + = 'SRVD'. + ASSIGN COMPONENT 'SUBTYPE_WB' OF STRUCTURE TO . + = 'SRV'. + + 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 ). + + 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' "swbm_version_inactive + 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' "swbm_version_inactive + 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' "swbm_version_inactive + transport_request = lv_transport_request. + WHEN OTHERS. + zcx_abapgit_exception=>raise( |Category '{ }' not supported| ). + ENDCASE. + ELSE. + CASE . + WHEN '1'. "if_wb_adt_plugin_resource_co=>co_sfs_res_category_atomic. + lo_merged_data_all = merge_object_data( lo_object_data ). + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_merged_data_all + data_selection = 'AL' "if_wb_object_data_selection_co=>c_all_data + version = 'I' "swbm_version_inactive + transport_request = lv_transport_request. + WHEN '2'. "if_wb_adt_plugin_resource_co=>co_sfs_res_category_compound_s. + lo_merged_data_prop = merge_object_data( lo_object_data ). + lo_merged_data_cont = merge_object_data( lo_object_data ). + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_merged_data_prop + data_selection = 'P' "if_wb_object_data_selection_co=>c_properties + version = 'I' "swbm_version_inactive + transport_request = lv_transport_request. + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') + EXPORTING + io_object_data = lo_merged_data_cont + data_selection = 'D' "if_wb_object_data_selection_co=>c_data_content + version = 'I' "swbm_version_inactive + transport_request = lv_transport_request. + WHEN OTHERS. + zcx_abapgit_exception=>raise( |Category '{ }' not supported| ). + ENDCASE. + ENDIF. + corr_insert( iv_package ). - CATCH cx_swb_exception INTO lx_error. + CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. + zcl_abapgit_objects_activation=>add_item( ms_item ). + ENDMETHOD. METHOD zif_abapgit_object~exists. + DATA lo_object_data TYPE REF TO if_wb_object_data_model. + DATA lo_wb_object_operator TYPE REF TO object. + TRY. - mi_persistence->get( - p_object_key = mv_service_definition_key - p_version = 'A' - p_existence_check_only = abap_true ). - - rv_bool = abap_true. - - CATCH cx_swb_object_does_not_exist cx_swb_exception. + lo_wb_object_operator = get_wb_object_operator( ). + CALL METHOD lo_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') + EXPORTING + data_selection = 'P' + IMPORTING + eo_object_data = lo_object_data. + rv_bool = boolc( lo_object_data IS NOT INITIAL AND lo_object_data->get_object_key( ) IS NOT INITIAL ). + CATCH cx_root. rv_bool = abap_false. ENDTRY. @@ -232,15 +296,14 @@ CLASS zcl_abapgit_object_srvd 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-delete_tadir = abap_true. + rs_metadata = get_metadata( ). + rs_metadata-ddic = is_ddic( ). + rs_metadata-delete_tadir = is_delete_tadir( ). ENDMETHOD. @@ -271,7 +334,7 @@ CLASS zcl_abapgit_object_srvd IMPLEMENTATION. OTHERS = 3. IF sy-subrc <> 0. - zcx_abapgit_exception=>raise_t100( ). + zcx_abapgit_exception=>raise( |RC={ sy-subrc } from RS_TOOL_ACCESS| ). ENDIF. ENDMETHOD. @@ -280,48 +343,309 @@ CLASS zcl_abapgit_object_srvd IMPLEMENTATION. METHOD zif_abapgit_object~serialize. DATA: - li_object_data_model TYPE REF TO if_wb_object_data_model, - lv_source TYPE string, - lx_error TYPE REF TO cx_swb_exception. + li_object_data_model TYPE REF TO if_wb_object_data_model, + li_wb_object_operator TYPE REF TO object, + lx_error TYPE REF TO cx_root, + lv_source TYPE string. FIELD-SYMBOLS: TYPE any, - TYPE data. + TYPE any, + TYPE string. ASSIGN mr_service_definition->* TO . ASSERT sy-subrc = 0. TRY. - mi_persistence->get( + li_wb_object_operator = get_wb_object_operator( ). + + CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') EXPORTING - p_object_key = mv_service_definition_key - p_version = 'A' - CHANGING - p_object_data = li_object_data_model ). + version = 'A' + data_selection = 'AL' + IMPORTING + "data = + eo_object_data = li_object_data_model. - li_object_data_model->get_data( IMPORTING p_data = ). + CALL METHOD li_object_data_model->('GET_DATA') + IMPORTING + p_data = . - 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_service_definition = ). + io_xml->add( + iv_name = mc_xml_parent_name + ig_data = ). - CATCH cx_swb_exception INTO lx_error. + mo_files->add_string( + iv_ext = mc_source_file + iv_string = lv_source ). + + + CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. - io_xml->add( - iv_name = 'SRVD' - ig_data = ). + ENDMETHOD. - mo_files->add_string( - iv_ext = 'assrvd' - iv_string = lv_source ). + + 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. + + FIELD-SYMBOLS: + TYPE any, + TYPE any, + TYPE any, + TYPE any. + + CREATE OBJECT lo_object_data TYPE ('CL_SRVD_WB_OBJECT_DATA'). + lo_object_data = io_object_data. + + CREATE DATA lr_new TYPE ('CL_SRVD_WB_OBJECT_DATA=>TY_SRVD_OBJECT_DATA'). + ASSIGN lr_new->* TO . + ASSERT sy-subrc = 0. + + CREATE DATA lr_old TYPE ('CL_SRVD_WB_OBJECT_DATA=>TY_SRVD_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_SRVD_WB_OBJECT_DATA'). + + CALL METHOD ro_object_data_merged->('SET_DATA') + EXPORTING + p_data = . + + ENDMETHOD. + + + METHOD is_delete_tadir. + rv_delete_tadir = abap_true. + ENDMETHOD. + + + METHOD is_ddic. + rv_ddic = abap_false. + ENDMETHOD. + + + METHOD get_wb_object_operator. + + DATA: + ls_object_type TYPE wbobjtype, + lx_error TYPE REF TO cx_root. + + IF mo_object_operator IS BOUND. + ro_object_operator = mo_object_operator. + ENDIF. + + ls_object_type-objtype_tr = 'SRVD'. + ls_object_type-subtype_wb = 'SRV'. + + TRY. + CALL METHOD ('CL_WB_OBJECT_OPERATOR')=>('CREATE_INSTANCE') + EXPORTING + object_type = ls_object_type + object_key = mv_service_definition_key + RECEIVING + result = mo_object_operator. + + CATCH cx_root INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = lx_error ). + ENDTRY. + + ro_object_operator = mo_object_operator. + + ENDMETHOD. + + + METHOD get_transport_req_if_needed. + + DATA: li_sap_package TYPE REF TO zif_abapgit_sap_package. + + li_sap_package = zcl_abapgit_factory=>get_sap_package( iv_package ). + + IF li_sap_package->are_changes_recorded_in_tr_req( ) = abap_true. + rv_transport_request = zcl_abapgit_default_transport=>get_instance( )->get( )-ordernum. + ENDIF. + + ENDMETHOD. + + + METHOD get_object_data. + + DATA: + 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_SRVD_WB_OBJECT_DATA=>TY_SRVD_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 ('CL_SRVD_WB_OBJECT_DATA=>TY_METADATA_EXTENDED'). + ASSIGN lr_metadata->* TO . + ASSERT sy-subrc = 0. + + io_xml->read( + EXPORTING + iv_name = mc_xml_parent_name + CHANGING + cg_data = ). + + = . + + ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . + ASSERT sy-subrc = 0. + + = mo_files->read_string( mc_source_file ). + IF IS INITIAL. + = mo_files->read_string( 'assrvd' ). + ENDIF. + + CREATE OBJECT ro_object_data TYPE ('CL_SRVD_WB_OBJECT_DATA'). + ro_object_data->set_data( p_data = ). + + ENDMETHOD. + + + METHOD clear_fields. + + FIELD-SYMBOLS: TYPE ANY TABLE. + FIELD-SYMBOLS: TYPE data. + FIELD-SYMBOLS TYPE any. + + clear_field( + EXPORTING + iv_fieldname = 'VERSION' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'CREATED_AT' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'CREATED_BY' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'CHANGED_AT' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'CHANGED_BY' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'RESPONSIBLE' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'PACKAGE_REF' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'MASTER_SYSTEM' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'DT_UUID' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'ABAP_LANGUAGE_VERSION' + CHANGING + cs_metadata = cs_metadata ). + + clear_field( + EXPORTING + iv_fieldname = 'LINKS' + CHANGING + cs_metadata = cs_metadata ). + + ENDMETHOD. + + + METHOD clear_field. + + FIELD-SYMBOLS: TYPE data. + + ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_metadata + TO . + ASSERT sy-subrc = 0. + + CLEAR: . ENDMETHOD. ENDCLASS.