From 4b6c42446512f7d494193e17edcbc485bd0aec61 Mon Sep 17 00:00:00 2001 From: Alexander Tsybulsky Date: Sun, 11 Oct 2020 11:47:37 +0300 Subject: [PATCH] html event abstraction, phase 5 - case insensitive query and form_data (#4007) * case-insensitive string map * refactor gui_event and its UTs * remove query uppercased in pages Co-authored-by: Lars Hvam --- src/ui/core/zcl_abapgit_gui_event.clas.abap | 66 +++---------- ...cl_abapgit_gui_event.clas.testclasses.abap | 97 +++++++++++-------- src/ui/core/zif_abapgit_gui_event.intf.abap | 4 - .../db/zcl_abapgit_gui_page_db_edit.clas.abap | 2 +- src/ui/zcl_abapgit_gui_page_commit.clas.abap | 2 +- src/ui/zcl_abapgit_gui_page_main.clas.abap | 4 +- .../zcl_abapgit_gui_page_merge_res.clas.abap | 2 +- .../zcl_abapgit_gui_page_repo_view.clas.abap | 2 +- src/ui/zcl_abapgit_gui_page_stage.clas.abap | 2 +- src/utils/zcl_abapgit_string_map.clas.abap | 33 ++++++- ...l_abapgit_string_map.clas.testclasses.abap | 32 ++++++ 11 files changed, 138 insertions(+), 108 deletions(-) diff --git a/src/ui/core/zcl_abapgit_gui_event.clas.abap b/src/ui/core/zcl_abapgit_gui_event.clas.abap index 32d3f79d7..93f18a319 100644 --- a/src/ui/core/zcl_abapgit_gui_event.clas.abap +++ b/src/ui/core/zcl_abapgit_gui_event.clas.abap @@ -16,9 +16,7 @@ CLASS zcl_abapgit_gui_event DEFINITION PROTECTED SECTION. PRIVATE SECTION. DATA mo_query TYPE REF TO zcl_abapgit_string_map. - DATA mo_query_upper_cased TYPE REF TO zcl_abapgit_string_map. DATA mo_form_data TYPE REF TO zcl_abapgit_string_map. - DATA mo_form_data_upper_cased TYPE REF TO zcl_abapgit_string_map. METHODS fields_to_map IMPORTING @@ -28,17 +26,6 @@ CLASS zcl_abapgit_gui_event DEFINITION RAISING zcx_abapgit_exception. - METHODS fields_to_map_macro - IMPORTING - it_fields TYPE tihttpnvp - iv_upper_cased TYPE abap_bool - CHANGING - co_string_map_lower TYPE REF TO zcl_abapgit_string_map - co_string_map_upper TYPE REF TO zcl_abapgit_string_map - co_string_map_return TYPE REF TO zcl_abapgit_string_map - RAISING - zcx_abapgit_exception. - ENDCLASS. @@ -59,7 +46,7 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION. METHOD fields_to_map. FIELD-SYMBOLS LIKE LINE OF it_fields. - CREATE OBJECT ro_string_map. + CREATE OBJECT ro_string_map EXPORTING iv_case_insensitive = abap_true. LOOP AT it_fields ASSIGNING . ro_string_map->set( iv_key = -name @@ -68,53 +55,26 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION. ENDMETHOD. - METHOD fields_to_map_macro. - - FIELD-SYMBOLS TYPE REF TO zcl_abapgit_string_map. - - IF iv_upper_cased = abap_true. - ASSIGN co_string_map_upper TO . - ELSE. - ASSIGN co_string_map_lower TO . - ENDIF. - - IF IS NOT BOUND. - = fields_to_map( it_fields ). - ->freeze( ). - ENDIF. - co_string_map_return = . - - ENDMETHOD. - - METHOD zif_abapgit_gui_event~form_data. - fields_to_map_macro( - EXPORTING - iv_upper_cased = iv_upper_cased - it_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( - it_post_data = zif_abapgit_gui_event~mt_postdata - iv_upper_cased = iv_upper_cased ) - CHANGING - co_string_map_upper = mo_form_data_upper_cased - co_string_map_lower = mo_form_data - co_string_map_return = ro_string_map ). + IF mo_form_data IS NOT BOUND. + mo_form_data = fields_to_map( + zcl_abapgit_html_action_utils=>parse_post_form_data( zif_abapgit_gui_event~mt_postdata ) ). + mo_form_data->freeze( ). + ENDIF. + ro_string_map = mo_form_data. ENDMETHOD. METHOD zif_abapgit_gui_event~query. - fields_to_map_macro( - EXPORTING - iv_upper_cased = iv_upper_cased - it_fields = zcl_abapgit_html_action_utils=>parse_fields( - iv_string = zif_abapgit_gui_event~mv_getdata - iv_upper_cased = iv_upper_cased ) - CHANGING - co_string_map_upper = mo_query_upper_cased - co_string_map_lower = mo_query - co_string_map_return = ro_string_map ). + IF mo_query IS NOT BOUND. + mo_query = fields_to_map( + zcl_abapgit_html_action_utils=>parse_fields( zif_abapgit_gui_event~mv_getdata ) ). + mo_query->freeze( ). + ENDIF. + ro_string_map = mo_query. ENDMETHOD. ENDCLASS. diff --git a/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap b/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap index f82b12c3d..2ac8464a3 100644 --- a/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap +++ b/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap @@ -6,18 +6,20 @@ CLASS ltcl_event DEFINITION PRIVATE SECTION. + METHODS query_wrong_data FOR TESTING RAISING zcx_abapgit_exception. + METHODS form_wrong_data FOR TESTING RAISING zcx_abapgit_exception. METHODS query FOR TESTING RAISING zcx_abapgit_exception. METHODS form_data FOR TESTING RAISING zcx_abapgit_exception. + METHODS immutability FOR TESTING RAISING zcx_abapgit_exception. ENDCLASS. CLASS ltcl_event IMPLEMENTATION. - METHOD query. + METHOD query_wrong_data. DATA li_cut TYPE REF TO zif_abapgit_gui_event. DATA lo_map TYPE REF TO zcl_abapgit_string_map. - DATA lo_x TYPE REF TO zcx_abapgit_exception. CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event EXPORTING @@ -29,6 +31,30 @@ CLASS ltcl_event IMPLEMENTATION. act = lo_map->size( ) exp = 0 ). + ENDMETHOD. + + METHOD form_wrong_data. + + DATA li_cut TYPE REF TO zif_abapgit_gui_event. + DATA lo_map TYPE REF TO zcl_abapgit_string_map. + + CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event + EXPORTING + iv_action = 'XXX'. + + lo_map = li_cut->form_data( ). + cl_abap_unit_assert=>assert_equals( + act = lo_map->size( ) + exp = 0 ). + + ENDMETHOD. + + METHOD query. + + DATA li_cut TYPE REF TO zif_abapgit_gui_event. + DATA lo_map TYPE REF TO zcl_abapgit_string_map. + DATA lo_x TYPE REF TO zcx_abapgit_exception. + CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event EXPORTING iv_action = 'XXX' @@ -39,10 +65,11 @@ CLASS ltcl_event IMPLEMENTATION. act = li_cut->form_data( )->size( ) exp = 0 ). - lo_map = li_cut->query( iv_upper_cased = abap_false ). + lo_map = li_cut->query( ). cl_abap_unit_assert=>assert_equals( act = lo_map->size( ) exp = 2 ). + cl_abap_unit_assert=>assert_equals( act = lo_map->get( 'a' ) exp = 'b' ). @@ -50,10 +77,7 @@ CLASS ltcl_event IMPLEMENTATION. act = lo_map->get( 'b' ) exp = 'c' ). - lo_map = li_cut->query( iv_upper_cased = abap_true ). - cl_abap_unit_assert=>assert_equals( - act = lo_map->size( ) - exp = 2 ). + " Case insensitivity cl_abap_unit_assert=>assert_equals( act = lo_map->get( 'A' ) exp = 'b' ). @@ -61,22 +85,6 @@ CLASS ltcl_event IMPLEMENTATION. act = lo_map->get( 'B' ) exp = 'c' ). - " Check defaults - cl_abap_unit_assert=>assert_equals( - act = li_cut->query( )->get( 'A' ) - exp = 'b' ). - - TRY. - lo_map->set( - iv_key = 'x' - iv_val = 'y' ). - cl_abap_unit_assert=>fail( ). - CATCH zcx_abapgit_exception INTO lo_x. - cl_abap_unit_assert=>assert_char_cp( - act = lo_x->get_text( ) - exp = '*immutable*' ). - ENDTRY. - ENDMETHOD. METHOD form_data. @@ -86,15 +94,6 @@ CLASS ltcl_event IMPLEMENTATION. DATA lo_x TYPE REF TO zcx_abapgit_exception. DATA lt_postdata TYPE cnht_post_data_tab. - CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event - EXPORTING - iv_action = 'XXX'. - - lo_map = li_cut->form_data( ). - cl_abap_unit_assert=>assert_equals( - act = lo_map->size( ) - exp = 0 ). - APPEND 'a=b&b=c' TO lt_postdata. CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event EXPORTING @@ -106,10 +105,11 @@ CLASS ltcl_event IMPLEMENTATION. act = li_cut->query( )->size( ) exp = 0 ). - lo_map = li_cut->form_data( iv_upper_cased = abap_false ). + lo_map = li_cut->form_data( ). cl_abap_unit_assert=>assert_equals( act = lo_map->size( ) exp = 2 ). + cl_abap_unit_assert=>assert_equals( act = lo_map->get( 'a' ) exp = 'b' ). @@ -117,7 +117,7 @@ CLASS ltcl_event IMPLEMENTATION. act = lo_map->get( 'b' ) exp = 'c' ). - lo_map = li_cut->form_data( iv_upper_cased = abap_true ). + " Case insensitivity cl_abap_unit_assert=>assert_equals( act = lo_map->size( ) exp = 2 ). @@ -128,13 +128,31 @@ CLASS ltcl_event IMPLEMENTATION. act = lo_map->get( 'B' ) exp = 'c' ). - " Check defaults - cl_abap_unit_assert=>assert_equals( - act = li_cut->form_data( )->get( 'a' ) - exp = 'b' ). + ENDMETHOD. + + METHOD immutability. + + DATA li_cut TYPE REF TO zif_abapgit_gui_event. + DATA lo_x TYPE REF TO zcx_abapgit_exception. + + CREATE OBJECT li_cut TYPE zcl_abapgit_gui_event + EXPORTING + iv_getdata = 'a=b&b=c' + iv_action = 'XXX'. TRY. - lo_map->set( + li_cut->form_data( )->set( + iv_key = 'x' + iv_val = 'y' ). + cl_abap_unit_assert=>fail( ). + CATCH zcx_abapgit_exception INTO lo_x. + cl_abap_unit_assert=>assert_char_cp( + act = lo_x->get_text( ) + exp = '*immutable*' ). + ENDTRY. + + TRY. + li_cut->query( )->set( iv_key = 'x' iv_val = 'y' ). cl_abap_unit_assert=>fail( ). @@ -145,4 +163,5 @@ CLASS ltcl_event IMPLEMENTATION. ENDTRY. ENDMETHOD. + ENDCLASS. diff --git a/src/ui/core/zif_abapgit_gui_event.intf.abap b/src/ui/core/zif_abapgit_gui_event.intf.abap index 8d6ef0367..d10eb30ea 100644 --- a/src/ui/core/zif_abapgit_gui_event.intf.abap +++ b/src/ui/core/zif_abapgit_gui_event.intf.abap @@ -7,16 +7,12 @@ INTERFACE zif_abapgit_gui_event DATA mi_gui_services TYPE REF TO zif_abapgit_gui_services READ-ONLY. METHODS query - IMPORTING - iv_upper_cased TYPE abap_bool DEFAULT abap_true RETURNING VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map RAISING zcx_abapgit_exception. METHODS form_data - IMPORTING - iv_upper_cased TYPE abap_bool DEFAULT abap_false RETURNING VALUE(ro_string_map) TYPE REF TO zcl_abapgit_string_map RAISING diff --git a/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap b/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap index 82c1956b3..a997171b9 100644 --- a/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap +++ b/src/ui/db/zcl_abapgit_gui_page_db_edit.clas.abap @@ -56,7 +56,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION. DATA lo_map TYPE REF TO zcl_abapgit_string_map. - lo_map = ii_event->form_data( iv_upper_cased = abap_true ). + lo_map = ii_event->form_data( ). rs_content-type = lo_map->get( 'TYPE' ). rs_content-value = lo_map->get( 'VALUE' ). rs_content-data_str = lo_map->get( 'XMLDATA' ). diff --git a/src/ui/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/zcl_abapgit_gui_page_commit.clas.abap index 037679749..557b26114 100644 --- a/src/ui/zcl_abapgit_gui_page_commit.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_commit.clas.abap @@ -181,7 +181,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. DATA lo_map TYPE REF TO zcl_abapgit_string_map. - lo_map = ii_event->form_data( iv_upper_cased = abap_true ). + lo_map = ii_event->form_data( ). lo_map->to_abap( CHANGING cs_container = rs_commit ). REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf diff --git a/src/ui/zcl_abapgit_gui_page_main.clas.abap b/src/ui/zcl_abapgit_gui_page_main.clas.abap index a4701cc3a..245a695ab 100644 --- a/src/ui/zcl_abapgit_gui_page_main.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_main.clas.abap @@ -94,7 +94,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-select. - lv_key = ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ). + lv_key = ii_event->query( )->get( 'KEY' ). zcl_abapgit_persistence_user=>get_instance( )->set_repo_show( lv_key ). TRY. @@ -134,7 +134,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MAIN IMPLEMENTATION. WHEN zif_abapgit_definitions=>c_action-repo_settings. - lv_key = ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ). + lv_key = ii_event->query( )->get( 'KEY' ). CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_sett EXPORTING io_repo = zcl_abapgit_repo_srv=>get_instance( )->get( lv_key ). diff --git a/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap index a015c963c..35725dc91 100644 --- a/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap @@ -120,7 +120,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION. FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict. - lv_merge_content = ii_event->form_data( iv_upper_cased = abap_true )->get( 'MERGE_CONTENT' ). + lv_merge_content = ii_event->form_data( )->get( 'MERGE_CONTENT' ). REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN lv_merge_content WITH zif_abapgit_definitions=>c_newline. diff --git a/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap b/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap index 6e08e709d..3f2cc779f 100644 --- a/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_repo_view.clas.abap @@ -1177,7 +1177,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_REPO_VIEW IMPLEMENTATION. WHEN zif_abapgit_definitions=>c_action-go_repo. " Switch to another repo CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_repo_view EXPORTING - iv_key = |{ ii_event->query( iv_upper_cased = abap_true )->get( 'KEY' ) }|. + iv_key = |{ ii_event->query( )->get( 'KEY' ) }|. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page_replacing. WHEN c_actions-toggle_hide_files. " Toggle file diplay diff --git a/src/ui/zcl_abapgit_gui_page_stage.clas.abap b/src/ui/zcl_abapgit_gui_page_stage.clas.abap index 902a18943..d9bd2f0d8 100644 --- a/src/ui/zcl_abapgit_gui_page_stage.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_stage.clas.abap @@ -609,7 +609,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. zcl_abapgit_path=>split_file_location( EXPORTING - iv_fullpath = -k + iv_fullpath = to_lower( -k ) " filename is lower cased IMPORTING ev_path = ls_file-path ev_filename = ls_file-filename ). diff --git a/src/utils/zcl_abapgit_string_map.clas.abap b/src/utils/zcl_abapgit_string_map.clas.abap index 97d1493f4..a1c504b57 100644 --- a/src/utils/zcl_abapgit_string_map.clas.abap +++ b/src/utils/zcl_abapgit_string_map.clas.abap @@ -14,9 +14,13 @@ CLASS zcl_abapgit_string_map DEFINITION ty_entries TYPE SORTED TABLE OF ty_entry WITH UNIQUE KEY k. CLASS-METHODS create + IMPORTING + iv_case_insensitive TYPE abap_bool DEFAULT abap_false RETURNING VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map. - METHODS constructor. + METHODS constructor + IMPORTING + iv_case_insensitive TYPE abap_bool DEFAULT abap_false. METHODS get IMPORTING iv_key TYPE string @@ -67,6 +71,7 @@ CLASS zcl_abapgit_string_map DEFINITION PRIVATE SECTION. DATA mv_read_only TYPE abap_bool. DATA mv_is_strict TYPE abap_bool. + DATA mv_case_insensitive TYPE abap_bool. ENDCLASS. @@ -85,11 +90,14 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. METHOD constructor. mv_is_strict = abap_true. + mv_case_insensitive = iv_case_insensitive. ENDMETHOD. METHOD create. - CREATE OBJECT ro_instance. + CREATE OBJECT ro_instance + EXPORTING + iv_case_insensitive = iv_case_insensitive. ENDMETHOD. @@ -111,8 +119,16 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. METHOD get. + DATA lv_key LIKE iv_key. FIELD-SYMBOLS LIKE LINE OF mt_entries. - READ TABLE mt_entries ASSIGNING WITH KEY k = iv_key. + + IF mv_case_insensitive = abap_true. + lv_key = to_upper( iv_key ). + ELSE. + lv_key = iv_key. + ENDIF. + + READ TABLE mt_entries ASSIGNING WITH KEY k = lv_key. IF sy-subrc IS INITIAL. rv_val = -v. ENDIF. @@ -135,6 +151,7 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. METHOD set. + DATA lv_key LIKE iv_key. DATA ls_entry LIKE LINE OF mt_entries. FIELD-SYMBOLS LIKE LINE OF mt_entries. @@ -142,11 +159,17 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. zcx_abapgit_exception=>raise( 'Cannot set. This string map is immutable' ). ENDIF. - READ TABLE mt_entries ASSIGNING WITH KEY k = iv_key. + IF mv_case_insensitive = abap_true. + lv_key = to_upper( iv_key ). + ELSE. + lv_key = iv_key. + ENDIF. + + READ TABLE mt_entries ASSIGNING WITH KEY k = lv_key. IF sy-subrc IS INITIAL. -v = iv_val. ELSE. - ls_entry-k = iv_key. + ls_entry-k = lv_key. ls_entry-v = iv_val. INSERT ls_entry INTO TABLE mt_entries. ENDIF. diff --git a/src/utils/zcl_abapgit_string_map.clas.testclasses.abap b/src/utils/zcl_abapgit_string_map.clas.testclasses.abap index 09dabac9a..14776bdee 100644 --- a/src/utils/zcl_abapgit_string_map.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_string_map.clas.testclasses.abap @@ -15,6 +15,7 @@ CLASS ltcl_sm_test DEFINITION METHODS simple FOR TESTING RAISING zcx_abapgit_exception. METHODS freeze FOR TESTING RAISING zcx_abapgit_exception. METHODS strict FOR TESTING RAISING zcx_abapgit_exception. + METHODS case_insensitive FOR TESTING RAISING zcx_abapgit_exception. ENDCLASS. @@ -143,4 +144,35 @@ CLASS ltcl_sm_test IMPLEMENTATION. ENDMETHOD. + METHOD case_insensitive. + + DATA lo_cut TYPE REF TO zcl_abapgit_string_map. + lo_cut = zcl_abapgit_string_map=>create( iv_case_insensitive = abap_true ). + + lo_cut->set( + iv_key = 'A' + iv_val = 'avalue' ). + lo_cut->set( + iv_key = 'b' + iv_val = 'bvalue' ). + + cl_abap_unit_assert=>assert_equals( + exp = 'avalue' + act = lo_cut->get( 'A' ) ). + + cl_abap_unit_assert=>assert_equals( + exp = 'avalue' + act = lo_cut->get( 'a' ) ). + + cl_abap_unit_assert=>assert_equals( + exp = 'bvalue' + act = lo_cut->get( 'B' ) ). + + cl_abap_unit_assert=>assert_equals( + exp = 'bvalue' + act = lo_cut->get( 'b' ) ). + + ENDMETHOD. + + ENDCLASS.