From bb3e092d6120c7423a94c462a9515a1cb9fa2377 Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 8 Jul 2018 10:02:44 +0000 Subject: [PATCH 1/3] basic SCP1 serialization --- src/objects/zcl_abapgit_object_scp1.clas.abap | 184 ++++++++++++++++++ src/objects/zcl_abapgit_object_scp1.clas.xml | 18 ++ 2 files changed, 202 insertions(+) create mode 100644 src/objects/zcl_abapgit_object_scp1.clas.abap create mode 100644 src/objects/zcl_abapgit_object_scp1.clas.xml diff --git a/src/objects/zcl_abapgit_object_scp1.clas.abap b/src/objects/zcl_abapgit_object_scp1.clas.abap new file mode 100644 index 000000000..b5d33e64d --- /dev/null +++ b/src/objects/zcl_abapgit_object_scp1.clas.abap @@ -0,0 +1,184 @@ +CLASS zcl_abapgit_object_scp1 DEFINITION + PUBLIC + INHERITING FROM zcl_abapgit_objects_super + CREATE PUBLIC . + + PUBLIC SECTION. + + INTERFACES zif_abapgit_object . + PROTECTED SECTION. + + TYPES: + BEGIN OF ty_scp1, + scprattr TYPE scprattr, + scprtext TYPE STANDARD TABLE OF scprtext WITH DEFAULT KEY, + scprvals TYPE STANDARD TABLE OF scprvals WITH DEFAULT KEY, + scprvall TYPE STANDARD TABLE OF scprvall WITH DEFAULT KEY, + scprreca TYPE STANDARD TABLE OF scprreca WITH DEFAULT KEY, + scprfldv TYPE STANDARD TABLE OF scprfldv WITH DEFAULT KEY, + END OF ty_scp1 . + + METHODS get + CHANGING + !cs_scp1 TYPE ty_scp1 . + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. + + + METHOD get. + + FIELD-SYMBOLS: TYPE scprvals, + TYPE scprreca. + + + CALL FUNCTION 'SCPR_TEXT_GET' + EXPORTING + profid = cs_scp1-scprattr-id + category = cs_scp1-scprattr-category + TABLES + texts = cs_scp1-scprtext + EXCEPTIONS + no_text_found = 1. + + CALL FUNCTION 'SCPR_TEMPL_DB_VALS_GET_DETAIL' + EXPORTING + profid = cs_scp1-scprattr-id + category = cs_scp1-scprattr-category + TABLES + values = cs_scp1-scprvals + valuesl = cs_scp1-scprvall + recattr = cs_scp1-scprreca. + +* normalize the XML + LOOP AT cs_scp1-scprvals ASSIGNING . + CONDENSE -recnumber. + ENDLOOP. + LOOP AT cs_scp1-scprreca ASSIGNING . + CONDENSE -recnumber. + ENDLOOP. + + CALL FUNCTION 'SCPR_TEMPL_DB_FLDTXTVAR_GET' + EXPORTING + bcset_id = cs_scp1-scprattr-id + category = cs_scp1-scprattr-category + TABLES + it_fldv = cs_scp1-scprfldv. + + ENDMETHOD. + + + METHOD zif_abapgit_object~changed_by. + + rv_user = c_user_unknown. + + ENDMETHOD. + + + METHOD zif_abapgit_object~compare_to_remote_version. + + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + +* todo + + ENDMETHOD. + + + METHOD zif_abapgit_object~deserialize. + +* todo + + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + DATA: lv_profid TYPE scprattr-id. + + + lv_profid = ms_item-obj_name. + + CALL FUNCTION 'SCPR_DB_ATTR_GET_DETAIL' + EXPORTING + profid = lv_profid + EXCEPTIONS + profile_dont_exist = 1 + OTHERS = 2. + rv_bool = boolc( sy-subrc = 0 ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~get_metadata. + + rs_metadata = get_metadata( ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~has_changed_since. + + rv_changed = abap_true. + + ENDMETHOD. + + + METHOD zif_abapgit_object~is_locked. + + rv_is_locked = abap_false. + + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + + zcx_abapgit_exception=>raise( |TODO: Jump| ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + + DATA: ls_scp1 TYPE ty_scp1. + + + ls_scp1-scprattr-id = ms_item-obj_name. + + CALL FUNCTION 'SCPR_DB_ATTR_GET_DETAIL' + EXPORTING + profid = ls_scp1-scprattr-id + IMPORTING + proftype = ls_scp1-scprattr-type + cli_dep = ls_scp1-scprattr-cli_dep + cli_cas = ls_scp1-scprattr-cli_cas + reftype = ls_scp1-scprattr-reftype + refname = ls_scp1-scprattr-refname + component = ls_scp1-scprattr-component + minrelease = ls_scp1-scprattr-minrelease + maxrelease = ls_scp1-scprattr-maxrelease + orgid = ls_scp1-scprattr-orgid + act_info = ls_scp1-scprattr-act_info. + + + IF ls_scp1-scprattr-type = 'TMP'. +* todo, Hierarchical + BREAK-POINT. + ELSE. + get( CHANGING cs_scp1 = ls_scp1 ). + ENDIF. + + + io_xml->add( + iv_name = 'SCP1' + ig_data = ls_scp1 ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_scp1.clas.xml b/src/objects/zcl_abapgit_object_scp1.clas.xml new file mode 100644 index 000000000..de8de6cac --- /dev/null +++ b/src/objects/zcl_abapgit_object_scp1.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_OBJECT_SCP1 + 1 + E + SCP1 + 2 + 1 + X + X + X + + + + From eb86f02a29974a42c63332e5a4e30aa0b69bd65a Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 8 Jul 2018 11:08:46 +0000 Subject: [PATCH 2/3] basic SCP1 support, #1004 --- src/objects/zcl_abapgit_object_scp1.clas.abap | 205 ++++++++++++++++-- 1 file changed, 182 insertions(+), 23 deletions(-) diff --git a/src/objects/zcl_abapgit_object_scp1.clas.abap b/src/objects/zcl_abapgit_object_scp1.clas.abap index b5d33e64d..3b3d1c2ba 100644 --- a/src/objects/zcl_abapgit_object_scp1.clas.abap +++ b/src/objects/zcl_abapgit_object_scp1.clas.abap @@ -18,7 +18,22 @@ CLASS zcl_abapgit_object_scp1 DEFINITION scprfldv TYPE STANDARD TABLE OF scprfldv WITH DEFAULT KEY, END OF ty_scp1 . - METHODS get + METHODS dequeue . + METHODS enqueue + RAISING + zcx_abapgit_exception . + METHODS save + IMPORTING + !is_scp1 TYPE ty_scp1 + RAISING + zcx_abapgit_exception . + METHODS adjust_inbound + CHANGING + !cs_scp1 TYPE ty_scp1 . + METHODS adjust_outbound + CHANGING + !cs_scp1 TYPE ty_scp1 . + METHODS load CHANGING !cs_scp1 TYPE ty_scp1 . PRIVATE SECTION. @@ -29,11 +44,73 @@ ENDCLASS. CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. - METHOD get. + METHOD adjust_inbound. FIELD-SYMBOLS: TYPE scprvals, TYPE scprreca. +* back to internal format + LOOP AT cs_scp1-scprvals ASSIGNING . + SHIFT -recnumber RIGHT DELETING TRAILING space. + ENDLOOP. + LOOP AT cs_scp1-scprreca ASSIGNING . + SHIFT -recnumber RIGHT DELETING TRAILING space. + ENDLOOP. + + ENDMETHOD. + + + METHOD adjust_outbound. + + FIELD-SYMBOLS: TYPE scprvals, + TYPE scprreca. + +* normalize the XML + LOOP AT cs_scp1-scprvals ASSIGNING . + CONDENSE -recnumber. + ENDLOOP. + LOOP AT cs_scp1-scprreca ASSIGNING . + CONDENSE -recnumber. + ENDLOOP. + + ENDMETHOD. + + + METHOD dequeue. + + DATA: lv_id TYPE scpr_id. + + + lv_id = ms_item-obj_name. + + CALL FUNCTION 'SCPR_SV_DEQUEUE_BCSET' + EXPORTING + bcset_id = lv_id. + + ENDMETHOD. + + + METHOD enqueue. + + DATA: lv_id TYPE scpr_id. + + lv_id = ms_item-obj_name. + + CALL FUNCTION 'SCPR_SV_ENQUEUE_BCSET' + EXPORTING + bcset_id = lv_id + EXCEPTIONS + is_already_locked = 1 + system_failure = 2 + OTHERS = 3. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |SCP1 locking error| ). + ENDIF. + + ENDMETHOD. + + + METHOD load. CALL FUNCTION 'SCPR_TEXT_GET' EXPORTING @@ -53,14 +130,6 @@ CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. valuesl = cs_scp1-scprvall recattr = cs_scp1-scprreca. -* normalize the XML - LOOP AT cs_scp1-scprvals ASSIGNING . - CONDENSE -recnumber. - ENDLOOP. - LOOP AT cs_scp1-scprreca ASSIGNING . - CONDENSE -recnumber. - ENDLOOP. - CALL FUNCTION 'SCPR_TEMPL_DB_FLDTXTVAR_GET' EXPORTING bcset_id = cs_scp1-scprattr-id @@ -71,9 +140,64 @@ CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. ENDMETHOD. + METHOD save. + + DATA: ls_scp1 TYPE ty_scp1, + ls_text TYPE scprtext. + + +* copy everything to local, the function module changes the values + ls_scp1 = is_scp1. + + READ TABLE ls_scp1-scprtext INTO ls_text WITH KEY langu = sy-langu. + + CALL FUNCTION 'SCPR_TEMPL_MN_TEMPLATE_SAVE' + EXPORTING + profid = ls_scp1-scprattr-id + proftext = ls_text-text + category = ls_scp1-scprattr-category + cli_dep = ls_scp1-scprattr-cli_dep + cli_cas = ls_scp1-scprattr-cli_cas + reftype = ls_scp1-scprattr-reftype + refname = ls_scp1-scprattr-refname + orgid = ls_scp1-scprattr-orgid + component = ls_scp1-scprattr-component + minrelease = ls_scp1-scprattr-minrelease + maxrelease = ls_scp1-scprattr-maxrelease + act_info = ls_scp1-scprattr-act_info + bcset_type = ls_scp1-scprattr-type + fldtxtvar_supplied = 'YES' + with_transp_insert = abap_false + with_progress_indicator = abap_true + remove_denied_data = abap_true + ask_for_cont_after_remove = abap_true + TABLES + values = ls_scp1-scprvals + valuesl = ls_scp1-scprvall + recattr = ls_scp1-scprreca + it_fldv = ls_scp1-scprfldv + texts = ls_scp1-scprtext + EXCEPTIONS + user_abort = 1 + error_in_transport_layer = 2 + inconsistent_data = 3 + database_error = 4 + OTHERS = 5. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error saving SCP1, { sy-tabix }| ). + ENDIF. + + ENDMETHOD. + + METHOD zif_abapgit_object~changed_by. - rv_user = c_user_unknown. + SELECT SINGLE modifier INTO rv_user FROM scprattr + WHERE id = ms_item-obj_name + AND version = 'N'. + IF sy-subrc <> 0 OR rv_user IS INITIAL. + rv_user = c_user_unknown. + ENDIF. ENDMETHOD. @@ -87,32 +211,67 @@ CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. METHOD zif_abapgit_object~delete. -* todo + DATA: lv_id TYPE scpr_id. + + lv_id = ms_item-obj_name. + + enqueue( ). + +* todo, this gives a popup + CALL FUNCTION 'SCPR_CTRL_DELETE' + EXPORTING + profid = lv_id + EXCEPTIONS + user_abort = 1 + profile_dont_exist = 2. + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |error while deleting SCP1, { sy-subrc }| ). + ENDIF. + + dequeue( ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. -* todo + DATA: ls_scp1 TYPE ty_scp1. + + + io_xml->read( + EXPORTING iv_name = 'SCP1' + CHANGING cg_data = ls_scp1 ). + + adjust_inbound( CHANGING cs_scp1 = ls_scp1 ). + + IF ls_scp1-scprattr-type = 'TMP'. +* todo, function module SCPR_PRSET_MN_BCSET_SAVE + BREAK-POINT. + ELSE. + save( ls_scp1 ). + ENDIF. + + dequeue( ). + + tadir_insert( iv_package ). ENDMETHOD. METHOD zif_abapgit_object~exists. - DATA: lv_profid TYPE scprattr-id. + DATA: lv_rc TYPE sy-subrc, + lv_profid TYPE scprattr-id. lv_profid = ms_item-obj_name. - CALL FUNCTION 'SCPR_DB_ATTR_GET_DETAIL' + CALL FUNCTION 'SCPR_BCSET_EXISTS' EXPORTING - profid = lv_profid - EXCEPTIONS - profile_dont_exist = 1 - OTHERS = 2. - rv_bool = boolc( sy-subrc = 0 ). + profid = lv_profid + IMPORTING + rc = lv_rc. + rv_bool = boolc( lv_rc = 0 ). ENDMETHOD. @@ -167,14 +326,14 @@ CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. orgid = ls_scp1-scprattr-orgid act_info = ls_scp1-scprattr-act_info. - IF ls_scp1-scprattr-type = 'TMP'. -* todo, Hierarchical +* todo, Hierarchical, fm SCPR_PRSET_DB_SUBP_GET_DETAIL, recursive? BREAK-POINT. ELSE. - get( CHANGING cs_scp1 = ls_scp1 ). + load( CHANGING cs_scp1 = ls_scp1 ). ENDIF. + adjust_outbound( CHANGING cs_scp1 = ls_scp1 ). io_xml->add( iv_name = 'SCP1' From fdb2483b70896980783d4feef2246dd07feeab9b Mon Sep 17 00:00:00 2001 From: larshp Date: Sun, 8 Jul 2018 11:12:13 +0000 Subject: [PATCH 3/3] remove breakpoints --- src/objects/zcl_abapgit_object_scp1.clas.abap | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objects/zcl_abapgit_object_scp1.clas.abap b/src/objects/zcl_abapgit_object_scp1.clas.abap index 3b3d1c2ba..41e468337 100644 --- a/src/objects/zcl_abapgit_object_scp1.clas.abap +++ b/src/objects/zcl_abapgit_object_scp1.clas.abap @@ -246,7 +246,7 @@ CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. IF ls_scp1-scprattr-type = 'TMP'. * todo, function module SCPR_PRSET_MN_BCSET_SAVE - BREAK-POINT. + zcx_abapgit_exception=>raise( |todo, SCP1| ). ELSE. save( ls_scp1 ). ENDIF. @@ -328,7 +328,7 @@ CLASS ZCL_ABAPGIT_OBJECT_SCP1 IMPLEMENTATION. IF ls_scp1-scprattr-type = 'TMP'. * todo, Hierarchical, fm SCPR_PRSET_DB_SUBP_GET_DETAIL, recursive? - BREAK-POINT. + zcx_abapgit_exception=>raise( |todo, SCP1| ). ELSE. load( CHANGING cs_scp1 = ls_scp1 ). ENDIF.