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 756fd871c..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( iv_changed_by ).
- rs_user-name = lo_user_record->get_name( ).
- rs_user-email = lo_user_record->get_email( ).
+ 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 47e848a35..60e8f9c05 100644
--- a/src/env/zcl_abapgit_user_record.clas.abap
+++ b/src/env/zcl_abapgit_user_record.clas.abap
@@ -1,45 +1,26 @@
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
- IMPORTING
- !iv_user TYPE sy-uname
- RETURNING
- VALUE(ro_user) TYPE REF TO zcl_abapgit_user_record.
- METHODS constructor
- IMPORTING
- !iv_user TYPE sy-uname.
- METHODS get_name
- RETURNING
- VALUE(rv_name) TYPE string.
- METHODS get_email
- RETURNING
- VALUE(rv_email) TYPE string.
- CLASS-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:
BEGIN OF ty_user,
- user TYPE sy-uname,
- o_user TYPE REF TO zcl_abapgit_user_record,
+ user TYPE sy-uname,
+ name TYPE string,
+ email TYPE string,
END OF ty_user.
CLASS-DATA gt_user TYPE HASHED TABLE OF ty_user WITH UNIQUE KEY user.
- DATA: BEGIN OF ms_user,
- name TYPE string,
- email TYPE string,
- END OF ms_user .
-
- METHODS check_user_exists
+ CLASS-METHODS check_user_exists
IMPORTING
iv_user TYPE sy-uname
EXPORTING
@@ -48,46 +29,51 @@ CLASS zcl_abapgit_user_record DEFINITION
RAISING
zcx_abapgit_exception.
- METHODS get_user_dtls_from_other_clnt
+ CLASS-METHODS get_user_dtls_from_other_clnt
IMPORTING
- iv_user TYPE sy-uname.
+ iv_user TYPE sy-uname
+ RETURNING
+ VALUE(rs_user) TYPE ty_user.
+
+ CLASS-METHODS build_cache
+ IMPORTING
+ iv_user TYPE sy-uname
+ RETURNING
+ VALUE(rs_user) TYPE ty_user.
+
+ CLASS-METHODS read_cache
+ IMPORTING
+ iv_user TYPE sy-uname
+ RETURNING
+ VALUE(rs_user) TYPE ty_user.
ENDCLASS.
-CLASS zcl_abapgit_user_record IMPLEMENTATION.
+CLASS ZCL_ABAPGIT_USER_RECORD IMPLEMENTATION.
- METHOD get_title.
-* the queried username might not exist, so this method is static
-* 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.
@@ -120,63 +106,6 @@ CLASS zcl_abapgit_user_record IMPLEMENTATION.
ENDMETHOD.
- METHOD constructor.
-
- DATA ls_user TYPE ty_user.
-
- " Get user details
- TRY.
- check_user_exists(
- EXPORTING
- iv_user = iv_user
- IMPORTING
- ev_fullname = ms_user-name
- ev_email = ms_user-email ).
- CATCH zcx_abapgit_exception.
- " Could not find user, try to get from other clients
- get_user_dtls_from_other_clnt( iv_user ).
- ENDTRY.
-
- " If the user has been found add it to the list
- IF ms_user-name IS NOT INITIAL AND ms_user-email IS NOT INITIAL.
- ls_user-user = iv_user.
- ls_user-o_user = me.
- INSERT ls_user INTO TABLE gt_user.
- ENDIF.
-
- ENDMETHOD.
-
-
- METHOD get_email.
-
- rv_email = ms_user-email.
-
- ENDMETHOD.
-
-
- METHOD get_instance.
-
- FIELD-SYMBOLS TYPE ty_user.
-
- READ TABLE gt_user ASSIGNING WITH TABLE KEY user = iv_user.
- IF sy-subrc = 0.
- ro_user = -o_user.
- ELSE.
- CREATE OBJECT ro_user
- EXPORTING
- iv_user = iv_user.
- ENDIF.
-
- ENDMETHOD.
-
-
- METHOD get_name.
-
- rv_name = ms_user-name.
-
- ENDMETHOD.
-
-
METHOD get_user_dtls_from_other_clnt.
CONSTANTS lc_cc_category TYPE string VALUE 'C'.
@@ -190,7 +119,7 @@ CLASS zcl_abapgit_user_record IMPLEMENTATION.
ORDER BY PRIMARY KEY.
LOOP AT lt_dev_clients ASSIGNING .
- SELECT SINGLE p~name_text a~smtp_addr INTO (ms_user-name, ms_user-email)
+ SELECT SINGLE u~bname p~name_text a~smtp_addr INTO (rs_user-user, rs_user-name, rs_user-email)
FROM usr21 AS u
INNER JOIN adrp AS p ON p~persnumber = u~persnumber
AND p~client = u~mandt
@@ -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 02ce85af2..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( c_wrong_user ).
+ 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 2c3603836..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_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 e6e435979..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( is_data-value )->get_name( ).
+ 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 b723d2b8d..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_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 2949faa54..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( sy-uname )->get_email( ).
+ 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( sy-uname )->get_name( ).
+ 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 9e589bd70..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( sy-uname )->get_email( ).
+ 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( sy-uname )->get_name( ).
+ rv_user = zcl_abapgit_env_factory=>get_user_record( )->get_name( sy-uname ).
ENDIF.
ENDMETHOD.