diff --git a/docs/collections/_development/developing-ui.md b/docs/collections/_development/developing-ui.md index 58b9885b4..72e9ceebc 100644 --- a/docs/collections/_development/developing-ui.md +++ b/docs/collections/_development/developing-ui.md @@ -107,6 +107,8 @@ To process sapevents in abap the component (page) must implement `ZIF_ABAPGIT_GU - `ii_event->query( )->get( 'XXX' )` - or `ii_event->query( )->to_abap( changing cs_container = ls_struc_with_fields )` - query string_map is immutable (attempt to `set` will raise an exception) + - accepts optional `iv_upper_cased` param to unify param names (default = `true`) +- `ii_event->form_data()` - attempts to parse post_data assuming it is set of key value pairs. Returns a string map. Otherwise behaves as `query()` above. `iv_upper_cased = false` by default. Events can be processed on 2 levels - in page/component **or** in the router. On new event: - the GUI goes through event handlers stack - list of components that registered themselves as event handlers during rendering via `gui_services` diff --git a/src/ui/core/zcl_abapgit_gui_event.clas.abap b/src/ui/core/zcl_abapgit_gui_event.clas.abap index 1736ab189..32d3f79d7 100644 --- a/src/ui/core/zcl_abapgit_gui_event.clas.abap +++ b/src/ui/core/zcl_abapgit_gui_event.clas.abap @@ -17,6 +17,8 @@ CLASS zcl_abapgit_gui_event DEFINITION 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 @@ -26,6 +28,17 @@ 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. @@ -55,25 +68,53 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_gui_event~query. + METHOD fields_to_map_macro. - DATA lt_fields TYPE tihttpnvp. + FIELD-SYMBOLS TYPE REF TO zcl_abapgit_string_map. IF iv_upper_cased = abap_true. - IF mo_query_upper_cased IS NOT BOUND. - mo_query_upper_cased = fields_to_map( - zcl_abapgit_html_action_utils=>parse_fields_upper_case_name( zif_abapgit_gui_event~mv_getdata ) ). - mo_query_upper_cased->freeze( ). - ENDIF. - ro_string_map = mo_query_upper_cased. + ASSIGN co_string_map_upper TO . ELSE. - 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. + 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 ). + + 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 ). + 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 c653bafc3..f82b12c3d 100644 --- a/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap +++ b/src/ui/core/zcl_abapgit_gui_event.clas.testclasses.abap @@ -7,6 +7,7 @@ CLASS ltcl_event DEFINITION PRIVATE SECTION. METHODS query FOR TESTING RAISING zcx_abapgit_exception. + METHODS form_data FOR TESTING RAISING zcx_abapgit_exception. ENDCLASS. @@ -33,7 +34,12 @@ CLASS ltcl_event IMPLEMENTATION. iv_action = 'XXX' iv_getdata = 'a=b&b=c'. - lo_map = li_cut->query( ). + " Cross check just in case + cl_abap_unit_assert=>assert_equals( + act = li_cut->form_data( )->size( ) + exp = 0 ). + + lo_map = li_cut->query( iv_upper_cased = abap_false ). cl_abap_unit_assert=>assert_equals( act = lo_map->size( ) exp = 2 ). @@ -55,6 +61,11 @@ 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' @@ -68,4 +79,70 @@ CLASS ltcl_event IMPLEMENTATION. ENDMETHOD. + METHOD form_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. + 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 + iv_action = 'XXX' + it_postdata = lt_postdata. + + " Cross check just in case + cl_abap_unit_assert=>assert_equals( + act = li_cut->query( )->size( ) + exp = 0 ). + + lo_map = li_cut->form_data( iv_upper_cased = abap_false ). + 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' ). + cl_abap_unit_assert=>assert_equals( + act = lo_map->get( 'b' ) + exp = 'c' ). + + lo_map = li_cut->form_data( iv_upper_cased = abap_true ). + 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' ). + cl_abap_unit_assert=>assert_equals( + act = lo_map->get( 'B' ) + exp = 'c' ). + + " Check defaults + cl_abap_unit_assert=>assert_equals( + act = li_cut->form_data( )->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. ENDCLASS. diff --git a/src/ui/core/zif_abapgit_gui_event.intf.abap b/src/ui/core/zif_abapgit_gui_event.intf.abap index d88d7d39c..8d6ef0367 100644 --- a/src/ui/core/zif_abapgit_gui_event.intf.abap +++ b/src/ui/core/zif_abapgit_gui_event.intf.abap @@ -14,4 +14,12 @@ INTERFACE zif_abapgit_gui_event 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 + zcx_abapgit_exception. + ENDINTERFACE. 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 61df0cccc..82c1956b3 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 @@ -17,9 +17,11 @@ CLASS zcl_abapgit_gui_page_db_edit DEFINITION CLASS-METHODS dbcontent_decode IMPORTING - !it_postdata TYPE cnht_post_data_tab + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING - VALUE(rs_content) TYPE zif_abapgit_persistence=>ty_content . + VALUE(rs_content) TYPE zif_abapgit_persistence=>ty_content + RAISING + zcx_abapgit_exception . METHODS render_content REDEFINITION . @@ -52,30 +54,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION. METHOD dbcontent_decode. - DATA lt_fields TYPE tihttpnvp. + DATA lo_map TYPE REF TO zcl_abapgit_string_map. - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( - it_post_data = it_postdata - iv_upper_cased = abap_true ). - - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'TYPE' - it_field = lt_fields - CHANGING - cg_field = rs_content-type ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'VALUE' - it_field = lt_fields - CHANGING - cg_field = rs_content-value ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'XMLDATA' - it_field = lt_fields - CHANGING - cg_field = rs_content-data_str ). + lo_map = ii_event->form_data( iv_upper_cased = abap_true ). + rs_content-type = lo_map->get( 'TYPE' ). + rs_content-value = lo_map->get( 'VALUE' ). + rs_content-data_str = lo_map->get( 'XMLDATA' ). IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? rs_content-data_str = rs_content-data_str+1. @@ -151,7 +135,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_action-update. - ls_db = dbcontent_decode( ii_event->mt_postdata ). + ls_db = dbcontent_decode( ii_event ). update( ls_db ). rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back. WHEN OTHERS. diff --git a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap index 609f53609..c4a930b30 100644 --- a/src/ui/zcl_abapgit_gui_page_boverview.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_boverview.clas.abap @@ -52,13 +52,6 @@ CLASS zcl_abapgit_gui_page_boverview DEFINITION VALUE(ri_html) TYPE REF TO zif_abapgit_html RAISING zcx_abapgit_exception . - METHODS decode_merge - IMPORTING - !it_postdata TYPE cnht_post_data_tab - RETURNING - VALUE(rs_merge) TYPE ty_merge - RAISING - zcx_abapgit_exception . METHODS build_menu RETURNING VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar . @@ -243,25 +236,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION. ENDMETHOD. - METHOD decode_merge. - - DATA lt_fields TYPE tihttpnvp. - FIELD-SYMBOLS: LIKE LINE OF lt_fields. - - - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'source'. - ASSERT sy-subrc = 0. - rs_merge-source = -value. - - READ TABLE lt_fields ASSIGNING WITH KEY name = 'target'. - ASSERT sy-subrc = 0. - rs_merge-target = -value. - - ENDMETHOD. - - METHOD escape_branch. rv_string = iv_string. @@ -420,7 +394,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION. refresh( ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. WHEN c_actions-merge. - ls_merge = decode_merge( ii_event->mt_postdata ). + ls_merge-source = ii_event->form_data( )->get( 'source' ). + ls_merge-target = ii_event->form_data( )->get( 'target' ). CREATE OBJECT lo_merge EXPORTING io_repo = mo_repo diff --git a/src/ui/zcl_abapgit_gui_page_commit.clas.abap b/src/ui/zcl_abapgit_gui_page_commit.clas.abap index 5370cdc30..037679749 100644 --- a/src/ui/zcl_abapgit_gui_page_commit.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_commit.clas.abap @@ -25,9 +25,11 @@ CLASS zcl_abapgit_gui_page_commit DEFINITION CLASS-METHODS parse_commit_request IMPORTING - !it_postdata TYPE cnht_post_data_tab - EXPORTING - !eg_fields TYPE any . + !ii_event TYPE REF TO zif_abapgit_gui_event + RETURNING + VALUE(rs_commit) TYPE zif_abapgit_services_git=>ty_commit_fields + RAISING + zcx_abapgit_exception . METHODS render_content REDEFINITION . @@ -177,56 +179,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. METHOD parse_commit_request. - DATA lt_fields TYPE tihttpnvp. + DATA lo_map TYPE REF TO zcl_abapgit_string_map. - FIELD-SYMBOLS TYPE string. - - CLEAR eg_fields. - - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( - it_post_data = it_postdata - iv_upper_cased = abap_true ). - - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'COMMITTER_NAME' - it_field = lt_fields - CHANGING - cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'COMMITTER_EMAIL' - it_field = lt_fields - CHANGING - cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'AUTHOR_NAME' - it_field = lt_fields - CHANGING - cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'AUTHOR_EMAIL' - it_field = lt_fields - CHANGING - cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'COMMENT' - it_field = lt_fields - CHANGING - cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'BODY' - it_field = lt_fields - CHANGING - cg_field = eg_fields ). - - ASSIGN COMPONENT 'BODY' OF STRUCTURE eg_fields TO . - ASSERT IS ASSIGNED. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN WITH zif_abapgit_definitions=>c_newline. + lo_map = ii_event->form_data( iv_upper_cased = abap_true ). + lo_map->to_abap( CHANGING cs_container = rs_commit ). + REPLACE ALL OCCURRENCES + OF zif_abapgit_definitions=>c_crlf + IN rs_commit-body + WITH zif_abapgit_definitions=>c_newline. ENDMETHOD. @@ -462,10 +422,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_action-commit_post. - parse_commit_request( - EXPORTING it_postdata = ii_event->mt_postdata - IMPORTING eg_fields = ms_commit ). - + ms_commit = parse_commit_request( ii_event ). ms_commit-repo_key = mo_repo->get_key( ). zcl_abapgit_services_git=>commit( 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 c959113cf..dc6836bc3 100644 --- a/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_merge_res.clas.abap @@ -56,7 +56,7 @@ CLASS zcl_abapgit_gui_page_merge_res DEFINITION METHODS apply_merged_content IMPORTING - !it_postdata TYPE cnht_post_data_tab + !ii_event TYPE REF TO zif_abapgit_gui_event RAISING zcx_abapgit_exception . METHODS build_menu @@ -113,30 +113,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION. METHOD apply_merged_content. DATA: - BEGIN OF ls_filedata, - merge_content TYPE string, - END OF ls_filedata, + lv_merge_content TYPE string, lt_fields TYPE tihttpnvp, lv_new_file_content TYPE xstring. FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_merge_conflict. - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( - it_post_data = it_postdata - iv_upper_cased = abap_true ). - - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'MERGE_CONTENT' - it_field = lt_fields - CHANGING - cg_field = ls_filedata ). + lv_merge_content = ii_event->form_data( iv_upper_cased = abap_true )->get( 'MERGE_CONTENT' ). REPLACE ALL OCCURRENCES - OF zif_abapgit_definitions=>c_crlf IN ls_filedata-merge_content WITH zif_abapgit_definitions=>c_newline. + OF zif_abapgit_definitions=>c_crlf IN lv_merge_content WITH zif_abapgit_definitions=>c_newline. - lv_new_file_content = zcl_abapgit_convert=>string_to_xstring_utf8( ls_filedata-merge_content ). + lv_new_file_content = zcl_abapgit_convert=>string_to_xstring_utf8( lv_merge_content ). READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. -result_sha1 = zcl_abapgit_hash=>sha1( @@ -545,7 +534,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_actions-apply_merge. - apply_merged_content( ii_event->mt_postdata ). + apply_merged_content( ii_event ). WHEN c_actions-apply_source. READ TABLE mt_conflicts ASSIGNING INDEX mv_current_conflict_index. diff --git a/src/ui/zcl_abapgit_gui_page_patch.clas.abap b/src/ui/zcl_abapgit_gui_page_patch.clas.abap index 9d565556a..b75990660 100644 --- a/src/ui/zcl_abapgit_gui_page_patch.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_patch.clas.abap @@ -77,12 +77,12 @@ CLASS zcl_abapgit_gui_page_patch DEFINITION !is_diff TYPE ty_file_diff . METHODS start_staging IMPORTING - !it_postdata TYPE cnht_post_data_tab + !ii_event TYPE REF TO zif_abapgit_gui_event RAISING zcx_abapgit_exception . METHODS apply_patch_from_form_fields IMPORTING - !it_postdata TYPE cnht_post_data_tab + !ii_event TYPE REF TO zif_abapgit_gui_event RAISING zcx_abapgit_exception . METHODS restore_patch_flags @@ -319,19 +319,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION. METHOD apply_patch_from_form_fields. DATA: - lt_fields TYPE tihttpnvp, lv_add TYPE string, lv_remove TYPE string. - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). - - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = c_patch_action-add - it_field = lt_fields - CHANGING cg_field = lv_add ). - - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = c_patch_action-remove - it_field = lt_fields - CHANGING cg_field = lv_remove ). + lv_add = ii_event->form_data( )->get( c_patch_action-add ). + lv_remove = ii_event->form_data( )->get( c_patch_action-remove ). apply_patch_all( iv_patch = lv_add iv_patch_flag = abap_true ). @@ -731,7 +723,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION. METHOD start_staging. - apply_patch_from_form_fields( it_postdata ). + apply_patch_from_form_fields( ii_event ). add_to_stage( ). ENDMETHOD. @@ -742,7 +734,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_actions-stage. - start_staging( ii_event->mt_postdata ). + start_staging( ii_event ). CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_commit EXPORTING @@ -755,7 +747,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION. FIND FIRST OCCURRENCE OF REGEX |^{ c_actions-refresh }| IN ii_event->mv_action. IF sy-subrc = 0. - apply_patch_from_form_fields( ii_event->mt_postdata ). + apply_patch_from_form_fields( ii_event ). refresh( ii_event->mv_action ). rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. diff --git a/src/ui/zcl_abapgit_gui_page_stage.clas.abap b/src/ui/zcl_abapgit_gui_page_stage.clas.abap index f291687de..902a18943 100644 --- a/src/ui/zcl_abapgit_gui_page_stage.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_stage.clas.abap @@ -74,7 +74,7 @@ CLASS zcl_abapgit_gui_page_stage DEFINITION VALUE(ri_html) TYPE REF TO zif_abapgit_html . METHODS stage_selected IMPORTING - !it_postdata TYPE cnht_post_data_tab + !ii_event TYPE REF TO zif_abapgit_gui_event RETURNING VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage RAISING @@ -587,30 +587,29 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. METHOD stage_selected. - DATA: - lt_fields TYPE tihttpnvp, - ls_file TYPE zif_abapgit_definitions=>ty_file. + DATA ls_file TYPE zif_abapgit_definitions=>ty_file. + DATA lo_files TYPE REF TO zcl_abapgit_string_map. FIELD-SYMBOLS: LIKE LINE OF ms_files-local, LIKE LINE OF ms_files-status, - LIKE LINE OF lt_fields. + LIKE LINE OF lo_files->mt_entries. - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). + lo_files = ii_event->form_data( ). - IF lines( lt_fields ) = 0. + IF lo_files->size( ) = 0. zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ). ENDIF. CREATE OBJECT ro_stage. - LOOP AT lt_fields ASSIGNING + LOOP AT lo_files->mt_entries ASSIGNING "Ignore Files that we don't want to stage, so any errors don't stop the staging process - WHERE value <> zif_abapgit_definitions=>c_method-skip. + WHERE v <> zif_abapgit_definitions=>c_method-skip. zcl_abapgit_path=>split_file_location( EXPORTING - iv_fullpath = -name + iv_fullpath = -k IMPORTING ev_path = ls_file-path ev_filename = ls_file-filename ). @@ -626,7 +625,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. | Consider ignoring or staging the file at a later time.| ). ENDIF. - CASE -value. + CASE -v. WHEN zif_abapgit_definitions=>c_method-add. READ TABLE ms_files-local ASSIGNING WITH KEY file-path = ls_file-path @@ -650,7 +649,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. WHEN zif_abapgit_definitions=>c_method-skip. " Do nothing WHEN OTHERS. - zcx_abapgit_exception=>raise( |process_stage_list: unknown method { -value }| ). + zcx_abapgit_exception=>raise( |process_stage_list: unknown method { -v }| ). ENDCASE. ENDLOOP. @@ -659,8 +658,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. METHOD zif_abapgit_gui_event_handler~on_event. - DATA: lo_stage TYPE REF TO zcl_abapgit_stage, - lt_fields TYPE tihttpnvp. + DATA: lo_stage TYPE REF TO zcl_abapgit_stage. CASE ii_event->mv_action. WHEN c_action-stage_all. @@ -676,7 +674,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. WHEN c_action-stage_commit. - lo_stage = stage_selected( ii_event->mt_postdata ). + lo_stage = stage_selected( ii_event ). CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_commit EXPORTING @@ -687,20 +685,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION. WHEN c_action-stage_filter. - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( ii_event->mt_postdata ). - - zcl_abapgit_html_action_utils=>get_field( - EXPORTING - iv_name = 'filterValue' - it_field = lt_fields - CHANGING - cg_field = mv_filter_value ). - + mv_filter_value = ii_event->form_data( )->get( 'filterValue' ). rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. WHEN zif_abapgit_definitions=>c_action-go_patch. " Go Patch page - lo_stage = stage_selected( ii_event->mt_postdata ). + lo_stage = stage_selected( ii_event ). rs_handled-page = get_page_patch( lo_stage ). rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. diff --git a/src/ui/zcl_abapgit_gui_page_tag.clas.abap b/src/ui/zcl_abapgit_gui_page_tag.clas.abap index 2979f7257..3af92ab91 100644 --- a/src/ui/zcl_abapgit_gui_page_tag.clas.abap +++ b/src/ui/zcl_abapgit_gui_page_tag.clas.abap @@ -48,14 +48,16 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL VALUE(ri_html) TYPE REF TO zif_abapgit_html . METHODS create_tag IMPORTING - !it_postdata TYPE cnht_post_data_tab + !ii_event TYPE REF TO zif_abapgit_gui_event RAISING zcx_abapgit_exception . METHODS parse_tag_request IMPORTING - !it_postdata TYPE cnht_post_data_tab - EXPORTING - !eg_fields TYPE any . + !ii_event TYPE REF TO zif_abapgit_gui_event + RETURNING + VALUE(rs_git_tag) TYPE zif_abapgit_definitions=>ty_git_tag + RAISING + zcx_abapgit_exception . METHODS parse_change_tag_type_request IMPORTING !it_postdata TYPE cnht_post_data_tab . @@ -89,9 +91,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION. lx_error TYPE REF TO zcx_abapgit_exception, lv_text TYPE string. - parse_tag_request( - EXPORTING it_postdata = it_postdata - IMPORTING eg_fields = ls_tag ). + ls_tag = parse_tag_request( ii_event ). IF ls_tag-name IS INITIAL. zcx_abapgit_exception=>raise( |Please supply a tag name| ). @@ -153,38 +153,15 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION. METHOD parse_tag_request. - DATA lt_fields TYPE tihttpnvp. + DATA lo_map TYPE REF TO zcl_abapgit_string_map. - FIELD-SYMBOLS TYPE string. - - CLEAR eg_fields. - - lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( - it_post_data = it_postdata - iv_upper_cased = abap_true ). - - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'SHA1' - it_field = lt_fields - CHANGING cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'NAME' - it_field = lt_fields - CHANGING cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'TAGGER_NAME' - it_field = lt_fields - CHANGING cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'TAGGER_EMAIL' - it_field = lt_fields - CHANGING cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'MESSAGE' - it_field = lt_fields - CHANGING cg_field = eg_fields ). - zcl_abapgit_html_action_utils=>get_field( EXPORTING iv_name = 'BODY' - it_field = lt_fields - CHANGING cg_field = eg_fields ). - - ASSIGN COMPONENT 'BODY' OF STRUCTURE eg_fields TO . - ASSERT IS ASSIGNED. - REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN WITH zif_abapgit_definitions=>c_newline. + lo_map = ii_event->form_data( ). + lo_map->strict( abap_false ). " Hack, refactor ! + lo_map->to_abap( CHANGING cs_container = rs_git_tag ). + REPLACE ALL OCCURRENCES + OF zif_abapgit_definitions=>c_crlf + IN rs_git_tag-body + WITH zif_abapgit_definitions=>c_newline. ENDMETHOD. @@ -377,7 +354,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION. CASE ii_event->mv_action. WHEN c_action-commit_post. - create_tag( ii_event->mt_postdata ). + create_tag( ii_event ). rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back. WHEN c_action-change_tag_type. diff --git a/src/ui/zcl_abapgit_html_action_utils.clas.abap b/src/ui/zcl_abapgit_html_action_utils.clas.abap index a9ac1f303..fe2f1f56d 100644 --- a/src/ui/zcl_abapgit_html_action_utils.clas.abap +++ b/src/ui/zcl_abapgit_html_action_utils.clas.abap @@ -13,6 +13,7 @@ CLASS zcl_abapgit_html_action_utils DEFINITION CLASS-METHODS parse_fields IMPORTING !iv_string TYPE clike + !iv_upper_cased TYPE abap_bool DEFAULT abap_false RETURNING VALUE(rt_fields) TYPE tihttpnvp . CLASS-METHODS parse_fields_upper_case_name @@ -261,13 +262,18 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION. ENDLOOP. + IF iv_upper_cased = abap_true. + field_keys_to_upper( CHANGING ct_fields = rt_fields ). + ENDIF. + ENDMETHOD. METHOD parse_fields_upper_case_name. - rt_fields = parse_fields( iv_string ). - field_keys_to_upper( CHANGING ct_fields = rt_fields ). + rt_fields = parse_fields( + iv_string = iv_string + iv_upper_cased = abap_true ). ENDMETHOD. diff --git a/src/utils/zcl_abapgit_string_map.clas.abap b/src/utils/zcl_abapgit_string_map.clas.abap index 66e096329..80a8b7177 100644 --- a/src/utils/zcl_abapgit_string_map.clas.abap +++ b/src/utils/zcl_abapgit_string_map.clas.abap @@ -16,6 +16,7 @@ CLASS zcl_abapgit_string_map DEFINITION CLASS-METHODS create RETURNING VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map. + METHODS constructor. METHODS get IMPORTING iv_key TYPE string @@ -53,6 +54,11 @@ CLASS zcl_abapgit_string_map DEFINITION !cs_container TYPE any RAISING zcx_abapgit_exception. + METHODS strict + IMPORTING + !iv_strict TYPE abap_bool DEFAULT abap_true + RETURNING + VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map . METHODS freeze. DATA mt_entries TYPE tts_entries READ-ONLY. @@ -60,6 +66,7 @@ CLASS zcl_abapgit_string_map DEFINITION PROTECTED SECTION. PRIVATE SECTION. DATA mv_read_only TYPE abap_bool. + DATA mv_is_strict TYPE abap_bool. ENDCLASS. @@ -76,6 +83,11 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. ENDMETHOD. + METHOD constructor. + mv_is_strict = abap_true. + ENDMETHOD. + + METHOD create. CREATE OBJECT ro_instance. ENDMETHOD. @@ -151,6 +163,12 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. ENDMETHOD. + METHOD strict. + mv_is_strict = iv_strict. + ro_instance = me. + ENDMETHOD. + + METHOD to_abap. DATA lo_type TYPE REF TO cl_abap_typedescr. @@ -172,6 +190,8 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION. IF sy-subrc = 0. " TODO check target type ? = -v. + ELSEIF mv_is_strict = abap_false. + CONTINUE. ELSE. zcx_abapgit_exception=>raise( |Component { lv_field } not found in target| ). ENDIF. diff --git a/src/utils/zcl_abapgit_string_map.clas.testclasses.abap b/src/utils/zcl_abapgit_string_map.clas.testclasses.abap index 0b0180675..09dabac9a 100644 --- a/src/utils/zcl_abapgit_string_map.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_string_map.clas.testclasses.abap @@ -4,8 +4,18 @@ CLASS ltcl_sm_test DEFINITION DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. + + TYPES: + BEGIN OF ty_struc, + a TYPE string, + b TYPE abap_bool, + c TYPE i, + END OF ty_struc. + METHODS simple FOR TESTING RAISING zcx_abapgit_exception. METHODS freeze FOR TESTING RAISING zcx_abapgit_exception. + METHODS strict FOR TESTING RAISING zcx_abapgit_exception. + ENDCLASS. CLASS ltcl_sm_test IMPLEMENTATION. @@ -91,4 +101,46 @@ CLASS ltcl_sm_test IMPLEMENTATION. ENDMETHOD. + METHOD strict. + + DATA ls_struc_act TYPE ty_struc. + DATA ls_struc_exp TYPE ty_struc. + DATA lo_x TYPE REF TO cx_root. + DATA lo_cut TYPE REF TO zcl_abapgit_string_map. + lo_cut = zcl_abapgit_string_map=>create( ). + + lo_cut->set( + iv_key = 'a' + iv_val = 'avalue' ). + lo_cut->set( + iv_key = 'b' + iv_val = 'X' ). + lo_cut->set( + iv_key = 'c' + iv_val = '123' ). + lo_cut->set( + iv_key = 'z' + iv_val = 'xyz' ). + + ls_struc_exp-a = 'avalue'. + ls_struc_exp-b = abap_true. + ls_struc_exp-c = 123. + + TRY. + lo_cut->to_abap( CHANGING cs_container = ls_struc_act ). + cl_abap_unit_assert=>fail( ). + CATCH cx_root INTO lo_x. + cl_abap_unit_assert=>assert_equals( + exp = 'Component Z not found in target' + act = lo_x->get_text( ) ). + ENDTRY. + + lo_cut->strict( abap_false )->to_abap( CHANGING cs_container = ls_struc_act ). + + cl_abap_unit_assert=>assert_equals( + exp = ls_struc_exp + act = ls_struc_act ). + + ENDMETHOD. + ENDCLASS.