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.