CLASS zcl_abapgit_html_action_utils DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS parse_fields
IMPORTING
!iv_string TYPE clike
RETURNING
VALUE(rt_fields) TYPE tihttpnvp .
CLASS-METHODS parse_fields_upper_case_name
IMPORTING
!iv_string TYPE clike
RETURNING
VALUE(rt_fields) TYPE tihttpnvp .
CLASS-METHODS get_field
IMPORTING
!iv_name TYPE string
!it_field TYPE tihttpnvp
!iv_decode TYPE abap_bool DEFAULT abap_false
CHANGING
!cg_field TYPE any .
CLASS-METHODS jump_encode
IMPORTING
!iv_obj_type TYPE tadir-object
!iv_obj_name TYPE tadir-obj_name
RETURNING
VALUE(rv_string) TYPE string .
CLASS-METHODS jump_decode
IMPORTING
!iv_string TYPE clike
EXPORTING
!ev_obj_type TYPE tadir-object
!ev_obj_name TYPE tadir-obj_name
RAISING
zcx_abapgit_exception .
CLASS-METHODS dir_encode
IMPORTING
!iv_path TYPE string
RETURNING
VALUE(rv_string) TYPE string .
CLASS-METHODS dir_decode
IMPORTING
!iv_string TYPE clike
RETURNING
VALUE(rv_path) TYPE string
RAISING
zcx_abapgit_exception .
CLASS-METHODS file_encode
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
!ig_file TYPE any
RETURNING
VALUE(rv_string) TYPE string .
CLASS-METHODS obj_encode
IMPORTING
!iv_key TYPE zif_abapgit_persistence=>ty_repo-key
!ig_object TYPE any
RETURNING
VALUE(rv_string) TYPE string .
CLASS-METHODS file_obj_decode
IMPORTING
!iv_string TYPE clike
EXPORTING
!ev_key TYPE zif_abapgit_persistence=>ty_repo-key
!eg_file TYPE any "assuming ty_file
!eg_object TYPE any "assuming ty_item
RAISING
zcx_abapgit_exception .
CLASS-METHODS dbkey_encode
IMPORTING
!is_key TYPE zif_abapgit_persistence=>ty_content
RETURNING
VALUE(rv_string) TYPE string .
CLASS-METHODS dbkey_decode
IMPORTING
!iv_string TYPE clike
RETURNING
VALUE(rs_key) TYPE zif_abapgit_persistence=>ty_content .
CLASS-METHODS stage_decode
IMPORTING
!iv_getdata TYPE clike
EXPORTING
!ev_key TYPE zif_abapgit_persistence=>ty_repo-key
!ev_seed TYPE string
RAISING
zcx_abapgit_exception .
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-METHODS field_keys_to_upper
CHANGING
!ct_fields TYPE tihttpnvp .
CLASS-METHODS add_field
IMPORTING
!iv_name TYPE string
!ig_field TYPE any
CHANGING
!ct_field TYPE tihttpnvp .
CLASS-METHODS unescape
IMPORTING
!iv_string TYPE string
RETURNING
VALUE(rv_string) TYPE string .
ENDCLASS.
CLASS ZCL_ABAPGIT_HTML_ACTION_UTILS IMPLEMENTATION.
METHOD add_field.
DATA ls_field LIKE LINE OF ct_field.
FIELD-SYMBOLS TYPE any.
ls_field-name = iv_name.
CASE cl_abap_typedescr=>describe_by_data( ig_field )->kind.
WHEN cl_abap_typedescr=>kind_elem.
ls_field-value = ig_field.
WHEN cl_abap_typedescr=>kind_struct.
ASSIGN COMPONENT iv_name OF STRUCTURE ig_field TO .
ASSERT IS ASSIGNED.
ls_field-value = .
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
APPEND ls_field TO ct_field.
ENDMETHOD.
METHOD dbkey_decode.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields_upper_case_name( cl_http_utility=>unescape_url( |{ iv_string }| ) ).
get_field( EXPORTING iv_name = 'TYPE' it_field = lt_fields CHANGING cg_field = rs_key-type ).
get_field( EXPORTING iv_name = 'VALUE' it_field = lt_fields CHANGING cg_field = rs_key-value ).
ENDMETHOD.
METHOD dbkey_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING iv_name = 'TYPE' ig_field = is_key-type CHANGING ct_field = lt_fields ).
add_field( EXPORTING iv_name = 'VALUE' ig_field = is_key-value CHANGING ct_field = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD.
METHOD dir_decode.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields( iv_string ).
get_field( EXPORTING iv_name = 'PATH' it_field = lt_fields CHANGING cg_field = rv_path ).
ENDMETHOD.
METHOD dir_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING iv_name = 'PATH' ig_field = iv_path CHANGING ct_field = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD.
METHOD field_keys_to_upper.
FIELD-SYMBOLS LIKE LINE OF ct_fields.
LOOP AT ct_fields ASSIGNING .
-name = to_upper( -name ).
ENDLOOP.
ENDMETHOD.
METHOD file_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING iv_name = 'KEY' ig_field = iv_key CHANGING ct_field = lt_fields ).
add_field( EXPORTING iv_name = 'PATH' ig_field = ig_file CHANGING ct_field = lt_fields ).
add_field( EXPORTING iv_name = 'FILENAME' ig_field = ig_file CHANGING ct_field = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD.
METHOD file_obj_decode.
DATA: lt_fields TYPE tihttpnvp.
ASSERT eg_file IS SUPPLIED OR eg_object IS SUPPLIED OR ev_key IS SUPPLIED.
CLEAR: ev_key, eg_file, eg_object.
lt_fields = parse_fields_upper_case_name( iv_string ).
get_field( EXPORTING iv_name = 'KEY' it_field = lt_fields CHANGING cg_field = ev_key ).
IF eg_file IS SUPPLIED.
get_field( EXPORTING iv_name = 'PATH' it_field = lt_fields CHANGING cg_field = eg_file ).
get_field( EXPORTING iv_name = 'FILENAME' it_field = lt_fields CHANGING cg_field = eg_file ).
ENDIF.
IF eg_object IS SUPPLIED.
get_field( EXPORTING iv_name = 'OBJ_TYPE' it_field = lt_fields CHANGING cg_field = eg_object ).
get_field( EXPORTING iv_name = 'OBJ_NAME' it_field = lt_fields iv_decode = abap_true
CHANGING cg_field = eg_object ).
ENDIF.
ENDMETHOD.
METHOD get_field.
DATA: lv_value TYPE string.
FIELD-SYMBOLS: LIKE LINE OF it_field,
TYPE any.
READ TABLE it_field ASSIGNING WITH KEY name = iv_name.
IF sy-subrc IS NOT INITIAL.
RETURN.
ENDIF.
lv_value = -value.
IF iv_decode = abap_true.
* URL decode, not sure why some are decoded automatically
REPLACE ALL OCCURRENCES OF '%3d' IN lv_value WITH '='.
ENDIF.
CASE cl_abap_typedescr=>describe_by_data( cg_field )->kind.
WHEN cl_abap_typedescr=>kind_elem.
cg_field = lv_value.
WHEN cl_abap_typedescr=>kind_struct.
ASSIGN COMPONENT iv_name OF STRUCTURE cg_field TO .
ASSERT IS ASSIGNED.
= lv_value.
WHEN OTHERS.
ASSERT 0 = 1.
ENDCASE.
ENDMETHOD.
METHOD jump_decode.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields( iv_string ).
get_field( EXPORTING iv_name = 'TYPE' it_field = lt_fields CHANGING cg_field = ev_obj_type ).
get_field( EXPORTING iv_name = 'NAME' it_field = lt_fields CHANGING cg_field = ev_obj_name ).
ENDMETHOD.
METHOD jump_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING iv_name = 'TYPE' ig_field = iv_obj_type CHANGING ct_field = lt_fields ).
add_field( EXPORTING iv_name = 'NAME' ig_field = iv_obj_name CHANGING ct_field = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD.
METHOD obj_encode.
DATA: lt_fields TYPE tihttpnvp.
add_field( EXPORTING iv_name = 'KEY' ig_field = iv_key CHANGING ct_field = lt_fields ).
add_field( EXPORTING iv_name = 'OBJ_TYPE' ig_field = ig_object CHANGING ct_field = lt_fields ).
add_field( EXPORTING iv_name = 'OBJ_NAME' ig_field = ig_object CHANGING ct_field = lt_fields ).
rv_string = cl_http_utility=>if_http_utility~fields_to_string( lt_fields ).
ENDMETHOD.
METHOD parse_fields.
DATA: lt_substrings TYPE stringtab,
ls_field LIKE LINE OF rt_fields.
FIELD-SYMBOLS: LIKE LINE OF lt_substrings.
SPLIT iv_string AT '&' INTO TABLE lt_substrings.
LOOP AT lt_substrings ASSIGNING .
CLEAR: ls_field.
ls_field-name = substring_before( val =
sub = '=' ).
ls_field-name = unescape( ls_field-name ).
ls_field-value = substring_after( val =
sub = '=' ).
ls_field-value = unescape( ls_field-value ).
INSERT ls_field INTO TABLE rt_fields.
ENDLOOP.
ENDMETHOD.
METHOD parse_fields_upper_case_name.
rt_fields = parse_fields( iv_string ).
field_keys_to_upper( CHANGING ct_fields = rt_fields ).
ENDMETHOD.
METHOD stage_decode.
DATA: lt_fields TYPE tihttpnvp.
lt_fields = parse_fields_upper_case_name( iv_getdata ).
get_field( EXPORTING iv_name = 'KEY' it_field = lt_fields CHANGING cg_field = ev_key ).
get_field( EXPORTING iv_name = 'SEED' it_field = lt_fields CHANGING cg_field = ev_seed ).
ASSERT NOT ev_key IS INITIAL.
ENDMETHOD.
METHOD unescape.
* do not use cl_http_utility as it does strange things with the encoding
rv_string = iv_string.
* todo, more to be added here
REPLACE ALL OCCURRENCES OF '%3F' IN rv_string WITH '?'.
ENDMETHOD.
ENDCLASS.