html event abstraction, phase 4 - form_data (#3975)

* event->post_data logic

* part of pages, commit test

this is also long text
to test

* string_map: port strict() feature

* pages refactoring part 2

* linter

* docs

Co-authored-by: Lars Hvam <larshp@hotmail.com>
This commit is contained in:
Alexander Tsybulsky 2020-10-05 10:33:01 +03:00 committed by GitHub
parent c573b94a57
commit 6941d9824a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 292 additions and 222 deletions

View File

@ -107,6 +107,8 @@ To process sapevents in abap the component (page) must implement `ZIF_ABAPGIT_GU
- `ii_event->query( )->get( 'XXX' )` - `ii_event->query( )->get( 'XXX' )`
- or `ii_event->query( )->to_abap( changing cs_container = ls_struc_with_fields )` - 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) - 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: 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` - the GUI goes through event handlers stack - list of components that registered themselves as event handlers during rendering via `gui_services`

View File

@ -17,6 +17,8 @@ CLASS zcl_abapgit_gui_event DEFINITION
PRIVATE SECTION. PRIVATE SECTION.
DATA mo_query TYPE REF TO zcl_abapgit_string_map. DATA mo_query TYPE REF TO zcl_abapgit_string_map.
DATA mo_query_upper_cased 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 METHODS fields_to_map
IMPORTING IMPORTING
@ -26,6 +28,17 @@ CLASS zcl_abapgit_gui_event DEFINITION
RAISING RAISING
zcx_abapgit_exception. 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. ENDCLASS.
@ -55,25 +68,53 @@ CLASS ZCL_ABAPGIT_GUI_EVENT IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_gui_event~query. METHOD fields_to_map_macro.
DATA lt_fields TYPE tihttpnvp. FIELD-SYMBOLS <lo_map> TYPE REF TO zcl_abapgit_string_map.
IF iv_upper_cased = abap_true. IF iv_upper_cased = abap_true.
IF mo_query_upper_cased IS NOT BOUND. ASSIGN co_string_map_upper TO <lo_map>.
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.
ELSE. ELSE.
IF mo_query IS NOT BOUND. ASSIGN co_string_map_lower TO <lo_map>.
mo_query = fields_to_map(
zcl_abapgit_html_action_utils=>parse_fields( zif_abapgit_gui_event~mv_getdata ) ).
mo_query->freeze( ).
ENDIF. ENDIF.
ro_string_map = mo_query.
IF <lo_map> IS NOT BOUND.
<lo_map> = fields_to_map( it_fields ).
<lo_map>->freeze( ).
ENDIF. ENDIF.
co_string_map_return = <lo_map>.
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. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -7,6 +7,7 @@ CLASS ltcl_event DEFINITION
PRIVATE SECTION. PRIVATE SECTION.
METHODS query FOR TESTING RAISING zcx_abapgit_exception. METHODS query FOR TESTING RAISING zcx_abapgit_exception.
METHODS form_data FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS. ENDCLASS.
@ -33,7 +34,12 @@ CLASS ltcl_event IMPLEMENTATION.
iv_action = 'XXX' iv_action = 'XXX'
iv_getdata = 'a=b&b=c'. 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( cl_abap_unit_assert=>assert_equals(
act = lo_map->size( ) act = lo_map->size( )
exp = 2 ). exp = 2 ).
@ -55,6 +61,11 @@ CLASS ltcl_event IMPLEMENTATION.
act = lo_map->get( 'B' ) act = lo_map->get( 'B' )
exp = 'c' ). exp = 'c' ).
" Check defaults
cl_abap_unit_assert=>assert_equals(
act = li_cut->query( )->get( 'A' )
exp = 'b' ).
TRY. TRY.
lo_map->set( lo_map->set(
iv_key = 'x' iv_key = 'x'
@ -68,4 +79,70 @@ CLASS ltcl_event IMPLEMENTATION.
ENDMETHOD. 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. ENDCLASS.

View File

@ -14,4 +14,12 @@ INTERFACE zif_abapgit_gui_event
RAISING RAISING
zcx_abapgit_exception. 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. ENDINTERFACE.

View File

@ -17,9 +17,11 @@ CLASS zcl_abapgit_gui_page_db_edit DEFINITION
CLASS-METHODS dbcontent_decode CLASS-METHODS dbcontent_decode
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
RETURNING 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 METHODS render_content
REDEFINITION . REDEFINITION .
@ -52,30 +54,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_DB_EDIT IMPLEMENTATION.
METHOD dbcontent_decode. 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( lo_map = ii_event->form_data( iv_upper_cased = abap_true ).
it_post_data = it_postdata rs_content-type = lo_map->get( 'TYPE' ).
iv_upper_cased = abap_true ). rs_content-value = lo_map->get( 'VALUE' ).
rs_content-data_str = lo_map->get( 'XMLDATA' ).
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 ).
IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ??? IF rs_content-data_str(1) <> '<' AND rs_content-data_str+1(1) = '<'. " Hmmm ???
rs_content-data_str = rs_content-data_str+1. 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. CASE ii_event->mv_action.
WHEN c_action-update. WHEN c_action-update.
ls_db = dbcontent_decode( ii_event->mt_postdata ). ls_db = dbcontent_decode( ii_event ).
update( ls_db ). update( ls_db ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back. rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
WHEN OTHERS. WHEN OTHERS.

View File

@ -52,13 +52,6 @@ CLASS zcl_abapgit_gui_page_boverview DEFINITION
VALUE(ri_html) TYPE REF TO zif_abapgit_html VALUE(ri_html) TYPE REF TO zif_abapgit_html
RAISING RAISING
zcx_abapgit_exception . 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 METHODS build_menu
RETURNING RETURNING
VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar . VALUE(ro_menu) TYPE REF TO zcl_abapgit_html_toolbar .
@ -243,25 +236,6 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD decode_merge.
DATA lt_fields TYPE tihttpnvp.
FIELD-SYMBOLS: <ls_field> LIKE LINE OF lt_fields.
lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ).
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'source'.
ASSERT sy-subrc = 0.
rs_merge-source = <ls_field>-value.
READ TABLE lt_fields ASSIGNING <ls_field> WITH KEY name = 'target'.
ASSERT sy-subrc = 0.
rs_merge-target = <ls_field>-value.
ENDMETHOD.
METHOD escape_branch. METHOD escape_branch.
rv_string = iv_string. rv_string = iv_string.
@ -420,7 +394,8 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_BOVERVIEW IMPLEMENTATION.
refresh( ). refresh( ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.
WHEN c_actions-merge. 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 CREATE OBJECT lo_merge
EXPORTING EXPORTING
io_repo = mo_repo io_repo = mo_repo

View File

@ -25,9 +25,11 @@ CLASS zcl_abapgit_gui_page_commit DEFINITION
CLASS-METHODS parse_commit_request CLASS-METHODS parse_commit_request
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
EXPORTING RETURNING
!eg_fields TYPE any . VALUE(rs_commit) TYPE zif_abapgit_services_git=>ty_commit_fields
RAISING
zcx_abapgit_exception .
METHODS render_content REDEFINITION . METHODS render_content REDEFINITION .
@ -177,56 +179,14 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION.
METHOD parse_commit_request. METHOD parse_commit_request.
DATA lt_fields TYPE tihttpnvp. DATA lo_map TYPE REF TO zcl_abapgit_string_map.
FIELD-SYMBOLS <lv_body> TYPE string. lo_map = ii_event->form_data( iv_upper_cased = abap_true ).
lo_map->to_abap( CHANGING cs_container = rs_commit ).
CLEAR eg_fields. REPLACE ALL OCCURRENCES
OF zif_abapgit_definitions=>c_crlf
lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( IN rs_commit-body
it_post_data = it_postdata WITH zif_abapgit_definitions=>c_newline.
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 <lv_body>.
ASSERT <lv_body> IS ASSIGNED.
REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN <lv_body> WITH zif_abapgit_definitions=>c_newline.
ENDMETHOD. ENDMETHOD.
@ -462,10 +422,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_COMMIT IMPLEMENTATION.
CASE ii_event->mv_action. CASE ii_event->mv_action.
WHEN c_action-commit_post. WHEN c_action-commit_post.
parse_commit_request( ms_commit = parse_commit_request( ii_event ).
EXPORTING it_postdata = ii_event->mt_postdata
IMPORTING eg_fields = ms_commit ).
ms_commit-repo_key = mo_repo->get_key( ). ms_commit-repo_key = mo_repo->get_key( ).
zcl_abapgit_services_git=>commit( zcl_abapgit_services_git=>commit(

View File

@ -56,7 +56,7 @@ CLASS zcl_abapgit_gui_page_merge_res DEFINITION
METHODS apply_merged_content METHODS apply_merged_content
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS build_menu METHODS build_menu
@ -113,30 +113,19 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION.
METHOD apply_merged_content. METHOD apply_merged_content.
DATA: DATA:
BEGIN OF ls_filedata, lv_merge_content TYPE string,
merge_content TYPE string,
END OF ls_filedata,
lt_fields TYPE tihttpnvp, lt_fields TYPE tihttpnvp,
lv_new_file_content TYPE xstring. lv_new_file_content TYPE xstring.
FIELD-SYMBOLS: FIELD-SYMBOLS:
<ls_conflict> TYPE zif_abapgit_definitions=>ty_merge_conflict. <ls_conflict> TYPE zif_abapgit_definitions=>ty_merge_conflict.
lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( lv_merge_content = ii_event->form_data( iv_upper_cased = abap_true )->get( 'MERGE_CONTENT' ).
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 ).
REPLACE ALL OCCURRENCES 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 <ls_conflict> INDEX mv_current_conflict_index. READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.
<ls_conflict>-result_sha1 = zcl_abapgit_hash=>sha1( <ls_conflict>-result_sha1 = zcl_abapgit_hash=>sha1(
@ -545,7 +534,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_MERGE_RES IMPLEMENTATION.
CASE ii_event->mv_action. CASE ii_event->mv_action.
WHEN c_actions-apply_merge. WHEN c_actions-apply_merge.
apply_merged_content( ii_event->mt_postdata ). apply_merged_content( ii_event ).
WHEN c_actions-apply_source. WHEN c_actions-apply_source.
READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index. READ TABLE mt_conflicts ASSIGNING <ls_conflict> INDEX mv_current_conflict_index.

View File

@ -77,12 +77,12 @@ CLASS zcl_abapgit_gui_page_patch DEFINITION
!is_diff TYPE ty_file_diff . !is_diff TYPE ty_file_diff .
METHODS start_staging METHODS start_staging
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS apply_patch_from_form_fields METHODS apply_patch_from_form_fields
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS restore_patch_flags METHODS restore_patch_flags
@ -319,19 +319,11 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION.
METHOD apply_patch_from_form_fields. METHOD apply_patch_from_form_fields.
DATA: DATA:
lt_fields TYPE tihttpnvp,
lv_add TYPE string, lv_add TYPE string,
lv_remove TYPE string. lv_remove TYPE string.
lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( it_postdata ). lv_add = ii_event->form_data( )->get( c_patch_action-add ).
lv_remove = ii_event->form_data( )->get( c_patch_action-remove ).
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 ).
apply_patch_all( iv_patch = lv_add apply_patch_all( iv_patch = lv_add
iv_patch_flag = abap_true ). iv_patch_flag = abap_true ).
@ -731,7 +723,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION.
METHOD start_staging. METHOD start_staging.
apply_patch_from_form_fields( it_postdata ). apply_patch_from_form_fields( ii_event ).
add_to_stage( ). add_to_stage( ).
ENDMETHOD. ENDMETHOD.
@ -742,7 +734,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_PATCH IMPLEMENTATION.
CASE ii_event->mv_action. CASE ii_event->mv_action.
WHEN c_actions-stage. 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 CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_commit
EXPORTING 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. FIND FIRST OCCURRENCE OF REGEX |^{ c_actions-refresh }| IN ii_event->mv_action.
IF sy-subrc = 0. 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 ). refresh( ii_event->mv_action ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render. rs_handled-state = zcl_abapgit_gui=>c_event_state-re_render.

View File

@ -74,7 +74,7 @@ CLASS zcl_abapgit_gui_page_stage DEFINITION
VALUE(ri_html) TYPE REF TO zif_abapgit_html . VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS stage_selected METHODS stage_selected
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
RETURNING RETURNING
VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage VALUE(ro_stage) TYPE REF TO zcl_abapgit_stage
RAISING RAISING
@ -587,30 +587,29 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
METHOD stage_selected. METHOD stage_selected.
DATA: DATA ls_file TYPE zif_abapgit_definitions=>ty_file.
lt_fields TYPE tihttpnvp, DATA lo_files TYPE REF TO zcl_abapgit_string_map.
ls_file TYPE zif_abapgit_definitions=>ty_file.
FIELD-SYMBOLS: FIELD-SYMBOLS:
<ls_file> LIKE LINE OF ms_files-local, <ls_file> LIKE LINE OF ms_files-local,
<ls_status> LIKE LINE OF ms_files-status, <ls_status> LIKE LINE OF ms_files-status,
<ls_item> LIKE LINE OF lt_fields. <ls_item> 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' ). zcx_abapgit_exception=>raise( 'process_stage_list: empty list' ).
ENDIF. ENDIF.
CREATE OBJECT ro_stage. CREATE OBJECT ro_stage.
LOOP AT lt_fields ASSIGNING <ls_item> LOOP AT lo_files->mt_entries ASSIGNING <ls_item>
"Ignore Files that we don't want to stage, so any errors don't stop the staging process "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( zcl_abapgit_path=>split_file_location(
EXPORTING EXPORTING
iv_fullpath = <ls_item>-name iv_fullpath = <ls_item>-k
IMPORTING IMPORTING
ev_path = ls_file-path ev_path = ls_file-path
ev_filename = ls_file-filename ). 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.| ). | Consider ignoring or staging the file at a later time.| ).
ENDIF. ENDIF.
CASE <ls_item>-value. CASE <ls_item>-v.
WHEN zif_abapgit_definitions=>c_method-add. WHEN zif_abapgit_definitions=>c_method-add.
READ TABLE ms_files-local ASSIGNING <ls_file> READ TABLE ms_files-local ASSIGNING <ls_file>
WITH KEY file-path = ls_file-path 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. WHEN zif_abapgit_definitions=>c_method-skip.
" Do nothing " Do nothing
WHEN OTHERS. WHEN OTHERS.
zcx_abapgit_exception=>raise( |process_stage_list: unknown method { <ls_item>-value }| ). zcx_abapgit_exception=>raise( |process_stage_list: unknown method { <ls_item>-v }| ).
ENDCASE. ENDCASE.
ENDLOOP. ENDLOOP.
@ -659,8 +658,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
METHOD zif_abapgit_gui_event_handler~on_event. METHOD zif_abapgit_gui_event_handler~on_event.
DATA: lo_stage TYPE REF TO zcl_abapgit_stage, DATA: lo_stage TYPE REF TO zcl_abapgit_stage.
lt_fields TYPE tihttpnvp.
CASE ii_event->mv_action. CASE ii_event->mv_action.
WHEN c_action-stage_all. WHEN c_action-stage_all.
@ -676,7 +674,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
WHEN c_action-stage_commit. 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 CREATE OBJECT rs_handled-page TYPE zcl_abapgit_gui_page_commit
EXPORTING EXPORTING
@ -687,20 +685,12 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_STAGE IMPLEMENTATION.
WHEN c_action-stage_filter. WHEN c_action-stage_filter.
lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( ii_event->mt_postdata ). mv_filter_value = ii_event->form_data( )->get( 'filterValue' ).
zcl_abapgit_html_action_utils=>get_field(
EXPORTING
iv_name = 'filterValue'
it_field = lt_fields
CHANGING
cg_field = mv_filter_value ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act. rs_handled-state = zcl_abapgit_gui=>c_event_state-no_more_act.
WHEN zif_abapgit_definitions=>c_action-go_patch. " Go Patch page 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-page = get_page_patch( lo_stage ).
rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page. rs_handled-state = zcl_abapgit_gui=>c_event_state-new_page.

View File

@ -48,14 +48,16 @@ CLASS zcl_abapgit_gui_page_tag DEFINITION PUBLIC FINAL
VALUE(ri_html) TYPE REF TO zif_abapgit_html . VALUE(ri_html) TYPE REF TO zif_abapgit_html .
METHODS create_tag METHODS create_tag
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
RAISING RAISING
zcx_abapgit_exception . zcx_abapgit_exception .
METHODS parse_tag_request METHODS parse_tag_request
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab !ii_event TYPE REF TO zif_abapgit_gui_event
EXPORTING RETURNING
!eg_fields TYPE any . VALUE(rs_git_tag) TYPE zif_abapgit_definitions=>ty_git_tag
RAISING
zcx_abapgit_exception .
METHODS parse_change_tag_type_request METHODS parse_change_tag_type_request
IMPORTING IMPORTING
!it_postdata TYPE cnht_post_data_tab . !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, lx_error TYPE REF TO zcx_abapgit_exception,
lv_text TYPE string. lv_text TYPE string.
parse_tag_request( ls_tag = parse_tag_request( ii_event ).
EXPORTING it_postdata = it_postdata
IMPORTING eg_fields = ls_tag ).
IF ls_tag-name IS INITIAL. IF ls_tag-name IS INITIAL.
zcx_abapgit_exception=>raise( |Please supply a tag name| ). zcx_abapgit_exception=>raise( |Please supply a tag name| ).
@ -153,38 +153,15 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION.
METHOD parse_tag_request. METHOD parse_tag_request.
DATA lt_fields TYPE tihttpnvp. DATA lo_map TYPE REF TO zcl_abapgit_string_map.
FIELD-SYMBOLS <lv_body> TYPE string. lo_map = ii_event->form_data( ).
lo_map->strict( abap_false ). " Hack, refactor !
CLEAR eg_fields. lo_map->to_abap( CHANGING cs_container = rs_git_tag ).
REPLACE ALL OCCURRENCES
lt_fields = zcl_abapgit_html_action_utils=>parse_post_form_data( OF zif_abapgit_definitions=>c_crlf
it_post_data = it_postdata IN rs_git_tag-body
iv_upper_cased = abap_true ). WITH zif_abapgit_definitions=>c_newline.
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 <lv_body>.
ASSERT <lv_body> IS ASSIGNED.
REPLACE ALL OCCURRENCES OF zif_abapgit_definitions=>c_crlf IN <lv_body> WITH zif_abapgit_definitions=>c_newline.
ENDMETHOD. ENDMETHOD.
@ -377,7 +354,7 @@ CLASS ZCL_ABAPGIT_GUI_PAGE_TAG IMPLEMENTATION.
CASE ii_event->mv_action. CASE ii_event->mv_action.
WHEN c_action-commit_post. 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. rs_handled-state = zcl_abapgit_gui=>c_event_state-go_back.
WHEN c_action-change_tag_type. WHEN c_action-change_tag_type.

View File

@ -13,6 +13,7 @@ CLASS zcl_abapgit_html_action_utils DEFINITION
CLASS-METHODS parse_fields CLASS-METHODS parse_fields
IMPORTING IMPORTING
!iv_string TYPE clike !iv_string TYPE clike
!iv_upper_cased TYPE abap_bool DEFAULT abap_false
RETURNING RETURNING
VALUE(rt_fields) TYPE tihttpnvp . VALUE(rt_fields) TYPE tihttpnvp .
CLASS-METHODS parse_fields_upper_case_name CLASS-METHODS parse_fields_upper_case_name
@ -261,13 +262,18 @@ CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
ENDLOOP. ENDLOOP.
IF iv_upper_cased = abap_true.
field_keys_to_upper( CHANGING ct_fields = rt_fields ).
ENDIF.
ENDMETHOD. ENDMETHOD.
METHOD parse_fields_upper_case_name. METHOD parse_fields_upper_case_name.
rt_fields = parse_fields( iv_string ). rt_fields = parse_fields(
field_keys_to_upper( CHANGING ct_fields = rt_fields ). iv_string = iv_string
iv_upper_cased = abap_true ).
ENDMETHOD. ENDMETHOD.

View File

@ -16,6 +16,7 @@ CLASS zcl_abapgit_string_map DEFINITION
CLASS-METHODS create CLASS-METHODS create
RETURNING RETURNING
VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map. VALUE(ro_instance) TYPE REF TO zcl_abapgit_string_map.
METHODS constructor.
METHODS get METHODS get
IMPORTING IMPORTING
iv_key TYPE string iv_key TYPE string
@ -53,6 +54,11 @@ CLASS zcl_abapgit_string_map DEFINITION
!cs_container TYPE any !cs_container TYPE any
RAISING RAISING
zcx_abapgit_exception. 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. METHODS freeze.
DATA mt_entries TYPE tts_entries READ-ONLY. DATA mt_entries TYPE tts_entries READ-ONLY.
@ -60,6 +66,7 @@ CLASS zcl_abapgit_string_map DEFINITION
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
DATA mv_read_only TYPE abap_bool. DATA mv_read_only TYPE abap_bool.
DATA mv_is_strict TYPE abap_bool.
ENDCLASS. ENDCLASS.
@ -76,6 +83,11 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD constructor.
mv_is_strict = abap_true.
ENDMETHOD.
METHOD create. METHOD create.
CREATE OBJECT ro_instance. CREATE OBJECT ro_instance.
ENDMETHOD. ENDMETHOD.
@ -151,6 +163,12 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD strict.
mv_is_strict = iv_strict.
ro_instance = me.
ENDMETHOD.
METHOD to_abap. METHOD to_abap.
DATA lo_type TYPE REF TO cl_abap_typedescr. DATA lo_type TYPE REF TO cl_abap_typedescr.
@ -172,6 +190,8 @@ CLASS ZCL_ABAPGIT_STRING_MAP IMPLEMENTATION.
IF sy-subrc = 0. IF sy-subrc = 0.
" TODO check target type ? " TODO check target type ?
<lv_val> = <ls_entry>-v. <lv_val> = <ls_entry>-v.
ELSEIF mv_is_strict = abap_false.
CONTINUE.
ELSE. ELSE.
zcx_abapgit_exception=>raise( |Component { lv_field } not found in target| ). zcx_abapgit_exception=>raise( |Component { lv_field } not found in target| ).
ENDIF. ENDIF.

View File

@ -4,8 +4,18 @@ CLASS ltcl_sm_test DEFINITION
DURATION SHORT DURATION SHORT
RISK LEVEL HARMLESS. RISK LEVEL HARMLESS.
PRIVATE SECTION. 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 simple FOR TESTING RAISING zcx_abapgit_exception.
METHODS freeze FOR TESTING RAISING zcx_abapgit_exception. METHODS freeze FOR TESTING RAISING zcx_abapgit_exception.
METHODS strict FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS. ENDCLASS.
CLASS ltcl_sm_test IMPLEMENTATION. CLASS ltcl_sm_test IMPLEMENTATION.
@ -91,4 +101,46 @@ CLASS ltcl_sm_test IMPLEMENTATION.
ENDMETHOD. 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. ENDCLASS.