Refactoring (#884)

* npm version

* update npm

* refactoring

* Update abaplint.jsonc

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* refactoring and unit tests

* reafactoring load_by_app

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update

* update
This commit is contained in:
oblomov 2024-02-14 08:59:10 +01:00 committed by GitHub
parent 0b54da3a3f
commit ee36617e24
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 1595 additions and 1427 deletions

58
package-lock.json generated
View File

@ -9,16 +9,16 @@
"version": "1.0.0", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@abaplint/cli": "^2.105.15", "@abaplint/cli": "^2.105.16",
"@abaplint/database-sqlite": "^2.7.144", "@abaplint/database-sqlite": "^2.7.144",
"@abaplint/runtime": "^2.7.154", "@abaplint/runtime": "^2.7.156",
"@abaplint/transpiler-cli": "^2.7.154" "@abaplint/transpiler-cli": "^2.7.156"
} }
}, },
"node_modules/@abaplint/cli": { "node_modules/@abaplint/cli": {
"version": "2.105.15", "version": "2.105.16",
"resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.105.15.tgz", "resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.105.16.tgz",
"integrity": "sha512-HTGiHC/jJHhHpv3GX8DC2lmm6xCYYNP5jPAhSEcmgulZx5v4nrn8TEX+qyPUJa9nc+8C3q+vAPFah0SeKyP2AA==", "integrity": "sha512-EalQp5oL71AOe2gkX2l7ekvI2aaoVl6XgfVHtbYBWy5xGaDc7CICH48uPkRv7EU6BMO79+BioECBEwLl9wXWqQ==",
"dev": true, "dev": true,
"bin": { "bin": {
"abaplint": "abaplint" "abaplint": "abaplint"
@ -40,21 +40,21 @@
} }
}, },
"node_modules/@abaplint/runtime": { "node_modules/@abaplint/runtime": {
"version": "2.7.154", "version": "2.7.156",
"resolved": "https://registry.npmjs.org/@abaplint/runtime/-/runtime-2.7.154.tgz", "resolved": "https://registry.npmjs.org/@abaplint/runtime/-/runtime-2.7.156.tgz",
"integrity": "sha512-/oiTLcCkZOCQIez9X8I42OPsCQiP/FXGwnyS/paUfAr32m5f3YTcwZW0X0YMPlc4q5JvtjEtd8cCgJ8olV6sxA==", "integrity": "sha512-VfqLkHJ2DZ+ShuVqCxu2UeSnBBtCRwS54kVnyVHTDEmcbA7CGYhmHVoO04778IqONlqwjvfL/ZW1G9+eNMaqSA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"temporal-polyfill": "^0.2.0" "temporal-polyfill": "^0.2.1"
}, },
"funding": { "funding": {
"url": "https://github.com/sponsors/larshp" "url": "https://github.com/sponsors/larshp"
} }
}, },
"node_modules/@abaplint/transpiler-cli": { "node_modules/@abaplint/transpiler-cli": {
"version": "2.7.154", "version": "2.7.156",
"resolved": "https://registry.npmjs.org/@abaplint/transpiler-cli/-/transpiler-cli-2.7.154.tgz", "resolved": "https://registry.npmjs.org/@abaplint/transpiler-cli/-/transpiler-cli-2.7.156.tgz",
"integrity": "sha512-GqqdmjtWd6yM7pFBbxFzj48kel91aO5pogTTGxb1FAtJVeczL4xOddUVo+2YCvXQFMC5xyu52DVP6KP/9HCXeA==", "integrity": "sha512-QTNFiZNU6fCY9UOuVOHo9mHBWC+oN+QuHj/u+Re9XchbnvPRspP/q7CPKyh7uM0cxNkaKIOruFJV2haDRVqAbg==",
"dev": true, "dev": true,
"bin": { "bin": {
"abap_transpile": "abap_transpile" "abap_transpile": "abap_transpile"
@ -70,9 +70,9 @@
"dev": true "dev": true
}, },
"node_modules/temporal-polyfill": { "node_modules/temporal-polyfill": {
"version": "0.2.0", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.0.tgz", "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.1.tgz",
"integrity": "sha512-ra5tfISsVwUlDk9fhvEiIuvfBshV7jDtHYxmC8ACLIVV91MYoVlOBE1RpIrDjqGTYkCrZf0mWhgAW9XSOVPuGw==", "integrity": "sha512-JaCnPrUY0NkisdARpjbYIZ1P1Nt/Bhe7gRxEcboKJZnMkjtjLnmpDjQ8jM6mtpm/KUt4B3ijkkphlX2wKybX1g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"temporal-spec": "^0.2.0" "temporal-spec": "^0.2.0"
@ -87,9 +87,9 @@
}, },
"dependencies": { "dependencies": {
"@abaplint/cli": { "@abaplint/cli": {
"version": "2.105.15", "version": "2.105.16",
"resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.105.15.tgz", "resolved": "https://registry.npmjs.org/@abaplint/cli/-/cli-2.105.16.tgz",
"integrity": "sha512-HTGiHC/jJHhHpv3GX8DC2lmm6xCYYNP5jPAhSEcmgulZx5v4nrn8TEX+qyPUJa9nc+8C3q+vAPFah0SeKyP2AA==", "integrity": "sha512-EalQp5oL71AOe2gkX2l7ekvI2aaoVl6XgfVHtbYBWy5xGaDc7CICH48uPkRv7EU6BMO79+BioECBEwLl9wXWqQ==",
"dev": true "dev": true
}, },
"@abaplint/database-sqlite": { "@abaplint/database-sqlite": {
@ -102,18 +102,18 @@
} }
}, },
"@abaplint/runtime": { "@abaplint/runtime": {
"version": "2.7.154", "version": "2.7.156",
"resolved": "https://registry.npmjs.org/@abaplint/runtime/-/runtime-2.7.154.tgz", "resolved": "https://registry.npmjs.org/@abaplint/runtime/-/runtime-2.7.156.tgz",
"integrity": "sha512-/oiTLcCkZOCQIez9X8I42OPsCQiP/FXGwnyS/paUfAr32m5f3YTcwZW0X0YMPlc4q5JvtjEtd8cCgJ8olV6sxA==", "integrity": "sha512-VfqLkHJ2DZ+ShuVqCxu2UeSnBBtCRwS54kVnyVHTDEmcbA7CGYhmHVoO04778IqONlqwjvfL/ZW1G9+eNMaqSA==",
"dev": true, "dev": true,
"requires": { "requires": {
"temporal-polyfill": "^0.2.0" "temporal-polyfill": "^0.2.1"
} }
}, },
"@abaplint/transpiler-cli": { "@abaplint/transpiler-cli": {
"version": "2.7.154", "version": "2.7.156",
"resolved": "https://registry.npmjs.org/@abaplint/transpiler-cli/-/transpiler-cli-2.7.154.tgz", "resolved": "https://registry.npmjs.org/@abaplint/transpiler-cli/-/transpiler-cli-2.7.156.tgz",
"integrity": "sha512-GqqdmjtWd6yM7pFBbxFzj48kel91aO5pogTTGxb1FAtJVeczL4xOddUVo+2YCvXQFMC5xyu52DVP6KP/9HCXeA==", "integrity": "sha512-QTNFiZNU6fCY9UOuVOHo9mHBWC+oN+QuHj/u+Re9XchbnvPRspP/q7CPKyh7uM0cxNkaKIOruFJV2haDRVqAbg==",
"dev": true "dev": true
}, },
"sql.js": { "sql.js": {
@ -123,9 +123,9 @@
"dev": true "dev": true
}, },
"temporal-polyfill": { "temporal-polyfill": {
"version": "0.2.0", "version": "0.2.1",
"resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.0.tgz", "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-0.2.1.tgz",
"integrity": "sha512-ra5tfISsVwUlDk9fhvEiIuvfBshV7jDtHYxmC8ACLIVV91MYoVlOBE1RpIrDjqGTYkCrZf0mWhgAW9XSOVPuGw==", "integrity": "sha512-JaCnPrUY0NkisdARpjbYIZ1P1Nt/Bhe7gRxEcboKJZnMkjtjLnmpDjQ8jM6mtpm/KUt4B3ijkkphlX2wKybX1g==",
"dev": true, "dev": true,
"requires": { "requires": {
"temporal-spec": "^0.2.0" "temporal-spec": "^0.2.0"

View File

@ -19,9 +19,9 @@
}, },
"homepage": "https://github.com/abap2UI5/abap2UI5#readme", "homepage": "https://github.com/abap2UI5/abap2UI5#readme",
"devDependencies": { "devDependencies": {
"@abaplint/cli": "^2.105.15", "@abaplint/cli": "^2.105.16",
"@abaplint/database-sqlite": "^2.7.144", "@abaplint/database-sqlite": "^2.7.144",
"@abaplint/runtime": "^2.7.154", "@abaplint/runtime": "^2.7.156",
"@abaplint/transpiler-cli": "^2.7.154" "@abaplint/transpiler-cli": "^2.7.156"
} }
} }

View File

@ -67,7 +67,7 @@ CLASS z2ui5_cl_util_api DEFINITION
IMPORTING IMPORTING
val TYPE any val TYPE any
RETURNING RETURNING
VALUE(result) TYPE REF TO object. VALUE(result) TYPE REF TO data.
CLASS-METHODS conv_get_as_data_ref CLASS-METHODS conv_get_as_data_ref
IMPORTING IMPORTING
@ -432,7 +432,6 @@ CLASS z2ui5_cl_util_api IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD conv_copy_ref_data. METHOD conv_copy_ref_data.
FIELD-SYMBOLS <from> TYPE data. FIELD-SYMBOLS <from> TYPE data.
@ -731,10 +730,12 @@ CLASS z2ui5_cl_util_api IMPLEMENTATION.
METHOD rtti_check_ref_data. METHOD rtti_check_ref_data.
TRY. TRY.
cl_abap_typedescr=>describe_by_data_ref( val ). DATA(lo_typdescr) = cl_abap_typedescr=>describe_by_data( val ).
DATA(lo_ref) = CAST cl_abap_refdescr( lo_typdescr ) ##NEEDED.
result = abap_true. result = abap_true.
CATCH cx_root. CATCH cx_root.
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.

File diff suppressed because it is too large Load Diff

View File

@ -197,7 +197,12 @@ CLASS z2ui5_cl_core_bind_srv IMPLEMENTATION.
ms_config = config. ms_config = config.
mv_type = type. mv_type = type.
mr_attri = mo_app->attri_get_by_data( val ).
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( mo_app->mt_attri )
app = mo_app->mo_app ).
mr_attri = lo_model->search_a_dissolve_attribute( val ).
IF mr_attri->bind_type IS NOT INITIAL. IF mr_attri->bind_type IS NOT INITIAL.
check_raise_existing( ). check_raise_existing( ).
@ -244,24 +249,25 @@ CLASS z2ui5_cl_core_bind_srv IMPLEMENTATION.
METHOD main_local. METHOD main_local.
TRY. TRY.
DATA(lo_json) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>new( ) ).
lo_json->set( iv_path = `/` iv_val = val ).
IF config-custom_mapper IS BOUND. IF config-custom_mapper IS BOUND.
DATA(ajson) = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty( ii_custom_mapping = config-custom_mapper ) ). lo_json = lo_json->map( config-custom_mapper ).
ELSE. ELSE.
ajson = CAST z2ui5_if_ajson( z2ui5_cl_ajson=>create_empty( ii_custom_mapping = z2ui5_cl_ajson_mapping=>create_upper_case( ) ) ). lo_json = lo_json->map( z2ui5_cl_ajson_mapping=>create_upper_case( ) ).
ENDIF. ENDIF.
ajson->set( iv_path = `/` iv_val = val ).
IF config-custom_filter IS BOUND. IF config-custom_filter IS BOUND.
ajson = ajson->filter( config-custom_filter ). lo_json = lo_json->filter( config-custom_filter ).
ELSE. ELSE.
ajson = ajson->filter( z2ui5_cl_ajson_filter_lib=>create_empty_filter( ) ). lo_json = lo_json->filter( z2ui5_cl_ajson_filter_lib=>create_empty_filter( ) ).
ENDIF. ENDIF.
DATA(lv_id) = to_upper( z2ui5_cl_util=>uuid_get_c22( ) ). DATA(lv_id) = to_upper( z2ui5_cl_util=>uuid_get_c22( ) ).
INSERT VALUE #( name_client = |/{ lv_id }| INSERT VALUE #( name_client = |/{ lv_id }|
name = lv_id name = lv_id
json_bind_local = ajson json_bind_local = lo_json
bind_type = z2ui5_if_core_types=>cs_bind_type-one_time ) bind_type = z2ui5_if_core_types=>cs_bind_type-one_time )
INTO TABLE mo_app->mt_attri. INTO TABLE mo_app->mt_attri.

View File

@ -1,327 +1,374 @@
*
*CLASS ltcl_test_bind DEFINITION DEFERRED. CLASS ltcl_test_bind DEFINITION DEFERRED.
*CLASS z2ui5_cl_core_bind_srv DEFINITION LOCAL FRIENDS ltcl_test_bind. CLASS z2ui5_cl_core_bind_srv DEFINITION LOCAL FRIENDS ltcl_test_bind.
*
*CLASS ltcl_test_app DEFINITION FINAL FOR TESTING CLASS ltcl_test_app DEFINITION FINAL FOR TESTING
* DURATION MEDIUM DURATION MEDIUM
* RISK LEVEL HARMLESS. RISK LEVEL HARMLESS.
*
* PUBLIC SECTION. PUBLIC SECTION.
*
* TYPES: TYPES:
* BEGIN OF s_01, BEGIN OF s_01,
* input TYPE string, input TYPE string,
* BEGIN OF s_02, BEGIN OF s_02,
* input TYPE string, input TYPE string,
* BEGIN OF s_03, BEGIN OF s_03,
* input TYPE string, input TYPE string,
* BEGIN OF s_04, BEGIN OF s_04,
* input TYPE string, input TYPE string,
* END OF s_04, END OF s_04,
* END OF s_03, END OF s_03,
* END OF s_02, END OF s_02,
* END OF s_01. END OF s_01.
*
* DATA ms_struc TYPE s_01 ##NEEDED. DATA ms_struc TYPE s_01 ##NEEDED.
* DATA mv_value TYPE string ##NEEDED. DATA mv_value TYPE string ##NEEDED.
* DATA mr_value TYPE REF TO data ##NEEDED. DATA mr_value TYPE REF TO data ##NEEDED.
* DATA mr_struc TYPE REF TO s_01 ##NEEDED. DATA mr_struc TYPE REF TO s_01 ##NEEDED.
* DATA mo_app TYPE REF TO ltcl_test_bind ##NEEDED. DATA mo_app TYPE REF TO ltcl_test_bind ##NEEDED.
*
* DATA xx TYPE string. DATA xx TYPE string ##NEEDED.
*ENDCLASS. METHODS constructor.
* ENDCLASS.
*CLASS ltcl_test_bind DEFINITION FINAL FOR TESTING
* DURATION MEDIUM CLASS ltcl_test_app IMPLEMENTATION.
* RISK LEVEL HARMLESS.
* METHOD constructor.
* PUBLIC SECTION.
* PROTECTED SECTION. ENDMETHOD.
* PRIVATE SECTION.
* METHODS test_one_way FOR TESTING RAISING cx_static_check. ENDCLASS.
* METHODS test_one_way_w_x_error FOR TESTING RAISING cx_static_check.
* METHODS test_error_diff FOR TESTING RAISING cx_static_check. CLASS ltcl_test_bind DEFINITION FINAL FOR TESTING
* METHODS test_two_way FOR TESTING RAISING cx_static_check. DURATION MEDIUM
* RISK LEVEL HARMLESS.
*ENDCLASS.
* PUBLIC SECTION.
*CLASS ltcl_test_bind IMPLEMENTATION. PROTECTED SECTION.
* PRIVATE SECTION.
* METHOD test_one_way_w_x_error. METHODS test_one_way FOR TESTING RAISING cx_static_check.
* METHODS test_one_way_w_x_error FOR TESTING RAISING cx_static_check.
* DATA(lo_app_client) = NEW ltcl_test_app( ). METHODS test_error_diff FOR TESTING RAISING cx_static_check.
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). METHODS test_two_way FOR TESTING RAISING cx_static_check.
* lo_app->mo_app = lo_app_client.
* ENDCLASS.
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* CLASS ltcl_test_bind IMPLEMENTATION.
* TRY.
* lo_bind->main( METHOD test_one_way_w_x_error.
* val = REF #( lo_app_client->xx )
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). IF sy-sysid = 'ABC'.
* RETURN.
* cl_abap_unit_assert=>abort( ). ENDIF.
*
* CATCH cx_root. DATA(lo_app_client) = NEW ltcl_test_app( ).
* ENDTRY. DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* lo_app->mo_app = lo_app_client.
* ENDMETHOD.
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* METHOD test_one_way.
* TRY.
* DATA(lo_app_client) = NEW ltcl_test_app( ). lo_bind->main(
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). val = REF #( lo_app_client->xx )
* lo_app->mo_app = lo_app_client. type = z2ui5_if_core_types=>cs_bind_type-one_way ).
*
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). cl_abap_unit_assert=>abort( ).
*
* DATA(lv_bind) = lo_bind->main( CATCH cx_root.
* val = REF #( lo_app_client->mv_value ) ENDTRY.
* type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* ENDMETHOD.
* cl_abap_unit_assert=>assert_equals(
* act = lv_bind METHOD test_one_way.
* exp = `{/MV_VALUE}` ).
* IF sy-sysid = 'ABC'.
* cl_abap_unit_assert=>assert_not_initial( lv_bind ). RETURN.
* ENDIF.
* ENDMETHOD.
* DATA(lo_app_client) = NEW ltcl_test_app( ).
* METHOD test_error_diff. DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* lo_app->mo_app = lo_app_client.
* DATA(lo_app_client) = NEW ltcl_test_app( ).
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* lo_app->mo_app = lo_app_client.
* DATA(lv_bind) = lo_bind->main(
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). val = REF #( lo_app_client->mv_value )
* type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* lo_bind->main(
* val = REF #( lo_app_client->mv_value ) cl_abap_unit_assert=>assert_equals(
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). act = lv_bind
* exp = `{/MV_VALUE}` ).
* TRY.
* lo_bind->main( ENDMETHOD.
* val = REF #( lo_app_client->mv_value )
* type = z2ui5_if_core_types=>cs_bind_type-two_way ). METHOD test_error_diff.
*
* cl_abap_unit_assert=>abort( ). IF sy-sysid = 'ABC'.
* RETURN.
* CATCH cx_root. ENDIF.
* ENDTRY.
* DATA(lo_app_client) = NEW ltcl_test_app( ).
* ENDMETHOD. DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* lo_app->mo_app = lo_app_client.
*
* METHOD test_two_way. DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
*
* DATA(lo_app_client) = NEW ltcl_test_app( ). lo_bind->main(
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). val = REF #( lo_app_client->mv_value )
* lo_app->mo_app = lo_app_client. type = z2ui5_if_core_types=>cs_bind_type-one_way ).
*
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). TRY.
* lo_bind->main(
* DATA(lv_bind) = lo_bind->main( val = REF #( lo_app_client->mv_value )
* val = REF #( lo_app_client->mv_value ) type = z2ui5_if_core_types=>cs_bind_type-two_way ).
* type = z2ui5_if_core_types=>cs_bind_type-two_way ).
* cl_abap_unit_assert=>abort( ).
* DATA(lv_bind2) = lo_bind->main(
* val = REF #( lo_app_client->mv_value ) CATCH cx_root.
* type = z2ui5_if_core_types=>cs_bind_type-two_way ). ENDTRY.
*
* cl_abap_unit_assert=>assert_equals( ENDMETHOD.
* act = lv_bind
* exp = lv_bind2 ).
* METHOD test_two_way.
* cl_abap_unit_assert=>assert_not_initial( lv_bind ).
* IF sy-sysid = 'ABC'.
* ENDMETHOD. RETURN.
*ENDCLASS. ENDIF.
*
* DATA(lo_app_client) = NEW ltcl_test_app( ).
*CLASS ltcl_test_main_structure DEFINITION FINAL FOR TESTING DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* DURATION MEDIUM lo_app->mo_app = lo_app_client.
* RISK LEVEL HARMLESS.
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* PUBLIC SECTION.
* DATA(lv_bind) = lo_bind->main(
* TYPES: val = REF #( lo_app_client->mv_value )
* BEGIN OF s_01, type = z2ui5_if_core_types=>cs_bind_type-two_way ).
* input TYPE string,
* BEGIN OF s_02, DATA(lv_bind2) = lo_bind->main(
* input TYPE string, val = REF #( lo_app_client->mv_value )
* BEGIN OF s_03, type = z2ui5_if_core_types=>cs_bind_type-two_way ).
* input TYPE string,
* BEGIN OF s_04, cl_abap_unit_assert=>assert_equals(
* input TYPE string, act = lv_bind
* END OF s_04, exp = lv_bind2 ).
* END OF s_03,
* END OF s_02, cl_abap_unit_assert=>assert_not_initial( lv_bind ).
* END OF s_01.
* ENDMETHOD.
* DATA ms_struc TYPE s_01. ENDCLASS.
*
* PRIVATE SECTION.
* CLASS ltcl_test_main_structure DEFINITION FINAL FOR TESTING
* METHODS test_one_way_lev1 FOR TESTING RAISING cx_static_check. DURATION MEDIUM
* METHODS test_one_way_lev2 FOR TESTING RAISING cx_static_check. RISK LEVEL HARMLESS.
* METHODS test_one_way_lev3 FOR TESTING RAISING cx_static_check.
* METHODS test_one_way_lev4_long_name FOR TESTING RAISING cx_static_check. PUBLIC SECTION.
*
* TYPES:
*ENDCLASS. BEGIN OF s_01,
* input TYPE string,
*CLASS ltcl_test_main_structure IMPLEMENTATION. BEGIN OF s_02,
* input TYPE string,
* METHOD test_one_way_lev1. BEGIN OF s_03,
* input TYPE string,
* DATA(lo_test_app) = NEW ltcl_test_main_structure( ). BEGIN OF s_04,
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). input TYPE string,
* lo_app->mo_app = lo_test_app. END OF s_04,
* END OF s_03,
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). END OF s_02,
* DATA(lv_result) = lo_bind->main( END OF s_01.
* val = REF #( lo_test_app->ms_struc-input )
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). DATA ms_struc TYPE s_01.
*
* cl_abap_unit_assert=>assert_equals( PRIVATE SECTION.
* act = lv_result
* exp = `{/MS_STRUC/INPUT}` ). METHODS test_one_way_lev1 FOR TESTING RAISING cx_static_check.
* METHODS test_one_way_lev2 FOR TESTING RAISING cx_static_check.
* lv_result = lo_bind->main( METHODS test_one_way_lev3 FOR TESTING RAISING cx_static_check.
* val = REF #( lo_test_app->ms_struc-input ) METHODS test_one_way_lev4_long_name FOR TESTING RAISING cx_static_check.
* config = VALUE #( path_only = abap_true )
* type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* ENDCLASS.
* cl_abap_unit_assert=>assert_equals(
* act = lv_result CLASS ltcl_test_main_structure IMPLEMENTATION.
* exp = `/MS_STRUC/INPUT` ).
* METHOD test_one_way_lev1.
* ENDMETHOD.
* IF sy-sysid = 'ABC'.
* METHOD test_one_way_lev2. RETURN.
* ENDIF.
* DATA(lo_test_app) = NEW ltcl_test_main_structure( ).
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). DATA(lo_test_app) = NEW ltcl_test_main_structure( ).
* lo_app->mo_app = lo_test_app. DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* lo_app->mo_app = lo_test_app.
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* DATA(lv_result) = lo_bind->main( DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* val = REF #( lo_test_app->ms_struc-s_02-input ) DATA(lv_result) = lo_bind->main(
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). val = REF #( lo_test_app->ms_struc-input )
* type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* cl_abap_unit_assert=>assert_equals(
* act = lv_result cl_abap_unit_assert=>assert_equals(
* exp = `{/MS_STRUC/S_02-INPUT}` ). act = lv_result
* exp = `{/MS_STRUC/INPUT}` ).
* ENDMETHOD.
* lv_result = lo_bind->main(
* METHOD test_one_way_lev3. val = REF #( lo_test_app->ms_struc-input )
* config = VALUE #( path_only = abap_true )
* DATA(lo_test_app) = NEW ltcl_test_main_structure( ). type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* lo_app->mo_app = lo_test_app. cl_abap_unit_assert=>assert_equals(
* act = lv_result
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). exp = `/MS_STRUC/INPUT` ).
* DATA(lv_result) = lo_bind->main(
* val = REF #( lo_test_app->ms_struc-s_02-s_03-input ) ENDMETHOD.
* type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* METHOD test_one_way_lev2.
* cl_abap_unit_assert=>assert_equals(
* act = lv_result IF sy-sysid = 'ABC'.
* exp = `{/MS_STRUC/S_02-S_03-INPUT}` ). RETURN.
* ENDIF.
* ENDMETHOD.
* DATA(lo_test_app) = NEW ltcl_test_main_structure( ).
* METHOD test_one_way_lev4_long_name. DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* lo_app->mo_app = lo_test_app.
* DATA(lo_test_app) = NEW ltcl_test_main_structure( ).
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* lo_app->mo_app = lo_test_app. DATA(lv_result) = lo_bind->main(
* val = REF #( lo_test_app->ms_struc-s_02-input )
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). type = z2ui5_if_core_types=>cs_bind_type-one_way ).
* DATA(lv_result) = lo_bind->main(
* val = REF #( lo_test_app->ms_struc-s_02-s_03-s_04-input ) cl_abap_unit_assert=>assert_equals(
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). act = lv_result
* exp = `{/MS_STRUC/S_02-INPUT}` ).
* cl_abap_unit_assert=>assert_equals(
* act = lv_result ENDMETHOD.
* exp = `{/MS_STRUC/S_02-S_03-S_04-INPUT}` ).
* METHOD test_one_way_lev3.
* ENDMETHOD.
* IF sy-sysid = 'ABC'.
*ENDCLASS. RETURN.
* ENDIF.
*
*CLASS ltcl_test_main_object DEFINITION FINAL FOR TESTING DATA(lo_test_app) = NEW ltcl_test_main_structure( ).
* DURATION MEDIUM DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* RISK LEVEL HARMLESS. lo_app->mo_app = lo_test_app.
*
* PUBLIC SECTION. DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* DATA(lv_result) = lo_bind->main(
* DATA mo_obj TYPE REF TO ltcl_test_main_object. val = REF #( lo_test_app->ms_struc-s_02-s_03-input )
* DATA mv_value TYPE string. type = z2ui5_if_core_types=>cs_bind_type-one_way ).
*
* TYPES: cl_abap_unit_assert=>assert_equals(
* BEGIN OF s_01, act = lv_result
* input TYPE string, exp = `{/MS_STRUC/S_02-S_03-INPUT}` ).
* BEGIN OF s_02,
* input TYPE string, ENDMETHOD.
* BEGIN OF s_03,
* input TYPE string, METHOD test_one_way_lev4_long_name.
* BEGIN OF s_04,
* input TYPE string, IF sy-sysid = 'ABC'.
* END OF s_04, RETURN.
* END OF s_03, ENDIF.
* END OF s_02,
* END OF s_01. DATA(lo_test_app) = NEW ltcl_test_main_structure( ).
* DATA(lo_app) = NEW z2ui5_cl_core_app( ).
* DATA ms_struc TYPE s_01. lo_app->mo_app = lo_test_app.
*
* PRIVATE SECTION. DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* DATA(lv_result) = lo_bind->main(
* METHODS test_one_way_value FOR TESTING RAISING cx_static_check. val = REF #( lo_test_app->ms_struc-s_02-s_03-s_04-input )
* METHODS test_one_way_struc FOR TESTING RAISING cx_static_check. type = z2ui5_if_core_types=>cs_bind_type-one_way ).
*
* cl_abap_unit_assert=>assert_equals(
*ENDCLASS. act = lv_result
* exp = `{/MS_STRUC/S_02-S_03-S_04-INPUT}` ).
*CLASS ltcl_test_main_object IMPLEMENTATION.
* ENDMETHOD.
* METHOD test_one_way_value.
* ENDCLASS.
* DATA(lo_test_app) = NEW ltcl_test_main_object( ).
* lo_test_app->mo_obj = NEW #( ).
* lo_test_app->mo_obj->mv_value = `test`. CLASS ltcl_test_main_object DEFINITION FINAL FOR TESTING
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). DURATION MEDIUM
* lo_app->mo_app = lo_test_app. RISK LEVEL HARMLESS.
*
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ). PUBLIC SECTION.
* DATA(lv_result) = lo_bind->main(
* val = REF #( lo_test_app->mo_obj->mv_value ) DATA mo_obj TYPE REF TO ltcl_test_main_object.
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). DATA mv_value TYPE string.
*
* cl_abap_unit_assert=>assert_equals( TYPES:
* act = lv_result BEGIN OF s_01,
* exp = `{/MO_OBJ/MV_VALUE}` ). input TYPE string,
* BEGIN OF s_02,
* ENDMETHOD. input TYPE string,
* BEGIN OF s_03,
* METHOD test_one_way_struc. input TYPE string,
* BEGIN OF s_04,
* DATA(lo_test_app) = NEW ltcl_test_main_object( ). input TYPE string,
* lo_test_app->mo_obj = NEW #( ). END OF s_04,
* DATA(lo_app) = NEW z2ui5_cl_core_app( ). END OF s_03,
* lo_app->mo_app = lo_test_app. END OF s_02,
* END OF s_01.
* DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
* DATA(lv_result) = lo_bind->main( DATA ms_struc TYPE s_01.
* val = REF #( lo_test_app->mo_obj->ms_struc-input )
* type = z2ui5_if_core_types=>cs_bind_type-one_way ). PRIVATE SECTION.
*
* cl_abap_unit_assert=>assert_equals( METHODS test_one_way_value FOR TESTING RAISING cx_static_check.
* act = lv_result METHODS test_one_way_struc FOR TESTING RAISING cx_static_check.
* exp = `{/MO_OBJ/MS_STRUC-INPUT}` ).
*
* ENDMETHOD. ENDCLASS.
*
*ENDCLASS. CLASS ltcl_test_main_object IMPLEMENTATION.
METHOD test_one_way_value.
IF sy-sysid = 'ABC'.
RETURN.
ENDIF.
DATA(lo_test_app) = NEW ltcl_test_main_object( ).
lo_test_app->mo_obj = NEW #( ).
lo_test_app->mo_obj->mv_value = `test`.
DATA(lo_app) = NEW z2ui5_cl_core_app( ).
lo_app->mo_app = lo_test_app.
DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
DATA(lv_result) = lo_bind->main(
val = REF #( lo_test_app->mo_obj->mv_value )
type = z2ui5_if_core_types=>cs_bind_type-one_way ).
cl_abap_unit_assert=>assert_equals(
act = lv_result
exp = `{/MO_OBJ/MV_VALUE}` ).
ENDMETHOD.
METHOD test_one_way_struc.
IF sy-sysid = 'ABC'.
RETURN.
ENDIF.
DATA(lo_test_app) = NEW ltcl_test_main_object( ).
lo_test_app->mo_obj = NEW #( ).
DATA(lo_app) = NEW z2ui5_cl_core_app( ).
lo_app->mo_app = lo_test_app.
DATA(lo_bind) = NEW z2ui5_cl_core_bind_srv( lo_app ).
DATA(lv_result) = lo_bind->main(
val = REF #( lo_test_app->mo_obj->ms_struc-input )
type = z2ui5_if_core_types=>cs_bind_type-one_way ).
cl_abap_unit_assert=>assert_equals(
act = lv_result
exp = `{/MO_OBJ/MS_STRUC-INPUT}` ).
ENDMETHOD.
ENDCLASS.

View File

@ -4,7 +4,6 @@ CLASS ltcl_test DEFINITION FINAL FOR TESTING
PRIVATE SECTION. PRIVATE SECTION.
METHODS request_json_to_abap FOR TESTING RAISING cx_static_check. METHODS request_json_to_abap FOR TESTING RAISING cx_static_check.
METHODS model_front_to_back FOR TESTING RAISING cx_static_check.
ENDCLASS. ENDCLASS.
@ -13,46 +12,35 @@ CLASS ltcl_test IMPLEMENTATION.
METHOD request_json_to_abap. METHOD request_json_to_abap.
* DATA(lv_payload) = `{"EDIT":{"NAME":"test"},"ARGUMENTS":[],"S_FRONTEND":{"ID":"ID_NR","EDIT":{"NAME":"test"},"ORIGIN":"ORIGIN","PATHNAME":"PATHNAME","SEARCH":"SEARCH"` && DATA(lv_payload) = `{"XX":{"NAME":"test"},"S_FRONT":{"ID":"ID_NR","EDIT":{"NAME":"test"},"ORIGIN":"ORIGIN","PATHNAME":"PATHNAME","SEARCH":"SEARCH"` &&
* `,"VIEW":"MAIN","EVENT":"BUTTON_POST","T_EVENT_ARG":[]}}`. `,"VIEW":"MAIN","EVENT":"BUTTON_POST","T_EVENT_ARG":[]}}`.
*
* DATA(lo_mapper) = NEW z2ui5_cl_core_json_srv( ).
* DATA(ls_result) = lo_mapper->request_json_to_abap( lv_payload ).
*
* DATA(ls_exp) = VALUE z2ui5_if_core_types=>ty_s_http_request_post(
* s_frontend = VALUE #(
* id = `ID_NR`
* view = `MAIN`
* origin = `ORIGIN`
* pathname = `PATHNAME`
* search = `SEARCH`
* event = `BUTTON_POST`
* ) ).
*
* cl_abap_unit_assert=>assert_equals(
* act = ls_result-s_frontend
* exp = ls_exp-s_frontend ).
*
* DATA lt_tree TYPE z2ui5_if_ajson_types=>ty_nodes_ts.
* lt_tree = ls_result-o_model->mt_json_tree.
*
* cl_abap_unit_assert=>assert_equals(
* act = lt_tree[ name = `NAME` ]-value
* exp = `test` ).
*
* cl_abap_unit_assert=>assert_equals(
* act = lines( lt_tree )
* exp = 2 ).
ENDMETHOD. DATA(lo_mapper) = NEW z2ui5_cl_core_json_srv( ).
DATA(ls_result) = lo_mapper->request_json_to_abap( lv_payload ).
METHOD model_front_to_back. DATA(ls_exp) = VALUE z2ui5_if_core_types=>ty_s_http_request_post(
s_front = VALUE #(
id = `ID_NR`
view = `MAIN`
origin = `ORIGIN`
pathname = `PATHNAME`
search = `SEARCH`
event = `BUTTON_POST` ) ).
* NEW z2ui5_cl_core_json_srv( )->model_front_to_back( cl_abap_unit_assert=>assert_equals(
* viewname = `MAIN` act = ls_result-s_front
* app = lo_ap exp = ls_exp-s_front ).
* t_attri = lt_attri
* model = lo_ajson ). DATA lt_tree TYPE z2ui5_if_ajson_types=>ty_nodes_ts.
lt_tree = ls_result-o_model->mt_json_tree.
cl_abap_unit_assert=>assert_equals(
act = lt_tree[ name = `NAME` ]-value
exp = `test` ).
cl_abap_unit_assert=>assert_equals(
act = lines( lt_tree )
exp = 3 ).
ENDMETHOD. ENDMETHOD.

View File

@ -1,26 +1,33 @@
CLASS z2ui5_cl_core_model_srv DEFINITION CLASS z2ui5_cl_core_model_srv DEFINITION
PUBLIC PUBLIC FINAL
FINAL
CREATE PUBLIC. CREATE PUBLIC.
PUBLIC SECTION. PUBLIC SECTION.
DATA mt_attri TYPE REF TO z2ui5_if_core_types=>ty_t_attri. DATA mt_attri TYPE REF TO z2ui5_if_core_types=>ty_t_attri.
DATA mo_app TYPE REF TO object. DATA mo_app TYPE REF TO object.
METHODS constructor METHODS constructor
IMPORTING IMPORTING
attri TYPE REF TO z2ui5_if_core_types=>ty_t_attri attri TYPE REF TO z2ui5_if_core_types=>ty_t_attri
app TYPE REF TO object. app TYPE REF TO object.
METHODS dissolve.
METHODS attri_refs_update. METHODS attri_refs_update.
METHODS attri_before_save. METHODS attri_before_save.
METHODS attri_after_load. METHODS attri_after_load.
METHODS search_a_dissolve_attribute
IMPORTING
val TYPE REF TO data
RETURNING
VALUE(result) TYPE REF TO z2ui5_if_core_types=>ty_s_attri.
PROTECTED SECTION. PROTECTED SECTION.
METHODS dissolve.
METHODS dissolve_main.
METHODS dissolve_init.
METHODS attri_get_val_ref METHODS attri_get_val_ref
IMPORTING IMPORTING
iv_path TYPE clike iv_path TYPE clike
@ -40,38 +47,40 @@ CLASS z2ui5_cl_core_model_srv DEFINITION
VALUE(result) TYPE z2ui5_if_core_types=>ty_t_attri. VALUE(result) TYPE z2ui5_if_core_types=>ty_t_attri.
METHODS diss_oref METHODS diss_oref
IMPORTING ir_attri TYPE REF TO z2ui5_if_core_types=>ty_s_attri
RETURNING VALUE(result) TYPE z2ui5_if_core_types=>ty_t_attri.
METHODS search_attribute
IMPORTING IMPORTING
ir_attri TYPE REF TO z2ui5_if_core_types=>ty_s_attri val TYPE REF TO data
RETURNING RETURNING
VALUE(result) TYPE z2ui5_if_core_types=>ty_t_attri. VALUE(result) TYPE REF TO z2ui5_if_core_types=>ty_s_attri.
METHODS dissolve_main. METHODS get_new_attri
IMPORTING
METHODS dissolve_init. name TYPE string
RETURNING
PRIVATE SECTION. VALUE(result) TYPE z2ui5_if_core_types=>ty_s_attri.
ENDCLASS. ENDCLASS.
CLASS z2ui5_cl_core_model_srv IMPLEMENTATION. CLASS z2ui5_cl_core_model_srv IMPLEMENTATION.
METHOD attri_after_load. METHOD attri_after_load.
LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri) LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri)
WHERE data_rtti IS NOT INITIAL WHERE data_rtti IS NOT INITIAL
AND type_kind = cl_abap_classdescr=>typekind_dref. AND type_kind = cl_abap_classdescr=>typekind_dref.
lr_attri->r_ref = attri_get_val_ref( lr_attri->name ). lr_attri->r_ref = attri_get_val_ref( lr_attri->name ).
ASSIGN lr_attri->r_ref->* TO FIELD-SYMBOL(<val>). ASSIGN lr_attri->r_ref->* TO FIELD-SYMBOL(<val>).
z2ui5_cl_util=>xml_srtti_parse( z2ui5_cl_util=>xml_srtti_parse(
EXPORTING EXPORTING
rtti_data = lr_attri->data_rtti rtti_data = lr_attri->data_rtti
IMPORTING IMPORTING
e_data = <val> ). e_data = <val> ).
CLEAR lr_attri->data_rtti. CLEAR lr_attri->data_rtti.
ENDLOOP. ENDLOOP.
@ -80,7 +89,6 @@ CLASS z2ui5_cl_core_model_srv IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD attri_before_save. METHOD attri_before_save.
LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri). LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri).
@ -103,15 +111,36 @@ CLASS z2ui5_cl_core_model_srv IMPLEMENTATION.
CLEAR <val>. CLEAR <val>.
CLEAR <val_ref>. CLEAR <val_ref>.
CLEAR lr_attri->r_ref. CLEAR lr_attri->r_ref.
ENDLOOP. ENDLOOP.
ENDMETHOD. ENDMETHOD.
METHOD search_a_dissolve_attribute.
result = search_attribute( val ).
IF result IS BOUND.
RETURN.
ENDIF.
DO 5 TIMES.
dissolve( ).
result = search_attribute( val ).
IF result IS BOUND.
RETURN.
ENDIF.
ENDDO.
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 or switch to bind_local`.
ENDMETHOD.
METHOD attri_get_val_ref. METHOD attri_get_val_ref.
FIELD-SYMBOLS <attri> TYPE any. ASSIGN mo_app->(iv_path) TO FIELD-SYMBOL(<attri>).
ASSIGN mo_app->(iv_path) TO <attri>.
IF sy-subrc <> 0. IF sy-subrc <> 0.
RAISE EXCEPTION TYPE z2ui5_cx_util_error RAISE EXCEPTION TYPE z2ui5_cx_util_error
EXPORTING EXPORTING
@ -125,44 +154,46 @@ CLASS z2ui5_cl_core_model_srv IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD attri_refs_update. METHOD attri_refs_update.
LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri) LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri)
WHERE bind_type <> z2ui5_if_core_types=>cs_bind_type-one_time. WHERE bind_type <> z2ui5_if_core_types=>cs_bind_type-one_time.
lr_attri->r_ref = attri_get_val_ref( lr_attri->name ). lr_attri->r_ref = attri_get_val_ref( lr_attri->name ).
ENDLOOP. ENDLOOP.
ENDMETHOD. ENDMETHOD.
METHOD constructor. METHOD constructor.
me->mt_attri = attri. mt_attri = attri.
me->mo_app = app. mo_app = app.
ENDMETHOD. ENDMETHOD.
METHOD dissolve. METHOD dissolve.
IF mt_attri->* IS INITIAL. IF mt_attri->* IS INITIAL.
dissolve_init( ). dissolve_init( ).
RETURN. RETURN.
ENDIF. ENDIF.
dissolve_main( ). dissolve_main( ).
ENDMETHOD. ENDMETHOD.
METHOD dissolve_init.
DATA(ls_attri) = VALUE z2ui5_if_core_types=>ty_s_attri( r_ref = REF #( mo_app ) ).
DATA(lt_init) = diss_oref( REF #( ls_attri ) ).
INSERT LINES OF lt_init INTO TABLE mt_attri->*.
ENDMETHOD.
METHOD dissolve_main. METHOD dissolve_main.
DATA(lt_attri_new) = VALUE z2ui5_if_core_types=>ty_t_attri( ). DATA(lt_attri_new) = VALUE z2ui5_if_core_types=>ty_t_attri( ).
LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri) LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri)
WHERE check_dissolved = abap_false. WHERE check_dissolved = abap_false.
lr_attri->check_dissolved = abap_true. lr_attri->check_dissolved = abap_true.
@ -186,67 +217,58 @@ CLASS z2ui5_cl_core_model_srv IMPLEMENTATION.
ENDCASE. ENDCASE.
ENDLOOP. ENDLOOP.
INSERT LINES OF lt_attri_new INTO TABLE mt_attri->*. INSERT LINES OF lt_attri_new INTO TABLE mt_attri->*.
ENDMETHOD. ENDMETHOD.
METHOD diss_dref. METHOD diss_dref.
FIELD-SYMBOLS <deref> TYPE any. DATA(lr_ref) = z2ui5_cl_util=>unassign_data( ir_attri->r_ref ).
ASSIGN ir_attri->r_ref->* TO <deref>. IF lr_ref IS INITIAL.
IF <deref> IS INITIAL.
RETURN. RETURN.
ENDIF. ENDIF.
DATA(ls_attri2) = VALUE z2ui5_if_core_types=>ty_s_attri( ). DATA(ls_attri2) = VALUE z2ui5_if_core_types=>ty_s_attri( ).
ls_attri2-o_typedescr = cl_abap_datadescr=>describe_by_data_ref( <deref> ). ls_attri2-o_typedescr = cl_abap_datadescr=>describe_by_data_ref( lr_ref ).
ls_attri2-type_kind = z2ui5_cl_util=>rtti_get_type_kind_by_descr( ls_attri2-o_typedescr ). ls_attri2-type_kind = z2ui5_cl_util=>rtti_get_type_kind_by_descr( ls_attri2-o_typedescr ).
CASE ls_attri2-o_typedescr->type_kind. CASE ls_attri2-o_typedescr->type_kind.
WHEN cl_abap_datadescr=>typekind_struct1 OR WHEN cl_abap_datadescr=>typekind_struct1
cl_abap_datadescr=>typekind_struct2. OR cl_abap_datadescr=>typekind_struct2.
DATA(lt_attri) = diss_struc( ir_attri ). DATA(lt_attri) = diss_struc( ir_attri ).
INSERT LINES OF lt_attri INTO TABLE result. INSERT LINES OF lt_attri INTO TABLE result.
WHEN OTHERS. WHEN OTHERS.
ls_attri2-name = ir_attri->name && `->*`.
ls_attri2-r_ref = attri_get_val_ref( ls_attri2-name ).
ls_attri2-name = ir_attri->name && `->*`.
ls_attri2-r_ref = attri_get_val_ref( ls_attri2-name ).
INSERT ls_attri2 INTO TABLE result. INSERT ls_attri2 INTO TABLE result.
ENDCASE. ENDCASE.
ENDMETHOD. ENDMETHOD.
METHOD diss_oref. METHOD diss_oref.
IF z2ui5_cl_util=>check_unassign_inital( ir_attri->r_ref ). IF z2ui5_cl_util=>check_unassign_inital( ir_attri->r_ref ).
RETURN. RETURN.
ENDIF. ENDIF.
DATA(lt_attri) = z2ui5_cl_util=>rtti_get_t_attri_by_oref( DATA(lv_name) = COND #( WHEN ir_attri->name IS NOT INITIAL THEN ir_attri->name && `->` ).
z2ui5_cl_util=>unassign_object( ir_attri->r_ref ) ).
DATA(lr_ref) = z2ui5_cl_util=>unassign_object( ir_attri->r_ref ).
DATA(lt_attri) = z2ui5_cl_util=>rtti_get_t_attri_by_oref( lr_ref ).
LOOP AT lt_attri REFERENCE INTO DATA(lr_attri) LOOP AT lt_attri REFERENCE INTO DATA(lr_attri)
WHERE visibility = cl_abap_objectdescr=>public WHERE visibility = cl_abap_objectdescr=>public
AND is_interface = abap_false AND is_interface = abap_false
AND is_constant = abap_false. AND is_constant = abap_false.
TRY. TRY.
DATA(lv_name) = COND #( WHEN ir_attri->name IS NOT INITIAL THEN ir_attri->name && `->` ). DATA(ls_new) = get_new_attri( lv_name && lr_attri->name ).
lv_name = lv_name && lr_attri->name. INSERT ls_new INTO TABLE result.
DATA(ls_attri2) = VALUE z2ui5_if_core_types=>ty_s_attri( ).
ls_attri2-name = lv_name.
ls_attri2-r_ref = attri_get_val_ref( ls_attri2-name ).
ls_attri2-o_typedescr = cl_abap_datadescr=>describe_by_data_ref( ls_attri2-r_ref ).
ls_attri2-type_kind = z2ui5_cl_util=>rtti_get_type_kind_by_descr( ls_attri2-o_typedescr ).
INSERT ls_attri2 INTO TABLE result.
CATCH cx_root. CATCH cx_root.
ENDTRY. ENDTRY.
@ -254,43 +276,51 @@ CLASS z2ui5_cl_core_model_srv IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD diss_struc. METHOD diss_struc.
FIELD-SYMBOLS <any> TYPE any.
CASE ir_attri->type_kind. IF ir_attri->type_kind = cl_abap_typedescr=>typekind_dref.
WHEN cl_abap_typedescr=>typekind_struct1 DATA(lv_name) = ir_attri->name && `->`.
OR cl_abap_typedescr=>typekind_struct2. DATA(lr_ref) = z2ui5_cl_util=>unassign_data( ir_attri->r_ref ).
DATA(lv_name) = ir_attri->name && `-`. ELSE.
ASSIGN ir_attri->r_ref TO <any>. lv_name = ir_attri->name && `-`.
WHEN cl_abap_typedescr=>typekind_dref. lr_ref = ir_attri->r_ref.
lv_name = ir_attri->name && `->`. ENDIF.
ASSIGN ir_attri->r_ref->* TO <any>.
ENDCASE.
DATA(lt_attri) = z2ui5_cl_util=>rtti_get_t_attri_by_struc( lr_ref ).
DATA(lt_attri) = z2ui5_cl_util=>rtti_get_t_attri_by_struc( <any> ).
LOOP AT lt_attri INTO DATA(ls_attri). LOOP AT lt_attri INTO DATA(ls_attri).
DATA(ls_new) = get_new_attri( lv_name && ls_attri-name ).
DATA(ls_attri2) = VALUE z2ui5_if_core_types=>ty_s_attri( ). INSERT ls_new INTO TABLE result.
ls_attri2-name = lv_name && ls_attri-name.
ls_attri2-r_ref = attri_get_val_ref( lv_name && ls_attri-name ).
ls_attri2-o_typedescr = cl_abap_datadescr=>describe_by_data_ref( ls_attri2-r_ref ).
ls_attri2-type_kind = z2ui5_cl_util=>rtti_get_type_kind_by_descr( ls_attri2-o_typedescr ).
INSERT ls_attri2 INTO TABLE result.
ENDLOOP. ENDLOOP.
ENDMETHOD. ENDMETHOD.
METHOD dissolve_init. METHOD search_attribute.
DATA(ls_attri) = VALUE z2ui5_if_core_types=>ty_s_attri( r_ref = REF #( mo_app ) ). * result = REF #( mt_attri->*[ r_ref = val ] OPTIONAL ).
DATA(lt_init) = diss_oref( REF #( ls_attri ) ).
INSERT LINES OF lt_init INTO TABLE mt_attri->*. LOOP AT mt_attri->* REFERENCE INTO DATA(lr_attri)
WHERE type_kind <> cl_abap_typedescr=>typekind_dref
AND type_kind <> cl_abap_typedescr=>typekind_oref.
IF lr_attri->r_ref = val.
result = lr_attri.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD get_new_attri.
result = VALUE z2ui5_if_core_types=>ty_s_attri( ).
result-name = name.
result-r_ref = attri_get_val_ref( name ).
result-o_typedescr = cl_abap_datadescr=>describe_by_data_ref( result-r_ref ).
result-type_kind = z2ui5_cl_util=>rtti_get_type_kind_by_descr( result-o_typedescr ).
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -34,25 +34,46 @@ CLASS ltcl_test_dissolve DEFINITION FINAL FOR TESTING
METHODS test_dissolve_struc FOR TESTING RAISING cx_static_check. METHODS test_dissolve_struc FOR TESTING RAISING cx_static_check.
METHODS test_dissolve_dref FOR TESTING RAISING cx_static_check. METHODS test_dissolve_dref FOR TESTING RAISING cx_static_check.
METHODS test_dissolve_oref FOR TESTING RAISING cx_static_check. METHODS test_dissolve_oref FOR TESTING RAISING cx_static_check.
METHODS test_ref FOR TESTING RAISING cx_static_check.
ENDCLASS. ENDCLASS.
CLASS ltcl_test_dissolve IMPLEMENTATION. CLASS ltcl_test_dissolve IMPLEMENTATION.
METHOD test_ref.
DATA(lo_app) = NEW ltcl_test_dissolve( ).
DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri.
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri )
app = lo_app ).
lo_model->dissolve( ).
DATA(ls_attri) = lt_attri[ name = `MV_VALUE` ].
GET REFERENCE OF lo_app->mv_value INTO DATA(lr_ref).
IF ls_attri-r_ref <> lr_ref.
cl_abap_unit_assert=>abort( ).
ENDIF.
ENDMETHOD.
METHOD test_dissolve_init. METHOD test_dissolve_init.
DATA(lo_app) = NEW ltcl_test_dissolve( ). DATA(lo_app) = NEW ltcl_test_dissolve( ).
DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri. DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri.
DATA(lo_bind) = NEW z2ui5_cl_core_model_srv( DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri ) attri = REF #( lt_attri )
app = lo_app ). app = lo_app ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MR_STRUC` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MR_STRUC` ] OPTIONAL ) ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MR_VALUE` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MR_VALUE` ] OPTIONAL ) ).
@ -68,15 +89,15 @@ CLASS ltcl_test_dissolve IMPLEMENTATION.
CREATE DATA lo_app->mr_value TYPE string. CREATE DATA lo_app->mr_value TYPE string.
DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri. DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri.
DATA(lo_bind) = NEW z2ui5_cl_core_model_srv( DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri ) attri = REF #( lt_attri )
app = lo_app ). app = lo_app ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MR_VALUE->*` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MR_VALUE->*` ] OPTIONAL ) ).
@ -93,14 +114,14 @@ CLASS ltcl_test_dissolve IMPLEMENTATION.
CREATE DATA lo_app->mo_app->mr_value TYPE string. CREATE DATA lo_app->mo_app->mr_value TYPE string.
DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri. DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri.
DATA(lo_bind) = NEW z2ui5_cl_core_model_srv( DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri ) attri = REF #( lt_attri )
app = lo_app2 ). app = lo_app2 ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MO_APP->MV_VALUE` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MO_APP->MV_VALUE` ] OPTIONAL ) ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MO_APP->MR_STRUC` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MO_APP->MR_STRUC` ] OPTIONAL ) ).
@ -113,15 +134,15 @@ CLASS ltcl_test_dissolve IMPLEMENTATION.
DATA(lo_app) = NEW ltcl_test_dissolve( ). DATA(lo_app) = NEW ltcl_test_dissolve( ).
DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri. DATA lt_attri TYPE z2ui5_if_core_types=>ty_t_attri.
DATA(lo_bind) = NEW z2ui5_cl_core_model_srv( DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri ) attri = REF #( lt_attri )
app = lo_app ). app = lo_app ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
lo_bind->dissolve( ). lo_model->dissolve( ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MS_STRUC-INPUT` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MS_STRUC-INPUT` ] OPTIONAL ) ).
cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MS_STRUC-S_02-INPUT` ] OPTIONAL ) ). cl_abap_unit_assert=>assert_not_initial( VALUE #( lt_attri[ name = `MS_STRUC-S_02-INPUT` ] OPTIONAL ) ).
@ -130,3 +151,107 @@ CLASS ltcl_test_dissolve IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.
CLASS ltcl_test_app2 DEFINITION FINAL FOR TESTING
DURATION MEDIUM
RISK LEVEL HARMLESS.
PUBLIC SECTION.
DATA mv_value TYPE string ##NEEDED.
DATA mr_value TYPE REF TO data.
DATA mr_value2 TYPE REF TO data.
DATA mo_app TYPE REF TO ltcl_test_app2.
DATA xx TYPE string ##NEEDED.
METHODS constructor.
ENDCLASS.
CLASS ltcl_test_app2 IMPLEMENTATION.
METHOD constructor.
ENDMETHOD.
ENDCLASS.
CLASS ltcl_test_search_attri DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS first_test FOR TESTING RAISING cx_static_check.
METHODS second_test FOR TESTING RAISING cx_static_check.
METHODS third_test FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS z2ui5_cl_core_model_srv DEFINITION LOCAL FRIENDS ltcl_test_search_attri.
CLASS ltcl_test_search_attri IMPLEMENTATION.
METHOD first_test.
DATA(lo_app_client) = NEW ltcl_test_app2( ).
DATA lr_value TYPE REF TO data.
GET REFERENCE OF lo_app_client->mv_value INTO lr_value.
DATA(lt_attri) = VALUE z2ui5_if_core_types=>ty_t_attri( ( r_ref = lr_value ) ).
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri )
app = lo_app_client ).
DATA(lr_attri) = lo_model->search_a_dissolve_attribute( REF #( lo_app_client->mv_value ) ).
IF lr_attri->r_ref <> lr_value.
cl_abap_unit_assert=>abort( ).
ENDIF.
ENDMETHOD.
METHOD second_test.
DATA(lo_app_client) = NEW ltcl_test_app2( ).
DATA lr_value TYPE REF TO data.
GET REFERENCE OF lo_app_client->mv_value INTO lr_value.
DATA(lt_attri) = VALUE z2ui5_if_core_types=>ty_t_attri( ( r_ref = REF #( lo_app_client->mv_value ) ) ).
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( lt_attri )
app = lo_app_client ).
DATA(lr_attri) = lo_model->search_a_dissolve_attribute( REF #( lo_app_client->mv_value ) ).
IF lr_attri->r_ref <> lr_value.
cl_abap_unit_assert=>abort( ).
ENDIF.
ENDMETHOD.
METHOD third_test.
DATA(lo_app_client) = NEW ltcl_test_app2( ).
DATA lr_value TYPE REF TO data.
GET REFERENCE OF lo_app_client->mv_value INTO lr_value.
lo_app_client->mo_app = NEW #( ).
DATA(lt_attri) = VALUE z2ui5_if_core_types=>ty_t_attri(
( name = `1` r_ref = REF #( lo_app_client->mr_value ) )
( name = `4` r_ref = REF #( lo_app_client->mr_value2 ) )
( name = `2` r_ref = REF #( lo_app_client->mo_app ) )
( name = `3` r_ref = REF #( lo_app_client->mv_value ) )
).
DATA(lr_attri) = REF #( lt_attri[ r_ref = lr_value ] ).
IF lr_attri->r_ref <> lr_value.
cl_abap_unit_assert=>abort( ).
ENDIF.
ENDMETHOD.
ENDCLASS.

View File

@ -42,6 +42,11 @@ CLASS z2ui5_cl_core_action DEFINITION
val TYPE REF TO z2ui5_cl_core_http_post. val TYPE REF TO z2ui5_cl_core_http_post.
PROTECTED SECTION. PROTECTED SECTION.
METHODS prepare_app_stack
IMPORTING
val TYPE z2ui5_if_core_types=>ty_s_next-o_app_leave
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_core_action.
PRIVATE SECTION. PRIVATE SECTION.
ENDCLASS. ENDCLASS.
@ -68,8 +73,8 @@ CLASS z2ui5_cl_core_action IMPLEMENTATION.
result->ms_actual-view = mo_http_post->ms_request-s_front-view. result->ms_actual-view = mo_http_post->ms_request-s_front-view.
result->mo_app->model_json_parse( result->mo_app->model_json_parse(
view = mo_http_post->ms_request-s_front-view iv_view = mo_http_post->ms_request-s_front-view
io_json_model = mo_http_post->ms_request-o_model ). io_model = mo_http_post->ms_request-o_model ).
result->ms_actual-event = mo_http_post->ms_request-s_front-event. result->ms_actual-event = mo_http_post->ms_request-s_front-event.
result->ms_actual-t_event_arg = mo_http_post->ms_request-s_front-t_event_arg. result->ms_actual-t_event_arg = mo_http_post->ms_request-s_front-t_event_arg.
@ -103,27 +108,7 @@ CLASS z2ui5_cl_core_action IMPLEMENTATION.
METHOD factory_stack_call. METHOD factory_stack_call.
mo_app->db_save( ). result = prepare_app_stack( ms_next-o_app_call ).
ms_next-o_app_call->id_draft = COND string(
WHEN ms_next-o_app_call->id_draft IS INITIAL THEN z2ui5_cl_util=>uuid_get_c32( )
ELSE ms_next-o_app_call->id_draft ).
result = NEW #( mo_http_post ).
result->mo_app->mo_app = ms_next-o_app_call.
result->mo_app->ms_draft-id = ms_next-o_app_call->id_draft.
result->mo_app->ms_draft-id_prev = mo_app->ms_draft-id.
result->mo_app->ms_draft-id_prev_app = mo_app->ms_draft-id.
result->ms_actual-check_on_navigated = abap_true.
result->ms_next-s_set = ms_next-s_set.
TRY.
DATA(lo_app) = z2ui5_cl_core_app=>db_load( ms_next-o_app_call->id_draft ).
result->mo_app = lo_app.
result->mo_app->mo_app = ms_next-o_app_leave.
CATCH cx_root.
ENDTRY.
result->mo_app->ms_draft-id_prev_app_stack = mo_app->ms_draft-id. result->mo_app->ms_draft-id_prev_app_stack = mo_app->ms_draft-id.
ENDMETHOD. ENDMETHOD.
@ -131,35 +116,7 @@ CLASS z2ui5_cl_core_action IMPLEMENTATION.
METHOD factory_stack_leave. METHOD factory_stack_leave.
mo_app->db_save( ). result = prepare_app_stack( ms_next-o_app_leave ).
ms_next-o_app_leave->id_draft = COND string(
WHEN ms_next-o_app_leave->id_draft IS INITIAL THEN z2ui5_cl_util=>uuid_get_c32( )
ELSE ms_next-o_app_leave->id_draft ).
result = NEW #( mo_http_post ).
result->mo_app->mo_app = ms_next-o_app_leave.
TRY.
DATA(lo_app) = z2ui5_cl_core_app=>db_load( ms_next-o_app_leave->id_draft ).
result->mo_app = lo_app.
result->mo_app->mo_app = ms_next-o_app_leave.
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( result->mo_app->mt_attri )
app = result->mo_app->mo_app ).
lo_model->attri_refs_update( ).
CATCH cx_root.
ENDTRY.
result->mo_app->ms_draft-id = ms_next-o_app_leave->id_draft.
result->mo_app->ms_draft-id_prev = mo_app->ms_draft-id.
result->mo_app->ms_draft-id_prev_app = mo_app->ms_draft-id.
result->ms_actual-check_on_navigated = abap_true.
result->ms_next-s_set = ms_next-s_set.
ENDMETHOD. ENDMETHOD.
@ -189,4 +146,28 @@ CLASS z2ui5_cl_core_action IMPLEMENTATION.
li_app->id_draft = result->mo_app->ms_draft-id. li_app->id_draft = result->mo_app->ms_draft-id.
ENDMETHOD. ENDMETHOD.
METHOD prepare_app_stack.
mo_app->db_save( ).
val->id_draft = COND string( WHEN val->id_draft IS INITIAL
THEN z2ui5_cl_util=>uuid_get_c32( )
ELSE ms_next-o_app_leave->id_draft ).
result = NEW #( mo_http_post ).
TRY.
result->mo_app = z2ui5_cl_core_app=>db_load_by_app( val ).
CATCH cx_root.
result->mo_app->mo_app = val.
ENDTRY.
result->mo_app->ms_draft-id = val->id_draft.
result->mo_app->ms_draft-id_prev = mo_app->ms_draft-id.
result->mo_app->ms_draft-id_prev_app = mo_app->ms_draft-id.
result->ms_actual-check_on_navigated = abap_true.
result->ms_next-s_set = ms_next-s_set.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -7,6 +7,7 @@ CLASS ltcl_test DEFINITION FINAL FOR TESTING
first_test FOR TESTING RAISING cx_static_check. first_test FOR TESTING RAISING cx_static_check.
ENDCLASS. ENDCLASS.
CLASS z2ui5_cl_core_action DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test IMPLEMENTATION. CLASS ltcl_test IMPLEMENTATION.

View File

@ -5,17 +5,11 @@ CLASS z2ui5_cl_core_app DEFINITION
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES if_serializable_object . INTERFACES if_serializable_object.
DATA mt_attri TYPE z2ui5_if_core_types=>ty_t_attri . DATA mt_attri TYPE z2ui5_if_core_types=>ty_t_attri.
DATA mo_app TYPE REF TO object . DATA mo_app TYPE REF TO object.
DATA ms_draft TYPE z2ui5_if_types=>ty_s_get-s_draft . DATA ms_draft TYPE z2ui5_if_types=>ty_s_get-s_draft.
METHODS attri_get_by_data
IMPORTING
!val TYPE REF TO data
RETURNING
VALUE(result) TYPE REF TO z2ui5_if_core_types=>ty_s_attri .
METHODS model_json_stringify METHODS model_json_stringify
RETURNING RETURNING
@ -23,24 +17,30 @@ CLASS z2ui5_cl_core_app DEFINITION
METHODS model_json_parse METHODS model_json_parse
IMPORTING IMPORTING
!view TYPE string !iv_view TYPE string
!io_json_model TYPE REF TO z2ui5_if_ajson . !io_model TYPE REF TO z2ui5_if_ajson.
METHODS all_xml_stringify METHODS all_xml_stringify
RETURNING RETURNING
VALUE(result) TYPE string . VALUE(result) TYPE string.
CLASS-METHODS all_xml_parse CLASS-METHODS all_xml_parse
IMPORTING IMPORTING
!val TYPE string !xml TYPE string
RETURNING RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_core_app . VALUE(result) TYPE REF TO z2ui5_cl_core_app.
CLASS-METHODS db_load CLASS-METHODS db_load
IMPORTING IMPORTING
!id TYPE string !id TYPE string
RETURNING RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_core_app . VALUE(result) TYPE REF TO z2ui5_cl_core_app.
CLASS-METHODS db_load_by_app
IMPORTING
app TYPE REF TO z2ui5_if_app
RETURNING
VALUE(result) TYPE REF TO z2ui5_cl_core_app.
METHODS db_save. METHODS db_save.
@ -57,16 +57,10 @@ CLASS z2ui5_cl_core_app IMPLEMENTATION.
z2ui5_cl_util=>xml_parse( z2ui5_cl_util=>xml_parse(
EXPORTING EXPORTING
xml = val xml = xml
IMPORTING IMPORTING
any = result ). any = result ).
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( result->mt_attri )
app = result->mo_app ).
lo_model->attri_after_load( ).
ENDMETHOD. ENDMETHOD.
@ -76,7 +70,7 @@ CLASS z2ui5_cl_core_app IMPLEMENTATION.
DATA(lo_model) = NEW z2ui5_cl_core_model_srv( DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( mt_attri ) attri = REF #( mt_attri )
app = me->mo_app ). app = mo_app ).
lo_model->attri_before_save( ). lo_model->attri_before_save( ).
result = z2ui5_cl_util=>xml_stringify( me ). result = z2ui5_cl_util=>xml_stringify( me ).
@ -92,49 +86,40 @@ CLASS z2ui5_cl_core_app IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD attri_get_by_data.
TRY.
result = REF #( mt_attri[ r_ref = val ] ).
RETURN.
CATCH cx_root.
ENDTRY.
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( mt_attri )
app = mo_app ).
DO 5 TIMES.
lo_model->dissolve( ).
TRY.
result = REF #( mt_attri[ r_ref = val ] ).
RETURN.
CATCH cx_root.
ENDTRY.
ENDDO.
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 or switch to bind_local`.
ENDMETHOD.
METHOD db_load. METHOD db_load.
DATA(lo_db) = NEW z2ui5_cl_core_draft_srv( ). DATA(lo_db) = NEW z2ui5_cl_core_draft_srv( ).
DATA(ls_db) = lo_db->read_draft( id ). DATA(ls_db) = lo_db->read_draft( id ).
result = all_xml_parse( ls_db-data ). result = all_xml_parse( ls_db-data ).
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( result->mt_attri )
app = result->mo_app ).
lo_model->attri_after_load( ).
ENDMETHOD.
METHOD db_load_by_app.
DATA(lo_db) = NEW z2ui5_cl_core_draft_srv( ).
DATA(ls_db) = lo_db->read_draft( app->id_draft ).
result = all_xml_parse( ls_db-data ).
result->mo_app = app.
DATA(lo_model) = NEW z2ui5_cl_core_model_srv(
attri = REF #( result->mt_attri )
app = result->mo_app ).
lo_model->attri_refs_update( ).
ENDMETHOD. ENDMETHOD.
METHOD db_save. METHOD db_save.
IF mo_app IS BOUND. IF mo_app IS BOUND.
CAST z2ui5_if_app( mo_app )->id_draft = ms_draft-id. CAST z2ui5_if_app( mo_app )->id_draft = ms_draft-id.
ENDIF. ENDIF.
@ -151,9 +136,9 @@ CLASS z2ui5_cl_core_app IMPLEMENTATION.
DATA(lo_json_mapper) = NEW z2ui5_cl_core_json_srv( ). DATA(lo_json_mapper) = NEW z2ui5_cl_core_json_srv( ).
lo_json_mapper->model_client_to_server( lo_json_mapper->model_client_to_server(
view = view view = iv_view
t_attri = REF #( mt_attri ) t_attri = REF #( mt_attri )
model = io_json_model ). model = io_model ).
ENDMETHOD. ENDMETHOD.

View File

@ -0,0 +1,20 @@
CLASS ltcl_test DEFINITION FINAL FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS:
first_test FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS z2ui5_cl_core_app DEFINITION LOCAL FRIENDS ltcl_test.
CLASS ltcl_test IMPLEMENTATION.
METHOD first_test.
DATA(lo_action) = NEW z2ui5_cl_core_app( ) ##NEEDED.
ENDMETHOD.
ENDCLASS.

View File

@ -10,6 +10,7 @@
<CLSCCINCL>X</CLSCCINCL> <CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT> <FIXPT>X</FIXPT>
<UNICODE>X</UNICODE> <UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS> </VSEOCLASS>
</asx:values> </asx:values>
</asx:abap> </asx:abap>

View File

@ -299,7 +299,9 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
` return;` && |\n| && ` return;` && |\n| &&
` }` && |\n| && ` }` && |\n| &&
` BusyIndicator.show();` && |\n| && ` BusyIndicator.show();` && |\n| &&
` let appStart = sap.z2ui5.oBody.APP_START;` && |\n| &&
` sap.z2ui5.oBody = {};` && |\n| && ` sap.z2ui5.oBody = {};` && |\n| &&
` sap.z2ui5.oBody.APP_START = appStart;` && |\n| &&
` if ( sap.z2ui5.oController == this ) {` && |\n| && ` if ( sap.z2ui5.oController == this ) {` && |\n| &&
` sap.z2ui5.oBody.XX = sap.z2ui5.oView.getModel().getData().XX;` && |\n| && ` sap.z2ui5.oBody.XX = sap.z2ui5.oView.getModel().getData().XX;` && |\n| &&
` sap.z2ui5.oBody.VIEWNAME = 'MAIN';` && |\n| && ` sap.z2ui5.oBody.VIEWNAME = 'MAIN';` && |\n| &&
@ -405,6 +407,7 @@ CLASS z2ui5_cl_core_http_get IMPLEMENTATION.
` } else {` && |\n| && ` } else {` && |\n| &&
` const responseData = await response.json();` && |\n| && ` const responseData = await response.json();` && |\n| &&
` sap.z2ui5.responseData = responseData;` && |\n| && ` sap.z2ui5.responseData = responseData;` && |\n| &&
` if( !sap.z2ui5.oBody.APP_START ) { sap.z2ui5.oBody.APP_START = sap.z2ui5.responseData.S_FRONT.APP; }` && |\n| &&
` sap.z2ui5.oController.responseSuccess({` && |\n| && ` sap.z2ui5.oController.responseSuccess({` && |\n| &&
` ID : responseData.S_FRONT.ID,` && |\n| && ` ID : responseData.S_FRONT.ID,` && |\n| &&
` PARAMS : responseData.S_FRONT.PARAMS,` && |\n| && ` PARAMS : responseData.S_FRONT.PARAMS,` && |\n| &&

View File

@ -33,75 +33,3 @@ CLASS ltcl_test_handler_post IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.
*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

@ -32,15 +32,10 @@ INTERFACE z2ui5_if_core_types
name TYPE string, name TYPE string,
name_client TYPE string, name_client TYPE string,
type_kind TYPE string, type_kind TYPE string,
type TYPE string,
bind_type TYPE string, bind_type TYPE string,
data_stringify TYPE string,
data_rtti TYPE string, data_rtti TYPE string,
check_ready TYPE abap_bool,
check_dissolved TYPE abap_bool, check_dissolved TYPE abap_bool,
check_temp TYPE abap_bool,
view TYPE string, view TYPE string,
depth TYPE i,
json_bind_local TYPE REF TO z2ui5_if_ajson, json_bind_local TYPE REF TO z2ui5_if_ajson,
custom_filter TYPE REF TO z2ui5_if_ajson_filter, custom_filter TYPE REF TO z2ui5_if_ajson_filter,
custom_filter_back TYPE REF TO z2ui5_if_ajson_filter, custom_filter_back TYPE REF TO z2ui5_if_ajson_filter,
@ -48,7 +43,6 @@ INTERFACE z2ui5_if_core_types
custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping, custom_mapper_back TYPE REF TO z2ui5_if_ajson_mapping,
r_ref TYPE REF TO data, r_ref TYPE REF TO data,
o_typedescr type ref to cl_abap_typedescr, o_typedescr type ref to cl_abap_typedescr,
s_rtti_descr type abap_componentdescr,
END OF ty_s_attri. END OF ty_s_attri.
TYPES ty_t_attri TYPE SORTED TABLE OF ty_s_attri WITH UNIQUE KEY name. TYPES ty_t_attri TYPE SORTED TABLE OF ty_s_attri WITH UNIQUE KEY name.

View File

@ -43,10 +43,14 @@ CLASS z2ui5_cl_core_app_info IMPLEMENTATION.
METHOD view_display_start. METHOD view_display_start.
DATA(page2) = z2ui5_cl_xml_view=>factory( )->shell( )->page( DATA(page2) = z2ui5_cl_xml_view=>factory_popup(
shownavbutton = abap_false ). )->dialog(
stretch = abap_true
title = `abap2UI5 - System Information`
afterclose = client->_event( `CLOSE` )
).
page2->header_content( )->text( )->title( `abap2UI5 - System Information` )->toolbar_spacer( ). * page2->header_content( )->text( )->title( `abap2UI5 - System Information` )->toolbar_spacer( ).
page2->_z2ui5( )->info_frontend( page2->_z2ui5( )->info_frontend(
* device_browser = client->_bind( mv_device_browser ) * device_browser = client->_bind( mv_device_browser )
@ -93,14 +97,21 @@ CLASS z2ui5_cl_core_app_info IMPLEMENTATION.
simple_form2->label( `ABAP for Cloud` ). simple_form2->label( `ABAP for Cloud` ).
simple_form2->checkbox( enabled = abap_false selected = z2ui5_cl_util=>rtti_check_lang_version_cloud( ) ). simple_form2->checkbox( enabled = abap_false selected = z2ui5_cl_util=>rtti_check_lang_version_cloud( ) ).
data(lv_count) = conv string( new z2ui5_cl_core_draft_srv( )->count( ) ). DATA(lv_count) = CONV string( NEW z2ui5_cl_core_draft_srv( )->count( ) ).
simple_form2->toolbar( )->title( `abap2UI5` ). simple_form2->toolbar( )->title( `abap2UI5` ).
simple_form2->label( `Version ` ). simple_form2->label( `Version ` ).
simple_form2->text( z2ui5_if_app=>version ). simple_form2->text( z2ui5_if_app=>version ).
simple_form2->label( `Draft Entries ` ). simple_form2->label( `Draft Entries ` ).
simple_form2->text( lv_count ). simple_form2->text( lv_count ).
client->view_display( page2->stringify( ) ). page2->footer( )->overflow_toolbar(
)->toolbar_spacer(
)->button(
text = 'close'
press = client->_event( 'CLOSE' )
type = 'Emphasized' ).
client->popup_display( page2->stringify( ) ).
ENDMETHOD. ENDMETHOD.
@ -122,13 +133,20 @@ CLASS z2ui5_cl_core_app_info IMPLEMENTATION.
ENDIF. ENDIF.
z2ui5_on_event( ). z2ui5_on_event( ).
view_display_start( ). * view_display_start( ).
ENDMETHOD. ENDMETHOD.
METHOD z2ui5_on_event. METHOD z2ui5_on_event.
CASE client->get( )-event.
WHEN `CLOSE`.
client->popup_destroy( ).
client->nav_app_leave( client->get_app( client->get( )-s_draft-id_prev_app_stack ) ).
ENDCASE.
ENDMETHOD. ENDMETHOD.

View File

@ -80,17 +80,18 @@ CLASS z2ui5_cl_core_app_startup IMPLEMENTATION.
shownavbutton = abap_false ). shownavbutton = abap_false ).
DATA(lv_url_info) = z2ui5_cl_util=>app_get_url( * DATA(lv_url_info) = z2ui5_cl_util=>app_get_url(
client = client * client = client
classname = 'z2ui5_cl_core_app_info' ). * classname = 'z2ui5_cl_core_app_info' ).
page2->header_content( page2->header_content(
)->text( )->text(
)->title( `abap2UI5 - Developing UI5 Apps Purely in ABAP` )->title( `abap2UI5 - Developing UI5 Apps Purely in ABAP`
)->toolbar_spacer( )->toolbar_spacer(
)->button( text = `System` icon = `sap-icon://information` )->button( text = `System` icon = `sap-icon://information`
press = client->_event_client( val = client->cs_event-open_new_tab press = client->_event( `OPEN_INFO` ) ).
t_arg = VALUE #( ( lv_url_info ) ) ) ). * press = client->_event_client( val = client->cs_event-open_new_tab
* t_arg = VALUE #( ( lv_url_info ) ) ) ).
DATA(simple_form2) = page2->simple_form( DATA(simple_form2) = page2->simple_form(
editable = abap_true editable = abap_true
@ -238,6 +239,10 @@ CLASS z2ui5_cl_core_app_startup IMPLEMENTATION.
CASE client->get( )-event. CASE client->get( )-event.
WHEN `OPEN_INFO`.
client->nav_app_call( z2ui5_cl_core_app_info=>factory( ) ).
RETURN.
WHEN `BUTTON_CHECK`. WHEN `BUTTON_CHECK`.
IF ms_home-class_editable = abap_false. IF ms_home-class_editable = abap_false.
ms_home-btn_text = `check`. ms_home-btn_text = `check`.

View File

@ -54,7 +54,7 @@ CLASS Z2UI5_CL_POPUP_FILE_DOWNLOAD IMPLEMENTATION.
r_result->button_text_confirm = i_button_text_confirm. r_result->button_text_confirm = i_button_text_confirm.
r_result->button_text_cancel = i_button_text_cancel. r_result->button_text_cancel = i_button_text_cancel.
r_result->mv_value = i_file. r_result->mv_value = i_file.
r_result->mv_size = CONV i( strlen( i_file ) / 1000 ). r_result->mv_size = strlen( i_file ) / 1000.
ENDMETHOD. ENDMETHOD.