diff --git a/README.md b/README.md index b85914ff..88fee5dd 100644 --- a/README.md +++ b/README.md @@ -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 ). diff --git a/abaplint-app.json b/abaplint-app.json index 098c46be..7831f921 100644 --- a/abaplint-app.json +++ b/abaplint-app.json @@ -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" diff --git a/abaplint-basic.jsonc b/abaplint-basic.jsonc deleted file mode 100644 index 34ba77f9..00000000 --- a/abaplint-basic.jsonc +++ /dev/null @@ -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$", - ] - }, - } -} diff --git a/abaplint-standard_abap_readiness.jsonc b/abaplint-standard_abap_readiness.jsonc new file mode 100644 index 00000000..2e71e5c7 --- /dev/null +++ b/abaplint-standard_abap_readiness.jsonc @@ -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 + } +} diff --git a/src/01/00/01/z2ui5_cl_ajson.clas.testclasses.abap b/src/01/00/01/z2ui5_cl_ajson.clas.testclasses.abap index 0492c13e..c5e13762 100644 --- a/src/01/00/01/z2ui5_cl_ajson.clas.testclasses.abap +++ b/src/01/00/01/z2ui5_cl_ajson.clas.testclasses.abap @@ -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. diff --git a/src/01/01/z2ui5_cl_util_func.clas.abap b/src/01/01/z2ui5_cl_util_func.clas.abap index 20bbe2a7..4f720d1c 100644 --- a/src/01/01/z2ui5_cl_util_func.clas.abap +++ b/src/01/01/z2ui5_cl_util_func.clas.abap @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_app.clas.abap b/src/01/02/z2ui5_cl_fw_app.clas.abap new file mode 100644 index 00000000..d368d57f --- /dev/null +++ b/src/01/02/z2ui5_cl_fw_app.clas.abap @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_app.clas.testclasses.abap b/src/01/02/z2ui5_cl_fw_app.clas.testclasses.abap new file mode 100644 index 00000000..28fc84f3 --- /dev/null +++ b/src/01/02/z2ui5_cl_fw_app.clas.testclasses.abap @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_controller.clas.xml b/src/01/02/z2ui5_cl_fw_app.clas.xml similarity index 82% rename from src/01/02/z2ui5_cl_fw_controller.clas.xml rename to src/01/02/z2ui5_cl_fw_app.clas.xml index f5dce8e4..720d4206 100644 --- a/src/01/02/z2ui5_cl_fw_controller.clas.xml +++ b/src/01/02/z2ui5_cl_fw_app.clas.xml @@ -3,9 +3,9 @@ - Z2UI5_CL_FW_CONTROLLER + Z2UI5_CL_FW_APP E - abap2UI5 - handler + abap2UI5 - controller 1 X X diff --git a/src/01/02/z2ui5_cl_fw_binding.clas.abap b/src/01/02/z2ui5_cl_fw_binding.clas.abap index e3167242..e663a403 100644 --- a/src/01/02/z2ui5_cl_fw_binding.clas.abap +++ b/src/01/02/z2ui5_cl_fw_binding.clas.abap @@ -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 TYPE any. + FIELD-SYMBOLS TYPE any. + DATA lr_ref_in TYPE REF TO data. + DATA lr_ref TYPE REF TO data. + + ASSIGN i_struc TO . + DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( i_struc ). + + LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(). + + ASSIGN COMPONENT -name OF STRUCTURE TO . + lr_ref_in = REF #( ). + + lr_ref = REF #( i_val ). + IF lr_ref = lr_ref_in. + r_result = `{` && iv_name && '/' && -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 TYPE any. + FIELD-SYMBOLS TYPE any. + DATA lr_ref_in TYPE REF TO data. + DATA lr_ref TYPE REF TO data. + + ASSIGN i_tab[ i_tab_index ] TO . + DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( ). + + LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(). + + ASSIGN COMPONENT -name OF STRUCTURE TO . + lr_ref_in = REF #( ). + + lr_ref = REF #( i_val ). + IF lr_ref = lr_ref_in. + r_result = `{` && iv_name && '/' && shift_right( CONV string( i_tab_index - 1 ) ) && '/' && -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. diff --git a/src/01/02/z2ui5_cl_fw_client.clas.abap b/src/01/02/z2ui5_cl_fw_client.clas.abap index a740fefa..c1125809 100644 --- a/src/01/02/z2ui5_cl_fw_client.clas.abap +++ b/src/01/02/z2ui5_cl_fw_client.clas.abap @@ -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 TYPE any. - FIELD-SYMBOLS TYPE any. - DATA lr_ref_in TYPE REF TO data. - DATA lr_ref TYPE REF TO data. - - ASSIGN i_struc TO . - DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( i_struc ). - - LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(). - - ASSIGN COMPONENT -name OF STRUCTURE TO . - lr_ref_in = REF #( ). - - lr_ref = REF #( i_val ). - IF lr_ref = lr_ref_in. - r_result = `{` && iv_name && '/' && -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 TYPE any. - FIELD-SYMBOLS TYPE any. - DATA lr_ref_in TYPE REF TO data. - DATA lr_ref TYPE REF TO data. - - ASSIGN i_tab[ i_tab_index ] TO . - DATA(lt_attri) = z2ui5_cl_util_func=>rtti_get_t_comp_by_data( ). - - LOOP AT lt_attri ASSIGNING FIELD-SYMBOL(). - - ASSIGN COMPONENT -name OF STRUCTURE TO . - lr_ref_in = REF #( ). - - lr_ref = REF #( i_val ). - IF lr_ref = lr_ref_in. - r_result = `{` && iv_name && '/' && shift_right( CONV string( i_tab_index - 1 ) ) && '/' && -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,49 +272,43 @@ 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. + ELSE. - 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 ). + DATA(lo_binder) = z2ui5_cl_fw_binding=>factory( + 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 + custom_mapper = custom_mapper + custom_mapper_back = custom_mapper_back + custom_filter = custom_filter + ). - RETURN. + result = lo_binder->main( ). + mo_app->ms_db-t_attri = lo_binder->mt_attri. + mo_app->ms_db-check_attri = lo_binder->mv_check_attri. - ENDIF. + IF path = abap_false. + result = `{` && result && `}`. + 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 - type = z2ui5_cl_fw_binding=>cs_bind_type-two_way - data = val - view = view - custom_mapper = custom_mapper - custom_mapper_back = custom_mapper_back - custom_filter = custom_filter - ). - - 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. - - IF path = abap_false. - result = `{` && result && `}`. ENDIF. ENDMETHOD. @@ -423,9 +317,9 @@ CLASS z2ui5_cl_fw_client IMPLEMENTATION. 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. diff --git a/src/01/02/z2ui5_cl_fw_client.clas.testclasses.abap b/src/01/02/z2ui5_cl_fw_client.clas.testclasses.abap index 70e24ed9..baaa78e6 100644 --- a/src/01/02/z2ui5_cl_fw_client.clas.testclasses.abap +++ b/src/01/02/z2ui5_cl_fw_client.clas.testclasses.abap @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_controller.clas.abap b/src/01/02/z2ui5_cl_fw_controller.clas.abap deleted file mode 100644 index 4d63d6c6..00000000 --- a/src/01/02/z2ui5_cl_fw_controller.clas.abap +++ /dev/null @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_controller.clas.testclasses.abap b/src/01/02/z2ui5_cl_fw_controller.clas.testclasses.abap deleted file mode 100644 index 7d4898ae..00000000 --- a/src/01/02/z2ui5_cl_fw_controller.clas.testclasses.abap +++ /dev/null @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_db.clas.abap b/src/01/02/z2ui5_cl_fw_draft.clas.abap similarity index 98% rename from src/01/02/z2ui5_cl_fw_db.clas.abap rename to src/01/02/z2ui5_cl_fw_draft.clas.abap index 744a7999..a3d91b1e 100644 --- a/src/01/02/z2ui5_cl_fw_db.clas.abap +++ b/src/01/02/z2ui5_cl_fw_draft.clas.abap @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_db.clas.testclasses.abap b/src/01/02/z2ui5_cl_fw_draft.clas.testclasses.abap similarity index 100% rename from src/01/02/z2ui5_cl_fw_db.clas.testclasses.abap rename to src/01/02/z2ui5_cl_fw_draft.clas.testclasses.abap diff --git a/src/01/02/z2ui5_cl_fw_db.clas.xml b/src/01/02/z2ui5_cl_fw_draft.clas.xml similarity index 83% rename from src/01/02/z2ui5_cl_fw_db.clas.xml rename to src/01/02/z2ui5_cl_fw_draft.clas.xml index 6f65781a..8e47685d 100644 --- a/src/01/02/z2ui5_cl_fw_db.clas.xml +++ b/src/01/02/z2ui5_cl_fw_draft.clas.xml @@ -3,9 +3,9 @@ - Z2UI5_CL_FW_DB + Z2UI5_CL_FW_DRAFT E - abap2UI5 - database + abap2UI5 - draft 1 X X diff --git a/src/01/02/z2ui5_cl_fw_index_html.clas.abap b/src/01/02/z2ui5_cl_fw_http_get.clas.abap similarity index 96% rename from src/01/02/z2ui5_cl_fw_index_html.clas.abap rename to src/01/02/z2ui5_cl_fw_http_get.clas.abap index 8bde2d16..264222ee 100644 --- a/src/01/02/z2ui5_cl_fw_index_html.clas.abap +++ b/src/01/02/z2ui5_cl_fw_http_get.clas.abap @@ -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) = ``. - ELSE. - lv_sec_policy = ms_config-content_security_policy. - ENDIF. - - result = `` && |\n| && - `` && |\n| && - `` && |\n| && - lv_sec_policy && |\n| && - ` ` && |\n| && - ` ` && |\n| && - ` ` && |\n| && - ` abap2UI5` && |\n| && - ` ` && - ` ` && |\n| && - `` && |\n| && - `
` && |\n| && - `` && |\n|. - - DATA(lv_add_js) = z2ui5_cl_fw_cc_factory=>get_js_startup( ) && ms_config-custom_js. - - result = result && - `` && |\n| && - ``. - - 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) = ``. + ELSE. + lv_sec_policy = ms_request-content_security_policy. + ENDIF. + + mv_response = `` && |\n| && + `` && |\n| && + `` && |\n| && + lv_sec_policy && |\n| && + ` ` && |\n| && + ` ` && |\n| && + ` ` && |\n| && + ` abap2UI5` && |\n| && + ` ` && + ` ` && |\n| && + `` && |\n| && + `
` && |\n| && + `` && |\n|. + + DATA(lv_add_js) = z2ui5_cl_fw_cc_factory=>get_js_startup( ) && ms_request-custom_js. + + mv_response = mv_response && + `` && |\n| && + ``. + + z2ui5_cl_fw_draft=>cleanup( ). + + result = mv_response. + ENDMETHOD. ENDCLASS. diff --git a/src/01/02/z2ui5_cl_fw_index_html.clas.xml b/src/01/02/z2ui5_cl_fw_http_get.clas.xml similarity index 80% rename from src/01/02/z2ui5_cl_fw_index_html.clas.xml rename to src/01/02/z2ui5_cl_fw_http_get.clas.xml index 1dd8c8cc..30362655 100644 --- a/src/01/02/z2ui5_cl_fw_index_html.clas.xml +++ b/src/01/02/z2ui5_cl_fw_http_get.clas.xml @@ -3,9 +3,9 @@ - Z2UI5_CL_FW_INDEX_HTML + Z2UI5_CL_FW_HTTP_GET E - abap2UI5 - index.html + abap2UI5 - http get handler 1 X X diff --git a/src/01/02/z2ui5_cl_fw_model_ajson.clas.abap b/src/01/02/z2ui5_cl_fw_http_mapper.clas.abap similarity index 56% rename from src/01/02/z2ui5_cl_fw_model_ajson.clas.abap rename to src/01/02/z2ui5_cl_fw_http_mapper.clas.abap index 6f1235b6..4bdb4b13 100644 --- a/src/01/02/z2ui5_cl_fw_model_ajson.clas.abap +++ b/src/01/02/z2ui5_cl_fw_http_mapper.clas.abap @@ -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 . 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. diff --git a/src/01/02/z2ui5_cl_fw_http_mapper.clas.xml b/src/01/02/z2ui5_cl_fw_http_mapper.clas.xml new file mode 100644 index 00000000..f213fb36 --- /dev/null +++ b/src/01/02/z2ui5_cl_fw_http_mapper.clas.xml @@ -0,0 +1,16 @@ + + + + + + Z2UI5_CL_FW_HTTP_MAPPER + E + abap2UI5 - http json mapper + 1 + X + X + X + + + + diff --git a/src/01/02/z2ui5_cl_fw_http_post.clas.abap b/src/01/02/z2ui5_cl_fw_http_post.clas.abap new file mode 100644 index 00000000..4a96dd6a --- /dev/null +++ b/src/01/02/z2ui5_cl_fw_http_post.clas.abap @@ -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. diff --git a/src/01/02/z2ui5_cl_fw_model_ajson.clas.xml b/src/01/02/z2ui5_cl_fw_http_post.clas.xml similarity index 79% rename from src/01/02/z2ui5_cl_fw_model_ajson.clas.xml rename to src/01/02/z2ui5_cl_fw_http_post.clas.xml index fa38ac96..417bc662 100644 --- a/src/01/02/z2ui5_cl_fw_model_ajson.clas.xml +++ b/src/01/02/z2ui5_cl_fw_http_post.clas.xml @@ -3,9 +3,9 @@ - Z2UI5_CL_FW_MODEL_AJSON + Z2UI5_CL_FW_HTTP_POST E - test + abap2UI5 - http post handler 1 X X diff --git a/src/02/z2ui5_cl_fw_http_handler.clas.abap b/src/02/z2ui5_cl_fw_http_handler.clas.abap deleted file mode 100644 index 03a9c2e9..00000000 --- a/src/02/z2ui5_cl_fw_http_handler.clas.abap +++ /dev/null @@ -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. diff --git a/src/02/z2ui5_cl_http_handler.clas.abap b/src/02/z2ui5_cl_http_handler.clas.abap new file mode 100644 index 00000000..957a403b --- /dev/null +++ b/src/02/z2ui5_cl_http_handler.clas.abap @@ -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. diff --git a/src/02/z2ui5_cl_fw_http_handler.clas.testclasses.abap b/src/02/z2ui5_cl_http_handler.clas.testclasses.abap similarity index 84% rename from src/02/z2ui5_cl_fw_http_handler.clas.testclasses.abap rename to src/02/z2ui5_cl_http_handler.clas.testclasses.abap index 71319068..39c412c7 100644 --- a/src/02/z2ui5_cl_fw_http_handler.clas.testclasses.abap +++ b/src/02/z2ui5_cl_http_handler.clas.testclasses.abap @@ -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. diff --git a/src/02/z2ui5_cl_fw_http_handler.clas.xml b/src/02/z2ui5_cl_http_handler.clas.xml similarity index 90% rename from src/02/z2ui5_cl_fw_http_handler.clas.xml rename to src/02/z2ui5_cl_http_handler.clas.xml index de362957..d4eeb85b 100644 --- a/src/02/z2ui5_cl_fw_http_handler.clas.xml +++ b/src/02/z2ui5_cl_http_handler.clas.xml @@ -3,7 +3,7 @@ - Z2UI5_CL_FW_HTTP_HANDLER + Z2UI5_CL_HTTP_HANDLER E abap2UI5 - http handler 1 diff --git a/src/02/z2ui5_if_client.intf.abap b/src/02/z2ui5_if_client.intf.abap index f6007641..438daaff 100644 --- a/src/02/z2ui5_if_client.intf.abap +++ b/src/02/z2ui5_if_client.intf.abap @@ -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 @@ -165,8 +201,7 @@ INTERFACE z2ui5_if_client custom_mapper TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL tab TYPE STANDARD TABLE OPTIONAL - tab_index TYPE i OPTIONAL - struc TYPE data OPTIONAL + tab_index TYPE i OPTIONAL RETURNING VALUE(result) TYPE string. @@ -179,8 +214,7 @@ INTERFACE z2ui5_if_client custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping OPTIONAL custom_filter TYPE REF TO z2ui5_if_ajson_filter OPTIONAL tab TYPE STANDARD TABLE OPTIONAL - tab_index TYPE i OPTIONAL - struc TYPE data OPTIONAL + tab_index TYPE i OPTIONAL RETURNING VALUE(result) TYPE string.