From c21dc53e00d5a05a4b66a37061c8eb784e9d5b63 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Fri, 18 Apr 2025 09:46:58 +0200 Subject: [PATCH] user record: interface and factory (#7212) --- package.json | 6 +- .../zcl_abapgit_background_push_au.clas.abap | 8 +- src/env/zcl_abapgit_env_factory.clas.abap | 21 +++ src/env/zcl_abapgit_env_factory.clas.xml | 16 ++ src/env/zcl_abapgit_env_injector.clas.abap | 14 ++ src/env/zcl_abapgit_env_injector.clas.xml | 16 ++ src/env/zcl_abapgit_user_record.clas.abap | 163 ++++++++---------- ..._abapgit_user_record.clas.testclasses.abap | 4 +- src/env/zif_abapgit_user_record.intf.abap | 21 +++ src/env/zif_abapgit_user_record.intf.xml | 15 ++ .../lib/zcl_abapgit_gui_chunk_lib.clas.abap | 2 +- .../db/zcl_abapgit_gui_page_db.clas.abap | 2 +- .../zcl_abapgit_gui_page_sett_info.clas.abap | 2 +- .../zcl_abapgit_gui_page_commit.clas.abap | 4 +- .../pages/zcl_abapgit_gui_page_tags.clas.abap | 4 +- 15 files changed, 192 insertions(+), 106 deletions(-) create mode 100644 src/env/zcl_abapgit_env_factory.clas.abap create mode 100644 src/env/zcl_abapgit_env_factory.clas.xml create mode 100644 src/env/zcl_abapgit_env_injector.clas.abap create mode 100644 src/env/zcl_abapgit_env_injector.clas.xml create mode 100644 src/env/zif_abapgit_user_record.intf.abap create mode 100644 src/env/zif_abapgit_user_record.intf.xml diff --git a/package.json b/package.json index 57511d5a8..14a7c2bb5 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,11 @@ ] }, "devDependencies": { - "@abaplint/cli": "^2.113.108", + "@abaplint/cli": "^2.113.109", "@abaplint/database-sqlite": "^2.10.24", - "@abaplint/runtime": "^2.10.42", + "@abaplint/runtime": "^2.10.44", "express": "^4.21.2", - "@abaplint/transpiler-cli": "^2.10.42", + "@abaplint/transpiler-cli": "^2.10.44", "globals": "^16.0.0", "abapmerge": "^0.16.6", "c8": "^10.1.3", diff --git a/src/background/zcl_abapgit_background_push_au.clas.abap b/src/background/zcl_abapgit_background_push_au.clas.abap index 946aa62bf..5b24bea21 100644 --- a/src/background/zcl_abapgit_background_push_au.clas.abap +++ b/src/background/zcl_abapgit_background_push_au.clas.abap @@ -69,12 +69,12 @@ CLASS zcl_abapgit_background_push_au IMPLEMENTATION. METHOD determine_user_details. - DATA: lo_user_record TYPE REF TO zcl_abapgit_user_record. + DATA li_user_record TYPE REF TO zif_abapgit_user_record. - lo_user_record = zcl_abapgit_user_record=>get_instance( ). - rs_user-name = lo_user_record->get_name( iv_changed_by ). - rs_user-email = lo_user_record->get_email( iv_changed_by ). + li_user_record = zcl_abapgit_env_factory=>get_user_record( ). + rs_user-name = li_user_record->get_name( iv_changed_by ). + rs_user-email = li_user_record->get_email( iv_changed_by ). * If no email, fall back to localhost/default email IF rs_user-email IS INITIAL. diff --git a/src/env/zcl_abapgit_env_factory.clas.abap b/src/env/zcl_abapgit_env_factory.clas.abap new file mode 100644 index 000000000..f5483da6b --- /dev/null +++ b/src/env/zcl_abapgit_env_factory.clas.abap @@ -0,0 +1,21 @@ +CLASS zcl_abapgit_env_factory DEFINITION PUBLIC GLOBAL FRIENDS zcl_abapgit_env_injector. + PUBLIC SECTION. + CLASS-METHODS get_user_record + RETURNING + VALUE(ri_user_record) TYPE REF TO zif_abapgit_user_record. + + PRIVATE SECTION. + CLASS-DATA gi_user_record TYPE REF TO zif_abapgit_user_record. +ENDCLASS. + +CLASS zcl_abapgit_env_factory IMPLEMENTATION. + + METHOD get_user_record. + IF gi_user_record IS NOT BOUND. + CREATE OBJECT gi_user_record TYPE zcl_abapgit_user_record. + ENDIF. + + ri_user_record = gi_user_record. + ENDMETHOD. + +ENDCLASS. diff --git a/src/env/zcl_abapgit_env_factory.clas.xml b/src/env/zcl_abapgit_env_factory.clas.xml new file mode 100644 index 000000000..b0ec0972c --- /dev/null +++ b/src/env/zcl_abapgit_env_factory.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_ENV_FACTORY + E + ZCL_ABAPGIT_ENV_FACTORY + 1 + X + X + X + + + + diff --git a/src/env/zcl_abapgit_env_injector.clas.abap b/src/env/zcl_abapgit_env_injector.clas.abap new file mode 100644 index 000000000..44290b6c8 --- /dev/null +++ b/src/env/zcl_abapgit_env_injector.clas.abap @@ -0,0 +1,14 @@ +CLASS zcl_abapgit_env_injector DEFINITION PUBLIC. + PUBLIC SECTION. + CLASS-METHODS set_user_record + IMPORTING + !ii_user_record TYPE REF TO zif_abapgit_user_record. +ENDCLASS. + +CLASS zcl_abapgit_env_injector IMPLEMENTATION. + + METHOD set_user_record. + zcl_abapgit_env_factory=>gi_user_record = ii_user_record. + ENDMETHOD. + +ENDCLASS. diff --git a/src/env/zcl_abapgit_env_injector.clas.xml b/src/env/zcl_abapgit_env_injector.clas.xml new file mode 100644 index 000000000..e65678311 --- /dev/null +++ b/src/env/zcl_abapgit_env_injector.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_ENV_INJECTOR + E + ZCL_ABAPGIT_ENV_INJECTOR + 1 + X + X + X + + + + diff --git a/src/env/zcl_abapgit_user_record.clas.abap b/src/env/zcl_abapgit_user_record.clas.abap index 2a43a9c36..60e8f9c05 100644 --- a/src/env/zcl_abapgit_user_record.clas.abap +++ b/src/env/zcl_abapgit_user_record.clas.abap @@ -1,29 +1,14 @@ CLASS zcl_abapgit_user_record DEFINITION PUBLIC FINAL - CREATE PRIVATE. + CREATE PRIVATE + GLOBAL FRIENDS zcl_abapgit_env_factory. PUBLIC SECTION. CLASS-METHODS reset. - CLASS-METHODS get_instance - RETURNING - VALUE(ro_user) TYPE REF TO zcl_abapgit_user_record. - METHODS get_name - IMPORTING - iv_username TYPE sy-uname - RETURNING - VALUE(rv_name) TYPE string. - METHODS get_email - IMPORTING - iv_username TYPE sy-uname - RETURNING - VALUE(rv_email) TYPE string. - METHODS get_title - IMPORTING - iv_username TYPE sy-uname - RETURNING - VALUE(rv_title) TYPE string. + INTERFACES zif_abapgit_user_record. + PROTECTED SECTION. PRIVATE SECTION. TYPES: @@ -65,41 +50,30 @@ ENDCLASS. -CLASS zcl_abapgit_user_record IMPLEMENTATION. - METHOD get_instance. - CREATE OBJECT ro_user. - ENDMETHOD. +CLASS ZCL_ABAPGIT_USER_RECORD IMPLEMENTATION. - METHOD get_title. -* the queried username might not exist, refactored for open-abap compatibility - - DATA lr_addr3 TYPE REF TO data. - FIELD-SYMBOLS TYPE any. - FIELD-SYMBOLS TYPE simple. + METHOD build_cache. + " Get user details TRY. - CREATE DATA lr_addr3 TYPE ('ADDR3_VAL'). - CATCH cx_sy_create_data_error. - RETURN. + check_user_exists( + EXPORTING + iv_user = iv_user + IMPORTING + ev_fullname = rs_user-name + ev_email = rs_user-email ). + CATCH zcx_abapgit_exception. + " Could not find user, try to get from other clients + rs_user = get_user_dtls_from_other_clnt( iv_user ). ENDTRY. - ASSIGN lr_addr3->* TO . - CALL FUNCTION 'SUSR_USER_ADDRESS_READ' - EXPORTING - user_name = iv_username - IMPORTING - user_address = - EXCEPTIONS - user_address_not_found = 1 - OTHERS = 2. - IF sy-subrc = 0. - ASSIGN COMPONENT 'NAME_TEXT' OF STRUCTURE TO . - rv_title = . - ENDIF. + rs_user-user = iv_user. + INSERT rs_user INTO TABLE gt_user. ENDMETHOD. + METHOD check_user_exists. DATA lt_return TYPE STANDARD TABLE OF bapiret2 WITH DEFAULT KEY. @@ -132,51 +106,6 @@ CLASS zcl_abapgit_user_record IMPLEMENTATION. ENDMETHOD. - METHOD build_cache. - - " Get user details - TRY. - check_user_exists( - EXPORTING - iv_user = iv_user - IMPORTING - ev_fullname = rs_user-name - ev_email = rs_user-email ). - CATCH zcx_abapgit_exception. - " Could not find user, try to get from other clients - rs_user = get_user_dtls_from_other_clnt( iv_user ). - ENDTRY. - - rs_user-user = iv_user. - INSERT rs_user INTO TABLE gt_user. - - ENDMETHOD. - - - METHOD get_email. - - rv_email = read_cache( iv_username )-email. - - ENDMETHOD. - - - METHOD read_cache. - - READ TABLE gt_user INTO rs_user WITH TABLE KEY user = iv_user. - IF sy-subrc <> 0. - rs_user = build_cache( iv_user ). - ENDIF. - - ENDMETHOD. - - - METHOD get_name. - - rv_name = read_cache( iv_username )-name. - - ENDMETHOD. - - METHOD get_user_dtls_from_other_clnt. CONSTANTS lc_cc_category TYPE string VALUE 'C'. @@ -211,7 +140,61 @@ CLASS zcl_abapgit_user_record IMPLEMENTATION. ENDMETHOD. + METHOD read_cache. + + READ TABLE gt_user INTO rs_user WITH TABLE KEY user = iv_user. + IF sy-subrc <> 0. + rs_user = build_cache( iv_user ). + ENDIF. + + ENDMETHOD. + + METHOD reset. CLEAR gt_user. ENDMETHOD. + + + METHOD zif_abapgit_user_record~get_email. + + rv_email = read_cache( iv_username )-email. + + ENDMETHOD. + + + METHOD zif_abapgit_user_record~get_name. + + rv_name = read_cache( iv_username )-name. + + ENDMETHOD. + + + METHOD zif_abapgit_user_record~get_title. +* the queried username might not exist, refactored for open-abap compatibility + + DATA lr_addr3 TYPE REF TO data. + FIELD-SYMBOLS TYPE any. + FIELD-SYMBOLS TYPE simple. + + TRY. + CREATE DATA lr_addr3 TYPE ('ADDR3_VAL'). + CATCH cx_sy_create_data_error. + RETURN. + ENDTRY. + ASSIGN lr_addr3->* TO . + + CALL FUNCTION 'SUSR_USER_ADDRESS_READ' + EXPORTING + user_name = iv_username + IMPORTING + user_address = + EXCEPTIONS + user_address_not_found = 1 + OTHERS = 2. + IF sy-subrc = 0. + ASSIGN COMPONENT 'NAME_TEXT' OF STRUCTURE TO . + rv_title = . + ENDIF. + + ENDMETHOD. ENDCLASS. diff --git a/src/env/zcl_abapgit_user_record.clas.testclasses.abap b/src/env/zcl_abapgit_user_record.clas.testclasses.abap index 72ab1eb1f..0770c462f 100644 --- a/src/env/zcl_abapgit_user_record.clas.testclasses.abap +++ b/src/env/zcl_abapgit_user_record.clas.testclasses.abap @@ -16,10 +16,10 @@ ENDCLASS. CLASS ltcl_user_record IMPLEMENTATION. METHOD test_invalid_user. - DATA: lo_user_record TYPE REF TO zcl_abapgit_user_record. + DATA li_user_record TYPE REF TO zif_abapgit_user_record. zcl_abapgit_user_record=>reset( ). - lo_user_record = zcl_abapgit_user_record=>get_instance( ). + li_user_record = zcl_abapgit_env_factory=>get_user_record( ). cl_abap_unit_assert=>assert_equals( exp = 0 diff --git a/src/env/zif_abapgit_user_record.intf.abap b/src/env/zif_abapgit_user_record.intf.abap new file mode 100644 index 000000000..baf376c26 --- /dev/null +++ b/src/env/zif_abapgit_user_record.intf.abap @@ -0,0 +1,21 @@ +INTERFACE zif_abapgit_user_record PUBLIC. + + METHODS get_name + IMPORTING + iv_username TYPE sy-uname + RETURNING + VALUE(rv_name) TYPE string. + + METHODS get_email + IMPORTING + iv_username TYPE sy-uname + RETURNING + VALUE(rv_email) TYPE string. + + METHODS get_title + IMPORTING + iv_username TYPE sy-uname + RETURNING + VALUE(rv_title) TYPE string. + +ENDINTERFACE. diff --git a/src/env/zif_abapgit_user_record.intf.xml b/src/env/zif_abapgit_user_record.intf.xml new file mode 100644 index 000000000..5bb2af8cc --- /dev/null +++ b/src/env/zif_abapgit_user_record.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_USER_RECORD + E + ZIF_ABAPGIT_USER_RECORD + 2 + 1 + X + + + + diff --git a/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap index 68fcd1ae4..5c7da27e9 100644 --- a/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap +++ b/src/ui/lib/zcl_abapgit_gui_chunk_lib.clas.abap @@ -1323,7 +1323,7 @@ CLASS zcl_abapgit_gui_chunk_lib IMPLEMENTATION. ENDIF. IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown AND iv_suppress_title = abap_false. - lv_title = zcl_abapgit_user_record=>get_instance( )->get_title( iv_username ). + lv_title = zcl_abapgit_env_factory=>get_user_record( )->get_title( iv_username ). ENDIF. lv_jump = |{ zif_abapgit_definitions=>c_action-jump_user }?user={ iv_username }|. diff --git a/src/ui/pages/db/zcl_abapgit_gui_page_db.clas.abap b/src/ui/pages/db/zcl_abapgit_gui_page_db.clas.abap index dcca8eef3..99aa38c7b 100644 --- a/src/ui/pages/db/zcl_abapgit_gui_page_db.clas.abap +++ b/src/ui/pages/db/zcl_abapgit_gui_page_db.clas.abap @@ -367,7 +367,7 @@ CLASS zcl_abapgit_gui_page_db IMPLEMENTATION. WHEN zcl_abapgit_persistence_db=>c_type_user. lv_descr = 'Personal Settings'. - ls_explanation-value = zcl_abapgit_user_record=>get_instance( )->get_name( is_data-value ). + ls_explanation-value = zcl_abapgit_env_factory=>get_user_record( )->get_name( is_data-value ). WHEN zcl_abapgit_persistence_db=>c_type_settings. lv_descr = 'Global Settings'. diff --git a/src/ui/pages/sett/zcl_abapgit_gui_page_sett_info.clas.abap b/src/ui/pages/sett/zcl_abapgit_gui_page_sett_info.clas.abap index f256a63c6..cc18bef81 100644 --- a/src/ui/pages/sett/zcl_abapgit_gui_page_sett_info.clas.abap +++ b/src/ui/pages/sett/zcl_abapgit_gui_page_sett_info.clas.abap @@ -194,7 +194,7 @@ CLASS zcl_abapgit_gui_page_sett_info IMPLEMENTATION. ENDIF. IF iv_username <> zcl_abapgit_objects_super=>c_user_unknown. - lv_title = zcl_abapgit_user_record=>get_instance( )->get_title( iv_username ). + lv_title = zcl_abapgit_env_factory=>get_user_record( )->get_title( iv_username ). ENDIF. rv_user = iv_username. diff --git a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap index 5ca2e2cf7..387954a76 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_commit.clas.abap @@ -241,7 +241,7 @@ CLASS zcl_abapgit_gui_page_commit IMPLEMENTATION. ENDIF. IF rv_email IS INITIAL. " get default from user record - rv_email = zcl_abapgit_user_record=>get_instance( )->get_email( sy-uname ). + rv_email = zcl_abapgit_env_factory=>get_user_record( )->get_email( sy-uname ). ENDIF. ENDMETHOD. @@ -259,7 +259,7 @@ CLASS zcl_abapgit_gui_page_commit IMPLEMENTATION. ENDIF. IF rv_user IS INITIAL. " get default from user record - rv_user = zcl_abapgit_user_record=>get_instance( )->get_name( sy-uname ). + rv_user = zcl_abapgit_env_factory=>get_user_record( )->get_name( sy-uname ). ENDIF. ENDMETHOD. diff --git a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap index 8071ebc42..b97f4079b 100644 --- a/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap +++ b/src/ui/pages/zcl_abapgit_gui_page_tags.clas.abap @@ -237,7 +237,7 @@ CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION. ENDIF. IF rv_email IS INITIAL. " get default from user record - rv_email = zcl_abapgit_user_record=>get_instance( )->get_email( sy-uname ). + rv_email = zcl_abapgit_env_factory=>get_user_record( )->get_email( sy-uname ). ENDIF. ENDMETHOD. @@ -255,7 +255,7 @@ CLASS zcl_abapgit_gui_page_tags IMPLEMENTATION. ENDIF. IF rv_user IS INITIAL. " get default from user record - rv_user = zcl_abapgit_user_record=>get_instance( )->get_name( sy-uname ). + rv_user = zcl_abapgit_env_factory=>get_user_record( )->get_name( sy-uname ). ENDIF. ENDMETHOD.