Refactoring performance (#862)

* refactoring-performance

* Update and rename abaplint-basic.jsonc to abaplint-standard_abap_readiness.jsonc

* Update abaplint-app.json

* Update abaplint-app.json

* refactoring

* update lint fixes

* refactoring

* Update README.md
This commit is contained in:
oblomov 2024-02-04 14:08:04 +01:00 committed by GitHub
parent 6f078ac570
commit 563a0e4306
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
28 changed files with 1025 additions and 1216 deletions

View File

@ -71,8 +71,8 @@ Install with [abapGit](https://abapgit.org) ![abapGit](https://docs.abapgit.org/
METHOD if_http_extension~handle_request.
DATA(lv_resp) = SWITCH #( server->request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get( )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( server->request->get_cdata( ) ) ).
WHEN 'GET' THEN z2ui5_cl_http_handler=>http_get( )
WHEN 'POST' THEN z2ui5_cl_http_handler=>http_post( server->request->get_cdata( ) ) ).
server->response->set_header_field( name = `cache-control` value = `no-cache` ).
server->response->set_cdata( lv_resp ).
@ -88,8 +88,8 @@ ENDMETHOD.
METHOD if_http_service_extension~handle_request.
DATA(lv_resp) = SWITCH #( request->get_method( )
WHEN 'GET' THEN z2ui5_cl_fw_http_handler=>http_get( )
WHEN 'POST' THEN z2ui5_cl_fw_http_handler=>http_post( request->get_text( ) ) ).
WHEN 'GET' THEN z2ui5_cl_http_handler=>http_get( )
WHEN 'POST' THEN z2ui5_cl_http_handler=>http_post( request->get_text( ) ) ).
response->set_header_field( i_name = `cache-control` i_value = `no-cache` ).
response->set_text( lv_resp ).

View File

@ -3,8 +3,8 @@
"default": {
"filename": "./abaplint.jsonc"
},
"all_folder_min_check": {
"filename": "./abaplint-basic.jsonc"
"abap_standard_readiness": {
"filename": "./abaplint-standard_abap_readiness.jsonc"
},
"abap_cloud_readiness": {
"filename": "./abaplint-abap_cloud_readiness.jsonc"

View File

@ -1,323 +0,0 @@
{
"global": {
"files": "/src/**/*.*"
},
"dependencies": [
{
"url": "https://github.com/abapedia/steampunk-2305-api-intersect-702",
"folder": "/deps",
"files": "/src/**/*.*"
}
],
"syntax": {
"version": "v750",
"errorNamespace": "."
},
"rules": {
"7bit_ascii": false,
"abapdoc": false,
"sql_value_conversion" : true,
"select_single_full_key" : true,
"strict_sql" : true,
"easy_to_find_messages" : true,
"fully_type_itabs" : false,
"align_parameters": false,
"smim_consistency": true,
"allowed_object_naming": true,
"allowed_object_types": {
"allowed": [
"CLAS",
"DEVC",
"INTF",
"TABL",
]
},
"ambiguous_statement": true,
"avoid_use": false,
"begin_end_names": true,
"begin_single_include": true,
"call_transaction_authority_check": true,
"cds_comment_style": true,
"cds_legacy_view": true,
"cds_parser_error": true,
"chain_mainly_declarations": true,
"change_if_to_case": {
"exclude": [],
"severity": "Error",
"skipNames": []
},
"check_abstract": true,
"check_comments": false,
"check_ddic": true,
"check_include": true,
"check_subrc": false,
"check_syntax": true,
"check_text_elements": true,
"check_transformation_exists": true,
"class_attribute_names": false,
"classic_exceptions_overlap": true,
"cloud_types": true,
"colon_missing_space": true,
"commented_code": false,
"constant_classes": {
"exclude": [],
"severity": "Error",
"mapping": []
},
"constructor_visibility_public": true,
"contains_tab": {
"exclude": [],
"severity": "Error",
"spaces": 1
},
"cyclic_oo": false,
"cyclomatic_complexity": {
"exclude": [],
"severity": "Error",
"max": 25
},
"dangerous_statement": true,
"db_operation_in_loop": true,
"definitions_top": false,
"description_empty": true,
"double_space": false,
"downport": true,
"empty_line_in_statement": true,
"empty_statement": true,
"empty_structure": {
"loop": true,
"if": true,
"while": true,
"case": true,
"select": true,
"do": true,
"at": true,
"try": true,
"when": false
},
"exit_or_check": true,
"expand_macros": true,
"exporting": true,
"forbidden_identifier": true,
"forbidden_pseudo_and_pragma": {
"exclude": [],
"severity": "Error",
"pseudo": [],
"pragmas": [],
"ignoreGlobalClassDefinition": false,
"ignoreGlobalInterface": false
},
"form_tables_obsolete": true,
"fully_type_constants": {
"checkData": true
},
"function_module_recommendations": true,
"functional_writing": {
"ignoreExceptions": true
},
"global_class": true,
"identical_conditions": true,
"identical_contents": false,
"identical_descriptions": true,
"identical_form_names": true,
"if_in_if": true,
"implement_methods": true,
"in_statement_indentation": false,
"indentation": false,
"inline_data_old_versions": true,
"intf_referencing_clas": false,
"keep_single_parameter_on_one_line": false,
"keyword_case": false,
"line_break_multiple_parameters": false,
"line_break_style": true,
"line_length": false,
"line_only_punc": false,
"local_class_naming": false,
"local_testclass_consistency": true,
"local_variable_names": false,
"main_file_contents": true,
"many_parentheses": true,
"max_one_method_parameter_per_line": true,
"max_one_statement": true,
"message_exists": true,
"method_implemented_twice": true,
"method_length": false,
"method_overwrites_builtin": false,
"method_parameter_names": false,
"mix_returning": true,
"modify_only_own_db_tables": {
"reportDynamic": true,
"ownTables": "^[yz]"
},
"msag_consistency": true,
"names_no_dash": true,
"nesting": {
"depth": 7
},
"newline_between_methods": false,
"no_aliases": false,
"no_chained_assignment": true,
"no_external_form_calls": true,
"no_inline_in_optional_branches": false,
"no_public_attributes": false,
"no_yoda_conditions": false,
"nrob_consistency": true,
"object_naming": {
"exclude": [],
"severity": "Error",
"patternKind": "required",
"ignoreNames": [],
"ignorePatterns": [],
"clas": "^Z2UI5_C(L|X)",
"intf": "^Z2UI5_IF",
"prog": "^Z",
"fugr": "^Z",
"tabl": "^Z",
"ttyp": "^Z",
"dtel": "^Z",
"doma": "^Z",
"msag": "^Z",
"tran": "^Z",
"enqu": "^EZ",
"auth": "^Z",
"pinf": "^Z",
"idoc": "^Z",
"xslt": "^Z",
"ssfo": "^Z",
"ssst": "^Z",
"shlp": "^Z"
},
"obsolete_statement": true,
"omit_parameter_name": false,
"omit_preceding_zeros": true,
"omit_receiving": true,
"parser_702_chaining": true,
"parser_error": true,
"parser_missing_space": false,
"pragma_style": true,
"prefer_corresponding": true,
"prefer_inline": false,
"prefer_is_not": false,
"prefer_raise_exception_new": true,
"prefer_returning_to_exporting": false,
"prefer_xsdbool": false,
"preferred_compare_operator": true,
"prefix_is_current_class": {
"severity": "Warning"
},
"reduce_string_templates": true,
"release_idoc": true,
"remove_descriptions": {
"exclude": [],
"severity": "Error",
"ignoreExceptions": false,
"ignoreWorkflow": true
},
"rfc_error_handling": true,
"select_add_order_by": false,
"select_performance": true,
"selection_screen_naming": true,
"sequential_blank": {
"severity": "Warning"
},
"short_case": false,
"sicf_consistency": true,
"slow_parameter_passing": true,
"space_before_colon": true,
"space_before_dot": true,
"sql_escape_host_variables": true,
"start_at_tab": false,
"static_call_via_instance": {
"allowInTestclassIncludes": false
},
"superclass_final": true,
"superfluous_value": true,
"sy_modification": false,
"tabl_enhancement_category": true,
"try_without_catch": true,
"type_form_parameters": true,
"types_naming": false,
"uncaught_exception": true,
"unknown_types": true,
"unnecessary_chaining": false,
"unnecessary_pragma": true,
"unnecessary_return": true,
"unreachable_code": {
"exclude": ["z2ui5_cl_fw_utility.clas.testclasses.abap"]
},
"unsecure_fae": true,
"unused_ddic": true,
"unused_methods": true,
"unused_types": true,
"unused_variables": {
"severity": "Error",
"exclude": ["z2ui5_cl_fw_utility.clas.testclasses.abap"],
"skipNames": ["lv_dummy", "i_mv_editor"]
},
"use_bool_expression": true,
"use_class_based_exceptions": true,
"use_line_exists": false,
"use_new": false,
"when_others_last": true,
"whitespace_end": true,
"xml_consistency": true,
"forbidden_void_type": {
"check": [
"^boole_d$",
"^char10$",
"^char12$",
"^char2$",
"^char20$",
"^char30$",
"^char4$",
"^char50$",
"^char70$",
"^cl_abap_syst",
"^cl_aff_",
"^cl_aucv_test_runner_abstract$",
"^cl_aucv_test_runner_standard$",
"^cl_aunit_assert$",
"^cl_axt_dbtable$",
"^cl_blue_wb_utility$",
"^cl_oo_source$",
"^/ui2/cl_json$",
"^cl_saunit_internal_result$",
"^cl_srvd_wb_object_data$",
"^cl_wb_object_operator_factory$",
"^cl_wer_const$",
"^cl_xco_",
"^cx_aff_",
"^cx_wb_object_operation_error$",
"^cx_xco_",
"^flag$",
"^i18_a_langiso2$",
"^if_adt_lock_handle$",
"^if_aff_",
"^if_satc_ci_variant_access$",
"^if_saunit_internal_result$",
"^if_saunit_internal_result_type$",
"^if_srvd_types$",
"^if_wb_adt_plugin_resource_co$",
"^if_wb_object_data_selection_co$",
"^if_wb_object_operator$",
"^if_xco_",
"^int4$",
"^numc2$",
"^sabp_t_tadir_keys$",
"^sap_bool$",
"^srcsystem$",
"^stringtab$",
"^sychar01$",
"^sychar10$",
"^sychar70$",
"^sydatum$",
"^sylangu$",
"^syst_title$",
"^syuzeit$",
"^xubname$",
"^feld$",
"^abap_boolean$",
]
},
}
}

View File

@ -0,0 +1,33 @@
{
"global": {
"files": "/src/**/*.*"
},
"dependencies": [
{
"url": "https://github.com/abapedia/steampunk-2305-api-intersect-702",
"folder": "/deps",
"files": "/src/**/*.*"
}
],
"syntax": {
"version": "v750",
"errorNamespace": "."
},
"rules": {
"begin_end_names": true,
"cds_parser_error": true,
"check_ddic": true,
"strict_sql": true,
"sql_escape_host_variables": true,
"check_include": true,
"check_syntax": true,
"cloud_types": true,
"global_class": true,
"implement_methods": true,
"method_implemented_twice": true,
"parser_error": true,
"superclass_final": true,
"unknown_types": true,
"xml_consistency": true
}
}

View File

@ -1557,6 +1557,22 @@ CLASS ltcl_json_to_abap IMPLEMENTATION.
act = lv_mock
exp = '111111' ).
* DATA lv_mock_init TYPE t.
*
* CREATE OBJECT lo_nodes.
* lo_nodes->add( ' | |str || ' ).
*
* CREATE OBJECT lo_cut.
* lo_cut->to_abap(
* EXPORTING
* it_nodes = lo_nodes->sorted( )
* CHANGING
* c_container = lv_mock_init ).
*
* cl_abap_unit_assert=>assert_equals(
* act = lv_mock_init
* exp = '000000' ).
ENDMETHOD.
METHOD to_abap_value.

View File

@ -392,6 +392,12 @@ CLASS z2ui5_cl_util_func DEFINITION
RETURNING
VALUE(result) TYPE ty_data_element_texts.
CLASS-METHODS ui5_set_arg_string
IMPORTING
val TYPE string_table
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
@ -400,6 +406,26 @@ ENDCLASS.
CLASS z2ui5_cl_util_func IMPLEMENTATION.
METHOD ui5_set_arg_string.
IF val IS NOT INITIAL.
LOOP AT val REFERENCE INTO DATA(lr_arg).
DATA(lv_new) = lr_arg->*.
IF lv_new IS INITIAL.
CONTINUE.
ENDIF.
IF lv_new(1) <> `$` AND lv_new(1) <> `{`.
lv_new = `"` && lv_new && `"`.
ENDIF.
result = result && `, ` && lv_new.
ENDLOOP.
ENDIF.
result = result && `)`.
ENDMETHOD.
METHOD app_get_url.
@ -1457,7 +1483,7 @@ CLASS z2ui5_cl_util_func IMPLEMENTATION.
TRY.
TRY.
data(lv_classname) = `CL_SYSTEM_UUID`.
DATA(lv_classname) = `CL_SYSTEM_UUID`.
CALL METHOD (lv_classname)=>if_system_uuid_static~create_uuid_c32
RECEIVING
uuid = uuid.

View File

@ -0,0 +1,236 @@
CLASS z2ui5_cl_fw_app DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_s_next2,
BEGIN OF s_view,
xml TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_view,
BEGIN OF s_view_nest,
xml TYPE string,
id TYPE string,
method_insert TYPE string,
method_destroy TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_view_nest,
BEGIN OF s_view_nest2,
xml TYPE string,
id TYPE string,
method_insert TYPE string,
method_destroy TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_view_nest2,
BEGIN OF s_popup,
xml TYPE string,
id TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_popup,
BEGIN OF s_popover,
xml TYPE string,
id TYPE string,
open_by_id TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_popover,
BEGIN OF s_msg_box,
type TYPE string,
text TYPE string,
END OF s_msg_box,
BEGIN OF s_msg_toast,
text TYPE string,
END OF s_msg_toast,
END OF ty_s_next2.
TYPES:
BEGIN OF ty_s_next,
o_app_call TYPE REF TO z2ui5_if_app,
o_app_leave TYPE REF TO z2ui5_if_app,
s_set TYPE ty_s_next2,
END OF ty_s_next.
DATA mo_http_post TYPE REF TO z2ui5_cl_fw_http_post.
DATA ms_db TYPE z2ui5_cl_fw_draft=>ty_s_db.
DATA ms_actual TYPE z2ui5_if_client=>ty_s_actual.
DATA ms_next TYPE ty_s_next.
METHODS factory_system_startup
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
METHODS factory_system_error
IMPORTING
ix TYPE REF TO cx_root
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
METHODS factory_first_start
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
METHODS factory_by_frontend
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
METHODS factory_app_leave
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
METHODS factory_app_call
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
METHODS constructor
IMPORTING
val TYPE REF TO z2ui5_cl_fw_http_post.
PROTECTED SECTION.
METHODS app_next_factory
IMPORTING
app TYPE REF TO z2ui5_if_app
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_app.
PRIVATE SECTION.
ENDCLASS.
CLASS Z2UI5_CL_FW_APP IMPLEMENTATION.
METHOD app_next_factory.
app->id_draft = COND #( WHEN app->id_draft IS INITIAL THEN z2ui5_cl_util_func=>uuid_get_c32( ) ELSE app->id_draft ).
result = NEW #( mo_http_post ).
result->ms_db-app = app.
result->ms_db-id = app->id_draft.
result->ms_db-id_prev = ms_db-id.
result->ms_db-id_prev_app = ms_db-id.
result->ms_actual-check_on_navigated = abap_true.
result->ms_next-s_set = ms_next-s_set.
TRY.
DATA(ls_db_next) = z2ui5_cl_fw_draft=>load_app( app->id_draft ).
result->ms_db-t_attri = ls_db_next-t_attri.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD constructor.
mo_http_post = val.
ENDMETHOD.
METHOD factory_app_call.
result = app_next_factory( ms_next-o_app_call ).
result->ms_db-id_prev_app_stack = ms_db-id.
CLEAR ms_next.
IF ms_db-app IS BOUND.
z2ui5_cl_fw_draft=>create( id = ms_db-id db = ms_db ).
ENDIF.
CLEAR result->ms_db-t_attri.
ENDMETHOD.
METHOD factory_app_leave.
result = app_next_factory( ms_next-o_app_leave ).
TRY.
DATA(ls_draft) = z2ui5_cl_fw_draft=>read( id = result->ms_db-id check_load_app = abap_false ).
result->ms_db-id_prev_app_stack = ls_draft-id_prev_app_stack.
CATCH cx_root.
result->ms_db-id_prev_app_stack = ms_db-id_prev_app_stack.
ENDTRY.
CLEAR ms_next.
z2ui5_cl_fw_draft=>create( id = ms_db-id db = ms_db ).
ENDMETHOD.
METHOD factory_by_frontend.
result = NEW #( mo_http_post ).
result->ms_db = z2ui5_cl_fw_draft=>load_app( mo_http_post->ms_request-s_frontend-id ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
result->ms_db-id_prev = mo_http_post->ms_request-s_frontend-id.
result->ms_actual-viewname = mo_http_post->ms_request-s_frontend-viewname.
NEW z2ui5_cl_fw_http_mapper( )->model_front_to_back(
viewname = mo_http_post->ms_request-s_frontend-viewname
app = result->ms_db-app
t_attri = result->ms_db-t_attri
ajson_in = mo_http_post->ms_request-model
).
result->ms_actual-event = mo_http_post->ms_request-s_control-event.
result->ms_actual-t_event_arg = mo_http_post->ms_request-s_control-t_event_arg.
result->ms_actual-check_on_navigated = abap_false.
result->ms_db-check_attri = abap_false.
ENDMETHOD.
METHOD factory_first_start.
TRY.
result = NEW #( mo_http_post ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
CREATE OBJECT result->ms_db-app TYPE (mo_http_post->ms_request-s_control-app_start).
result->ms_db-app->id_draft = result->ms_db-id.
result->ms_actual-check_on_navigated = abap_true.
CATCH cx_root.
RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING
val = `App with name ` && mo_http_post->ms_request-s_control-app_start && ` not found...`.
ENDTRY.
ENDMETHOD.
METHOD factory_system_error.
result = NEW #( mo_http_post ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
result->ms_actual-check_on_navigated = abap_true.
result->ms_next-o_app_call = z2ui5_cl_fw_app_error=>factory( ix ).
result = result->factory_app_call( ).
ENDMETHOD.
METHOD factory_system_startup.
result = NEW #( mo_http_post ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
result->ms_actual-check_on_navigated = abap_true.
result->ms_db-app = z2ui5_cl_fw_app_startup=>factory( ).
result->ms_db-app->id_draft = result->ms_db-id.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,71 @@
*CLASS ltcl_unit_test DEFINITION FINAL FOR TESTING
* DURATION LONG
* RISK LEVEL HARMLESS.
*
* PRIVATE SECTION.
* METHODS test_req_begin_fw_start FOR TESTING RAISING cx_static_check.
* METHODS test_req_begin_app_start FOR TESTING RAISING cx_static_check.
* METHODS test_req_end FOR TESTING RAISING cx_static_check.
*
*ENDCLASS.
*
*CLASS z2ui5_cl_fw_controller DEFINITION LOCAL FRIENDS ltcl_unit_test.
*
*CLASS ltcl_unit_test IMPLEMENTATION.
*
* METHOD test_req_begin_fw_start.
*
* DATA(lv_body) = `{"OLOCATION":{"ORIGIN":"https:/url.abap-web.us10.hana.ondemand.com","PATHNAME":"/sap/bc/http/sap/z_http_service_for_ui","SEARCH":"?sap-client=100","VERSION":"com.sap.ui5.dist:sapui5-sdk-dist:1.115.0:war"}}`.
*
* DATA(lo_handler) = z2ui5_cl_fw_controller=>request_begin( lv_body ).
*
* cl_abap_unit_assert=>assert_bound( lo_handler->ms_db-app ).
*
* DATA(lo_app_fw) = CAST z2ui5_cl_fw_app_startup( lo_handler->ms_db-app ) ##NEEDED.
*
* ENDMETHOD.
*
* METHOD test_req_begin_app_start.
*
* DATA(lv_body) = `{"OLOCATION":{"ORIGIN":"https://url.abap-web.us10.hana.ondemand.com","PATHNAME":"/sap/bc/http/sap/z_http_service_for_ui","SEARCH":"?sap-client=100&app_start=z2ui5_cl_app_hello_world","VERSION":"c` &&
* `om.sap.ui5.dist:sapui5-sdk-dist:1.115.0:war"}}`.
*
* DATA(lo_handler) = z2ui5_cl_fw_controller=>request_begin( lv_body ).
*
* cl_abap_unit_assert=>assert_bound( lo_handler->ms_db-app ).
*
* DATA(lo_app_fw) = CAST z2ui5_cl_app_hello_world( lo_handler->ms_db-app ) ##NEEDED.
*
* ENDMETHOD.
*
*
* METHOD test_req_end.
*
* DATA(lv_body) = `{"OLOCATION":{"ORIGIN":"https://url.abap-web.us10.hana.ondemand.com","PATHNAME":"/sap/bc/http/sap/z_http_service_for_ui","SEARCH":"?sap-client=100&app_start=z2ui5_cl_app_hello_world","VERSION":"c` &&
* `om.sap.ui5.dist:sapui5-sdk-dist:1.115.0:war"}}`.
*
* DATA(lo_handler) = z2ui5_cl_fw_controller=>request_begin( lv_body ).
*
* CAST z2ui5_if_app( lo_handler->ms_db-app )->main( NEW z2ui5_cl_fw_client( lo_handler ) ).
*
* DATA(lv_resp) = lo_handler->request_end( ).
*
* IF lv_resp NS `NAME`.
* cl_abap_unit_assert=>fail( ).
* ENDIF.
*
* IF lv_resp NS `EDIT`.
* cl_abap_unit_assert=>fail( ).
* ENDIF.
*
* IF lv_resp NS `ID`.
* cl_abap_unit_assert=>fail( ).
* ENDIF.
*
* IF lv_resp NS `mvc:View`.
* cl_abap_unit_assert=>fail( ).
* ENDIF.
*
* ENDMETHOD.
*
*ENDCLASS.

View File

@ -3,9 +3,9 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_FW_CONTROLLER</CLSNAME>
<CLSNAME>Z2UI5_CL_FW_APP</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 - handler</DESCRIPT>
<DESCRIPT>abap2UI5 - controller</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>

View File

@ -63,6 +63,24 @@ CLASS z2ui5_cl_fw_binding DEFINITION
DATA mo_custom_mapper TYPE REF TO z2ui5_if_ajson_mapping.
DATA mo_custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping.
class-METHODS bind_tab_cell
IMPORTING
iv_name TYPE string
i_tab_index TYPE i
i_tab TYPE STANDARD TABLE
i_val TYPE data
RETURNING
VALUE(r_result) TYPE string.
class-METHODS bind_struc_comp
IMPORTING
iv_name TYPE string
i_struc TYPE data
i_val TYPE data
RETURNING
VALUE(r_result) TYPE string.
CLASS-METHODS update_attri
IMPORTING
t_attri TYPE ty_t_attri
@ -134,6 +152,63 @@ ENDCLASS.
CLASS Z2UI5_CL_FW_BINDING IMPLEMENTATION.
METHOD bind_struc_comp.
FIELD-SYMBOLS <ele> TYPE any.
FIELD-SYMBOLS <row> TYPE any.
DATA lr_ref_in TYPE REF TO data.
DATA lr_ref TYPE REF TO data.
ASSIGN i_struc TO <row>.
DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( i_struc ).
LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(<comp>).
ASSIGN COMPONENT <comp>-name OF STRUCTURE <row> TO <ele>.
lr_ref_in = REF #( <ele> ).
lr_ref = REF #( i_val ).
IF lr_ref = lr_ref_in.
r_result = `{` && iv_name && '/' && <comp>-name && `}`.
RETURN.
ENDIF.
ENDLOOP.
RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING
val = `BINDING_ERROR - No class attribute for binding found - Please check if the binded values are public attributes of your class`.
ENDMETHOD.
METHOD bind_tab_cell.
FIELD-SYMBOLS <ele> TYPE any.
FIELD-SYMBOLS <row> TYPE any.
DATA lr_ref_in TYPE REF TO data.
DATA lr_ref TYPE REF TO data.
ASSIGN i_tab[ i_tab_index ] TO <row>.
DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( <row> ).
LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(<comp>).
ASSIGN COMPONENT <comp>-name OF STRUCTURE <row> TO <ele>.
lr_ref_in = REF #( <ele> ).
lr_ref = REF #( i_val ).
IF lr_ref = lr_ref_in.
r_result = `{` && iv_name && '/' && shift_right( CONV string( i_tab_index - 1 ) ) && '/' && <comp>-name && `}`.
RETURN.
ENDIF.
ENDLOOP.
RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING
val = `BINDING_ERROR - No class attribute for binding found - Please check if the binded values are public attributes of your class`.
ENDMETHOD.
METHOD bind.

View File

@ -7,36 +7,14 @@ CLASS z2ui5_cl_fw_client DEFINITION
INTERFACES z2ui5_if_client.
DATA mo_handler TYPE REF TO z2ui5_cl_fw_controller.
DATA mo_app TYPE REF TO z2ui5_cl_fw_app.
METHODS constructor
IMPORTING
handler TYPE REF TO z2ui5_cl_fw_controller.
handler TYPE REF TO z2ui5_cl_fw_app.
PROTECTED SECTION.
METHODS set_arg_string
IMPORTING
val TYPE string_table
RETURNING
VALUE(result) TYPE string.
METHODS bind_tab_cell
IMPORTING
iv_name TYPE string
i_tab_index TYPE i
i_tab TYPE STANDARD TABLE
i_val TYPE data
RETURNING
VALUE(r_result) TYPE string.
METHODS bind_struc_comp
IMPORTING
iv_name TYPE string
i_struc TYPE data
i_val TYPE data
RETURNING
VALUE(r_result) TYPE string.
PRIVATE SECTION.
ENDCLASS.
@ -46,128 +24,50 @@ ENDCLASS.
CLASS z2ui5_cl_fw_client IMPLEMENTATION.
METHOD bind_struc_comp.
FIELD-SYMBOLS <ele> TYPE any.
FIELD-SYMBOLS <row> TYPE any.
DATA lr_ref_in TYPE REF TO data.
DATA lr_ref TYPE REF TO data.
ASSIGN i_struc TO <row>.
DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( i_struc ).
LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(<comp>).
ASSIGN COMPONENT <comp>-name OF STRUCTURE <row> TO <ele>.
lr_ref_in = REF #( <ele> ).
lr_ref = REF #( i_val ).
IF lr_ref = lr_ref_in.
r_result = `{` && iv_name && '/' && <comp>-name && `}`.
RETURN.
ENDIF.
ENDLOOP.
RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING
val = `BINDING_ERROR - No class attribute for binding found - Please check if the binded values are public attributes of your class`.
ENDMETHOD.
METHOD bind_tab_cell.
FIELD-SYMBOLS <ele> TYPE any.
FIELD-SYMBOLS <row> TYPE any.
DATA lr_ref_in TYPE REF TO data.
DATA lr_ref TYPE REF TO data.
ASSIGN i_tab[ i_tab_index ] TO <row>.
DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( <row> ).
LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(<comp>).
ASSIGN COMPONENT <comp>-name OF STRUCTURE <row> TO <ele>.
lr_ref_in = REF #( <ele> ).
lr_ref = REF #( i_val ).
IF lr_ref = lr_ref_in.
r_result = `{` && iv_name && '/' && shift_right( CONV string( i_tab_index - 1 ) ) && '/' && <comp>-name && `}`.
RETURN.
ENDIF.
ENDLOOP.
RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING
val = `BINDING_ERROR - No class attribute for binding found - Please check if the binded values are public attributes of your class`.
ENDMETHOD.
METHOD constructor.
mo_handler = handler.
mo_app = handler.
ENDMETHOD.
METHOD set_arg_string.
IF val IS NOT INITIAL.
LOOP AT val REFERENCE INTO DATA(lr_arg).
DATA(lv_new) = lr_arg->*.
IF lv_new IS INITIAL.
CONTINUE.
ENDIF.
IF lv_new(1) <> `$` AND lv_new(1) <> `{`.
lv_new = `"` && lv_new && `"`.
ENDIF.
result = result && `, ` && lv_new.
ENDLOOP.
ENDIF.
result = result && `)`.
ENDMETHOD.
METHOD z2ui5_if_client~get.
result = VALUE #(
event = mo_handler->ms_actual-event
check_launchpad_active = mo_handler->ms_actual-check_launchpad_active
t_event_arg = mo_handler->ms_actual-t_event_arg
s_draft = CORRESPONDING #( mo_handler->ms_db )
check_on_navigated = mo_handler->ms_actual-check_on_navigated
s_config = z2ui5_cl_fw_controller=>ss_config ).
event = mo_app->ms_actual-event
check_launchpad_active = mo_app->mo_http_post->ms_request-s_control-check_launchpad
t_event_arg = mo_app->ms_actual-t_event_arg
s_draft = CORRESPONDING #( mo_app->ms_db )
check_on_navigated = mo_app->ms_actual-check_on_navigated
s_config = mo_app->mo_http_post->ms_request-s_frontend-s_config
).
ENDMETHOD.
METHOD z2ui5_if_client~get_app.
result = CAST #( z2ui5_cl_fw_db=>load_app( id )-app ).
result = CAST #( z2ui5_cl_fw_draft=>load_app( id )-app ).
ENDMETHOD.
METHOD z2ui5_if_client~message_box_display.
mo_handler->ms_next-s_set-s_msg_box = VALUE #( text = text type = type ).
mo_app->ms_next-s_set-s_msg_box = VALUE #( text = text type = type ).
ENDMETHOD.
METHOD z2ui5_if_client~message_toast_display.
mo_handler->ms_next-s_set-s_msg_toast = VALUE #( text = text ).
mo_app->ms_next-s_set-s_msg_toast = VALUE #( text = text ).
ENDMETHOD.
METHOD z2ui5_if_client~nav_app_call.
mo_handler->ms_next-o_app_call = app.
mo_app->ms_next-o_app_call = app.
IF app->id_draft IS INITIAL.
app->id_app = z2ui5_cl_util_func=>uuid_get_c32( ).
ENDIF.
@ -176,7 +76,7 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
METHOD z2ui5_if_client~nav_app_leave.
mo_handler->ms_next-o_app_leave = app.
mo_app->ms_next-o_app_leave = app.
IF app->id_draft IS INITIAL.
app->id_app = z2ui5_cl_util_func=>uuid_get_c32( ).
ENDIF.
@ -186,114 +86,114 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
METHOD z2ui5_if_client~nest2_view_destroy.
mo_handler->ms_next-s_set-s_view_nest2-check_update_model = abap_true.
mo_app->ms_next-s_set-s_view_nest2-check_update_model = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~nest2_view_display.
mo_handler->ms_next-s_set-s_view_nest2-xml = val.
mo_handler->ms_next-s_set-s_view_nest2-id = id.
mo_handler->ms_next-s_set-s_view_nest2-method_destroy = method_destroy.
mo_handler->ms_next-s_set-s_view_nest2-method_insert = method_insert.
mo_app->ms_next-s_set-s_view_nest2-xml = val.
mo_app->ms_next-s_set-s_view_nest2-id = id.
mo_app->ms_next-s_set-s_view_nest2-method_destroy = method_destroy.
mo_app->ms_next-s_set-s_view_nest2-method_insert = method_insert.
ENDMETHOD.
METHOD z2ui5_if_client~nest2_view_model_update.
mo_handler->ms_next-s_set-s_view_nest2-check_update_model = abap_true.
mo_app->ms_next-s_set-s_view_nest2-check_update_model = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~nest_view_destroy.
mo_handler->ms_next-s_set-s_view_nest-check_update_model = abap_true.
mo_app->ms_next-s_set-s_view_nest-check_update_model = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~nest_view_display.
mo_handler->ms_next-s_set-s_view_nest-xml = val.
mo_handler->ms_next-s_set-s_view_nest-id = id.
mo_handler->ms_next-s_set-s_view_nest-method_destroy = method_destroy.
mo_handler->ms_next-s_set-s_view_nest-method_insert = method_insert.
mo_app->ms_next-s_set-s_view_nest-xml = val.
mo_app->ms_next-s_set-s_view_nest-id = id.
mo_app->ms_next-s_set-s_view_nest-method_destroy = method_destroy.
mo_app->ms_next-s_set-s_view_nest-method_insert = method_insert.
ENDMETHOD.
METHOD z2ui5_if_client~nest_view_model_update.
mo_handler->ms_next-s_set-s_view_nest-check_update_model = abap_true.
mo_app->ms_next-s_set-s_view_nest-check_update_model = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~popover_destroy.
mo_handler->ms_next-s_set-s_popover-check_destroy = abap_true.
mo_app->ms_next-s_set-s_popover-check_destroy = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~popover_display.
mo_handler->ms_next-s_set-s_popover-check_destroy = abap_false.
mo_handler->ms_next-s_set-s_popover-xml = xml.
mo_handler->ms_next-s_set-s_popover-open_by_id = by_id.
mo_app->ms_next-s_set-s_popover-check_destroy = abap_false.
mo_app->ms_next-s_set-s_popover-xml = xml.
mo_app->ms_next-s_set-s_popover-open_by_id = by_id.
ENDMETHOD.
METHOD z2ui5_if_client~popover_model_update.
mo_handler->ms_next-s_set-s_popover-check_update_model = abap_true.
mo_app->ms_next-s_set-s_popover-check_update_model = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~popup_destroy.
mo_handler->ms_next-s_set-s_popup = VALUE #( check_destroy = abap_true ).
mo_app->ms_next-s_set-s_popup = VALUE #( check_destroy = abap_true ).
ENDMETHOD.
METHOD z2ui5_if_client~popup_display.
mo_handler->ms_next-s_set-s_popup-check_destroy = abap_false.
mo_handler->ms_next-s_set-s_popup-xml = val.
mo_app->ms_next-s_set-s_popup-check_destroy = abap_false.
mo_app->ms_next-s_set-s_popup-xml = val.
ENDMETHOD.
METHOD z2ui5_if_client~popup_model_update.
mo_handler->ms_next-s_set-s_popup-check_update_model = abap_true.
mo_app->ms_next-s_set-s_popup-check_update_model = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~view_destroy.
mo_handler->ms_next-s_set-s_view-check_destroy = abap_true.
mo_app->ms_next-s_set-s_view-check_destroy = abap_true.
ENDMETHOD.
METHOD z2ui5_if_client~view_display.
mo_handler->ms_next-s_set-s_view-xml = val.
mo_app->ms_next-s_set-s_view-xml = val.
ENDMETHOD.
METHOD z2ui5_if_client~view_model_update.
mo_handler->ms_next-s_set-s_view-check_update_model = abap_true.
mo_app->ms_next-s_set-s_view-check_update_model = abap_true.
ENDMETHOD.
@ -304,7 +204,7 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
DATA(lv_name) = z2ui5_if_client~_bind( val = tab
path = abap_true ).
result = bind_tab_cell(
result = z2ui5_cl_fw_binding=>bind_tab_cell(
iv_name = lv_name
i_tab_index = tab_index
i_tab = tab
@ -313,23 +213,23 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
RETURN.
ENDIF.
IF struc IS NOT INITIAL.
DATA(lv_name_struc) = z2ui5_if_client~_bind_edit( val = struc
path = abap_true ).
result = bind_struc_comp(
iv_name = lv_name_struc
i_struc = struc
i_val = val ).
RETURN.
ENDIF.
* IF struc IS NOT INITIAL.
*
* DATA(lv_name_struc) = z2ui5_if_client~_bind_edit( val = struc
* path = abap_true ).
* result = z2ui5_cl_fw_binding=>bind_struc_comp(
* iv_name = lv_name_struc
* i_struc = struc
* i_val = val ).
*
* RETURN.
*
* ENDIF.
DATA(lo_binder) = z2ui5_cl_fw_binding=>factory(
app = mo_handler->ms_db-app
attri = mo_handler->ms_db-t_attri
check_attri = mo_handler->ms_db-check_attri
app = mo_app->ms_db-app
attri = mo_app->ms_db-t_attri
check_attri = mo_app->ms_db-check_attri
type = z2ui5_cl_fw_binding=>cs_bind_type-one_way
data = val
custom_mapper = custom_mapper
@ -337,8 +237,8 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
).
result = lo_binder->main( ).
mo_handler->ms_db-t_attri = lo_binder->mt_attri.
mo_handler->ms_db-check_attri = lo_binder->mv_check_attri.
mo_app->ms_db-t_attri = lo_binder->mt_attri.
mo_app->ms_db-check_attri = lo_binder->mv_check_attri.
IF path = abap_false.
result = `{` && result && `}`.
@ -349,11 +249,11 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
METHOD z2ui5_if_client~_bind_clear.
mo_handler->ms_db-t_attri[ name = val ]-check_dissolved = abap_false.
mo_app->ms_db-t_attri[ name = val ]-check_dissolved = abap_false.
LOOP AT mo_handler->ms_db-t_attri REFERENCE INTO DATA(lr_bind2).
LOOP AT mo_app->ms_db-t_attri REFERENCE INTO DATA(lr_bind2).
IF lr_bind2->name CS val && `-`.
DELETE mo_handler->ms_db-t_attri.
DELETE mo_app->ms_db-t_attri.
ENDIF.
ENDLOOP.
@ -363,7 +263,7 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
CASE val.
WHEN z2ui5_if_client~cs_clear-view.
CLEAR mo_handler->ms_next-s_set-s_view.
CLEAR mo_app->ms_next-s_set-s_view.
ENDCASE.
ENDMETHOD.
@ -372,35 +272,27 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
IF tab IS NOT INITIAL.
DATA(lv_name) = z2ui5_if_client~_bind_edit( val = tab
path = abap_true ).
result = bind_tab_cell(
DATA(lv_name) = z2ui5_if_client~_bind_edit( val = tab path = abap_true ).
result = z2ui5_cl_fw_binding=>bind_tab_cell(
iv_name = lv_name
i_tab_index = tab_index
i_tab = tab
i_val = val ).
RETURN.
* ELSEIF struc IS NOT INITIAL.
ENDIF.
* DATA(lv_name_struc) = z2ui5_if_client~_bind_edit( val = struc path = abap_true ).
* result = z2ui5_cl_fw_binding=>bind_struc_comp(
* iv_name = lv_name_struc
* i_struc = struc
* i_val = val ).
IF struc IS NOT INITIAL.
DATA(lv_name_struc) = z2ui5_if_client~_bind_edit( val = struc
path = abap_true ).
result = bind_struc_comp(
iv_name = lv_name_struc
i_struc = struc
i_val = val ).
RETURN.
ENDIF.
ELSE.
DATA(lo_binder) = z2ui5_cl_fw_binding=>factory(
app = mo_handler->ms_db-app
attri = mo_handler->ms_db-t_attri
check_attri = mo_handler->ms_db-check_attri
app = mo_app->ms_db-app
attri = mo_app->ms_db-t_attri
check_attri = mo_app->ms_db-check_attri
type = z2ui5_cl_fw_binding=>cs_bind_type-two_way
data = val
view = view
@ -410,22 +302,24 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
).
result = lo_binder->main( ).
mo_handler->ms_db-t_attri = lo_binder->mt_attri.
mo_handler->ms_db-check_attri = lo_binder->mv_check_attri.
mo_app->ms_db-t_attri = lo_binder->mt_attri.
mo_app->ms_db-check_attri = lo_binder->mv_check_attri.
IF path = abap_false.
result = `{` && result && `}`.
ENDIF.
ENDIF.
ENDMETHOD.
METHOD z2ui5_if_client~_bind_local.
DATA(lo_binder) = z2ui5_cl_fw_binding=>factory(
app = mo_handler->ms_db-app
attri = mo_handler->ms_db-t_attri
check_attri = mo_handler->ms_db-check_attri
app = mo_app->ms_db-app
attri = mo_app->ms_db-t_attri
check_attri = mo_app->ms_db-check_attri
type = z2ui5_cl_fw_binding=>cs_bind_type-one_time
data = val
custom_mapper = custom_mapper
@ -433,8 +327,8 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
).
result = lo_binder->main( ).
mo_handler->ms_db-t_attri = lo_binder->mt_attri.
mo_handler->ms_db-check_attri = lo_binder->mv_check_attri.
mo_app->ms_db-t_attri = lo_binder->mt_attri.
mo_app->ms_db-check_attri = lo_binder->mv_check_attri.
IF path = abap_false.
result = `{` && result && `}`.
@ -446,14 +340,14 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION.
METHOD z2ui5_if_client~_event.
result = `onEvent( { 'EVENT' : '` && val && `', 'METHOD' : 'UPDATE' , 'CHECK_VIEW_DESTROY' : ` && z2ui5_cl_util_func=>boolean_abap_2_json( check_view_destroy ) && ` }`.
result = result && set_arg_string( t_arg ).
result = result && z2ui5_cl_util_func=>ui5_set_arg_string( t_arg ).
ENDMETHOD.
METHOD z2ui5_if_client~_event_client.
result = `onEventFrontend( { 'EVENT' : '` && val && `' }` && set_arg_string( t_arg ).
result = `onEventFrontend( { 'EVENT' : '` && val && `' }` && z2ui5_cl_util_func=>ui5_set_arg_string( t_arg ).
ENDMETHOD.
ENDCLASS.

View File

@ -11,10 +11,10 @@ CLASS ltcl_unit_test IMPLEMENTATION.
METHOD first_test.
DATA(lo_handler) = NEW z2ui5_cl_fw_controller( ).
DATA(lo_client) = NEW z2ui5_cl_fw_client( lo_handler ).
DATA(li_client) = CAST z2ui5_if_client( lo_client ) ##NEEDED.
* DATA(lo_handler) = NEW z2ui5_cl_fw_controller( ).
* DATA(lo_client) = NEW z2ui5_cl_fw_client( lo_handler ).
*
* DATA(li_client) = CAST z2ui5_if_client( lo_client ) ##NEEDED.
ENDMETHOD.

View File

@ -1,401 +0,0 @@
CLASS z2ui5_cl_fw_controller DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_s_next2,
BEGIN OF s_view,
xml TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_view,
BEGIN OF s_view_nest,
xml TYPE string,
id TYPE string,
method_insert TYPE string,
method_destroy TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_view_nest,
BEGIN OF s_view_nest2,
xml TYPE string,
id TYPE string,
method_insert TYPE string,
method_destroy TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_view_nest2,
BEGIN OF s_popup,
xml TYPE string,
id TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_popup,
BEGIN OF s_popover,
xml TYPE string,
id TYPE string,
open_by_id TYPE string,
check_destroy TYPE abap_bool,
check_update_model TYPE abap_bool,
END OF s_popover,
BEGIN OF s_msg_box,
type TYPE string,
text TYPE string,
END OF s_msg_box,
BEGIN OF s_msg_toast,
text TYPE string,
END OF s_msg_toast,
END OF ty_s_next2.
TYPES:
BEGIN OF ty_s_next,
o_app_call TYPE REF TO z2ui5_if_app,
o_app_leave TYPE REF TO z2ui5_if_app,
s_set TYPE ty_s_next2,
END OF ty_s_next.
CLASS-DATA ss_config TYPE z2ui5_if_client=>ty_s_config.
CLASS-DATA so_body_ajson TYPE REF TO z2ui5_if_ajson.
DATA ms_db TYPE z2ui5_cl_fw_db=>ty_s_db.
DATA ms_actual TYPE z2ui5_if_client=>ty_s_get.
DATA ms_next TYPE ty_s_next.
CLASS-METHODS main
IMPORTING
body TYPE string
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
CLASS-METHODS request_begin
IMPORTING
body TYPE string
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_controller.
METHODS request_end
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS body_read_location.
CLASS-METHODS app_system_factory
IMPORTING
VALUE(ix) TYPE REF TO cx_root OPTIONAL
error_text TYPE string OPTIONAL
PREFERRED PARAMETER ix
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_controller.
METHODS app_next_factory
IMPORTING
app TYPE REF TO z2ui5_if_app
RETURNING
VALUE(r_result) TYPE REF TO z2ui5_cl_fw_controller.
METHODS app_client_begin_event.
METHODS app_client_begin_model.
CLASS-METHODS app_start_factory
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_controller.
CLASS-METHODS app_client_begin_factory
IMPORTING
id_prev TYPE clike
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_controller.
METHODS app_leave_factory
IMPORTING
check_no_db_save TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_controller.
METHODS app_call_factory
IMPORTING
check_no_db_save TYPE abap_bool DEFAULT abap_false
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_controller.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_fw_controller IMPLEMENTATION.
METHOD app_call_factory.
result = app_next_factory( ms_next-o_app_call ).
result->ms_db-id_prev_app_stack = ms_db-id.
CLEAR ms_next.
IF check_no_db_save = abap_false.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDIF.
CLEAR result->ms_db-t_attri.
ENDMETHOD.
METHOD app_client_begin_event.
TRY.
DATA(ajson) = so_body_ajson->slice( `/ARGUMENTS` ).
ms_actual-event = ajson->get( `/1/EVENT` ).
ajson->delete( `/1` ).
ajson->to_abap(
IMPORTING
ev_container = ms_actual-t_event_arg
).
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD app_client_begin_factory.
TRY.
result = NEW #( ).
result->ms_db = z2ui5_cl_fw_db=>load_app( id_prev ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
result->ms_db-id_prev = id_prev.
result->ms_actual-viewname = so_body_ajson->get( iv_path = `/VIEWNAME` ).
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD app_client_begin_model.
z2ui5_cl_fw_model_ajson=>front_to_back(
viewname = ms_actual-viewname
app = ms_db-app
t_attri = ms_db-t_attri
ajson_in = so_body_ajson
).
ENDMETHOD.
METHOD app_leave_factory.
result = app_next_factory( ms_next-o_app_leave ).
TRY.
DATA(ls_draft) = z2ui5_cl_fw_db=>read( id = result->ms_db-id
check_load_app = abap_false ).
result->ms_db-id_prev_app_stack = ls_draft-id_prev_app_stack.
CATCH cx_root.
result->ms_db-id_prev_app_stack = ms_db-id_prev_app_stack.
ENDTRY.
CLEAR ms_next.
IF check_no_db_save = abap_false.
z2ui5_cl_fw_db=>create( id = ms_db-id
db = ms_db ).
ENDIF.
ENDMETHOD.
METHOD app_next_factory.
app->id_draft = COND #( WHEN app->id_draft IS INITIAL THEN z2ui5_cl_util_func=>uuid_get_c32( ) ELSE app->id_draft ).
r_result = NEW #( ).
r_result->ms_db-app = app.
r_result->ms_db-id = app->id_draft.
r_result->ms_db-id_prev = ms_db-id.
r_result->ms_db-id_prev_app = ms_db-id.
r_result->ms_actual-check_launchpad_active = ms_actual-check_launchpad_active.
r_result->ms_actual-check_on_navigated = abap_true.
r_result->ms_next-s_set = ms_next-s_set.
TRY.
DATA(ls_db_next) = z2ui5_cl_fw_db=>load_app( app->id_draft ).
r_result->ms_db-t_attri = ls_db_next-t_attri.
CATCH cx_root.
ENDTRY.
ENDMETHOD.
METHOD app_start_factory.
TRY.
DATA(lv_classname) = to_upper( so_body_ajson->get( `/APP_START` ) ).
lv_classname = z2ui5_cl_util_func=>c_trim( lv_classname ).
CATCH cx_root.
ENDTRY.
IF lv_classname IS INITIAL.
lv_classname = z2ui5_cl_util_func=>url_param_get( val = `app_start`
url = ss_config-search ).
ENDIF.
IF lv_classname IS INITIAL.
result = app_system_factory( ).
RETURN.
ENDIF.
TRY.
result = NEW #( ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
lv_classname = z2ui5_cl_util_func=>c_trim_upper( lv_classname ).
CREATE OBJECT result->ms_db-app TYPE (lv_classname).
result->ms_db-app->id_draft = result->ms_db-id.
CATCH cx_root.
result = app_system_factory( error_text = `App with name ` && lv_classname && ` not found...` ).
ENDTRY.
ENDMETHOD.
METHOD app_system_factory.
result = NEW #( ).
result->ms_db-id = z2ui5_cl_util_func=>uuid_get_c32( ).
IF ix IS NOT BOUND AND error_text IS NOT INITIAL.
ix = NEW z2ui5_cx_util_error( val = error_text ).
ENDIF.
IF ix IS BOUND.
result->ms_next-o_app_call = z2ui5_cl_fw_app_error=>factory( ix ).
result = result->app_call_factory( abap_true ).
RETURN.
ENDIF.
result->ms_db-app = z2ui5_cl_fw_app_startup=>factory( ).
result->ms_db-app->id_draft = result->ms_db-id.
ENDMETHOD.
METHOD body_read_location.
TRY.
so_body_ajson->slice( `/OLOCATION` )->to_abap(
IMPORTING
ev_container = ss_config
).
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD main.
TRY.
DATA(lo_handler) = request_begin( body ).
CATCH cx_root INTO DATA(x).
lo_handler = app_system_factory( x ).
ENDTRY.
DO.
TRY.
ROLLBACK WORK.
CAST z2ui5_if_app( lo_handler->ms_db-app )->main( NEW z2ui5_cl_fw_client( lo_handler ) ).
ROLLBACK WORK.
IF lo_handler->ms_next-o_app_leave IS NOT INITIAL.
lo_handler = lo_handler->app_leave_factory( ).
CONTINUE.
ENDIF.
IF lo_handler->ms_next-o_app_call IS NOT INITIAL.
lo_handler = lo_handler->app_call_factory( ).
CONTINUE.
ENDIF.
result = lo_handler->request_end( ).
CATCH cx_root INTO x.
lo_handler = app_system_factory( x ).
CONTINUE.
ENDTRY.
EXIT.
ENDDO.
ENDMETHOD.
METHOD request_begin.
TRY.
so_body_ajson = z2ui5_cl_ajson=>parse( body ).
body_read_location( ).
DATA(lv_id_prev) = so_body_ajson->get( `/ID` ).
IF lv_id_prev IS INITIAL.
result = app_start_factory( ).
result->ms_actual-check_on_navigated = abap_true.
ELSE.
result = app_client_begin_factory( lv_id_prev ).
result->app_client_begin_model( ).
result->app_client_begin_event( ).
result->ms_actual-check_on_navigated = abap_false.
ENDIF.
IF ss_config-search CS `scenario=LAUNCHPAD`.
result->ms_actual-check_launchpad_active = abap_true.
ENDIF.
result->ms_db-check_attri = abap_false.
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD request_end.
TRY.
"todo performance - write all data directly into the target ajson
DATA(ajson_result) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty(
ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ) ) ).
ajson_result->set( iv_path = `/PARAMS` iv_val = ms_next-s_set ).
ajson_result->set( iv_path = `/ID` iv_val = ms_db-id ).
ajson_result = ajson_result->filter( NEW z2ui5_cl_fw_model_ajson( ) ).
DATA(lo_ajson) = z2ui5_cl_fw_model_ajson=>back_to_front(
app = ms_db-app
t_attri = ms_db-t_attri ).
ajson_result->set( iv_path = `/OVIEWMODEL` iv_val = lo_ajson ).
result = ajson_result->stringify( ).
z2ui5_cl_fw_db=>create( id = ms_db-id db = ms_db ).
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
ENDCLASS.

View File

@ -1,71 +0,0 @@
CLASS ltcl_unit_test DEFINITION FINAL FOR TESTING
DURATION LONG
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS test_req_begin_fw_start FOR TESTING RAISING cx_static_check.
METHODS test_req_begin_app_start FOR TESTING RAISING cx_static_check.
METHODS test_req_end FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS z2ui5_cl_fw_controller DEFINITION LOCAL FRIENDS ltcl_unit_test.
CLASS ltcl_unit_test IMPLEMENTATION.
METHOD test_req_begin_fw_start.
DATA(lv_body) = `{"OLOCATION":{"ORIGIN":"https:/url.abap-web.us10.hana.ondemand.com","PATHNAME":"/sap/bc/http/sap/z_http_service_for_ui","SEARCH":"?sap-client=100","VERSION":"com.sap.ui5.dist:sapui5-sdk-dist:1.115.0:war"}}`.
DATA(lo_handler) = z2ui5_cl_fw_controller=>request_begin( lv_body ).
cl_abap_unit_assert=>assert_bound( lo_handler->ms_db-app ).
DATA(lo_app_fw) = CAST z2ui5_cl_fw_app_startup( lo_handler->ms_db-app ) ##NEEDED.
ENDMETHOD.
METHOD test_req_begin_app_start.
DATA(lv_body) = `{"OLOCATION":{"ORIGIN":"https://url.abap-web.us10.hana.ondemand.com","PATHNAME":"/sap/bc/http/sap/z_http_service_for_ui","SEARCH":"?sap-client=100&app_start=z2ui5_cl_app_hello_world","VERSION":"c` &&
`om.sap.ui5.dist:sapui5-sdk-dist:1.115.0:war"}}`.
DATA(lo_handler) = z2ui5_cl_fw_controller=>request_begin( lv_body ).
cl_abap_unit_assert=>assert_bound( lo_handler->ms_db-app ).
DATA(lo_app_fw) = CAST z2ui5_cl_app_hello_world( lo_handler->ms_db-app ) ##NEEDED.
ENDMETHOD.
METHOD test_req_end.
DATA(lv_body) = `{"OLOCATION":{"ORIGIN":"https://url.abap-web.us10.hana.ondemand.com","PATHNAME":"/sap/bc/http/sap/z_http_service_for_ui","SEARCH":"?sap-client=100&app_start=z2ui5_cl_app_hello_world","VERSION":"c` &&
`om.sap.ui5.dist:sapui5-sdk-dist:1.115.0:war"}}`.
DATA(lo_handler) = z2ui5_cl_fw_controller=>request_begin( lv_body ).
CAST z2ui5_if_app( lo_handler->ms_db-app )->main( NEW z2ui5_cl_fw_client( lo_handler ) ).
DATA(lv_resp) = lo_handler->request_end( ).
IF lv_resp NS `NAME`.
cl_abap_unit_assert=>fail( ).
ENDIF.
IF lv_resp NS `EDIT`.
cl_abap_unit_assert=>fail( ).
ENDIF.
IF lv_resp NS `ID`.
cl_abap_unit_assert=>fail( ).
ENDIF.
IF lv_resp NS `mvc:View`.
cl_abap_unit_assert=>fail( ).
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -1,4 +1,4 @@
CLASS z2ui5_cl_fw_db DEFINITION
CLASS z2ui5_cl_fw_draft DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
@ -51,7 +51,7 @@ ENDCLASS.
CLASS z2ui5_cl_fw_db IMPLEMENTATION.
CLASS Z2UI5_CL_FW_DRAFT IMPLEMENTATION.
METHOD cleanup.

View File

@ -3,9 +3,9 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_FW_DB</CLSNAME>
<CLSNAME>Z2UI5_CL_FW_DRAFT</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 - database</DESCRIPT>
<DESCRIPT>abap2UI5 - draft</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>

View File

@ -1,26 +1,20 @@
CLASS z2ui5_cl_fw_index_html DEFINITION
CLASS z2ui5_cl_fw_http_get DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
TYPES:
BEGIN OF ty_s_config,
t_config TYPE z2ui5_if_client=>ty_t_name_value,
content_security_policy TYPE string,
custom_js TYPE string,
json_model_limit TYPE string,
END OF ty_s_config.
DATA ms_config TYPE ty_s_config.
DATA ms_request TYPE z2ui5_if_client=>ty_s_http_request_get.
DATA mv_response TYPE string.
CLASS-METHODS factory
IMPORTING
i_config TYPE ty_s_config
val TYPE z2ui5_if_client=>ty_s_http_request_get
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_index_html.
VALUE(result) TYPE REF TO z2ui5_cl_fw_http_get.
METHODS get
METHODS main
RETURNING
VALUE(result) TYPE string.
@ -34,85 +28,13 @@ ENDCLASS.
CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
CLASS Z2UI5_CL_FW_HTTP_GET IMPLEMENTATION.
METHOD factory.
result = NEW #( ).
result->ms_config = i_config.
ENDMETHOD.
METHOD get.
DATA(lt_config) = ms_config-t_config.
IF lt_config IS INITIAL.
lt_config = VALUE #(
* ( n = `src` v = `https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js` )
* ( n = `src` v = `https://sdk.openui5.org/resources/sap-ui-cachebuster/sap-ui-core.js` )
( n = `src` v = `https://ui5.sap.com/1.120.0/resources/sap-ui-core.js` )
( n = `data-sap-ui-theme` v = `sap_horizon` )
( n = `data-sap-ui-async` v = `true` )
( n = `data-sap-ui-bindingSyntax` v = `complex` )
( n = `data-sap-ui-frameOptions` v = `trusted` )
( n = `data-sap-ui-compatVersion` v = `edge` ) ).
ENDIF.
IF ms_config-content_security_policy IS INITIAL.
DATA(lv_sec_policy) = `<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' data: ` &&
`ui5.sap.com *.ui5.sap.com sapui5.hana.ondemand.com *.sapui5.hana.ondemand.com sdk.openui5.org *.sdk.openui5.org cdn.jsdelivr.net *.cdn.jsdelivr.net cdnjs.cloudflare.com *.cdnjs.cloudflare.com"/>`.
ELSE.
lv_sec_policy = ms_config-content_security_policy.
ENDIF.
result = `<!DOCTYPE html>` && |\n| &&
`<html lang="en">` && |\n| &&
`<head>` && |\n| &&
lv_sec_policy && |\n| &&
` <meta charset="UTF-8">` && |\n| &&
` <meta name="viewport" content="width=device-width, initial-scale=1.0">` && |\n| &&
` <meta http-equiv="X-UA-Compatible" content="IE=edge">` && |\n| &&
` <title>abap2UI5</title>` && |\n| &&
` <style>` && |\n| &&
` html, body, body > div, #container, #container-uiarea {` && |\n| &&
` height: 100%;` && |\n| &&
` }` && |\n| &&
` .dbg-ltr {` && |\n| &&
` direction: ltr !important;` && |\n| &&
` }` && |\n| &&
` </style> ` &&
` <script id="sap-ui-bootstrap"`.
LOOP AT lt_config REFERENCE INTO DATA(lr_config).
result = result && | { lr_config->n }="{ lr_config->v }"|.
ENDLOOP.
result = result &&
` ></script></head>` && |\n| &&
`<body class="sapUiBody sapUiSizeCompact" >` && |\n| &&
` <div id="content" data-handle-validation="true" ></div>` && |\n| &&
`<abc/>` && |\n|.
DATA(lv_add_js) = z2ui5_cl_fw_cc_factory=>get_js_startup( ) && ms_config-custom_js.
result = result &&
`<script> sap.z2ui5 = sap.z2ui5 || {};` && |\n| &&
get_js( ) && |\n| &&
lv_add_js && |\n| &&
` sap.z2ui5.JSON_MODEL_LIMIT = ` && ms_config-json_model_limit && `;`.
result = result &&
z2ui5_cl_fw_cc_debugging_tools=>get_js( ) &&
` sap.ui.require(["z2ui5/DebuggingTools","z2ui5/Controller"], (DebuggingTools) => { sap.z2ui5.DebuggingTools = new DebuggingTools(); ` && |\n| &&
` });`.
result = result && |\n| &&
`</script>` && |\n| &&
`<abc/></body></html>`.
z2ui5_cl_fw_db=>cleanup( ).
result->ms_request = val.
ENDMETHOD.
@ -510,8 +432,8 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
` PATHNAME: sap.z2ui5.pathname,` && |\n| &&
` SEARCH: window.location.search,` && |\n| &&
` // VERSION: sap.ui.getVersionInfo().gav,` && |\n| &&
` CHECK_LAUNCHPAD_ACTIVE: sap.ushell !== undefined,` && |\n| &&
` STARTUP_PARAMETERS: sap.z2ui5.startupParameters,` && |\n| &&
* ` CHECK_LAUNCHPAD_ACTIVE: sap.ushell !== undefined,` && |\n| &&
* ` STARTUP_PARAMETERS: sap.z2ui5.startupParameters,` && |\n| &&
` T_STARTUP_PARAMETERS: sap.z2ui5.startupParameters,` && |\n| &&
` };` && |\n| &&
` if (sap.z2ui5.search) {` && |\n| &&
@ -546,4 +468,77 @@ CLASS Z2UI5_CL_FW_INDEX_HTML IMPLEMENTATION.
`);`.
ENDMETHOD.
METHOD main.
DATA(lt_config) = ms_request-t_config.
IF lt_config IS INITIAL.
lt_config = VALUE #(
* ( n = `src` v = `https://sdk.openui5.org/nightly/2/resources/sap-ui-core.js` )
* ( n = `src` v = `https://sdk.openui5.org/resources/sap-ui-cachebuster/sap-ui-core.js` )
( n = `src` v = `https://ui5.sap.com/1.120.0/resources/sap-ui-core.js` )
( n = `data-sap-ui-theme` v = `sap_horizon` )
( n = `data-sap-ui-async` v = `true` )
( n = `data-sap-ui-bindingSyntax` v = `complex` )
( n = `data-sap-ui-frameOptions` v = `trusted` )
( n = `data-sap-ui-compatVersion` v = `edge` ) ).
ENDIF.
IF ms_request-content_security_policy IS INITIAL.
DATA(lv_sec_policy) = `<meta http-equiv="Content-Security-Policy" content="default-src 'self' 'unsafe-inline' 'unsafe-eval' data: ` &&
`ui5.sap.com *.ui5.sap.com sapui5.hana.ondemand.com *.sapui5.hana.ondemand.com sdk.openui5.org *.sdk.openui5.org cdn.jsdelivr.net *.cdn.jsdelivr.net cdnjs.cloudflare.com *.cdnjs.cloudflare.com"/>`.
ELSE.
lv_sec_policy = ms_request-content_security_policy.
ENDIF.
mv_response = `<!DOCTYPE html>` && |\n| &&
`<html lang="en">` && |\n| &&
`<head>` && |\n| &&
lv_sec_policy && |\n| &&
` <meta charset="UTF-8">` && |\n| &&
` <meta name="viewport" content="width=device-width, initial-scale=1.0">` && |\n| &&
` <meta http-equiv="X-UA-Compatible" content="IE=edge">` && |\n| &&
` <title>abap2UI5</title>` && |\n| &&
` <style>` && |\n| &&
` html, body, body > div, #container, #container-uiarea {` && |\n| &&
` height: 100%;` && |\n| &&
` }` && |\n| &&
` .dbg-ltr {` && |\n| &&
` direction: ltr !important;` && |\n| &&
` }` && |\n| &&
` </style> ` &&
` <script id="sap-ui-bootstrap"`.
LOOP AT lt_config REFERENCE INTO DATA(lr_config).
mv_response = mv_response && | { lr_config->n }="{ lr_config->v }"|.
ENDLOOP.
mv_response = mv_response &&
` ></script></head>` && |\n| &&
`<body class="sapUiBody sapUiSizeCompact" >` && |\n| &&
` <div id="content" data-handle-validation="true" ></div>` && |\n| &&
`<abc/>` && |\n|.
DATA(lv_add_js) = z2ui5_cl_fw_cc_factory=>get_js_startup( ) && ms_request-custom_js.
mv_response = mv_response &&
`<script> sap.z2ui5 = sap.z2ui5 || {};` && |\n| &&
get_js( ) && |\n| &&
lv_add_js && |\n| &&
` sap.z2ui5.JSON_MODEL_LIMIT = ` && COND #( WHEN ms_request-json_model_limit IS NOT INITIAL THEN ms_request-json_model_limit ELSE 100 ) && `;`.
mv_response = mv_response &&
z2ui5_cl_fw_cc_debugging_tools=>get_js( ) &&
` sap.ui.require(["z2ui5/DebuggingTools","z2ui5/Controller"], (DebuggingTools) => { sap.z2ui5.DebuggingTools = new DebuggingTools(); ` && |\n| &&
` });`.
mv_response = mv_response && |\n| &&
`</script>` && |\n| &&
`<abc/></body></html>`.
z2ui5_cl_fw_draft=>cleanup( ).
result = mv_response.
ENDMETHOD.
ENDCLASS.

View File

@ -3,9 +3,9 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_FW_INDEX_HTML</CLSNAME>
<CLSNAME>Z2UI5_CL_FW_HTTP_GET</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 - index.html</DESCRIPT>
<DESCRIPT>abap2UI5 - http get handler</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>

View File

@ -1,4 +1,4 @@
CLASS z2ui5_cl_fw_model_ajson DEFINITION
CLASS z2ui5_cl_fw_http_mapper DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
@ -6,14 +6,26 @@ CLASS z2ui5_cl_fw_model_ajson DEFINITION
PUBLIC SECTION.
INTERFACES z2ui5_if_ajson_filter.
CLASS-METHODS front_to_back
METHODS request_json_to_abap
IMPORTING
val TYPE string
RETURNING
VALUE(result) TYPE z2ui5_if_client=>ty_s_http_request_post.
METHODS response_abap_to_json
IMPORTING
val TYPE z2ui5_if_client=>ty_s_http_response_post
RETURNING
VALUE(result) TYPE string.
METHODS model_front_to_back
IMPORTING
app TYPE REF TO object
viewname TYPE string
t_attri TYPE z2ui5_cl_fw_binding=>ty_t_attri
ajson_in TYPE REF TO z2ui5_if_ajson ##NEEDED.
CLASS-METHODS back_to_front
METHODS model_back_to_front
IMPORTING
app TYPE REF TO object
t_attri TYPE z2ui5_cl_fw_binding=>ty_t_attri
@ -26,44 +38,10 @@ ENDCLASS.
CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
CLASS Z2UI5_CL_FW_HTTP_MAPPER IMPLEMENTATION.
METHOD z2ui5_if_ajson_filter~keep_node.
rv_keep = abap_true.
CASE iv_visit.
WHEN z2ui5_if_ajson_filter=>visit_type-value.
CASE is_node-type.
WHEN z2ui5_if_ajson_types=>node_type-boolean.
IF is_node-value = `false`.
rv_keep = abap_false.
ENDIF.
WHEN z2ui5_if_ajson_types=>node_type-number.
IF is_node-value = `0`.
rv_keep = abap_false.
ENDIF.
WHEN z2ui5_if_ajson_types=>node_type-string.
IF is_node-value = ``.
rv_keep = abap_false.
ENDIF.
ENDCASE.
WHEN z2ui5_if_ajson_filter=>visit_type-close.
IF is_node-children = 0.
rv_keep = abap_false.
ENDIF.
ENDCASE.
ENDMETHOD.
METHOD back_to_front.
METHOD model_back_to_front.
TRY.
DATA(ajson_result) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty( ) ).
@ -127,12 +105,11 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD front_to_back.
DATA(ajson) = ajson_in->slice( `/EDIT` ).
METHOD model_front_to_back.
LOOP AT t_attri REFERENCE INTO DATA(lr_attri)
WHERE bind_type = z2ui5_cl_fw_binding=>cs_bind_type-two_way
@ -144,7 +121,7 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
ASSIGN (lv_name_back) TO <backend>.
ASSERT sy-subrc = 0.
DATA(ajson_val) = ajson->slice( `/` && lr_attri->name_front ).
DATA(ajson_val) = ajson_in->slice( `/` && lr_attri->name_front ).
IF lr_attri->custom_mapper_back IS BOUND.
ajson_val = ajson_val->map( lr_attri->custom_mapper_back ).
@ -161,4 +138,122 @@ CLASS z2ui5_cl_fw_model_ajson IMPLEMENTATION.
ENDMETHOD.
METHOD request_json_to_abap.
TRY.
DATA(lo_ajson) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>parse( val ) ).
result-model = lo_ajson->slice( `/EDIT` ).
result-s_frontend-id = lo_ajson->get( `/ID` ).
result-s_frontend-viewname = lo_ajson->get( `/VIEWNAME` ).
result-s_frontend-app_start = to_upper( lo_ajson->get( `/APP_START` ) ).
result-s_frontend-arguments = lo_ajson->slice( `/ARGUMENTS` ).
lo_ajson = lo_ajson->slice( `/OLOCATION` ).
lo_ajson->to_abap(
EXPORTING
iv_corresponding = abap_true
IMPORTING
ev_container = result-s_frontend-s_config ).
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
result-s_control-check_launchpad = xsdbool(
result-s_frontend-s_config-search CS `scenario=LAUNCHPAD` ).
IF result-s_frontend-arguments IS BOUND.
DATA(lo_event) = result-s_frontend-arguments->clone( ).
result-s_control-event = lo_event->get( `/1/EVENT` ).
lo_event->delete( `/1` ).
lo_event->to_abap(
IMPORTING
ev_container = result-s_control-t_event_arg
).
ENDIF.
IF result-s_frontend-id IS INITIAL.
TRY.
result-s_control-app_start = to_upper( z2ui5_cl_util_func=>c_trim( result-s_frontend-app_start ) ).
CATCH cx_root.
ENDTRY.
IF result-s_control-app_start IS INITIAL.
result-s_control-app_start = to_upper( z2ui5_cl_util_func=>url_param_get( val = `app_start`
url = result-s_frontend-s_config-search ) ).
ENDIF.
ENDIF.
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD response_abap_to_json.
TRY.
"todo performance - write all data directly into the target ajson
DATA(ajson_result) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty(
ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ) ) ).
* ajson_result->set( iv_path = `/PARAMS` iv_val = ms_next-s_set ).
* ajson_result->set( iv_path = `/ID` iv_val = ms_db-id ).
ajson_result->set( iv_path = `/` iv_val = val-s_frontend ).
ajson_result = ajson_result->filter( NEW z2ui5_cl_fw_http_mapper( ) ).
* DATA(lo_ajson) = NEW z2ui5_cl_fw_http_mapper( )->model_back_to_front(
* app = ms_db-app
* t_attri = ms_db-t_attri ).
ajson_result->set( iv_path = `/OVIEWMODEL` iv_val = val-oviewmodel ).
result = ajson_result->stringify( ).
* z2ui5_cl_fw_db=>create( id = ms_db-id db = ms_db ).
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
ENDMETHOD.
METHOD z2ui5_if_ajson_filter~keep_node.
rv_keep = abap_true.
CASE iv_visit.
WHEN z2ui5_if_ajson_filter=>visit_type-value.
CASE is_node-type.
WHEN z2ui5_if_ajson_types=>node_type-boolean.
IF is_node-value = `false`.
rv_keep = abap_false.
ENDIF.
WHEN z2ui5_if_ajson_types=>node_type-number.
IF is_node-value = `0`.
rv_keep = abap_false.
ENDIF.
WHEN z2ui5_if_ajson_types=>node_type-string.
IF is_node-value = ``.
rv_keep = abap_false.
ENDIF.
ENDCASE.
WHEN z2ui5_if_ajson_filter=>visit_type-close.
IF is_node-children = 0.
rv_keep = abap_false.
ENDIF.
ENDCASE.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_FW_HTTP_MAPPER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 - http json mapper</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,122 @@
CLASS z2ui5_cl_fw_http_post DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
DATA mv_request_plain TYPE string.
DATA ms_request TYPE z2ui5_if_client=>ty_s_http_request_post.
DATA ms_response TYPE z2ui5_if_client=>ty_s_http_response_post.
CLASS-METHODS factory
IMPORTING
val TYPE string
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_fw_http_post.
METHODS main
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
CLASS-DATA mo_http_mapper TYPE REF TO z2ui5_cl_fw_http_mapper.
DATA mo_app TYPE REF TO z2ui5_cl_fw_app.
METHODS main_begin.
METHODS main_process
RETURNING
VALUE(check_go_frontend) TYPE abap_bool.
METHODS main_end
RETURNING
VALUE(result) TYPE string.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_fw_http_post IMPLEMENTATION.
METHOD factory.
result = NEW #( ).
result->mv_request_plain = val.
mo_http_mapper = NEW z2ui5_cl_fw_http_mapper( ).
result->mo_app = NEW z2ui5_cl_fw_app( result ).
ENDMETHOD.
METHOD main_begin.
ms_request = mo_http_mapper->request_json_to_abap( mv_request_plain ).
TRY.
IF ms_request-s_frontend-id IS NOT INITIAL.
mo_app = mo_app->factory_by_frontend( ).
ELSEIF ms_request-s_control-app_start IS NOT INITIAL.
mo_app = mo_app->factory_first_start( ).
ELSE.
mo_app = mo_app->factory_system_startup( ).
ENDIF.
CATCH cx_root INTO DATA(x).
mo_app = mo_app->factory_system_error( x ).
ENDTRY.
ENDMETHOD.
METHOD main_end.
TRY.
DATA(lo_ajson) = NEW z2ui5_cl_fw_http_mapper( )->model_back_to_front(
app = mo_app->ms_db-app
t_attri = mo_app->ms_db-t_attri ).
z2ui5_cl_fw_draft=>create( id = mo_app->ms_db-id db = mo_app->ms_db ).
ms_response-s_frontend-params = mo_app->ms_next-s_set.
ms_response-s_frontend-id = mo_app->ms_db-id.
ms_response-oviewmodel = lo_ajson.
CATCH cx_root INTO DATA(x).
ASSERT x IS NOT BOUND.
ENDTRY.
result = mo_http_mapper->response_abap_to_json( ms_response ).
ENDMETHOD.
METHOD main_process.
TRY.
DATA(li_client) = NEW z2ui5_cl_fw_client( mo_app ).
DATA(li_app) = CAST z2ui5_if_app( mo_app->ms_db-app ).
ROLLBACK WORK.
li_app->main( li_client ).
ROLLBACK WORK.
IF mo_app->ms_next-o_app_leave IS NOT INITIAL.
mo_app = mo_app->factory_app_leave( ).
ELSEIF mo_app->ms_next-o_app_call IS NOT INITIAL.
mo_app = mo_app->factory_app_call( ).
ELSE.
check_go_frontend = abap_true.
ENDIF.
CATCH cx_root INTO DATA(x).
mo_app = mo_app->factory_system_error( x ).
ENDTRY.
ENDMETHOD.
METHOD main.
main_begin( ).
DO.
IF main_process( ).
EXIT.
ENDIF.
ENDDO.
result = main_end( ).
ENDMETHOD.
ENDCLASS.

View File

@ -3,9 +3,9 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_FW_MODEL_AJSON</CLSNAME>
<CLSNAME>Z2UI5_CL_FW_HTTP_POST</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>test</DESCRIPT>
<DESCRIPT>abap2UI5 - http post handler</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>

View File

@ -1,51 +0,0 @@
CLASS z2ui5_cl_fw_http_handler DEFINITION
PUBLIC
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS http_post
IMPORTING
body TYPE string
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS http_get
IMPORTING
t_config TYPE z2ui5_if_client=>ty_t_name_value OPTIONAL
content_security_policy TYPE clike OPTIONAL
custom_js TYPE clike OPTIONAL
json_model_limit TYPE clike DEFAULT '100'
PREFERRED PARAMETER t_config
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_fw_http_handler IMPLEMENTATION.
METHOD http_get.
DATA(lo_index) = z2ui5_cl_fw_index_html=>factory( VALUE #(
t_config = t_config
content_security_policy = content_security_policy
custom_js = custom_js
json_model_limit = json_model_limit
) ).
result = lo_index->get( ).
ENDMETHOD.
METHOD http_post.
result = z2ui5_cl_fw_controller=>main( body ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,42 @@
CLASS z2ui5_cl_http_handler DEFINITION
PUBLIC
CREATE PUBLIC.
PUBLIC SECTION.
CLASS-METHODS http_post
IMPORTING
val TYPE string
RETURNING
VALUE(result) TYPE string.
CLASS-METHODS http_get
IMPORTING
val TYPE z2ui5_if_client=>ty_s_http_request_get OPTIONAL
RETURNING
VALUE(result) TYPE string.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS z2ui5_cl_http_handler IMPLEMENTATION.
METHOD http_get.
DATA(lo_get) = z2ui5_cl_fw_http_get=>factory( val ).
result = lo_get->main( ).
ENDMETHOD.
METHOD http_post.
DATA(lo_post) = z2ui5_cl_fw_http_post=>factory( val ).
result = lo_post->main( ).
ENDMETHOD.
ENDCLASS.

View File

@ -16,7 +16,7 @@ CLASS ltcl_unit_02_app_start IMPLEMENTATION.
METHOD test_index_html.
DATA(lv_index_html) = z2ui5_cl_fw_http_handler=>http_get( ).
DATA(lv_index_html) = z2ui5_cl_http_handler=>http_get( ).
IF lv_index_html IS INITIAL.
cl_abap_unit_assert=>fail( 'HTTP GET - index html initial' ).
ENDIF.
@ -26,7 +26,7 @@ CLASS ltcl_unit_02_app_start IMPLEMENTATION.
METHOD test_launchpad_compatibility.
DATA(lv_index_html) = z2ui5_cl_fw_http_handler=>http_get( ).
DATA(lv_index_html) = z2ui5_cl_http_handler=>http_get( ).
IF lv_index_html CS `&`.
cl_abap_unit_assert=>fail( 'HTTP GET - index html contains the character & -> no launchpad compatibility' ).
ENDIF.
@ -36,7 +36,7 @@ CLASS ltcl_unit_02_app_start IMPLEMENTATION.
METHOD test_path.
DATA(lv_index_html) = z2ui5_cl_fw_http_handler=>http_get( ).
DATA(lv_index_html) = z2ui5_cl_http_handler=>http_get( ).
IF lv_index_html CS `sap.z2ui5.pathname || '/sap/test';`.
cl_abap_unit_assert=>fail( 'path static' ).
ENDIF.

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>Z2UI5_CL_FW_HTTP_HANDLER</CLSNAME>
<CLSNAME>Z2UI5_CL_HTTP_HANDLER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abap2UI5 - http handler</DESCRIPT>
<STATE>1</STATE>

View File

@ -32,26 +32,52 @@ INTERFACE z2ui5_if_client
n TYPE string,
v TYPE string,
END OF ty_s_name_value.
TYPES:
BEGIN OF ty_s_name_value_int,
n TYPE string,
v TYPE i,
END OF ty_s_name_value_int.
TYPES ty_t_name_value TYPE TABLE OF ty_s_name_value WITH EMPTY KEY.
TYPES ty_t_name_value_int TYPE TABLE OF ty_s_name_value_int WITH EMPTY KEY.
TYPES:
BEGIN OF ty_s_config,
* view_model_edit_name TYPE string,
version TYPE string,
origin TYPE string,
pathname TYPE string,
search TYPE string,
* body TYPE string,
check_launchpad_active TYPE abap_bool,
t_startup_params TYPE ty_t_name_value,
END OF ty_s_config.
TYPES:
BEGIN OF ty_s_http_request_post,
model TYPE REF TO z2ui5_if_ajson,
BEGIN OF s_frontend,
id TYPE string,
viewname type string,
arguments TYPE REF TO z2ui5_if_ajson,
app_start type string,
s_config TYPE ty_s_config,
END OF s_frontend,
BEGIN OF s_control,
check_launchpad TYPE abap_bool,
event type string,
app_start type string,
t_event_arg type string_table,
END OF s_control,
END OF ty_s_http_request_post.
TYPES:
BEGIN OF ty_s_http_response_post,
BEGIN OF s_frontend,
params TYPE z2ui5_cl_fw_app=>ty_s_next2,
id TYPE string,
END OF s_frontend,
oviewmodel TYPE REF TO z2ui5_if_ajson,
END OF ty_s_http_response_post.
TYPES:
BEGIN OF ty_s_http_request_get,
t_config TYPE ty_t_name_value,
content_security_policy TYPE string,
custom_js TYPE string,
json_model_limit TYPE string,
END OF ty_s_http_request_get.
TYPES:
BEGIN OF ty_s_draft,
id TYPE string,
@ -65,7 +91,6 @@ INTERFACE z2ui5_if_client
BEGIN OF ty_s_get,
event TYPE string,
t_event_arg TYPE string_table,
t_scroll_pos TYPE ty_t_name_value_int,
check_launchpad_active TYPE abap_bool,
check_on_navigated TYPE abap_bool,
viewname TYPE string,
@ -73,6 +98,17 @@ INTERFACE z2ui5_if_client
s_config TYPE ty_s_config,
END OF ty_s_get.
TYPES:
BEGIN OF ty_s_actual,
event TYPE string,
t_event_arg TYPE string_table,
* check_launchpad_active TYPE abap_bool,
check_on_navigated TYPE abap_bool,
viewname TYPE string,
s_draft TYPE ty_s_draft,
s_config TYPE ty_s_config,
END OF ty_s_actual.
METHODS view_destroy.
METHODS view_display
@ -166,7 +202,6 @@ INTERFACE z2ui5_if_client
custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL
tab TYPE STANDARD TABLE OPTIONAL
tab_index TYPE i OPTIONAL
struc TYPE data OPTIONAL
RETURNING
VALUE(result) TYPE string.
@ -180,7 +215,6 @@ INTERFACE z2ui5_if_client
custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL
tab TYPE STANDARD TABLE OPTIONAL
tab_index TYPE i OPTIONAL
struc TYPE data OPTIONAL
RETURNING
VALUE(result) TYPE string.