From 71f16d08be7272838c9b9e09d589928d3f164984 Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Wed, 1 Feb 2023 10:29:20 +0100 Subject: [PATCH] SFBF, SFBS, SFSW: Major bug fixes (#6020) --- src/objects/zcl_abapgit_object_sfbf.clas.abap | 101 +++++++++-- src/objects/zcl_abapgit_object_sfbs.clas.abap | 102 ++++++++--- src/objects/zcl_abapgit_object_sfsw.clas.abap | 159 ++++++++++-------- 3 files changed, 255 insertions(+), 107 deletions(-) diff --git a/src/objects/zcl_abapgit_object_sfbf.clas.abap b/src/objects/zcl_abapgit_object_sfbf.clas.abap index b48563e3b..bb620f142 100644 --- a/src/objects/zcl_abapgit_object_sfbf.clas.abap +++ b/src/objects/zcl_abapgit_object_sfbf.clas.abap @@ -3,11 +3,24 @@ CLASS zcl_abapgit_object_sfbf DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje PUBLIC SECTION. INTERFACES zif_abapgit_object. + METHODS constructor + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_language TYPE spras. + PROTECTED SECTION. PRIVATE SECTION. + CONSTANTS c_longtext_id_sfbf TYPE dokil-id VALUE 'BF'. + DATA mv_bf TYPE sfw_bfunction. + METHODS: + activate + RAISING zcx_abapgit_exception, + create + RETURNING VALUE(ro_bf) TYPE REF TO cl_sfw_bf + RAISING zcx_abapgit_exception, get RETURNING VALUE(ro_bf) TYPE REF TO cl_sfw_bf RAISING zcx_abapgit_exception. @@ -19,18 +32,64 @@ ENDCLASS. CLASS zcl_abapgit_object_sfbf IMPLEMENTATION. - METHOD get. + METHOD activate. - DATA: lv_bf TYPE sfw_bfunction. + DATA: lt_bfuncts TYPE sfw_bftab, + lt_msgtab TYPE sprot_u_tab. + + IF zif_abapgit_object~is_active( ) = abap_true. + RETURN. + ENDIF. + + APPEND mv_bf TO lt_bfuncts. + + cl_sfw_activate=>activate_sfbf( + EXPORTING + p_bfuncts = lt_bfuncts + p_version = 'I' + IMPORTING + p_msgtab = lt_msgtab ). + + READ TABLE lt_msgtab WITH KEY severity = 'E' TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + zcx_abapgit_exception=>raise( 'Error activating SFBF' ). + ENDIF. + + ENDMETHOD. - lv_bf = ms_item-obj_name. + METHOD constructor. + + super->constructor( + is_item = is_item + iv_language = iv_language ). + + mv_bf = is_item-obj_name. + + ENDMETHOD. + + + METHOD create. TRY. -* make sure to clear cache, method GET_BF_FROM_DB does not exist in 702 - ro_bf = cl_sfw_bf=>get_bf( lv_bf ). + " make sure to clear cache + ro_bf = cl_sfw_bf=>create_bf( mv_bf ). ro_bf->free( ). - ro_bf = cl_sfw_bf=>get_bf( lv_bf ). + ro_bf = cl_sfw_bf=>create_bf( mv_bf ). + CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. + zcx_abapgit_exception=>raise( 'Error from CL_SFW_BF=>CREATE_BF' ). + ENDTRY. + + ENDMETHOD. + + + METHOD get. + + TRY. + " make sure to clear cache, method GET_BF_FROM_DB does not exist in 702 + ro_bf = cl_sfw_bf=>get_bf( mv_bf ). + ro_bf->free( ). + ro_bf = cl_sfw_bf=>get_bf( mv_bf ). CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. zcx_abapgit_exception=>raise( 'Error from CL_SFW_BF=>GET_BF' ). ENDTRY. @@ -55,13 +114,10 @@ CLASS zcl_abapgit_object_sfbf IMPLEMENTATION. METHOD zif_abapgit_object~delete. - DATA: lv_bf TYPE sfw_bfunction, - lt_delete TYPE sfw_bftab, + DATA: lt_delete TYPE sfw_bftab, lt_msgtab TYPE sprot_u_tab. - - lv_bf = ms_item-obj_name. - APPEND lv_bf TO lt_delete. + APPEND mv_bf TO lt_delete. cl_sfw_activate=>delete_sfbf( EXPORTING p_bfuncts = lt_delete IMPORTING p_msgtab = lt_msgtab ). @@ -71,15 +127,14 @@ CLASS zcl_abapgit_object_sfbf IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Error deleting SFBF' ). ENDIF. - tadir_delete( ). + corr_insert( iv_package ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. - DATA: lv_bf TYPE sfw_bfunction, - lo_bf TYPE REF TO cl_sfw_bf, + DATA: lo_bf TYPE REF TO cl_sfw_bf, ls_header TYPE sfw_bf, lv_name_32 TYPE sfw_name32, lv_name_80 TYPE sfw_name80, @@ -90,6 +145,10 @@ CLASS zcl_abapgit_object_sfbf IMPLEMENTATION. ls_sfw_bfc_rn TYPE sfw_bfc_rn, lt_parent_bfs TYPE sfw_bs_bf_outtab. + IF iv_step = zif_abapgit_object=>gc_step_id-late. + activate( ). + RETURN. + ENDIF. io_xml->read( EXPORTING iv_name = 'HEADER' CHANGING cg_data = ls_header ). @@ -111,15 +170,22 @@ CLASS zcl_abapgit_object_sfbf IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'PARENT_BFS' CHANGING cg_data = lt_parent_bfs ). - lv_bf = ms_item-obj_name. TRY. - lo_bf = cl_sfw_bf=>create_bf( lv_bf ). + IF zif_abapgit_object~exists( ) = abap_true. + lo_bf = get( ). + ELSE. + lo_bf = create( ). + ENDIF. CATCH cx_pak_not_authorized cx_pak_invalid_state cx_pak_invalid_data. zcx_abapgit_exception=>raise( 'error in CL_SFW_BF=>CREATE_BF' ). ENDTRY. ls_header-author = sy-uname. ls_header-createdon = sy-datum. + + " Get component from package + SELECT SINGLE dlvunit FROM tdevc INTO ls_header-component WHERE devclass = iv_package. + lo_bf->set_header_data( ls_header ). lo_bf->set_texts( p_32 = lv_name_32 @@ -175,6 +241,7 @@ CLASS zcl_abapgit_object_sfbf 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-late TO rt_steps. ENDMETHOD. @@ -222,6 +289,8 @@ CLASS zcl_abapgit_object_sfbf IMPLEMENTATION. ls_header = lo_bf->get_header_data( ). CLEAR: ls_header-author, + ls_header-version, + ls_header-component, ls_header-createdon, ls_header-changedby, ls_header-changedon, diff --git a/src/objects/zcl_abapgit_object_sfbs.clas.abap b/src/objects/zcl_abapgit_object_sfbs.clas.abap index ec5e602e0..10c864ef4 100644 --- a/src/objects/zcl_abapgit_object_sfbs.clas.abap +++ b/src/objects/zcl_abapgit_object_sfbs.clas.abap @@ -3,11 +3,24 @@ CLASS zcl_abapgit_object_sfbs DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje PUBLIC SECTION. INTERFACES zif_abapgit_object. + METHODS constructor + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_language TYPE spras. + PROTECTED SECTION. PRIVATE SECTION. + CONSTANTS c_longtext_id_sfbs TYPE dokil-id VALUE 'BS'. + DATA mv_bfset TYPE sfw_bset. + METHODS: + activate + RAISING zcx_abapgit_exception, + create + RETURNING VALUE(ro_bfs) TYPE REF TO cl_sfw_bfs + RAISING zcx_abapgit_exception, get RETURNING VALUE(ro_bfs) TYPE REF TO cl_sfw_bfs RAISING zcx_abapgit_exception. @@ -19,17 +32,64 @@ ENDCLASS. CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. - METHOD get. + METHOD activate. - DATA: lv_bfset TYPE sfw_bset. + DATA: lt_bfsets TYPE sfw_bstab, + lt_msgtab TYPE sprot_u_tab. + + IF zif_abapgit_object~is_active( ) = abap_true. + RETURN. + ENDIF. + + APPEND mv_bfset TO lt_bfsets. + + cl_sfw_activate=>activate_sfbs( + EXPORTING + p_bsets = lt_bfsets + p_version = 'I' + IMPORTING + p_msgtab = lt_msgtab ). + + READ TABLE lt_msgtab WITH KEY severity = 'E' TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + zcx_abapgit_exception=>raise( 'Error activating SFBS' ). + ENDIF. + + ENDMETHOD. - lv_bfset = ms_item-obj_name. + METHOD constructor. + + super->constructor( + is_item = is_item + iv_language = iv_language ). + + mv_bfset = is_item-obj_name. + + ENDMETHOD. + + + METHOD create. TRY. - ro_bfs = cl_sfw_bfs=>get_bfs( lv_bfset ). + " make sure to clear cache + ro_bfs = cl_sfw_bfs=>create_bfs( mv_bfset ). ro_bfs->free( ). - ro_bfs = cl_sfw_bfs=>get_bfs( lv_bfset ). + ro_bfs = cl_sfw_bfs=>create_bfs( mv_bfset ). + CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. + zcx_abapgit_exception=>raise( 'Error from CL_SFW_BFS=>CREATE_BFS' ). + ENDTRY. + + ENDMETHOD. + + + METHOD get. + + TRY. + " make sure to clear cache + ro_bfs = cl_sfw_bfs=>get_bfs( mv_bfset ). + ro_bfs->free( ). + ro_bfs = cl_sfw_bfs=>get_bfs( mv_bfset ). CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. zcx_abapgit_exception=>raise( 'Error from CL_SFW_BFS=>GET_BFS' ). ENDTRY. @@ -54,13 +114,10 @@ CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. METHOD zif_abapgit_object~delete. - DATA: lv_bfset TYPE sfw_bset, - lt_delete TYPE sfw_bstab, + DATA: lt_delete TYPE sfw_bstab, lt_msgtab TYPE sprot_u_tab. - - lv_bfset = ms_item-obj_name. - APPEND lv_bfset TO lt_delete. + APPEND mv_bfset TO lt_delete. cl_sfw_activate=>delete_sfbs( EXPORTING p_bsets = lt_delete IMPORTING p_msgtab = lt_msgtab ). @@ -70,15 +127,14 @@ CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Error deleting SFBS' ). ENDIF. - tadir_delete( ). + corr_insert( iv_package ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. - DATA: lv_bfset TYPE sfw_bset, - lo_bfs TYPE REF TO cl_sfw_bfs, + DATA: lo_bfs TYPE REF TO cl_sfw_bfs, ls_header TYPE sfw_bs, lv_name_32 TYPE sfw_name32, lv_name_80 TYPE sfw_name80, @@ -86,6 +142,10 @@ CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. lt_nested_bfs TYPE sfw_bsbs_outtab, lt_parent_bfs TYPE sfw_bs_bs_parent_outtab. + IF iv_step = zif_abapgit_object=>gc_step_id-late. + activate( ). + RETURN. + ENDIF. io_xml->read( EXPORTING iv_name = 'HEADER' CHANGING cg_data = ls_header ). @@ -101,9 +161,12 @@ CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'PARENT_BFS' CHANGING cg_data = lt_parent_bfs ). - lv_bfset = ms_item-obj_name. TRY. - lo_bfs = cl_sfw_bfs=>create_bfs( lv_bfset ). + IF zif_abapgit_object~exists( ) = abap_true. + lo_bfs = get( ). + ELSE. + lo_bfs = create( ). + ENDIF. CATCH cx_pak_not_authorized cx_pak_invalid_state cx_pak_invalid_data. zcx_abapgit_exception=>raise( 'error in CL_SFW_BFS=>CREATE_BFS' ). ENDTRY. @@ -134,12 +197,9 @@ CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. METHOD zif_abapgit_object~exists. - DATA: ls_tadir TYPE tadir, - lv_bfset TYPE sfw_bset. + DATA ls_tadir TYPE tadir. - - lv_bfset = ms_item-obj_name. - IF cl_sfw_bfs=>check_existence( lv_bfset ) = abap_false. + IF cl_sfw_bfs=>check_existence( mv_bfset ) = abap_false. RETURN. ENDIF. @@ -163,6 +223,7 @@ CLASS zcl_abapgit_object_sfbs 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-late TO rt_steps. ENDMETHOD. @@ -205,6 +266,7 @@ CLASS zcl_abapgit_object_sfbs IMPLEMENTATION. ls_header = lo_bfs->get_header_data( ). CLEAR: ls_header-author, + ls_header-version, ls_header-createdon, ls_header-changedby, ls_header-changedon, diff --git a/src/objects/zcl_abapgit_object_sfsw.clas.abap b/src/objects/zcl_abapgit_object_sfsw.clas.abap index 870106856..740116f2b 100644 --- a/src/objects/zcl_abapgit_object_sfsw.clas.abap +++ b/src/objects/zcl_abapgit_object_sfsw.clas.abap @@ -3,18 +3,27 @@ CLASS zcl_abapgit_object_sfsw DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje PUBLIC SECTION. INTERFACES zif_abapgit_object. + METHODS constructor + IMPORTING + !is_item TYPE zif_abapgit_definitions=>ty_item + !iv_language TYPE spras. + PROTECTED SECTION. PRIVATE SECTION. + CONSTANTS c_longtext_id_sfsw TYPE dokil-id VALUE 'SW'. + DATA mv_switch TYPE sfw_switch_id. + METHODS: - get + activate + RAISING zcx_abapgit_exception, + create RETURNING VALUE(ro_switch) TYPE REF TO cl_sfw_sw RAISING zcx_abapgit_exception, - wait_for_background_job, - wait_for_deletion - RAISING - zcx_abapgit_exception. + get + RETURNING VALUE(ro_switch) TYPE REF TO cl_sfw_sw + RAISING zcx_abapgit_exception. ENDCLASS. @@ -23,60 +32,67 @@ ENDCLASS. CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. - METHOD get. + METHOD activate. - DATA: lv_switch_id TYPE sfw_switch_id. + DATA: lt_switches TYPE sfw_switchtab, + lt_msgtab TYPE sprot_u_tab. - lv_switch_id = ms_item-obj_name. + IF zif_abapgit_object~is_active( ) = abap_true. + RETURN. + ENDIF. + + APPEND mv_switch TO lt_switches. + + cl_sfw_activate=>activate_sfsw( + EXPORTING + p_switches = lt_switches + p_version = 'I' + IMPORTING + p_msgtab = lt_msgtab ). + + READ TABLE lt_msgtab WITH KEY severity = 'E' TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + zcx_abapgit_exception=>raise( 'Error activating SFBS' ). + ENDIF. + + ENDMETHOD. + + + METHOD constructor. + + super->constructor( + is_item = is_item + iv_language = iv_language ). + + mv_switch = is_item-obj_name. + + ENDMETHOD. + + + METHOD create. TRY. - ro_switch = cl_sfw_sw=>get_switch_from_db( lv_switch_id ). + " make sure to clear cache + ro_switch = cl_sfw_sw=>create_switch( mv_switch ). + ro_switch->free( ). + ro_switch = cl_sfw_sw=>create_switch( mv_switch ). CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. - zcx_abapgit_exception=>raise( 'Error from CL_SFW_SW=>GET_SWITCH' ). + zcx_abapgit_exception=>raise( 'Error from CL_SFW_SW=>CREATE_SWITCH' ). ENDTRY. ENDMETHOD. - METHOD wait_for_background_job. + METHOD get. - DATA: lv_job_count TYPE tbtco-jobcount. - - " We wait for at most 5 seconds. If it takes - " more than that it probably doesn't matter, - " because we have other problems - - DO 5 TIMES. - - SELECT SINGLE jobcount - FROM tbtco - INTO lv_job_count - WHERE jobname = 'SFW_DELETE_SWITCH' - AND status = 'R' - AND sdluname = sy-uname. - - IF sy-subrc = 0. - WAIT UP TO 1 SECONDS. - ELSE. - EXIT. - ENDIF. - - ENDDO. - - ENDMETHOD. - - - METHOD wait_for_deletion. - - DO 5 TIMES. - - IF zif_abapgit_object~exists( ) = abap_true. - WAIT UP TO 1 SECONDS. - ELSE. - EXIT. - ENDIF. - - ENDDO. + TRY. + " make sure to clear cache + ro_switch = cl_sfw_sw=>get_switch( mv_switch ). + ro_switch->free( ). + ro_switch = cl_sfw_sw=>get_switch( mv_switch ). + CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. + zcx_abapgit_exception=>raise( 'Error from CL_SFW_SW=>GET_SWITCH' ). + ENDTRY. ENDMETHOD. @@ -98,25 +114,20 @@ CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. METHOD zif_abapgit_object~delete. - DATA: lv_switch_id TYPE sfw_switch_id, - lo_switch TYPE REF TO cl_sfw_sw. + DATA: lt_delete TYPE sfw_switchtab, + lt_msgtab TYPE sprot_u_tab. + APPEND mv_switch TO lt_delete. - lv_switch_id = ms_item-obj_name. - TRY. - lo_switch = cl_sfw_sw=>get_switch( lv_switch_id ). - lo_switch->set_delete_flag( lv_switch_id ). - lo_switch->save_all( ). + cl_sfw_activate=>delete_sfsw( EXPORTING p_switches = lt_delete + IMPORTING p_msgtab = lt_msgtab ). - " deletion via background job. Wait until the job is finished... - wait_for_background_job( ). + READ TABLE lt_msgtab WITH KEY severity = 'E' TRANSPORTING NO FIELDS. + IF sy-subrc = 0. + zcx_abapgit_exception=>raise( 'Error deleting SFSW' ). + ENDIF. - " ... the object is deleted - wait_for_deletion( ). - - CATCH cx_pak_invalid_data cx_pak_invalid_state cx_pak_not_authorized. - zcx_abapgit_exception=>raise( 'Error deleting Switch' ). - ENDTRY. + corr_insert( iv_package ). ENDMETHOD. @@ -124,13 +135,16 @@ CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. METHOD zif_abapgit_object~deserialize. DATA: lo_switch TYPE REF TO cl_sfw_sw, - lv_switch_id TYPE sfw_switch_id, ls_header TYPE sfw_switch, lv_name_32 TYPE sfw_name32, lv_name_80 TYPE sfw_name80, lt_parent_bf TYPE sfw_bf_sw_outtab, lt_conflicts TYPE sfw_confl_outtab. + IF iv_step = zif_abapgit_object=>gc_step_id-late. + activate( ). + RETURN. + ENDIF. io_xml->read( EXPORTING iv_name = 'HEADER' CHANGING cg_data = ls_header ). @@ -144,9 +158,12 @@ CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'CONFLICTS' CHANGING cg_data = lt_conflicts ). - lv_switch_id = ms_item-obj_name. TRY. - lo_switch = cl_sfw_sw=>create_switch( lv_switch_id ). + IF zif_abapgit_object~exists( ) = abap_true. + lo_switch = get( ). + ELSE. + lo_switch = create( ). + ENDIF. CATCH cx_pak_not_authorized cx_pak_invalid_state cx_pak_invalid_data. zcx_abapgit_exception=>raise( 'error in CL_SFW_SW=>CREATE_SWITCH' ). ENDTRY. @@ -183,12 +200,9 @@ CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. METHOD zif_abapgit_object~exists. - DATA: ls_tadir TYPE tadir, - lv_switch_id TYPE sfw_switch_id. + DATA ls_tadir TYPE tadir. - - lv_switch_id = ms_item-obj_name. - IF cl_sfw_sw=>check_existence( lv_switch_id ) = abap_false. + IF cl_sfw_sw=>check_existence( mv_switch ) = abap_false. RETURN. ENDIF. @@ -201,6 +215,7 @@ CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. ENDIF. rv_bool = abap_true. + ENDMETHOD. @@ -211,6 +226,7 @@ CLASS zcl_abapgit_object_sfsw 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-late TO rt_steps. ENDMETHOD. @@ -252,6 +268,7 @@ CLASS zcl_abapgit_object_sfsw IMPLEMENTATION. ls_header = lo_switch->get_header_data( ). CLEAR: ls_header-author, + ls_header-version, ls_header-createdon, ls_header-changedby, ls_header-changedon,