abapGit/test/src/web/zcl_abapgit_web.clas.abap
2025-04-18 16:45:25 +02:00

194 lines
4.9 KiB
ABAP

CLASS zcl_abapgit_web DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS handle
IMPORTING
ii_request TYPE REF TO zif_abapgit_web_request
ii_response TYPE REF TO zif_abapgit_web_response
RAISING
zcx_abapgit_exception.
PROTECTED SECTION.
CONSTANTS c_base TYPE string VALUE '/sap/zabapgit/' ##NO_TEXT.
CLASS-DATA go_viewer TYPE REF TO zcl_abapgit_html_viewer_web .
CLASS-DATA go_gui TYPE REF TO zcl_abapgit_gui .
CLASS-DATA gi_request TYPE REF TO zif_abapgit_web_request.
CLASS-DATA gi_response TYPE REF TO zif_abapgit_web_response.
CLASS-METHODS initialize
RAISING
zcx_abapgit_exception.
CLASS-METHODS sapevent.
CLASS-METHODS redirect.
CLASS-METHODS search_asset
RETURNING
VALUE(rv_found) TYPE abap_bool
RAISING
zcx_abapgit_exception.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_abapgit_web IMPLEMENTATION.
METHOD handle.
DATA lv_found TYPE abap_bool.
DATA lv_path TYPE string.
gi_request = ii_request.
gi_response = ii_response.
IF go_viewer IS INITIAL.
initialize( ).
ENDIF.
lv_found = search_asset( ).
IF lv_found = abap_true.
RETURN.
ENDIF.
lv_path = cl_http_utility=>unescape_url( ii_request->get_header_field( '~path' ) ).
IF lv_path = '/sap/zabapgit'.
redirect( ).
ELSEIF lv_path = c_base.
go_gui->go_home( zif_abapgit_definitions=>c_action-go_home ).
ELSEIF lv_path = |{ c_base }css/bundle.css|.
go_viewer->zif_abapgit_html_viewer~show_url( |css/bundle.css| ).
ELSEIF lv_path CP |{ c_base }sapevent:+*|.
sapevent( ).
ELSE.
ii_response->set_content_type( 'text/html' ).
ii_response->set_cdata( 'handle_request, unknown path ' && lv_path ).
ENDIF.
ENDMETHOD.
METHOD initialize.
DATA lo_environment TYPE REF TO zcl_abapgit_web_environment.
DATA lo_cts_api TYPE REF TO zcl_abapgit_web_cts_api.
DATA lo_user_record TYPE REF TO zcl_abapgit_web_user_record.
zcl_abapgit_web_inject_fm=>inject( ).
CREATE OBJECT lo_environment.
zcl_abapgit_injector=>set_environment( lo_environment ).
CREATE OBJECT lo_cts_api.
zcl_abapgit_injector=>set_cts_api( lo_cts_api ).
CREATE OBJECT lo_user_record.
zcl_abapgit_env_injector=>set_user_record( lo_user_record ).
CREATE OBJECT go_viewer
EXPORTING
ii_request = gi_request
ii_response = gi_response.
zcl_abapgit_ui_core_injector=>set_html_viewer( go_viewer ).
go_gui = zcl_abapgit_ui_factory=>get_gui( ).
ENDMETHOD.
METHOD redirect.
DATA lv_html TYPE string.
lv_html =
|<!DOCTYPE html>\n| &&
|<html>\n| &&
| <head>\n| &&
| <title>HTML Meta Tag</title>\n| &&
| <meta http-equiv = "refresh" content = "0; url = { c_base }" />\n| &&
| </head>\n| &&
| <body>\n| &&
| <p>Redirecting</p>\n| &&
| </body>\n| &&
|</html>|.
gi_response->set_cdata( lv_html ).
ENDMETHOD.
METHOD sapevent.
* todo, parse and pass data
* todo, respect GET and POST
DATA: lv_action TYPE c LENGTH 100,
lv_getdata TYPE c LENGTH 100,
lv_method TYPE string,
lv_body TYPE string,
lv_value TYPE string,
lt_postdata TYPE zif_abapgit_html_viewer=>ty_post_data.
lv_value = gi_request->get_header_field( '~request_uri' ).
REPLACE FIRST OCCURRENCE OF c_base IN lv_value WITH ''.
FIND REGEX '^sapevent:([\w-]+)' IN lv_value SUBMATCHES lv_action.
FIND REGEX '\?([\w=&%.]+)' IN lv_value SUBMATCHES lv_getdata.
lv_method = gi_request->get_method( ).
IF lv_method = 'POST'.
lv_body = gi_request->get_cdata( ).
zcl_abapgit_convert=>string_to_tab(
EXPORTING
iv_str = lv_body
IMPORTING
et_tab = lt_postdata ).
ENDIF.
go_gui->on_event(
action = lv_action
getdata = lv_getdata
postdata = lt_postdata ).
* sdf getdata = iv_getdata
* sdf postdata = VALUE #( )
* sdf query_table = VALUE #( ).
ENDMETHOD.
METHOD search_asset.
DATA ls_asset TYPE zif_abapgit_gui_asset_manager=>ty_web_asset.
DATA lv_search TYPE string.
DATA lv_path TYPE string.
DATA li_assets TYPE REF TO zif_abapgit_gui_asset_manager.
lv_path = cl_http_utility=>unescape_url( gi_request->get_header_field( '~path' ) ).
li_assets = zcl_abapgit_ui_factory=>get_asset_manager( ).
IF lv_path CP |{ c_base }+*|.
lv_search = lv_path.
REPLACE FIRST OCCURRENCE OF c_base IN lv_search WITH ''.
TRY.
ls_asset = li_assets->get_asset( lv_search ).
gi_response->set_content_type( |{ ls_asset-type }/{ ls_asset-subtype }| ).
gi_response->set_xdata( ls_asset-content ).
rv_found = abap_true.
CATCH zcx_abapgit_exception.
rv_found = abap_false.
ENDTRY.
ENDIF.
ENDMETHOD.
ENDCLASS.