From d936b8dc0b6ba6308d3740a4b137b069fb5129cf Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Tue, 4 Oct 2022 02:09:56 -0400 Subject: [PATCH] Prepare processing longtexts for sub components (#5786) --- .../texts/zcl_abapgit_longtexts.clas.abap | 104 ++++++++++++------ ...cl_abapgit_longtexts.clas.testclasses.abap | 61 ++++++++++ .../texts/zcl_abapgit_longtexts.clas.xml | 1 + .../texts/zif_abapgit_longtexts.intf.abap | 22 +++- test/abap_transpile.json | 2 + 5 files changed, 148 insertions(+), 42 deletions(-) create mode 100644 src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap diff --git a/src/objects/texts/zcl_abapgit_longtexts.clas.abap b/src/objects/texts/zcl_abapgit_longtexts.clas.abap index 9dbea4fe4..f76217429 100644 --- a/src/objects/texts/zcl_abapgit_longtexts.clas.abap +++ b/src/objects/texts/zcl_abapgit_longtexts.clas.abap @@ -1,36 +1,35 @@ CLASS zcl_abapgit_longtexts DEFINITION PUBLIC CREATE PRIVATE - GLOBAL FRIENDS zcl_abapgit_factory . + GLOBAL FRIENDS zcl_abapgit_factory. PUBLIC SECTION. - INTERFACES zif_abapgit_longtexts . - PROTECTED SECTION. + INTERFACES zif_abapgit_longtexts. - TYPES: - BEGIN OF ty_longtext, - dokil TYPE dokil, - head TYPE thead, - lines TYPE tline_tab, - END OF ty_longtext . - TYPES: - ty_longtexts TYPE STANDARD TABLE OF ty_longtext WITH NON-UNIQUE DEFAULT KEY . + PROTECTED SECTION. METHODS read IMPORTING - !iv_object_name TYPE sobj_name + !iv_object_name TYPE clike !iv_longtext_id TYPE dokil-id !it_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt !iv_main_lang_only TYPE abap_bool DEFAULT abap_false !iv_clear_fields TYPE abap_bool DEFAULT abap_true RETURNING - VALUE(rt_longtexts) TYPE ty_longtexts + VALUE(rt_longtexts) TYPE zif_abapgit_longtexts=>ty_longtexts RAISING zcx_abapgit_exception . PRIVATE SECTION. CONSTANTS c_docu_state_active TYPE dokstate VALUE 'A' ##NO_TEXT. + + METHODS escape_name + IMPORTING + !iv_longtext_id TYPE dokil-id + !iv_object_name TYPE clike + RETURNING + VALUE(rv_object) TYPE dokil-object. ENDCLASS. @@ -38,30 +37,58 @@ ENDCLASS. CLASS zcl_abapgit_longtexts IMPLEMENTATION. + METHOD escape_name. + " Prepare name for SQL LIKE condition + rv_object = iv_object_name. + + IF 'CA,CE,CO,CT,IA,IE,IO,WC,FU,FX,DI,IS,PS' CS iv_longtext_id. + " Document types of objects with sub-objects + rv_object+30 = '%'. + ELSEIF 'OD' CS iv_longtext_id. + rv_object+10 = '%'. + ENDIF. + + rv_object = replace( + val = rv_object + sub = '_' + with = '#_' + occ = 0 ). + ENDMETHOD. + + METHOD read. - DATA: ls_longtext TYPE ty_longtext, + DATA: ls_longtext TYPE zif_abapgit_longtexts=>ty_longtext, + lv_object TYPE dokil-object, lt_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt. FIELD-SYMBOLS: LIKE LINE OF lt_dokil. + lv_object = escape_name( + iv_longtext_id = iv_longtext_id + iv_object_name = iv_object_name ). + IF lines( it_dokil ) > 0. lt_dokil = it_dokil. + IF iv_main_lang_only = abap_true. + DELETE lt_dokil WHERE masterlang <> abap_true. + ENDIF. + ELSEIF iv_longtext_id IS NOT INITIAL. IF iv_main_lang_only = abap_true. SELECT * FROM dokil INTO TABLE lt_dokil WHERE id = iv_longtext_id - AND object = iv_object_name + AND object LIKE lv_object ESCAPE '#' AND masterlang = abap_true ORDER BY PRIMARY KEY. ELSE. SELECT * FROM dokil INTO TABLE lt_dokil WHERE id = iv_longtext_id - AND object = iv_object_name + AND object LIKE lv_object ESCAPE '#' ORDER BY PRIMARY KEY. ENDIF. ELSE. @@ -109,8 +136,8 @@ CLASS zcl_abapgit_longtexts IMPLEMENTATION. METHOD zif_abapgit_longtexts~changed_by. - DATA: lt_longtexts TYPE ty_longtexts. - FIELD-SYMBOLS: TYPE ty_longtext. + DATA: lt_longtexts TYPE zif_abapgit_longtexts=>ty_longtexts. + FIELD-SYMBOLS: TYPE zif_abapgit_longtexts=>ty_longtext. lt_longtexts = read( iv_object_name = iv_object_name iv_longtext_id = iv_longtext_id @@ -130,13 +157,19 @@ CLASS zcl_abapgit_longtexts IMPLEMENTATION. METHOD zif_abapgit_longtexts~delete. - DATA: lt_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt. + DATA: lt_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt, + lv_object TYPE dokil-object. + FIELD-SYMBOLS: TYPE dokil. + lv_object = escape_name( + iv_longtext_id = iv_longtext_id + iv_object_name = iv_object_name ). + SELECT * FROM dokil INTO TABLE lt_dokil WHERE id = iv_longtext_id - AND object = iv_object_name. + AND object LIKE lv_object ESCAPE '#'. LOOP AT lt_dokil ASSIGNING . @@ -161,13 +194,18 @@ CLASS zcl_abapgit_longtexts IMPLEMENTATION. METHOD zif_abapgit_longtexts~deserialize. - DATA: lt_longtexts TYPE ty_longtexts, + DATA: lt_longtexts TYPE zif_abapgit_longtexts=>ty_longtexts, + lv_object TYPE dokil-object, lt_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt, lv_no_main_lang TYPE dokil-masterlang. - FIELD-SYMBOLS: TYPE ty_longtext, + FIELD-SYMBOLS: TYPE zif_abapgit_longtexts=>ty_longtext, TYPE dokil. + lv_object = escape_name( + iv_longtext_id = iv_longtext_id + iv_object_name = iv_object_name ). + ii_xml->read( EXPORTING iv_name = iv_longtext_name @@ -195,7 +233,7 @@ CLASS zcl_abapgit_longtexts IMPLEMENTATION. SELECT * FROM dokil INTO TABLE lt_dokil WHERE id = iv_longtext_id - AND object = iv_object_name. + AND object LIKE lv_object ESCAPE '#'. LOOP AT lt_dokil ASSIGNING . @@ -227,23 +265,17 @@ CLASS zcl_abapgit_longtexts IMPLEMENTATION. METHOD zif_abapgit_longtexts~serialize. - DATA lt_longtexts TYPE ty_longtexts. - DATA lt_dokil LIKE it_dokil. - DATA lv_main_lang_only TYPE abap_bool. + rt_longtexts = read( iv_object_name = iv_object_name + iv_longtext_id = iv_longtext_id + it_dokil = it_dokil + iv_main_lang_only = ii_xml->i18n_params( )-main_language_only ). - lt_dokil = it_dokil. - lv_main_lang_only = ii_xml->i18n_params( )-main_language_only. - IF lv_main_lang_only = abap_true. - DELETE lt_dokil WHERE masterlang <> abap_true. + IF rt_longtexts IS SUPPLIED. + RETURN. ENDIF. - lt_longtexts = read( iv_object_name = iv_object_name - iv_longtext_id = iv_longtext_id - it_dokil = lt_dokil - iv_main_lang_only = lv_main_lang_only ). - ii_xml->add( iv_name = iv_longtext_name - ig_data = lt_longtexts ). + ig_data = rt_longtexts ). ENDMETHOD. ENDCLASS. diff --git a/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap b/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap new file mode 100644 index 000000000..5e0e26e3b --- /dev/null +++ b/src/objects/texts/zcl_abapgit_longtexts.clas.testclasses.abap @@ -0,0 +1,61 @@ +CLASS ltcl_longtexts DEFINITION FOR TESTING RISK LEVEL HARMLESS + DURATION SHORT FINAL. + + PRIVATE SECTION. + DATA mo_cut TYPE REF TO zcl_abapgit_longtexts. + + METHODS: + setup, + escape_name FOR TESTING. + +ENDCLASS. + +CLASS zcl_abapgit_longtexts DEFINITION LOCAL FRIENDS ltcl_longtexts. + +CLASS ltcl_longtexts IMPLEMENTATION. + + METHOD setup. + CREATE OBJECT mo_cut. + ENDMETHOD. + + METHOD escape_name. + + DATA lv_act TYPE dokil-object. + + " no sub-objects + lv_act = mo_cut->escape_name( + iv_longtext_id = 'CL' + iv_object_name = 'ZTEST' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_act + exp = 'ZTEST' ). + + lv_act = mo_cut->escape_name( + iv_longtext_id = 'CL' + iv_object_name = 'ZCL_TEST_TEXT' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_act + exp = 'ZCL#_TEST#_TEXT' ). + + " with sub-objects + lv_act = mo_cut->escape_name( + iv_longtext_id = 'CA' + iv_object_name = 'ZTEST' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_act + exp = 'ZTEST %' ). + + lv_act = mo_cut->escape_name( + iv_longtext_id = 'CA' + iv_object_name = 'ZCL_TEST_TEXT' ). + + cl_abap_unit_assert=>assert_equals( + act = lv_act + exp = 'ZCL#_TEST#_TEXT %' ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/texts/zcl_abapgit_longtexts.clas.xml b/src/objects/texts/zcl_abapgit_longtexts.clas.xml index 972d8b3a1..9f564f54a 100644 --- a/src/objects/texts/zcl_abapgit_longtexts.clas.xml +++ b/src/objects/texts/zcl_abapgit_longtexts.clas.xml @@ -10,6 +10,7 @@ X X X + X diff --git a/src/objects/texts/zif_abapgit_longtexts.intf.abap b/src/objects/texts/zif_abapgit_longtexts.intf.abap index 49eb3d653..8ecc3949e 100644 --- a/src/objects/texts/zif_abapgit_longtexts.intf.abap +++ b/src/objects/texts/zif_abapgit_longtexts.intf.abap @@ -1,6 +1,14 @@ INTERFACE zif_abapgit_longtexts PUBLIC . + TYPES: + BEGIN OF ty_longtext, + dokil TYPE dokil, + head TYPE thead, + lines TYPE tline_tab, + END OF ty_longtext . + TYPES: + ty_longtexts TYPE STANDARD TABLE OF ty_longtext WITH NON-UNIQUE DEFAULT KEY . METHODS changed_by IMPORTING @@ -13,17 +21,19 @@ INTERFACE zif_abapgit_longtexts zcx_abapgit_exception . METHODS serialize IMPORTING - !iv_longtext_name TYPE string DEFAULT 'LONGTEXTS' - !iv_object_name TYPE sobj_name - !iv_longtext_id TYPE dokil-id - !it_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt OPTIONAL - !ii_xml TYPE REF TO zif_abapgit_xml_output + !iv_longtext_name TYPE string DEFAULT 'LONGTEXTS' + !iv_object_name TYPE clike + !iv_longtext_id TYPE dokil-id + !it_dokil TYPE zif_abapgit_definitions=>ty_dokil_tt OPTIONAL + !ii_xml TYPE REF TO zif_abapgit_xml_output + RETURNING + VALUE(rt_longtexts) TYPE ty_longtexts RAISING zcx_abapgit_exception . METHODS deserialize IMPORTING !iv_longtext_name TYPE string DEFAULT 'LONGTEXTS' - !iv_object_name TYPE sobj_name + !iv_object_name TYPE clike !iv_longtext_id TYPE dokil-id !ii_xml TYPE REF TO zif_abapgit_xml_input !iv_main_language TYPE sy-langu diff --git a/test/abap_transpile.json b/test/abap_transpile.json index c997647e9..731495539 100644 --- a/test/abap_transpile.json +++ b/test/abap_transpile.json @@ -169,6 +169,8 @@ {"object": "ZCL_ABAPGIT_GIT_URL", "class": "ltcl_repo_online", "method": "test_repo_commit_show_urls"}, + {"object": "ZCL_ABAPGIT_LONGTEXTS", "class": "ltcl_longtexts", "method": "escape_name", "note": "Void type: DOKIL"}, + {"object": "ZCL_ABAPGIT_OBJECTS_PROGRAM", "class": "ltcl_test", "method": "strip_generation_comments_1", "note": "Void type: ABAPTXT255_TAB"}, {"object": "ZCL_ABAPGIT_OBJECTS_PROGRAM", "class": "ltcl_test", "method": "strip_generation_comments_2", "note": "Void type: ABAPTXT255_TAB"}, {"object": "ZCL_ABAPGIT_OBJECTS_FILES", "class": "ltcl_objects_files", "method": "read_abap", "note": "Void type: ABAPTXT255_TAB"},