diff --git a/src/package.devc.xml b/src/package.devc.xml new file mode 100644 index 0000000..968c3f3 --- /dev/null +++ b/src/package.devc.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DEVC> + <CTEXT>RAP Generator</CTEXT> + </DEVC> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_bp_rapg_all.clas.abap b/src/zdmo_bp_rapg_all.clas.abap new file mode 100644 index 0000000..99f8f61 --- /dev/null +++ b/src/zdmo_bp_rapg_all.clas.abap @@ -0,0 +1,25 @@ +CLASS zdmo_bp_rapg_all DEFINITION +PUBLIC +ABSTRACT +FINAL FOR BEHAVIOR OF zdmo_r_rapg_projecttp. + + PUBLIC SECTION. + + TYPES: BEGIN OF t_rap_bo_node, + uuid TYPE sysuuid_x16, + node TYPE REF TO zdmo_cl_rap_node, + END OF t_rap_bo_node. + + TYPES t_rap_bo_nodes TYPE STANDARD TABLE OF t_rap_bo_node. + + CLASS-DATA rap_bo_nodes TYPE t_rap_bo_nodes READ-ONLY. + + PROTECTED SECTION. + PRIVATE SECTION. + +ENDCLASS. + + + +CLASS ZDMO_BP_RAPG_ALL IMPLEMENTATION. +ENDCLASS. diff --git a/src/zdmo_bp_rapg_all.clas.locals_imp.abap b/src/zdmo_bp_rapg_all.clas.locals_imp.abap new file mode 100644 index 0000000..23163f8 --- /dev/null +++ b/src/zdmo_bp_rapg_all.clas.locals_imp.abap @@ -0,0 +1,2971 @@ +CLASS lhc_Project DEFINITION INHERITING FROM cl_abap_behavior_handler. + PRIVATE SECTION. + + METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION + IMPORTING REQUEST requested_authorizations FOR Project RESULT result. + + METHODS createProjectAndRootNode FOR MODIFY + IMPORTING keys FOR ACTION Project~createProjectAndRootNode RESULT result. + + METHODS CalculateBoName FOR DETERMINE ON SAVE + IMPORTING keys FOR Project~CalculateBoName. + METHODS get_instance_features FOR INSTANCE FEATURES + IMPORTING keys REQUEST requested_features FOR Project RESULT result. + + METHODS copyProject FOR MODIFY + IMPORTING keys FOR ACTION Project~copyProject RESULT result. + + METHODS deleteProject FOR MODIFY + IMPORTING keys FOR ACTION Project~deleteProject RESULT result. + + METHODS generateProject FOR MODIFY + IMPORTING keys FOR ACTION Project~generateProject RESULT result. + + METHODS SetRepositoryObjectNames FOR DETERMINE ON MODIFY + IMPORTING keys FOR Project~SetRepositoryObjectNames. + METHODS createJsonString FOR DETERMINE ON SAVE + IMPORTING keys FOR Project~createJsonString. + METHODS generated_objects_are_deleted FOR VALIDATE ON SAVE + IMPORTING keys FOR Project~generated_objects_are_deleted. + METHODS mandatory_fields_check FOR VALIDATE ON SAVE + IMPORTING keys FOR Project~mandatory_fields_check. + METHODS is_customizing_table FOR VALIDATE ON SAVE + IMPORTING keys FOR Project~is_customizing_table. + METHODS check_for_allowed_combinations FOR VALIDATE ON SAVE + IMPORTING keys FOR Project~check_for_allowed_combinations. + METHODS rap_gen_project_objects_exist + IMPORTING + i_rap_generator_project TYPE ZDMO_R_RAPG_ProjectTP + RETURNING + VALUE(r_repository_objects_exist) TYPE abap_bool. +ENDCLASS. + +CLASS lhc_Project IMPLEMENTATION. + + METHOD get_global_authorizations. + ENDMETHOD. + + METHOD createProjectAndRootNode. + + CONSTANTS mycid_rapbonode TYPE abp_behv_cid VALUE 'My%CID_rapbonode' ##NO_TEXT. + + DATA create_rapbonode_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node. + DATA create_rapbo TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP. + + DATA create_rapbonode_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node. + DATA create_rapbo_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP. + + DATA object_name TYPE if_xco_gen_o_finding=>tv_object_name . + DATA abap_object_directory_entry TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry . + DATA package_name TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry-ABAPPackage. + DATA object_type TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry-ABAPObjectType. + DATA object_category TYPE zdmo_cl_rap_xco_lib=>t_abap_obj_directory_entry-ABAPObjectCategory. + + DATA has_semantic_key TYPE abap_bool. + DATA is_managed TYPE abap_bool. + DATA does_not_use_unmanaged_query TYPE abap_bool. + + DATA(xco_lib) = zdmo_cl_rap_xco_lib=>create_xco_lib( ). + + + + +* IF xco_lib->on_premise_branch_is_used( ) = abap_true. +* DATA(abap_language_version) = zdmo_cl_rap_node=>abap_language_version-standard. +* ELSE. +* abap_language_version = zdmo_cl_rap_node=>abap_language_version-abap_for_cloud_development. +* ENDIF. + +* DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. +* DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). +** DATA(xco_cloud_library) = NEW zdmo_cl_rap_xco_cloud_lib( ). +* DATA(node) = NEW ZDMO_cl_rap_node( ). +* IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. +* xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). +* node->set_xco_lib( xco_lib ). +* DATA(abap_language_version) = zdmo_cl_rap_node=>abap_language_version-standard. +* ELSE. +* xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). +* node->set_xco_lib( xco_lib ). +* abap_language_version = zdmo_cl_rap_node=>abap_language_version-abap_for_cloud_development. +* ENDIF. + + + + LOOP AT keys INTO DATA(ls_key). + + TRY. + "dummy fix + DATA(node) = NEW ZDMO_cl_rap_node( xco_lib ) . + + "get package of datasource + + object_name = ls_key-%param-data_source_name. + + DATA(data_source_type) = ls_key-%param-DataSourceType. + + CASE data_source_type. + WHEN zdmo_cl_rap_node=>data_source_types-table. + object_category = 'TABL'. + object_type = 'R3TR'. + WHEN zdmo_cl_rap_node=>data_source_types-cds_view. + object_category = 'DDLS'. + object_type = 'R3TR'. + WHEN zdmo_cl_rap_node=>data_source_types-abstract_entity. + object_category = 'DDLS'. + object_type = 'R3TR'. + WHEN OTHERS. + "@todo raise exception + ENDCASE. + + xco_lib->get_abap_obj_directory_entry( + EXPORTING + i_abap_object_type = object_category + i_abap_object_category = object_type + i_abap_object = object_name + RECEIVING + r_abap_object_directory_entry = abap_object_directory_entry + ). + +* package_name = abap_object_directory_entry-ABAPPackage. + + package_name = ls_key-%param-package_name. + + "get transport request + node->set_package( package_name ). + node->set_namespace( ). +* node->set_transport_request( ). + + node->set_data_source_type( CONV #( ls_key-%param-DataSourceType ) ). + node->set_data_source( CONV #( ls_key-%param-data_source_name ) ). + "when table is set as a datasource the transport request that is locking + "a table should have been set. + IF node->transport_request IS INITIAL. + node->set_transport_request( ). + ENDIF. + + CATCH zdmo_cx_rap_generator INTO DATA(fill_node_object_exception). + APPEND VALUE #( %cid = ls_key-%cid ) TO failed-project. + APPEND VALUE #( %cid = ls_key-%cid +* %state_area = 'VALIDATE_QUANTITY' + %msg = new_message_with_text( + severity = if_abap_behv_message=>severity-error + text = fill_node_object_exception->get_text( ) ) + ) TO reported-project. + RETURN. + ENDTRY. + + IF ls_key-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity. + does_not_use_unmanaged_query = abap_false. + ELSE. + does_not_use_unmanaged_query = abap_true. + ENDIF. + + CASE ls_key-%param-BdefImplementationType. + WHEN zdmo_cl_rap_node=>bdef_implementation_type-managed. + is_managed = abap_true. + IF node->is_uuid_based( ). . + DATA(implementation_type) = zdmo_cl_rap_node=>implementation_type-managed_uuid. + ELSE. + implementation_type = zdmo_cl_rap_node=>implementation_type-managed_semantic. + has_semantic_key = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>bdef_implementation_type-unmanaged. + implementation_type = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic. + has_semantic_key = abap_true. + ENDCASE. + + "make sure that for abstract entities + +* DATA(fields) = node->lt_all_fields. + + DATA(package) = xco_lib->get_package( package_name ). + DATA(software_compontent) = package->read( )-property-software_component. + DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package_name ). + + CASE abap_language_version_number. + WHEN zdmo_cl_rap_node=>package_abap_language_version-standard. + DATA(abap_language_version) = zdmo_cl_rap_node=>abap_language_version-standard. + WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. + abap_language_version = zdmo_cl_rap_node=>abap_language_version-abap_for_cloud_development. + WHEN OTHERS. + "abap language version of package is not supported + ASSERT 1 = 2. + ENDCASE. + + create_rapbo_line = VALUE #( %is_draft = if_abap_behv=>mk-on + %cid = ls_key-%cid + rootentityname = ls_key-%param-EntityName + packagename = package_name + Namespace = node->namespace + abaplanguageversion = abap_language_version "ls_key-%param-language_version + PackageLanguageVersion = abap_language_version_number + draftenabled = ls_key-%param-DraftEnabled + isExtensible = ls_key-%param-isExtensible + implementationtype = implementation_type + datasourcetype = ls_key-%param-DataSourceType + BindingType = ls_key-%param-BindingType + TransportRequest = node->transport_request + "boolean fields to hide / show fields in the UI + AddIViewBasic = abap_false + AddSAPObjectType = abap_false + hasSematicKey = has_semantic_key + doesNotUseUnmanagedQuery = does_not_use_unmanaged_query + isManaged = is_managed + PublishService = abap_true + ). + + + create_rapbonode_cba_line = VALUE #( %is_draft = if_abap_behv=>mk-on + %cid_ref = ls_key-%cid + %target = VALUE #( ( + %is_draft = if_abap_behv=>mk-on + %cid = mycid_rapbonode + entityname = ls_key-%param-entityname + isrootnode = abap_true + DataSource = ls_key-%param-data_source_name + hierarchydistancefromroot = 0 + ) ) ) . + + IF create_rapbo_line-isExtensible = abap_true. + create_rapbo_line-AddSAPObjectType = abap_true. + ENDIF. + + APPEND create_rapbo_line TO create_rapbo. + APPEND create_rapbonode_cba_line TO create_rapbonode_cba. + + ENDLOOP. + + MODIFY ENTITIES OF zdmo_r_rapg_projecttp IN LOCAL MODE + ENTITY Project + CREATE FIELDS ( rootentityname packagename Namespace + abaplanguageversion PackageLanguageVersion + draftenabled isExtensible implementationtype datasourcetype bindingtype + hasSematicKey doesNotUseUnmanagedQuery isManaged + TransportRequest PublishService AddIViewBasic AddSAPObjectType ) + WITH create_rapbo + CREATE BY \_Node + FIELDS ( entityname isrootnode hierarchydistancefromroot DataSource ) + WITH create_rapbonode_cba + MAPPED mapped + FAILED failed + REPORTED reported. + + CHECK mapped-project[] IS NOT INITIAL. + + DATA test_key TYPE STRUCTURE FOR ACTION IMPORT zdmo_r_rapg_projecttp~check_allowed_combinations_det. + DATA test_keys TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp~check_allowed_combinations_det. + + + LOOP AT mapped-project INTO DATA(mapped_project). + APPEND VALUE #( %cid = ls_key-%cid + %param = VALUE #( %is_draft = mapped_project-%is_draft + %key = mapped_project-%key ) ) TO result. + test_key-RapBoUUID = mapped_project-RapBoUUID. + test_key-%is_draft = mapped_project-%is_draft. + APPEND test_key TO test_keys. + + ENDLOOP. + + +* MODIFY ENTITIES OF zdmo_r_rapg_projecttp IN LOCAL MODE +* ENTITY Project +* EXECUTE check_allowed_combinations_det +* FROM test_keys +* MAPPED mapped +* FAILED failed +* REPORTED reported. + +*"set values for node object in global class +* zdmo_bp_rapg_all=>rap_bo_nodes[ uuid = mapped-project[ 1 ]-%key-RapBoUUID +* +* DATA rap_bo_node TYPE zdmo_bp_rapg_all=>t_rap_bo_node. +* TRY. +* LOOP AT mapped-project INTO mapped_project. +* rap_bo_node-uuid = mapped_project-RapBoUUID. +* rap_bo_node-node = node. +* ENDLOOP. + + + + ENDMETHOD. + + METHOD CalculateBoName. + ENDMETHOD. + + METHOD get_instance_features. + + DATA rap_generator_project TYPE ZDMO_R_RAPG_ProjectTP. + DATA result_line LIKE LINE OF result . + DATA rap_gen_project_objects_exist TYPE abap_bool. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + LOOP AT rapbos INTO DATA(rapbo). + + MOVE-CORRESPONDING rapbo TO rap_generator_project. + +* DATA(rap_gen_project_objects_exist) = rap_gen_project_objects_exist( rap_generator_project ). + + + result_line-%tky = rapbo-%tky. + + "disable EDIT button when + " - repository objects have already been generated + " - a job has been scheduled + + IF rap_gen_project_objects_exist = abap_true . + result_line-%action-edit = if_abap_behv=>fc-o-disabled. + ELSE. + IF rapbo-jobname IS NOT INITIAL. + result_line-%action-edit = if_abap_behv=>fc-o-disabled. + ELSE. + result_line-%action-edit = if_abap_behv=>fc-o-enabled. + ENDIF. + ENDIF. + + result_line-%action-generateProject = COND #( WHEN rapbo-%is_draft = if_abap_behv=>mk-off AND + rapbo-jobname IS INITIAL + THEN if_abap_behv=>fc-o-enabled + ELSE if_abap_behv=>fc-o-disabled ). + result_line-%action-copyProject = COND #( WHEN rapbo-%is_draft = if_abap_behv=>mk-off + THEN if_abap_behv=>fc-o-enabled + ELSE if_abap_behv=>fc-o-disabled ). + + result_line-%field-MultiInlineEdit = COND #( WHEN rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic + AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-table + AND rapbo-DraftEnabled = abap_true + AND rapbo-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ). + result_line-%field-CustomizingTable = COND #( WHEN rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic + AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-table + AND rapbo-DraftEnabled = abap_true + AND rapbo-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ). + result_line-%field-AddToManageBusinessConfig = COND #( WHEN rapbo-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ). + +* result_line-%field-ADTLink = COND #( WHEN rapbo-BoIsGenerated = abap_true +* THEN if_abap_behv=>fc-f-read_only +* ELSE if_abap_behv=>fc-f- ). + +* result_line-%field-extensibilityElementSuffix = COND #( WHEN rapbo-isExtensible = abap_true +* THEN if_abap_behv=>fc-f-mandatory +* ). + + APPEND result_line TO result. + ENDLOOP. + + + + ENDMETHOD. + + METHOD copyProject. + +* +* DATA: +* projects TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Project, +* Nodes_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Project\_Node, +* fields_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Node\_field. +* +** READ TABLE keys WITH KEY %cid = '' INTO DATA(key_with_inital_cid). +** ASSERT key_with_inital_cid IS INITIAL. +* +* READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE +* ENTITY Project +* ALL FIELDS WITH CORRESPONDING #( keys ) +* RESULT DATA(Project_read_result) +* FAILED failed. +* +* READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE +* ENTITY Project BY \_Node +* ALL FIELDS WITH CORRESPONDING #( Project_read_result ) +* RESULT DATA(book_read_result). +* +* READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE +* ENTITY Node BY \_field +* ALL FIELDS WITH CORRESPONDING #( book_read_result ) +* RESULT DATA(booksuppl_read_result). +* +* LOOP AT Project_read_result ASSIGNING FIELD-SYMBOL(<Project>). +* "Fill Project container for creating new Project instance +* APPEND VALUE #( +** %cid = keys[ KEY entity %tky = <Project>-%tky ]-%cid +* %data = CORRESPONDING #( <Project> EXCEPT rapbouuid ) ) +* TO projects ASSIGNING FIELD-SYMBOL(<new_Project>). +* +* "Fill %cid_ref of Project as instance identifier for cba Node +* APPEND VALUE #( +* %cid_ref = keys[ KEY entity %tky = <Project>-%tky ]-%cid ) +* TO Nodes_cba ASSIGNING FIELD-SYMBOL(<Nodes_cba>). +* +** <new_Project>-begin_date = cl_abap_context_info=>get_system_date( ). +** <new_Project>-end_date = cl_abap_context_info=>get_system_date( ) + 30. +** <new_Project>-overall_status = 'O'. "Set to open to allow an editable instance +* +* LOOP AT book_read_result ASSIGNING FIELD-SYMBOL(<Node>) USING KEY entity WHERE Project_id EQ <Project>-Project_id. +* "Fill Node container for creating Node with cba +* APPEND VALUE #( %cid = keys[ KEY entity %tky = <Project>-%tky ]-%cid && <Node>-Node_id +* %data = CORRESPONDING #( book_read_result[ KEY entity %tky = <Node>-%tky ] EXCEPT Project_id ) ) +* TO <Nodes_cba>-%target ASSIGNING FIELD-SYMBOL(<new_Node>). +* +* "Fill %cid_ref of Node as instance identifier for cba booksuppl +* APPEND VALUE #( %cid_ref = keys[ KEY entity %tky = <Project>-%tky ]-%cid && <Node>-Node_id ) +* TO fields_cba ASSIGNING FIELD-SYMBOL(<fields_cba>). +* +* <new_Node>-Node_status = 'N'. +* +* LOOP AT booksuppl_read_result ASSIGNING FIELD-SYMBOL(<booksuppl>) USING KEY entity WHERE Project_id EQ <Project>-Project_id +* AND Node_id EQ <Node>-Node_id. +* "Fill booksuppl container for creating supplement with cba +* APPEND VALUE #( %cid = keys[ KEY entity %tky = <Project>-%tky ]-%cid && <Node>-Node_id && <booksuppl>-Node_supplement_id +* %data = CORRESPONDING #( <booksuppl> EXCEPT Project_id Node_id ) ) +* TO <fields_cba>-%target. +* ENDLOOP. +* ENDLOOP. +* ENDLOOP. +* +* "create new BO instance +* MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE +* ENTITY Project +* CREATE FIELDS ( +* boname +* rootentityname +* namespace +* packagename +* transportrequest +* skipactivation +* implementationtype +* abaplanguageversion +* packagelanguageversion +* datasourcetype +* bindingtype +* draftenabled +* suffix +* prefix +* multiinlineedit +* customizingtable +* addtomanagebusinessconfig +* businessconfname +* businessconfidentifier +* businessconfdescription +* ) +* WITH projects +* CREATE BY \_Node FIELDS ( +* +* FieldNameCreatedAt +* FieldNameCreatedby +* FieldNameEtagMaster +* FieldNameLastChangedAt +* FieldNameLastChangedBy +* FieldNameLocLastChangedAt +* FieldNameObjectID +* FieldNameParentUUID +* FieldNameRootUUID +* FieldNameTotalEtag +* FieldNameUUID +* +* +* ) +* WITH Nodes_cba +* ENTITY Node +* CREATE BY \_field FIELDS ( Node_supplement_id supplement_id price currency_code ) +* WITH fields_cba +* MAPPED DATA(mapped_create). +* +* mapped-Project = mapped_create-Project . + + DATA update_bonodes TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node. + +* DATA targets TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\node . +* DATA target LIKE LINE OF targets. + DATA update_fields TYPE TABLE FOR UPDATE ZDMO_R_RAPG_FieldTP. + DATA update_field TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_FieldTP. + + DATA cid TYPE i. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + CHECK lines( rapbos ) = 1. + "only copy projects that are not in draft mode + CHECK rapbos[ 1 ]-%is_draft = if_abap_behv=>mk-off. + + "Get package name selected by the user + DATA(selected_packagename) = keys[ 1 ]-%param-packagename. + + + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + DATA(selected_package_exist) = xco_lib->get_package( selected_packagename )->exists( ). + + IF selected_package_exist = abap_false. + + APPEND VALUE #( %tky = rapbos[ 1 ]-%tky ) + TO failed-project. + + "Set message + APPEND VALUE #( %tky = rapbos[ 1 ]-%tky + %element-jsonstring = if_abap_behv=>mk-on + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 014 + severity = if_abap_behv_message=>severity-error + v1 = selected_packagename + ) + ) + TO reported-project. + RETURN. + + ENDIF. + + LOOP AT rapbos INTO DATA(rapbo). + + " Read all associated nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_Node + ALL FIELDS + WITH VALUE #( ( %tky = rapbo-%tky ) ) + RESULT DATA(rapbo_nodes). + + " Read all associated fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Field + ALL FIELDS + WITH VALUE #( FOR rba_node IN rapbo_nodes ( %tky = rba_node-%tky ) ) + RESULT DATA(source_fields). + + CHECK line_exists( rapbo_nodes[ IsRootNode = abap_true ] ). + + SORT rapbo_nodes BY HierarchyDistanceFromRoot ASCENDING. + + DATA(root_node) = rapbo_nodes[ IsRootNode = abap_true ]. + + +*DataSourceType char(30) Datasource Type +*Column BdefImplementationType char(50) Implementation type +*Column BindingType char(30) Binding type +*Column DraftEnabled abap_boolean char(1) Draft enabled +*Column EntityName zdmo_rap_gen_entityname char(40) Root Entity Name +*Column data_source_name char(30) + + IF rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic OR + rapbo-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_uuid. + DATA(BdefImplementationType) = zdmo_cl_rap_node=>bdef_implementation_type-managed. + ELSE. + BdefImplementationType = zdmo_cl_rap_node=>bdef_implementation_type-unmanaged. + ENDIF. + + "create BO and root node via action + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + EXECUTE createProjectAndRootNode " createBOandRootNode + FROM VALUE #( ( + %cid = 'ROOT1' + %param-BdefImplementationType = BdefImplementationType + %param-BindingType = rapbo-BindingType + %param-DraftEnabled = rapbo-DraftEnabled + %param-entityname = root_node-EntityName + %param-data_source_name = root_node-DataSource + %param-DataSourceType = rapbo-DataSourceType + %param-package_name = selected_packagename + ) ) + " check result + MAPPED mapped + FAILED failed + REPORTED reported. + + CHECK mapped-project[] IS NOT INITIAL. + + + "get copied root node + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_node + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) + RESULT DATA(copied_root_nodes). + + CHECK lines( copied_root_nodes ) = 1. + + DATA(copied_root_node) = copied_root_nodes[ 1 ]. + + "set fields for copied header and root node + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + UPDATE FIELDS ( AddToManageBusinessConfig + CustomizingTable + MultiInlineEdit + Suffix + Prefix + SkipActivation + AddIViewBasic + isExtensible + "extensibilityElementSuffix + ) + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID + + AddToManageBusinessConfig = rapbo-AddToManageBusinessConfig + CustomizingTable = rapbo-CustomizingTable + MultiInlineEdit = rapbo-MultiInlineEdit + + Suffix = rapbo-Suffix + Prefix = rapbo-Prefix + SkipActivation = rapbo-SkipActivation + + AddIViewBasic = rapbo-AddIViewBasic + isExtensible = rapbo-isExtensible + extensibilityElementSuffix = rapbo-extensibilityElementSuffix + ) ) + + FAILED DATA(failed_update_root_bo_node) + REPORTED DATA(reported_update_root_bo_node). + + "in a second modify we set the field names according to the data from the source project + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + UPDATE FIELDS ( +* DataSource + FieldNameCreatedAt + FieldNameCreatedby + FieldNameEtagMaster + FieldNameLastChangedAt + FieldNameLastChangedBy + FieldNameLocLastChangedAt + FieldNameObjectID + FieldNameParentUUID + FieldNameRootUUID + FieldNameTotalEtag + FieldNameUUID + ExtensibilityElementSuffix + ) + WITH VALUE #( ( + NodeUUID = copied_root_node-NodeUUID + %is_draft = if_abap_behv=>mk-on +* DataSource = root_node-DataSource + "check if the following fields have to be set using a seperate EML call + FieldNameCreatedAt = root_node-FieldNameCreatedAt + FieldNameCreatedby = root_node-FieldNameCreatedby + FieldNameEtagMaster = root_node-FieldNameEtagMaster + FieldNameLastChangedAt = root_node-FieldNameLastChangedAt + FieldNameLastChangedBy = root_node-FieldNameLastChangedBy + FieldNameLocLastChangedAt = root_node-FieldNameLocLastChangedAt + FieldNameObjectID = root_node-FieldNameObjectID + FieldNameParentUUID = root_node-FieldNameParentUUID + FieldNameRootUUID = root_node-FieldNameRootUUID + FieldNameTotalEtag = root_node-FieldNameTotalEtag + FieldNameUUID = root_node-FieldNameUUID + ExtensibilityElementSuffix = root_node-ExtensibilityElementSuffix + ) ) + FAILED DATA(failed_update_root_bo_node2) + REPORTED DATA(reported_update_root_bo_node2). + + + + + + "read copied project header data + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) + RESULT DATA(copied_rapbos). + + CHECK lines( copied_rapbos ) = 1. + + + "get created fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY node + BY \_field + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + NodeUUID = copied_root_nodes[ 1 ]-NodeUUID ) ) + RESULT DATA(new_fields). + + +* rapbo_node-EntityName + "When the project is marked as extensible tables of the source project have a dummy field. + + LOOP AT new_fields INTO DATA(new_field). + IF line_exists( source_fields[ DbtableField = new_field-dbtablefield NodeUUID = root_node-NodeUUID ] ). + update_field-FieldUUID = new_field-FieldUUID. + update_field-%is_draft = if_abap_behv=>mk-on. + update_field-CdsViewField = source_fields[ DbtableField = new_field-dbtablefield NodeUUID = root_node-NodeUUID ]-CdsViewField. + APPEND update_field TO update_fields. + ENDIF. + ENDLOOP. + + + + " loop at nodes of the source project beside the root node + + LOOP AT rapbo_nodes INTO DATA(rapbo_node) WHERE IsRootNode = abap_false. + cid += 1. + + "get copied rapbo nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_node + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) + RESULT DATA(copied_rapbo_nodes). + + "get uuid of parent node + DATA(uuid_of_parent_node) = copied_rapbo_nodes[ EntityName = rapbo_node-ParentEntityName ]-NodeUUID. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY node + EXECUTE addChildNode + FROM VALUE #( ( + %tky = VALUE #( %is_draft = if_abap_behv=>mk-on + NodeUUID = uuid_of_parent_node ) + %param-entity_name = rapbo_node-EntityName + %param-DataSourceName = rapbo_node-DataSource + %param-DataSourceType = rapbo-DataSourceType + ) ) + + MAPPED DATA(mapped_add_child) + FAILED DATA(failed_add_child) + REPORTED DATA(reported_add_child). + + "in a second modify we set the field names according to the data from the source project + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + UPDATE FIELDS ( +* DataSource + FieldNameCreatedAt FieldNameCreatedby FieldNameEtagMaster FieldNameLastChangedAt FieldNameLastChangedBy + FieldNameLocLastChangedAt FieldNameObjectID FieldNameParentUUID FieldNameRootUUID FieldNameTotalEtag + FieldNameUUID + extensibilityElementSuffix + ) + WITH VALUE #( ( + + NodeUUID = mapped_add_child-node[ 1 ]-NodeUUID + %is_draft = if_abap_behv=>mk-on +* DataSource = rapbo_node-DataSource + "check if the following fields have to be set using a seperate EML call + fieldnamecreatedat = rapbo_node-fieldnamecreatedat + fieldnamecreatedby = rapbo_node-fieldnamecreatedby + fieldnameetagmaster = rapbo_node-fieldnameetagmaster + fieldnamelastchangedat = rapbo_node-fieldnamelastchangedat + fieldnamelastchangedby = rapbo_node-fieldnamelastchangedby + fieldnameloclastchangedat = rapbo_node-fieldnameloclastchangedat + fieldnameobjectid = rapbo_node-fieldnameobjectid + fieldnameparentuuid = rapbo_node-fieldnameparentuuid + fieldnamerootuuid = rapbo_node-fieldnamerootuuid + fieldnametotaletag = rapbo_node-fieldnametotaletag + FieldNameUUID = rapbo_node-FieldNameUUID + extensibilityElementSuffix = rapbo_node-ExtensibilityElementSuffix + + ) ) + FAILED DATA(failed_update_child_bo_node2) + REPORTED DATA(reported_update_child_bo_node2). + + +* LOOP AT mapped_add_child-field INTO DATA(mapped_add_child_field). + +* ENTITY Project BY \_node +* ALL FIELDS +* WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on +* RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) +* RESULT DATA(copied_rapbo_nodes). + + "get created fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY node + BY \_field + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + NodeUUID = mapped_add_child-node[ 1 ]-NodeUUID ) ) + RESULT new_fields. + + +* rapbo_node-EntityName + + LOOP AT new_fields INTO new_field. + IF line_exists( source_fields[ DbtableField = new_field-dbtablefield NodeUUID = rapbo_node-NodeUUID ] ). + update_field-FieldUUID = new_field-FieldUUID. + update_field-%is_draft = if_abap_behv=>mk-on. + update_field-CdsViewField = source_fields[ DbtableField = new_field-dbtablefield NodeUUID = rapbo_node-NodeUUID ]-CdsViewField. + APPEND update_field TO update_fields. + ENDIF. + ENDLOOP. + + ENDLOOP. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Field + UPDATE FIELDS ( + CdsViewField + ) + WITH + update_fields + FAILED DATA(failed_update_child_bo_node3) + REPORTED DATA(reported_update_child_bo_node3). + + APPEND VALUE #( + "von der quelle hier im Schlüssel + rapbouuid = rapbo-RapboUUID " mapped-rapgeneratorbo[ 1 ]-RapNodeUUID + %is_draft = rapbo-%is_draft " mapped-rapgeneratorbo[ 1 ]-%is_draft + "hier steht was rauskommt + "also mapping der alten auf neue keys + %param = VALUE #( %is_draft = mapped-project[ 1 ]-%is_draft + %key = mapped-project[ 1 ]-%key ) ) TO result. + + + ENDLOOP. + + + DATA(a) = mapped. + + + + + + + + + + + ENDMETHOD. + + METHOD deleteProject. + + TYPES: BEGIN OF ty_longtext, + msgv1(50), + msgv2(50), + msgv3(50), + msgv4(50), + END OF ty_longtext. + DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + + + + "check json string + "if this is not valid, raise an exception + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project +* FIELDS ( jsonstring abaplanguageversion boname ) + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + "Do check + LOOP AT rapbos INTO DATA(rapbo). + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @rapbo-BoName + INTO @DATA(raprootnode) . + + SELECT SINGLE * FROM ZDMO_R_RAPG_NodeTP WHERE RapBoUUID = @raprootnode-RapBoUUID + AND IsRootNode = @abap_true + INTO @DATA(root_node_information). + +* +* DATA(filter_string) = to_upper( root_node_information-ServiceBinding && '%' ). +* +* SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPObject LIKE @filter_string +* AND ABAPObjectType = 'SIA6' +* INTO TABLE @DATA(published_srvb_entries). + + DATA on_prem_xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + + on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + IF xco_lib->get_service_binding( CONV sxco_srvb_object_name( root_node_information-ServiceBinding ) )->if_xco_ar_object~exists( ) = abap_true. + "service binding exists + IF xco_lib->service_binding_is_published( CONV sxco_srvb_object_name( root_node_information-ServiceBinding ) ). + "Service binding is published +* xco_lib->un_publish_service_binding( CONV sxco_srvb_object_name( root_node_information-ServiceBinding ) ) . + +* IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_false +** OR raprootnode-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui +** OR raprootnode-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_web_api +* . +* +* "only raise a message if we are in cloud or if odata v2 is used on prem +* +* APPEND VALUE #( %tky = rapbo-%tky ) +* TO failed-project. +* +* "Set message +* APPEND VALUE #( %tky = rapbo-%tky +* %element-jsonstring = if_abap_behv=>mk-on +* %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' +* number = 073 +* severity = if_abap_behv_message=>severity-error +* v1 = | { root_node_information-ServiceBinding } | +** v2 = msg->value-msgv2 +** v3 = msg->value-msgv3 +** v4 = msg->value-msgv4 +* ) +* ) +* TO reported-project. +* RETURN. +* ENDIF. + ENDIF. + ENDIF. + ENDLOOP. + + + LOOP AT rapbos INTO rapbo. + "set a flag to check in the save sequence that a job is to be scheduled + update_line-BoIsDeleted = abap_true. + update_line-ApplJobLogHandle = ''. + update_line-%tky = rapbo-%tky. + APPEND update_line TO update. + ENDLOOP. + + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + UPDATE FIELDS ( + BoIsDeleted + ApplJobLogHandle + ) WITH update + REPORTED reported + FAILED failed + MAPPED mapped. + + IF failed IS INITIAL. + "Read changed data for action result + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS WITH + CORRESPONDING #( keys ) + RESULT rapbos. + result = VALUE #( FOR rapbo2 IN rapbos ( %tky = rapbo2-%tky + %param = rapbo2 ) ). + ENDIF. + + + + + + + ENDMETHOD. + + METHOD generateProject. + + + TYPES: BEGIN OF ty_longtext, + msgv1(50), + msgv2(50), + msgv3(50), + msgv4(50), + END OF ty_longtext. + + DATA: ls_longtext TYPE ty_longtext. + + DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + DATA update_line TYPE STRUCTURE FOR UPDATE zDMO_R_RAPG_ProjectTP\\Project . + + + + "check json string + "if this is not valid, raise an exception + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project +* FIELDS ( jsonstring abaplanguageversion boname ) + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + "Do check + LOOP AT rapbos INTO DATA(rapbo). + + TRY. + + IF rapbo-abaplanguageversion = zdmo_cl_rap_node=>abap_language_version-standard. + DATA(check_rapbo_on_prem) = zdmo_cl_rap_generator=>create_for_on_prem_development( rapbo-jsonstring ). + ELSE. + DATA(check_rapbo_cloud) = zdmo_cl_rap_generator=>create_for_cloud_development( rapbo-jsonstring ). + ENDIF. + + "set a flag to check in the save sequence that a job is to be scheduled + update_line-BoIsGenerated = abap_true. + update_line-%tky = rapbo-%tky. + APPEND update_line TO update. + + + CATCH zdmo_cx_rap_generator INTO DATA(rapobo_exception). + DATA(exception_text) = rapobo_exception->get_text( ). +* DATA(msg) = rapobo_exception->get_message( ). + ls_longtext = exception_text. + "Set failed keys + APPEND VALUE #( %tky = rapbo-%tky ) + TO failed-project. + + "Set message + APPEND VALUE #( %tky = rapbo-%tky + %element-jsonstring = if_abap_behv=>mk-on + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 016 + severity = if_abap_behv_message=>severity-error + v1 = ls_longtext-msgv1 "msg->value-msgv1 + v2 = ls_longtext-msgv2 " msg->value-msgv2 + v3 = ls_longtext-msgv3 " msg->value-msgv3 + v4 = ls_longtext-msgv4 " msg->value-msgv4 + ) + ) + TO reported-project. + RETURN. + ENDTRY. + ENDLOOP. + + +* LOOP AT rapbos INTO rapbo. +* "set a flag to check in the save sequence that a job is to be scheduled +* update_line-BoIsGenerated = abap_true. +* update_line-%tky = rapbo-%tky. +* APPEND update_line TO update. +* ENDLOOP. + + + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + UPDATE FIELDS ( + BoIsGenerated + ) WITH update + REPORTED reported + FAILED failed + MAPPED mapped. + + IF failed IS INITIAL. + "Read changed data for action result + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS WITH + CORRESPONDING #( keys ) + RESULT rapbos. + result = VALUE #( FOR rapbo2 IN rapbos ( %tky = rapbo2-%tky + %param = rapbo2 ) ). + ENDIF. + + + + ENDMETHOD. + + METHOD SetRepositoryObjectNames. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + LOOP AT rapbos INTO DATA(rapbo). + CHECK rapbo-packagename IS NOT INITIAL. + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_Node + ALL FIELDS + WITH VALUE #( ( %tky = rapbo-%tky ) ) + RESULT DATA(rapbo_nodes). + + LOOP AT rapbo_nodes INTO DATA(rapbo_node). + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + EXECUTE SetRepositoryObjectNames + FROM VALUE #( ( %tky = rapbo_node-%tky ) ). + ENDLOOP. + + ENDLOOP. + + + + ENDMETHOD. + + METHOD createJsonString. + + DATA json_string_builder TYPE REF TO zdmo_cl_rap_gen_build_json_2. + DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project . + + DATA rapgen_nodes TYPE zdmo_cl_rap_gen_build_json_2=>tt_rapgen_node . + DATA rapgen_projects TYPE zdmo_cl_rap_gen_build_json_2=>tt_rapgen_bo . + DATA rapgen_fields TYPE zdmo_cl_rap_gen_build_json_2=>tt_rapgen_field. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS WITH CORRESPONDING #( keys ) + RESULT DATA(Projects). + + LOOP AT projects INTO DATA(project). + + " Read all associated nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_Node + ALL FIELDS + WITH VALUE #( ( %tky = project-%tky ) ) + RESULT DATA(nodes). + + " Read all associated fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Field + ALL FIELDS + WITH VALUE #( FOR rba_node IN nodes ( %tky = rba_node-%tky ) ) + RESULT DATA(fields). + + MOVE-CORRESPONDING Projects TO rapgen_projects. + MOVE-CORRESPONDING Nodes TO rapgen_nodes. + MOVE-CORRESPONDING Fields TO rapgen_fields. + + json_string_builder = NEW zdmo_cl_rap_gen_build_json_2( + iv_bo_uuid = project-%tky-RapBoUUID + it_rapgen_bo = rapgen_projects + it_rapgen_node = rapgen_nodes + it_rapgen_field = rapgen_fields + ). + + DATA(root_node) = rapgen_nodes[ isrootnode = abap_true RapBoUUID = project-%tky-rapbouuid ]. + + update_line-jsonstring = json_string_builder->create_json( ). + update_line-%tky = project-%tky. + APPEND update_line TO update. + + ENDLOOP. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + UPDATE FIELDS ( + jsonstring + ) WITH update + REPORTED DATA(update_reported). + + reported = CORRESPONDING #( DEEP update_reported ). + + ENDMETHOD. + + METHOD generated_objects_are_deleted. + + DATA repository_objects_exist TYPE abap_bool VALUE abap_false. + + DATA rap_generator_project TYPE ZDMO_R_RAPG_ProjectTP. + DATA rap_generator_projects TYPE STANDARD TABLE OF ZDMO_R_RAPG_ProjectTP. + + LOOP AT keys INTO DATA(key). + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapBoUUID = @key-RapboUUID + INTO @rap_generator_project. + APPEND rap_generator_project TO rap_generator_projects. + ENDLOOP. + + LOOP AT rap_generator_projects INTO rap_generator_project. + + repository_objects_exist = rap_gen_project_objects_exist( rap_generator_project ). + + IF repository_objects_exist = abap_true. + APPEND VALUE #( rapbouuid = rap_generator_project-RapboUUID ) + TO failed-project. + APPEND VALUE #( rapbouuid = rap_generator_project-RapboUUID + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 077 + severity = if_abap_behv_message=>severity-error + v1 = |{ rap_generator_project-BoName }| ) ) + TO reported-project. + ENDIF. + + + ENDLOOP. + + + ENDMETHOD. + + METHOD rap_gen_project_objects_exist. + + "@todo - duplicate code ??? + + DATA generated_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects. + DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object. + + DATA on_prem_xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + + on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @i_rap_generator_project-RapboUUID + INTO TABLE @DATA(rapbo_nodes). + + LOOP AT rapbo_nodes INTO DATA(rapbo_node). + "get repository object names and types + + CLEAR generated_repository_objects. + + IF rapbo_node-ServiceBinding IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-ServiceBinding. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-ServiceDefinition IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-ServiceDefinition. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_definition. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-CdsRView IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-CdsRView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. + APPEND generated_repository_object TO generated_repository_objects. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_r. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-CdsPView IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-CdsPView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_p. + APPEND generated_repository_object TO generated_repository_objects. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_p. + APPEND generated_repository_object TO generated_repository_objects. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-meta_data_extension. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-CdsiView IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-CdsiView. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-ControlStructure IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-ControlStructure. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-control_structure. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-BehaviorImplementationClass IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-BehaviorImplementationClass. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-behavior_implementation. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-DraftTableName IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-DraftTableName. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_table. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + LOOP AT generated_repository_objects INTO generated_repository_object. + + CASE generated_repository_object-object_type. + + WHEN zdmo_cl_rap_node=>root_node_object_types-service_binding. + IF xco_lib->get_service_binding( CONV sxco_srvb_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>root_node_object_types-service_definition. + IF xco_lib->get_service_definition( CONV sxco_srvd_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. "this checks also for behavior projection 'BDEF' + IF xco_lib->get_behavior_definition( CONV sxco_cds_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-behavior_implementation. "checks also for query implementation 'CLAS' + IF xco_lib->get_class( CONV sxco_ao_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-cds_view_r. "this checks also for i- and p-views as well as for custom entities + IF xco_lib->get_view( CONV sxco_cds_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-control_structure. + IF xco_lib->get_structure( CONV sxco_ad_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-draft_table. + IF xco_lib->get_database_table( CONV sxco_dbt_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-meta_data_extension. + IF xco_lib->get_metadata_extension( CONV sxco_cds_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN OTHERS. + "do nothing + ENDCASE. + + ENDLOOP. + + ENDLOOP. + + ENDMETHOD. + + METHOD mandatory_fields_check. + + DATA permission_request TYPE STRUCTURE FOR PERMISSIONS REQUEST ZDMO_C_RAPG_ProjectTP. + DATA reported_rapgeneratorbo_line LIKE LINE OF reported-project. + + "check permissions of the following fields + permission_request-%field-PackageName = if_abap_behv=>mk-on. +* permission_request-%field-extensibilityElementSuffix = if_abap_behv=>mk-on. + + " Get current field values + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rap_generator_projects). + + "Do check + LOOP AT rap_generator_projects INTO DATA(rap_generator_project). + + GET PERMISSIONS ONLY INSTANCE ENTITY ZDMO_C_RAPG_ProjectTP + FROM VALUE #( ( RapBoUUID = rap_generator_project-RapBoUUID ) ) + REQUEST permission_request + RESULT DATA(permission_result) + FAILED DATA(failed_permission_result) + REPORTED DATA(reported_permission_result). + + IF permission_result-global-%field-PackageName = if_abap_behv=>fc-f-mandatory + AND rap_generator_project-PackageName IS INITIAL. + + APPEND VALUE #( %tky = rap_generator_project-%tky ) TO failed-project. + + CLEAR reported_rapgeneratorbo_line. + reported_rapgeneratorbo_line-%tky = rap_generator_project-%tky. + reported_rapgeneratorbo_line-%element-packagename = if_abap_behv=>mk-on. + reported_rapgeneratorbo_line-%msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 071 + severity = if_abap_behv_message=>severity-error + v1 = | Package name | + v2 = |{ rap_generator_project-BoName }| ). + APPEND reported_rapgeneratorbo_line TO reported-project. + + ENDIF. + +* IF permission_result-instances[ RapBoUUID = rap_generator_project-RapBoUUID ]-%field-extensibilityElementSuffix = if_abap_behv=>fc-f-mandatory +* AND rap_generator_project-extensibilityElementSuffix IS INITIAL. +* +* APPEND VALUE #( %tky = rap_generator_project-%tky ) TO failed-project. +* +* CLEAR reported_rapgeneratorbo_line. +* reported_rapgeneratorbo_line-%tky = rap_generator_project-%tky. +* reported_rapgeneratorbo_line-%element-packagename = if_abap_behv=>mk-on. +* reported_rapgeneratorbo_line-%msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' +* number = 071 +* severity = if_abap_behv_message=>severity-error +* v1 = | Extensibility Suffix | +* v2 = |{ rap_generator_project-BoName }| ). +* APPEND reported_rapgeneratorbo_line TO reported-project. +* +* ENDIF. + + ENDLOOP. + + ENDMETHOD. + + METHOD is_customizing_table. + + " check if + " - all data sources are tables of delievery class C + " - is of implementation type managed_semantic with + " binding_type odata_V4_UI and is draft enabled + + "Get values of fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(projects). + + DATA on_prem_xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + + on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + + LOOP AT projects INTO DATA(project). + + IF project-CustomizingTable = abap_true AND + + ( project-ImplementationType <> zdmo_cl_rap_node=>implementation_type-managed_semantic OR + project-BindingType <> zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR + project-DraftEnabled = abap_false ). + + APPEND VALUE #( %tky = project-%tky ) + TO failed-project. + APPEND VALUE #( %tky = project-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 059 + severity = if_abap_behv_message=>severity-error + v1 = |{ project-BoName }| ) ) + TO reported-project. + + "check if all tables are customizing tables + ELSEIF project-CustomizingTable = abap_true + AND + ( project-ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic OR + project-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR + project-DraftEnabled = abap_true ) + . + + " Read all associated nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_Node + ALL FIELDS + WITH VALUE #( ( %tky = project-%tky ) ) + RESULT DATA(nodes). + + LOOP AT nodes INTO DATA(node). + + DATA(table_delivery_class) = xco_lib->get_database_table( CONV #( node-DataSource ) )->content( )->get( )-delivery_class->value. + + IF table_delivery_class <> 'C'. + + APPEND VALUE #( %tky = project-%tky ) + TO failed-project. + APPEND VALUE #( %tky = project-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 060 + severity = if_abap_behv_message=>severity-error + v1 = |{ node-DataSource }| + v2 = |{ table_delivery_class }| ) ) + TO reported-project. + + RETURN. + + ENDIF. + + ENDLOOP. + + ENDIF. + + ENDLOOP. + + + ENDMETHOD. + + METHOD check_for_allowed_combinations. + + "Get values of fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(projects). + + LOOP AT projects INTO DATA(entity). + + "managed scenarios should use tables as data sources + "scenarios where CDS views are used as datasources are scenarios + "where one reads from SAP CDS views and one uses API's such as BAPI's + "to store the changes + + + IF entity-DataSourceType = zdmo_cl_rap_node=>data_source_types-cds_view AND + entity-ImplementationType <> zdmo_cl_rap_node=>implementation_type-unmanaged_semantic . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 080 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-ImplementationType }| + v2 = |{ zdmo_cl_rap_node=>implementation_type-unmanaged_semantic }| + + ) ) + TO reported-project. + ENDIF. + + + "custom entities (that are created when abstract entities are used as a data source) do not support draft + IF entity-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity AND + entity-DraftEnabled = abap_true . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 063 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-BoName }| ) ) + TO reported-project. + ENDIF. + + "custom entities = unmanaged queries do only support an unmanaged transactional implementation + + IF entity-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity AND + entity-ImplementationType <> zdmo_cl_rap_node=>implementation_type-unmanaged_semantic. + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 079 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-ImplementationType }| + v2 = |{ zdmo_cl_rap_node=>implementation_type-unmanaged_semantic }| + + ) ) + TO reported-project. + ENDIF. + + "OData V4 as UI service binding in only allowed when draft is used + IF entity-BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui AND + entity-DraftEnabled = abap_false . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 078 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-BoName }| ) ) + TO reported-project. + ENDIF. + + "For customizing tables are required as data source + "the same is true when multi inline edit shall be used + + IF ( entity-MultiInlineEdit = abap_true OR entity-CustomizingTable = abap_true ) AND + entity-DataSourceType <> zdmo_cl_rap_node=>data_source_types-table . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 067 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-DataSourceType }| ) ) + TO reported-project. + ENDIF. + + IF ( entity-MultiInlineEdit = abap_true OR entity-CustomizingTable = abap_true ) AND + entity-ImplementationType <> zdmo_cl_rap_node=>implementation_type-managed_semantic . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 068 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-ImplementationType }| ) ) + TO reported-project. + ENDIF. + + IF entity-MultiInlineEdit = abap_true AND + ( entity-BindingType <> zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR + entity-DraftEnabled = abap_false ) . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 058 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-BoName }| ) ) + TO reported-project. + ENDIF. + + IF entity-CustomizingTable = abap_true AND + ( entity-BindingType <> zdmo_cl_rap_node=>binding_type_name-odata_v4_ui OR + entity-DraftEnabled = abap_false ) . + APPEND VALUE #( %tky = entity-%tky ) + TO failed-project. + APPEND VALUE #( %tky = entity-%tky + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 059 + severity = if_abap_behv_message=>severity-error + v1 = |{ entity-BoName }| ) ) + TO reported-project. + ENDIF. + + + + + ENDLOOP. + + ENDMETHOD. + +ENDCLASS. + +CLASS lhc_Log DEFINITION INHERITING FROM cl_abap_behavior_handler. + PRIVATE SECTION. + + METHODS CalculateLogItemNumber FOR DETERMINE ON SAVE + IMPORTING keys FOR Log~CalculateLogItemNumber. + +ENDCLASS. + +CLASS lhc_Log IMPLEMENTATION. + + METHOD CalculateLogItemNumber. + ENDMETHOD. + +ENDCLASS. + +CLASS lhc_Node DEFINITION INHERITING FROM cl_abap_behavior_handler. + PRIVATE SECTION. + + METHODS get_instance_features FOR INSTANCE FEATURES + IMPORTING keys REQUEST requested_features FOR Node RESULT result. + +* METHODS get_global_features FOR GLOBAL FEATURES +* IMPORTING REQUEST requested_features FOR Node RESULT result. + + METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION + IMPORTING REQUEST requested_authorizations FOR Node RESULT result. + +* METHODS addChildNode FOR MODIFY +* IMPORTING keys FOR ACTION Node~addChildNode RESULT result. + +* METHODS createRootNode FOR MODIFY +* IMPORTING keys FOR ACTION Node~createRootNode RESULT result. + + METHODS CalculateEntityName FOR DETERMINE ON SAVE + IMPORTING keys FOR Node~CalculateEntityName. + METHODS SetRepositoryObjectNames FOR MODIFY + IMPORTING keys FOR ACTION Node~SetRepositoryObjectNames. + + METHODS SetRepositoryObjectNames_det FOR DETERMINE ON MODIFY + IMPORTING keys FOR Node~SetRepositoryObjectNames_det. + METHODS addChildNode FOR MODIFY + IMPORTING keys FOR ACTION Node~addChildNode + RESULT result. + METHODS addChildDataSourceAbsEntity FOR MODIFY + IMPORTING keys FOR ACTION Node~addChildDataSourceAbsEntity +* RESULT result + . + + METHODS addChildDataSourceCDSview FOR MODIFY + IMPORTING keys FOR ACTION Node~addChildDataSourceCDSview +* RESULT result + . + + METHODS addChildDataSourceTable FOR MODIFY + IMPORTING keys FOR ACTION Node~addChildDataSourceTable +* RESULT result + . + METHODS SetFieldNames FOR DETERMINE ON MODIFY + IMPORTING keys FOR Node~SetFieldNames. + METHODS mandatory_fields_check FOR VALIDATE ON SAVE + IMPORTING keys FOR Node~mandatory_fields_check. + +* METHODS SetRepositoryObjectNames FOR MODIFY +* IMPORTING keys FOR ACTION Node~SetRepositoryObjectNames. + +ENDCLASS. + +CLASS lhc_Node IMPLEMENTATION. + + METHOD get_instance_features. + + + "read all child instances + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + ALL FIELDS +* ( entityname isrootnode viewtypevalue hierarchydistancefromroot ) + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbo_nodes). + + "read all links from child instances to the corresponding parent entity + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Project + FROM CORRESPONDING #( rapbo_nodes ) + LINK DATA(rapbo_nodes_links). + + "read all parent entities of the child entities + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Project + ALL FIELDS +* ( AddIViewBasic +* implementationtype datasourcetype +* namespace prefix suffix draftenabled ) + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + LOOP AT rapbo_nodes INTO DATA(rapbo_node). + + "use link data to retrieve the data of the parent entity of the currently selected child entity + DATA(rapbo) = rapbos[ rapbouuid = rapbo_nodes_links[ source-nodeuuid = rapbo_node-nodeuuid ]-target-rapbouuid ]. + + APPEND VALUE #( %tky = rapbo_node-%tky + + %action-addchilddatasourcetable = COND #( WHEN ( rapbo-%is_draft = if_abap_behv=>mk-on + AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-table ) + THEN if_abap_behv=>fc-o-enabled + ELSE if_abap_behv=>fc-o-disabled ) + + %action-addchilddatasourcecdsview = COND #( WHEN ( rapbo-%is_draft = if_abap_behv=>mk-on + AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-cds_view ) + THEN if_abap_behv=>fc-o-enabled + ELSE if_abap_behv=>fc-o-disabled ) + + %action-addchilddatasourceAbsEntity = COND #( WHEN ( rapbo-%is_draft = if_abap_behv=>mk-on + AND rapbo-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity ) + THEN if_abap_behv=>fc-o-enabled + ELSE if_abap_behv=>fc-o-disabled ) + + + %field-fieldnameuuid = COND #( WHEN rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-managed_uuid + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-fieldnamerootuuid = COND #( WHEN ( rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-managed_uuid + AND rapbo_node-hierarchydistancefromroot > 1 ) + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-fieldnameparentuuid = COND #( WHEN ( rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-managed_uuid + AND rapbo_node-hierarchydistancefromroot > 0 ) + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-controlstructure = COND #( WHEN rapbo-implementationtype = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-drafttablename = COND #( WHEN rapbo-draftenabled = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-CdsIViewBasic = COND #( WHEN rapbo-AddIViewBasic = abap_true +* THEN if_abap_behv=>fc-f-mandatory + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ) + + + %field-queryimplementationclass = COND #( WHEN rapbo_node-viewtypevalue = xco_cp_data_definition=>type->abstract_entity->value OR + rapbo_node-viewtypevalue = xco_cp_data_definition=>type->custom_entity->value + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only + ) + + %field-fieldnameetagmaster = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-unrestricted ) + + "fields needed for root entities + + %field-servicebinding = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-servicedefinition = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-fieldnametotaletag = COND #( WHEN ( rapbo_node-isrootnode = abap_true AND rapbo-draftenabled = abap_true ) + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + "additional administrative fields that can be annotated for a root node + + %field-fieldnamecreatedat = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ) + + %field-fieldnamecreatedby = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ) + + %field-fieldnamelastchangedby = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ) + + %field-fieldnamelastchangedat = COND #( WHEN rapbo_node-isrootnode = abap_true + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ) + +"fields needed for extensible RAP BOs + %field-extensibilityelementsuffix = COND #( WHEN rapbo-isExtensible = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-extensioninclude = COND #( WHEN rapbo-isExtensible = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + %field-extensionincludeview = COND #( WHEN rapbo-isExtensible = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + %field-draftqueryview = COND #( WHEN rapbo-isExtensible = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + +"fields to store SAPObjectType and SAPObjectNodeTypes + + %field-sapobjecttype = COND #( WHEN rapbo-AddSAPObjectType = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + %field-sapobjectnodetype = COND #( WHEN rapbo-AddSAPObjectType = abap_true + THEN if_abap_behv=>fc-f-mandatory + ELSE if_abap_behv=>fc-f-read_only ) + + + ) TO result. + ENDLOOP. + + ENDMETHOD. + +* METHOD get_global_features. +* ENDMETHOD. + + METHOD get_global_authorizations. + ENDMETHOD. + + + + METHOD CalculateEntityName. + ENDMETHOD. + + + METHOD SetRepositoryObjectNames. + DATA my_node TYPE REF TO ZDMO_cl_rap_node. + DATA root_node TYPE REF TO ZDMO_cl_rap_node. + + + DATA update_bo TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + DATA update_bo_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project . + + DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node. + DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node . + + DATA draft_keys TYPE TABLE FOR DETERMINATION zDMO_R_RAPG_ProjectTP\\Node~SetRepositoryObjectNames_det." rapgeneratorbonode~setrepositoryobjectnames. + + +* todo check why we only use draft keys here +* when the action is not enabled in non draft this would not be necessary + + draft_keys = VALUE #( FOR draft_key IN keys WHERE ( %is_draft = if_abap_behv=>mk-on ) + ( + %is_draft = draft_key-%is_draft + nodeuuid = draft_key-nodeuuid + "Component Groups + %key = draft_key-%key + %tky = draft_key-%tky + %pky = draft_key-%pky + ) ) . + + CHECK draft_keys IS NOT INITIAL. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + +* +* " Process all affected RAPBos. Read respective nodes, +* " determine the implementation type of the RAP BO +* + LOOP AT rapbos INTO DATA(rapbo). + + DATA my_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + + IF rapbo-abaplanguageversion = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development. + my_xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ELSE. + my_xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ) . + ENDIF. + + CLEAR update_bo_line. + + " read a dummy field + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project BY \_Node + ALL FIELDS "( entityname cdsiview cdspview ) + WITH VALUE #( ( %tky = rapbo-%tky ) ) + RESULT DATA(rapbo_nodes). + + update_bo_line-%tky = rapbo-%tky. + + "loop will start with the root node + SORT rapbo_nodes BY hierarchydistancefromroot ASCENDING. + + root_node = NEW ZDMO_cl_rap_node( ). + + root_node->set_is_root_node( ). + root_node->set_xco_lib( my_xco_lib ). + root_node->set_draft_enabled( rapbo-draftenabled ). + root_node->set_prefix( rapbo-prefix ). + root_node->set_suffix( rapbo-suffix ). + root_node->set_namespace( CONV #( rapbo-namespace ) ). + root_node->set_binding_type( CONV #( rapbo-bindingtype ) ). + root_node->set_implementation_type( CONV #( rapbo-implementationtype ) ). + root_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ). + root_node->set_name_sap_object_type( rapbo-SAPObjectType ). + +*CATCH zdmo_cx_rap_generator. + + + LOOP AT rapbo_nodes INTO DATA(rapbo_node). + + CHECK rapbo_node-entityname IS NOT INITIAL AND + rapbo-namespace IS NOT INITIAL . +* AND +* rapbo_node-hierarchydescendantcount > 0. "node has child nodes + + CLEAR update_line. + update_line-%tky = rapbo_node-%tky. + + IF line_exists( rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ] ). + update_line-parententityname = rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ]-entityname. + ENDIF. + + + TRY. + + IF rapbo_node-isrootnode = abap_true. + + my_node = root_node. + my_node->set_entity_name( CONV #( rapbo_node-entityname ) ). + + my_node->set_name_service_definition( ). + my_node->set_name_service_binding( ). + + IF rapbo-AddSAPObjectType = abap_true. + my_node->set_name_sap_object_type( ). + update_line-SAPObjectType = my_node->rap_root_node_objects-sap_object_type. + ELSE. + update_line-SAPObjectType = ''. + ENDIF. + + update_line-servicebinding = my_node->rap_root_node_objects-service_binding. + update_line-servicedefinition = my_node->rap_root_node_objects-service_definition. + + ELSE. + + "value must be explictly set to ''. + "Because if fields are initial their content is not updated via EML + + update_line-servicebinding = ''. + update_line-servicedefinition = ''. + + CASE rapbo_node-hierarchydistancefromroot. + WHEN 1. + my_node = root_node->add_child( ). + my_node->set_entity_name( CONV #( rapbo_node-entityname ) ). + WHEN OTHERS. + LOOP AT root_node->all_childnodes INTO DATA(child_node). + IF child_node->entityname = update_line-parententityname. + my_node = child_node->add_child( ). + my_node->set_entity_name( CONV #( rapbo_node-entityname ) ). + ENDIF. + ENDLOOP. + ENDCASE. + ENDIF. + + IF rapbo-draftenabled = abap_true. + my_node->set_name_draft_table( ). + update_line-drafttablename = my_node->draft_table_name. + ELSE. + update_line-drafttablename = ''. + ENDIF. + + IF rapbo-AddIViewBasic = abap_true. + my_node->set_name_cds_i_view_basic( ). + update_line-CdsIViewBasic = my_node->rap_node_objects-cds_view_i_basic. + ELSE. + update_line-CdsIViewBasic = ''. + ENDIF. + + my_node->set_name_cds_i_view( ). + my_node->set_name_cds_r_view( ). + my_node->set_name_cds_p_view( ). + my_node->set_name_behavior_impl( ). + my_node->set_name_mde( ). + + IF rapbo-AddSAPObjectType = abap_true. + my_node->set_name_sap_node_object_type( ). + update_line-SAPObjectNodeType = my_node->rap_node_objects-sap_object_node_type. + ELSE. + update_line-SAPObjectNodeType = ''. + ENDIF. + update_line-cdsiview = my_node->rap_node_objects-cds_view_i. + update_line-cdsrview = my_node->rap_node_objects-cds_view_r. + update_line-cdspview = my_node->rap_node_objects-cds_view_p. + update_line-mdeview = my_node->rap_node_objects-meta_data_extension. + + update_line-SAPObjectNodeType = my_node->rap_node_objects-sap_object_node_type. + + update_line-behaviorimplementationclass = my_node->rap_node_objects-behavior_implementation. + + + + "boname can only be set after name of cds-i-view has been determined + IF rapbo_node-isrootnode = abap_true. + update_bo_line-boname = my_node->rap_node_objects-cds_view_r. + update_bo_line-SAPObjectType = my_node->rap_root_node_objects-sap_object_type. + update_bo_line-adtlink = | adt://{ sy-sysid }/sap/bc/adt/ddic/ddl/sources/{ my_node->rap_node_objects-cds_view_r } |. + ENDIF. + + IF rapbo-implementationtype = ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + my_node->set_name_control_structure( ). + update_line-controlstructure = my_node->rap_node_objects-control_structure. + ELSE. + update_line-controlstructure = ''. + ENDIF. + + IF rapbo-datasourcetype = ZDMO_cl_rap_node=>data_source_types-abstract_entity. . + + my_node->set_name_custom_query_impl( ). + my_node->set_name_custom_entity( ). + "name of custom entity is the same as the name of the cds i(r)-view + update_line-queryimplementationclass = my_node->rap_node_objects-custom_query_impl_class. + ELSE. + update_line-queryimplementationclass = ''. + ENDIF. + + IF rapbo-isExtensible = abap_true. + my_node->set_name_extension_include( ). + my_node->set_name_extension_incl_view( ). + my_node->set_ext_element_suffix( ). + update_line-ExtensionInclude = my_node->rap_node_objects-extension_include. + update_line-ExtensionIncludeView = my_node->rap_node_objects-extension_include_view. + update_line-ExtensibilityElementSuffix = my_node->extensibility_element_suffix. + ELSE. + update_line-ExtensionInclude = ''. + update_line-ExtensionIncludeView = ''. + update_line-ExtensibilityElementSuffix = ''. + ENDIF. + + IF rapbo-isExtensible = abap_true AND rapbo-DraftEnabled = abap_true. + my_node->set_name_draft_query_view( ). + update_line-draftqueryview = my_node->rap_node_objects-draft_query_view. + ELSE. + update_line-DraftQueryView = ''. + ENDIF. + + CATCH ZDMO_cx_rap_generator INTO DATA(rap_node_exception). + DATA(exception_text) = rap_node_exception->get_text( ). + ENDTRY. + + + APPEND update_line TO update. + + ENDLOOP. + + APPEND update_bo_line TO update_bo. + + ENDLOOP. + + + " Update repository object name proposals of all relevant entities + " Update the parent entity name + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Project + UPDATE FIELDS ( + boname + ADTLink + SAPObjectType + ) WITH update_bo + ENTITY Node + UPDATE FIELDS ( + parententityname + cdsiview + cdsiviewbasic + cdsrview + cdspview + mdeview + behaviorimplementationclass + servicedefinition + servicebinding + controlstructure + queryimplementationclass + drafttablename + ExtensionInclude + ExtensionIncludeView + ExtensibilityElementSuffix + DraftQueryView + SAPObjectNodeType + SAPObjectType + ) WITH update + REPORTED DATA(update_reported). + + reported = CORRESPONDING #( DEEP update_reported ). + + ENDMETHOD. + + METHOD SetRepositoryObjectNames_det. + + + "proposals for repository object names are only set + "a) when draft is active and + "b) when the entity name changes. (which cannot happen anymore) + + DATA draft_keys TYPE TABLE FOR DETERMINATION ZDMO_R_RAPG_ProjectTP\\Node~SetRepositoryObjectNames_det . + " if_abap_behv=>mk-on + draft_keys = VALUE #( FOR draft_key IN keys WHERE ( %is_draft = if_abap_behv=>mk-on ) + ( + %is_draft = draft_key-%is_draft + nodeuuid = draft_key-nodeuuid + "Component Groups + %key = draft_key-%key + %tky = draft_key-%tky + %pky = draft_key-%pky + ) ) . + + CHECK draft_keys IS NOT INITIAL. + + " Trigger Re-Calculation of repository object names + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY node + EXECUTE SetRepositoryObjectNames + FROM CORRESPONDING #( draft_keys ). + + + ENDMETHOD. + + METHOD addChildNode. + + DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node. + DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node . + + DATA create_nodes TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node. + DATA create_node TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node. + + DATA number_of_childs TYPE i. + DATA n TYPE i. + + "get projects + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(projects). + + "get nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node "BY \_Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(nodes). + + "get all nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY PRoject BY \_Node + ALL FIELDS + WITH CORRESPONDING #( projects ) + RESULT DATA(nodes_of_project). + + DATA(number_of_nodes) = lines( nodes_of_project ) . + + "calculate new number of child nodes + LOOP AT nodes INTO DATA(node). + CLEAR update_line. + CLEAR number_of_childs. + LOOP AT nodes INTO DATA(node_2) WHERE parentuuid = node-nodeuuid AND isrootnode = abap_false. + number_of_childs += 1. + ENDLOOP. + LOOP AT nodes INTO node_2 WHERE nodeuuid = node-nodeuuid. + update_line-%tky = node_2-%tky. + update_line-hierarchydescendantcount = number_of_childs + 1 . + APPEND update_line TO update. + ENDLOOP. + ENDLOOP. + + + LOOP AT nodes INTO node. + + n += 1. + + IF projects[ rapbouuid = node-RapBoUUID ]-AddToManageBusinessConfig = abap_true AND + node-hierarchydistancefromroot + 1 >= 2. + APPEND VALUE #( nodeuuid = node-nodeuuid + %msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 069 + severity = if_abap_behv_message=>severity-error + v1 = |{ projects[ rapbouuid = node-RapBoUUID ]-BoName }| ) ) + TO reported-node. + + ELSE. + + + create_node = VALUE #( + %tky-%is_draft = node-%is_draft + %tky-RapBoUUID = node-rapbouuid + + %target = VALUE #( ( + %is_draft = node-%is_draft + %cid = node-NodeUUID + "data from data source specific action + entityname = keys[ NodeUUID = node-NodeUUID ]-%param-entity_name + DataSource = keys[ NodeUUID = node-NodeUUID ]-%param-DataSourceName + "data from selected node + parententityname = node-EntityName + parentdatasource = node-DataSource + parentuuid = node-NodeUUID + rootuuid = node-RootUUID + hierarchydistancefromroot = node-hierarchydistancefromroot + 1 + NodeNumber = number_of_nodes + 1 + ) ) + ). + + APPEND create_node TO create_nodes. + + ENDIF. + ENDLOOP. + + + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + UPDATE FIELDS ( + hierarchydescendantcount + ) WITH update + ENTITY Project + CREATE BY \_Node + FIELDS ( + "set via parameter + entityname + DataSource + "set from selected node + parententityname + parentdatasource + parentuuid + rootuuid + hierarchydistancefromroot + "set for extensibility + NodeNumber + ) + WITH create_nodes + MAPPED mapped + FAILED failed + REPORTED reported. + + + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY node + ALL FIELDS WITH VALUE #( FOR m IN mapped-node ( %tky = m-%tky ) ) + RESULT DATA(lt_result). + + result = VALUE #( FOR r IN lt_result ( + %tky = r-%tky + %param = CORRESPONDING #( r ) ) ). + + +* CHECK mapped-rapgeneratorbonode[] IS NOT INITIAL. + +* APPEND LINES OF mapped-rapgeneratorbonode TO all_mapped-rapgeneratorbonode. + + + +* MODIFY ENTITIES OF zdmo_r_rapgeneratorbo IN LOCAL MODE +* ENTITY rapgeneratorbonode +* UPDATE FIELDS ( +* hierarchydescendantcount +* +* ) WITH update +** REPORTED DATA(update_reported) +* +* ENTITY rapgeneratorbo +* CREATE BY \_rapgeneratorbonode +* SET FIELDS WITH VALUE #( ( %is_draft = ls_key-%is_draft +* rapnodeuuid = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-headeruuid +* +* %target = VALUE #( ( %is_draft = ls_key-%is_draft +* %cid = ls_key-%cid_ref +* entityname = ls_key-%param-entity_name +* parententityname = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-entityname +* parentdatasource = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-datasource +* parentuuid = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-nodeuuid +* rootuuid = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-rootuuid +* hierarchydistancefromroot = rapbo_nodes[ nodeuuid = ls_key-nodeuuid ]-hierarchydistancefromroot + 1 +* ) +* ) ) ) +* MAPPED mapped " DATA(mapped_from_modify) +* FAILED failed " DATA(failed_from_modify) +* REPORTED reported." DATA(reported_from_modify). +* +* CHECK mapped-rapgeneratorbonode[] IS NOT INITIAL. +* +* APPEND LINES OF mapped-rapgeneratorbonode TO all_mapped-rapgeneratorbonode. +* +* + + +** value #( +** ( %is_draft = CONV #( '01' ) +** nodeuuid = CONV #( '22ABBDB515F31EDDB1AF72F1C2D2AFAA' ) +** rapbouuid = CONV #( '22ABBDB515F31EDDB1AF72F1C2D26FAA' ) +** parentuuid = CONV #( '00000000000000000000000000000000' ) +** rootuuid = CONV #( '00000000000000000000000000000000' ) +*nodenumber = '0' +*isrootnode = 'X' +*entityname = 'Test55' +*parententityname = '' +*datasource = 'ZDMO_UUID_HEADER' +*parentdatasource = '' +*viewtypevalue = '' +*fieldnameobjectid = '' +*fieldnameetagmaster = '' +*fieldnametotaletag = '' +*fieldnameuuid = '' +*fieldnameparentuuid = '' +*fieldnamerootuuid = '' +*fieldnamecreatedby = '' +*fieldnamecreatedat = '' +*fieldnamelastchangedby = '' +*fieldnamelastchangedat = '' +*fieldnameloclastchangedat = '' +*cdsiview = 'ZI_Test55TP_55' +*cdsrview = 'ZR_Test55TP_55' +*cdspview = 'ZC_Test55TP_55' +*mdeview = 'ZC_Test55TP_55' +*behaviorimplementationclass = 'ZBP_R_Test55TP_55' +*servicedefinition = 'ZUI_Test55_55' +*servicebinding = 'ZUI_Test55_O4_55' +*controlstructure = '' +*queryimplementationclass = '' +*drafttablename = 'ZTEST5500D_55' +** +* hierarchydistancefromroot = '0' +* hierarchydescendantcount = '0' +* hierarchydrillstate = `` +* hierarchypreorderrank = '0' +* locallastchangedat = '20230318105741.0634310' +* ischildnode = '' +* istable = '' +* iscdsview = '' +* isabstractentity = '' +*) +** ) + + + DATA(a) = 1. + + ENDMETHOD. + + METHOD addChildDataSourceAbsEntity. + DATA(a) = 1. + + DATA keys_for_add_child_node TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp\\node~addChildNode . + FIELD-SYMBOLS: <fs_key_for_add_child_node> LIKE LINE OF keys_for_add_child_node. + + keys_for_add_child_node = CORRESPONDING #( DEEP keys ). + + "set DataSourceType to table + LOOP AT keys_for_add_child_node ASSIGNING <fs_key_for_add_child_node>. + <fs_key_for_add_child_node>-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity. + ENDLOOP. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + EXECUTE addChildNode + FROM keys_for_add_child_node + RESULT DATA(result_add_child_node). + +* result = CORRESPONDING #( DEEP result_add_child_node ). + + ENDMETHOD. + + METHOD addChildDataSourceCDSview. + DATA(a) = 1. + + DATA keys_for_add_child_node TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp\\node~addChildNode . + FIELD-SYMBOLS: <fs_key_for_add_child_node> LIKE LINE OF keys_for_add_child_node. + + keys_for_add_child_node = CORRESPONDING #( DEEP keys ). + + "set DataSourceType to table + LOOP AT keys_for_add_child_node ASSIGNING <fs_key_for_add_child_node>. + <fs_key_for_add_child_node>-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-cds_view. + ENDLOOP. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + EXECUTE addChildNode + FROM keys_for_add_child_node + RESULT DATA(result_add_child_node). + +* result = CORRESPONDING #( DEEP result_add_child_node ). + + ENDMETHOD. + + METHOD addChildDataSourceTable. + + DATA(a) = 1. + + DATA keys_for_add_child_node TYPE TABLE FOR ACTION IMPORT zdmo_r_rapg_projecttp\\node~addChildNode . + FIELD-SYMBOLS: <fs_key_for_add_child_node> LIKE LINE OF keys_for_add_child_node. + + keys_for_add_child_node = CORRESPONDING #( DEEP keys ). + + "set DataSourceType to table + LOOP AT keys_for_add_child_node ASSIGNING <fs_key_for_add_child_node>. + <fs_key_for_add_child_node>-%param-DataSourceType = zdmo_cl_rap_node=>data_source_types-table. + ENDLOOP. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + EXECUTE addChildNode + FROM keys_for_add_child_node + RESULT DATA(result_add_child_node). + +* result = CORRESPONDING #( DEEP result_add_child_node ). + + ENDMETHOD. + + METHOD SetFieldNames. + + DATA rapbo TYPE STRUCTURE FOR READ RESULT ZDMO_R_RAPG_ProjectTP\\node\_Project . + + + DATA my_node TYPE REF TO ZDMO_cl_rap_node. + DATA parent_node TYPE REF TO ZDMO_cl_rap_node. + + + DATA update_bo_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project . + + DATA update TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node. + DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Node . + + DATA draft_keys TYPE TABLE FOR DETERMINATION zDMO_R_RAPG_ProjectTP\\Node~SetRepositoryObjectNames_det." rapgeneratorbonode~setrepositoryobjectnames. + + DATA create_log_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_NodeTP\_Field. + DATA create_log_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_NodeTP\_Field. + + +* todo check why we only use draft keys here +* when the action is not enabled in non draft this would not be necessary + + draft_keys = VALUE #( FOR draft_key IN keys WHERE ( %is_draft = if_abap_behv=>mk-on ) + ( + %is_draft = draft_key-%is_draft + nodeuuid = draft_key-nodeuuid + "Component Groups + %key = draft_key-%key + %tky = draft_key-%tky + %pky = draft_key-%pky + ) ) . + + CHECK draft_keys IS NOT INITIAL. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node BY \_Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + +* +* " Process all affected RAPBos. Read respective nodes, +* " determine the implementation type of the RAP BO +* +* LOOP AT rapbos INTO DATA(rapbo). + + + + " read a dummy field + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + ALL FIELDS "( entityname cdsiview cdspview ) + WITH CORRESPONDING #( draft_keys ) + RESULT DATA(rapbo_nodes). + +* update_bo_line-%tky = rapbo-%tky. + + "loop will start with the root node + SORT rapbo_nodes BY hierarchydistancefromroot ASCENDING. + + +* root_node = NEW ZDMO_cl_rap_node( ). +* root_node->set_is_root_node( ). +* root_node->set_xco_lib( my_xco_lib ). +* root_node->set_draft_enabled( rapbo-draftenabled ). +* root_node->set_prefix( rapbo-prefix ). +* root_node->set_suffix( rapbo-suffix ). +* root_node->set_namespace( CONV #( rapbo-namespace ) ). +* root_node->set_binding_type( CONV #( rapbo-bindingtype ) ). +* root_node->set_implementation_type( CONV #( rapbo-implementationtype ) ). +* root_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ). + + LOOP AT rapbo_nodes INTO DATA(rapbo_node). + + CLEAR rapbo. + + IF line_exists( rapbos[ rapbouuid = rapbo_node-rapbouuid ] ). + rapbo = rapbos[ rapbouuid = rapbo_node-rapbouuid ]. + ENDIF. + + CHECK rapbo IS NOT INITIAL. + + DATA my_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + + IF rapbo-abaplanguageversion = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development. + my_xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ELSE. + my_xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ) . + ENDIF. + + CLEAR update_bo_line. + + CLEAR update_line. + update_line-%tky = rapbo_node-%tky. + + "values must be explictly set to ''. + "Because if fields are initial their content is not updated via EML + + update_line-fieldnameobjectid = ''. + update_line-viewtypevalue = ''. + update_line-fieldnameuuid = ''. + update_line-fieldnameparentuuid = ''. + update_line-fieldnamerootuuid = ''. + update_line-fieldnameetagmaster = ''. + update_line-fieldnamecreatedat = ''. + update_line-fieldnamecreatedby = ''. + update_line-fieldnametotaletag = ''. + update_line-fieldnamelastchangedby = ''. + update_line-FieldNameLastChangedAt = ''. + +* update_line-fieldnameobjectid = ''. + + CHECK rapbo_node-datasource IS NOT INITIAL. + + IF line_exists( rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ] ). + update_line-parententityname = rapbo_nodes[ nodeuuid = rapbo_node-parentuuid ]-entityname. + ENDIF. + + + TRY. + + my_node = NEW ZDMO_cl_rap_node( ). + my_node->set_xco_lib( my_xco_lib ). + my_node->set_implementation_type( CONV #( rapbo-implementationtype ) ). + my_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ). + my_node->set_data_source( CONV #( rapbo_node-datasource ) ). + + update_line-viewtypevalue = my_node->view_type_value. + + IF rapbo-implementationtype = 'managed_uuid'. + + my_node->set_field_name_uuid( ). "CONV string( rapbo_node-FieldNameUUID ) ). + update_line-fieldnameuuid = to_upper( my_node->field_name-uuid ). + + IF rapbo_node-hierarchydistancefromroot > 0. + my_node->set_field_name_parent_uuid( ). "CONV string( rapbo_node-FieldNameParentUUID ) ). + update_line-fieldnameparentuuid = to_upper( my_node->field_name-parent_uuid ). + ENDIF. + + IF rapbo_node-hierarchydistancefromroot > 1. + my_node->set_field_name_root_uuid( ) . + update_line-fieldnamerootuuid = to_upper( my_node->field_name-root_uuid ). + ENDIF. + + ELSE. + update_line-fieldnameuuid = ''. + update_line-fieldnameparentuuid = ''. + update_line-fieldnamerootuuid = ''. + ENDIF. + + my_node->set_field_name_etag_master( ). + update_line-fieldnameetagmaster = to_upper( my_node->field_name-etag_master ). + + my_node->set_field_name_loc_last_chg_at( ). + update_line-FieldNameLocLastChangedAt = to_upper( my_node->field_name-local_instance_last_changed_at ). + + + IF rapbo_node-isrootnode = abap_true. + + my_node->set_is_root_node( ). + my_node->set_draft_enabled( rapbo-draftenabled ). + + my_node->set_object_id( ). " rapbo_node-FieldNameObjectID ). + update_line-fieldnameobjectid = to_upper( my_node->object_id ). + + + my_node->set_field_name_total_etag( ). + update_line-fieldnametotaletag = to_upper( my_node->field_name-total_etag ). + + my_node->set_field_name_created_at( ). + update_line-fieldnamecreatedat = to_upper( my_node->field_name-created_at ). + + my_node->set_field_name_created_by( ). + update_line-fieldnamecreatedby = to_upper( my_node->field_name-created_by ). + + my_node->set_field_name_last_changed_by( ). + update_line-fieldnamelastchangedby = to_upper( my_node->field_name-last_changed_by ). + + my_node->set_field_name_last_changed_at( ). + update_line-fieldnamelastchangedat = to_upper( my_node->field_name-last_changed_at ). + + ELSE. + + parent_node = NEW ZDMO_cl_rap_node( ). + parent_node->set_xco_lib( my_xco_lib ). + parent_node->set_implementation_type( CONV #( rapbo-implementationtype ) ). + parent_node->set_data_source_type( CONV #( rapbo-datasourcetype ) ). + parent_node->set_data_source( CONV #( rapbo_node-parentdatasource ) ). + + IF rapbo-implementationtype = 'managed_semantic' OR + rapbo-implementationtype = 'unmanaged_semantic'. + + LOOP AT my_node->semantic_key INTO DATA(semantic_key_field). + IF NOT line_exists( parent_node->semantic_key[ name = semantic_key_field-name ] ). + update_line-fieldnameobjectid = to_upper( semantic_key_field-name ). + EXIT. + ENDIF. + ENDLOOP. + + ENDIF. + + ENDIF. + + CATCH ZDMO_cx_rap_generator INTO DATA(rap_node_exception). + DATA(exception_text) = rap_node_exception->get_text( ). + ENDTRY. + + DATA n TYPE i. + "get fields + + CLEAR create_log_cba. + + LOOP AT my_node->lt_fields INTO DATA(field) + WHERE cds_view_field IS NOT INITIAL AND + name IS NOT INITIAL + "hide client field in RAP Generator UI + AND + name <> my_node->field_name-client + . + n += 1 . + + create_log_cba_line = VALUE #( %is_draft = if_abap_behv=>mk-on + %key-NodeUUID = update_line-NodeUUID + %cid_ref = update_line-%cid_ref + %target = VALUE #( ( + %is_draft = if_abap_behv=>mk-on + %cid = |Hugo{ n }| " ggg + CdsViewField = field-cds_view_field + DbtableField = field-name + IsKey = field-key_indicator + + ) ) ) . + APPEND create_log_cba_line TO create_log_cba. + + ENDLOOP. + + + APPEND update_line TO update. + +* ENDLOOP. + +* APPEND update_bo_line TO update_bo. + + ENDLOOP. + + + " Update repository object name proposals of all relevant entities + " Update the parent entity name + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE +* ENTITY Project +* UPDATE FIELDS ( +* boname +* ADTLink +* ) WITH update_bo + ENTITY Node + UPDATE FIELDS ( + + fieldnameobjectid + + viewtypevalue + + fieldnameuuid + fieldnameparentuuid + fieldnamerootuuid + + fieldnameetagmaster + fieldnametotaletag + + fieldnamecreatedat + fieldnamecreatedby + FieldNameLastChangedAt + fieldnamelastchangedby + + FieldNameLocLastChangedAt + + ) WITH update + + CREATE BY \_Field + FIELDS ( CdsViewField DbtableField IsKey ) + WITH create_log_cba + + + REPORTED DATA(update_reported) + FAILED DATA(update_failed) + MAPPED DATA(update_mapped). + + reported = CORRESPONDING #( DEEP update_reported ). + + + ENDMETHOD. + + METHOD mandatory_fields_check. + + DATA permission_request TYPE STRUCTURE FOR PERMISSIONS REQUEST ZDMO_C_RAPG_NodeTP. + DATA reported_node_line LIKE LINE OF reported-node. + + "check permissions of the following fields + permission_request-%field-FieldNameObjectID = if_abap_behv=>mk-on. + permission_request-%field-ExtensibilityElementSuffix = if_abap_behv=>mk-on. + + " Get current field values + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Node + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(nodes). + + "Do check + LOOP AT nodes INTO DATA(node). + + GET PERMISSIONS ONLY INSTANCE ENTITY ZDMO_C_RAPG_NodeTP + FROM VALUE #( ( NodeUUID = node-NodeUUID ) ) + REQUEST permission_request + RESULT DATA(permission_result) + FAILED DATA(failed_permission_result) + REPORTED DATA(reported_permission_result). + + IF permission_result-global-%field-FieldNameObjectID = if_abap_behv=>fc-f-mandatory + AND node-FieldNameObjectID IS INITIAL +* or +* permission_result-global-%field-ExtensibilityElementSuffix = if_abap_behv=>fc-f-mandatory +* AND node-ExtensibilityElementSuffix IS INITIAL + . + + APPEND VALUE #( %tky = node-%tky ) TO failed-project. + + CLEAR reported_node_line. + reported_node_line-%tky = node-%tky. + reported_node_line-%element-fieldnameobjectid = if_abap_behv=>mk-on. + reported_node_line-%msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 071 + severity = if_abap_behv_message=>severity-error + v1 = | object id | + v2 = |{ node-EntityName }| ). + APPEND reported_node_line TO reported-node. + ENDIF. + IF line_exists( permission_result-instances[ NodeUUID = node-NodeUUID ] ). + IF permission_result-instances[ NodeUUID = node-NodeUUID ]-%field-ExtensibilityElementSuffix = if_abap_behv=>fc-f-mandatory + AND node-ExtensibilityElementSuffix IS INITIAL + . + + APPEND VALUE #( %tky = node-%tky ) TO failed-project. + + CLEAR reported_node_line. + reported_node_line-%tky = node-%tky. + reported_node_line-%element-ExtensibilityElementSuffix = if_abap_behv=>mk-on. + reported_node_line-%msg = new_message( id = 'ZDMO_CM_RAP_GEN_MSG' + number = 071 + severity = if_abap_behv_message=>severity-error + v1 = | Extensibility Element Suffix | + v2 = |{ node-EntityName }| ). + APPEND reported_node_line TO reported-node. + + ENDIF. + ENDIF. + ENDLOOP. + + + ENDMETHOD. + +ENDCLASS. + +CLASS lhc_Field DEFINITION INHERITING FROM cl_abap_behavior_handler. + PRIVATE SECTION. + + METHODS CalculateDbtableField FOR DETERMINE ON SAVE + IMPORTING keys FOR Field~CalculateDbtableField. + METHODS get_instance_features FOR INSTANCE FEATURES + IMPORTING keys REQUEST requested_features FOR field RESULT result. + +ENDCLASS. + +CLASS lhc_Field IMPLEMENTATION. + + METHOD CalculateDbtableField. + ENDMETHOD. + + METHOD get_instance_features. + + "read all child instances + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY field + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbo_node_fields). + + "read all links from child instances to the corresponding root entity + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY field BY \_Project + FROM CORRESPONDING #( rapbo_node_fields ) + LINK DATA(rapbo_nodes_links). + + "read all parent entities of the child entities + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE + ENTITY Field BY \_Project + ALL FIELDS + WITH CORRESPONDING #( keys ) + RESULT DATA(rapbos). + + "read all root entities of the child entities +* READ ENTITIES OF ZDMO_R_RAPG_ProjectTP IN LOCAL MODE +* ENTITY Project BY \_Project +* ALL FIELDS +* WITH CORRESPONDING #( keys ) +* RESULT DATA(rapbos). + + + + + LOOP AT rapbo_node_fields INTO DATA(rapbo_node). + + "use link data to retrieve the data of the parent entity of the currently selected child entity +* DATA(rapbo) = rapbos[ rapbouuid = rapbo_nodes_links[ source-nodeuuid = rapbo_node-nodeuuid ]-target-rapbouuid ]. + + APPEND VALUE #( %tky = rapbo_node-%tky + + + %field-iskey = COND #( WHEN rapbos[ 1 ]-DataSourceType = zdmo_cl_rap_node=>data_source_types-abap_type + THEN if_abap_behv=>fc-f-unrestricted + ELSE if_abap_behv=>fc-f-read_only ) + + + ) TO result. + ENDLOOP. + + + ENDMETHOD. + +ENDCLASS. + +CLASS lsc_ZDMO_R_RAPG_PROJECTTP DEFINITION INHERITING FROM cl_abap_behavior_saver. + PROTECTED SECTION. + + METHODS save_modified REDEFINITION. + + METHODS cleanup_finalize REDEFINITION. + +ENDCLASS. + +CLASS lsc_ZDMO_R_RAPG_PROJECTTP IMPLEMENTATION. + + METHOD save_modified. + + DATA(xco_lib) = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + DATA xco_api TYPE REF TO zdmo_cl_rap_xco_lib. + DATA bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn . + DATA bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn . + DATA async_process_name TYPE string. +* DATA start_bgpf_operation TYPE REF TO zdmo_cl_rap_generator_strtbgpf. + + IF xco_lib->on_premise_branch_is_used( ). + xco_api = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_api = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + + LOOP AT update-project INTO DATA(update_rapgeneratorbo) + WHERE + ( BoIsGenerated = abap_true AND + %control-BoIsGenerated = if_abap_behv=>mk-on ) + OR + ( BoIsDeleted = abap_true AND + %control-BoIsDeleted = if_abap_behv=>mk-on ) + . + TRY. + IF update_rapgeneratorbo-BoIsDeleted = abap_true. + bgpf_del_operation = NEW zdmo_cl_rap_generator_del_asyn( + i_boname = update_rapgeneratorbo-BoName + ). + ELSEIF update_rapgeneratorbo-boisgenerated = abap_true. + bgpf_operation = NEW zdmo_cl_rap_generator_asyn( + i_json_string = update_rapgeneratorbo-JsonString + i_package_language_version = update_rapgeneratorbo-PackageLanguageVersion + i_rap_bo_uuid = update_rapgeneratorbo-RapBoUUID + ). + ENDIF. + + IF xco_api->get_class( 'zdmo_cl_rap_generator_strtbgpf' )->exists( ). + DATA(background_process) = cl_bgmc_process_factory=>get_default( )->create( ). + IF update_rapgeneratorbo-BoIsDeleted = abap_true. + zdmo_cl_rap_generator_strtbgpf=>create_for_del_bgpf( + EXPORTING + i_bgpf_del_operation = bgpf_del_operation + i_operation_text = |Delete { update_rapgeneratorbo-BoName }| + RECEIVING + result = DATA(start_bgpf_operation) + ). + start_bgpf_operation->start_execution( ). +* background_process->set_operation_tx_uncontrolled( bgpf_del_operation ). +* background_process->set_name( CONV #( |Generate { update_rapgeneratorbo-BoName }| ) ). + ELSEIF update_rapgeneratorbo-BoIsGenerated = abap_true. + zdmo_cl_rap_generator_strtbgpf=>create_for_bgpf( + EXPORTING + i_bgpf_operation = bgpf_operation + i_operation_text = |Generate { update_rapgeneratorbo-BoName }| + RECEIVING + result = start_bgpf_operation + ). + start_bgpf_operation->start_execution( ). +* background_process->set_operation_tx_uncontrolled( bgpf_operation ). +* background_process->set_name( CONV #( |Generate { update_rapgeneratorbo-BoName }| ) ). + ENDIF. + ELSE. +* background_process->save_for_execution( ). + DATA(lo_parallel) = NEW cl_abap_parallel( ). + lo_parallel->run_inst( + EXPORTING + p_in_tab = VALUE #( ( bgpf_operation ) ) + IMPORTING + p_out_tab = DATA(lt_out) + ). + + ENDIF. + + CATCH cx_root INTO DATA(exception). + "handle exception + DATA(latest_t100_exception) = cl_message_helper=>get_latest_t100_exception( exception ). + IF latest_t100_exception IS NOT INITIAL. + DATA(exception_text) = latest_t100_exception->if_message~get_text( ). + ELSE. + exception_text = exception->get_text( ). + ENDIF. + ENDTRY. + + ENDLOOP. + + ENDMETHOD. + + METHOD cleanup_finalize. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zdmo_bp_rapg_all.clas.xml b/src/zdmo_bp_rapg_all.clas.xml new file mode 100644 index 0000000..ca43ac3 --- /dev/null +++ b/src/zdmo_bp_rapg_all.clas.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_BP_RAPG_ALL</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Behavior Implementation for ZDMO_R_RAPG_PROJECTTP</DESCRIPT> + <CATEGORY>06</CATEGORY> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + <CLSDEFINT>ZDMO_R_RAPG_PROJECTTP</CLSDEFINT> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_fieldtp.ddls.asddls b/src/zdmo_c_rapg_fieldtp.ddls.asddls new file mode 100644 index 0000000..0954a0d --- /dev/null +++ b/src/zdmo_c_rapg_fieldtp.ddls.asddls @@ -0,0 +1,22 @@ +@AccessControl.authorizationCheck: #CHECK +@Metadata.allowExtensions: true +@EndUserText.label: 'Projection View forField' +@ObjectModel.semanticKey: [ 'DbtableField' ] +@Search.searchable: true +define view entity ZDMO_C_RAPG_FieldTP + as projection on ZDMO_R_RAPG_FieldTP +{ + key FieldUUID, + NodeUUID, + RapboUUID, + IsKey, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + + DbtableField, + CdsViewField, + LocalLastChangedAt, + _Node : redirected to parent ZDMO_C_RAPG_NodeTP, + _Project : redirected to ZDMO_C_RAPG_ProjectTP + +} diff --git a/src/zdmo_c_rapg_fieldtp.ddls.baseinfo b/src/zdmo_c_rapg_fieldtp.ddls.baseinfo new file mode 100644 index 0000000..24736e2 --- /dev/null +++ b/src/zdmo_c_rapg_fieldtp.ddls.baseinfo @@ -0,0 +1,26 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_R_RAPG_FIELDTP" +], +"ASSOCIATED": +[ +"ZDMO_C_RAPG_NODETP", +"ZDMO_C_RAPG_PROJECTTP", +"ZDMO_R_RAPG_NODETP", +"ZDMO_R_RAPG_PROJECTTP" +], +"BASE": +[ +"ZDMO_R_RAPG_FIELDTP" +], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_fieldtp.ddls.xml b/src/zdmo_c_rapg_fieldtp.ddls.xml new file mode 100644 index 0000000..0ef6731 --- /dev/null +++ b/src/zdmo_c_rapg_fieldtp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_C_RAPG_FIELDTP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Projection View for Field</DDTEXT> + <SOURCE_TYPE>P</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_fieldtp.ddlx.asddlxs b/src/zdmo_c_rapg_fieldtp.ddlx.asddlxs new file mode 100644 index 0000000..1e63bd5 --- /dev/null +++ b/src/zdmo_c_rapg_fieldtp.ddlx.asddlxs @@ -0,0 +1,75 @@ +@Metadata.layer: #CUSTOMER +@UI: { + headerInfo: { + typeName: 'Field', + typeNamePlural: 'Fields', + title: { + type: #STANDARD, + label: 'Field', + value: 'DbtableField' + } + }, + presentationVariant: [ { + sortOrder: [ { + by: 'DbtableField', + direction: #DESC + } ], + visualizations: [ { + type: #AS_LINEITEM + } ] + } ] +} +annotate view ZDMO_C_RAPG_FieldTP with +{ + @UI.facet: [ { + id: 'idField', + purpose: #STANDARD, + type: #IDENTIFICATION_REFERENCE, + label: 'Field', + position: 10 + } ] + @UI.hidden: true + FieldUUID; + + @UI.hidden: true + NodeUUID; + + @UI.hidden: true + RapboUUID; + + @UI.lineItem: [ { + label : 'Key Field', + position: 35 , + importance: #HIGH + } ] + @UI.identification: [ { + label : 'Key Field', + position: 35 + } ] + IsKey; + + @UI.lineItem: [ { + label : 'Fieldname datasource', + position: 40 , + importance: #HIGH + } ] + @UI.identification: [ { + label : 'Fieldname datasource', + position: 40 + } ] + DbtableField; + + @UI.lineItem: [ { + label : 'Fieldname CDS view', + position: 50 , + importance: #HIGH + } ] + @UI.identification: [ { + label : 'Fieldname CDS view', + position: 50 + } ] + CdsViewField; + + @UI.hidden: true + LocalLastChangedAt; +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_fieldtp.ddlx.xml b/src/zdmo_c_rapg_fieldtp.ddlx.xml new file mode 100644 index 0000000..f556249 --- /dev/null +++ b/src/zdmo_c_rapg_fieldtp.ddlx.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLX> + <METADATA> + <NAME>ZDMO_C_RAPG_FIELDTP</NAME> + <DESCRIPTION>MDE for Field</DESCRIPTION> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + </METADATA> + </DDLX> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_logtp.ddls.asddls b/src/zdmo_c_rapg_logtp.ddls.asddls new file mode 100644 index 0000000..a3ddb44 --- /dev/null +++ b/src/zdmo_c_rapg_logtp.ddls.asddls @@ -0,0 +1,22 @@ +@AccessControl.authorizationCheck: #CHECK +@Metadata.allowExtensions: true +@EndUserText.label: 'Projection View forLog' +@ObjectModel.semanticKey: [ 'LogItemNumber' ] +@Search.searchable: true +define view entity ZDMO_C_RAPG_LogTP + as projection on ZDMO_R_RAPG_LogTP +{ + key LogUUID, + RapBoUUID, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + LogItemNumber, + DetailLevel, + Severity, + Criticality, + Text, + TimeStamp, + LocalLastChangedAt, + _Project : redirected to parent ZDMO_C_RAPG_ProjectTP + +} diff --git a/src/zdmo_c_rapg_logtp.ddls.baseinfo b/src/zdmo_c_rapg_logtp.ddls.baseinfo new file mode 100644 index 0000000..b99f243 --- /dev/null +++ b/src/zdmo_c_rapg_logtp.ddls.baseinfo @@ -0,0 +1,24 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_R_RAPG_LOGTP" +], +"ASSOCIATED": +[ +"ZDMO_C_RAPG_PROJECTTP", +"ZDMO_R_RAPG_PROJECTTP" +], +"BASE": +[ +"ZDMO_R_RAPG_LOGTP" +], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_logtp.ddls.xml b/src/zdmo_c_rapg_logtp.ddls.xml new file mode 100644 index 0000000..1091152 --- /dev/null +++ b/src/zdmo_c_rapg_logtp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_C_RAPG_LOGTP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Projection View for Log</DDTEXT> + <SOURCE_TYPE>P</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_logtp.ddlx.asddlxs b/src/zdmo_c_rapg_logtp.ddlx.asddlxs new file mode 100644 index 0000000..4f265da --- /dev/null +++ b/src/zdmo_c_rapg_logtp.ddlx.asddlxs @@ -0,0 +1,100 @@ +@Metadata.layer: #CUSTOMER +@UI: { + headerInfo: { + typeName: 'Log', + typeNamePlural: 'Logs', + title: { + type: #STANDARD, + label: 'Log', + value: 'LogItemNumber' + } + }, + presentationVariant: [ { + qualifier: 'pvariant', + sortOrder: [ + { + by: 'LogItemNumber', + direction: #DESC + } + ], + visualizations: [ { + type: #AS_LINEITEM, + element: 'DetailLevel' + } ] + } ] + +} + + + + + +annotate view ZDMO_C_RAPG_LogTP with +{ + @UI.facet: [ { + id: 'idLog', + purpose: #STANDARD, + type: #IDENTIFICATION_REFERENCE, + label: 'Log', + position: 10 + } ] + @UI.hidden: true + LogUUID; + + @UI.hidden: true + RapBoUUID; + + @UI.lineItem: [ { + position: 30 , + importance: #HIGH + } ] + @UI.identification: [ { + position: 30 + } ] + @UI.selectionField: [ { position: 30 } ] + LogItemNumber; + + @UI.lineItem: [ { + position: 40 , + importance: #HIGH + } ] + @UI.identification: [ { + position: 40 + } ] + DetailLevel; + + @UI.lineItem: [ { + position: 50 , + importance: #HIGH, + criticality: 'Criticality' + } ] + @UI.identification: [ { + position: 50 , + criticality: 'Criticality' + } ] + Severity; + + @UI.hidden: true + Criticality; + + @UI.lineItem: [ { + position: 60 , + importance: #HIGH + } ] + @UI.identification: [ { + position: 60 + } ] + Text; + + @UI.lineItem: [ { + position: 70 , + importance: #HIGH + } ] + @UI.identification: [ { + position: 70 + } ] + TimeStamp; + + @UI.hidden: true + LocalLastChangedAt; +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_logtp.ddlx.xml b/src/zdmo_c_rapg_logtp.ddlx.xml new file mode 100644 index 0000000..be7fdf2 --- /dev/null +++ b/src/zdmo_c_rapg_logtp.ddlx.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLX> + <METADATA> + <NAME>ZDMO_C_RAPG_LOGTP</NAME> + <DESCRIPTION>MDE for Log</DESCRIPTION> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + </METADATA> + </DDLX> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_nodetp.ddls.asddls b/src/zdmo_c_rapg_nodetp.ddls.asddls new file mode 100644 index 0000000..0a64988 --- /dev/null +++ b/src/zdmo_c_rapg_nodetp.ddls.asddls @@ -0,0 +1,161 @@ +@AccessControl.authorizationCheck: #CHECK +@Metadata.allowExtensions: true +@EndUserText.label: 'Projection View forNode' +@ObjectModel.semanticKey: [ 'EntityName' ] +@Search.searchable: true +define view entity ZDMO_C_RAPG_NodeTP + as projection on ZDMO_R_RAPG_NodeTP +{ + key NodeUUID, + RapBoUUID, + ParentUUID, + RootUUID, + NodeNumber, + IsRootNode, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + EntityName, + // @Consumption.valueHelpDefinition: [{ association : '_Entity' }] + // @Consumption.valueHelp: '_Entity' + + @Consumption.valueHelpDefinition: [{ entity: + { name : 'ZDMO_C_RAPG_NodeTP' , element: 'EntityName' } + , + additionalBinding: [{ element: 'RapBoUUID', + localElement: 'RapBoUUID' }] + }] + ParentEntityName, + @Consumption.valueHelpDefinition: [{ entity: + { name : 'ZDMO_I_RAP_GENERATOR_DATA_SRC2' , element: 'name' } + , + additionalBinding: [{ element: 'type', + localElement: 'DataSourceType' }] + }] + DataSource, + + + ParentDataSource, + ViewTypeValue, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameObjectID, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameEtagMaster, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameTotalEtag, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameUUID, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameParentUUID, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameRootUUID, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameCreatedBy, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameCreatedAt, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameLastChangedBy, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameLastChangedAt, + @Consumption.valueHelpDefinition: [ {entity: {name: 'ZDMO_I_RAP_GENERATOR_FIELDS', element: 'field'}, + additionalBinding: [ { localElement: 'ABAPLanguageVersion', element: 'language_version'}, + { localElement: 'DataSourceType', element: 'type'}, + { localElement: 'DataSource', element: 'name'} ] } ] + FieldNameLocLastChangedAt, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + CdsIView, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + CdsIViewBasic, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + CdsRView, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + CdsPView, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + MdeView, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + BehaviorImplementationClass, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + ServiceDefinition, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + ServiceBinding, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + ControlStructure, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + QueryImplementationClass, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + DraftTableName, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + ExtensionInclude, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + ExtensionIncludeView, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + DraftQueryView, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + SAPObjectNodeType, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + SAPObjectType, + HierarchyDistanceFromRoot, + HierarchyDescendantCount, + HierarchyDrillState, + HierarchyPreorderRank, + LocalLastChangedAt, + ExtensibilityElementSuffix, + isChildNode, + + _Project.isManaged as isManaged, + _Project.hasSematicKey as hasSemanticKey, + _Project.doesNotUseUnmanagedQuery as doesNotUseUnmanagedQuery, + _Project.DataSourceType as DataSourceType, + _Project.AbapLanguageVersion as ABAPLanguageVersion, + _Project.PackageName as PackageName, + _Field : redirected to composition child ZDMO_C_RAPG_FieldTP, + _Project : redirected to parent ZDMO_C_RAPG_ProjectTP + // , + // _Entity + +} diff --git a/src/zdmo_c_rapg_nodetp.ddls.baseinfo b/src/zdmo_c_rapg_nodetp.ddls.baseinfo new file mode 100644 index 0000000..70ee87d --- /dev/null +++ b/src/zdmo_c_rapg_nodetp.ddls.baseinfo @@ -0,0 +1,27 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_R_RAPG_NODETP", +"ZDMO_R_RAPG_PROJECTTP" +], +"ASSOCIATED": +[ +"ZDMO_C_RAPG_FIELDTP", +"ZDMO_C_RAPG_PROJECTTP", +"ZDMO_R_RAPG_FIELDTP", +"ZDMO_R_RAPG_PROJECTTP" +], +"BASE": +[ +"ZDMO_R_RAPG_NODETP" +], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_nodetp.ddls.xml b/src/zdmo_c_rapg_nodetp.ddls.xml new file mode 100644 index 0000000..e715559 --- /dev/null +++ b/src/zdmo_c_rapg_nodetp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_C_RAPG_NODETP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Projection View for Node</DDTEXT> + <SOURCE_TYPE>P</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_nodetp.ddlx.asddlxs b/src/zdmo_c_rapg_nodetp.ddlx.asddlxs new file mode 100644 index 0000000..0863bc9 --- /dev/null +++ b/src/zdmo_c_rapg_nodetp.ddlx.asddlxs @@ -0,0 +1,364 @@ +@Metadata.layer: #CUSTOMER +@UI: { + headerInfo: { + typeName: 'Entity', + typeNamePlural: 'Entities', + title: { + type: #STANDARD, + label: 'Entity', + value: 'EntityName' + } + }, + presentationVariant: [ { + sortOrder: [ + { + by: 'HierarchyDistanceFromRoot', + direction: #ASC + } +// , +// { +// by: 'EntityName', +// direction: #DESC +// } + + ], + visualizations: [ { + type: #AS_LINEITEM + } ] + } ] +} +annotate view ZDMO_C_RAPG_NodeTP with +{ + + + @UI.facet: [ + // { + // id: 'idCollection', + // type: #COLLECTION, + // label: 'Entity', + // position: 10 + // }, + // { + // id: 'idIdentification', + // parentId: 'idCollection', + // type: #IDENTIFICATION_REFERENCE, + // label: 'General Information', + // position: 10 + // }, + + { label : 'Entity details', + id : 'Facet_05', + purpose : #STANDARD, + type : #COLLECTION, + position : 05 }, + { id : 'FieldGroup_05', + purpose : #STANDARD, + parentId : 'Facet_05', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_05', + position : 05 }, + + + //Facet and field groups for field name mapping + { label : 'Map fields for behavior definition', + id : 'Facet_10', + purpose : #STANDARD, + type : #COLLECTION, + position : 10 }, + { id : 'FieldGroup_10', + purpose : #STANDARD, + parentId : 'Facet_10', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_10', + position : 10 }, + + { label : 'Map fields for @ObjectModel annotation', + id : 'Facet_15', + purpose : #STANDARD, + type : #COLLECTION, + position : 15 }, + { id : 'FieldGroup_15', + purpose : #STANDARD, + parentId : 'Facet_15', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_15', + position : 15 }, + + { label : 'Map fields for parent and root UUID', + id : 'Facet_20', + purpose : #STANDARD, + type : #COLLECTION, + // hidden : #(hasSemanticKey), + position : 20 }, + { id : 'FieldGroup_20', + purpose : #STANDARD, + parentId : 'Facet_20', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_20', + position : 20 }, + + { label : 'Map fields for @Semantics annotation', + id : 'Facet_30', + purpose : #STANDARD, + type : #COLLECTION, + position : 30 }, + { id : 'FieldGroup_30', + purpose : #STANDARD, + parentId : 'Facet_30', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_30', + position : 30 }, + + // { label : 'Map Etag and semantic key', + // id : 'FieldGroup_10_1', + // purpose : #STANDARD, + // parentId : 'FieldGroup_10', + // type : #FIELDGROUP_REFERENCE, + // targetQualifier: 'FieldGroup_10_1', + // position : 10 }, + // + // { label : 'Map parent and root UUID', + // id : 'FieldGroup_10_2', + // purpose : #STANDARD, + // parentId : 'FieldGroup_10', + // type : #FIELDGROUP_REFERENCE, + // targetQualifier: 'FieldGroup_10_2', + // position : 20 }, + // + // { label : 'Map administrative fields', + // id : 'FieldGroup_10_3', + // purpose : #STANDARD, + // parentId : 'FieldGroup_10', + // type : #FIELDGROUP_REFERENCE, + // targetQualifier: 'FieldGroup_10_3', + // position : 30 }, + + //Facet and field groups for repository object names + + { label : 'Repository object names', + id : 'Facet_4', + purpose : #STANDARD, + type : #COLLECTION, + position : 40 }, + { id : 'FieldGroup_4', + purpose : #STANDARD, + parentId : 'Facet_4', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_4', + position : 40 }, + + { label : 'Extensibility object names', + id : 'Facet_5', + purpose : #STANDARD, + type : #COLLECTION, + position : 45 }, + { id : 'FieldGroup_5', + purpose : #STANDARD, + parentId : 'Facet_5', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_5', + position : 45 }, + + + { + id: 'idLineitem', + type: #LINEITEM_REFERENCE, + label: 'Field names', + position: 50 , + targetElement: '_Field' + } ] + + @UI.hidden: true + NodeUUID; + + @UI.hidden: true + RapBoUUID; + + @UI.hidden: true + ParentUUID; + + @UI.hidden: true + RootUUID; + + @UI.hidden: true + NodeNumber; + + @UI.identification: [ { + // @UI.lineItem: [ { + label: 'Is root node', + position: 10 , + importance: #HIGH + } + // , { + // label: 'Add Child', + // dataAction: 'addChildNode', + // type: #FOR_ACTION, + // position: 10 + // } + , { + label: 'Add Child based on tables', + dataAction: 'addChildDataSourceTable', + type: #FOR_ACTION, + position: 20 + } + , { + label: 'Add Child based on CDS', + dataAction: 'addChildDataSourceCDSview', + type: #FOR_ACTION, + position: 30 + } + , { + label: 'Add Child based on Abs. Entity', + dataAction: 'addChildDataSourceAbsEntity', + type: #FOR_ACTION, + position: 40 + } + ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 70, label: 'Is root node' }] + IsRootNode; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 10, label: 'Entity Name' }] + @UI.lineItem: [ { + label: 'Entity', + position: 20 , + importance: #HIGH + } ] + EntityName; + + @UI.lineItem: [ { + label: 'Parent Entity', + position: 30 , + importance: #HIGH + } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 40, label: 'Parent Entity Name' }] + ParentEntityName; + + @UI.lineItem: [ { + label: 'Data source', + position: 40 , + importance: #HIGH + } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 30, label: 'Data Source' }] + DataSource; + + @UI.lineItem: [ { + label: 'Parent data source', + position: 50 , + importance: #HIGH + } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_05', position: 50, label: 'Parent Data Source' }] + ParentDataSource; + + @UI.hidden: true + DataSourceType; + + @UI.hidden: true + ViewTypeValue; + + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_15', position: 10, label: 'semanticKey' }] + FieldNameObjectID; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_10', position: 20, label: 'etag master' }] + FieldNameEtagMaster; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_10', position: 30, label: 'total etag' }] + FieldNameTotalEtag; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_20', position: 10, label: 'UUID based key field' }] + FieldNameUUID; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_20', position: 20, label: 'Parent UUID' }] + FieldNameParentUUID; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_20', position: 30, label: 'Root UUID' }] + FieldNameRootUUID; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'user.createdBy: true' }] + FieldNameCreatedBy; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'systemDateTime.createdAt: true' }] + FieldNameCreatedAt; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'user.lastChangedBy: true' }] + FieldNameLastChangedBy; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'systemDateTime.lastChangedAt: true' }] + FieldNameLastChangedAt; + + @EndUserText.quickInfo: '@Semantics.systemDateTime.localInstanceLastChangedAt: true' + @UI.fieldGroup: [{ qualifier: 'FieldGroup_30', position: 20, label: 'localInstanceLastChangedAt' }] + FieldNameLocLastChangedAt; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 30, label: 'CDS Interface View / BDEF' }] + CdsIView; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'CDS Base View / BDEF' }] + CdsRView; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 15, label: 'CDS I View (Basic)' }] + CdsIViewBasic; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 20, label: 'CDS Projection View / BDEF / MDE' }] + CdsPView; + + // @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 40, label: 'Meta Data Extension' }] + @UI.hidden : true + MdeView; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 40, label: 'Behavior Implementation Class' }] + BehaviorImplementationClass; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 60, label: 'Service Definition' }] + ServiceDefinition; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 70, label: 'Service Binding' }] + ServiceBinding; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 150, label: 'SAP Object Node Type' }] + SAPObjectNodeType; + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 160, label: 'SAP Object Type' }] + SAPObjectType; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 100, label: 'Control Structure' + // , hidden : #(isManaged) + }] + ControlStructure; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 90, label: 'Query Implementation' + // , hidden : #(doesNotUseUnmanagedQuery) + }] + QueryImplementationClass; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 50, label: 'Draft table' }] + DraftTableName; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 50, label: 'Extensibility Element Suffix' }] + ExtensibilityElementSuffix; + @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 60, label: 'Extension Include' }] + ExtensionInclude; + @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 70, label: 'Extension Include View' }] + ExtensionIncludeView; + @UI.fieldGroup: [{ qualifier: 'FieldGroup_5', position: 80, label: 'Draft Query View' }] + DraftQueryView; + + @UI.lineItem: [ { + label: 'Distance from root', + position: 15 + , + importance: #HIGH + } ] + HierarchyDistanceFromRoot; + + @UI.hidden: true + HierarchyDescendantCount; + + @UI.hidden: true + HierarchyDrillState; + + @UI.hidden: true + HierarchyPreorderRank; + + @UI.hidden: true + LocalLastChangedAt; +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_nodetp.ddlx.xml b/src/zdmo_c_rapg_nodetp.ddlx.xml new file mode 100644 index 0000000..47e97ce --- /dev/null +++ b/src/zdmo_c_rapg_nodetp.ddlx.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLX> + <METADATA> + <NAME>ZDMO_C_RAPG_NODETP</NAME> + <DESCRIPTION>MDE for Node</DESCRIPTION> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + </METADATA> + </DDLX> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_projecttp.bdef.asbdef b/src/zdmo_c_rapg_projecttp.bdef.asbdef new file mode 100644 index 0000000..931eec8 --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.bdef.asbdef @@ -0,0 +1,76 @@ +projection; +strict ; +use draft; +use side effects; + +define behavior for ZDMO_C_RAPG_ProjectTP alias Project +use etag + +{ + + // use create; + use update; + use delete; + + use action Edit; + use action Activate; + use action Discard; + use action Resume; + use action Prepare; + + use action createProjectAndRootNode; + use action copyProject; + use action deleteProject; + use action generateProject; + + use association _Log + { + // create; + with draft; } + use association _Node + { +// create; + with draft; } +} + +define behavior for ZDMO_C_RAPG_LogTP alias Log +use etag + +{ + use update; + use delete; + + use association _Project { with draft; } +} + +define behavior for ZDMO_C_RAPG_NodeTP alias Node +use etag + +{ + use update; + use delete; + +// use action addChildNode; + use action addChildDataSourceAbsEntity; + use action addChildDataSourceCDSview; + use action addChildDataSourceTable; +// use action createRootNode; +// use action SetRepositoryObjectNames; + + use association _Project { with draft; } + use association _Field + { + // create; + with draft; } +} + +define behavior for ZDMO_C_RAPG_FieldTP alias Field +use etag + +{ + use update; + use delete; + + use association _Project { with draft; } + use association _Node { with draft; } +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_projecttp.bdef.xml b/src/zdmo_c_rapg_projecttp.bdef.xml new file mode 100644 index 0000000..76349ed --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.bdef.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_BDEF" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <BDEF> + <NAME>ZDMO_C_RAPG_PROJECTTP</NAME> + <TYPE>BDEF/BDO</TYPE> + <DESCRIPTION>Behavior for ZDMO_C_RAPG_ProjectTP</DESCRIPTION> + <DESCRIPTION_TEXT_LIMIT>60</DESCRIPTION_TEXT_LIMIT> + <LANGUAGE>EN</LANGUAGE> + <LINKS> + <item> + <HREF>./zdmo_c_rapg_projecttp/source/main/versions</HREF> + <REL>http://www.sap.com/adt/relations/versions</REL> + <TITLE>Historic versions</TITLE> + </item> + <item> + <HREF>./zdmo_c_rapg_projecttp/source/main</HREF> + <REL>http://www.sap.com/adt/relations/source</REL> + <TYPE>text/plain</TYPE> + <TITLE>Source Content</TITLE> + </item> + <item> + <HREF>./zdmo_c_rapg_projecttp/source/main</HREF> + <REL>http://www.sap.com/adt/relations/source</REL> + <TYPE>text/html</TYPE> + <TITLE>Source Content (HTML)</TITLE> + </item> + </LINKS> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION> + <SOURCE_URI>./zdmo_c_rapg_projecttp/source/main</SOURCE_URI> + <SOURCE_TYPE>ABAP_SOURCE</SOURCE_TYPE> + <SOURCE_FIXED_POINT_ARITHMETIC>true</SOURCE_FIXED_POINT_ARITHMETIC> + <SOURCE_UNICODE_CHECKS_ACTIVE>true</SOURCE_UNICODE_CHECKS_ACTIVE> + </BDEF> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_projecttp.ddls.asddls b/src/zdmo_c_rapg_projecttp.ddls.asddls new file mode 100644 index 0000000..972ab03 --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.ddls.asddls @@ -0,0 +1,82 @@ +@AccessControl.authorizationCheck: #CHECK +@Metadata.allowExtensions: true +@EndUserText.label: 'Projection View forProject' +@ObjectModel.semanticKey: [ 'BoName' ] +@Search.searchable: true +define root view entity ZDMO_C_RAPG_ProjectTP + provider contract transactional_query + as projection on ZDMO_R_RAPG_ProjectTP +{ + key RapBoUUID, + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + BoName, + RootEntityName, + Namespace, + @EndUserText.label: 'Package' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}] + PackageName, + TransportRequest, + SkipActivation, + AddIViewBasic, + PublishService, + ImplementationType, + AbapLanguageVersion, + PackageLanguageVersion, + DataSourceType, + BindingType, + DraftEnabled, + Suffix, + Prefix, + MultiInlineEdit, + CustomizingTable, + AddToManageBusinessConfig, + BusinessConfName, + BusinessConfIdentifier, + BusinessConfDescription, + CreatedAt, + CreatedBy, + LastChangedBy, + LastChangedAt, + LocalLastChangedAt, + JsonString, + JsonIsValid, + BoIsGenerated, + BoIsDeleted, + ApplJobLogHandle, + JobCount, + JobName, + ADTLink, + isManaged, + doesNotUseUnmanagedQuery, + hasSematicKey, + isExtensible, + extensibilityElementSuffix, + SAPObjectType, + AddSAPObjectType, + @EndUserText.label: 'Hide ADT Link' + @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS' + virtual HideADTLink : abap_boolean, + // @EndUserText.label: 'Job Status' + // @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS' + // virtual JobStatus : abap.char( 1 ), + // @EndUserText.label: 'Generation' + // @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS' + // virtual JobStatusText : abap.char( 20 ), + // @EndUserText.label: 'Criticality' + // @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS' + // virtual JobStatusCriticality : abap.int1, + JobStatus, + JobStatusCriticality, + JobStatusText, + @EndUserText.label: 'Repository objects exist' + @ObjectModel.virtualElementCalculatedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS' + + virtual RepositoryObjectsExist : abap_boolean, + + + + _Log : redirected to composition child ZDMO_C_RAPG_LogTP, + _Node : redirected to composition child ZDMO_C_RAPG_NodeTP + +} diff --git a/src/zdmo_c_rapg_projecttp.ddls.baseinfo b/src/zdmo_c_rapg_projecttp.ddls.baseinfo new file mode 100644 index 0000000..156966f --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.ddls.baseinfo @@ -0,0 +1,26 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_R_RAPG_PROJECTTP" +], +"ASSOCIATED": +[ +"ZDMO_C_RAPG_LOGTP", +"ZDMO_C_RAPG_NODETP", +"ZDMO_R_RAPG_LOGTP", +"ZDMO_R_RAPG_NODETP" +], +"BASE": +[ +"ZDMO_R_RAPG_PROJECTTP" +], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_projecttp.ddls.xml b/src/zdmo_c_rapg_projecttp.ddls.xml new file mode 100644 index 0000000..4b8c7bd --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_C_RAPG_PROJECTTP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Projection View for Project</DDTEXT> + <SOURCE_TYPE>P</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_c_rapg_projecttp.ddlx.asddlxs b/src/zdmo_c_rapg_projecttp.ddlx.asddlxs new file mode 100644 index 0000000..f31eaf7 --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.ddlx.asddlxs @@ -0,0 +1,422 @@ +@Metadata.layer: #CUSTOMER +@UI: { +headerInfo: { +typeName: 'Project', +typeNamePlural: 'Projects', +description.url: 'ADTLink' +, +title: { +type: #STANDARD, +label: 'Project', +value: 'BoName' +} +}, +presentationVariant: [ { + sortOrder: [ { + by: 'LocalLastChangedAt', + direction: #DESC + } ], + visualizations: [ { + type: #AS_LINEITEM + } ], + maxItems: 20 + } ], + selectionVariant: [ + { + qualifier: 'svariant', + text: 'Press the Go button', + filter: 'ImplementationType NE '' ' + } +] + + +} +annotate view ZDMO_C_RAPG_ProjectTP with +{ + + + + @UI.facet: [ + + // { + // id: 'idCollection', + // type: #COLLECTION, + // label: 'Project', + // position: 05 + // }, + // { + // id: 'idIdentification', + // parentId: 'idCollection', + // type: #IDENTIFICATION_REFERENCE, + // label: 'General Information', + // position: 07 + // }, + + // Show ADT Link and Job Status in Header + { + purpose: #HEADER, + type: #FIELDGROUP_REFERENCE, + position: 50, + targetQualifier: 'Fieldgroup_0' + }, + + + //Facet and field group for implementation details ( managed, draft, .. ) + { label : 'Implementation details', + id : 'Facet_1', + purpose : #STANDARD, + type : #COLLECTION, + position : 20 }, + { id : 'FieldGroup_1', + purpose : #STANDARD, + parentId : 'Facet_1', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_1', + position : 20 }, + + //Facet and field group for prefix, suffix and namespace + { label : 'Naming parameters', + id : 'Facet_2', + purpose : #STANDARD, + type : #COLLECTION, + position : 30 }, + { id : 'FieldGroup_2', + purpose : #STANDARD, + parentId : 'Facet_2', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_2', + position : 30 }, + + //Facet and field group for lifecycle management related information + { label : 'Lifecycle Management', + id : 'Facet_3', + purpose : #STANDARD, + type : #COLLECTION, + position : 40 }, + { id : 'FieldGroup_3', + purpose : #STANDARD, + parentId : 'Facet_3', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_3', + isPartOfPreview: true, + position : 40 }, + + //Facet and field group for optional parameters + { label : 'Optional parameters', + id : 'Facet_4', + purpose : #STANDARD, + type : #COLLECTION, + // isPartOfPreview: false, + position : 50 }, + { id : 'FieldGroup_4', + purpose : #STANDARD, + parentId : 'Facet_4', + type : #FIELDGROUP_REFERENCE, + targetQualifier: 'FieldGroup_4', + // isPartOfPreview: false, + position : 50 }, + + + { + id: 'idLineitem', + type: #LINEITEM_REFERENCE, + label: 'Entities', + position: 10 , + targetElement: '_Node' + } + , + { + id: 'idLog', + type: #LINEITEM_REFERENCE, + label: 'Generation Log', + position: 70 , + targetElement: '_Log' + } + + + ] + + + + @UI.hidden: true + RapBoUUID; + + @UI.lineItem: [ { + position: 20 , + importance: #HIGH + } + , + { type: #FOR_ACTION, dataAction: 'createProjectAndRootNode', label: 'New Project' } + , + { type: #FOR_ACTION, dataAction: 'copyProject', label: 'Copy Project' } + , + { type: #FOR_ACTION, dataAction: 'deleteProject', label: 'Delete repository objects' } + + + + ] + + @UI.identification: [ { + position: 20 , + importance: #HIGH + } + + , + { type: #FOR_ACTION, dataAction: 'generateProject', label: 'Generate repository objects' } + , + { type: #FOR_ACTION, dataAction: 'copyProject', label: 'Copy Project' } + , + { type: #FOR_ACTION, dataAction: 'deleteProject', label: 'Delete repository objects' } + + + + ] + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_0', position: 10, label: 'RAP BO Name' } + + // , + // { type: #FOR_ACTION, dataAction: 'generateProject', label: 'Generate repository objects' } + // , + // { type: #FOR_ACTION, dataAction: 'copyProject', label: 'Copy Project' } + // , + // { type: #FOR_ACTION, dataAction: 'deleteProject', label: 'Delete repository objects' } + // + + ] + @UI.selectionField: [ { + position: 20 + } ] + @EndUserText.label: 'RAP BO Name' + BoName; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_0', position: 10, label: 'SAP Object Type' } + + ] + @UI.selectionField: [ { + position: 20 + } ] + @EndUserText.label: 'SAP Object Type' + SAPObjectType; + + @UI.lineItem: [ { + position: 30 , + importance: #HIGH + } ] + // @UI.identification: [ { + // position: 30 + // } ] + RootEntityName; + + // @UI.lineItem: [ { + // position: 40 , + // importance: #HIGH + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_2', position: 10, label: 'Namespace' }] + Namespace; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 50, label: 'Package' }] + + @UI.lineItem: [ { + position: 180 , + importance: #HIGH, + label: 'Package Name' + } ] + + PackageName; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 10, label: 'Transport' }] + TransportRequest; + + @UI.hidden: true + SkipActivation; + + @UI.lineItem: [ { + position: 80 , + importance: #HIGH, + label: 'Implementation_Key Type' + } ] + // @UI.identification: [ { + // position: 80 , + // label: 'ImplementationType' + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 10, label: 'Implementation_Key Type' }] + ImplementationType; + + @UI.hidden: true + AbapLanguageVersion; + + @UI.hidden: true + PackageLanguageVersion; + + @UI.lineItem: [ { + position: 110 , + importance: #HIGH, + label: 'DataSourceType' + } ] + // @UI.identification: [ { + // position: 110 , + // label: 'DataSourceType' + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 20, label: 'Datasource type' }] + DataSourceType; + + @UI.lineItem: [ { + position: 120 , + importance: #HIGH, + label: 'BindingType' + } ] + // @UI.identification: [ { + // position: 120 , + // label: 'BindingType' + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 30, label: 'Binding type' }] + BindingType; + + @UI.lineItem: [ { + position: 130 , + importance: #HIGH, + label: 'Draft enabled' + } ] + // @UI.identification: [ { + // position: 130 + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 40, label: 'Draft enabled' }] + DraftEnabled; + + // @UI.lineItem: [ { + // position: 140 , + // importance: #HIGH + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_2', position: 30, label: 'Suffix' }] + Suffix; + + // @UI.lineItem: [ { + // position: 150 , + // importance: #HIGH + // } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_2', position: 20, label: 'Prefix' }] + Prefix; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'Multi Inline Edit' }] + MultiInlineEdit; + +// @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'Record customizing' }] + @UI.hidden: true + CustomizingTable; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 10, label: 'Add to manage business configuration' }] + AddToManageBusinessConfig; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 20, label: 'Create service' }] + PublishService; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 20, label: 'Add basic i-views' }] + AddIViewBasic; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 30, label: 'Add SAPObjectType' }] + AddSAPObjectType; + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_1', position: 30, label: 'is extensible' }] + isExtensible; + + // @UI.fieldGroup: [{ qualifier: 'FieldGroup_4', position: 40, label: 'Extensibility Suffix' }] + @UI.hidden: true + extensibilityElementSuffix; + + @UI.hidden: true + BusinessConfName; + + @UI.hidden: true + BusinessConfIdentifier; + + @UI.hidden: true + BusinessConfDescription; + + @UI.hidden: true + CreatedAt; + + @UI.lineItem: [ { + position: 230 , + importance: #HIGH + } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 40, label: 'Created by' }] + CreatedBy; + + @UI.hidden: true + LastChangedBy; + + @UI.lineItem: [ { + position: 250 , + importance: #HIGH + } ] + @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 30, label: 'Last changed at' }] + LastChangedAt; + + @UI.hidden: true + LocalLastChangedAt; + + + @UI.fieldGroup: [{ qualifier: 'FieldGroup_3', position: 30, label: 'Json string' + // , isPartOfPreview: true + }] + @UI.multiLineText: true + JsonString; + + @UI.hidden: true + JsonIsValid; + + @UI.hidden: true + BoIsGenerated; + + @UI.hidden: true + BoIsDeleted; + + @UI.hidden: true + ApplJobLogHandle; + + @UI.hidden: true + JobCount; + + @UI.hidden: true + JobName; + + @UI: { fieldGroup: [ { qualifier: 'Fieldgroup_0', + position: 50 , + label: 'ADT Link' , + type: #WITH_URL, + url: 'ADTLink' + , + hidden: #(HideADTLink) + } + ] } + + ADTLink; + + // virtual fields + + @UI.lineItem: [ { + position: 220 , + importance: #HIGH, + label: 'Job Status', + criticality: 'JobStatusCriticality' + } ] + @UI: { fieldGroup: [ { qualifier: 'Fieldgroup_0', + position: 40 , + label: 'Job Status', + criticality: 'JobStatusCriticality'} ] } + @UI.dataPoint: {title: 'Generation Job Status', targetValueElement: 'JobStatusText', criticality: 'JobStatusCriticality', + criticalityRepresentation: #WITH_ICON} + JobStatusText; + + @UI.lineItem: [ { + position: 110 , + importance: #HIGH, + label: 'Repository objects exist' + } ] + @UI: { fieldGroup: [ { qualifier: 'Fieldgroup_0', + position: 40 , + label: 'Repository Objects Exist'} ] } + RepositoryObjectsExist; + + +} \ No newline at end of file diff --git a/src/zdmo_c_rapg_projecttp.ddlx.xml b/src/zdmo_c_rapg_projecttp.ddlx.xml new file mode 100644 index 0000000..df09e37 --- /dev/null +++ b/src/zdmo_c_rapg_projecttp.ddlx.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLX" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLX> + <METADATA> + <NAME>ZDMO_C_RAPG_PROJECTTP</NAME> + <DESCRIPTION>MDE for Project</DESCRIPTION> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + </METADATA> + </DDLX> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_create_rapxxx_packages.clas.abap b/src/zdmo_cl_create_rapxxx_packages.clas.abap new file mode 100644 index 0000000..81fd490 --- /dev/null +++ b/src/zdmo_cl_create_rapxxx_packages.clas.abap @@ -0,0 +1,42 @@ +CLASS zdmo_cl_create_rapxxx_packages DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_oo_adt_classrun . + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_CREATE_RAPXXX_PACKAGES IMPLEMENTATION. + + + METHOD if_oo_adt_classrun~main. + + DATA group_number_start TYPE i VALUE 1. + DATA group_number_end TYPE i. + DATA number_of_groups TYPE i VALUE 50. + DATA group_number TYPE i. + DATA group_number_n(3) TYPE n. + + DATA rapxxx_generator TYPE REF TO zdmo_gen_rap630_single. + "DATA rapxxx_generator TYPE REF TO zdmo_gen_rap110_single. + + group_number = group_number_start. + group_number_end = group_number_start + number_of_groups . + + WHILE group_number < group_number_end. + + group_number_n = group_number. + out->write( |start generation with groupnumber { group_number_n }| ). + + rapxxx_generator = NEW #( CONV #( group_number_n ) ). + rapxxx_generator->if_oo_adt_classrun~main( out ). + group_number += 1. + + ENDWHILE. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_create_rapxxx_packages.clas.xml b/src/zdmo_cl_create_rapxxx_packages.clas.xml new file mode 100644 index 0000000..ebcda8a --- /dev/null +++ b/src/zdmo_cl_create_rapxxx_packages.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_CREATE_RAPXXX_PACKAGES</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Create xxx packages for RAP110 or RAP630</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_fe_travel_generator.clas.abap b/src/zdmo_cl_fe_travel_generator.clas.abap new file mode 100644 index 0000000..dfd5047 --- /dev/null +++ b/src/zdmo_cl_fe_travel_generator.clas.abap @@ -0,0 +1,1769 @@ +CLASS zdmo_cl_fe_travel_generator DEFINITION +INHERITING FROM zdmo_cl_rap_generator_base +************************************************************************** +** +** Welcome to the SAP Fiori elements travel exercise generator! +** +** For exercises which focus on SAP Fiori elements and not the creation of +** an OData service, this generator was developed. It creates all the +** required RAP development artifacts for a travel scenario. You can then +** use this OData service and enhance its metadata extensions. +** However, if you’re interested in how to build such an OData service +** from scratch using RAP, check out the openSAP course "Building Apps +** with the ABAP RESTful Application Programming Model". +** +** Instructions: +** +** 1. Make sure the "Console" view is shown. If you can't see it, you can +** open it using "Window" -> "Show View" -> "Other" -> "Console". +** +** 2. Right-click in this window and choose: +** "Run As" -> "ABAP Application (Console)" +** That takes a little over a minute. +** +** 3. When the generation finished your personal package name will be +** printed to the "Console" view. It's important to note down your +** package name! +** +** 4. In the "Project Explorer" right click on "Favorite Packages" and +** click on "Add Package...". Enter your personal package name +** (ZFE_TRAVEL_######) and click OK. +** +** 5. Have fun with the exercise! :) +** +************************************************************************** + + + PUBLIC +* INHERITING FROM cl_xco_cp_adt_simple_classrun + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_oo_adt_classrun. + METHODS constructor. + + PROTECTED SECTION. +* METHODS main REDEFINITION. + + PRIVATE SECTION. + CONSTANTS: + co_prefix TYPE string VALUE 'ZFE_TRAVEL_', + co_zlocal_package TYPE sxco_package VALUE 'ZLOCAL'. + + DATA xco_on_prem_library TYPE REF TO zdmo_cl_rap_xco_on_prem_lib . + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + + DATA package_name TYPE sxco_package . + DATA unique_suffix TYPE string. +* DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system. + DATA transport TYPE sxco_transport . + DATA table_name_root TYPE sxco_dbt_object_name. + DATA table_name_child TYPE sxco_dbt_object_name. + DATA table_name_status TYPE sxco_dbt_object_name. + DATA table_name_carrier TYPE sxco_dbt_object_name. + DATA table_name_connection TYPE sxco_dbt_object_name. + DATA table_name_flight TYPE sxco_dbt_object_name. + DATA draft_table_name_root TYPE sxco_dbt_object_name. + DATA draft_table_name_child TYPE sxco_dbt_object_name. + DATA i_view_name_status TYPE sxco_cds_object_name. + DATA i_view_name_carrier TYPE sxco_cds_object_name. + DATA i_view_name_connection TYPE sxco_cds_object_name. + DATA i_view_name_flight TYPE sxco_cds_object_name. + DATA i_view_name_a_travel TYPE sxco_cds_object_name. + DATA i_view_name_a_booking TYPE sxco_cds_object_name. + DATA c_view_name_a_booking TYPE sxco_cds_object_name. + DATA sqlviewname_a_travel TYPE sxco_cds_object_name. + DATA sqlviewname_a_booking TYPE sxco_cds_object_name. + DATA srv_definition_analytics TYPE sxco_cds_object_name. + DATA srv_binding_analytics TYPE sxco_cds_object_name. + DATA create_mde_files TYPE abap_bool. + DATA data_generator_class_name TYPE sxco_ad_object_name. + + + DATA cdsinterfaceviewbasic_travel TYPE sxco_cds_object_name. + DATA cdsrestrictedreuseview_travel TYPE sxco_cds_object_name. + DATA cdsinterfaceview_travel TYPE sxco_cds_object_name. + DATA cdsprojectionview_travel TYPE sxco_cds_object_name. + DATA metadataextensionview_travel TYPE sxco_cds_object_name. + + DATA cdsinterfaceviewbasic_book TYPE sxco_cds_object_name. + DATA cdsrestrictedreuseview_book TYPE sxco_cds_object_name. + DATA cdsinterfaceview_book TYPE sxco_cds_object_name. + DATA cdsprojectionview_book TYPE sxco_cds_object_name. + DATA metadataextensionview_book TYPE sxco_cds_object_name. + + DATA show_findings TYPE abap_boolean VALUE abap_false. + + TYPES: BEGIN OF t_table_fields, + field TYPE sxco_ad_field_name, + is_key TYPE abap_bool, + not_null TYPE abap_bool, + currencyCode TYPE sxco_cds_field_name, + unitOfMeasure TYPE sxco_cds_field_name, + data_element TYPE sxco_ad_object_name, + built_in_type TYPE cl_xco_ad_built_in_type=>tv_type, + built_in_type_length TYPE cl_xco_ad_built_in_type=>tv_length, + built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals, + END OF t_table_fields. + + TYPES: tt_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field. + + METHODS get_unique_suffix + IMPORTING + VALUE(s_prefix) TYPE string + RETURNING + VALUE(s_unique_suffix) TYPE string. + + METHODS create_transport + RETURNING + VALUE(lo_transport) TYPE sxco_transport. + + METHODS create_super_package. + + METHODS create_package + IMPORTING + VALUE(lo_transport) TYPE sxco_transport. + + METHODS generate_table IMPORTING table_fields TYPE tt_fields +* io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + table_name TYPE sxco_dbt_object_name + table_short_description TYPE if_xco_cp_gen_tabl_dbt_s_form=>tv_short_description. + + METHODS get_root_table_fields RETURNING VALUE(root_table_fields) TYPE tt_fields. + + METHODS get_child_table_fields RETURNING VALUE(child_table_fields) TYPE tt_fields. + + METHODS get_status_table_fields RETURNING VALUE(status_table_fields) TYPE tt_fields. + METHODS generate_status_i_view +* IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + . + + METHODS get_carrier_table_fields RETURNING VALUE(carrier_table_fields) TYPE tt_fields. + METHODS generate_carrier_i_view +* IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + . + + METHODS get_connection_table_fields RETURNING VALUE(connection_table_fields) TYPE tt_fields. + METHODS generate_connection_i_view +* IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + . + + METHODS get_flight_table_fields RETURNING VALUE(flight_table_fields) TYPE tt_fields. + METHODS generate_flight_i_view +* IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + . + + METHODS generate_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport +* io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + . + + METHODS release_data_generator_class + IMPORTING VALUE(lo_transport) TYPE sxco_transport + . + + METHODS generate_analytics_service +* IMPORTING io_put_operation1 TYPE REF TO if_xco_cp_gen_d_o_put +* io_put_operation2 TYPE REF TO if_xco_cp_gen_d_o_put + . + METHODS get_json_string RETURNING VALUE(json_string) TYPE string. + + METHODS get_json_string_status RETURNING VALUE(json_string_status) TYPE string. + +ENDCLASS. + + + +CLASS ZDMO_CL_FE_TRAVEL_GENERATOR IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + + xco_on_prem_library = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + "check whether being on cloud or on prem + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + unique_suffix = get_unique_suffix( co_prefix ). + package_name = co_prefix && unique_suffix. " your package name + + table_name_root = |zfe_atrav_{ unique_suffix }|. + table_name_child = |zfe_abook_{ unique_suffix }|. + table_name_status = |zfe_astat_{ unique_suffix }|. + table_name_carrier = |zfe_acarr_{ unique_suffix }|. + table_name_connection = |zfe_aconn_{ unique_suffix }|. + table_name_flight = |zfe_aflig_{ unique_suffix }|. + draft_table_name_root = |zfe_dtrav_{ unique_suffix }|. + draft_table_name_child = |zfe_dbook_{ unique_suffix }|. + i_view_name_status = |zi_fe_stat_{ unique_suffix }|. + i_view_name_carrier = |zi_fe_carr_{ unique_suffix }|. + i_view_name_connection = |zi_fe_conn_{ unique_suffix }|. + i_view_name_flight = |zi_fe_flig_{ unique_suffix }|. + i_view_name_a_booking = |zi_fe_booking_analytics_{ unique_suffix }|. + i_view_name_a_travel = |zi_fe_travel_analytics_{ unique_suffix }|. + c_view_name_a_booking = |zc_fe_booking_analytics_{ unique_suffix }|. + srv_definition_analytics = |zfe_booking_analytics_{ unique_suffix }|. + srv_binding_analytics = |zui_fe_booking_{ unique_suffix }_o2|. + sqlviewname_a_travel = |ZIFETRVANA{ unique_suffix }|. + sqlviewname_a_booking = |ZIFEBOKANA{ unique_suffix }|. + data_generator_class_name = |ZFE_DATA_GENERATOR_{ unique_suffix }|. + create_mde_files = abap_false. + + cdsinterfaceviewbasic_travel = |ZI_FE_TRAVEL_B_{ unique_suffix }|. + cdsrestrictedreuseview_travel = |ZI_FE_TRAVEL_{ unique_suffix }|. + cdsinterfaceview_travel = |ZI_FE_TRAVEL_TP_{ unique_suffix }|. + cdsprojectionview_travel = |ZC_FE_TRAVEL_{ unique_suffix }|. + metadataextensionview_travel = |ZC_FE_TRAVEL_{ unique_suffix }|. + + cdsinterfaceviewbasic_book = |ZI_FE_BOOKING_B_{ unique_suffix }|. + cdsrestrictedreuseview_book = |ZI_FE_BOOKING_{ unique_suffix }|. + cdsinterfaceview_book = |ZI_FE_BOOKING_TP_{ unique_suffix }|. + cdsprojectionview_book = |ZC_FE_BOOKING_{ unique_suffix }|. + metadataextensionview_book = |ZC_FE_BOOKING_{ unique_suffix }|. + + + + ENDMETHOD. + + + METHOD create_package. + DATA(package_environment) = get_environment( lo_transport ). + DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ). + DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ). + lo_specification->set_short_description( 'FE tutorial package' ). + lo_specification->properties->set_super_package( co_zlocal_package )->set_software_component( co_zlocal_package ). + lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_super_package. + DATA(lo_environment) = get_environment( ). + DATA(lo_put_operation) = get_put_operation_for_devc( lo_environment ). + DATA(lo_specification) = lo_put_operation->add_object( co_zlocal_package )->create_form_specification( ). + lo_specification->set_short_description( 'FE tutorial super package' ). + lo_specification->properties->set_software_component( 'LOCAL' ). + lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_transport. + DATA(ls_package) = xco_lib->get_package( co_zlocal_package ). + IF ls_package->read( )-property-record_object_changes = abap_true. +* DATA(ls_package) = xco_cp_abap_repository=>package->for( co_zlocal_package )->read( ). + DATA(lv_transport_layer) = ls_package->read( )-property-transport_layer->value. + DATA(lv_transport_target) = ls_package->read( )-property-transport_layer->get_transport_target( )->value. + DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( 'Generated FE tutorial transport request' ). + lo_transport = lo_transport_request->value. + ENDIF. + ENDMETHOD. + + + METHOD generate_analytics_service. + +* Create travel i view + DATA(lo_interface_spec_i_travel) = mo_put_operation1->for-ddls->add_object( i_view_name_a_travel + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity_i_travel) = lo_interface_spec_i_travel->set_short_description( 'Travel view for Booking Analysis' + ")->add_view( ). + )->add_view_entity( ). + " lo_view_entity_i_travel->data_source->set_entity( CONV #( table_name_root ) )->set_alias( 'Travel' ). + lo_view_entity_i_travel->data_source->set_view_entity( CONV #( table_name_root ) )->set_alias( 'Travel' ). + " View annotations. + "lo_view_entity_i_travel->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( CONV #( sqlviewname_a_travel ) ). + lo_view_entity_i_travel->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view_entity_i_travel->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Travel view entity for booking analysis' ). + lo_view_entity_i_travel->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ). + + " add associations + DATA(lo_condition_i_travel) = xco_cp_ddl=>field( 'AgencyID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'AgencyID' )->of( '_Agency' ) ). + lo_view_entity_i_travel->add_association( '/DMO/I_Agency' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Agency' )->set_condition( lo_condition_i_travel ). + + lo_condition_i_travel = xco_cp_ddl=>field( 'CustomerID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'CustomerID' )->of( '_Customer' ) ). + lo_view_entity_i_travel->add_association( '/DMO/I_Customer' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Customer' )->set_condition( lo_condition_i_travel ). + + " Add fields. + DATA(lo_identifier_i_travel) = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'TRAVEL_UUID' ) )->set_key( )->set_alias( 'TravelUUID' ). + + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'TRAVEL_ID' ) )->set_alias( 'TravelID' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'AGENCY_ID' ) )->set_alias( 'AgencyID' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CUSTOMER_ID' ) )->set_alias( 'CustomerID' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'BEGIN_DATE' ) )->set_alias( 'BeginDate' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'END_DATE' ) )->set_alias( 'EndDate' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'BOOKING_FEE' ) )->set_alias( 'BookingFee' ). + lo_identifier_i_travel->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'TOTAL_PRICE' ) )->set_alias( 'TotalPrice' ). + lo_identifier_i_travel->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CURRENCY_CODE' ) )->set_alias( 'CurrencyCode' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'DESCRIPTION' ) )->set_alias( 'Description' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'OVERALL_STATUS' ) )->set_alias( 'OverallStatus' ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CREATED_BY' ) )->set_alias( 'CreatedBy' ). + lo_identifier_i_travel->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'CREATED_AT' ) )->set_alias( 'CreatedAt' ). + lo_identifier_i_travel->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'LAST_CHANGED_BY' ) )->set_alias( 'LastChangedBy' ). + lo_identifier_i_travel->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'LAST_CHANGED_AT' ) )->set_alias( 'LAST_CHANGED_AT' ). + lo_identifier_i_travel->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ). + lo_identifier_i_travel = lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( 'LOCAL_LAST_CHANGED_AT' ) )->set_alias( 'LocalLastChangedAt' ). + lo_identifier_i_travel->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ). + + " add association to publish + lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( '_Agency' ) ). + lo_view_entity_i_travel->add_field( xco_cp_ddl=>field( '_Customer' ) ). + +* Create booking i view + DATA(lo_interface_spec_i_booking) = mo_put_operation1->for-ddls->add_object( i_view_name_a_booking + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity_i_booking) = lo_interface_spec_i_booking->set_short_description( 'Booking view for Booking Analysis' + ")->add_view( ). + )->add_view_entity( ). + "lo_view_entity_i_booking->data_source->set_entity( CONV #( table_name_child ) )->set_alias( 'Booking' ). + lo_view_entity_i_booking->data_source->set_view_entity( CONV #( table_name_child ) )->set_alias( 'Booking' ). + " View annotations. + "lo_view_entity_i_booking->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( CONV #( sqlviewname_a_booking ) ). + lo_view_entity_i_booking->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view_entity_i_booking->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Booking view entity for booking analysis' ). + lo_view_entity_i_booking->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ). + "lo_view_entity_i_booking->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ). + + lo_view_entity_i_booking->set_root( ). + + " add associations + DATA(lo_condition_i_booking) = xco_cp_ddl=>field( 'TravelUUID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'TravelUUID' )->of( '_Travel' ) ). + lo_view_entity_i_booking->add_association( i_view_name_a_travel )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Travel' )->set_condition( lo_condition_i_booking ). + + lo_condition_i_booking = xco_cp_ddl=>field( 'CarrierID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'AirlineID' )->of( '_Connection' ) )->and( xco_cp_ddl=>field( 'ConnectionID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'ConnectionID' )->of( '_Connection' ) ) ). + lo_view_entity_i_booking->add_association( i_view_name_connection )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) )->set_alias( '_Connection' )->set_condition( lo_condition_i_booking ). + + lo_condition_i_booking = xco_cp_ddl=>field( 'CarrierID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'AirlineID' )->of( '_Carrier' ) ). + lo_view_entity_i_booking->add_association( i_view_name_carrier )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) )->set_alias( '_Carrier' )->set_condition( lo_condition_i_booking ). + + lo_condition_i_booking = xco_cp_ddl=>field( 'CustomerID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'CustomerID' )->of( '_Customer' ) ). + lo_view_entity_i_booking->add_association( '/DMO/I_Customer' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Customer' )->set_condition( lo_condition_i_booking ). + + lo_condition_i_booking = xco_cp_ddl=>field( 'AgencyID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'AgencyID' )->of( '_Agency' ) ). + lo_view_entity_i_booking->add_association( '/DMO/I_Agency' )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 0 iv_max = 1 ) )->set_alias( '_Agency' )->set_condition( lo_condition_i_booking ). + + " Add fields. + DATA(lo_identifier_i_booking) = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'booking_uuid' ) )->set_key( )->set_alias( 'BookingUUID' ). + + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'travel_uuid' ) )->set_alias( 'TravelUUID' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'booking_id' ) )->set_alias( 'BookingID' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'booking_date' ) )->set_alias( 'BookingDate' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'SUBSTRING (booking_date,1,4)' ) )->set_alias( 'BookingDateYear' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'customer_id' ) )->set_alias( 'CustomerID' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Customer.LastName' ) )->set_alias( 'CustomerName' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'carrier_id' ) )->set_alias( 'CarrierID' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Carrier.Name' ) )->set_alias( 'CarrierName' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'connection_id' ) )->set_alias( 'ConnectionID' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'flight_date' ) )->set_alias( 'FlightDate' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'flight_price' ) )->set_alias( 'FlightPrice' ). + lo_identifier_i_booking->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'currency_code' ) )->set_alias( 'CurrencyCode' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Travel.AgencyID' ) )->set_alias( 'AgencyID' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Travel._Agency.Name' ) )->set_alias( 'AgencyName' ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'CREATED_BY' ) )->set_alias( 'CreatedBy' ). + lo_identifier_i_booking->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'LAST_CHANGED_BY' ) )->set_alias( 'LastChangedBy' ). + lo_identifier_i_booking->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ). + lo_identifier_i_booking = lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( 'LOCAL_LAST_CHANGED_AT' ) )->set_alias( 'LocalLastChangedAt' ). + lo_identifier_i_booking->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ). + + " add association to publish + lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Travel' ) ). + lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Carrier' ) ). + lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Customer' ) ). + lo_view_entity_i_booking->add_field( xco_cp_ddl=>field( '_Connection' ) ). + + +* Create consumption view + DATA(lo_interface_specification) = mo_put_operation1->for-ddls->add_object( c_view_name_a_booking + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Booking Analysis view for Travel Scenario' + )->add_projection_view( ). + lo_view_entity->data_source->set_view_entity( iv_view_entity = i_view_name_a_booking ). + + lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view_entity->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ). + lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Projection View for Booking Analysis' ). + lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ). + + lo_view_entity->set_root( ). + " Add fields. + DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingUUID' ) )->set_key( ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'TravelUUID' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingID' ) ). + lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.9' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingDate' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'BookingDateYear' ) ). + lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Booking Date (Year)' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CustomerID' ) ). + lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Customer' ). + lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'CustomerName' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CustomerName' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CarrierID' ) ). + lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Airline' ). + lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'CarrierName' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CarrierName' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'ConnectionID' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'FlightDate' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'FlightPrice' ) ). + lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ). + lo_identifier->add_annotation( 'Aggregation.default' )->value->build( )->add_enum( 'SUM' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CurrencyCode' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'AgencyID' ) ). + lo_identifier->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Agency' ). + lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'AgencyName' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'AgencyName' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'CreatedBy' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'LastChangedBy' ) ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'LocalLastChangedAt' ) ). + + + lo_view_entity->add_field( xco_cp_ddl=>field( '_Travel' ) ). + lo_view_entity->add_field( xco_cp_ddl=>field( '_Carrier' ) ). + lo_view_entity->add_field( xco_cp_ddl=>field( '_Customer' ) ). + lo_view_entity->add_field( xco_cp_ddl=>field( '_Connection' ) ). + +* Create service definition + + TYPES: BEGIN OF ty_cds_views_used_by_assoc, + name TYPE zdmo_cl_rap_node=>ts_assocation-name, " sxco_ddef_alias_name, + target TYPE zdmo_cl_rap_node=>ts_assocation-target, + END OF ty_cds_views_used_by_assoc. + DATA lt_cds_views_used_by_assoc TYPE STANDARD TABLE OF ty_cds_views_used_by_assoc. + DATA ls_cds_views_used_by_assoc TYPE ty_cds_views_used_by_assoc. + + DATA(lo_specification_header) = mo_put_operation1->for-srvd->add_object( srv_definition_analytics + )->set_package( package_name + )->create_form_specification( ). + + lo_specification_header->set_short_description( |Service definition for booking analysis| ). + + "add exposure for root node + lo_specification_header->add_exposure( c_view_name_a_booking )->set_alias( 'Booking' ). + lo_specification_header->add_exposure( i_view_name_a_travel )->set_alias( 'Travel' ). + lo_specification_header->add_exposure( |ZI_FE_CONN_{ unique_suffix }| )->set_alias( 'Connection' ). + lo_specification_header->add_exposure( |ZI_FE_FLIG_{ unique_suffix }| )->set_alias( 'Flight' ). + lo_specification_header->add_exposure( |ZI_FE_CARR_{ unique_suffix }| )->set_alias( 'Airline' ). + lo_specification_header->add_exposure( |I_CURRENCY| )->set_alias( 'Currency' ). + lo_specification_header->add_exposure( |/DMO/I_CUSTOMER| )->set_alias( 'Customer' ). + lo_specification_header->add_exposure( |/DMO/I_AGENCY| )->set_alias( 'Agency' ). + + +* Create service binding + + DATA lv_service_binding_name TYPE sxco_srvb_object_name. + lv_service_binding_name = to_upper( srv_binding_analytics ). + + DATA lv_service_definition_name TYPE sxco_srvd_object_name. + lv_service_definition_name = to_upper( srv_definition_analytics ). + + DATA(lo_specification_header2) = mo_put_operation2->for-srvb->add_object( lv_service_binding_name + )->set_package( package_name + )->create_form_specification( ). + + lo_specification_header2->set_short_description( |Service binding for booking analysis| ). + + lo_specification_header2->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_ui ). + + + lo_specification_header2->add_service( )->add_version( '0001' )->set_service_definition( lv_service_definition_name ). + + ENDMETHOD. + + + METHOD generate_carrier_i_view. + DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_carrier + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Carrier view for Travel Scenario' + " )->add_view( ). + )->add_view_entity( ). + "lo_view_entity->data_source->set_entity( CONV #( table_name_carrier ) )->set_alias( 'Airline' ). + lo_view_entity->data_source->set_view_entity( CONV #( table_name_carrier ) )->set_alias( 'Airline' ). + " View annotations. + DATA s_view_name TYPE string. + s_view_name = i_view_name_carrier. + REPLACE ALL OCCURRENCES OF '_' IN s_view_name WITH ''. + + " lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name ). + "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ). + "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ). + lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ). + lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Carrier view entity' ). + lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ). + + " add associations + DATA(lo_condition) = xco_cp_ddl=>field( 'CurrencyCode' )->of_projection( )->eq( + xco_cp_ddl=>field( 'Currency' )->of( '_Currency' ) ). + lo_view_entity->add_association( 'I_Currency' )->set_cardinality( xco_cp_cds=>cardinality->zero_to_one )->set_alias( '_Currency' )->set_condition( lo_condition ). + + " Add fields. + DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.carrier_id' ) )->set_key( )->set_alias( 'AirlineID' ). + lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'Name' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.name' ) )->set_alias( 'Name' ). + lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.7' ). + lo_identifier->add_annotation( 'Semantics.text' )->value->build( )->add_boolean( abap_true ). + + "ToDo: cast for pic_url + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.carrier_pic_url' ) )->set_alias( 'AirlinePicURL' ). + lo_identifier->add_annotation( 'Semantics.imageUrl' )->value->build( )->add_boolean( abap_true ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Airline.currency_code' ) )->set_alias( 'CurrencyCode' ). + "lo_identifier->add_annotation( 'Semantics.currencyCode' )->value->build( )->add_boolean( abap_true ). + + " add association to publish + lo_view_entity->add_field( xco_cp_ddl=>field( '_Currency' ) ). + ENDMETHOD. + + + METHOD generate_connection_i_view. + DATA: s_view_name_connection TYPE string, + s_view_name_carrier TYPE string. + + s_view_name_connection = i_view_name_connection. + REPLACE ALL OCCURRENCES OF '_' IN s_view_name_connection WITH ''. + s_view_name_carrier = i_view_name_carrier. + + DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_connection + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Connection view for Travel Scenario' + " )->add_view( ). + )->add_view_entity( ). + "lo_view_entity->data_source->set_entity( CONV #( table_name_connection ) )->set_alias( 'Connection' ). + lo_view_entity->data_source->set_view_entity( CONV #( table_name_connection ) )->set_alias( 'Connection' ). + " View annotations. + "lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name_connection ). + "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ). + "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ). + lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ). + lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Connection view entity' ). + lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ). + + " add associations + DATA(lo_condition) = xco_cp_ddl=>field( 'AirlineID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'AirlineID' )->of( '_Airline' ) ). + lo_view_entity->add_association( i_view_name_carrier )->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) )->set_alias( '_Airline' )->set_condition( lo_condition ). + + " Add fields. + DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.carrier_id' ) )->set_key( )->set_alias( 'AirlineID' ). + lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.8' ). + lo_identifier->add_annotation( 'ObjectModel.text.association' )->value->build( )->add_string( '_Airline' ). + DATA(lo_valuehelpbuilder) = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuehelpbuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( s_view_name_carrier )->add_member( 'element' )->add_string( 'AirlineID' + )->end_record( ). + lo_valuehelpbuilder->end_record( )->end_array( ). + + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.connection_id' ) )->set_key( )->set_alias( 'ConnectionID' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.airport_from_id' ) )->set_alias( 'DepartureAirport' ). + lo_valuehelpbuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuehelpbuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( '/DMO/I_Airport' )->add_member( 'element' )->add_string( 'AirportID' + )->end_record( ). + lo_valuehelpbuilder->end_record( )->end_array( ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.airport_to_id' ) )->set_alias( 'DestinationAirport' ). + lo_valuehelpbuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuehelpbuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( '/DMO/I_Airport' )->add_member( 'element' )->add_string( 'AirportID' + )->end_record( ). + lo_valuehelpbuilder->end_record( )->end_array( ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.departure_time' ) )->set_alias( 'DepartureTime' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.arrival_time' ) )->set_alias( 'ArrivalTime' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.distance' ) )->set_alias( 'Distance' ). + lo_identifier->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( 'DistanceUnit' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Connection.distance_unit' ) )->set_alias( 'DistanceUnit' ). + " lo_identifier->add_annotation( 'Semantics.unitOfMeasure' )->value->build( )->add_boolean( abap_true ). + + " add association to publish + lo_view_entity->add_field( xco_cp_ddl=>field( '_Airline' ) ). + ENDMETHOD. + + + METHOD generate_data_generator_class. + + DATA(lo_specification) = mo_draft_tabl_put_operation->for-clas->add_object( data_generator_class_name + )->set_package( package_name + )->create_form_specification( ). + lo_specification->set_short_description( |This class generates the test data| ). + + lo_specification->set_short_description( 'Data generator class' ). + lo_specification->definition->add_interface( 'if_oo_adt_classrun' ). + lo_specification->implementation->add_method( |if_oo_adt_classrun~main| + )->set_source( VALUE #( + ( | INSERT ('{ table_name_root }') FROM ( | ) +( | SELECT | ) +( | FROM /dmo/travel | ) +( | FIELDS | ) +( | uuid( ) AS travel_uuid , | ) +( | travel_id AS travel_id , | ) +( | agency_id AS agency_id , | ) +( | customer_id AS customer_id , | ) +( | begin_date AS begin_date , | ) +( | end_date AS end_date , | ) +( | booking_fee AS booking_fee , | ) +( | total_price AS total_price , | ) +( | currency_code AS currency_code , | ) +( | description AS description , | ) +( | CASE status | ) +( | WHEN 'B' THEN 'A' " accepted | ) +( | WHEN 'X' THEN 'X' " cancelled | ) +( | ELSE 'O' " open | ) +( | END AS overall_status , | ) +( | createdby AS created_by , | ) +( | createdat AS created_at , | ) +( | lastchangedby AS last_changed_by , | ) +( | lastchangedat AS last_changed_at , | ) +( | lastchangedat AS local_last_changed_at | ) +( | ORDER BY travel_id | ) +( | ). | ) +( | COMMIT WORK. | ) +( | | ) +( | " define FROM clause dynamically | ) +( | DATA: dyn_table_name TYPE string. | ) +( | dyn_table_name = \| /dmo/booking AS booking \| | ) +( | && \| JOIN \{ '{ table_name_root }' \} AS z \| | ) +( | && \| ON booking~travel_id = z~travel_id \|. | ) +( | | ) +( | " insert booking demo data | ) +( | INSERT ('{ table_name_child }') FROM ( | ) +( | SELECT | ) +( | FROM (dyn_table_name) | ) +( | FIELDS | ) +( | uuid( ) AS booking_uuid , | ) +( | z~travel_uuid AS travel_uuid , | ) +( | booking~booking_id AS booking_id , | ) +( | booking~booking_date AS booking_date , | ) +( | booking~customer_id AS customer_id , | ) +( | booking~carrier_id AS carrier_id , | ) +( | booking~connection_id AS connection_id , | ) +( | booking~flight_date AS flight_date , | ) +( | booking~flight_price AS flight_price , | ) +( | booking~currency_code AS currency_code , | ) +( | z~created_by AS created_by , | ) +( | z~last_changed_by AS last_changed_by , | ) +( | z~last_changed_at AS local_last_changed_by | ) +( | ). | ) +( | COMMIT WORK. | ) +( | | ) +( |* We overwrite the existing airlines with ours | ) +( | UPDATE ('{ table_name_child }') SET carrier_id = 'SW' WHERE carrier_id NOT IN ( 'AA', 'AZ', 'LH', 'JL' ). | ) +( | UPDATE ('{ table_name_child }') SET carrier_id = 'GA' WHERE carrier_id = 'AA'. | ) +( | UPDATE ('{ table_name_child }') SET carrier_id = 'FA' WHERE carrier_id = 'AZ'. | ) +( | UPDATE ('{ table_name_child }') SET carrier_id = 'EA' WHERE carrier_id = 'LH'. | ) +( | UPDATE ('{ table_name_child }') SET carrier_id = 'OC' WHERE carrier_id = 'JL'. | ) +( | COMMIT WORK. | ) +( | | ) +( | " Travel Status Texts | ) +( | TYPES: BEGIN OF t_status_fields, | ) +( | client TYPE mandt, | ) +( | travel_status_id TYPE /dmo/overall_status, | ) +( | travel_status_text TYPE /dmo/description, | ) +( | END OF t_status_fields. | ) +( | TYPES: tt_status TYPE STANDARD TABLE OF t_status_fields WITH KEY travel_status_id. | ) +( | | ) +( | DATA status_itab TYPE tt_status. | ) +( | | ) +( | status_itab = VALUE tt_status( | ) +( | ( travel_status_id = 'O' travel_status_text = 'Open' ) | ) +( | ( travel_status_id = 'A' travel_status_text = 'Accepted' ) | ) +( | ( travel_status_id = 'X' travel_status_text = 'Rejected' ) | ) +( | ). | ) +( |* insert the new table entries | ) +( | INSERT ('{ table_name_status }') FROM TABLE @status_itab. | ) +( | COMMIT WORK. | ) +( | | ) +( | | ) +( | " Carrier | ) +( | TYPES: BEGIN OF t_carrier_fields, | ) +( | client TYPE mandt, | ) +( | carrier_id TYPE /dmo/carrier_id, | ) +( | name TYPE /dmo/carrier_name, | ) +( | carrier_pic_url TYPE c length 255, | ) +( | currency_code TYPE /dmo/currency_code, | ) +( | END OF t_carrier_fields. | ) +( | TYPES: tt_carrier TYPE STANDARD TABLE OF t_carrier_fields WITH KEY carrier_id. | ) +( | | ) +( | DATA carrier_itab TYPE tt_carrier. | ) +( | | ) +( |* Carrier tab entries | ) +( | carrier_itab = VALUE tt_carrier( | ) +( | ( carrier_id = 'GA' name = 'Green Albatros' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Green-Albatross-logo.png' currency_code = 'EUR') | ) +( | ( carrier_id = 'FA' name = 'Fly Africa' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Fly-Africa-logo.png' currency_code = 'EUR') | ) +( | ( carrier_id = 'EA' name = 'European Airlines' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/European-Airlines-logo.png' currency_code = 'EUR') | ) +( | ( carrier_id = 'OC' name = 'Oceania' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Oceania-logo.png' currency_code = 'EUR') | ) +( | ( carrier_id = 'SW' name = 'Sunset Wings' carrier_pic_url = 'https://raw.githubusercontent.com/SAP-samples/fiori-elements-opensap/main/week1/images/airlines/Sunset-Wings-logo.png' currency_code = 'EUR') | ) +( | ). | ) +( | | ) +( |* insert the new table entries | ) +( | INSERT ('{ table_name_carrier }') FROM TABLE @carrier_itab. | ) +( | COMMIT WORK. | ) +( | | ) +( | " insert connection demo data | ) +( | INSERT ('{ table_name_connection }') FROM ( | ) +( | SELECT | ) +( | FROM /dmo/connection | ) +( | FIELDS | ) +( | carrier_id, | ) +( | connection_id, | ) +( | airport_from_id, | ) +( | airport_to_id, | ) +( | departure_time, | ) +( | arrival_time, | ) +( | CAST( distance AS dec( 12, 2 ) ),| ) +*( | distance, | ) +( | distance_unit | ) +( | ). | ) +( | COMMIT WORK. | ) +( | | ) +( |* We overwrite the existing airlines with ours | ) +( | UPDATE ('{ table_name_connection }') SET carrier_id = 'SW' WHERE carrier_id NOT IN ( 'AA', 'AZ', 'LH', 'JL' ). | ) +( | UPDATE ('{ table_name_connection }') SET carrier_id = 'GA' WHERE carrier_id = 'AA'. | ) +( | UPDATE ('{ table_name_connection }') SET carrier_id = 'FA' WHERE carrier_id = 'AZ'. | ) +( | UPDATE ('{ table_name_connection }') SET carrier_id = 'EA' WHERE carrier_id = 'LH'. | ) +( | UPDATE ('{ table_name_connection }') SET carrier_id = 'OC' WHERE carrier_id = 'JL'. | ) +( | COMMIT WORK. | ) +( | | ) +( | " insert flight demo data | ) +( | INSERT ('{ table_name_flight }') FROM ( | ) +( | SELECT FROM /dmo/flight FIELDS | ) +( | " client | ) +( | carrier_id, | ) +( | connection_id, | ) +( | flight_date, | ) +( | price, | ) +( | currency_code, | ) +( | plane_type_id, | ) +( | seats_max, | ) +( | seats_occupied | ) +( | ). | ) +( | COMMIT WORK. | ) +( | | ) +( |* We overwrite the existing airlines with ours | ) +( | UPDATE ('{ table_name_flight }') SET carrier_id = 'SW' WHERE carrier_id NOT IN ( 'AA', 'AZ', 'LH', 'JL' ). | ) +( | UPDATE ('{ table_name_flight }') SET carrier_id = 'GA' WHERE carrier_id = 'AA'. | ) +( | UPDATE ('{ table_name_flight }') SET carrier_id = 'FA' WHERE carrier_id = 'AZ'. | ) +( | UPDATE ('{ table_name_flight }') SET carrier_id = 'EA' WHERE carrier_id = 'LH'. | ) +( | UPDATE ('{ table_name_flight }') SET carrier_id = 'OC' WHERE carrier_id = 'JL'. | ) +( | COMMIT WORK. | ) +( | | ) +( |* For simplicity reasons we only use one currency (EUR) | ) +( | UPDATE ('{ table_name_child }') SET flight_price = division( flight_price, 130, 2 ) where currency_code = 'JPY'. | ) +( | UPDATE ('{ table_name_root }') SET booking_fee = division( booking_fee, 130, 2 ) where currency_code = 'JPY'. | ) +( | UPDATE ('{ table_name_root }') SET total_price = division( total_price, 130, 2 ) where currency_code = 'JPY'. | ) +( | UPDATE ('{ table_name_child }') SET flight_price = division( flight_price, 2, 2 ) where currency_code = 'SGD'. | ) +( | UPDATE ('{ table_name_root }') SET booking_fee = division( booking_fee, 2, 2 ) where currency_code = 'SGD'. | ) +( | UPDATE ('{ table_name_root }') SET total_price = division( total_price, 2, 2 ) where currency_code = 'SGD'. | ) +( | UPDATE ('{ table_name_root }') SET currency_code = 'EUR'. | ) +( | UPDATE ('{ table_name_child }') SET currency_code = 'EUR'. | ) + ) ). + + ENDMETHOD. + + + METHOD generate_flight_i_view. + DATA: s_view_name_connection TYPE string, + s_view_name_carrier TYPE string, + s_view_name_flight TYPE string. + + s_view_name_flight = i_view_name_flight. + REPLACE ALL OCCURRENCES OF '_' IN s_view_name_flight WITH ''. + s_view_name_connection = i_view_name_connection. + s_view_name_carrier = i_view_name_carrier. + + DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_flight + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Flight view for Travel Scenario' + ")->add_view( ). + )->add_view_entity( ). + " lo_view_entity->data_source->set_entity( CONV #( table_name_flight ) )->set_alias( 'Flight' ). + lo_view_entity->data_source->set_view_entity( CONV #( table_name_flight ) )->set_alias( 'Flight' ). + + " View annotations. + "lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name_flight ). + "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ). + "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ). + lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ). + lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Flight view entity' ). + lo_view_entity->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ). + + " add associations + DATA(lo_condition) = xco_cp_ddl=>field( 'AirlineID' )->of_projection( )->eq( + xco_cp_ddl=>field( 'AirlineID' )->of( '_Airline' ) ). + lo_view_entity->add_association( i_view_name_carrier )->set_cardinality( xco_cp_cds=>cardinality->one )->set_alias( '_Airline' )->set_condition( lo_condition ). + + lo_condition = xco_cp_ddl=>field( 'ConnectionID' )->of_projection( )->eq( xco_cp_ddl=>field( 'ConnectionID' )->of( '_Connection' ) )->and( + xco_cp_ddl=>field( 'AirlineID' )->of_projection( )->eq( xco_cp_ddl=>field( 'AirlineID' )->of( '_Connection' ) ) ). + lo_view_entity->add_association( i_view_name_connection )->set_cardinality( xco_cp_cds=>cardinality->one )->set_alias( '_Connection' )->set_condition( lo_condition ). + + lo_condition = xco_cp_ddl=>field( 'CurrencyCode' )->of_projection( )->eq( + xco_cp_ddl=>field( 'Currency' )->of( '_Currency' ) ). + lo_view_entity->add_association( 'I_Currency' )->set_cardinality( xco_cp_cds=>cardinality->zero_to_one )->set_alias( '_Currency' )->set_condition( lo_condition ). + + " Add fields. + DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.carrier_id' ) )->set_key( )->set_alias( 'AirlineID' ). + lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.8' ). + lo_identifier->add_annotation( 'ObjectModel.text.association' )->value->build( )->add_string( '_Airline' ). + DATA(lo_valuehelpbuilder) = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuehelpbuilder->begin_array( )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( s_view_name_carrier )->add_member( 'element' )->add_string( 'AirlineID' + )->end_record( ). + lo_valuehelpbuilder->end_record( )->end_array( ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.connection_id' ) )->set_key( )->set_alias( 'ConnectionID' ). + lo_identifier->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_identifier->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( '0.8' ). + lo_valuehelpbuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuehelpbuilder->begin_array( )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( s_view_name_connection )->add_member( 'element' )->add_string( 'ConnectionID' + )->end_record( + )->add_member( 'additionalBinding' + )->begin_array( )->begin_record( + )->add_member( 'element' )->add_string( 'AirlineID' )->add_member( 'localElement' )->add_string( 'AirlineID' + )->end_record( )->end_array( ). + lo_valuehelpbuilder->end_record( )->end_array( ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.flight_date' ) )->set_key( )->set_alias( 'FlightDate' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.price' ) )->set_alias( 'Price' ). + lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'CurrencyCode' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.currency_code' ) )->set_alias( 'CurrencyCode' ). + "lo_identifier->add_annotation( 'Semantics.currencyCode' )->value->build( )->add_boolean( abap_true ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.plane_type_id' ) )->set_alias( 'PlaneType' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.seats_max' ) )->set_alias( 'MaximumSeats' ). + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Flight.seats_occupied' ) )->set_alias( 'OccupiedSeats' ). + + " add association to publish + lo_view_entity->add_field( xco_cp_ddl=>field( '_Airline' ) ). + lo_view_entity->add_field( xco_cp_ddl=>field( '_Connection' ) ). + lo_view_entity->add_field( xco_cp_ddl=>field( '_Currency' ) ). + ENDMETHOD. + + + METHOD generate_status_i_view. + DATA(lo_interface_specification) = mo_put_operation->for-ddls->add_object( i_view_name_status + )->set_package( package_name + )->create_form_specification( ). + + DATA(lo_view_entity) = lo_interface_specification->set_short_description( 'Status view for Travel Scenario' + ")->add_view( ). + )->add_view_entity( ). + "lo_view_entity->data_source->set_entity( CONV #( table_name_status ) )->set_alias( 'Status' ). + lo_view_entity->data_source->set_view_entity( CONV #( table_name_status ) )->set_alias( 'Status' ). + + " View annotations. + DATA s_view_name TYPE string. + s_view_name = i_view_name_status. + REPLACE ALL OCCURRENCES OF '_' IN s_view_name WITH ''. + + "lo_view_entity->add_annotation( 'AbapCatalog.sqlViewName' )->value->build( )->add_string( s_view_name ). + "lo_view_entity->add_annotation( 'AbapCatalog.compiler.compareFilter' )->value->build( )->add_boolean( abap_true ). + "lo_view_entity->add_annotation( 'AbapCatalog.preserveKey' )->value->build( )->add_boolean( abap_true ). + lo_view_entity->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ). + lo_view_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Travel Status view entity' ). + + " Add fields. + DATA(lo_identifier) = lo_view_entity->add_field( xco_cp_ddl=>field( 'Status.travel_status_id' ) )->set_key( )->set_alias( 'TravelStatusId' ). + lo_identifier->add_annotation( 'UI.textArrangement' )->value->build( )->add_enum( 'TEXT_ONLY' ). + lo_identifier->add_annotation( 'ObjectModel.text.element' )->value->build( )->begin_array( )->add_string( 'TravelStatusText' ). + + lo_identifier = lo_view_entity->add_field( xco_cp_ddl=>field( 'Status.travel_status_text' ) )->set_alias( 'TravelStatusText' ). + lo_identifier->add_annotation( 'UI.hidden' )->value->build( )->add_boolean( abap_true ). + ENDMETHOD. + + + METHOD generate_table. + + + DATA(lo_specification) = mo_put_operation->for-tabl-for-database_table->add_object( table_name + )->set_package( package_name + )->create_form_specification( ). + + lo_specification->set_short_description( table_short_description ). + + DATA database_table_field TYPE REF TO if_xco_gen_tabl_dbt_s_fo_field . + + LOOP AT table_fields INTO DATA(table_field_line). + database_table_field = lo_specification->add_field( table_field_line-field ). + + IF table_field_line-is_key = abap_true. + database_table_field->set_key_indicator( ). + ENDIF. + IF table_field_line-not_null = abap_true. + database_table_field->set_not_null( ). + ENDIF. + IF table_field_line-currencycode IS NOT INITIAL. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-currencycode ) ). + ENDIF. + IF table_field_line-unitofmeasure IS NOT INITIAL. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-unitofmeasure ) ). + ENDIF. + IF table_field_line-data_element IS NOT INITIAL. + database_table_field->set_type( xco_cp_abap_dictionary=>data_element( table_field_line-data_element ) ). + ELSE. + CASE to_lower( table_field_line-built_in_type ). + WHEN 'accp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ). + WHEN 'clnt'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ). + WHEN 'cuky'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ). + WHEN 'dats'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ). + WHEN 'df16_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ). + WHEN 'df34_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ). + WHEN 'fltp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ). + WHEN 'int1'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ). + WHEN 'int2'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ). + WHEN 'int4'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ). + WHEN 'int8'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ). + WHEN 'lang'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ). + WHEN 'tims'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ). + WHEN 'char'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( table_field_line-built_in_type_length ) ). + WHEN 'curr'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'dec' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'df16_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'df34_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'lchr' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( table_field_line-built_in_type_length ) ). + WHEN 'lraw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( table_field_line-built_in_type_length ) ). + WHEN 'numc' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( table_field_line-built_in_type_length ) ). + WHEN 'quan' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'raw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( table_field_line-built_in_type_length ) ). + WHEN 'rawstring'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( table_field_line-built_in_type_length ) ). + WHEN 'sstring' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( table_field_line-built_in_type_length ) ). + WHEN 'string' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( table_field_line-built_in_type_length ) ). + WHEN 'unit' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( table_field_line-built_in_type_length ) ). + WHEN OTHERS. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for( + iv_type = to_upper( table_field_line-built_in_type ) + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + ENDCASE. + ENDIF. + ENDLOOP. + ENDMETHOD. + + + METHOD get_carrier_table_fields. + carrier_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'carrier_id' + data_element = '/dmo/carrier_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'name' + data_element = '/dmo/carrier_name' ) + ( field = 'carrier_pic_url' + data_element = 'BAPI_LISTR' ) + ( field = 'currency_code' + data_element = '/dmo/currency_code' ) + ). + ENDMETHOD. + + + METHOD get_child_table_fields. + child_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'booking_uuid' + data_element = 'sysuuid_x16' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_uuid' + data_element = 'sysuuid_x16' + not_null = 'X' ) + ( field = 'booking_id' + data_element = '/dmo/booking_id' ) + ( field = 'booking_date' + data_element = '/dmo/booking_date' ) + ( field = 'customer_id' + data_element = '/dmo/customer_id' ) + ( field = 'carrier_id' + data_element = '/dmo/carrier_id' ) + ( field = 'connection_id' + data_element = '/dmo/connection_id' ) + ( field = 'flight_date' + data_element = '/dmo/flight_date' ) + ( field = 'flight_price' + data_element = '/dmo/flight_price' + currencycode = 'currency_code' ) + ( field = 'currency_code' + data_element = '/dmo/currency_code' ) + ( field = 'created_by' + data_element = 'syuname' ) + ( field = 'last_changed_by' + data_element = 'syuname' ) + ( field = 'local_last_changed_at ' + data_element = 'timestampl' ) + ). + ENDMETHOD. + + + METHOD get_connection_table_fields. + connection_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'carrier_id' + data_element = '/dmo/carrier_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'connection_id' + data_element = '/dmo/connection_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'airport_from_id' + data_element = '/dmo/airport_from_id' ) + ( field = 'airport_to_id' + data_element = '/dmo/airport_to_id' ) + ( field = 'departure_time' + data_element = '/dmo/flight_departure_time' ) + ( field = 'arrival_time' + data_element = '/dmo/flight_arrival_time' ) + ( field = 'distance' + data_element = '/dmo/distance_fe' ) + ( field = 'distance_unit' + data_element = 'msehi' ) + ). + ENDMETHOD. + + + METHOD get_flight_table_fields. + flight_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'carrier_id' + data_element = '/dmo/carrier_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'connection_id' + data_element = '/dmo/connection_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'flight_date' + data_element = '/dmo/flight_date' + is_key = 'X' + not_null = 'X' ) + ( field = 'price' + data_element = '/dmo/flight_price' + currencycode = 'currency_code' ) + ( field = 'currency_code' + data_element = '/dmo/currency_code' ) + ( field = 'plane_type_id' + data_element = '/dmo/plane_type_id' ) + ( field = 'seats_max' + data_element = '/dmo/plane_seats_max' ) + ( field = 'seats_occupied' + data_element = '/dmo/plane_seats_occupied' ) + ). + ENDMETHOD. + + + METHOD get_json_string. + " build the json document + json_string ='{' && |\r\n| && + ' "implementationType": "managed_uuid",' && |\r\n| && + ' "transactionalbehavior" : true,' && |\r\n| && + ' "publishservice" : true ,' && |\r\n| && + | "transportrequest": "{ transport }",| && |\r\n| && + ' "namespace": "Z",' && |\r\n| && + | "suffix": "_{ unique_suffix }",| && |\r\n| && + ' "prefix": "FE_",' && |\r\n| && + | "package": "{ package_name }",| && |\r\n| && + ' "datasourcetype": "table",' && |\r\n| && + ' "draftenabled": true,' && |\r\n| && "draft + ' "bindingtype": "odata_v4_ui",' && |\r\n| && + ' "hierarchy": {' && |\r\n| && + ' "entityName": "Travel",' && |\r\n| && + | "dataSource": "{ table_name_root }",| && |\r\n| && + | "drafttable": "{ draft_table_name_root }",| && |\r\n| && "draft + ' "objectId": "travel_id",' && |\r\n| && + ' "uuid": "travel_uuid",' && |\r\n| && + ' "lastChangedAt":"LAST_CHANGED_AT",' && |\r\n| && + ' "totalEtag":"LAST_CHANGED_AT",' && |\r\n| && + ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + '"etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + + | "cdsinterfaceviewbasic" : "{ cdsinterfaceviewbasic_travel }",| && |\r\n| && + | "cdsrestrictedreuseview": "{ cdsrestrictedreuseview_travel }",| && |\r\n| && + | "cdsinterfaceview" : "{ cdsinterfaceview_travel }",| && |\r\n| && + | "cdsprojectionview" : "{ cdsprojectionview_travel }",| && |\r\n| && + | "metadataextensionview" : "{ metadataextensionview_travel }",| && |\r\n| && + + + + + " value help definitions + ' "valueHelps": [' && |\r\n| && + ' {' && |\r\n| && + ' "alias": "Agency",' && |\r\n| && + ' "name": "/DMO/I_Agency",' && |\r\n| && + ' "localElement": "AgencyID",' && |\r\n| && + ' "element": "AgencyID"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "alias": "Currency",' && |\r\n| && + ' "name": "I_Currency",' && |\r\n| && + ' "localElement": "CurrencyCode",' && |\r\n| && + ' "element": "Currency"' && |\r\n| && + ' }' && |\r\n| && + ' ],' && |\r\n| && + ' "associations": [' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Agency",' && |\r\n| && + ' "target": "/DMO/I_Agency",' && |\r\n| && + ' "cardinality": "zero_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "AgencyID",' && |\r\n| && + ' "associationField": "AgencyID"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Currency",' && |\r\n| && + ' "target": "I_Currency",' && |\r\n| && + ' "cardinality": "zero_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CurrencyCode",' && |\r\n| && + ' "associationField": "Currency"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Customer",' && |\r\n| && + ' "target": "/DMO/I_Customer",' && |\r\n| && + ' "cardinality": "zero_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CustomerID",' && |\r\n| && + ' "associationField": "CustomerID"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_TravelStatus",' && |\r\n| && + | "target": "{ i_view_name_status }",| && |\r\n| && + ' "cardinality": "zero_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "OverallStatus",' && |\r\n| && + ' "associationField": "TravelStatusId"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' }' && |\r\n| && + ' ],' && |\r\n| && + " children + ' "children": [' && |\r\n| && + ' {' && |\r\n| && + ' "entityName": "Booking",' && |\r\n| && + | "dataSource": "{ table_name_child }",| && |\r\n| && + | "drafttable": "{ draft_table_name_child }",| && |\r\n| && "draft + ' "objectId": "booking_id",' && |\r\n| && + ' "uuid": "booking_uuid",' && |\r\n| && + ' "parentUuid": "travel_uuid",' && |\r\n| && + ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + '"etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + + + | "cdsinterfaceviewbasic" : "{ cdsinterfaceviewbasic_book }",| && |\r\n| && + | "cdsrestrictedreuseview": "{ cdsrestrictedreuseview_book }",| && |\r\n| && + | "cdsinterfaceview" : "{ cdsinterfaceview_book }",| && |\r\n| && + | "cdsprojectionview" : "{ cdsprojectionview_book }",| && |\r\n| && + | "metadataextensionview" : "{ metadataextensionview_book }",| && |\r\n| && + + + + ' "valueHelps": [' && |\r\n| && + ' {' && |\r\n| && + ' "alias": "Flight",' && |\r\n| && + | "name": "{ i_view_name_flight }",| && |\r\n| && + ' "localElement": "ConnectionID",' && |\r\n| && + ' "element": "ConnectionID",' && |\r\n| && + ' "additionalBinding": [' && |\r\n| && + ' {' && |\r\n| && + ' "localElement": "FlightDate",' && |\r\n| && + ' "element": "FlightDate"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "localElement": "CarrierID",' && |\r\n| && + ' "element": "AirlineID"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "localElement": "FlightPrice",' && |\r\n| && + ' "element": "Price"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "localElement": "CurrencyCode",' && |\r\n| && + ' "element": "CurrencyCode"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "alias": "Currency",' && |\r\n| && + ' "name": "I_Currency",' && |\r\n| && + ' "localElement": "CurrencyCode",' && |\r\n| && + ' "element": "Currency"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "alias": "Airline",' && |\r\n| && + | "name": "{ i_view_name_carrier }",| && |\r\n| && + ' "localElement": "CarrierID",' && |\r\n| && + ' "element": "AirlineID"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "alias": "Customer",' && |\r\n| && + ' "name": "/DMO/I_Customer",' && |\r\n| && + ' "localElement": "CustomerID",' && |\r\n| && + ' "element": "CustomerID"' && |\r\n| && + ' }' && |\r\n| && + ' ],' && |\r\n| && + ' "associations": [' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Connection",' && |\r\n| && + | "target": "{ i_view_name_connection }",| && |\r\n| && + ' "cardinality": "one_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CarrierID",' && |\r\n| && + ' "associationField": "AirlineID"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "ConnectionID",' && |\r\n| && + ' "associationField": "ConnectionID"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Flight",' && |\r\n| && + | "target": "{ i_view_name_flight }",| && |\r\n| && + ' "cardinality": "one_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CarrierID",' && |\r\n| && + ' "associationField": "AirlineID"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "ConnectionID",' && |\r\n| && + ' "associationField": "ConnectionID"' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "FlightDate",' && |\r\n| && + ' "associationField": "FlightDate"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Carrier",' && |\r\n| && + | "target": "{ i_view_name_carrier }",| && |\r\n| && + ' "cardinality": "one_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CarrierID",' && |\r\n| && + ' "associationField": "AirlineID"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Currency",' && |\r\n| && + ' "target": "I_Currency",' && |\r\n| && + ' "cardinality": "zero_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CurrencyCode",' && |\r\n| && + ' "associationField": "Currency"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' },' && |\r\n| && + ' {' && |\r\n| && + ' "name": "_Customer",' && |\r\n| && + ' "target": "/DMO/I_Customer",' && |\r\n| && + ' "cardinality": "one_to_one",' && |\r\n| && + ' "conditions": [' && |\r\n| && + ' {' && |\r\n| && + ' "projectionField": "CustomerID",' && |\r\n| && + ' "associationField": "CustomerID"' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' }' && |\r\n| && + '}'. + ENDMETHOD. + + + METHOD get_json_string_status. + " build the json document + json_string_status ='{' && |\r\n| && + ' "implementationType": "unmanaged_semantic",' && |\r\n| && + ' "transactionalbehavior" : false,' && |\r\n| && + ' "publishservice" : false ,' && |\r\n| && + ' "namespace": "Z",' && |\r\n| && + | "suffix": "_{ unique_suffix }",| && |\r\n| && + ' "prefix": "FE_",' && |\r\n| && + | "package": "{ package_name }",| && |\r\n| && + ' "datasourcetype": "table",' && |\r\n| && + ' "draftenabled": false,' && |\r\n| && "draft + ' "bindingtype": "odata_v4_ui",' && |\r\n| && + ' "hierarchy": {' && |\r\n| && + ' "entityName": "Status",' && |\r\n| && + | "dataSource": "{ table_name_status }",| && |\r\n| && + ' "objectId": "travel_status_id"' && |\r\n| && + ' }' && |\r\n| && + '}'. + ENDMETHOD. + + + METHOD get_root_table_fields. + root_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_uuid' + data_element = 'sysuuid_x16' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_id' + data_element = '/dmo/travel_id' ) + ( field = 'agency_id' + data_element = '/dmo/agency_id' ) + ( field = 'customer_id' + data_element = '/dmo/customer_id' ) + ( field = 'begin_date' + data_element = '/dmo/begin_date' ) + ( field = 'end_date' + data_element = '/dmo/end_date' ) + ( field = 'booking_fee' + data_element = '/dmo/booking_fee' + currencycode = 'currency_code' ) + ( field = 'total_price' + data_element = '/dmo/total_price' + currencycode = 'currency_code' ) + ( field = 'currency_code' + data_element = '/dmo/currency_code' ) + ( field = 'description' + data_element = '/dmo/description' ) + ( field = 'overall_status' + data_element = '/dmo/overall_status' ) + ( field = 'created_by' + data_element = 'syuname' ) + ( field = 'created_at' + data_element = 'timestampl' ) + ( field = 'last_changed_by' + data_element = 'syuname' ) + ( field = 'last_changed_at' + data_element = 'timestampl' ) + ( field = 'local_last_changed_at ' + data_element = 'timestampl' ) + ). + ENDMETHOD. + + + METHOD get_status_table_fields. + status_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_status_id' + data_element = '/dmo/overall_status' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_status_text' + data_element = '/dmo/description' ) + ). + ENDMETHOD. + + + METHOD get_unique_suffix. + DATA: li_counter(6) TYPE n, + ls_counter TYPE string, + ls_package_name TYPE sxco_package, + is_valid_package TYPE abap_bool. + + + s_unique_suffix = ''. + is_valid_package = abap_false. + li_counter = 1000. + ls_counter = li_counter. + ls_package_name = s_prefix && ls_counter. + + WHILE is_valid_package = abap_false. + "check package name + DATA(lo_package) = xco_lib->get_package( ls_package_name ). " xco_cp_abap_repository=>object->devc->for( ls_package_name ). + IF NOT lo_package->exists( ). + is_valid_package = abap_true. + s_unique_suffix = ls_counter. + ENDIF. + li_counter = li_counter + 1. + ls_counter = li_counter. + ls_package_name = s_prefix && ls_counter. + ENDWHILE. + ENDMETHOD. + + + METHOD if_oo_adt_classrun~main. + out->write( | SAP Fiori elements exercise generator | ). + out->write( | ------------------------------------- | ). + " to upper + package_name = to_upper( package_name ). + unique_suffix = to_upper( unique_suffix ). + + "create transport + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_false. + transport = create_transport( ). + ENDIF. + + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + DATA(my_package) = xco_lib->get_package( CONV sxco_package( co_zlocal_package ) ). + IF my_package->exists( ) = abap_false. + out->write( |Super package { co_zlocal_package } does not exist.| ). + create_super_package( ). + IF my_package->exists( ) = abap_false. + out->write( |Super package { co_zlocal_package } cannot be created.| ). + EXIT. + ELSE. + out->write( |Super package { co_zlocal_package } created.| ). + ENDIF. + ELSE. + out->write( |Super package { co_zlocal_package } exists.| ). + ENDIF. + ENDIF. + + "create package + create_package( transport ). + out->write( | The following package got created for you and includes everything you need: { package_name } | ). + out->write( | In the "Project Explorer" right click on "Favorite Packages" and click on "Add Package...". Enter "{ package_name }" and click OK. | ). + + mo_environment = get_environment( transport ). + + DATA(json_string) = get_json_string( ). " get json document + DATA(root_table_fields) = get_root_table_fields( ). + + mo_put_operation = get_put_operation( mo_environment )."->create_put_operation( ). + + generate_table( + EXPORTING +* io_put_operation = put_operation + table_fields = root_table_fields + table_name = table_name_root + table_short_description = 'Travel persistence for Travel scenario' + ). + + IF table_name_child IS NOT INITIAL. + DATA(child_table_fields) = get_child_table_fields( ). + generate_table( + EXPORTING +* io_put_operation = put_operation + table_fields = child_table_fields + table_name = table_name_child + table_short_description = 'Booking persistence for Travel scenario' + ). + ENDIF. + + DATA(status_table_fields) = get_status_table_fields( ). + generate_table( + EXPORTING +* io_put_operation = put_operation + table_fields = status_table_fields + table_name = table_name_status + table_short_description = 'Status Description persistence for Travel scenario' + ). + generate_status_i_view( +* EXPORTING +* io_put_operation = put_operation + ). + + DATA(carrier_table_fields) = get_carrier_table_fields( ). + generate_table( + EXPORTING +* io_put_operation = put_operation + table_fields = carrier_table_fields + table_name = table_name_carrier + table_short_description = 'Carrier persistence for Travel scenario' + ). + generate_carrier_i_view( +* EXPORTING +* io_put_operation = put_operation + ). + + DATA(connection_table_fields) = get_connection_table_fields( ). + generate_table( + EXPORTING +* io_put_operation = put_operation + table_fields = connection_table_fields + table_name = table_name_connection + table_short_description = 'Connection persistence for Travel scenario' + ). + generate_connection_i_view( +* exporting +* io_put_operation = put_operation + ). + + DATA(flight_table_fields) = get_flight_table_fields( ). + generate_table( + EXPORTING +* io_put_operation = put_operation + table_fields = flight_table_fields + table_name = table_name_flight + table_short_description = 'Flight persistence for Travel scenario' + ). + generate_flight_i_view( +* EXPORTING +* io_put_operation = put_operation + ). + + TRY. + DATA(lo_result) = mo_put_operation->execute( ). + + + + CATCH cx_xco_gen_put_exception INTO DATA(exc_XCO_GEN_PUT_EXCEPTION). + " handle findings + IF show_findings = abap_true. + + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + LOOP AT exc_xco_gen_put_exception->findings->get( ) INTO DATA(put_Finding). + out->write( put_Finding->message->get_text( ) ). + ENDLOOP. + EXIT. + ENDIF. + ENDTRY. + +* Create data generator class + + mo_draft_tabl_put_operation = get_put_operation( mo_environment ). + generate_data_generator_class( + EXPORTING +* io_put_operation = put_operation + lo_transport = transport + ). + lo_result = mo_draft_tabl_put_operation->execute( ). + " handle findings + IF show_findings = abap_true. + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + IF xco_lib->on_premise_branch_is_used( ) = abap_false. + release_data_generator_class( + EXPORTING + lo_transport = transport + ). + ENDIF. + + DATA lo_object TYPE REF TO if_oo_adt_classrun. + CREATE OBJECT lo_object TYPE (data_generator_class_name). + lo_object->main( + EXPORTING out = out "->plain + ). + + DATA(rap_bo_generator) = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ). + DATA(lt_todos) = rap_bo_generator->generate_bo( ). + + IF show_findings = abap_true. + " handle findings + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + TRY. +* Delete mde files to start with annotations from scratch + IF create_mde_files = abap_false. +* DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system. + + DATA lv_del_transport TYPE sxco_transport. + lv_del_transport = rap_bo_generator->root_node->transport_request. + + + IF lv_del_transport IS INITIAL. + DATA(cts_obj) = xco_cp_abap_repository=>object->for( + EXPORTING + iv_type = 'DDLX' + iv_name = to_upper( rap_bo_generator->root_node->rap_node_objects-meta_data_extension ) + )->if_xco_cts_changeable~get_object( ). + lv_del_transport = cts_obj->get_lock( )->get_transport( ). + lv_del_transport = xco_cp_cts=>transport->for( lv_del_transport )->get_request( )->value. + ENDIF. + DATA(mo_environment2) = get_environment( lv_del_transport ). + mo_environment2 = get_environment( lv_del_transport ). "xco_cp_generation=>environment->dev_system( lv_del_transport ). + DATA(lo_delete_ddlx_operation) = mo_environment2->for-ddlx->create_delete_operation( ). + DATA(lo_delete_ddls_operation) = mo_environment2->for-ddls->create_delete_operation( ). + DATA(lo_delete_bdef_operation) = mo_environment2->for-bdef->create_delete_operation( ). + lo_delete_ddlx_operation->add_object( rap_bo_generator->root_node->rap_node_objects-meta_data_extension ). + "delete i-tp view and corresponding bdef + lo_delete_ddls_operation->add_object( rap_bo_generator->root_node->rap_node_objects-cds_view_i ). + lo_delete_bdef_operation->add_object( rap_bo_generator->root_node->rap_root_node_objects-behavior_definition_i ). + + LOOP AT rap_bo_generator->root_node->all_childnodes INTO DATA(ls_childnode). + lo_delete_ddlx_operation->add_object( ls_childnode->rap_node_objects-meta_data_extension ). + lo_delete_ddls_operation->add_object( ls_childnode->rap_node_objects-cds_view_i ). + ENDLOOP. + lo_delete_bdef_operation->execute( ). + lo_delete_ddls_operation->execute( ). + lo_delete_ddlx_operation->execute( ). + out->write( |Success: deleting objects| ). + ENDIF. + CATCH cx_root INTO DATA(delete_exception). + out->write( |exception occured when deleting objects| ). + ENDTRY. + + +* Create artifacts for analytics + mo_put_operation1 = get_put_operation( mo_environment ). "->create_put_operation( ). + mo_put_operation2 = get_put_operation( mo_environment ). "->create_put_operation( ). + generate_analytics_service( +* EXPORTING +* io_put_operation1 = lo_objects_put_op_analytics1 +* io_put_operation2 = lo_objects_put_op_analytics2 + ). + DATA(lo_result_alp) = mo_put_operation1->execute( ). + + IF show_findings = abap_true. + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + lo_result_alp = mo_put_operation2->execute( ). + IF show_findings = abap_true. + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + out->write( | Enjoy your SAP Fiori elements exercise :) | ). + ENDMETHOD. + + + METHOD release_data_generator_class. + + DATA(lo_change_scenario) = xco_cp_cts=>transport->for( lo_transport ). + DATA(lo_api_state) = xco_cp_ars=>api_state->released( VALUE #( ( xco_cp_ars=>visibility->sap_cloud_platform ) ) ). + + DATA(lo_class) = xco_lib->get_class( data_generator_class_name ). + +* DATA(lo_data_element) = xco_cp_abap_repository=>object->clas->for( data_generator_class_name ). + lo_class->set_api_state( + io_change_scenario = lo_change_scenario + io_api_state = lo_api_state + ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_fe_travel_generator.clas.xml b/src/zdmo_cl_fe_travel_generator.clas.xml new file mode 100644 index 0000000..debf394 --- /dev/null +++ b/src/zdmo_cl_fe_travel_generator.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_FE_TRAVEL_GENERATOR</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>zdmo_cl_fe_travel_generator</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_build_json_2.clas.abap b/src/zdmo_cl_rap_gen_build_json_2.clas.abap new file mode 100644 index 0000000..dc27ae2 --- /dev/null +++ b/src/zdmo_cl_rap_gen_build_json_2.clas.abap @@ -0,0 +1,429 @@ +CLASS zdmo_cl_rap_gen_build_json_2 DEFINITION + PUBLIC + INHERITING FROM cl_xco_cp_adt_simple_classrun + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + TYPES : tt_rapgen_field TYPE STANDARD TABLE OF ZDMO_R_RAPG_FieldTP WITH EMPTY KEY. + TYPES : ty_rapgen_field TYPE ZDMO_R_RAPG_FieldTP. + TYPES : tt_rapgen_node TYPE STANDARD TABLE OF ZDMO_R_RAPG_NodeTP WITH EMPTY KEY. + TYPES : ty_rapgen_node TYPE ZDMO_R_RAPG_NodeTP. + TYPES : tt_rapgen_bo TYPE STANDARD TABLE OF ZDMO_R_RAPG_ProjectTP WITH EMPTY KEY. + TYPES : ty_rapgen_bo TYPE ZDMO_R_RAPG_ProjectTP. + + + TYPES: BEGIN OF entities, + + nodeuuid TYPE sysuuid_x16, + + + END OF entities. + + TYPES tt_childentities TYPE STANDARD TABLE OF entities WITH DEFAULT KEY . + DATA root_entity TYPE ZDMO_R_RAPG_NodeTP. + DATA rapgen_node TYPE tt_rapgen_node. + DATA rapgen_bo TYPE tt_rapgen_bo. + DATA rapgen_field TYPE tt_rapgen_field. + + DATA run_via_f9 TYPE abap_boolean VALUE abap_false. + + METHODS constructor + IMPORTING iv_bo_uuid TYPE sysuuid_x16 OPTIONAL + it_rapgen_node TYPE tt_rapgen_node OPTIONAL + it_rapgen_bo TYPE tt_rapgen_bo OPTIONAL + it_rapgen_field TYPE tt_rapgen_field OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS create_json + "IMPORTING iv_rapgen_bo_uuid TYPE ZDMO_rapgen_bo-rap_node_uuid + RETURNING VALUE(rv_json_string) TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS get_formatted_json_string + IMPORTING json_string_in TYPE string + RETURNING VALUE(json_string_out) TYPE string + RAISING cx_sxml_parse_error. + + + PROTECTED SECTION. + METHODS: main REDEFINITION. + PRIVATE SECTION. + + + DATA json_data_builder TYPE REF TO if_xco_cp_json_data_builder . + DATA rap_bo_uuid TYPE sysuuid_x16 . +* DATA rap_bo TYPE ZDMO_rapgen_bo. + DATA rap_bo TYPE ZDMO_R_RAPG_ProjectTP. + + METHODS get_child_entity_keys + IMPORTING current_node TYPE ZDMO_R_RAPG_NodeTP + RETURNING VALUE(child_csn_entities) TYPE tt_childentities . + + METHODS in_order + IMPORTING current_node TYPE ZDMO_R_RAPG_NodeTP + current_node_fields TYPE tt_rapgen_field OPTIONAL + " out TYPE REF TO if_xco_adt_classrun_out + io_json TYPE REF TO if_xco_cp_json_data_builder . +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_BUILD_JSON_2 IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + rap_bo_uuid = iv_bo_uuid. + rapgen_bo = it_rapgen_bo. + rapgen_node = it_rapgen_node. + rapgen_field = it_rapgen_field. + ENDMETHOD. + + + METHOD create_json. + + DATA json_string TYPE string . + DATA formatted_json_string TYPE string. + DATA root_node_fields TYPE tt_rapgen_field . + DATA node_fields TYPE tt_rapgen_field. + + DATA(lo_json_data_builder) = xco_cp_json=>data->builder( ). + + IF line_exists( rapgen_bo[ rapbouuid = rap_bo_uuid ] ). + rap_bo = rapgen_bo[ rapbouuid = rap_bo_uuid ]. + ELSE. + EXIT. + ENDIF. + + IF sy-subrc = 0. + + DATA(root_node) = rapgen_node[ isrootnode = abap_true RapBoUUID = rap_bo_uuid ]. + + CLEAR root_node_fields. + + LOOP AT rapgen_field INTO DATA(field) WHERE NodeUUID = root_node-NodeUUID AND RapboUUID = rap_bo_uuid . + APPEND field TO root_node_fields. + ENDLOOP. +* DATA(root_node_fields) = rapgen_field[ RapboUUID = rap_bo_uuid NodeUUID = root_node-NodeUUID ]. + + lo_json_data_builder->begin_object( ). + + lo_json_data_builder->add_member( 'namespace' )->add_string( CONV string( rap_bo-namespace ) ). + lo_json_data_builder->add_member( 'package' )->add_string( CONV string( rap_bo-packagename ) ). + lo_json_data_builder->add_member( 'dataSourceType' )->add_string( CONV string( rap_bo-datasourcetype ) ). + lo_json_data_builder->add_member( 'bindingType' )->add_string( CONV string( rap_bo-bindingtype ) ). + lo_json_data_builder->add_member( 'implementationType' )->add_string( CONV string( rap_bo-implementationtype ) ). + lo_json_data_builder->add_member( 'prefix' )->add_string( CONV string( rap_bo-prefix ) ). + lo_json_data_builder->add_member( 'suffix' )->add_string( CONV string( rap_bo-suffix ) ). + lo_json_data_builder->add_member( 'draftEnabled' )->add_boolean( rap_bo-draftenabled ). + lo_json_data_builder->add_member( 'multiInlineEdit' )->add_boolean( rap_bo-MultiInlineEdit ). + lo_json_data_builder->add_member( 'isCustomizingTable' )->add_boolean( rap_bo-CustomizingTable ). + lo_json_data_builder->add_member( 'addBusinessConfigurationRegistration' )->add_boolean( rap_bo-AddToManageBusinessConfig ). + lo_json_data_builder->add_member( 'transportRequest' )->add_string( CONV string( rap_bo-TransportRequest ) ). + + lo_json_data_builder->add_member( 'publishservice' )->add_boolean( rap_bo-PublishService ). + lo_json_data_builder->add_member( 'addbasiciviews' )->add_boolean( rap_bo-AddIViewBasic ). + lo_json_data_builder->add_member( 'isextensible' )->add_boolean( rap_bo-isExtensible ). + lo_json_data_builder->add_member( 'addsapobjecttype' )->add_boolean( rap_bo-addsapobjecttype ). + "set this string on entity level + "lo_json_data_builder->add_member( 'extensibilityElementSuffix' )->add_string( CONV string( rap_bo-extensibilityElementSuffix ) ). + + + lo_json_data_builder->add_member( 'hierarchy' ). + + in_order( + EXPORTING + current_node = root_node + current_node_fields = root_node_fields + "out = out + io_json = lo_json_data_builder + ). + + + "end object von BO infos + lo_json_data_builder->end_object( ). + + DATA(lo_json_data) = lo_json_data_builder->get_data( ). + + json_string = lo_json_data->to_string( ). + + rv_json_string = get_formatted_json_string( json_string ). + + ENDIF. + + ENDMETHOD. + + + METHOD get_child_entity_keys. + +* SELECT node_uuid FROM ZDMO_rapgen_node WHERE +* parent_uuid = @current_node-node_uuid AND +* is_root_node = @abap_false +* INTO TABLE @child_csn_entities. + + SELECT nodeuuid FROM @rapgen_node AS node + WHERE parentuuid = @current_node-nodeuuid AND + isrootnode = @abap_false + INTO TABLE @child_csn_entities. + + ENDMETHOD. + + + METHOD get_formatted_json_string. + + "cloud + DATA(json_xstring) = cl_abap_conv_codepage=>create_out( )->convert( json_string_in ). + "on_premise + "DATA(json_xstring) = cl_abap_codepage=>convert_to( json_string_in ). + + "Check and pretty print JSON + + DATA(reader) = cl_sxml_string_reader=>create( json_xstring ). + DATA(writer) = CAST if_sxml_writer( + cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ). + writer->set_option( option = if_sxml_writer=>co_opt_linebreaks ). + writer->set_option( option = if_sxml_writer=>co_opt_indent ). + reader->next_node( ). + reader->skip_node( writer ). + + "cloud + DATA(json_formatted_string) = cl_abap_conv_codepage=>create_in( )->convert( CAST cl_sxml_string_writer( writer )->get_output( ) ). + "on premise + "DATA(json_formatted_string) = cl_abap_codepage=>convert_from( CAST cl_sxml_string_writer( writer )->get_output( ) ). + + json_string_out = escape( val = json_formatted_string format = cl_abap_format=>e_xml_text ). + + ENDMETHOD. + + + METHOD in_order. + DATA child_entities TYPE TABLE OF zdmo_r_rapg_nodetp . + + DATA child_fields TYPE tt_rapgen_field ."TYPE TABLE OF ZDMO_R_RAPG_FieldTP. + + DATA i TYPE i. + " CLEAR child_entities. + + io_json->begin_object( ). + + io_json->add_member( 'entityname' )->add_string( CONV string( current_node-entityname ) ). + io_json->add_member( 'dataSource' )->add_string( CONV string( current_node-datasource ) ). + io_json->add_member( 'objectid' )->add_string( CONV string( current_node-fieldnameobjectid ) ). + "uuid specific fields + io_json->add_member( 'uuid' )->add_string( CONV string( current_node-fieldnameuuid ) ). + io_json->add_member( 'parentUUID' )->add_string( CONV string( current_node-fieldnameparentuuid ) ). + io_json->add_member( 'rootUUID' )->add_string( CONV string( current_node-fieldnamerootuuid ) ). + "etag specific fields + io_json->add_member( 'etagMaster' )->add_string( CONV string( current_node-fieldnameetagmaster ) ). + io_json->add_member( 'totalEtag' )->add_string( CONV string( current_node-fieldnametotaletag ) ). + "administrative fields + io_json->add_member( 'lastChangedAt' )->add_string( CONV string( current_node-fieldnamelastchangedat ) ). + io_json->add_member( 'lastChangedBy' )->add_string( CONV string( current_node-fieldnamelastchangedby ) ). + io_json->add_member( 'localInstanceLastChangedAt' )->add_string( CONV string( current_node-fieldnameloclastchangedat ) ). + io_json->add_member( 'createdAt' )->add_string( CONV string( current_node-fieldnamecreatedat ) ). + io_json->add_member( 'createdBy' )->add_string( CONV string( current_node-fieldnamecreatedby ) ). + "repository object names + io_json->add_member( 'draftTable' )->add_string( CONV string( current_node-drafttablename ) ). + io_json->add_member( 'cdsInterfaceView' )->add_string( CONV string( current_node-cdsiview ) ). + io_json->add_member( 'cdsInterfaceViewBasic' )->add_string( CONV string( current_node-CdsIViewBasic ) ). + io_json->add_member( 'cdsRestrictedReuseView' )->add_string( CONV string( current_node-cdsrview ) ). + io_json->add_member( 'cdsProjectionView' )->add_string( CONV string( current_node-cdspview ) ). + io_json->add_member( 'metadataExtensionView' )->add_string( CONV string( current_node-mdeview ) ). + io_json->add_member( 'behaviorImplementationClass' )->add_string( CONV string( current_node-behaviorimplementationclass ) ). + io_json->add_member( 'sapobjectnodetype' )->add_string( current_node-SAPObjectNodeType ). + + io_json->add_member( 'extensioninclude' )->add_string( CONV string( current_node-ExtensionInclude ) ). + io_json->add_member( 'extensionincludeview' )->add_string( CONV string( current_node-ExtensionIncludeView ) ). + io_json->add_member( 'draftqueryview' )->add_string( CONV string( current_node-DraftQueryView ) ). + + io_json->add_member( 'extensibilityElementSuffix' )->add_string( CONV string( current_node-ExtensibilityElementSuffix ) ) ."rap_bo-extensibilityElementSuffix ) ). + + +* IF current_node-isrootnode = abap_true. + io_json->add_member( 'serviceDefinition' )->add_string( CONV string( current_node-servicedefinition ) ). + io_json->add_member( 'serviceBinding' )->add_string( CONV string( current_node-servicebinding ) ). + io_json->add_member( 'sapobjecttype' )->add_string( rap_bo-SAPObjectType ). +* ENDIF. + io_json->add_member( 'controlStructure' )->add_string( CONV string( current_node-controlstructure ) ). + io_json->add_member( 'customQueryImplementationClass' )->add_string( CONV string( current_node-queryimplementationclass ) ). + +* IF run_via_f9 = abap_true. + + IF line_exists( rapgen_bo[ rapbouuid = rap_bo_uuid ] ). + DATA(root_bo) = rapgen_bo[ rapbouuid = rap_bo_uuid ]. + ELSE. + EXIT. + ENDIF. + + DATA test_node TYPE REF TO zdmo_cl_rap_node. + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA xco_on_prem_lib TYPE REF TO ZDMO_cl_rap_xco_on_prem_lib. + xco_on_prem_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + + IF xco_on_prem_lib->on_premise_branch_is_used( ). + xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + + test_node = NEW ZDMO_cl_rap_node( ). + test_node->set_xco_lib( xco_lib ). + + test_node->set_data_source_type( CONV #( root_bo-DataSourceType ) ). + test_node->set_data_source( CONV #( current_node-DataSource ) ). + +* create json entries for table mapping +* + +* "mapping": [ +* { +* "dbtable_field": "TRAVEL_ID", +* "cds_view_field": "TravelID" +* }, +* { +* "dbtable_field": "AGENCY_ID", +* "cds_view_field": "AgencyID" +* }, +* { +* "dbtable_field": "CUSTOMER_ID", +* "cds_view_field": "CustomerID" +* } +* ] + + + + io_json->add_member( 'mapping' )->begin_array( ). + + IF current_node_fields IS INITIAL. + "loop über die Felder + LOOP AT test_node->lt_fields INTO DATA(data_source_field). + io_json->begin_object( ). + io_json->add_member( 'dbtable_field' )->add_string( CONV string( data_source_field-name ) ). + io_json->add_member( 'cds_view_field' )->add_string( CONV string( data_source_field-cds_view_field ) ). + io_json->end_object( ). + "end_loop + ENDLOOP. + ELSE. + LOOP AT current_node_fields INTO DATA(current_node_Field). + io_json->begin_object( ). + io_json->add_member( 'dbtable_field' )->add_string( CONV string( current_node_Field-DbtableField ) ). + io_json->add_member( 'cds_view_field' )->add_string( CONV string( current_node_Field-CdsViewField ) ). + io_json->end_object( ). + ENDLOOP. + ENDIF. + io_json->end_array( ). + +* ENDIF. + + DATA(child_entity_keys) = get_child_entity_keys( current_node ). + + "CHECK child_entity_keys IS NOT INITIAL. + IF child_entity_keys IS INITIAL. + io_json->end_object( ). + ELSE. + io_json->add_member( 'Children' )->begin_array( ). + + DATA(number_of_child_entities) = lines( child_entity_keys ). + + LOOP AT child_entity_keys INTO DATA(child_entity_key). + DATA(child_entity) = rapgen_node[ nodeuuid = child_entity_key-nodeuuid ] . + APPEND child_entity TO child_entities. + ENDLOOP. + + WHILE i < number_of_child_entities - 1. + i += 1 . + + CLEAR child_fields. + + LOOP AT rapgen_field INTO DATA(field) WHERE NodeUUID = child_entities[ i ]-nodeuuid AND RapboUUID = rap_bo_uuid . + APPEND field TO child_fields. + ENDLOOP. + + in_order( + EXPORTING + current_node = child_entities[ i ] + current_node_fields = child_fields + " out = out + io_json = io_json + ). + +*child_fields +* +*Key Column FieldUUID sysuuid_x16 raw(16) 16 Byte UUID in 16 Bytes (Raw Format) +*Column NodeUUID sysuuid_x16 raw(16) 16 Byte UUID in 16 Bytes (Raw Format) +*Column RapboUUID sysuuid_x16 raw(16) 16 Byte UUID in 16 Bytes (Raw Format) +*Column DbtableField sxco_ad_object_name char(30) XCO ABAP Dictionary: Object name +*Column CdsViewField sxco_cds_field_name char(30) XCO CDS: Field name +*Column LocalLastChangedAt timestampl dec(21,7) UTC Time Stamp in Long Form (YYYYMMDDhhmmssmmmuuun) + + + + + + + + + ENDWHILE. + + CLEAR child_fields. + + LOOP AT rapgen_field INTO field WHERE NodeUUID = child_entities[ number_of_child_entities ]-nodeuuid AND RapboUUID = rap_bo_uuid . + APPEND field TO child_fields. + ENDLOOP. + + in_order( + EXPORTING + current_node = child_entities[ number_of_child_entities ] + current_node_fields = child_fields + " out = out + io_json = io_json + ). + + io_json->end_array( ). + io_json->end_object( ). + ENDIF. + + + + + ENDMETHOD. + + + METHOD main. + + run_via_f9 = abap_true. + + DATA(bo_name) = 'ZR_SalesOrderTP_900'. + + SELECT SINGLE RapBoUUID FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @bo_name INTO @rap_bo_uuid. + + IF sy-subrc <> 0. + out->write( |rap bo { bo_name } not found. Stop processing.| ). + ELSE. + out->write( |rap bo { bo_name } hass the following uuid { rap_bo_uuid }.| ). + ENDIF. + + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + ALL FIELDS WITH VALUE #( ( RapboUUID = rap_bo_uuid ) ) + RESULT DATA(rapbos). + + LOOP AT rapbos ASSIGNING FIELD-SYMBOL(<rapbo>). + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project BY \_Node + ALL FIELDS + WITH VALUE #( ( RapboUUID = <rapbo>-RapboUUID ) ) + RESULT DATA(rapnodes). + ENDLOOP. + + MOVE-CORRESPONDING rapbos TO rapgen_bo. + MOVE-CORRESPONDING rapnodes TO rapgen_node. + + DATA(json_string) = create_json( ). + out->write( json_string ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_build_json_2.clas.xml b/src/zdmo_cl_rap_gen_build_json_2.clas.xml new file mode 100644 index 0000000..b680b7b --- /dev/null +++ b/src/zdmo_cl_rap_gen_build_json_2.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_BUILD_JSON_2</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Build json string from tables</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_abap_vers.clas.abap b/src/zdmo_cl_rap_gen_get_abap_vers.clas.abap new file mode 100644 index 0000000..d69d447 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_abap_vers.clas.abap @@ -0,0 +1,80 @@ +CLASS zdmo_cl_rap_gen_get_abap_vers DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_ABAP_VERS IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_abap_vers . + DATA business_data_line TYPE ZDMO_i_rap_generator_abap_Vers . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + +"check if packages exist that are part of customer software component +select * from I_CustABAPPackage into table @data(customer_packages_in_swc). + +data(xco_on_prem_lib) = new ZDMO_cl_rap_xco_on_prem_lib( ). + + + TRY. + DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). + + + + DATA type_definition LIKE ZDMO_cl_rap_node=>abap_language_version. + DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ). + DATA(components) = descr_ref_type->get_components( ). + LOOP AT components INTO DATA(line). + + CASE to_lower( line-name ). + WHEN ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development . + if customer_packages_in_swc is not initial. + business_data_line-language_version = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development. + endif. + WHEN ZDMO_cl_rap_node=>abap_language_version-standard. + "in the on premise branch this method returns abap_true + if xco_on_prem_lib->on_premise_branch_is_used( ) = abap_true. + business_data_line = ZDMO_cl_rap_node=>abap_language_version-standard. + endif. + WHEN OTHERS. + "@todo( ). + ENDCASE. + APPEND business_data_line TO business_data. + ENDLOOP. + SELECT * FROM @business_data AS binding_types + WHERE (filter_condition) INTO TABLE @business_data. + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + + data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + exporting + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + + previous = exception . + + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_abap_vers.clas.xml b/src/zdmo_cl_rap_gen_get_abap_vers.clas.xml new file mode 100644 index 0000000..a9ed4da --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_abap_vers.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_ABAP_VERS</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get implementation types</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_bind_type.clas.abap b/src/zdmo_cl_rap_gen_get_bind_type.clas.abap new file mode 100644 index 0000000..1b71c6a --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_bind_type.clas.abap @@ -0,0 +1,78 @@ +CLASS zdmo_cl_rap_gen_get_bind_type DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_BIND_TYPE IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_impl_type . + DATA business_data_line TYPE ZDMO_i_rap_generator_impl_type . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + + TRY. + DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). + + + + DATA type_definition LIKE ZDMO_cl_rap_node=>binding_type_name. + DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ). + DATA(components) = descr_ref_type->get_components( ). + LOOP AT components INTO DATA(line). + data(binding_type) = to_lower( line-name ). + case binding_type. + when ZDMO_cl_rap_node=>binding_type_name-odata_v2_ui . + append ZDMO_cl_rap_node=>binding_type_name-odata_v2_ui to business_data. + when ZDMO_cl_rap_node=>binding_type_name-odata_v2_web_api. + append ZDMO_cl_rap_node=>binding_type_name-odata_v2_web_api to business_data. + when ZDMO_cl_rap_node=>binding_type_name-odata_v4_ui. + append ZDMO_cl_rap_node=>binding_type_name-odata_v4_ui to business_data. + when ZDMO_cl_rap_node=>binding_type_name-odata_v4_web_api. + append ZDMO_cl_rap_node=>binding_type_name-odata_v4_web_api to business_data. + when others. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_binding_type + mv_value = CONV #( line-name ). + ENDCASE. + + + ENDLOOP. + SELECT * FROM @business_data AS binding_types + WHERE (filter_condition) INTO TABLE @business_data. + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + + data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + exporting + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + + previous = exception . + + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_bind_type.clas.xml b/src/zdmo_cl_rap_gen_get_bind_type.clas.xml new file mode 100644 index 0000000..f57857c --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_bind_type.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_BIND_TYPE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get implementation types</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_booleans.clas.abap b/src/zdmo_cl_rap_gen_get_booleans.clas.abap new file mode 100644 index 0000000..5ea86e7 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_booleans.clas.abap @@ -0,0 +1,58 @@ +CLASS zdmo_cl_rap_gen_get_booleans DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_BOOLEANS IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_bool_vh. + DATA business_data_line TYPE ZDMO_i_rap_generator_bool_vh . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + + TRY. + DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). + + business_data_line-bool_value = abap_false. + business_data_line-name = 'No'. + APPEND business_data_line TO business_data. + business_data_line-bool_value = abap_true. + business_data_line-name = 'Yes'. + APPEND business_data_line TO business_data. + + SELECT * FROM @business_data AS implementation_types + WHERE (filter_condition) INTO TABLE @business_data. + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + + DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + EXPORTING + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + previous = exception. + + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_booleans.clas.xml b/src/zdmo_cl_rap_gen_get_booleans.clas.xml new file mode 100644 index 0000000..7b7cb40 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_booleans.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_BOOLEANS</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Value help for boolean values</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_data_src_2.clas.abap b/src/zdmo_cl_rap_gen_get_data_src_2.clas.abap new file mode 100644 index 0000000..30f9aa3 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_data_src_2.clas.abap @@ -0,0 +1,395 @@ +CLASS zdmo_cl_rap_gen_get_data_src_2 DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_DATA_SRC_2 IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + + DATA business_data TYPE TABLE OF zdmo_i_rap_generator_data_src2 . + DATA business_data_line TYPE zdmo_i_rap_generator_data_src2 . + DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + DATA lt_cds_views TYPE sxco_t_data_definitions . + DATA lt_tables TYPE sxco_t_database_tables . + DATA lt_structures TYPE sxco_t_ad_structures . + + TRY. + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ). + DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges( ). + DATA(search_string) = to_upper( io_request->get_search_expression( ) ). + +* READ TABLE filter_condition_ranges WITH KEY name = 'LANGUAGE_VERSION' +* INTO DATA(filter_condition_language). + +* IF filter_condition_language IS NOT INITIAL. +* DATA(abap_language_version) = filter_condition_language-range[ 1 ]-low. +* ENDIF. + + READ TABLE filter_condition_ranges WITH KEY name = 'PARENT_DATA_SOURCE' + INTO DATA(filter_condition_par_dat_src). +* + IF filter_condition_par_dat_src IS NOT INITIAL. + DATA(parent_data_source) = filter_condition_par_dat_src-range[ 1 ]-low. + ENDIF. + +* READ TABLE filter_condition_ranges WITH KEY name = 'IS_ROOT_NODE' +* INTO DATA(filter_condition_is_root_node). +* +* IF filter_condition_is_root_node IS NOT INITIAL. +* DATA(is_root_node) = filter_condition_is_root_node-range[ 1 ]-low. +* ENDIF. +* + DATA(xco_lib_on_prem) = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + + IF xco_lib_on_prem->on_premise_branch_is_used( ) = abap_true. " ZDMO_cl_rap_node=>abap_language_version-standard . + xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + + DATA(custom_entity_name) = to_upper( io_request->get_entity_id( ) ). + + CASE custom_entity_name. + + WHEN 'ZDMO_I_RAP_GEN_GET_TABLES'. + DATA(data_source_type) = zdmo_cl_rap_node=>data_source_types-table. + WHEN 'ZDMO_I_RAP_GEN_GET_CDS_VIEWS'. + data_source_type = zdmo_cl_rap_node=>data_source_types-cds_view. + WHEN 'ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT'. + data_source_type = zdmo_cl_rap_node=>data_source_types-abstract_entity. + WHEN OTHERS. + READ TABLE filter_condition_ranges WITH KEY name = 'TYPE' + INTO DATA(filter_condition_type). + + IF filter_condition_type IS NOT INITIAL. + data_source_type = filter_condition_type-range[ 1 ]-low. + ENDIF. + ENDCASE. +* READ TABLE filter_condition_ranges WITH KEY name = 'PACKAGE_NAME' +* INTO DATA(filter_condition_package_name). +* +* "if no package name is provided no data can be returned. +* IF filter_condition_package_name IS INITIAL. +* CLEAR business_data. +* io_response->set_total_number_of_records( lines( business_data ) ). +* io_response->set_data( business_data ). +* EXIT. +* ELSE. +* DATA(package_name) = filter_condition_package_name-range[ 1 ]-low. +* ENDIF. + + CLEAR business_data. + + "if data source is a CDS view we can simply show those views that can be reached via association / composition + + IF + parent_data_source IS NOT INITIAL AND + ( data_source_type = ZDMO_cl_rap_node=>data_source_types-cds_view OR + data_source_type = ZDMO_cl_rap_node=>data_source_types-abstract_entity ). + + DATA(my_node) = NEW ZDMO_cl_rap_node( xco_lib ). + my_node->set_data_source_type( data_source_type ). + my_node->set_data_source( parent_data_source ). + + IF my_node IS NOT INITIAL. + LOOP AT my_node->composition_targets INTO DATA(composition_target). + CLEAR business_data_line. + business_data_line-name = composition_target. +* business_data_line-package_name = package_name. +* business_data_line-language_version = abap_language_version. + business_data_line-type = data_source_type . +* business_data_line-is_root_node = is_root_node. + business_data_line-parent_data_source = parent_data_source. + APPEND business_data_line TO business_data. + ENDLOOP. + LOOP AT my_node->association_targets INTO DATA(association_target). + CLEAR business_data_line. + business_data_line-name = association_target. +* business_data_line-package_name = package_name. +* business_data_line-language_version = abap_language_version. + business_data_line-type = data_source_type . +* business_data_line-is_root_node = is_root_node. + business_data_line-parent_data_source = parent_data_source. + APPEND business_data_line TO business_data. + ENDLOOP. + ENDIF. +* io_response->set_total_number_of_records( lines( business_data ) ). +* io_response->set_data( business_data ). +* EXIT. + ENDIF. + + "start search only if more than minimal_search_string_length characters are provided + + "search string also contains a leading and a trailing quotation mark + DATA(length_of_search_string) = numofchar( search_string ) - 2. + + + IF length_of_search_string < ZDMO_cl_rap_node=>minimal_search_string_length. +* CLEAR business_data. + "return targets of associations or compositions even if only a 'Z' has been entered + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + EXIT. + ENDIF. + + +* DATA(data_source) +* DATA(package) = xco_lib->get_package( CONV sxco_package( package_name ) ). +* DATA(package_properties) = package->read( )-property. +* DATA(software_component) = package_properties-software_component->name. +* DATA(package_abap_language_version) = xco_lib->get_abap_language_version( package->name ). +* +* "In an on premise system it is possible to select data sources from other software components +* "if the package is using ABAP language version "standard" +* " +* "If the package uses language version 5 (abap_for_cloud_development) only data sources from the same software component +* "or C1 released CDS views may be used +* +* IF package_abap_language_version = ZDMO_cl_rap_node=>package_abap_language_version-standard. +* DATA(software_component_filter) = xco_cp_system=>software_component->get_filter( xco_cp_abap_sql=>constraint->contains_pattern( '%' ) ) . +* ELSE. +* +* +** " Get all data elements in package S_XCO_HOME_DEMO. +** DATA(lt_data_elements) = xco_abap_repository=>objects->dtel->all->in( lo_package )->get( ). +** When a package with language version 5 is used in an on premise system without +** customer software components you run into the problem that tables might use +** data elements that must not be used in your package. +** hence the genration fails. +** Workaround: If package has language version 5 and and on prem system < 2022 is used +** take only data sources from the same package. +* +* DATA(filter_1) = xco_cp_system=>software_component->get_filter( xco_cp_abap_sql=>constraint->equal( software_component ) ) . +* "used to avoid replacement of string slashDMOslash +* "when moving from namespace slashDMOslash to zetDMOunderscore +* DATA(filter_2) = xco_cp_system=>software_component->get_filter( xco_cp_abap_sql=>constraint->equal( '/' && 'DMO' && '/' && 'SAP' ) ) . +* +* IF software_component = 'ZLOCAL'. +* software_component_filter = xco_cp_abap_repository=>filter->union( it_filters = VALUE #( ( filter_1 ) ( filter_2 ) ) ). +* ELSE. +* software_component_filter = filter_1. +* ENDIF. +* +* +* ENDIF. + + + + + + READ TABLE filter_condition_ranges WITH KEY name = 'NAME' + INTO DATA(filter_condition_name). + + "check if data_source_type is cds_view (abstract entity) and if we are dealing with a child node + "in this case the value help shall only offer cds views (or abstract entities) that can be reached + "via association / composition of the cds view that is used as a data source of the parent entity. + + + + + IF filter_condition_name IS NOT INITIAL. + LOOP AT filter_condition_name-range INTO DATA(range). + REPLACE ALL OCCURRENCES OF '*' IN range-low WITH '%'. + DATA(lo_name_filter) = xco_cp_abap_repository=>object_name->get_filter( + xco_cp_abap_sql=>constraint->contains_pattern( range-low ) + ). + CASE data_source_type. + WHEN ZDMO_cl_rap_node=>data_source_types-cds_view. + DATA(lt_cds_views_add) = xco_lib->get_views( VALUE #( + ( lo_name_filter ) +* ( software_component_filter ) + ) ). + APPEND LINES OF lt_cds_views_add TO lt_cds_views. + WHEN ZDMO_cl_rap_node=>data_source_types-table. + DATA(lt_tables_add) = xco_lib->get_tables( VALUE #( + ( lo_name_filter ) +* ( software_component_filter ) + ) ). + APPEND LINES OF lt_tables_add TO lt_tables. + WHEN ZDMO_cl_rap_node=>data_source_types-structure. + DATA(lt_structures_add) = xco_lib->get_structures( VALUE #( + ( lo_name_filter ) +* ( software_component_filter ) + ) ). + APPEND LINES OF lt_structures_add TO lt_structures. + ENDCASE. + ENDLOOP. + + ENDIF. + + IF search_string IS NOT INITIAL. +* search_string = substring( val = search_string off = 1 len = strlen( search_string ) - 2 ) . +* search_string = '%' && search_string && '%'. + REPLACE ALL OCCURRENCES OF '"' IN search_string WITH '%'. + "search_string = to_upper( search_string ). + lo_name_filter = xco_cp_abap_repository=>object_name->get_filter( + xco_cp_abap_sql=>constraint->contains_pattern( search_string ) + ). + CASE data_source_type. + WHEN ZDMO_cl_rap_node=>data_source_types-cds_view OR ZDMO_cl_rap_node=>data_source_types-abstract_entity. + "lt_cds_views = xco_cp_abap_repository=>objects->ddls->all->in( xco_cp_abap=>repository )->get( ). + lt_cds_views = xco_lib->get_views( VALUE #( + ( lo_name_filter ) +* ( software_component_filter ) + ) ). + WHEN ZDMO_cl_rap_node=>data_source_types-table. + "lt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->all->in( xco_cp_abap=>repository )->get( ). + lt_tables = xco_lib->get_tables( VALUE #( + ( lo_name_filter ) +* ( software_component_filter ) + ) ). + WHEN ZDMO_cl_rap_node=>data_source_types-structure. + "lt_structures = xco_cp_abap_repository=>objects->tabl->structures->all->in( xco_cp_abap=>repository )->get( ). + lt_structures = xco_lib->get_structures( VALUE #( + ( lo_name_filter ) +* ( software_component_filter ) + ) ). + ENDCASE. + + + +* CASE filter_condition_Type-range[ 1 ]-low. +* WHEN ZDMO_cl_rap_node=>data_source_types-cds_view. +* "lt_cds_views = xco_cp_abap_repository=>objects->ddls->all->in( xco_cp_abap=>repository )->get( ). +* lt_cds_views = xco_lib->get_views( lo_filter ). +* WHEN ZDMO_cl_rap_node=>data_source_types-table. +* "lt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->all->in( xco_cp_abap=>repository )->get( ). +* lt_tables = xco_lib->get_tables( ). +* WHEN ZDMO_cl_rap_node=>data_source_types-structure. +* "lt_structures = xco_cp_abap_repository=>objects->tabl->structures->all->in( xco_cp_abap=>repository )->get( ). +* lt_structures = xco_lib->get_structures( ). +* ENDCASE. + + ENDIF. + + "todo: select + + + + + CASE data_source_type. + WHEN ZDMO_cl_rap_node=>data_source_types-cds_view OR ZDMO_cl_rap_node=>data_source_types-abstract_entity . + "first add cds views from software component + LOOP AT lt_cds_views INTO DATA(ls_cds_view). + CLEAR business_data_line. + DATA(view_type) = ls_cds_view->get_type( ). + IF view_type = xco_cp_data_definition=>type->view_entity OR + view_type = xco_cp_data_definition=>type->view OR + view_type = xco_cp_data_definition=>type->abstract_entity. +* business_data_line-package_name = package_name. + business_data_line-name = ls_cds_view->name. +* business_data_line-language_version = abap_language_version. + business_data_line-type = data_source_type . +* business_data_line-is_root_node = is_root_node. +* business_data_line-parent_data_source = parent_data_source. + IF NOT line_exists( business_data[ name = ls_cds_view->name ] ) . + APPEND business_data_line TO business_data. + ENDIF. + ENDIF. + ENDLOOP. + + "get c1-released cds views + SELECT * FROM i_apisforclouddevelopment + WHERE objectdirectorytype = 'DDLS' AND + releasedobjectname LIKE @search_string + INTO TABLE @DATA(released_cds_views). + + LOOP AT released_cds_views INTO DATA(released_cds_view). + CLEAR business_data_line. + DATA(lo_data_definition) = xco_lib->get_data_definition( CONV #( released_cds_view-releasedobjectname ) ). + view_type = lo_data_definition->get_type( ). + + IF view_type = xco_cp_data_definition=>type->view_entity OR + view_type = xco_cp_data_definition=>type->view OR + view_type = xco_cp_data_definition=>type->abstract_entity. +* business_data_line-package_name = package_name. + business_data_line-name = released_cds_view-releasedobjectname. +* business_data_line-language_version = abap_language_version. + business_data_line-type = data_source_type . +* business_data_line-is_root_node = is_root_node. +* business_data_line-parent_data_source = parent_data_source. + IF NOT line_exists( business_data[ name = ls_cds_view->name ] ) . + APPEND business_data_line TO business_data. + ENDIF. + ENDIF. + ENDLOOP. + + WHEN ZDMO_cl_rap_node=>data_source_types-table. + LOOP AT lt_tables INTO DATA(ls_table). + CLEAR business_data_line. +* business_data_line-package_name = package_name. + business_data_line-name = ls_table->name. +* business_data_line-language_version = abap_language_version. + business_data_line-type = data_source_type . +* business_data_line-is_root_node = is_root_node. +* business_data_line-parent_data_source = parent_data_source. + APPEND business_data_line TO business_data. + ENDLOOP. + WHEN ZDMO_cl_rap_node=>data_source_types-structure. + LOOP AT lt_structures INTO DATA(ls_structure). + CLEAR business_data_line. +* business_data_line-package_name = package_name. + business_data_line-name = ls_structure->name. +* business_data_line-language_version = abap_language_version. + business_data_line-type = data_source_type . +* business_data_line-is_root_node = is_root_node. +* business_data_line-parent_data_source = parent_data_source. + APPEND business_data_line TO business_data. + ENDLOOP. + ENDCASE. + + + + + + + IF top IS NOT INITIAL. + DATA(max_index) = top + skip. + ELSE. + max_index = 0. + ENDIF. + + SELECT * FROM @business_data AS datasource_names +* WHERE (filter_condition_string) + INTO TABLE @business_data + UP TO @max_index ROWS + . + + IF skip IS NOT INITIAL. + DELETE business_data TO skip. + ENDIF. + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + EXPORTING + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + previous = exception. + + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_data_src_2.clas.xml b/src/zdmo_cl_rap_gen_get_data_src_2.clas.xml new file mode 100644 index 0000000..eed9593 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_data_src_2.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_DATA_SRC_2</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get data sources</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_dsrc_type.clas.abap b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.abap new file mode 100644 index 0000000..7442493 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.abap @@ -0,0 +1,86 @@ +CLASS zdmo_cl_rap_gen_get_dsrc_type DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_DSRC_TYPE IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_dsrc_type . + DATA business_data_line TYPE ZDMO_i_rap_generator_dsrc_type . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + + TRY. + DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). + + + + DATA type_definition LIKE ZDMO_cl_rap_node=>data_source_types. + DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ). + DATA(components) = descr_ref_type->get_components( ). + LOOP AT components INTO DATA(line). + DATA(data_source_type) = to_lower( line-name ). + + CASE data_source_type. + WHEN ZDMO_cl_rap_node=>data_source_types-abap_type. + business_data_line-type = ZDMO_cl_rap_node=>data_source_types-abap_type. + WHEN ZDMO_cl_rap_node=>data_source_types-cds_view. + business_data_line-type = ZDMO_cl_rap_node=>data_source_types-cds_view. + WHEN ZDMO_cl_rap_node=>data_source_types-structure. + business_data_line-type = ZDMO_cl_rap_node=>data_source_types-structure. + WHEN ZDMO_cl_rap_node=>data_source_types-table. + business_data_line-type = ZDMO_cl_rap_node=>data_source_types-table. + WHEN ZDMO_cl_rap_node=>data_source_types-abstract_entity. + business_data_line-type = ZDMO_cl_rap_node=>data_source_types-abstract_entity. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_data_source_type + mv_value = CONV #( line-name ). + ENDCASE. + + " we omit abap_type and structure. + " Support needs further work + CASE data_source_type. + WHEN ZDMO_cl_rap_node=>data_source_types-abap_type. + WHEN ZDMO_cl_rap_node=>data_source_types-structure. + WHEN OTHERS. + APPEND business_data_line TO business_data. + ENDCASE. + + ENDLOOP. + SELECT * FROM @business_data AS binding_types + WHERE (filter_condition) INTO TABLE @business_data. + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + exporting + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + + previous = exception . + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_dsrc_type.clas.xml b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.xml new file mode 100644 index 0000000..399c0ea --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_dsrc_type.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_DSRC_TYPE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get data source types</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_fields.clas.abap b/src/zdmo_cl_rap_gen_get_fields.clas.abap new file mode 100644 index 0000000..5e03a58 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_fields.clas.abap @@ -0,0 +1,121 @@ +CLASS zdmo_cl_rap_gen_get_fields DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_FIELDS IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_fields . + DATA business_data_line TYPE ZDMO_i_rap_generator_fields . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + TRY. + DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ). + DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges( ). + + READ TABLE filter_condition_ranges WITH KEY name = 'LANGUAGE_VERSION' + INTO DATA(filter_condition_language). + + IF filter_condition_language IS NOT INITIAL. + DATA(abap_language_Version) = filter_condition_language-range[ 1 ]-low. + ENDIF. + + + IF abap_language_version = ZDMO_cl_rap_node=>abap_language_version-standard." abap_language_version-standard . + xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + + READ TABLE filter_condition_ranges WITH KEY name = 'TYPE' + INTO DATA(filter_condition_type). + + READ TABLE filter_condition_ranges WITH KEY name = 'NAME' + INTO DATA(filter_condition_name). + IF filter_condition_name IS NOT INITIAL and + filter_condition_type is not initial. + DATA test_node TYPE REF TO ZDMO_cl_rap_node. + test_node = NEW ZDMO_cl_rap_node( ). + test_node->set_xco_lib( xco_lib ). + + test_node->set_data_source_type( filter_condition_Type-range[ 1 ]-low ). + test_node->set_data_source( filter_condition_name-range[ 1 ]-low ). + + "test_node->get_fields( ). + + business_data_line-name = filter_condition_name-range[ 1 ]-low . + business_data_line-type = filter_condition_Type-range[ 1 ]-low. + + DATA(check_fields) = test_node->lt_fields. + + LOOP AT test_node->lt_fields INTO DATA(ls_fields). + business_data_line-language_version = abap_language_Version. + business_data_line-field = ls_fields-name. + business_data_line-data_element = ls_fields-data_element. + business_data_line-built_in_type = ls_fields-built_in_type . + business_data_line-built_in_type_length = ls_fields-built_in_type_length . + business_data_line-built_in_type_decimals = ls_fields-built_in_type_decimals . + + APPEND business_data_line TO business_Data. + ENDLOOP. + ENDIF. + +* SELECT * FROM @business_data AS data_source_fields +* WHERE (filter_condition_string) +* "order by (sort_order) +* INTO TABLE @business_data +* UP TO @top ROWS. + + IF top IS NOT INITIAL. + DATA(max_index) = top + skip. + ELSE. + max_index = 0. + ENDIF. + + SELECT * FROM @business_data AS data_source_fields + WHERE (filter_condition_string) + INTO TABLE @business_data + UP TO @max_index ROWS + . + + IF skip IS NOT INITIAL. + DELETE business_data TO skip. + ENDIF. + + + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + + data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + exporting + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + + previous = exception . + + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_fields.clas.xml b/src/zdmo_cl_rap_gen_get_fields.clas.xml new file mode 100644 index 0000000..3305197 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_fields.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_FIELDS</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get data source fields</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_impl_type.clas.abap b/src/zdmo_cl_rap_gen_get_impl_type.clas.abap new file mode 100644 index 0000000..de5ecc4 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_impl_type.clas.abap @@ -0,0 +1,76 @@ +CLASS zdmo_cl_rap_gen_get_impl_type DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_IMPL_TYPE IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_impl_type . + DATA business_data_line TYPE ZDMO_i_rap_generator_impl_type . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + + TRY. + DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). + + + + + DATA type_definition LIKE ZDMO_cl_rap_node=>implementation_type. + DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ). + DATA(components) = descr_ref_type->get_components( ). + LOOP AT components INTO DATA(line). + data(implementation_type) = to_lower( line-name ). + CASE implementation_type. + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + APPEND ZDMO_cl_rap_node=>implementation_type-managed_uuid TO business_data. + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + APPEND ZDMO_cl_rap_node=>implementation_type-managed_semantic TO business_data. + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + APPEND ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic TO business_data. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>implementation_type_not_valid + mv_value = CONV #( line-name ). + ENDCASE. + +* append ZDMO_cl_rap_node=>implementation_type- (line-name) to business_data. + ENDLOOP. + SELECT * FROM @business_data AS implementation_types + WHERE (filter_condition) INTO TABLE @business_data + "UP TO @top ROWS + . + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + exporting + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + + previous = exception . + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_impl_type.clas.xml b/src/zdmo_cl_rap_gen_get_impl_type.clas.xml new file mode 100644 index 0000000..b1f41f6 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_impl_type.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_IMPL_TYPE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get implementation types</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_impl_type2.clas.abap b/src/zdmo_cl_rap_gen_get_impl_type2.clas.abap new file mode 100644 index 0000000..d2b6bf8 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_impl_type2.clas.abap @@ -0,0 +1,73 @@ +CLASS zdmo_cl_rap_gen_get_impl_type2 DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_IMPL_TYPE2 IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_i_rap_generator_impl_typ2 . + DATA business_data_line TYPE ZDMO_i_rap_generator_impl_typ2 . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + + TRY. + DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). + + + + + DATA type_definition LIKE ZDMO_cl_rap_node=>bdef_implementation_type. + DATA(descr_ref_type) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data_ref( REF #( type_definition ) ) ). + DATA(components) = descr_ref_type->get_components( ). + LOOP AT components INTO DATA(line). + DATA(implementation_type) = to_lower( line-name ). + CASE implementation_type. + WHEN ZDMO_cl_rap_node=>bdef_implementation_type-managed. + APPEND ZDMO_cl_rap_node=>bdef_implementation_type-managed TO business_data. + WHEN ZDMO_cl_rap_node=>bdef_implementation_type-unmanaged. + APPEND ZDMO_cl_rap_node=>bdef_implementation_type-unmanaged TO business_data. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>implementation_type_not_valid + mv_value = CONV #( line-name ). + ENDCASE. + +* append ZDMO_cl_rap_node=>implementation_type- (line-name) to business_data. + ENDLOOP. + SELECT * FROM @business_data AS implementation_types + WHERE (filter_condition) INTO TABLE @business_data + "UP TO @top ROWS + . + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + EXPORTING + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + previous = exception. + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_impl_type2.clas.xml b/src/zdmo_cl_rap_gen_get_impl_type2.clas.xml new file mode 100644 index 0000000..a098775 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_impl_type2.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_IMPL_TYPE2</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get implementation types</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_job_status.clas.abap b/src/zdmo_cl_rap_gen_get_job_status.clas.abap new file mode 100644 index 0000000..49766d2 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_job_status.clas.abap @@ -0,0 +1,147 @@ +CLASS zdmo_cl_rap_gen_get_job_status DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_sadl_exit_calc_element_read. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_JOB_STATUS IMPLEMENTATION. + + + METHOD if_sadl_exit_calc_element_read~calculate. + + DATA jobname TYPE cl_apj_rt_api=>ty_jobname . + DATA jobcount TYPE cl_apj_rt_api=>ty_jobcount . + DATA jobstatus TYPE cl_apj_rt_api=>ty_job_status . + DATA jobstatustext TYPE cl_apj_rt_api=>ty_job_status_text . + + DATA lt_original_data TYPE STANDARD TABLE OF ZDMO_C_RAPG_ProjectTP WITH DEFAULT KEY. + lt_original_data = CORRESPONDING #( it_original_data ). + + LOOP AT lt_original_data ASSIGNING FIELD-SYMBOL(<fs_original_data>). + + TRY. + + <fs_original_data>-HideADTLink = abap_true. + + IF <fs_original_data>-jobname IS NOT INITIAL AND <fs_original_data>-jobcount IS NOT INITIAL. + + cl_apj_rt_api=>get_job_status( + EXPORTING + iv_jobname = <fs_original_data>-JobName + iv_jobcount = <fs_original_data>-JobCount + IMPORTING + ev_job_status = JobStatus + ev_job_status_text = jobstatustext + ). + + <fs_original_data>-JobStatus = jobstatus. + <fs_original_data>-JobStatusText = jobstatustext. + + CASE jobstatus. + WHEN 'F'. "Finished + <fs_original_data>-JobStatusCriticality = 3. "green +* <fs_original_data>-HideADTLink = abap_false. + WHEN 'A'. "Aborted + <fs_original_data>-JobStatusCriticality = 1. "red + WHEN 'R'. "Running + <fs_original_data>-JobStatusCriticality = 2. "orange + WHEN 'Y'. "Ready + <fs_original_data>-JobStatusCriticality = 2. "orange + WHEN 'S'. "Scheduled + <fs_original_data>-JobStatusCriticality = 2. "orange + WHEN OTHERS. + <fs_original_data>-JobStatusCriticality = 0. "grey + ENDCASE. + + ENDIF. + + + + CATCH cx_apj_rt INTO DATA(exception). + + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + + <fs_original_data>-JobStatus = ''. + <fs_original_data>-JobStatusText = exception->get_text( ). + <fs_original_data>-JobStatusCriticality = 0. + + CATCH cx_root INTO DATA(root_exception). + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + previous = root_exception. + + ENDTRY. + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapboUUID = @<fs_original_data>-RapboUUID INTO @DATA(rap_generator_project) . + + DATA(check_if_objects_are_deleted) = NEW zdmo_cl_rap_generator_del( rap_generator_project-BoName ). + DATA(objects_still_exist) = check_if_objects_are_deleted->rap_gen_project_objects_exist( rap_generator_project ). + + <fs_original_data>-RepositoryObjectsExist = objects_still_exist. + + IF objects_still_exist = abap_true. + <fs_original_data>-HideADTLink = abap_false. + ENDIF. + + + + ENDLOOP. + + ct_calculated_data = CORRESPONDING #( lt_original_data ). + + ENDMETHOD. + + + METHOD if_sadl_exit_calc_element_read~get_calculation_info. + + + CONSTANTS fieldname_jobcount TYPE string VALUE 'JOBCOUNT'. + CONSTANTS fieldname_jobname TYPE string VALUE 'JOBNAME'. + + + IF iv_entity <> 'ZDMO_C_RAPGENERATORBO' and iv_entity <> 'ZDMO_C_RAPG_PROJECTTP'. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>root_cause_exception + mv_value = |{ iv_entity } has no virtual elements|. + ENDIF. + + LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_calc_element>). + CASE <fs_calc_element>. + WHEN 'JOBSTATUS' . + COLLECT fieldname_jobcount INTO et_requested_orig_elements. + COLLECT fieldname_jobname INTO et_requested_orig_elements. +* APPEND 'JOBCOUNT' TO et_requested_orig_elements. +* APPEND 'JOBNAME' TO et_requested_orig_elements. + WHEN 'JOBSTATUSTEXT'. + COLLECT fieldname_jobcount INTO et_requested_orig_elements. + COLLECT fieldname_jobname INTO et_requested_orig_elements. +* APPEND 'JOBCOUNT' TO et_requested_orig_elements. +* APPEND 'JOBNAME' TO et_requested_orig_elements. + WHEN 'JOBSTATUSCRITICALITY'. + COLLECT fieldname_jobcount INTO et_requested_orig_elements. + COLLECT fieldname_jobname INTO et_requested_orig_elements. + WHEN 'HIDEADTLINK'. + COLLECT fieldname_jobcount INTO et_requested_orig_elements. + COLLECT fieldname_jobname INTO et_requested_orig_elements. + WHEN 'REPOSITORYOBJECTSEXIST' . + COLLECT fieldname_jobcount INTO et_requested_orig_elements. + COLLECT fieldname_jobname INTO et_requested_orig_elements. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>root_cause_exception + mv_value = |Virtual element { <fs_calc_element> } not known|. + ENDCASE. + ENDLOOP. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_job_status.clas.xml b/src/zdmo_cl_rap_gen_get_job_status.clas.xml new file mode 100644 index 0000000..0967844 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_job_status.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_JOB_STATUS</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Calculate virtual elements (Generation Jobs)</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_get_package.clas.abap b/src/zdmo_cl_rap_gen_get_package.clas.abap new file mode 100644 index 0000000..6d4949f --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_package.clas.abap @@ -0,0 +1,145 @@ +CLASS zdmo_cl_rap_gen_get_package DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_GET_PACKAGE IMPLEMENTATION. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF ZDMO_I_RAP_GENERATOR_PACKAGE . + DATA business_data_line TYPE ZDMO_I_RAP_GENERATOR_PACKAGE . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + + DATA lt_package TYPE sxco_t_packages . + + DATA(xco_on_prem_library) = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + + TRY. DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ). + DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges( ). + DATA(search_string) = io_request->get_search_expression( ). + + "search string also contains a leading and a trailing quotation mark + DATA(length_of_search_string) = numofchar( search_string ) - 2. + + IF length_of_search_string < ZDMO_cl_rap_node=>minimal_search_string_length. + CLEAR business_data. + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + EXIT. + ENDIF. + +* READ TABLE filter_condition_ranges WITH KEY name = 'LANGUAGE_VERSION' +* INTO DATA(filter_condition_language). +* +* IF filter_condition_language IS NOT INITIAL. +* DATA(abap_language_Version) = filter_condition_language-range[ 1 ]-low . +* ELSE. +* abap_language_version = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development. +* ENDIF. +* +* IF abap_language_version = ZDMO_cl_rap_node=>abap_language_version-standard . + IF xco_on_prem_library->on_premise_branch_is_used( ). + xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + DATA(abap_language_version) = ZDMO_cl_rap_node=>abap_language_version-standard. + ELSE. + xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + abap_language_version = ZDMO_cl_rap_node=>abap_language_version-abap_for_cloud_development. + ENDIF. + + DATA filter_for_name_provided TYPE abap_bool. + + READ TABLE filter_condition_ranges WITH KEY name = 'NAME' + INTO DATA(filter_condition_range). + + IF sy-subrc = 0. + + LOOP AT filter_condition_range-range INTO DATA(range). + REPLACE ALL OCCURRENCES OF '*' IN range-low WITH '%'. + + DATA(lo_filter) = xco_cp_abap_repository=>object_name->get_filter( + xco_cp_abap_sql=>constraint->contains_pattern( range-low ) + ). + + DATA(lt_package_add) = xco_lib->get_packages( VALUE #( ( lo_filter ) ) ). + + APPEND LINES OF lt_package_add TO lt_package. + + ENDLOOP. + + ELSEIF search_string IS NOT INITIAL. +* search_string = substring( val = search_string off = 1 len = strlen( search_string ) - 2 ) . +* search_string = '%' && search_string && '%'. + REPLACE ALL OCCURRENCES OF '"' IN search_string WITH '%'. + search_string = to_upper( search_string ). + lo_filter = xco_cp_abap_repository=>object_name->get_filter( + xco_cp_abap_sql=>constraint->contains_pattern( search_string ) + ). + lt_package = xco_lib->get_packages( VALUE #( ( lo_filter ) ) ). + + ELSE. + + lt_package = xco_lib->get_packages( ). + + ENDIF. + + + LOOP AT lt_package INTO DATA(ls_package). + business_data_line-name = ls_package->name. + business_data_line-language_version = abap_language_version. + APPEND business_data_line TO business_data. + ENDLOOP. + + + IF top IS NOT INITIAL. + DATA(max_index) = top + skip. + ELSE. + max_index = 0. + ENDIF. + + SELECT * FROM @business_data AS package_names + WHERE (filter_condition_string) + INTO TABLE @business_data + UP TO @max_index ROWS + . + + IF skip IS NOT INITIAL. + DELETE business_data TO skip. + ENDIF. + +* DATA(package_type) = ls_package->read( )-property-package_type->value. +* IF package_type = ZDMO_cl_rap_node=>package_type-development_package. + + + io_response->set_total_number_of_records( lines( business_data ) ). + io_response->set_data( business_data ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + data(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + raise EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity + exporting + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + + previous = exception . + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_get_package.clas.xml b/src/zdmo_cl_rap_gen_get_package.clas.xml new file mode 100644 index 0000000..13b3851 --- /dev/null +++ b/src/zdmo_cl_rap_gen_get_package.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_GET_PACKAGE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>get implementation types</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_in_background.clas.abap b/src/zdmo_cl_rap_gen_in_background.clas.abap new file mode 100644 index 0000000..b9c65af --- /dev/null +++ b/src/zdmo_cl_rap_gen_in_background.clas.abap @@ -0,0 +1,267 @@ +CLASS zdmo_cl_rap_gen_in_background DEFINITION + PUBLIC + + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + CONSTANTS : selection_name TYPE c LENGTH 8 VALUE 'I_VIEW', + selection_description TYPE c LENGTH 255 VALUE 'RAP business object name'. + INTERFACES if_apj_dt_exec_object . + INTERFACES if_apj_rt_exec_object . + INTERFACES if_oo_adt_classrun. + PROTECTED SECTION. + METHODS create_transport RETURNING VALUE(lo_transport) TYPE sxco_transport. + PRIVATE SECTION. + + CONSTANTS: + co_rap_generator_package TYPE sxco_package VALUE 'ZDMO_RAP_GENERATOR'. + + + + DATA package_name TYPE sxco_package. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_IN_BACKGROUND IMPLEMENTATION. + + + METHOD create_transport. + + "transport creation checks whether being on cloud or on prem + + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + + DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + +* DATA(ls_package) = xco_cp_abap_repository=>package->for( co_rap_generator_package )->read( ). + + DATA(ls_package) = xco_lib->get_package( package_name )->read( ). + + " DATA(ls_package) = xco_cp_abap_repository=>package->for( co_rap_generator_package )->read( ). + DATA(lv_transport_layer) = ls_package-property-transport_layer->value. + DATA(lv_transport_target) = ls_package-property-transport_layer->get_transport_target( )->value. + DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( |RAP Generator Application Job Catalog Entry and Job Template| ). + + + +* IF lo_transport_request->get_status( ) = xco_cp_transport=>filter->status( xco_cp_transport=>status->modifiable ). +* DATA(lo_transport_modifiable) = abap_true. +* ENDIF. + + + + lo_transport = lo_transport_request->value. + + ENDMETHOD. + + + METHOD if_apj_dt_exec_object~get_parameters. + " Return the supported selection parameters here + et_parameter_def = VALUE #( + ( selname = zdmo_cl_rap_node=>job_selection_name kind = if_apj_dt_exec_object=>parameter datatype = 'C' length = 40 param_text = zdmo_cl_rap_node=>job_selection_description changeable_ind = abap_true ) + ). + + " Return the default parameters values here + et_parameter_val = VALUE #( + ( selname = zdmo_cl_rap_node=>job_selection_name kind = if_apj_dt_exec_object=>parameter sign = 'I' option = 'EQ' low = 'ZI_###' ) + ). + + ENDMETHOD. + + + METHOD if_apj_rt_exec_object~execute. + + DATA json_string TYPE string. + DATA messages TYPE string_table. + DATA(on_prem_xco_lib) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + + +* TRY. +* IF on_prem_xco_lib->on_premise_branch_is_used( ). +* DATA(application_log) = cl_bali_log=>create_with_header( +* header = cl_bali_header_setter=>create( object = 'XCO_DEMO' +* subobject = 'DEMO' +* external_id = 'External ID' ) ).. +* ELSE. +* application_log = cl_bali_log=>create_with_header( +* header = cl_bali_header_setter=>create( object = zdmo_cl_rap_node=>application_log_object_name +* subobject = zdmo_cl_rap_node=>application_log_sub_obj1_name +* external_id = 'External ID' ) ). +* ENDIF. +* +* CATCH cx_bali_runtime INTO DATA(application_log_exception). +* +* DATA(bali_log_exception) = application_log_exception->get_text( ). +* +* RAISE EXCEPTION TYPE cx_apj_rt_content +* EXPORTING +* previous = application_log_exception. +* +* ENDTRY. + + " Getting the actual parameter values + LOOP AT it_parameters INTO DATA(ls_parameter). + CASE ls_parameter-selname. + WHEN zdmo_cl_rap_node=>job_selection_name . + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @ls_parameter-low + INTO @DATA(rap_generator_bo). + + IF sy-subrc = 0. + json_string = rap_generator_bo-jsonstring. + ELSE. + RAISE EXCEPTION TYPE zdmo_cx_rap_generator + EXPORTING + textid = zdmo_cx_rap_generator=>root_cause_exception + mv_value = |BO name { ls_parameter-low } not found in ZDMO_r_rapgeneratorbo |. + ENDIF. + + ENDCASE. + ENDLOOP. + + DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + DATA(todo) = NEW zdmo_cl_rap_node( ). + TRY. + CASE rap_generator_bo-packagelanguageversion. + + WHEN zdmo_cl_rap_node=>package_abap_language_version-standard. + DATA(rap_generator_on_prem) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ). + DATA(framework_messages) = rap_generator_on_prem->generate_bo( ). + APPEND |RAP BO { rap_generator_on_prem->get_rap_bo_name( ) } generated successfully| TO messages. + + WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. + + "If in on premise systems packages with the language version abap_for_sap_cloud_platform are used + "we have to use the xco_cp libraries for generation and + "we have to use the xco on prem libraries for reading + + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + DATA(rap_generator) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ). + ELSE. + rap_generator = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ). + ENDIF. + + framework_messages = rap_generator->generate_bo( ). + APPEND |RAP BO { rap_generator->get_rap_bo_name( ) } generated successfully| TO messages. + + WHEN OTHERS. + RAISE EXCEPTION TYPE zdmo_cx_rap_generator + EXPORTING + textid = zdmo_cx_rap_generator=>root_cause_exception + mv_value = |abap language version '{ rap_generator_bo-packagelanguageversion }' is not supported |. + + ENDCASE. + + + +* APPEND |Messages from framework:| TO messages. +* LOOP AT framework_messages INTO DATA(framework_message). +* APPEND framework_message-message TO messages. +* +* DATA(application_log_free_text) = cl_bali_free_text_setter=>create( +* severity = if_bali_constants=>c_severity_status +* text = CONV #( framework_message-message ) ). +* application_log_free_text->set_detail_level( detail_level = '1' ). +* application_log->add_item( item = application_log_free_text ). +* +* ENDLOOP. +* cl_bali_log_db=>get_instance( )->save_log( +* log = application_log +* assign_to_current_appl_job = abap_true +* ). +* +* +* +* DATA(log_handle) = application_log->get_handle( ). + + +* DATA update TYPE TABLE FOR UPDATE ZDMO_R_RapGeneratorBO\\RAPGeneratorBO. +* DATA update_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RapGeneratorBO\\RAPGeneratorBO. +* +* update_line-RapNodeUUID = rap_generator_bo-RapNodeUUID. +* update_line-ApplicationJobLogHandle = log_handle. +* APPEND update_line TO update. +* +* IF update IS NOT INITIAL. +* MODIFY ENTITIES OF ZDMO_R_RapGeneratorBO +* ENTITY RAPGeneratorBO +* UPDATE FIELDS ( +* ApplicationJobLogHandle +* RapNodeUUID +* ) WITH update +* REPORTED DATA(update_reported) +* FAILED DATA(update_failed) +* . +* ENDIF. +* +* IF update IS NOT INITIAL AND update_failed IS INITIAL. +* COMMIT ENTITIES RESPONSE OF ZDMO_R_RapGeneratorBO +* REPORTED DATA(commit_reported) +* FAILED DATA(commit_failed). +* ENDIF. + +* reported = CORRESPONDING #( DEEP commit_reported ). +* failed = CORRESPONDING #( DEEP commit_failed ). + + + CATCH zdmo_cx_rap_generator INTO DATA(rap_generator_exception). + + DATA(rap_generator_exception_text) = rap_generator_exception->get_text( ). + +* application_log->add_item( item = cl_bali_exception_setter=>create( +* severity = if_bali_constants=>c_severity_error +* exception = rap_generator_exception ) ). +* +* cl_bali_log_db=>get_instance( )->save_log( +* log = application_log +* assign_to_current_appl_job = abap_true +* ). + + + + RAISE EXCEPTION TYPE cx_apj_rt_content + EXPORTING + previous = rap_generator_exception. + + ENDTRY. + + + ENDMETHOD. + + + METHOD if_oo_adt_classrun~main. + + "test run of application job + "since application job cannot be debugged we test it via F + + DATA et_parameters TYPE if_apj_rt_exec_object=>tt_templ_val . + + et_parameters = VALUE #( + ( selname = zdmo_cl_rap_node=>job_selection_name + kind = if_apj_dt_exec_object=>parameter + sign = 'I' + option = 'EQ' + low = 'ZR_TravelTP_12' ) + ). + + TRY. + if_apj_rt_exec_object~execute( it_parameters = et_parameters ). + out->write( |Finished| ). + "CATCH cx_apj_rt_content INTO DATA(job_scheduling_exception). + CATCH cx_root INTO DATA(job_scheduling_exception). + out->write( |Exception has occured: { job_scheduling_exception->get_text( ) }| ). + ENDTRY. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_in_background.clas.xml b/src/zdmo_cl_rap_gen_in_background.clas.xml new file mode 100644 index 0000000..cb0ef8a --- /dev/null +++ b/src/zdmo_cl_rap_gen_in_background.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_IN_BACKGROUND</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>run RAP Generator as background job</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_reuse_comp.clas.abap b/src/zdmo_cl_rap_gen_reuse_comp.clas.abap new file mode 100644 index 0000000..e80b496 --- /dev/null +++ b/src/zdmo_cl_rap_gen_reuse_comp.clas.abap @@ -0,0 +1,21 @@ +CLASS zdmo_cl_rap_gen_reuse_comp DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + +* type standard table of zdmo_cl_rap_node=>ts_field + +* methods data_source_fields IMPORTING data_source type string +* data_source_type type string +* RETURNING VALUE(data_source_field_mapping) type standard table of zdmo_cl_rap_node=>ts_field +* + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_REUSE_COMP IMPLEMENTATION. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_reuse_comp.clas.xml b/src/zdmo_cl_rap_gen_reuse_comp.clas.xml new file mode 100644 index 0000000..96e67da --- /dev/null +++ b/src/zdmo_cl_rap_gen_reuse_comp.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_REUSE_COMP</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Re-use components for RAP Generator</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_gen_show_appl_log.clas.abap b/src/zdmo_cl_rap_gen_show_appl_log.clas.abap new file mode 100644 index 0000000..1d96f88 --- /dev/null +++ b/src/zdmo_cl_rap_gen_show_appl_log.clas.abap @@ -0,0 +1,309 @@ +CLASS zdmo_cl_rap_gen_show_appl_log DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + INTERFACES if_oo_adt_classrun . + INTERFACES if_rap_query_provider. + PROTECTED SECTION. + PRIVATE SECTION. + + METHODS is_key_filter + IMPORTING it_filter_cond TYPE if_rap_query_filter=>tt_name_range_pairs + EXPORTING unique_filter_cond TYPE if_rap_query_filter=>tt_name_range_pairs + RETURNING VALUE(rv_is_key_filter) TYPE abap_bool. + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GEN_SHOW_APPL_LOG IMPLEMENTATION. + + + METHOD if_oo_adt_classrun~main. + + + DATA l_handle TYPE if_bali_log=>ty_handle. + + l_handle = 'vp3Ggk4J7ksZt3pexkwCdW'. +* l_handle = 'eOy9ubWZ7jsZlQLeIxSCGm'. + + + TRY. + DATA(l_log) = cl_bali_log_db=>get_instance( )->load_log( handle = l_handle + read_only_header = abap_true ). + + DATA(log_items) = l_log->get_all_items( ) . + + LOOP AT log_items INTO DATA(log_item). + DATA(output) = |number { log_item-log_item_number } Category { log_item-item->category } Severity { log_item-item->severity } log item number { log_item-item->log_item_number } detail level { log_item-item->detail_level } | . + output = output && |time stamp { log_item-item->timestamp } msg_text: { log_item-item->get_message_text( ) }| . + out->write( output ). + ENDLOOP. + + + + + CATCH cx_bali_runtime INTO DATA(l_exception). + out->write( l_exception->get_text( ) ). + ENDTRY. + + + ENDMETHOD. + + + METHOD if_rap_query_provider~select. + DATA business_data TYPE TABLE OF Zdmo_I_rap_generator_appl_log . + DATA business_data_line TYPE Zdmo_I_rap_generator_appl_log . + DATA(top) = io_request->get_paging( )->get_page_size( ). + DATA(skip) = io_request->get_paging( )->get_offset( ). + DATA(requested_fields) = io_request->get_requested_elements( ). + DATA(sort_order) = io_request->get_sort_elements( ). + DATA total_number_of_records TYPE int8. + + DATA log_item_number TYPE if_bali_log=>ty_log_item_number . + + TRY. + DATA(filter_condition_string) = io_request->get_filter( )->get_as_sql_string( ). + DATA(filter_condition_ranges) = io_request->get_filter( )->get_as_ranges( ). + + is_key_filter( + EXPORTING + it_filter_cond = filter_condition_ranges + IMPORTING + unique_filter_cond = DATA(unique_filter_cond) + RECEIVING + rv_is_key_filter = DATA(is_single_read) + ). + + CATCH cx_root INTO DATA(exception). + DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ). + + DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key. + + RAISE EXCEPTION TYPE zdmo_cx_rap_generator + EXPORTING + textid = VALUE scx_t100key( msgid = exception_t100_key-msgid + msgno = exception_t100_key-msgno + attr1 = exception_t100_key-attr1 + attr2 = exception_t100_key-attr2 + attr3 = exception_t100_key-attr3 + attr4 = exception_t100_key-attr4 ) + previous = exception. + +* ELSE. +* ENDIF. + ENDTRY. + + READ TABLE filter_condition_ranges WITH KEY name = 'LOG_HANDLE' + INTO DATA(filter_condition_log_handle). + + READ TABLE filter_condition_ranges WITH KEY name = 'LOG_ITEM_NUMBER' + INTO DATA(filter_condition_log_item_num). + + IF filter_condition_log_handle IS NOT INITIAL. + + DATA l_handle TYPE if_bali_log=>ty_handle. + + l_handle = filter_condition_log_handle-range[ 1 ]-low. + + IF l_handle IS NOT INITIAL. + TRY. + DATA(l_log) = cl_bali_log_db=>get_instance( )->load_log( handle = l_handle + read_only_header = abap_true ). + + IF is_single_read = abap_true. + + total_number_of_records = 1. + + log_item_number = filter_condition_log_item_num-range[ 1 ]-low . + + DATA(single_log_item) = l_log->get_item( log_item_number ). + APPEND INITIAL LINE TO business_data. + business_data[ 1 ]-Log_handle = l_handle. + business_data[ 1 ]-Log_item_number = single_log_item->log_item_number. + business_data[ 1 ]-category = single_log_item->category. + business_data[ 1 ]-detail_level = single_log_item->detail_level. + business_data[ 1 ]-message_text = single_log_item->get_message_text( ). + business_data[ 1 ]-severity = single_log_item->severity. + business_data[ 1 ]-timestamp = single_log_item->timestamp. + + CASE single_log_item->severity. + WHEN 'S' OR 'I'. "Status, Information + business_data[ 1 ]-Criticality = 3. + WHEN 'E' OR 'A'. "Error, Termination + business_data[ 1 ]-Criticality = 1. + WHEN 'W' OR 'X'. "Warning, Exit + business_data[ 1 ]-Criticality = 2. + WHEN OTHERS. + business_data[ 1 ]-Criticality = 0. + ENDCASE. + + io_response->set_total_number_of_records( total_number_of_records ). + io_response->set_data( business_data ). + + RETURN. + ELSE. + + DATA(log_items) = l_log->get_all_items( ) . + + ENDIF. + + LOOP AT log_items INTO DATA(log_item). + + "fill key fields + business_data_line-Log_handle = l_handle. + business_data_line-Log_item_number = log_item-log_item_number. + "fill properties + business_data_line-category = log_item-item->category. + business_data_line-severity = log_item-item->severity. + business_data_line-detail_level = log_item-item->detail_level. + business_data_line-timestamp = log_item-item->timestamp. + + business_data_line-message_text = log_item-item->get_message_text( ). + APPEND business_data_line TO business_Data. + ENDLOOP. + + + + + CATCH cx_bali_runtime INTO DATA(l_exception). + DATA(l_exception_t100_key) = cl_message_helper=>get_latest_t100_exception( l_exception )->t100key. + RAISE EXCEPTION TYPE zdmo_cx_rap_generator + EXPORTING + textid = VALUE scx_t100key( msgid = l_exception_t100_key-msgid + msgno = l_exception_t100_key-msgno + attr1 = l_exception_t100_key-attr1 + attr2 = l_exception_t100_key-attr2 + attr3 = l_exception_t100_key-attr3 + attr4 = l_exception_t100_key-attr4 ) + previous = l_exception. + ENDTRY. + ENDIF. + + + ENDIF. + + total_number_of_records = lines( business_data ). + + IF sort_order IS NOT INITIAL. + + DATA order_by_string TYPE string. + + CLEAR order_by_string. + LOOP AT sort_order INTO DATA(ls_orderby_property). + IF ls_orderby_property-descending = abap_true. + CONCATENATE order_by_string ls_orderby_property-element_name 'DESCENDING' INTO order_by_string SEPARATED BY space. + ELSE. + CONCATENATE order_by_string ls_orderby_property-element_name 'ASCENDING' INTO order_by_string SEPARATED BY space. + ENDIF. + ENDLOOP. + + + ENDIF. + + IF top IS NOT INITIAL AND top > 0. + DATA(max_index) = top + skip. + ELSE. + max_index = 0. + ENDIF. + + SELECT Log_item_number FROM @business_data AS data_source_fields + WHERE (filter_condition_string) + ORDER BY (order_by_string) + INTO TABLE @DATA(log_item_number_table) + UP TO @max_index ROWS. + + DATA s_log_item_number_table TYPE RANGE OF Zdmo_I_rap_generator_appl_log-Log_item_number. + DATA s_log_item_number_table_line LIKE LINE OF s_log_item_number_table. + + LOOP AT log_item_number_table INTO DATA(log_item_number_line). + s_log_item_number_table_line-sign = 'I'. + s_log_item_number_table_line-option = 'EQ'. + s_log_item_number_table_line-low = log_item_number_line-Log_item_number. + APPEND s_log_item_number_table_line TO s_log_item_number_table. + ENDLOOP. + + DELETE business_data WHERE Log_item_number NOT IN s_log_item_number_table. + + IF skip IS NOT INITIAL. + DELETE business_data TO skip. + ENDIF. + +*public static constant c_severity_error type if_bali_constants=>ty_severity value 'E' +*public static constant c_severity_exit type if_bali_constants=>ty_severity value 'X' +*public static constant c_severity_information type if_bali_constants=>ty_severity value 'I' +*public static constant c_severity_status type if_bali_constants=>ty_severity value 'S' +*public static constant c_severity_termination type if_bali_constants=>ty_severity value 'A' +*public static constant c_severity_warning type if_bali_constants=>ty_severity value 'W' + + LOOP AT business_data ASSIGNING FIELD-SYMBOL(<business_data>). + CASE <business_data>-severity. + WHEN 'S' OR 'I'. "Status, Information + <business_data>-Criticality = 3. + WHEN 'E' OR 'A'. "Error, Termination + <business_data>-Criticality = 1. + WHEN 'W' OR 'X'. "Warning, Exit + <business_data>-Criticality = 2. + WHEN OTHERS. + <business_data>-Criticality = 0. + ENDCASE. + ENDLOOP. + + io_response->set_total_number_of_records( total_number_of_records ). + io_response->set_data( business_data ). + + ENDMETHOD. + + + METHOD is_key_filter. + + DATA filter_condition_by_name TYPE if_rap_query_filter=>ty_name_range_pairs . + DATA key_name TYPE string. + DATA range_option TYPE if_rap_query_filter=>ty_range_option . + + "check if the request is a single read + + key_name = 'LOG_HANDLE'. + CLEAR filter_condition_by_name. + CLEAR range_option. + + READ TABLE it_filter_cond WITH KEY name = key_name INTO filter_condition_by_name. + IF sy-subrc = 0 AND lines( filter_condition_by_name-range ) = 1. + READ TABLE filter_condition_by_name-range INTO range_option INDEX 1. + IF sy-subrc = 0 AND range_option-sign = 'I' AND range_option-option = 'EQ' AND range_option-low IS NOT INITIAL. + "read details for single record in list + rv_is_key_filter = abap_true. + APPEND filter_condition_by_name TO unique_filter_cond. + ELSE. + rv_is_key_filter = abap_false. + CLEAR unique_filter_cond. + ENDIF. + ENDIF. + + CHECK rv_is_key_filter = abap_true. + + key_name = 'LOG_ITEM_NUMBER' . + CLEAR filter_condition_by_name. + CLEAR range_option. + + READ TABLE it_filter_cond WITH KEY name = key_name INTO filter_condition_by_name. + IF sy-subrc = 0 AND lines( filter_condition_by_name-range ) = 1. + READ TABLE filter_condition_by_name-range INTO range_option INDEX 1. + IF sy-subrc = 0 AND range_option-sign = 'I' AND range_option-option = 'EQ' AND range_option-low IS NOT INITIAL. + "read details for single record in list + rv_is_key_filter = abap_true. + APPEND filter_condition_by_name TO unique_filter_cond. + ELSE. + rv_is_key_filter = abap_false. + CLEAR unique_filter_cond. + ENDIF. + ELSE. + rv_is_key_filter = abap_false. + CLEAR unique_filter_cond. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_gen_show_appl_log.clas.xml b/src/zdmo_cl_rap_gen_show_appl_log.clas.xml new file mode 100644 index 0000000..04f6b23 --- /dev/null +++ b/src/zdmo_cl_rap_gen_show_appl_log.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GEN_SHOW_APPL_LOG</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Show application log entries</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator.clas.abap b/src/zdmo_cl_rap_generator.clas.abap new file mode 100644 index 0000000..28ba7a3 --- /dev/null +++ b/src/zdmo_cl_rap_generator.clas.abap @@ -0,0 +1,6180 @@ +CLASS zdmo_cl_rap_generator DEFINITION +INHERITING FROM zdmo_cl_rap_generator_base + PUBLIC + CREATE PUBLIC. + PUBLIC SECTION. + + TYPES: + ty_string_table_type TYPE STANDARD TABLE OF string WITH DEFAULT KEY . + +* TYPES: BEGIN OF t_framework_message_fields, +* severity TYPE symsgty, +* object_TYPE TYPE if_xco_gen_o_finding=>tv_object_type, +* object_name TYPE if_xco_gen_o_finding=>tv_object_name, +* message TYPE string, +* END OF t_framework_message_fields. +* +* TYPES: tt_framework_message_fields TYPE STANDARD TABLE OF t_framework_message_fields WITH EMPTY KEY. + + TYPES: BEGIN OF t_generated_repository_object, + object_TYPE TYPE if_xco_gen_o_finding=>tv_object_type, + object_name TYPE if_xco_gen_o_finding=>tv_object_name, + hierarchy_distance_from_root TYPE int4, + transport_request TYPE sxco_transport, + END OF t_generated_repository_object. + + TYPES: t_generated_repository_objects TYPE STANDARD TABLE OF t_generated_repository_object WITH EMPTY KEY. + + TYPES: BEGIN OF t_method_exists_in_interface, + interface_name TYPE c LENGTH 30, + method_name TYPE c LENGTH 61, + method_exists TYPE abap_bool, + END OF t_method_exists_in_interface. + + TYPES : t_method_exists_in_interfaces TYPE STANDARD TABLE OF t_method_exists_in_interface. + + TYPES: BEGIN OF t_method_exists_in_class, + class_name TYPE c LENGTH 30, + method_name TYPE c LENGTH 61, + method_exists TYPE abap_bool, + END OF t_method_exists_in_class. + + TYPES : t_method_exists_in_classes TYPE STANDARD TABLE OF t_method_exists_in_class. + + + TYPES: + BEGIN OF ts_condition_components, + projection_field TYPE sxco_cds_field_name, + association_name TYPE sxco_cds_association_name, + association_field TYPE sxco_cds_field_name, + END OF ts_condition_components, + + + tt_condition_components TYPE STANDARD TABLE OF ts_condition_components WITH EMPTY KEY. + + TYPES: BEGIN OF t_table_fields, + field TYPE sxco_ad_field_name, + data_element TYPE sxco_ad_object_name, + is_key TYPE abap_bool, + not_null TYPE abap_bool, + currencyCode TYPE sxco_cds_field_name, + unitOfMeasure TYPE sxco_cds_field_name, + END OF t_table_fields. + + TYPES: tt_table_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field. + + DATA root_node TYPE REF TO ZDMO_cl_rap_node. + + METHODS get_rap_bo_name RETURNING VALUE(rap_bo_name) TYPE sxco_cds_object_name. + + METHODS get_generated_repo_objects RETURNING VALUE(r_generated_repository_objects) TYPE t_generated_repository_objects. + + METHODS exception_occured RETURNING VALUE(rv_exception_occured) TYPE abap_bool. + + METHODS generate_bo RETURNING VALUE(framework_messages) TYPE zdmo_cl_rap_node=>tt_framework_message_fields + RAISING cx_xco_gen_put_exception + ZDMO_cx_rap_generator. + + METHODS store_bo RAISING zdmo_cx_rap_generator. + + METHODS constructor + IMPORTING + json_string TYPE clike OPTIONAL + io_root_node TYPE REF TO ZDMO_cl_rap_node OPTIONAL + xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib OPTIONAL + RAISING ZDMO_cx_rap_generator. + + CLASS-METHODS create_for_cloud_development + IMPORTING + json_string TYPE clike OPTIONAL + RETURNING + VALUE(result) TYPE REF TO zdmo_cl_rap_generator. + + CLASS-METHODS create_for_on_prem_development + IMPORTING + json_string TYPE clike OPTIONAL + RETURNING + VALUE(result) TYPE REF TO zdmo_cl_rap_generator. + + CLASS-METHODS create_with_rap_node_object + IMPORTING + rap_node TYPE REF TO ZDMO_cl_rap_node OPTIONAL + RETURNING + VALUE(result) TYPE REF TO zdmo_cl_rap_generator. + + PROTECTED SECTION. + + METHODS cds_i_view_set_provider_cntrct REDEFINITION. + METHODS cds_p_view_set_provider_cntrct REDEFINITION. + METHODS put_operation_execute REDEFINITION. + + PRIVATE SECTION. + + CONSTANTS method_get_glbl_authorizations TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'GET_GLOBAL_AUTHORIZATIONS'. + CONSTANTS method_get_instance_features TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'GET_INSTANCE_FEATURES'. + CONSTANTS method_save_modified TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'SAVE_MODIFIED'. + CONSTANTS cleanup_finalize TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'CLEANUP_FINALIZE' . + + CONSTANTS method_create TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'CREATE'. + CONSTANTS method_update TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'UPDATE'. + CONSTANTS method_delete TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'DELETE'. + CONSTANTS method_read TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'READ'. + CONSTANTS method_lock TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'LOCK'. + CONSTANTS method_rba TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'rba'. + CONSTANTS method_cba TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'cba'. + + CONSTANTS method_finalize TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'finalize'. + CONSTANTS method_check_before_save TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'check_before_save'. + CONSTANTS method_save TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'save'. + CONSTANTS method_cleanup TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'cleanup'. + CONSTANTS method_cleanup_finalize TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name VALUE 'cleanup_finalize'. + + + + TYPES : aliases TYPE STANDARD TABLE OF sxco_ddef_alias_name. + + TYPES : BEGIN OF t_log_entry, + DetailLevel TYPE ballevel, + Severity TYPE symsgty, + Text TYPE bapi_msg, + TimeStamp TYPE timestamp, + END OF t_log_entry. + TYPES : t_log_entries TYPE STANDARD TABLE OF t_log_entry. + + DATA xco_api TYPE REF TO ZDMO_cl_rap_xco_lib . + + DATA mo_package TYPE sxco_package. + + DATA put_exception_occured TYPE abap_bool. + + DATA generated_repository_objects TYPE t_generated_repository_objects. + DATA generated_repository_object TYPE t_generated_repository_object. + + DATA method_exists_in_interface TYPE t_method_exists_in_interface. + DATA method_exists_in_classe TYPE t_method_exists_in_class. + DATA method_exists_in_interfaces TYPE t_method_exists_in_interfaces. + DATA method_exists_in_classes TYPE t_method_exists_in_classes. + +******************************************************************************** +* "cloud +* DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system. +* DATA mo_put_operation TYPE REF TO if_xco_cp_gen_d_o_put . +* DATA mo_draft_tabl_put_opertion TYPE REF TO if_xco_cp_gen_d_o_put . +* DATA mo_srvb_put_operation TYPE REF TO if_xco_cp_gen_d_o_put . +******************************************************************************** +* "onpremise +* DATA mo_environment TYPE REF TO if_xco_gen_environment . +* DATA mo_put_operation TYPE REF TO if_xco_gen_o_mass_put. +* DATA mo_draft_tabl_put_opertion TYPE REF TO if_xco_gen_o_mass_put. +* DATA mo_srvb_put_operation TYPE REF TO if_xco_gen_o_mass_put. +******************************************************************************** + + DATA mo_transport TYPE sxco_transport . + + DATA exc_method_does_not_exist TYPE REF TO cx_sy_dyn_call_illegal_method. + DATA call_method_succeeded_list TYPE TABLE OF string. + DATA call_method_not_succeeded_list TYPE TABLE OF string. +* METHODS constructor +* IMPORTING +* json_string TYPE clike OPTIONAL +* io_root_node TYPE REF TO ZDMO_cl_rap_node OPTIONAL +* xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib OPTIONAL +* RAISING ZDMO_cx_rap_generator. + + + + + METHODS add_log_entries_for_rap_bo IMPORTING i_rap_bo_name TYPE sxco_cds_object_name + i_log_entries TYPE t_log_entries + RETURNING VALUE(r_success) TYPE abap_boolean. + + METHODS assign_package. + + METHODS get_transport_layer + IMPORTING + io_package TYPE REF TO if_xco_package + RETURNING + VALUE(ro_transport_layer) TYPE REF TO if_xco_transport_layer. + + METHODS create_control_structure + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_extension_include + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node. + + METHODS create_extension_include_view + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_draft_query_view + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node. + + METHODS create_r_cds_view + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_p_cds_view + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_i_cds_view + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_i_cds_view_basic + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_mde_view + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_table + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node + is_draft_table TYPE abap_bool. + + METHODS create_bdef + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS create_bil + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS create_bdef_p + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_bdef_i + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_condition + IMPORTING + VALUE(it_condition_components) TYPE tt_condition_components + RETURNING + VALUE(ro_expression) TYPE REF TO if_xco_ddl_expr_condition. + + METHODS create_service_definition + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_sap_object_type + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node. + + METHODS create_sap_object_node_type + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO zdmo_cl_rap_node. + + "service binding needs a separate put operation + METHODS create_service_binding + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_custom_entity + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node. + + METHODS create_custom_query + IMPORTING + VALUE(io_rap_bo_node) TYPE REF TO ZDMO_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS add_anno_ABAP_Catalog_Ext + IMPORTING + io_view TYPE REF TO if_xco_gen_cds_s_fo_ann_target + i_allowNewDataSources TYPE abap_bool + i_elementSuffix TYPE string + i_dataSources TYPE sxco_cds_association_name + i_maximumFields TYPE i + i_allowNewCompositions TYPE abap_bool. + + METHODS add_anno_ui_hidden + IMPORTING + io_field TYPE REF TO if_xco_gen_cds_s_fo_ann_target + ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field. + + METHODS add_anno_ui_lineitem + IMPORTING + io_field TYPE REF TO if_xco_gen_cds_s_fo_ann_target + ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field + position TYPE i + label TYPE string OPTIONAL. + + METHODS add_anno_ui_identification + IMPORTING + io_field TYPE REF TO if_xco_gen_cds_s_fo_ann_target + io_rap_bo_node TYPE REF TO ZDMO_cl_rap_node + ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field + position TYPE i + label TYPE string OPTIONAL + add_action_for_transport TYPE abap_bool OPTIONAL. + + METHODS add_annotation_ui_selectionfld + IMPORTING + io_field TYPE REF TO if_xco_gen_cds_s_fo_ann_target + io_rap_bo_node TYPE REF TO ZDMO_cl_rap_node + ls_header_fields TYPE ZDMO_cl_rap_node=>ts_field + position TYPE i. + + METHODS add_annotation_ui_header + IMPORTING + io_specification TYPE REF TO if_xco_gen_cds_s_fo_ann_target + io_rap_bo_node TYPE REF TO ZDMO_cl_rap_node . + + METHODS add_annotation_ui_facets + IMPORTING + io_field TYPE REF TO if_xco_gen_cds_s_fo_ann_target + io_rap_bo_node TYPE REF TO ZDMO_cl_rap_node . + + METHODS zz_add_business_configuration + CHANGING + c_framework_messages TYPE zdmo_cl_rap_node=>tt_framework_message_fields + RAISING + cx_mbc_api_exception. + + METHODS add_findings_to_output + IMPORTING i_task_name TYPE bapi_msg + i_findings TYPE REF TO if_xco_gen_o_findings + RETURNING VALUE(r_success) TYPE abap_bool. + + METHODS check_and_add_ext_incl_struc + IMPORTING + i_node TYPE REF TO zdmo_cl_rap_node. + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR IMPLEMENTATION. + + + METHOD add_annotation_ui_facets. + + DATA position TYPE i. + + IF io_rap_bo_node->is_virtual_root( ) = abap_true. + + io_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'id' )->add_string( 'idIdentification' + )->add_member( 'parentId' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( 'General Information' + )->add_member( 'position' )->add_number( 10 + )->add_member( 'hidden' )->add_boolean( abap_true + )->end_record( + "@todo check what happens if an entity has several child entities + )->begin_record( + )->add_member( 'purpose' )->add_enum( 'STANDARD' + )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' + )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 20 + )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias + )->end_record( + )->end_array( ) ##no_text. + + ELSE. + + IF io_rap_bo_node->is_root( ) = abap_true. + + IF io_rap_bo_node->has_childs( ). + +* io_field->add_annotation( 'UI.facet' )->value->build( +* )->begin_array( +* )->begin_record( +* )->add_member( 'id' )->add_string( 'idCollection' +* )->add_member( 'type' )->add_enum( 'COLLECTION' +* )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' +* )->add_member( 'position' )->add_number( 10 +* )->end_record( +* )->begin_record( +* )->add_member( 'id' )->add_string( 'idIdentification' +* )->add_member( 'parentId' )->add_string( 'idCollection' +* )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' +* )->add_member( 'label' )->add_string( 'General Information' +* )->add_member( 'position' )->add_number( 10 +* )->end_record( +* "@todo check what happens if an entity has several child entities +* )->begin_record( +* )->add_member( 'id' )->add_string( 'idLineitem' +* )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' +* )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && '' +* )->add_member( 'position' )->add_number( 20 +* )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias +* )->end_record( +* )->end_array( ). + + DATA(ui_facet_array) = io_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( ). + ui_facet_array->begin_record( + )->add_member( 'id' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'COLLECTION' + )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->begin_record( + )->add_member( 'id' )->add_string( 'idIdentification' + )->add_member( 'parentId' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( 'General Information' + )->add_member( 'position' )->add_number( 20 + )->end_record( ). + + position = 20. + + LOOP AT io_rap_bo_node->childnodes INTO DATA(childnode). + + position += 10. + "@todo check what happens if an entity has several child entities + ui_facet_array->begin_record( + )->add_member( 'id' )->add_string( |id{ childnode->rap_node_objects-alias }| + )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' + )->add_member( 'label' )->add_string( childnode->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( position + )->add_member( 'targetElement' )->add_string( '_' && childnode->rap_node_objects-alias + )->end_record( ). + ENDLOOP. + ui_facet_array->end_array( ). + + + ELSE. + + io_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'id' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'COLLECTION' + )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->begin_record( + )->add_member( 'id' )->add_string( 'idIdentification' + )->add_member( 'parentId' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( 'General Information' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->end_array( ) ##no_text. + + ENDIF. + + ELSE. + + IF io_rap_bo_node->has_childs( ). + +* io_field->add_annotation( 'UI.facet' )->value->build( +* )->begin_array( +* )->begin_record( +* )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias ) +* )->add_member( 'purpose' )->add_enum( 'STANDARD' +* )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' +* )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias ) +* )->add_member( 'position' )->add_number( 10 +* )->end_record( +* )->begin_record( +* )->add_member( 'id' )->add_string( 'idLineitem' +* )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' +* )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && '' +* )->add_member( 'position' )->add_number( 20 +* )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias +* )->end_record( +* )->end_array( ). + + + DATA(ui_facet_array_child) = io_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( ). + + ui_facet_array_child->begin_record( + )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'purpose' )->add_enum( 'STANDARD' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'position' )->add_number( 10 + )->end_record( ). + + position = 10. + + LOOP AT io_rap_bo_node->childnodes INTO DATA(childnode_child). + position += 10. + ui_facet_array_child->begin_record( + )->add_member( 'id' )->add_string( |id{ childnode_child->rap_node_objects-alias }| + )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' + )->add_member( 'label' )->add_string( childnode_child->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( position + )->add_member( 'targetElement' )->add_string( '_' && childnode_child->rap_node_objects-alias + )->end_record( ). + ENDLOOP. + + ui_facet_array_child->end_array( ). + + ELSE. + + io_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'purpose' )->add_enum( 'STANDARD' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->end_array( ). + + ENDIF. + ENDIF. + ENDIF. + ENDMETHOD. + + + METHOD add_annotation_ui_header. + "show the name of the "real" entity, not the virtual one + IF io_rap_bo_node->is_virtual_root( ). + io_specification->add_annotation( 'UI' )->value->build( + )->begin_record( + )->add_member( 'headerInfo' + )->begin_record( + )->add_member( 'typeName' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && '' + + )->end_record( + ). + ELSE. + io_specification->add_annotation( 'UI' )->value->build( + )->begin_record( + )->add_member( 'headerInfo' + )->begin_record( + )->add_member( 'typeName' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'typeNamePlural' )->add_string( io_rap_bo_node->rap_node_objects-alias && 's' + )->add_member( 'title' + )->begin_record( + )->add_member( 'type' )->add_enum( 'STANDARD' + )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + "@todo: Check what happens if several key fields are present + "for a first test we just take the first one. + "also check what happens if no semantic key has been specified + )->add_member( 'value' )->add_string( io_rap_bo_node->object_id_cds_field_name && '' + )->end_record( + )->end_record( + + "presentationVariant: [ { sortOrder: [{ by: 'TravelID', direction: #DESC }], visualizations: [{type: #AS_LINEITEM}] }] } + )->add_member( 'presentationVariant' + )->begin_array( + )->begin_record( + )->add_member( 'sortOrder' + )->begin_array( + )->begin_record( + )->add_member( 'by' )->add_string( io_rap_bo_node->object_id_cds_field_name && '' + )->add_member( 'direction' )->add_enum( 'DESC' + )->end_record( + )->end_array( + )->add_member( 'visualizations' + )->begin_array( + )->begin_record( + )->add_member( 'type' )->add_enum( 'AS_LINEITEM' + )->end_record( + )->end_array( + )->end_record( + )->end_array( + )->end_record( + ). + ENDIF. + ENDMETHOD. + + + METHOD add_annotation_ui_selectionfld. + + "add selection fields for semantic key fields or for the fields that are marked as object id + + DATA add_annotation_UI_selectionFld TYPE abap_bool VALUE abap_false . + + IF io_rap_bo_node->is_root( ) = abap_true AND + ( io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-unmanaged_semantic OR + io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_semantic ) AND + ls_header_fields-key_indicator = abap_true. + + add_annotation_UI_selectionFld = abap_true. + + ENDIF. + + IF io_rap_bo_node->is_root( ) = abap_true AND + io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_uuid AND + ls_header_fields-name = io_rap_bo_node->object_id. + + add_annotation_UI_selectionFld = abap_true. + + ENDIF. + + IF io_rap_bo_node->is_root( ) = abap_true AND + ls_header_fields-has_valuehelp = abap_true. + + add_annotation_UI_selectionFld = abap_true. + + ENDIF. + + IF add_annotation_UI_selectionFld = abap_true. + io_field->add_annotation( 'UI.selectionField' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( position + )->end_record( + )->end_array( ). + ENDIF. + + ENDMETHOD. + + + METHOD add_anno_abap_catalog_ext. + DATA(lo_valuebuilder) = io_view->add_annotation( 'AbapCatalog.extensibility' )->value->build( ). + + DATA(lo_record) = lo_valuebuilder->begin_record( + )->add_member( 'extensible' )->add_boolean( abap_true + )->add_member( 'elementSuffix' )->add_string( i_elementsuffix + )->add_member( 'allowNewDatasources' )->add_boolean( i_allownewdatasources + )->add_member( 'allowNewCompositions' )->add_boolean( i_allownewcompositions + ). + + lo_record->add_member( 'dataSources' )->begin_array( )->add_string( CONV #( i_datasources ) )->end_array( ). + DATA(quota) = lo_record->add_member( 'quota' )->begin_record( ). + quota->add_member( 'maximumFields' )->add_number( i_maximumfields ). + "recommended formula to calculate maximumBytes + quota->add_member( 'maximumBytes' )->add_number( i_maximumfields * 100 ). + quota->end_record( ). + + lo_valuebuilder->end_record( ). + ENDMETHOD. + + + METHOD add_anno_ui_hidden. + + IF ls_header_fields-is_hidden = abap_true. + io_field->add_annotation( 'UI.hidden' )->value->build( )->add_boolean( iv_value = abap_true ). + ENDIF. + + ENDMETHOD. + + + METHOD add_anno_ui_identification. + + IF ls_header_fields-is_currencycode = abap_true OR ls_header_fields-is_unitofmeasure = abap_true. + EXIT. + ENDIF. + + DATA(lo_valuebuilder) = io_field->add_annotation( 'UI.identification' )->value->build( ). + DATA(lo_record) = lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( position ). + + "@UI.identification: [{position: 2, importance: #HIGH },{ type: #FOR_ACTION, dataAction: 'selectTransport', label: 'Select Transport' }] + + IF io_rap_bo_node->is_root( ) = abap_true AND + io_rap_bo_node->is_customizing_table = abap_true AND + ls_header_fields-cds_view_field = 'Request'. + lo_record->add_member( 'type' )->add_enum( 'FOR_ACTION' ). + lo_record->add_member( 'dataAction' )->add_string( 'selectTransport' ). + lo_record->add_member( 'label' )->add_string( CONV #( 'Select Transport' ) ) ##no_text. + ELSE. + IF ls_header_fields-is_data_element = abap_false. + lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ). + ENDIF. + ENDIF. + lo_valuebuilder->end_record( )->end_array( ). + + + + ENDMETHOD. + + + METHOD add_anno_ui_lineitem. + + IF ls_header_fields-is_currencycode = abap_true OR ls_header_fields-is_unitofmeasure = abap_true. + EXIT. + ENDIF. + + DATA(lo_valuebuilder) = io_field->add_annotation( 'UI.lineItem' )->value->build( ). + + DATA(lo_record) = lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( position + )->add_member( 'importance' )->add_enum( 'HIGH'). + "if field is based on a data element label will be set from its field description + "if its a built in type we will set a label whith a meaningful default vaule that + "can be changed by the developer afterwards + IF ls_header_fields-is_data_element = abap_false. + lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ). + ENDIF. + lo_valuebuilder->end_record( )->end_array( ). + ENDMETHOD. + + + METHOD add_findings_to_output. + + DATA text TYPE c LENGTH 200 . + DATA log_entry TYPE t_log_entry. + DATA log_entries TYPE t_log_entries. + + log_entry-text = i_task_name. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + + IF i_findings->contain_warnings( ). + log_entry-severity = 'W'. + ENDIF. + + IF i_findings->contain_errors( ). + log_entry-severity = 'E'. + ENDIF. + + APPEND log_entry TO log_entries. + + DATA(finding_texts) = i_findings->get( ). + + IF finding_texts IS NOT INITIAL. + LOOP AT finding_texts INTO DATA(finding_text). + log_entry-text = |{ finding_text->object_type } { finding_text->object_name } { finding_text->message->get_text( ) }|. + log_entry-severity = finding_text->message->value-msgty. + log_entry-detaillevel = 2. + APPEND log_entry TO log_entries. + ENDLOOP. + ENDIF. + + r_success = add_log_entries_for_rap_bo( + i_rap_bo_name = root_node->rap_root_node_objects-behavior_definition_r + i_log_entries = log_entries + ). + + ENDMETHOD. + + + METHOD add_log_entries_for_rap_bo. + +* DATA create_rapbolog_cba TYPE TABLE FOR CREATE ZDMO_R_RapGeneratorBO\_RAPGeneratorBOLog. +* DATA log_entries TYPE TABLE FOR CREATE zdmo_r_rapgeneratorbo\\rapgeneratorbolog . +* DATA log_entry TYPE STRUCTURE FOR CREATE zdmo_r_rapgeneratorbo\\rapgeneratorbolog . +* DATA n TYPE i. +* DATA time_stamp TYPE timestampl. +* +* GET TIME STAMP FIELD time_stamp. +* +* SELECT SINGLE * FROM zdmo_r_rapgeneratorbo WHERE boname = @i_rap_bo_name +* INTO @DATA(rap_generator_bo). +* +* LOOP AT i_log_entries INTO DATA(my_log_entry) where Severity GE 1. +* n += 1. +* log_entry = VALUE #( %is_draft = if_abap_behv=>mk-off +* %cid = |test{ n }| +* Severity = my_log_entry-Severity +* DetailLevel = my_log_entry-DetailLevel +* Text = my_log_entry-Text +* TimeStamp = time_stamp +* ). +* APPEND log_entry TO log_entries. +* ENDLOOP. +* +* create_rapbolog_cba = VALUE #( ( %is_draft = if_abap_behv=>mk-off +* %key-rapnodeuuid = rap_generator_bo-RapNodeUUID +* %target = log_entries ) ) . +* +* MODIFY ENTITIES OF zdmo_r_rapgeneratorbo +* ENTITY RAPGeneratorBO +* CREATE BY \_RAPGeneratorBOLog +* FIELDS ( +* LogItemNumber +* DetailLevel +* Severity +* Text +* TimeStamp +* ) +* WITH create_rapbolog_cba +* MAPPED DATA(mapped) +* FAILED DATA(failed) +* REPORTED DATA(reported). +* +* +* IF mapped-rapgeneratorbolog IS NOT INITIAL. +* COMMIT ENTITIES. +* COMMIT WORK. +* r_success = abap_true. +* ENDIF. +* IF failed-rapgeneratorbolog IS NOT INITIAL. +* r_success = abap_false. +* ENDIF. + + DATA create_rapbolog_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log. +* DATA log_entries TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Log . +* DATA log_entry TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\\Log . + DATA create_raplog_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log. + DATA log_entries LIKE create_raplog_cba_line-%target. + DATA log_entry LIKE LINE OF log_entries. + + DATA n TYPE i. + DATA time_stamp TYPE timestampl. + + GET TIME STAMP FIELD time_stamp. + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @i_rap_bo_name + INTO @DATA(rap_generator_bo). + + + LOOP AT i_log_entries INTO DATA(my_log_entry) . + n += 1. + log_entry = VALUE #( %is_draft = if_abap_behv=>mk-off + %cid = |test{ n }| + Severity = my_log_entry-Severity + DetailLevel = my_log_entry-DetailLevel + Text = my_log_entry-Text + TimeStamp = time_stamp + ). + APPEND log_entry TO log_entries. + ENDLOOP. + + create_rapbolog_cba = VALUE #( ( %is_draft = if_abap_behv=>mk-off + %key-rapbouuid = rap_generator_bo-RapboUUID + %target = log_entries ) ) . + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + CREATE BY \_Log + FIELDS ( + LogItemNumber + DetailLevel + Severity + Text + TimeStamp + ) + WITH create_rapbolog_cba + MAPPED DATA(mapped) + FAILED DATA(failed) + REPORTED DATA(reported). + + + IF mapped-log IS NOT INITIAL. + COMMIT ENTITIES. + COMMIT WORK. + r_success = abap_true. + ENDIF. + IF failed-log IS NOT INITIAL. + r_success = abap_false. + ENDIF. + + + ENDMETHOD. + + + METHOD assign_package. + DATA(lo_package_put_operation) = mo_environment->for-devc->create_put_operation( ). + DATA(lo_specification) = lo_package_put_operation->add_object( mo_package ). + ENDMETHOD. + + + METHOD cds_i_view_set_provider_cntrct. + super->cds_i_view_set_provider_cntrct( i_interface_view_spcification ). + ENDMETHOD. + + + METHOD cds_p_view_set_provider_cntrct. + super->cds_p_view_set_provider_cntrct( i_projection_view_spcification ). + ENDMETHOD. + + + METHOD check_and_add_ext_incl_struc. + + DATA has_extension_include TYPE abap_bool. + DATA(database_table) = xco_api->get_database_table( iv_name = to_upper( i_node->data_source_name ) ). + DATA include_structure_name TYPE sxco_ad_object_name . + include_structure_name = i_node->rap_node_objects-extension_include. + + DATA(database_table_content) = database_table->content( ). + DATA(enhancement_category) = database_table_content->get_enhancement_category( )->value. + IF enhancement_category EQ zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep. + DATA(include_structures_of_table) = database_table_content->get_includes( ). + LOOP AT include_structures_of_table INTO DATA(my_include_struc). +* DATA(include_structure) = xco_api->get_structure( iv_name = to_upper( my_include_struc-structure->name ) ). +* DATA(struc_content) = include_structure->content( ). +* IF struc_content->get_enhancement_category( )->value EQ zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep. + IF my_include_struc-structure->name = include_structure_name. + has_extension_include = abap_true. +* DATA(field_suffix) = struc_content->get_field_suffix( ). + ENDIF. + ENDLOOP. + IF has_extension_include = abap_false. + DATA(inlcude_was_added) = add_include_structure_to_table( i_node ). + ENDIF. + ENDIF. + + ENDMETHOD. + + + METHOD constructor. + + super->constructor( ). + + IF json_string IS INITIAL AND io_root_node IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>parameter_is_initial + mv_value = |json_string and io_root_node|. + ENDIF. + + "in on premise systems one can provide the on premise version + "of the xco libraries as a parameter + + IF xco_lib IS NOT INITIAL. + xco_api = xco_lib. + ELSE. + xco_api = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + + IF io_root_node IS INITIAL. + + root_node = NEW ZDMO_cl_rap_node( ). + + root_node->set_is_root_node( io_is_root_node = abap_true ). + root_node->set_xco_lib( xco_api ). + + DATA(rap_bo_visitor) = NEW ZDMO_cl_rap_xco_json_visitor( root_node ). + DATA(json_data) = xco_cp_json=>data->from_string( json_string ). + json_data->traverse( rap_bo_visitor ). + DATA(a) = 1. + ELSE. + + root_node = io_root_node. + xco_api = io_root_node->xco_lib. + + ENDIF. + + CASE root_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid . + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>implementation_type_not_valid + mv_value = root_node->get_implementation_type( ). + ENDCASE. + + IF root_node->is_consistent( ) = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>node_is_not_consistent + mv_entity = root_node->entityname. + ENDIF. + IF root_node->is_finalized = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>node_is_not_finalized + mv_entity = root_node->entityname. + ENDIF. + IF root_node->has_childs( ). + LOOP AT root_node->all_childnodes INTO DATA(ls_childnode). + IF ls_childnode->is_consistent( ) = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>node_is_not_consistent + mv_entity = ls_childnode->entityname. + ENDIF. + IF ls_childnode->is_finalized = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>node_is_not_finalized + mv_entity = ls_childnode->entityname. + ENDIF. + ENDLOOP. + ENDIF. + + mo_package = root_node->package. + + IF root_node->transport_request IS INITIAL. + root_node->set_transport_request( ). + ENDIF. + mo_transport = root_node->transport_request. + + +********************************************************************** + "cloud +* mo_environment = xco_cp_generation=>environment->dev_system( mo_transport ) . +* mo_put_operation = mo_environment->create_put_operation( ). +* mo_draft_tabl_put_opertion = mo_environment->create_put_operation( ). +* mo_srvb_put_operation = mo_environment->create_put_operation( ). +********************************************************************** + "on premise +* IF xco_api->get_package( root_node->package )->read( )-property-record_object_changes = abap_true. +* mo_environment = xco_generation=>environment->transported( mo_transport ). +* ELSE. +* mo_environment = xco_generation=>environment->local. +* ENDIF. +* mo_draft_tabl_put_opertion = mo_environment->create_mass_put_operation( ). +* mo_put_operation = mo_environment->create_mass_put_operation( ). +* mo_srvb_put_operation = mo_environment->create_mass_put_operation( ). + + + mo_environment = get_environment( mo_transport ) . + mo_draft_tabl_put_operation = get_put_operation( mo_environment ). + mo_put_operation = get_put_operation( mo_environment ). + mo_srvb_put_operation = get_put_operation( mo_environment ). + mo_patch_operation = get_patch_operation( mo_environment ). + +********************************************************************** + ENDMETHOD. + + + METHOD create_bdef. + + DATA lv_determination_name TYPE string. + DATA lv_validation_name TYPE string. + DATA lv_action_name TYPE string. + + + DATA lt_mapping_header TYPE HASHED TABLE OF if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping + WITH UNIQUE KEY cds_view_field dbtable_field. + DATA ls_mapping_header TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping . + + DATA lt_mapping_item TYPE HASHED TABLE OF if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping + WITH UNIQUE KEY cds_view_field dbtable_field. + DATA ls_mapping_item TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping . + + FIELD-SYMBOLS: <fs_create> TYPE REF TO cl_xco_bdef_eval_trigger_oprtn, + <fs_update> TYPE REF TO cl_xco_bdef_eval_trigger_oprtn, + <fs_delete> TYPE REF TO cl_xco_bdef_eval_trigger_oprtn. + + lt_mapping_header = io_rap_bo_node->lt_mapping. + + DATA(lo_specification) = mo_put_operation->for-bdef->add_object( io_rap_bo_node->rap_root_node_objects-behavior_definition_r "mo_i_bdef_header + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-behavior_definition_r. + generated_repository_object-object_type = 'BDEF'. + APPEND generated_repository_object TO generated_repository_objects. + + lo_specification->set_short_description( |Behavior for { io_rap_bo_node->rap_node_objects-cds_view_r }| ) ##no_text. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + lo_specification->set_extensible( ). + set_bdef_extensible_options( lo_specification ). + ENDIF. + + "set implementation type + CASE io_rap_bo_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + lo_specification->set_implementation_type( xco_cp_behavior_definition=>implementation_type->managed ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + lo_specification->set_implementation_type( xco_cp_behavior_definition=>implementation_type->managed ). + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + lo_specification->set_implementation_type( xco_cp_behavior_definition=>implementation_type->unmanaged ). + + "add the code : + "implementation in class ZBP_R_Holiday_U02 unique; + lo_specification->set_implementation_class( io_rap_bo_node->rap_node_objects-behavior_implementation ). + ENDCASE. + + + "set is draft enabled + lo_specification->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + "use the highest recommended strict mode + IF io_rap_bo_node->is_abstract_or_custom_entity( ) = abap_false. +* lo_specification->set_strict_n( zdmo_cl_rap_node=>strict_mode_2 ). + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. + ENDIF. + method_exists_in_interface-method_name = 'SET_STRICT_N'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name) + EXPORTING + iv_n = zdmo_cl_rap_node=>strict_mode_2. + APPEND 'SET_STRICT_N' TO call_method_succeeded_list. + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + "set_strict_n not found + "try to set strict + IF method_exists_in_interface-method_exists = abap_false. +* method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + method_exists_in_interface-method_name = 'SET_STRICT'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name). + APPEND 'SET_STRICT' TO call_method_succeeded_list. + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + ENDIF. + ENDIF. + + "define behavior for root entity + DATA(lo_header_behavior) = lo_specification->add_behavior( io_rap_bo_node->rap_node_objects-cds_view_r ). + + " Characteristics. + DATA(characteristics) = lo_header_behavior->characteristics. + characteristics->set_alias( CONV #( io_rap_bo_node->rap_node_objects-alias ) ). + characteristics->set_implementation_class( io_rap_bo_node->rap_node_objects-behavior_implementation ). + +********************************************************************** +** @todo check when to set unmanaged_save and addtionial_save +********************************************************************** + + IF io_rap_bo_node->is_customizing_table = abap_true AND + io_rap_bo_node->is_virtual_root( ) = abap_false. + characteristics->set_with_additional_save( ). + ENDIF. + + IF io_rap_bo_node->is_virtual_root( ) . + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_chara'. + method_exists_in_interface-method_name = 'SET_WITH_UNMANAGED_SAVE'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD characteristics->(method_exists_in_interface-method_name). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + ENDIF. + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'. + method_exists_in_interface-method_name = 'SET_MASTER_GLOBAL'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + DATA(authorization) = characteristics->authorization. + CALL METHOD authorization->(method_exists_in_interface-method_name). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + IF method_exists_in_interface-method_exists = abap_false. + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'. + method_exists_in_interface-method_name = 'SET_MASTER_INSTANCE'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + authorization = characteristics->authorization. + CALL METHOD authorization->(method_exists_in_interface-method_name). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + ENDIF. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + characteristics->set_extensible( ). + ENDIF. + + IF io_rap_bo_node->draft_enabled = abap_false. + characteristics->lock->set_master( ). + ENDIF. + + "add the draft table + IF io_rap_bo_node->draft_enabled = abap_true. + IF io_rap_bo_node->is_extensible( ) = abap_true. + characteristics->set_draft_table( + io_rap_bo_node->draft_table_name )->set_query( + io_rap_bo_node->rap_node_objects-draft_query_view ). + ELSE. + characteristics->set_draft_table( io_rap_bo_node->draft_table_name ). + ENDIF. + ENDIF. + + + + + IF line_exists( io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-last_changed_at ] ). + DATA(last_changed_at) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-last_changed_at ]-cds_view_field. + ELSEIF line_exists( io_rap_bo_node->lt_additional_fields[ name = io_rap_bo_node->field_name-last_changed_at ] ). + last_changed_at = io_rap_bo_node->lt_additional_fields[ name = io_rap_bo_node->field_name-last_changed_at ]-cds_view_field. + ENDIF. + + IF line_exists( io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ] ). + DATA(local_instance_last_changed_at) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ]-cds_view_field. + ELSEIF line_exists( io_rap_bo_node->lt_additional_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ] ). + local_instance_last_changed_at = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-local_instance_last_changed_at ]. + ENDIF. + + IF line_exists( io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-etag_master ] ). + DATA(etag_master) = io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-etag_master ]-cds_view_field. + ENDIF. + + IF line_exists( io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-total_etag ] ). + DATA(total_etag) = io_rap_bo_node->lt_all_fields[ name = io_rap_bo_node->field_name-total_etag ]-cds_view_field. + ENDIF. + + IF io_rap_bo_node->draft_enabled = abap_true. + characteristics->etag->set_master( etag_master ). + + " lock type ref to if_xco_gen_bdef_s_fo_b_lock + DATA(lock) = characteristics->lock. + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_lock'. + method_exists_in_interface-method_name = 'SET_MASTER_TOTAL_ETAG'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lock->(method_exists_in_interface-method_name) + EXPORTING + iv_master_total_etag = total_etag. + APPEND 'SET_MASTER_TOTAL_ETAG' TO call_method_succeeded_list. + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + ELSE. + characteristics->etag->set_master( etag_master ). + characteristics->lock->set_master( ). + ENDIF. + + CASE io_rap_bo_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + lo_header_behavior->characteristics->set_persistent_table( CONV sxco_dbt_object_name( io_rap_bo_node->persistent_table_name ) ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + lo_header_behavior->characteristics->set_persistent_table( CONV sxco_dbt_object_name( io_rap_bo_node->persistent_table_name ) ). + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + "do not set a persistent table + ENDCASE. + + IF io_rap_bo_node->draft_enabled = abap_true. + + " if this is set, no BIL is needed in a plain vanilla managed draft enabled BO + " add the following operations in case draft is used + " draft action Edit; + " draft action Activate; + " draft action Discard; + " draft action Resume; + " draft determine action Prepare; + +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + +* lo_header_behavior->add_action( 'Edit' )->set_draft( ) ##no_text. +* lo_header_behavior->add_action( 'Activate' )->set_draft( ) ##no_text. +* lo_header_behavior->add_action( 'Discard' )->set_draft( ) ##no_text. +* lo_header_behavior->add_action( 'Resume' )->set_draft( ) ##no_text. +* lo_header_behavior->add_action( 'Prepare' )->set_draft( )->set_determine( ) ##no_text. + + "lo_action_edit type ref to if_xco_gen_bdef_s_fo_b_action + + " add standard operations + DATA(lo_action_edit) = lo_header_behavior->add_action( 'Edit' )." ##no_text. + DATA(lo_action_activate) = lo_header_behavior->add_action( 'Activate' ) ##no_text. + DATA(lo_action_discard) = lo_header_behavior->add_action( 'Discard' ) ##no_text. + DATA(lo_action_resume) = lo_header_behavior->add_action( 'Resume' ) ##no_text. + DATA(lo_action_prepare) = lo_header_behavior->add_action( 'Prepare' ) ##no_text. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + lo_action_prepare->set_extensible( abap_true ). + ENDIF. + + + "add the key word draft, if possible. for example: draft action Activate; + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_action'. + method_exists_in_interface-method_name = 'SET_DRAFT'. + + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_action_edit->(method_exists_in_interface-method_name). + CALL METHOD lo_action_activate->(method_exists_in_interface-method_name). + CALL METHOD lo_action_discard->(method_exists_in_interface-method_name). + CALL METHOD lo_action_resume->(method_exists_in_interface-method_name). + CALL METHOD lo_action_prepare->(method_exists_in_interface-method_name). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_action'. + method_exists_in_interface-method_name = 'SET_DETERMINE'. + + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_action_prepare->(method_exists_in_interface-method_name). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + ENDIF. + + " add standard operations for root node + + IF io_rap_bo_node->is_virtual_root( ) . + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ). + ELSE. + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create ). + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ). + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete ). + ENDIF. + + +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + xco_api->todo( 'in create bdef. make sure is_customizing_table is false on premise' ). + + IF io_rap_bo_node->is_customizing_table = abap_true AND io_rap_bo_node->is_virtual_root( ) = abap_false. + " if_xco_gen_bdef_s_fo_b_validtn + lv_validation_name = |validateChanges| . + + DATA(validation) = lo_header_behavior->add_validation( CONV #( lv_validation_name ) ). + validation->set_time( xco_cp_behavior_definition=>evaluation->time->on_save ). + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_validtn'. + method_exists_in_interface-method_name = 'SET_TRIGGER_OPERATIONS'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + DATA trigger_operations TYPE sxco_t_bdef_trigger_operations . + " DATA trigger_operations_class TYPE REF TO cl_xco_bdef_eval_trigger_op_f. + + ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('CREATE') TO <fs_create>. + ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('UPDATE') TO <fs_update>. + ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('DELETE') TO <fs_delete>. + + IF <fs_create> IS ASSIGNED. + APPEND <fs_create> TO trigger_operations. + ENDIF. + IF <fs_update> IS ASSIGNED. + APPEND <fs_update> TO trigger_operations. + ENDIF. + IF <fs_delete> IS ASSIGNED. + APPEND <fs_delete> TO trigger_operations. + ENDIF. + +* @todo: dynamic call currently fails +* CALL METHOD validation->('SET_TRIGGER_OPERATIONS') +* IMPORTING +* it_trigger_operations = trigger_operations. + + validation->set_trigger_operations( trigger_operations ). + + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + ENDIF. + + IF io_rap_bo_node->is_virtual_root( ) = abap_true. + "action ( features : instance ) selectTransport parameter D_SelectCustomizingTransptReqP result [1] $self; + lv_action_name = 'selectTransport'. + DATA(action) = lo_header_behavior->add_action( CONV #( lv_action_name ) ). + action->set_features_instance( ). + action->parameter->set_entity( 'D_SelectCustomizingTransptReqP' ). + action->result->set_cardinality( xco_cp_cds=>cardinality->one )->set_self( ). + ENDIF. + + + + + + +********************************************************************** +** End of deletion 2020 +********************************************************************** + + + + CASE io_rap_bo_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + + lv_determination_name = |Calculate{ io_rap_bo_node->object_id_cds_field_name }| ##no_text. + + lo_header_behavior->add_determination( CONV #( lv_determination_name ) "'CalculateSemanticKey' + )->set_time( xco_cp_behavior_definition=>evaluation->time->on_save + )->set_trigger_operations( VALUE #( ( xco_cp_behavior_definition=>evaluation->trigger_operation->create ) ) ). + + + + + LOOP AT lt_mapping_header INTO ls_mapping_header. + CASE ls_mapping_header-dbtable_field. + WHEN io_rap_bo_node->field_name-uuid. + lo_header_behavior->add_field( ls_mapping_header-cds_view_field + )->set_numbering_managed( ). + "to do + "add a working dummy implementation to calculate the object id + WHEN io_rap_bo_node->object_id . + lo_header_behavior->add_field( ls_mapping_header-cds_view_field + )->set_read_only( ). + ENDCASE. + ENDLOOP. + + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic . + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(key_field_root_node) + WHERE key_indicator = abap_true AND name <> io_rap_bo_node->field_name-client. + + DATA(key_field_root_behavior) = lo_header_behavior->add_field( key_field_root_node-cds_view_field ). + + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_field'. + method_exists_in_interface-method_name = 'SET_READONLY_UPDATE'. + + IF xco_api->method_exists_in_interface( interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name ). + CALL METHOD key_field_root_behavior->(method_exists_in_interface-method_name). + ENDIF. + + + "lo_item_behavior->add_field( ls_fields-cds_view_field )->set_readonly_update( ). + ENDLOOP. + + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_field) WHERE name <> io_rap_bo_node->field_name-client. + IF ls_field-key_indicator = abap_true. + lo_header_behavior->add_field( ls_field-cds_view_field + )->set_read_only( + ). + ENDIF. + ENDLOOP. + ENDCASE. + + +* make administrative fields read-only +* field ( readonly ) +* CreatedAt, +* CreatedBy, +* LocalLastChangedAt, +* LastChangedAt, +* LastChangedBy; + + LOOP AT io_rap_bo_node->lt_fields INTO ls_field + WHERE name <> io_rap_bo_node->field_name-client. + CASE ls_field-name . + WHEN io_rap_bo_node->field_name-created_at OR + io_rap_bo_node->field_name-created_by OR + io_rap_bo_node->field_name-local_instance_last_changed_at OR + io_rap_bo_node->field_name-local_instance_last_changed_by OR + io_rap_bo_node->field_name-last_changed_at OR + io_rap_bo_node->field_name-last_changed_by OR + io_rap_bo_node->field_name-uuid. + lo_header_behavior->add_field( ls_field-cds_view_field )->set_read_only( ). + ENDCASE. + ENDLOOP. + + + + IF lt_mapping_header IS NOT INITIAL. + CASE io_rap_bo_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + + "use conv #( ) since importing parameter iv_database_table + "was of type sxco_dbt_object_name and has been changed to clike + "to support structure names longer than 16 characters as of 2111 + + DATA(header_mapping) = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->persistent_table_name ) ). + header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header ). + IF io_rap_bo_node->is_extensible( ) = abap_true. + "header_mapping->set_extensible( )->set_corresponding( ). + set_extensible_for_mapping( header_mapping ). + ENDIF. + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->persistent_table_name ) ). + header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header ). + IF io_rap_bo_node->is_extensible( ) = abap_true. + "header_mapping->set_extensible( )->set_corresponding( ). + set_extensible_for_mapping( header_mapping ). + ENDIF. + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + "add control structure +* lo_header_behavior->add_mapping_for( CONV sxco_dbt_object_name( io_rap_bo_node->persistent_table_name ) )->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ). + + "add control structure + IF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-table. + header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->persistent_table_name ) ). + header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ). + ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-structure. + header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->structure_name ) ). + header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ). + ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-abap_type. + "structure name is added here since we only support abap types that are based on structures + header_mapping = lo_header_behavior->add_mapping_for( CONV #( io_rap_bo_node->structure_name ) ). + header_mapping->set_field_mapping( it_field_mappings = lt_mapping_header )->set_control( io_rap_bo_node->rap_node_objects-control_structure ). + ENDIF. + IF io_rap_bo_node->is_extensible( ) = abap_true. + " header_mapping->set_extensible( )->set_corresponding( ). + set_extensible_for_mapping( header_mapping ). + ENDIF. + ENDCASE. + ENDIF. + + IF io_rap_bo_node->has_childs( ). + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + DATA(assoc) = lo_header_behavior->add_association( '_' && lo_childnode->rap_node_objects-alias ). + assoc->set_create_enabled( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ENDLOOP. + ENDIF. + + + + "define behavior for child entities + + IF io_rap_bo_node->has_childs( ). + + LOOP AT io_rap_bo_node->all_childnodes INTO lo_childnode. + + CLEAR lt_mapping_item. + + lt_mapping_item = lo_childnode->lt_mapping. + + DATA(lo_item_behavior) = lo_specification->add_behavior( lo_childnode->rap_node_objects-cds_view_r ). + + " Characteristics. + DATA(item_characteristics) = lo_item_behavior->characteristics. + + "add the draft table + IF io_rap_bo_node->draft_enabled = abap_true. + item_characteristics->set_draft_table( lo_childnode->draft_table_name ). + ENDIF. + + IF lo_childnode->is_extensible( ) = abap_true. + item_characteristics->set_extensible( ). + ENDIF. + + "@todo: Compare with code for root entity + + CLEAR local_instance_last_changed_at. + + IF line_exists( lo_childnode->lt_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ] ). + local_instance_last_changed_at = lo_childnode->lt_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ]-cds_view_field. + ELSEIF line_exists( lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ] ). + local_instance_last_changed_at = lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-local_instance_last_changed_at ]-cds_view_field. + ENDIF. + + + IF line_exists( lo_childnode->lt_fields[ name = lo_childnode->field_name-last_changed_at ] ). + last_changed_at = lo_childnode->lt_fields[ name = lo_childnode->field_name-last_changed_at ]-cds_view_field. + ELSEIF line_exists( lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-last_changed_at ] ). + last_changed_at = lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-last_changed_at ]-cds_view_field. + ENDIF. + + CLEAR etag_master. + IF line_exists( lo_childnode->lt_fields[ name = lo_childnode->field_name-etag_master ] ). + etag_master = lo_childnode->lt_fields[ name = lo_childnode->field_name-etag_master ]-cds_view_field. + ELSEIF line_exists( lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-etag_master ] ). + etag_master = lo_childnode->lt_additional_fields[ name = lo_childnode->field_name-etag_master ]-cds_view_field. + ENDIF. + + IF etag_master IS NOT INITIAL. + item_characteristics->etag->set_master( etag_master ). + ELSE. + item_characteristics->etag->set_dependent_by( '_' && lo_childnode->root_node->rap_node_objects-alias ). + ENDIF. + + " Characteristics. + IF lo_childnode->is_grand_child_or_deeper( ). + + item_characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias ) + )->set_implementation_class( lo_childnode->rap_node_objects-behavior_implementation + )->lock->set_dependent_by( '_' && lo_childnode->root_node->rap_node_objects-alias ). + + "@todo add again once setting of + "authorization master(global) + "is allowed + "IF lo_childnode->root_node->is_virtual_root( ). +********************************************************************** +** Begin of deletion 2108 +********************************************************************** + "check if set authorization master(global) root node has been set to + "MASTER(global) or master(instance) + "only in this case child nodes can't be set as dependent_by + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'. + method_exists_in_interface-method_name = 'SET_MASTER_GLOBAL'. + + + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + DATA(item_authorization) = item_characteristics->authorization. + DATA(authorization_association) = |_{ lo_childnode->root_node->rap_node_objects-alias }|. + item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + "if setting authorization master(global) fails + "try authorization master(instance) + + IF method_exists_in_interface-method_exists = abap_false. + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'. + method_exists_in_interface-method_name = 'SET_MASTER_INSTANCE'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + + item_authorization = item_characteristics->authorization. + authorization_association = |_{ lo_childnode->root_node->rap_node_objects-alias }|. + item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ). + + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + ENDIF. + + + +* item_characteristics->authorization->set_dependent_by( '_' && lo_childnode->root_node->rap_node_objects-alias ). +* "ENDIF. +* +********************************************************************** +** end of deletion 2108 +********************************************************************** + + + CASE lo_childnode->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ). + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + "nothing to do + ENDCASE. + + + + "add association to parent node + assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + "add association to root node + assoc = lo_item_behavior->add_association( '_' && lo_childnode->root_node->rap_node_objects-alias ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + IF lo_childnode->root_node->is_customizing_table = abap_true. + item_characteristics->set_with_additional_save( ). + ENDIF. + + ELSEIF lo_childnode->is_child( ). + + item_characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias ) + )->set_implementation_class( lo_childnode->rap_node_objects-behavior_implementation + )->lock->set_dependent_by( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + + + "@todo add again once setting of + "authorization master(global) + "is allowed +********************************************************************** +** Begin of deletion 2108 +********************************************************************** + + "check if set authorization master(global) root node has been set to + "MASTER(global) or master(instance) + "only in this case child nodes can't be set as dependent_by + + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'. + method_exists_in_interface-method_name = 'SET_MASTER_GLOBAL'. + "if root node can't be set as MASTER GLOBAL child nodes can't be set as dependent_by + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + item_authorization = item_characteristics->authorization. + authorization_association = |_{ lo_childnode->root_node->rap_node_objects-alias }|. + item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ). + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + + IF method_exists_in_interface-method_exists = abap_false. + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_fo_b_auth'. + method_exists_in_interface-method_name = 'SET_MASTER_INSTANCE'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + + item_authorization = item_characteristics->authorization. + authorization_association = |_{ lo_childnode->root_node->rap_node_objects-alias }|. + item_authorization->set_dependent_by( CONV sxco_cds_association_name( authorization_association ) ). + + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + + ENDIF. + + +* item_characteristics->authorization->set_dependent_by( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + +********************************************************************** +** end of deletion 2108 +********************************************************************** + + IF lo_childnode->root_node->is_customizing_table = abap_true. + item_characteristics->set_with_additional_save( ). + ENDIF. + + + CASE lo_childnode->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + item_characteristics->set_persistent_table( CONV sxco_dbt_object_name( lo_childnode->persistent_table_name ) ). + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + "set no persistent table + ENDCASE. + + + "add association to parent node + assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + ELSE. + "should not happen + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + MESSAGE ID 'ZDMO_CM_RAP_GEN_MSG' TYPE 'E' NUMBER '001' + WITH lo_childnode->entityname lo_childnode->root_node->entityname. + + ENDIF. + + + IF lo_childnode->has_childs( ). + LOOP AT lo_childnode->childnodes INTO DATA(lo_grandchildnode). + assoc = lo_item_behavior->add_association( '_' && lo_grandchildnode->rap_node_objects-alias ). + assoc->set_create_enabled( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ENDLOOP. + ENDIF. + + "child nodes only offer update and delete and create by assocation + lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update ). + lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete ). + + + +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + IF io_rap_bo_node->is_customizing_table = abap_true. + + lv_validation_name = |val_transport| . + + DATA(item_validation) = lo_item_behavior->add_validation( CONV #( lv_validation_name ) ). + "'val_transport' + item_validation->set_time( xco_cp_behavior_definition=>evaluation->time->on_save ). + +* trigger_operations = VALUE #( +* ( xco_cp_behavior_definition=>evaluation->trigger_operation->create ) +* ( xco_cp_behavior_definition=>evaluation->trigger_operation->update ) +* "( xco_cp_behavior_definition=>evaluation->trigger_operation->delete ) +* ). + + CLEAR trigger_operations. + ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('CREATE') TO <fs_create>. + ASSIGN xco_cp_behavior_definition=>evaluation->trigger_operation->('UPDATE') TO <fs_update>. + + + IF <fs_create> IS ASSIGNED. + APPEND <fs_create> TO trigger_operations. + ENDIF. + IF <fs_update> IS ASSIGNED. + APPEND <fs_update> TO trigger_operations. + ENDIF. + + IF xco_api->method_exists_in_interface( + interface_name = 'if_xco_gen_bdef_s_fo_b_validtn' + method_name = 'SET_TRIGGER_OPERATIONS' + ). + +* todo: dynamic call currently fails +* CALL METHOD item_validation->('SET_TRIGGER_OPERATIONS') +* IMPORTING +* it_trigger_operations = trigger_operations. + + item_validation->set_trigger_operations( trigger_operations ). + + ENDIF. + ENDIF. +********************************************************************** +** End of deletion 2020 +********************************************************************** + + + CASE lo_childnode->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + "determination CalculateSemanticKey on modify { create; } + lv_determination_name = 'Calculate' && lo_childnode->object_id_cds_field_name. + + lo_item_behavior->add_determination( CONV #( lv_determination_name ) + )->set_time( xco_cp_behavior_definition=>evaluation->time->on_save + )->set_trigger_operations( VALUE #( ( xco_cp_behavior_definition=>evaluation->trigger_operation->create ) ) ). + + LOOP AT lt_mapping_item INTO ls_mapping_item. + CASE ls_mapping_item-dbtable_field. + WHEN lo_childnode->field_name-uuid. + lo_item_behavior->add_field( ls_mapping_item-cds_view_field + )->set_numbering_managed( )->set_read_only( ). + WHEN lo_childnode->field_name-parent_uuid OR + lo_childnode->field_name-root_uuid. + lo_item_behavior->add_field( ls_mapping_item-cds_view_field )->set_read_only( ). + + WHEN lo_childnode->object_id. + lo_item_behavior->add_field( ls_mapping_item-cds_view_field )->set_read_only( ). + + ENDCASE. + ENDLOOP. + + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + + "key field is not set as read only since at this point we assume + "that the key is set externally + + IF lo_childnode->root_node->is_virtual_root( ). + lo_item_behavior->add_field( lo_childnode->singleton_field_name )->set_read_only( ). + ENDIF. + + + + LOOP AT lo_childnode->lt_fields INTO DATA(ls_fields) + WHERE key_indicator = abap_true AND name <> lo_childnode->field_name-client. + + DATA(key_field_behavior) = lo_item_behavior->add_field( ls_fields-cds_view_field ). + + "sematic key fields that are set via cba have to be read only. + "This are these key fields that are not part of the semantic key + "of the parent entity + "the remaining key fields have to be set as readonly:update + + IF line_exists( lo_childnode->parent_node->semantic_key[ name = ls_fields-name ] ). + + key_field_behavior->set_read_only( ). + + ELSE. + + IF xco_api->method_exists_in_interface( interface_name = 'if_xco_gen_bdef_s_fo_b_field' + method_name = 'SET_READONLY_UPDATE' ). + CALL METHOD key_field_behavior->('SET_READONLY_UPDATE'). + ENDIF. + + ENDIF. + + "lo_item_behavior->add_field( ls_fields-cds_view_field )->set_readonly_update( ). + ENDLOOP. + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + "make the key fields read only in the child entities + "Otherwise you get the warning + "The field "<semantic key of root node>" is used for "lock" dependency (in the ON clause of + "the association "_Travel"). This means it should be flagged as + "readonly / readonly:update". + + "LOOP AT lo_childnode->root_node->lt_fields INTO DATA(ls_fields) + LOOP AT lo_childnode->lt_fields INTO ls_fields + WHERE key_indicator = abap_true AND name <> lo_childnode->field_name-client. + lo_item_behavior->add_field( ls_fields-cds_view_field )->set_read_only( ). + ENDLOOP. + + + + ENDCASE. + + +* make administrative fields read-only +* field ( readonly ) +* CreatedAt, +* CreatedBy, +* LocalLastChangedAt, +* LastChangedAt, +* LastChangedBy; + + LOOP AT lo_childnode->lt_fields INTO ls_fields + WHERE name <> lo_childnode->field_name-client. + CASE ls_fields-name . + WHEN lo_childnode->field_name-created_at OR + lo_childnode->field_name-created_by OR + lo_childnode->field_name-local_instance_last_changed_at OR + lo_childnode->field_name-local_instance_last_changed_by OR + lo_childnode->field_name-last_changed_at OR + lo_childnode->field_name-last_changed_by. + lo_item_behavior->add_field( ls_fields-cds_view_field )->set_read_only( ). + ENDCASE. + ENDLOOP. + + IF lt_mapping_item IS NOT INITIAL. + CASE io_rap_bo_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + "use conv #( ) since importing parameter iv_database_table + "was of type sxco_dbt_object_name and has been changed to clike + "to support structure names longer than 16 characters as of 2111 + DATA(item_mapping) = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->persistent_table_name ) ). + item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item ). + IF io_rap_bo_node->is_extensible( ) = abap_true. + "item_mapping->set_extensible( )->set_corresponding( ). + set_extensible_for_mapping( item_mapping ). + ENDIF. + WHEN ZDMO_cl_rap_node=>implementation_type-managed_semantic. + item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->persistent_table_name ) ). + item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item ). + IF io_rap_bo_node->is_extensible( ) = abap_true. + "item_mapping->set_extensible( )->set_corresponding( ). + set_extensible_for_mapping( item_mapping ). + ENDIF. + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + "add control structure + IF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-table. + item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->persistent_table_name ) ). + item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item )->set_control( lo_childnode->rap_node_objects-control_structure ). + ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-structure. + item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->structure_name ) ). + item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item )->set_control( lo_childnode->rap_node_objects-control_structure ). + ELSEIF io_rap_bo_node->data_source_type = io_rap_bo_node->data_source_types-abap_type. + "structure name is added here since we only support abap types that are based on structures + item_mapping = lo_item_behavior->add_mapping_for( CONV #( lo_childnode->structure_name ) ). + item_mapping->set_field_mapping( it_field_mappings = lt_mapping_item )->set_control( lo_childnode->rap_node_objects-control_structure ). + ENDIF. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + "item_mapping->set_extensible( )->set_corresponding( ). + set_extensible_for_mapping( item_mapping ). + ENDIF. + + ENDCASE. + ENDIF. + + + + ENDLOOP. + + ENDIF. + + + ENDMETHOD. + + + METHOD create_bdef_i. + + "todo: add + " rap_root_node_objects-behavior_definition_i + " + + + DATA(lo_specification) = mo_put_operation->for-bdef->add_object( io_rap_bo_node->rap_root_node_objects-behavior_definition_i + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-behavior_definition_i. + generated_repository_object-object_type = 'BDEF'. + APPEND generated_repository_object TO generated_repository_objects. + + lo_specification->set_short_description( |Behavior for { io_rap_bo_node->rap_node_objects-cds_view_i }| + )->set_implementation_type( xco_cp_behavior_definition=>implementation_type->interface + ) ##no_text. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + lo_specification->set_extensible( ). +* IF xco_api->method_exists_in_interface( +* interface_name = 'if_xco_cp_gen_bdef_s_form' +* method_name = 'SET_USE_SIDE_EFFECTS' +* ). +* CALL METHOD lo_specification->('SET_USE_SIDE_EFFECTS'). +* ENDIF. + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. + ENDIF. + method_exists_in_interface-method_name = 'SET_USE_SIDE_EFFECTS'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name). + ENDIF. + ENDIF. +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + + IF io_rap_bo_node->draft_enabled = abap_true. + "if_xco_cp_gen_bdef_s_form + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. + ENDIF. + method_exists_in_interface-method_name = 'SET_USE_DRAFT'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name). + ENDIF. +* IF xco_api->method_exists_in_interface( +* interface_name = 'if_xco_cp_gen_bdef_s_form' +* method_name = 'SET_USE_DRAFT' +* ). +* CALL METHOD lo_specification->('SET_USE_DRAFT'). +* ENDIF. + ENDIF. +********************************************************************** +** End of deletion 2020 +********************************************************************** + + "strict statement is not used in bdef of interface view +* IF io_rap_bo_node->is_abstract_or_custom_entity( ) = abap_false. +* lo_specification->set_strict_n( zdmo_cl_rap_node=>strict_mode_2 ). +* IF xco_api->on_premise_branch_is_used( ). +* method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. +* ELSE. +* method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. +* ENDIF. +* +* method_exists_in_interface-method_name = 'SET_STRICT_N'. +* IF xco_api->method_exists_in_interface( +* interface_name = method_exists_in_interface-interface_name +* method_name = method_exists_in_interface-method_name +* ). +* CALL METHOD lo_specification->(method_exists_in_interface-method_name) +* EXPORTING +* iv_n = zdmo_cl_rap_node=>strict_mode_2. +* APPEND 'SET_STRICT_N' TO call_method_succeeded_list. +* method_exists_in_interface-method_exists = abap_true. +* ELSE. +* method_exists_in_interface-method_exists = abap_false. +* ENDIF. +* APPEND method_exists_in_interface TO method_exists_in_interfaces. +* "set_strict_n not found +* "try to set strict +* IF method_exists_in_interface-method_exists = abap_false. +* method_exists_in_interface-method_name = 'SET_STRICT'. +* IF xco_api->method_exists_in_interface( +* interface_name = method_exists_in_interface-interface_name +* method_name = method_exists_in_interface-method_name +* ). +* CALL METHOD lo_specification->(method_exists_in_interface-method_name). +* APPEND 'SET_STRICT' TO call_method_succeeded_list. +* method_exists_in_interface-method_exists = abap_true. +* ELSE. +* method_exists_in_interface-method_exists = abap_false. +* ENDIF. +* APPEND method_exists_in_interface TO method_exists_in_interfaces. +* ENDIF. +* ENDIF. + + DATA(lo_header_behavior) = lo_specification->add_behavior( io_rap_bo_node->rap_node_objects-cds_view_i ). + + " Characteristics. + + " Characteristics. + DATA(header_characteristics) = lo_header_behavior->characteristics. + + " extensibility on entity level is inherited from the R-layer +* IF io_rap_bo_node->is_extensible( ) = abap_true. +* header_characteristics->set_extensible( ). +* ENDIF. + + lo_header_behavior->characteristics->set_alias( CONV #( io_rap_bo_node->rap_node_objects-alias ) + ). + + lo_header_behavior->characteristics->etag->set_use( ) . + + IF io_rap_bo_node->draft_enabled = abap_true. + + "add the following actions in case draft is used + "follows the strict implementation principle + "use action Activate; + "use action Discard; + "use action Edit; + "use action Prepare; + "use action Resume; + + xco_api->todo( 'check if the following statements shall be executed or only if the following method exists' ). +* IF xco_api->method_exists_in_interface( +* interface_name = 'if_xco_gen_bdef_s_fo_b_action ' +* method_name = 'set_draft' +* ). + + lo_header_behavior->add_action( 'Edit' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Activate' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Discard' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Resume' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Prepare' )->set_use( ) ##no_text. + + + ENDIF. + + " Standard operations. + IF io_rap_bo_node->is_virtual_root( ) . + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ). + ELSE. + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create )->set_use( ). + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ). + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ). + ENDIF. + + IF io_rap_bo_node->is_virtual_root( ) = abap_true AND io_rap_bo_node->is_customizing_table = abap_true. + "use action selectTransport; + lo_header_behavior->add_action( iv_name = 'selectTransport' )->set_use( ). + ENDIF. + + + "use action Edit; + "if the Edit function is defined there is no need to implement a BIL + "IF io_rap_bo_node->draft_enabled = abap_true. + " lo_header_behavior->add_action( iv_name = 'Edit' )->set_use( ). + "ENDIF. + + IF io_rap_bo_node->has_childs( ). + + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + DATA(assoc) = lo_header_behavior->add_association( '_' && lo_childnode->rap_node_objects-alias ). + assoc->set_create_enabled( abap_true ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ENDLOOP. + + LOOP AT io_rap_bo_node->all_childnodes INTO lo_childnode. + + DATA(lo_item_behavior) = lo_specification->add_behavior( lo_childnode->rap_node_objects-cds_view_i ). + + " Characteristics. + lo_item_behavior->characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias ) + ). + + " Characteristics. + DATA(item_characteristics) = lo_item_behavior->characteristics. + + "extensibility on entity level is inherited from the r-layer +* IF io_rap_bo_node->is_extensible( ) = abap_true. +* item_characteristics->set_extensible( ). +* ENDIF. + + lo_item_behavior->characteristics->etag->set_use( ) . + + " Standard operations. + lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ). + lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ). + + "add association to parent and root views + "e.g. use association _Travel { with draft; } + + IF lo_childnode->is_grand_child_or_deeper( ). + + "publish association to root + assoc = lo_item_behavior->add_association( '_' && lo_childnode->root_node->rap_node_objects-alias ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + "publish association to parent + assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + ELSEIF lo_childnode->is_child( ). + "lo_item_behavior->add_association( mo_assoc_to_header )->set_use( ). + "'_' && lo_childnode->parent_node->rap_node_objects-alias + + "publish association to parent + assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ELSE. + + "for a root node nothing has to be added here + + ENDIF. + + "publish draft enabled associations to all child nodes of node + "e.g. use association _Booking { create; with draft; } + + IF lo_childnode->has_childs( ). + LOOP AT lo_childnode->childnodes INTO DATA(lo_grandchildnode). + assoc = lo_item_behavior->add_association( iv_name = '_' && lo_grandchildnode->rap_node_objects-alias ). + assoc->set_create_enabled( ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ENDLOOP. + ENDIF. + + ENDLOOP. + + ENDIF. + + ENDMETHOD. + + + METHOD create_bdef_p. + DATA(lo_specification) = mo_put_operation->for-bdef->add_object( io_rap_bo_node->rap_root_node_objects-behavior_definition_p + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-behavior_definition_p. + generated_repository_object-object_type = 'BDEF'. + APPEND generated_repository_object TO generated_repository_objects. + + lo_specification->set_short_description( |Behavior for { io_rap_bo_node->rap_node_objects-cds_view_p }| + )->set_implementation_type( xco_cp_behavior_definition=>implementation_type->projection + ) ##no_text. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + lo_specification->set_extensible( ). + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. + ENDIF. + method_exists_in_interface-method_name = 'SET_USE_SIDE_EFFECTS'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name). + ENDIF. + ENDIF. +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + + IF io_rap_bo_node->draft_enabled = abap_true. + "if_xco_cp_gen_bdef_s_form + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. + ENDIF. + method_exists_in_interface-method_name = 'SET_USE_DRAFT'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name). + ENDIF. +* IF xco_api->method_exists_in_interface( +* interface_name = 'if_xco_cp_gen_bdef_s_form' +* method_name = 'SET_USE_DRAFT' +* ). +* CALL METHOD lo_specification->('SET_USE_DRAFT'). +* ENDIF. + ENDIF. +********************************************************************** +** End of deletion 2020 +********************************************************************** + + "use the highest recommended strict mode + IF io_rap_bo_node->is_abstract_or_custom_entity( ) = abap_false. +* lo_specification->set_strict_n( zdmo_cl_rap_node=>strict_mode_2 ). + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_bdef_s_form'. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_bdef_s_form'. + ENDIF. + + method_exists_in_interface-method_name = 'SET_STRICT_N'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name) + EXPORTING + iv_n = zdmo_cl_rap_node=>strict_mode_2. + APPEND 'SET_STRICT_N' TO call_method_succeeded_list. + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + "set_strict_n not found + "try to set strict + IF method_exists_in_interface-method_exists = abap_false. + method_exists_in_interface-method_name = 'SET_STRICT'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name). + APPEND 'SET_STRICT' TO call_method_succeeded_list. + method_exists_in_interface-method_exists = abap_true. + ELSE. + method_exists_in_interface-method_exists = abap_false. + ENDIF. + APPEND method_exists_in_interface TO method_exists_in_interfaces. + ENDIF. + ENDIF. + + DATA(lo_header_behavior) = lo_specification->add_behavior( io_rap_bo_node->rap_node_objects-cds_view_p ). + + " Characteristics. + + " Characteristics. + DATA(header_characteristics) = lo_header_behavior->characteristics. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + header_characteristics->set_extensible( ). + ENDIF. + + lo_header_behavior->characteristics->set_alias( CONV #( io_rap_bo_node->rap_node_objects-alias ) + ). + + lo_header_behavior->characteristics->etag->set_use( ) . + + IF io_rap_bo_node->draft_enabled = abap_true. + + "add the following actions in case draft is used + "follows the strict implementation principle + "use action Activate; + "use action Discard; + "use action Edit; + "use action Prepare; + "use action Resume; + + xco_api->todo( 'check if the following statements shall be executed or only if the following method exists' ). +* IF xco_api->method_exists_in_interface( +* interface_name = 'if_xco_gen_bdef_s_fo_b_action ' +* method_name = 'set_draft' +* ). + + lo_header_behavior->add_action( 'Edit' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Activate' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Discard' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Resume' )->set_use( ) ##no_text. + lo_header_behavior->add_action( 'Prepare' )->set_use( ) ##no_text. + + + ENDIF. + + " Standard operations. + IF io_rap_bo_node->is_virtual_root( ) . + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ). + ELSE. + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->create )->set_use( ). + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ). + lo_header_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ). + ENDIF. + + IF io_rap_bo_node->is_virtual_root( ) = abap_true AND io_rap_bo_node->is_customizing_table = abap_true. + "use action selectTransport; + lo_header_behavior->add_action( iv_name = 'selectTransport' )->set_use( ). + ENDIF. + + + "use action Edit; + "if the Edit function is defined there is no need to implement a BIL + "IF io_rap_bo_node->draft_enabled = abap_true. + " lo_header_behavior->add_action( iv_name = 'Edit' )->set_use( ). + "ENDIF. + + IF io_rap_bo_node->has_childs( ). + + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + DATA(assoc) = lo_header_behavior->add_association( '_' && lo_childnode->rap_node_objects-alias ). + assoc->set_create_enabled( abap_true ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ENDLOOP. + + LOOP AT io_rap_bo_node->all_childnodes INTO lo_childnode. + + DATA(lo_item_behavior) = lo_specification->add_behavior( lo_childnode->rap_node_objects-cds_view_p ). + + " Characteristics. + lo_item_behavior->characteristics->set_alias( CONV #( lo_childnode->rap_node_objects-alias ) + ). + + " Characteristics. + DATA(item_characteristics) = lo_item_behavior->characteristics. + + IF io_rap_bo_node->is_extensible( ) = abap_true. + item_characteristics->set_extensible( ). + ENDIF. + + lo_item_behavior->characteristics->etag->set_use( ) . + + " Standard operations. + lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->update )->set_use( ). + lo_item_behavior->add_standard_operation( xco_cp_behavior_definition=>standard_operation->delete )->set_use( ). + + "add association to parent and root views + "e.g. use association _Travel { with draft; } + + IF lo_childnode->is_grand_child_or_deeper( ). + + "publish association to root + assoc = lo_item_behavior->add_association( '_' && lo_childnode->root_node->rap_node_objects-alias ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + "publish association to parent + assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + + ELSEIF lo_childnode->is_child( ). + "lo_item_behavior->add_association( mo_assoc_to_header )->set_use( ). + "'_' && lo_childnode->parent_node->rap_node_objects-alias + + "publish association to parent + assoc = lo_item_behavior->add_association( '_' && lo_childnode->parent_node->rap_node_objects-alias ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ELSE. + + "for a root node nothing has to be added here + + ENDIF. + + "publish draft enabled associations to all child nodes of node + "e.g. use association _Booking { create; with draft; } + + IF lo_childnode->has_childs( ). + LOOP AT lo_childnode->childnodes INTO DATA(lo_grandchildnode). + assoc = lo_item_behavior->add_association( iv_name = '_' && lo_grandchildnode->rap_node_objects-alias ). + assoc->set_create_enabled( ). + assoc->set_use( ). + assoc->set_draft_enabled( io_rap_bo_node->draft_enabled ). + ENDLOOP. + ENDIF. + + ENDLOOP. + + ENDIF. + + + ENDMETHOD. + + + METHOD create_bil. +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + + DATA source_method_save_modified TYPE if_xco_gen_clas_s_fo_i_method=>tt_source . + DATA source_method_validation TYPE if_xco_gen_clas_s_fo_i_method=>tt_source . + DATA source_method_get_inst_feat TYPE if_xco_gen_clas_s_fo_i_method=>tt_source . + DATA source_action_set_transport TYPE if_xco_gen_clas_s_fo_i_method=>tt_source . + DATA source_method_determ_object_id TYPE if_xco_gen_clas_s_fo_i_method=>tt_source . + DATA source_code_line LIKE LINE OF source_method_save_modified. + + DATA handler_has_method TYPE abap_bool. + DATA saver_has_method TYPE abap_bool. + + DATA local_handler_class_name TYPE sxco_ao_object_name. + DATA local_saver_class_name TYPE sxco_ao_object_name. + + handler_has_method = abap_false. + saver_has_method = abap_false. + + local_handler_class_name = |lhc_{ io_rap_bo_node->entityname }| . + local_saver_class_name = 'LCL_SAVER' . + + DATA(lo_specification) = mo_put_operation->for-clas->add_object( io_rap_bo_node->rap_node_objects-behavior_implementation + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-behavior_implementation. + generated_repository_object-object_type = 'CLAS'. + APPEND generated_repository_object TO generated_repository_objects. + + + lo_specification->set_short_description( 'Behavior implementation' ) ##no_text. + + "behavior has to be defined for the root node in all BIL classes + "to_upper( ) as workaround for 2011 and 2020, fix will be available with 2102 + lo_specification->definition->set_abstract( + )->set_for_behavior_of( to_upper( io_rap_bo_node->root_node->rap_node_objects-cds_view_r ) ). + +* DATA(lo_handler) = lo_specification->add_local_class( 'LCL_HANDLER' ). +* lo_handler->definition->set_superclass( 'CL_ABAP_BEHAVIOR_HANDLER' ). + + "a local class will only be created if there are methods + "that are generated as well + "otherwise we get the error + "The BEHAVIOR class "LCL_HANDLER" does not contain the BEHAVIOR method "MODIFY | READ". + + + DATA(lo_handler) = lo_specification->add_local_class( local_handler_class_name ). + lo_handler->definition->set_superclass( 'CL_ABAP_BEHAVIOR_HANDLER' ). + +********************************************************************** +** Begin of deletion 2108 +********************************************************************** + IF xco_api->method_exists_in_interface( + interface_name = 'if_xco_gen_clas_s_fo_d_c_m_bi' + method_name = 'SET_FOR_GLOBAL_AUTHORIZATION' + ). + IF io_rap_bo_node->is_root( ). " method get_global_authorizations + + DATA(lo_get_global_auth) = lo_handler->definition->section-private->add_method( method_get_glbl_authorizations ). + DATA(behavior_implementation) = lo_get_global_auth->behavior_implementation. + behavior_implementation->set_result( iv_result = 'result' ). + CALL METHOD behavior_implementation->('SET_FOR_GLOBAL_AUTHORIZATION'). + DATA(lo_request) = lo_get_global_auth->add_importing_parameter( ' ' ). + DATA(behavior_implementation_2) = lo_request->behavior_implementation. + behavior_implementation_2->set_for( iv_for = io_rap_bo_node->entityname ). + CALL METHOD behavior_implementation_2->('SET_REQUEST') + EXPORTING + iv_request = 'requested_authorizations'. + + lo_handler->implementation->add_method( method_get_glbl_authorizations ). + handler_has_method = abap_true. + ENDIF. + ENDIF. + +********************************************************************** +** End of deletion 2108 +********************************************************************** + + IF io_rap_bo_node->is_virtual_root( ). + + " method get_instance_features. + DATA(lo_get_features) = lo_handler->definition->section-private->add_method( method_get_instance_features ). + DATA(behavior_implementation_3) = lo_get_features->behavior_implementation. + behavior_implementation_3->set_result( iv_result = 'result' ). + + CALL METHOD behavior_implementation_3->('SET_FOR_INSTANCE_FEATURES'). + + DATA(lo_keys) = lo_get_features->add_importing_parameter( iv_name = 'keys' ). + + DATA(behavior_implementation_4) = lo_keys->behavior_implementation. + behavior_implementation_4->set_for( iv_for = io_rap_bo_node->entityname ). + CALL METHOD behavior_implementation_4->('SET_REQUEST') + EXPORTING + iv_request = 'requested_features'. + + lo_handler->implementation->add_method( method_get_instance_features ). + handler_has_method = abap_true. + + CLEAR source_method_get_inst_feat. + APPEND |READ ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO source_method_get_inst_feat ##no_text. + APPEND |ENTITY { io_rap_bo_node->entityname }| TO source_method_get_inst_feat ##no_text. + APPEND |ALL FIELDS WITH CORRESPONDING #( keys )| TO source_method_get_inst_feat ##no_text. + APPEND |RESULT DATA(all).| TO source_method_get_inst_feat ##no_text. + + APPEND |result = VALUE #( ( %tky = all[ 1 ]-%tky| TO source_method_get_inst_feat ##no_text. + APPEND | %action-selecttransport = COND #( WHEN all[ 1 ]-%is_draft = if_abap_behv=>mk-on THEN if_abap_behv=>mk-off| TO source_method_get_inst_feat ##no_text. + APPEND | ELSE if_abap_behv=>mk-on ) ) ).| TO source_method_get_inst_feat ##no_text. + + lo_handler->implementation->add_method( method_get_instance_features )->set_source( source_method_get_inst_feat ). + + DATA lv_action_name TYPE sxco_bdef_action_name . + lv_action_name = 'selectTransport' ##no_text. + + DATA(lo_transport) = lo_handler->definition->section-private->add_method( CONV #( lv_action_name ) ). + lo_transport->behavior_implementation->set_for_modify( ). + + DATA(lo_keys_transport) = lo_transport->add_importing_parameter( iv_name = 'keys' ). + lo_keys_transport->behavior_implementation->set_for_action( + EXPORTING + iv_entity_name = io_rap_bo_node->entityname + iv_action_name = lv_action_name +* RECEIVING +* ro_me = + ). + lo_transport->behavior_implementation->set_result( iv_result = 'result' ). + + + APPEND |MODIFY ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO source_action_set_transport ##no_text. + APPEND |ENTITY { io_rap_bo_node->entityname }| TO source_action_set_transport ##no_text. + APPEND |UPDATE FIELDS ( request hidetransport )| TO source_action_set_transport ##no_text. + APPEND |WITH VALUE #( FOR key IN keys| TO source_action_set_transport ##no_text. + APPEND | ( %tky = key-%tky| TO source_action_set_transport ##no_text. + APPEND | request = key-%param-transportrequestid| TO source_action_set_transport ##no_text. + APPEND | hidetransport = abap_false ) )| TO source_action_set_transport ##no_text. + APPEND | FAILED failed| TO source_action_set_transport ##no_text. + APPEND | REPORTED reported.| TO source_action_set_transport ##no_text. + APPEND | | TO source_action_set_transport ##no_text. + APPEND | | TO source_action_set_transport ##no_text. + APPEND | READ ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO source_action_set_transport ##no_text. + APPEND | ENTITY { io_rap_bo_node->entityname }| TO source_action_set_transport ##no_text. + APPEND | ALL FIELDS WITH CORRESPONDING #( keys )| TO source_action_set_transport ##no_text. + APPEND | RESULT DATA(singletons).| TO source_action_set_transport ##no_text. + APPEND | result = VALUE #( FOR singleton IN singletons| TO source_action_set_transport ##no_text. + APPEND | ( %tky = singleton-%tky| TO source_action_set_transport ##no_text. + APPEND | %param = singleton ) ).| TO source_action_set_transport ##no_text. + + lo_handler->implementation->add_method( CONV #( lv_action_name ) )->set_source( source_action_set_transport ). + handler_has_method = abap_true. + ENDIF. + + + + "add validations of transports + IF io_rap_bo_node->is_customizing_table = abap_true AND + io_rap_bo_node->is_virtual_root( ) = abap_false. + + "SELECT * FROM @io_rap_bo_node->lt_fields AS fields WHERE name = @io_rap_bo_node->field_name-uuid INTO TABLE @DATA(result_uuid). + + SELECT * FROM @io_rap_bo_node->lt_fields AS fields WHERE key_indicator = @abap_true + AND name <> @io_rap_bo_node->field_name-client INTO TABLE @DATA(key_fields). + + DATA(lv_validation_name) = |val_transport| . + + DATA(lo_val) = lo_handler->definition->section-private->add_method( CONV #( lv_validation_name ) ). + DATA(behavior_implementation_val) = lo_val->behavior_implementation. + CALL METHOD behavior_implementation_val->('SET_FOR_VALIDATE_ON_SAVE'). + DATA(lo_keys_validation) = lo_val->add_importing_parameter( iv_name = 'keys' ). + lo_keys_validation->behavior_implementation->set_for( iv_for = | { io_rap_bo_node->entityname }~{ lv_validation_name } | ). + + CLEAR source_method_validation. + " APPEND |CHECK lines( keys ) > 0.| TO source_method_validation. + + APPEND |DATA change TYPE REQUEST FOR CHANGE { io_rap_bo_node->root_node->rap_root_node_objects-behavior_definition_r }.| TO source_method_validation ##no_text. + APPEND |SELECT SINGLE request FROM { io_rap_bo_node->root_node->draft_table_name } INTO @DATA(request).| TO source_method_validation ##no_text. + APPEND |DATA(rap_transport_api) = mbc_cp_api=>rap_table_cts( table_entity_relations = VALUE #(| TO source_method_validation ##no_text. + LOOP AT io_rap_bo_node->root_node->all_childnodes INTO DATA(childnode). + APPEND | ( entity = '{ childnode->entityname }' table = '{ to_upper( childnode->table_name ) }' )| TO source_method_validation ##no_text. + ENDLOOP. + APPEND | ) ).| TO source_method_validation ##no_text. + + APPEND |rap_transport_api->validate_changes(| TO source_method_validation ##no_text. + APPEND | transport_request = request| TO source_method_validation ##no_text. + APPEND | table = '{ to_upper( io_rap_bo_node->table_name ) }'| TO source_method_validation ##no_text. + APPEND | keys = REF #( keys )| TO source_method_validation ##no_text. + APPEND | reported = REF #( reported )| TO source_method_validation ##no_text. + APPEND | failed = REF #( failed )| TO source_method_validation ##no_text. + APPEND | change = REF #( change-{ io_rap_bo_node->entityname } ) ).| TO source_method_validation ##no_text. + + + lo_handler->implementation->add_method( CONV #( lv_validation_name ) )->set_source( source_method_validation ). + handler_has_method = abap_true. + ENDIF. + + "add local saver class to record customizing data + IF io_rap_bo_node->is_customizing_table = abap_true AND + io_rap_bo_node->is_root( ) = abap_true. + + DATA(lo_saver) = lo_specification->add_local_class( local_saver_class_name ). + lo_saver->definition->set_superclass( 'CL_ABAP_BEHAVIOR_SAVER' ). + + lo_saver->definition->section-protected->add_method( cleanup_finalize )->set_redefinition( ). + lo_saver->implementation->add_method( cleanup_finalize ). + + + lo_saver->definition->section-protected->add_method( method_save_modified )->set_redefinition( ). + + CLEAR source_method_save_modified. + " APPEND | | TO source_method_save_modified. + + + APPEND |READ TABLE update-{ io_rap_bo_node->entityname } INDEX 1 INTO DATA(all).| TO source_method_save_modified ##no_text. + APPEND |SELECT SINGLE request FROM { io_rap_bo_node->root_node->draft_table_name } INTO @DATA(request).| TO source_method_save_modified ##no_text. + APPEND |DATA(result) = mbc_cp_api=>rap_table_cts( table_entity_relations = VALUE #(| TO source_method_save_modified ##no_text. + LOOP AT io_rap_bo_node->all_childnodes INTO DATA(child_node). + APPEND | ( entity = '{ child_node->entityname }' table = '{ child_node->table_name }' )| TO source_method_save_modified ##no_text. + ENDLOOP. + APPEND | ) ).| TO source_method_save_modified ##no_text. + + + APPEND |IF all-request IS NOT INITIAL.| TO source_method_save_modified ##no_text. + APPEND | result->record_changes(| TO source_method_save_modified ##no_text. + APPEND | EXPORTING| TO source_method_save_modified ##no_text. + APPEND | transport_request = request| TO source_method_save_modified ##no_text. + APPEND | create = REF #( create )| TO source_method_save_modified ##no_text. + APPEND | update = REF #( update )| TO source_method_save_modified ##no_text. + APPEND | delete = REF #( delete )| TO source_method_save_modified ##no_text. + APPEND | ).| TO source_method_save_modified ##no_text. + APPEND |ENDIF.| TO source_method_save_modified ##no_text. + + lo_saver->implementation->add_method( method_save_modified )->set_source( source_method_save_modified ). + + ENDIF. + +********************************************************************** +** End of deletion 2020 +********************************************************************** + + "in case of a semantic key scenario the keys are set externally + + + CASE io_rap_bo_node->get_implementation_type( ). + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + + DATA cba_method_name TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name . + DATA rba_method_name TYPE if_xco_gen_clas_s_fo_d_section=>tv_method_name . + + "method determination + DATA(lv_determination_name) = |Calculate{ io_rap_bo_node->object_id_cds_field_name }| ##no_text. + + DATA(lo_det) = lo_handler->definition->section-private->add_method( CONV #( lv_determination_name ) ). + DATA(Behavior_implementation_det) = lo_det->behavior_implementation. + CALL METHOD Behavior_implementation_det->('SET_FOR_DETERMINE_ON_SAVE'). + + DATA(lo_keys_determination) = lo_det->add_importing_parameter( iv_name = 'keys' ). + lo_keys_determination->behavior_implementation->set_for( iv_for = | { io_rap_bo_node->entityname }~{ lv_determination_name } | ). + + + " add dummy implementation to calculate object_id + CLEAR source_method_determ_object_id. + DATA cm TYPE c LENGTH 1. + cm = | |. + IF io_rap_bo_node->is_root( ) = abap_true. + + APPEND cm && |READ ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO source_method_determ_object_id ##no_text. + APPEND cm && | ENTITY { io_rap_bo_node->entityname }| TO source_method_determ_object_id ##no_text. + APPEND cm && | ALL FIELDS WITH CORRESPONDING #( keys )| TO source_method_determ_object_id ##no_text. + APPEND cm && | RESULT DATA(entities).| TO source_method_determ_object_id ##no_text. +* + APPEND cm && |DELETE entities WHERE { io_rap_bo_node->object_id_cds_field_name } IS NOT INITIAL.| TO source_method_determ_object_id ##no_text. + APPEND cm && |Check entities is not initial. | TO source_method_determ_object_id ##no_text. + APPEND cm && |"Dummy logic to determine object_id | TO source_method_determ_object_id ##no_text. + + "active table + APPEND cm && |SELECT MAX( { io_rap_bo_node->object_id } ) FROM { io_rap_bo_node->table_name } INTO @DATA(max_object_id). | TO source_method_determ_object_id ##no_text. + + APPEND cm && |"Add support for draft if used in modify | TO source_method_determ_object_id ##no_text. + APPEND cm && |"SELECT SINGLE FROM FROM { io_rap_bo_node->draft_table_name } FIELDS MAX( { io_rap_bo_node->object_id_cds_field_name } ) INTO @DATA(max_orderid_draft). "draft table | TO source_method_determ_object_id ##no_text. + APPEND cm && |"if max_orderid_draft > max_object_id | TO source_method_determ_object_id ##no_text. + APPEND cm && |" max_object_id = max_orderid_draft. | TO source_method_determ_object_id ##no_text. + APPEND cm && |"ENDIF. | TO source_method_determ_object_id ##no_text. + + APPEND cm && |MODIFY ENTITIES OF { io_rap_bo_node->rap_root_node_objects-behavior_definition_r } IN LOCAL MODE| TO source_method_determ_object_id ##no_text. + APPEND cm && | ENTITY { io_rap_bo_node->entityname }| TO source_method_determ_object_id ##no_text. + APPEND cm && | UPDATE FIELDS ( { io_rap_bo_node->object_id_cds_field_name } )| TO source_method_determ_object_id ##no_text. + APPEND cm && | WITH VALUE #( FOR entity IN entities INDEX INTO i ( | TO source_method_determ_object_id ##no_text. + APPEND cm && | %tky = entity-%tky | TO source_method_determ_object_id ##no_text. + APPEND cm && | { io_rap_bo_node->object_id_cds_field_name } = max_object_id + i | TO source_method_determ_object_id ##no_text. + APPEND cm && |) ). | TO source_method_determ_object_id ##no_text. + + ENDIF. + + lo_handler->implementation->add_method( CONV #( lv_determination_name ) )->set_source( source_method_determ_object_id ). + handler_has_method = abap_true. + + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic. + + IF io_rap_bo_node->is_root( ). + DATA(lo_method) = lo_handler->definition->section-private->add_method( method_create ). + lo_method->behavior_implementation->set_for_modify( ). + DATA(lo_import_parameter) = lo_method->add_importing_parameter( iv_name = 'entities' ). + lo_import_parameter->behavior_implementation->set_for_create( iv_entity_name = | { io_rap_bo_node->entityname } | ). + lo_handler->implementation->add_method( method_create ). + handler_has_method = abap_true. + ENDIF. + + lo_method = lo_handler->definition->section-private->add_method( method_update ). + lo_method->behavior_implementation->set_for_modify( ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'entities' ). + lo_import_parameter->behavior_implementation->set_for_update( iv_entity_name = | { io_rap_bo_node->entityname } | ). + lo_handler->implementation->add_method( method_update ). + handler_has_method = abap_true. + + lo_method = lo_handler->definition->section-private->add_method( method_delete ). + lo_method->behavior_implementation->set_for_modify( ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'keys' ). + lo_import_parameter->behavior_implementation->set_for_delete( iv_entity_name = | { io_rap_bo_node->entityname } | ). + lo_handler->implementation->add_method( method_delete ). + handler_has_method = abap_true. + + IF io_rap_bo_node->is_root( ). + lo_method = lo_handler->definition->section-private->add_method( method_lock ). + lo_method->behavior_implementation->set_for_lock( ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'keys' ). + lo_import_parameter->behavior_implementation->set_for_lock( iv_entity_name = | { io_rap_bo_node->entityname } | ). + lo_handler->implementation->add_method( method_lock ). + handler_has_method = abap_true. + ENDIF. + + lo_method = lo_handler->definition->section-private->add_method( method_read ). + lo_method->behavior_implementation->set_for_read( )->set_result( 'result' ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = 'keys' ). + lo_import_parameter->behavior_implementation->set_for_read( iv_entity_name = | { io_rap_bo_node->entityname } | ). + lo_handler->implementation->add_method( method_read ). + handler_has_method = abap_true. + + IF io_rap_bo_node->is_child( ) = abap_true OR + io_rap_bo_node->is_grand_child_or_deeper( ) = abap_true. + + rba_method_name = |{ method_rba }_{ io_rap_bo_node->parent_node->entityname }|. + lo_method = lo_handler->definition->section-private->add_method( rba_method_name ). + lo_method->behavior_implementation->set_for_read( )->set_result( 'result' )->set_link( 'association_links' )->set_full( 'result_requested' ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = |keys_{ method_rba } | ). + lo_import_parameter->behavior_implementation->set_for_read( iv_entity_name = | { io_rap_bo_node->entityname }\\_{ io_rap_bo_node->parent_node->entityname } | ). + lo_handler->implementation->add_method( rba_method_name ). + handler_has_method = abap_true. + + ENDIF. + + LOOP AT io_rap_bo_node->childnodes INTO childnode. + + lo_method = lo_handler->definition->section-private->add_method( |{ method_cba }_{ childnode->entityname }| ). + lo_method->behavior_implementation->set_for_modify( ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = |entities_{ method_cba } | ). + lo_import_parameter->behavior_implementation->set_for_create( iv_entity_name = | { io_rap_bo_node->entityname }\\_{ childnode->entityname } | ). + lo_handler->implementation->add_method( |{ method_cba }_{ childnode->entityname }| ). + handler_has_method = abap_true. + + rba_method_name = |{ method_rba }_{ childnode->entityname }|. + lo_method = lo_handler->definition->section-private->add_method( rba_method_name ). + lo_method->behavior_implementation->set_for_read( )->set_result( 'result' )->set_link( 'association_links' )->set_full( 'result_requested' ). + lo_import_parameter = lo_method->add_importing_parameter( iv_name = |keys_{ method_rba } | ). + lo_import_parameter->behavior_implementation->set_for_read( iv_entity_name = | { io_rap_bo_node->entityname }\\_{ childnode->entityname } | ). + lo_handler->implementation->add_method( rba_method_name ). + handler_has_method = abap_true. + + ENDLOOP. + + IF io_rap_bo_node->is_root( ). + lo_saver = lo_specification->add_local_class( |LCL_{ io_rap_bo_node->rap_root_node_objects-behavior_definition_r }| ). + lo_saver->definition->set_superclass( 'CL_ABAP_BEHAVIOR_SAVER' ). + saver_has_method = abap_true. + + lo_saver->definition->section-protected->add_method( method_finalize )->set_redefinition( ). + lo_saver->implementation->add_method( method_finalize ). + + lo_saver->definition->section-protected->add_method( method_check_before_save )->set_redefinition( ). + lo_saver->implementation->add_method( method_check_before_save ). + + lo_saver->definition->section-protected->add_method( method_save )->set_redefinition( ). + lo_saver->implementation->add_method( method_save ). + + lo_saver->definition->section-protected->add_method( method_cleanup )->set_redefinition( ). + lo_saver->implementation->add_method( method_cleanup ). + + lo_saver->definition->section-protected->add_method( method_cleanup_finalize )->set_redefinition( ). + lo_saver->implementation->add_method( method_cleanup_finalize ). + ENDIF. + ENDCASE. + + + DATA(implementation) = lo_handler->implementation. + + DATA(definition) = lo_handler->definition. + + "remove implementation if no method is there + IF handler_has_method = abap_false AND lo_handler IS NOT INITIAL. + lo_specification->remove_local_class( local_handler_class_name ). + ENDIF. + IF saver_has_method = abap_false AND lo_saver IS NOT INITIAL. + lo_specification->remove_local_class( local_saver_class_name ). + ENDIF. + + ENDMETHOD. + + + METHOD create_condition. + + DATA lo_expression TYPE REF TO if_xco_ddl_expr_condition. + + LOOP AT it_condition_components INTO DATA(ls_condition_components). + DATA(lo_projection_field) = xco_cp_ddl=>field( ls_condition_components-projection_field )->of_projection( ). + DATA(lo_association_field) = xco_cp_ddl=>field( ls_condition_components-association_field )->of( CONV #( ls_condition_components-association_name ) ). + + DATA(lo_condition) = lo_projection_field->eq( lo_association_field ). + + IF lo_expression IS INITIAL. + lo_expression = lo_condition. + ELSE. + lo_expression = lo_expression->and( lo_condition ). + ENDIF. + + ro_expression = lo_expression. + + ENDLOOP. + + ENDMETHOD. + + + METHOD create_control_structure. + + DATA lv_control_structure_name TYPE sxco_ad_object_name . + lv_control_structure_name = to_upper( io_rap_bo_node->rap_node_objects-control_structure ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = lv_control_structure_name. + generated_repository_object-object_type = 'TABL'. + APPEND generated_repository_object TO generated_repository_objects. + + DATA(lo_specification) = mo_put_operation->for-tabl-for-structure->add_object( lv_control_structure_name + )->set_package( mo_package + )->create_form_specification( ). + + "create a view entity + lo_specification->set_short_description( |Control structure for { io_rap_bo_node->rap_node_objects-alias }| ) ##no_text. + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE key_indicator <> abap_true AND name IS NOT INITIAL. + lo_specification->add_component( ls_header_fields-name + )->set_type( xco_cp_abap_dictionary=>data_element( 'xsdboolean' ) ). + ENDLOOP. + + ENDMETHOD. + + + METHOD create_custom_entity. +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + DATA ls_condition_components TYPE ts_condition_components. + DATA lt_condition_components TYPE tt_condition_components. + DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field . + DATA pos TYPE i. + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-custom_entity + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-custom_entity. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + "create a custom entity + DATA(lo_view) = lo_specification->set_short_description( |CDS View for { io_rap_bo_node->rap_node_objects-alias }| + )->add_custom_entity( ) ##no_text. + + " Annotations can be added to custom entities. + lo_view->add_annotation( 'ObjectModel.query.implementedBy' )->value->build( )->add_string( |ABAP:{ to_upper( io_rap_bo_node->rap_node_objects-custom_query_impl_class ) }| ). + + "@ObjectModel.query.implementedBy:'ABAP:ZDMO_CL_TRAVEL_UQ' + + "in contrast to MDE the annotations are not added to the specification but to the view + add_annotation_ui_header( + EXPORTING + io_specification = lo_view + io_rap_bo_node = io_rap_bo_node + ). + + + + "Client field does not need to be specified in client-specific CDS view + + CLEAR pos. + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client . " co_client. + + pos += 10. + + IF ls_header_fields-key_indicator = abap_true. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) + )->set_key( ). "->set_alias( ls_header_fields-cds_view_field ). + ELSE. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) + ). "->set_alias( ls_header_fields-cds_view_field ). + ENDIF. + + IF ls_header_fields-is_data_element = abap_true. + lo_field->set_type( xco_cp_abap_dictionary=>data_element( ls_header_fields-data_element ) ). + ENDIF. + IF ls_header_fields-is_built_in_type = abAP_TRUE. + lo_field->set_type( xco_cp_abap_dictionary=>built_in_type->for( + iv_type = CONV #( ls_header_fields-built_in_type ) + iv_length = ls_header_fields-built_in_type_length + iv_decimals = ls_header_fields-built_in_type_decimals + ) ). + ENDIF. + + "add @Semantics annotation for currency code + IF ls_header_fields-currencycode IS NOT INITIAL. + READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = to_upper( ls_header_fields-currencycode ). + IF sy-subrc = 0. + "for example @Semantics.amount.currencyCode: 'CurrencyCode' + lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + "add @Semantics annotation for unit of measure + IF ls_header_fields-unitofmeasure IS NOT INITIAL. + CLEAR ls_field. + READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ). + IF sy-subrc = 0. + "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + CASE ls_header_fields-name. + WHEN io_rap_bo_node->field_name-created_at. + lo_field->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-created_by. + lo_field->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-last_changed_at. + lo_field->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-last_changed_by. + lo_field->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-local_instance_last_changed_at. + lo_field->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-local_instance_last_changed_by. + lo_field->add_annotation( 'Semantics.user.localInstanceLastChangedBy' )->value->build( )->add_boolean( abap_true ). + ENDCASE. + + "add UI annotations + + "put facet annotation in front of the first field + IF pos = 10. + add_annotation_ui_facets( + EXPORTING + io_field = lo_field + io_rap_bo_node = io_rap_bo_node + ). + ENDIF. + IF ls_header_fields-is_hidden = abap_true. + add_anno_ui_hidden( + EXPORTING + io_field = lo_field + ls_header_fields = ls_header_fields + ). + ELSE. + add_anno_ui_lineitem( + EXPORTING + io_field = lo_field + ls_header_fields = ls_header_fields + position = pos + ). + + add_anno_ui_identification( + EXPORTING + io_field = lo_field + io_rap_bo_node = io_rap_bo_node + ls_header_fields = ls_header_fields + position = pos + ). + + "add selection fields for semantic key fields or for the fields that are marked as object id + add_annotation_ui_selectionfld( + EXPORTING + io_field = lo_field + io_rap_bo_node = io_rap_bo_node + ls_header_fields = ls_header_fields + position = pos + ). + + ENDIF. + + ENDLOOP. + + IF io_rap_bo_node->is_root( ). + lo_view->set_root( ). + ELSE. + + CASE io_rap_bo_node->get_implementation_type( ) . + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic . + + CLEAR ls_condition_components. + CLEAR lt_condition_components. + + LOOP AT io_rap_bo_node->parent_node->semantic_key INTO DATA(ls_semantic_key). + ls_condition_components-association_name = '_' && io_rap_bo_node->parent_node->rap_node_objects-alias. + ls_condition_components-association_field = ls_semantic_key-cds_view_field. + ls_condition_components-projection_field = ls_semantic_key-cds_view_field. + APPEND ls_condition_components TO lt_condition_components. + ENDLOOP. + + DATA(lo_condition) = create_condition( lt_condition_components ). + + ENDCASE. + + lo_field = lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) ). + lo_field->create_association( io_rap_bo_node->parent_node->rap_node_objects-custom_entity + " )->set_cardinality( xco_cp_cds=>cardinality->one_to_n + )->set_condition( lo_condition )->set_to_parent( ). + + IF io_rap_bo_node->is_grand_child_or_deeper( ). + + CASE io_rap_bo_node->get_implementation_type( ) . + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic . + + CLEAR ls_condition_components. + CLEAR lt_condition_components. + + LOOP AT io_rap_bo_node->ROOT_node->semantic_key INTO DATA(ls_root_semantic_key). + ls_condition_components-association_name = '_' && io_rap_bo_node->root_node->rap_node_objects-alias. + ls_condition_components-association_field = ls_root_semantic_key-cds_view_field. + ls_condition_components-projection_field = ls_root_semantic_key-cds_view_field. + APPEND ls_condition_components TO lt_condition_components. + ENDLOOP. + + lo_condition = create_condition( lt_condition_components ). + + ENDCASE. + + lo_field = lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) ). + lo_field->create_association( io_rap_bo_node->root_node->rap_node_objects-custom_entity + )->set_cardinality( xco_cp_cds=>cardinality->one + )->set_condition( lo_condition ). + + ENDIF. + + ENDIF. + + " Data source. + + IF io_rap_bo_node->has_childs( ). " create_item_objects( ). + " Composition. + + "change to a new property "childnodes" which only contains the direct childs + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + + " Sample field with composition: + lo_field = lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) ). + lo_field->create_composition( lo_childnode->rap_node_objects-custom_entity + )->set_cardinality( xco_cp_cds=>cardinality->zero_to_n ). + + + + ENDLOOP. + + ENDIF. + + + "add associations + + LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation). + + CLEAR ls_condition_components. + CLEAR lt_condition_components. + LOOP AT ls_assocation-condition_components INTO DATA(ls_components). + ls_condition_components-association_field = ls_components-association_field. + ls_condition_components-projection_field = ls_components-projection_field. + ls_condition_components-association_name = ls_assocation-name. + APPEND ls_condition_components TO lt_condition_components. + ENDLOOP. + + lo_condition = create_condition( lt_condition_components ). + + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ). + + DATA(lo_association) = lo_field->create_association( io_rap_bo_node->parent_node->rap_node_objects-cds_view_r + " )->set_cardinality( xco_cp_cds=>cardinality->one_to_n + )->set_condition( lo_condition ). + + CASE ls_assocation-cardinality . + WHEN ZDMO_cl_rap_node=>cardinality-one. + lo_association->set_cardinality( xco_cp_cds=>cardinality->one ). + WHEN ZDMO_cl_rap_node=>cardinality-one_to_n. + lo_association->set_cardinality( xco_cp_cds=>cardinality->one_to_n ). + WHEN ZDMO_cl_rap_node=>cardinality-zero_to_n. + lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_n ). + WHEN ZDMO_cl_rap_node=>cardinality-zero_to_one. + lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_one ). + WHEN ZDMO_cl_rap_node=>cardinality-one_to_one. + "@todo: currently association[1] will be generated + "fix available with 2008 HFC2 + lo_association->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) ). + ENDCASE. + + ENDLOOP. + + LOOP AT io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_restricted_reuse_view = abap_true. + lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( additional_fields-name ) ). + IF additional_fields-cds_view_field IS NOT INITIAL. + lo_Field->set_alias( additional_fields-cds_view_field ). + ENDIF. + ENDLOOP. +********************************************************************** +** End of deletion 2020 +********************************************************************** + ENDMETHOD. + + + METHOD create_custom_query. + + + DATA source_method_select TYPE if_xco_gen_clas_s_fo_i_method=>tt_source . + + DATA(lo_specification) = mo_put_operation->for-clas->add_object( io_rap_bo_node->rap_node_objects-custom_query_impl_class + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-custom_query_impl_class. + generated_repository_object-object_type = 'CLAS'. + APPEND generated_repository_object TO generated_repository_objects. + + CLEAR source_method_select. + + APPEND |DATA business_data TYPE TABLE OF { io_rap_bo_node->rap_node_objects-custom_entity }. | TO source_method_select ##no_text. + APPEND |DATA query_result TYPE TABLE OF { io_rap_bo_node->data_source_name }. | TO source_method_select ##no_text. + APPEND |DATA total_number_of_records type int8.| TO source_method_select ##no_text. + APPEND |DATA(top) = io_request->get_paging( )->get_page_size( ). | TO source_method_select ##no_text. + APPEND |DATA(skip) = io_request->get_paging( )->get_offset( ).| TO source_method_select ##no_text. + APPEND |DATA(requested_fields) = io_request->get_requested_elements( ).| TO source_method_select ##no_text. + APPEND |DATA(sort_order) = io_request->get_sort_elements( ).| TO source_method_select ##no_text. + APPEND |TRY.| TO source_method_select ##no_text. + APPEND | DATA(filter_condition) = io_request->get_filter( )->get_as_ranges( ).| TO source_method_select ##no_text. + APPEND | DATA(filter_string) = io_request->get_filter( )->get_as_sql_string( ).| TO source_method_select ##no_text. + APPEND | "Here you have to implement your custom query| TO source_method_select ##no_text. + APPEND | "and store the result in the internal table query_result| TO source_method_select ##no_text. + IF io_rap_bo_node->lt_mapping IS NOT INITIAL. + APPEND | business_data = CORRESPONDING #( query_result MAPPING| TO source_method_select ##no_text. + LOOP AT io_rap_bo_node->lt_mapping INTO DATA(mapping_line). + APPEND | { mapping_line-cds_view_field } = { mapping_line-dbtable_field }| TO source_method_select ##no_text. + ENDLOOP. + APPEND | ).| TO source_method_select ##no_text. + ENDIF. + + APPEND | | TO source_method_select ##no_text. + + APPEND | IF top IS NOT INITIAL and top > 0.| TO source_method_select ##no_text. + APPEND | DATA(max_index) = top + skip.| TO source_method_select ##no_text. + APPEND | ELSE. | TO source_method_select ##no_text. + APPEND | max_index = 0. | TO source_method_select ##no_text. + APPEND | ENDIF. | TO source_method_select ##no_text. + APPEND | | TO source_method_select ##no_text. + APPEND | SELECT * FROM @business_data AS data_source_fields | TO source_method_select ##no_text. + APPEND | WHERE (filter_string)| TO source_method_select ##no_text. + APPEND | INTO TABLE @business_data| TO source_method_select ##no_text. + APPEND | UP TO @max_index ROWS.| TO source_method_select ##no_text. + APPEND | | TO source_method_select ##no_text. + APPEND | | TO source_method_select ##no_text. + APPEND | IF skip IS NOT INITIAL. | TO source_method_select ##no_text. + APPEND | DELETE business_data TO skip.| TO source_method_select ##no_text. + APPEND | ENDIF. | TO source_method_select ##no_text. + APPEND | | TO source_method_select ##no_text. + + APPEND | IF io_request->is_total_numb_of_rec_requested( ).| TO source_method_select ##no_text. + APPEND | io_response->set_total_number_of_records( lines( business_data ) ).| TO source_method_select ##no_text. + APPEND | ENDIF.| TO source_method_select ##no_text. + APPEND | io_response->set_data( business_data ).| TO source_method_select ##no_text. + APPEND |CATCH cx_root INTO DATA(exception).| TO source_method_select ##no_text. + APPEND |DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).| TO source_method_select ##no_text. + APPEND |ENDTRY.| TO source_method_select ##no_text. + + + + lo_specification->set_short_description( 'Custom query implementation' ) ##no_text. + lo_specification->definition->add_interface( 'if_rap_query_provider' ). + lo_specification->implementation->add_method( |if_rap_query_provider~select| + )->set_source( source_method_select ) ##no_text. + + + ENDMETHOD. + + + METHOD create_draft_query_view. + DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field . + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-draft_query_view + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-draft_query_view. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + "create a view entity + DATA(lo_view) = lo_specification->set_short_description( |Draft query view for { io_rap_bo_node->rap_node_objects-alias }| + )->add_view_entity( ) ##no_text. + + " Annotations. + lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ). + lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Draft query view for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. + lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->draft_table_name ) ). + "add alias + lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + DATA(viewEnhancementCategoryAnno) = lo_view->add_annotation( 'AbapCatalog.viewEnhancementCategory' )->value->build( )->begin_array( ). + viewEnhancementCategoryAnno->add_enum( 'PROJECTION_LIST' ). + viewEnhancementCategoryAnno->end_array( ). + + add_anno_abap_catalog_ext( + io_view = lo_view + i_allownewdatasources = abap_false + i_allownewcompositions = abap_false + i_elementsuffix = io_rap_bo_node->extensibility_element_suffix + i_datasources = io_rap_bo_node->entityname + i_maximumfields = 100 + ). + +* DATA(lo_valuebuilder) = lo_view->add_annotation( 'AbapCatalog.extensibility' )->value->build( ). +* +* DATA(lo_record) = lo_valuebuilder->begin_record( +* )->add_member( 'extensible' )->add_boolean( abap_true +* )->add_member( 'elementSuffix' )->add_string( 'ZAA' +* )->add_member( 'allowNewDatasources' )->add_boolean( abap_false +* ). +* +* lo_record->add_member( 'dataSources' )->begin_array( )->add_string( CONV #( io_rap_bo_node->entityname ) )->end_array( ). +* DATA(quota) = lo_record->add_member( 'quota' )->begin_record( ). +* quota->add_member( 'maximumFields' )->add_number( 100 ). +* quota->add_member( 'maximumBytes' )->add_number( 10000 ). +* quota->end_record( ). +* +* lo_valuebuilder->end_record( ). + + + + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client + AND key_indicator = abap_true . " co_client. + + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) + )->set_key( ). + lo_Field->set_alias( ls_header_fields-cds_view_field ). + + ENDLOOP. + + LOOP AT io_rap_bo_node->lt_fields INTO ls_header_fields WHERE name <> io_rap_bo_node->field_name-client + AND key_indicator = abap_false . " co_client. + + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) ). + lo_Field->set_alias( ls_header_fields-cds_view_field ). + + ENDLOOP. + +* draftentitycreationdatetime as Draftentitycreationdatetime, +* draftentitylastchangedatetime as Draftentitylastchangedatetime, +* draftadministrativedatauuid as Draftadministrativedatauuid, +* draftentityoperationcode as Draftentityoperationcode, +* hasactiveentity as Hasactiveentity, +* draftfieldchanges as Draftfieldchanges, +* dummy_field as DummyField + lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftentitycreationdatetime' ) )->set_alias( 'Draftentitycreationdatetime' ). + lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftentitylastchangedatetime' ) )->set_alias( 'Draftentitylastchangedatetime' ). + lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftadministrativedatauuid' ) )->set_alias( 'Draftadministrativedatauuid' ). + lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftentityoperationcode' ) )->set_alias( 'Draftentityoperationcode' ). + lo_field = lo_view->add_field( xco_cp_ddl=>field( 'hasactiveentity' ) )->set_alias( 'Hasactiveentity' ). + lo_field = lo_view->add_field( xco_cp_ddl=>field( 'draftfieldchanges' ) )->set_alias( 'Draftfieldchanges' ). + + "dummy field should not be part of the draft query view + "lo_field = lo_view->add_field( xco_cp_ddl=>field( 'dummy_field' ) )->set_alias( 'DummyField' ). + + + + ENDMETHOD. + + + METHOD create_extension_include. + + DATA lv_extension_include_name TYPE sxco_ad_object_name . + lv_extension_include_name = to_upper( io_rap_bo_node->rap_node_objects-extension_include ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + + generated_repository_object-object_name = lv_extension_include_name. + generated_repository_object-object_type = 'STRU'. + APPEND generated_repository_object TO generated_repository_objects. + + "extension include must be added to draft table + "hence both objects have to be generated at the same time + + DATA(lo_specification) = mo_draft_tabl_put_operation->for-tabl-for-structure->add_object( lv_extension_include_name + )->set_package( mo_package + )->create_form_specification( ). + + "create a view entity + lo_specification->set_short_description( |Extension include for { io_rap_bo_node->rap_node_objects-alias }| ) ##no_text. + + lo_specification->add_component( zdmo_cl_rap_node=>dummy_field_name " 'dummy_field' + )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 1 ) ). + +* lo_specification->add_annotation( 'EndUserText.label' )->value->build( )->add_s( iv_value = abap_true ). + + set_struct_enhancement_cat_any( lo_specification ). + +*public instance method set_enhancement_category +*public instance method set_field_suffix +*public instance method set_quota_maximum_bytes +*public instance method set_quota_maximum_fields + +*@AbapCatalog.enhancement.fieldSuffix : 'ZZG' +*@AbapCatalog.enhancement.quotaMaximumFields : 500 +*@AbapCatalog.enhancement.quotaMaximumBytes : 8160 + IF xco_api->on_premise_branch_is_used( ). + method_exists_in_interface-interface_name = 'if_xco_gen_tabl_str_s_form '. + ELSE. + method_exists_in_interface-interface_name = 'if_xco_cp_gen_tabl_str_s_form '. + ENDIF. + method_exists_in_interface-method_name = 'SET_FIELD_SUFFIX'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name) + EXPORTING + iv_field_suffix = CONV char3( io_rap_bo_node->extensibility_element_suffix ). + ENDIF. + method_exists_in_interface-method_name = 'SET_QUOTA_MAXIMUM_BYTES'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name) + EXPORTING + iv_quota_maximum_bytes = 8160. + ENDIF. + method_exists_in_interface-method_name = 'SET_QUOTA_MAXIMUM_FIELDS'. + IF xco_api->method_exists_in_interface( + interface_name = method_exists_in_interface-interface_name + method_name = method_exists_in_interface-method_name + ). + CALL METHOD lo_specification->(method_exists_in_interface-method_name) + EXPORTING + iv_quota_maximum_fields = 500. + ENDIF. + + ENDMETHOD. + + + METHOD create_extension_include_view. + + DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field . + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-extension_include_view + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-extension_include_view. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + "create a view entity + DATA(lo_view) = lo_specification->set_short_description( |Extension include view for { io_rap_bo_node->rap_node_objects-alias }| + )->add_view_entity( ) ##no_text. + + " Annotations. + lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'NOT_REQUIRED' ). + lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Extension include view for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. + lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->table_name ) ). + "add alias + lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + DATA(viewEnhancementCategoryAnno) = lo_view->add_annotation( 'AbapCatalog.viewEnhancementCategory' )->value->build( )->begin_array( ). + viewEnhancementCategoryAnno->add_enum( 'PROJECTION_LIST' ). + viewEnhancementCategoryAnno->end_array( ). + +* DATA(lo_valuebuilder) = lo_view->add_annotation( 'AbapCatalog.extensibility' )->value->build( ). +* +* DATA(lo_record) = lo_valuebuilder->begin_record( +* )->add_member( 'extensible' )->add_boolean( abap_true +* )->add_member( 'elementSuffix' )->add_string( 'ZAA' +* )->add_member( 'allowNewDatasources' )->add_boolean( abap_false +* ). +* +* lo_record->add_member( 'dataSources' )->begin_array( )->add_string( CONV #( io_rap_bo_node->entityname ) )->end_array( ). +* DATA(quota) = lo_record->add_member( 'quota' )->begin_record( ). +* quota->add_member( 'maximumFields' )->add_number( 100 ). +* quota->add_member( 'maximumBytes' )->add_number( 10000 ). +* quota->end_record( ). +* +* lo_valuebuilder->end_record( ). + + add_anno_abap_catalog_ext( + io_view = lo_view + i_allownewdatasources = abap_false + i_allownewcompositions = abap_false + i_elementsuffix = io_rap_bo_node->extensibility_element_suffix + i_datasources = io_rap_bo_node->entityname + i_maximumfields = 100 + ). + + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client + AND key_indicator = abap_true . " co_client. + + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name ) + )->set_key( ). + lo_Field->set_alias( ls_header_fields-cds_view_field ). + + ENDLOOP. + + ENDMETHOD. + + + METHOD create_for_cloud_development. + result = NEW #( json_string = json_string + xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ) ). + ENDMETHOD. + + + METHOD create_for_on_prem_development. + result = NEW #( json_string = json_string + xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ) ). + ENDMETHOD. + + + METHOD create_i_cds_view. + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_i + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_i. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + DATA(lo_view) = lo_specification->set_short_description( |Interface Projection View for { io_rap_bo_node->rap_node_objects-alias }| + )->add_projection_view( ) + ##no_text. + + " Annotations. + lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Projection View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. + + "add @AbapCatalog.extensibility annotations + IF io_rap_bo_node->is_extensible( ) = abap_true. + add_anno_abap_catalog_ext( + io_view = lo_view + i_allownewdatasources = abap_false + i_allownewcompositions = abap_true + i_elementsuffix = io_rap_bo_node->extensibility_element_suffix + i_datasources = io_rap_bo_node->entityname + i_maximumfields = 100 + ). + ENDIF. + + IF io_rap_bo_node->is_root( ). + lo_view->set_root( ). + ENDIF. + + IF io_rap_bo_node->is_root( ) = abap_true. + cds_i_view_set_provider_cntrct( lo_view ). + ENDIF. + + " set data source. + lo_view->data_source->set_view_entity( iv_view_entity = io_rap_bo_node->rap_node_objects-cds_view_r ). + + + "Client field does not need to be specified in client-specific CDS view + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client. + DATA(lo_field) = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) ). + IF ls_header_fields-key_indicator = abap_true . + lo_field->set_key( ). + ENDIF. + ENDLOOP. + + "add compositions to child nodes + IF io_rap_bo_node->has_childs( ). + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) )->set_redirected_to_compos_child( lo_childnode->rap_node_objects-cds_view_i ). + ENDLOOP. + ENDIF. + + "publish association to parent + IF io_rap_bo_node->is_root( ) = abap_false. + lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) )->set_redirected_to_parent( io_rap_bo_node->parent_node->rap_node_objects-cds_view_i ). + ENDIF. + + "for grand-child nodes we have to add an association to the root node + IF io_rap_bo_node->is_grand_child_or_deeper( ). + lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) )->set_redirected_to( io_rap_bo_node->root_node->rap_node_objects-cds_view_i ). + ENDIF. + + "publish associations + LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation). + lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ). + ENDLOOP. + + "add additional fields + LOOP AT io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_interface_view = abap_true. + lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( CONV #( additional_fields-cds_view_field ) ) ). + IF additional_fields-localized = abap_true. + lo_Field->set_localized( abap_true ). + ENDIF. + ENDLOOP. + + "add alias + lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + ENDMETHOD. + + + METHOD create_i_cds_view_basic. + + DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field . + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_i_basic + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_i_basic. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + DATA(lo_view) = lo_specification->set_short_description( |Basic Interface View for { io_rap_bo_node->rap_node_objects-alias }| + )->add_view_entity( ) ##no_text. + ##no_text. + + " Annotations. + lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Basic Interface View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. + + + " set data source. +* lo_view->data_source->set_view_entity( iv_view_entity = io_rap_bo_node->rap_node_objects- ). + lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->table_name ) ). + + "Client field does not need to be specified in client-specific CDS view + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client . " co_client. + + IF ls_header_fields-key_indicator = abap_true. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name ) + )->set_key( )->set_alias( ls_header_fields-cds_view_field ). + ELSE. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name ) + )->set_alias( ls_header_fields-cds_view_field ). + ENDIF. + + "add @Semantics annotation for currency code + IF ls_header_fields-currencycode IS NOT INITIAL. + READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = to_upper( ls_header_fields-currencycode ). + IF sy-subrc = 0. + "for example @Semantics.amount.currencyCode: 'CurrencyCode' + lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + "add @Semantics annotation for unit of measure + IF ls_header_fields-unitofmeasure IS NOT INITIAL. + CLEAR ls_field. + READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ). + IF sy-subrc = 0. + "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + CASE ls_header_fields-name. + WHEN io_rap_bo_node->field_name-created_at. + lo_field->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-created_by. + lo_field->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-last_changed_at. + lo_field->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-last_changed_by. + lo_field->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-local_instance_last_changed_at. + lo_field->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-local_instance_last_changed_by. + lo_field->add_annotation( 'Semantics.user.localInstanceLastChangedBy' )->value->build( )->add_boolean( abap_true ). + ENDCASE. + + ENDLOOP. + + "add alias + lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + + ENDMETHOD. + + + METHOD create_mde_view. + + DATA pos TYPE i VALUE 0. + DATA lo_field TYPE REF TO if_xco_gen_ddlx_s_fo_field . + + DATA(lo_specification) = mo_put_operation->for-ddlx->add_object( io_rap_bo_node->rap_node_objects-meta_data_extension " cds_view_p " mo_p_cds_header + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-meta_data_extension. + generated_repository_object-object_type = 'DDLX'. + APPEND generated_repository_object TO generated_repository_objects. + + lo_specification->set_short_description( |MDE for { io_rap_bo_node->rap_node_objects-alias }| + )->set_layer( xco_cp_metadata_extension=>layer->customer + )->set_view( io_rap_bo_node->rap_node_objects-cds_view_p ) ##no_text. " cds_view_p ). + + "begin_array --> square bracket open + "Begin_record-> curly bracket open + + add_annotation_ui_header( + EXPORTING + io_specification = lo_specification + io_rap_bo_node = io_rap_bo_node + ). + + "Client field does not need to be specified in client-specific CDS view + LOOP AT io_rap_bo_node->lt_all_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client. + + pos += 10. + + lo_field = lo_specification->add_field( ls_header_fields-cds_view_field ). + + "put facet annotation in front of the first field + IF pos = 10. + add_annotation_ui_facets( + EXPORTING + io_field = lo_field + io_rap_bo_node = io_rap_bo_node + ). + ENDIF. + + IF ls_header_fields-is_hidden = abap_true. + + add_anno_ui_hidden( + EXPORTING + io_field = lo_field + ls_header_fields = ls_header_fields + ). + + ELSE. + + add_anno_ui_lineitem( + EXPORTING + io_field = lo_field + ls_header_fields = ls_header_fields + position = pos + ). + + add_anno_ui_identification( + EXPORTING + io_field = lo_field + io_rap_bo_node = io_rap_bo_node + ls_header_fields = ls_header_fields + position = pos + ). + + "add selection fields for semantic key fields or for the fields that are marked as object id + add_annotation_ui_selectionfld( + EXPORTING + io_field = lo_field + io_rap_bo_node = io_rap_bo_node + ls_header_fields = ls_header_fields + position = pos + ). + ENDIF. + ENDLOOP. + + + + + ENDMETHOD. + + + METHOD create_p_cds_view. + + DATA fuzzinessThreshold TYPE p LENGTH 3 DECIMALS 2. + fuzzinessthreshold = 9 / 10. + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_p + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_p. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + + DATA(lo_view) = lo_specification->set_short_description( |Projection View for { io_rap_bo_node->rap_node_objects-alias }| + )->add_projection_view( ) + ##no_text. + + " Annotations. + lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ). + lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Projection View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. + + "add @AbapCatalog.extensibility annotations + IF io_rap_bo_node->is_extensible( ) = abap_true. + add_anno_abap_catalog_ext( + io_view = lo_view + i_allownewdatasources = abap_false + i_allownewcompositions = abap_true + i_elementsuffix = io_rap_bo_node->extensibility_element_suffix + i_datasources = io_rap_bo_node->entityname + i_maximumfields = 100 + ). + ENDIF. + + "@ObjectModel.semanticKey: ['HolidayAllID'] + IF io_rap_bo_node->mimic_adt_wizard = abap_false. + DATA(semantic_key) = lo_view->add_annotation( 'ObjectModel.semanticKey' )->value->build( )->begin_array( ). + semantic_key->add_string( CONV #( io_rap_bo_node->object_id_cds_field_name ) ). + semantic_key->end_array( ). + + lo_view->add_annotation( 'Search.searchable' )->value->build( )->add_boolean( abap_true ) ##no_text. + ENDIF. + + IF io_rap_bo_node->is_root( ). + lo_view->set_root( ). + ENDIF. + + IF io_rap_bo_node->is_root( ) = abap_true. + cds_p_view_set_provider_cntrct( lo_View ). + ENDIF. + + " Data source. + lo_view->data_source->set_view_entity( iv_view_entity = io_rap_bo_node->rap_node_objects-cds_view_r ). + + + "Client field does not need to be specified in client-specific CDS view + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client. + + DATA(lo_field) = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) + ). "->set_alias( ls_header_fields-cds_view_field ). + + IF ls_header_fields-key_indicator = abap_true . + lo_field->set_key( ). + ENDIF. + + "skip setting of additional annotations if we have to mimic the + "behavior of the ADT based generator + + IF io_rap_bo_node->mimic_adt_wizard = abap_false. + + IF ls_header_fields-key_indicator = abap_true . + IF io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_semantic OR + io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-unmanaged_semantic. + lo_field->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_field->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( iv_value = fuzzinessThreshold ). + ENDIF. + ENDIF. + + CASE ls_header_fields-name. + WHEN io_rap_bo_node->object_id. + IF ls_header_fields-key_indicator = abap_false. + lo_field->add_annotation( 'Search.defaultSearchElement' )->value->build( )->add_boolean( abap_true ). + lo_field->add_annotation( 'Search.fuzzinessThreshold' )->value->build( )->add_number( iv_value = fuzzinessThreshold ). + ENDIF. + ENDCASE. + + "add @Semantics annotation once available + IF ls_header_fields-currencycode IS NOT INITIAL. + READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = ls_header_fields-currencycode. + IF sy-subrc = 0. + lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + "add @Semantics annotation for unit of measure + IF ls_header_fields-unitofmeasure IS NOT INITIAL. + CLEAR ls_field. + READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ). + IF sy-subrc = 0. + "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + "has to be set in 2102 + "can be omitted later + IF ls_header_fields-is_unitofmeasure = abap_true. + lo_field->add_annotation( 'Semantics.unitOfMeasure' )->value->build( )->add_boolean( abap_true ). + ENDIF. + + IF ls_header_fields-has_valuehelp = abap_true. + + READ TABLE io_rap_bo_node->lt_valuehelp INTO DATA(ls_valuehelp) WITH KEY localelement = ls_header_fields-cds_view_field. + + IF sy-subrc = 0. + + DATA(lo_valuebuilder) = lo_field->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + + lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( CONV #( ls_valuehelp-name ) + )->add_member( 'element' )->add_string( CONV #( ls_valuehelp-element ) + )->end_record( ). + + "use for validation will be set to true for + "currencycode and unitofmeasture fields + + IF ls_valuehelp-useforvalidation = abap_true. + lo_valuebuilder->add_member( 'useForValidation' )->add_boolean( abap_true ). + ENDIF. + + IF ls_valuehelp-additionalbinding IS NOT INITIAL. + + lo_valuebuilder->add_member( 'additionalBinding' + )->begin_array( ). + + LOOP AT ls_valuehelp-additionalbinding INTO DATA(ls_additionalbinding). + + DATA(lo_record) = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( ls_additionalbinding-localelement ) + )->add_member( 'element' )->add_string( CONV #( ls_additionalbinding-element ) + ). + IF ls_additionalbinding-usage IS NOT INITIAL. + lo_record->add_member( 'usage' )->add_enum( CONV #( ls_additionalbinding-usage ) ). + ENDIF. + + lo_valuebuilder->end_record( ). + + ENDLOOP. + + lo_valuebuilder->end_array( ). + + ENDIF. + + lo_valuebuilder->end_record( )->end_array( ). + + ENDIF. + + ENDIF. + + ENDIF. + + ENDLOOP. + + IF io_rap_bo_node->has_childs( ). " create_item_objects( ). + " Composition. + + "change to a new property "childnodes" which only contains the direct childs + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + + lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) )->set_redirected_to_compos_child( lo_childnode->rap_node_objects-cds_view_p ). + + + ENDLOOP. + + ENDIF. + + IF io_rap_bo_node->is_root( ) = abap_false. + " "publish association to parent + lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) )->set_redirected_to_parent( io_rap_bo_node->parent_node->rap_node_objects-cds_view_p ). + ENDIF. + + "for grand-child nodes we have to add an association to the root node + IF io_rap_bo_node->is_grand_child_or_deeper( ). + lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) )->set_redirected_to( io_rap_bo_node->root_node->rap_node_objects-cds_view_p ). + ENDIF. + + + "publish associations + + LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation). + lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ). + ENDLOOP. + + + LOOP AT io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_projection_view = abap_true. + + lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( CONV #( additional_fields-cds_view_field ) ) ). + + IF additional_fields-localized = abap_true. + lo_Field->set_localized( abap_true ). + ENDIF. + ENDLOOP. + + "add alias + lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + ENDMETHOD. + + + METHOD create_r_cds_view. + + DATA ls_condition_components TYPE ts_condition_components. + DATA lt_condition_components TYPE tt_condition_components. + DATA lo_field TYPE REF TO if_xco_gen_ddls_s_fo_field . + + DATA(lo_specification) = mo_put_operation->for-ddls->add_object( io_rap_bo_node->rap_node_objects-cds_view_r + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-cds_view_r. + generated_repository_object-object_type = 'DDLS'. + APPEND generated_repository_object TO generated_repository_objects. + + "create a view entity + DATA(lo_view) = lo_specification->set_short_description( |CDS View for { io_rap_bo_node->rap_node_objects-alias }| + )->add_view_entity( ) ##no_text. + + "create a normal CDS view with DDIC view + "maybe needed in order to generate code for a 1909 system + "DATA(lo_view) = lo_specification->set_short_description( 'CDS View for ' && io_rap_bo_node->rap_node_objects-alias "mo_alias_header + " )->add_view( ). + + " Annotations. + " lo_view->add_annotation( 'AbapCatalog' )->value->build( )->begin_record( + " )->add_member( 'sqlViewName' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-ddic_view_i ) "mo_view_header ) + " )->add_member( 'compiler.compareFilter' )->add_boolean( abap_true + " )->add_member( 'preserveKey' )->add_boolean( abap_true + " )->end_record( ). + + lo_view->add_annotation( 'AccessControl.authorizationCheck' )->value->build( )->add_enum( 'CHECK' ). + lo_view->add_annotation( 'Metadata.allowExtensions' )->value->build( )->add_boolean( abap_true ). + lo_view->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'CDS View for ' && io_rap_bo_node->rap_node_objects-alias ) ##no_text. " mo_alias_header ). + + "@ObjectModel.sapObjectNodeType.name : 'ZAF_SALESORDER_01' + IF io_rap_bo_node->add_sap_object_type = abap_true. + lo_view->add_annotation( 'ObjectModel.sapObjectNodeType.name' )->value->build( )->add_string( CONV #( io_rap_bo_node->rap_node_objects-sap_object_node_type ) ) ##no_text. " mo_alias_header ). + ENDIF. + + IF io_rap_bo_node->is_root( ). + lo_view->set_root( ). + ELSE. + + CASE io_rap_bo_node->get_implementation_type( ) . + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + + DATA(parent_uuid_cds_field_name) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-parent_uuid ]-cds_view_field. + DATA(uuid_cds_field_name_in_parent) = io_rap_bo_node->parent_node->lt_fields[ name = io_rap_bo_node->parent_node->field_name-uuid ]-cds_view_field. + + DATA(lo_condition) = xco_cp_ddl=>field( parent_uuid_cds_field_name )->of_projection( )->eq( + xco_cp_ddl=>field( uuid_cds_field_name_in_parent )->of( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) ). + + + + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic OR ZDMO_cl_rap_node=>implementation_type-managed_semantic. + + CLEAR ls_condition_components. + CLEAR lt_condition_components. + + LOOP AT io_rap_bo_node->parent_node->semantic_key INTO DATA(ls_semantic_key). + ls_condition_components-association_name = '_' && io_rap_bo_node->parent_node->rap_node_objects-alias. + ls_condition_components-association_field = ls_semantic_key-cds_view_field. + ls_condition_components-projection_field = ls_semantic_key-cds_view_field. + APPEND ls_condition_components TO lt_condition_components. + ENDLOOP. + + lo_condition = create_condition( lt_condition_components ). + + ENDCASE. + + "@todo - raise an exception when being initial + IF lo_condition IS NOT INITIAL. + + lo_view->add_association( io_rap_bo_node->parent_node->rap_node_objects-cds_view_r )->set_to_parent( + )->set_alias( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias + )->set_condition( lo_condition ). + + ENDIF. + + + + IF io_rap_bo_node->is_grand_child_or_deeper( ). + + CASE io_rap_bo_node->get_implementation_type( ) . + WHEN ZDMO_cl_rap_node=>implementation_type-managed_uuid. + + DATA(root_uuid_cds_field_name) = io_rap_bo_node->lt_fields[ name = io_rap_bo_node->field_name-root_uuid ]-cds_view_field. + DATA(uuid_cds_field_name_in_root) = io_rap_bo_node->root_node->lt_fields[ name = io_rap_bo_node->root_node->field_name-uuid ]-cds_view_field. + + lo_condition = xco_cp_ddl=>field( root_uuid_cds_field_name )->of_projection( )->eq( + xco_cp_ddl=>field( uuid_cds_field_name_in_root )->of( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) ). + + + + WHEN ZDMO_cl_rap_node=>implementation_type-unmanaged_semantic OR ZDMO_cl_rap_node=>implementation_type-managed_semantic. + + CLEAR ls_condition_components. + CLEAR lt_condition_components. + + LOOP AT io_rap_bo_node->ROOT_node->semantic_key INTO DATA(ls_root_semantic_key). + ls_condition_components-association_name = '_' && io_rap_bo_node->root_node->rap_node_objects-alias. + ls_condition_components-association_field = ls_root_semantic_key-cds_view_field. + ls_condition_components-projection_field = ls_root_semantic_key-cds_view_field. + APPEND ls_condition_components TO lt_condition_components. + ENDLOOP. + + lo_condition = create_condition( lt_condition_components ). + + ENDCASE. + + IF lo_condition IS NOT INITIAL. + lo_view->add_association( io_rap_bo_node->root_node->rap_node_objects-cds_view_r + )->set_alias( '_' && io_rap_bo_node->root_node->rap_node_objects-alias + )->set_cardinality( xco_cp_cds=>cardinality->one + )->set_condition( lo_condition ). + ENDIF. + + "@todo add an association that uses the singleton_id + "association [1] to zfcal_I_CALM_ALL as _HolidayAll on $projection.HolidayAllID = _HolidayAll.HolidayAllID + + + ENDIF. + + ENDIF. + + " Data source. + CASE io_rap_bo_node->data_source_type. + WHEN io_rap_bo_node->data_source_types-table. + IF io_rap_bo_node->add_basic_i_views = abap_true. + lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->rap_node_objects-cds_view_i_basic ) ). + ELSE. + lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->table_name ) ). + ENDIF. + WHEN io_rap_bo_node->data_source_types-cds_view. + lo_view->data_source->set_view_entity( CONV #( io_rap_bo_node->cds_view_name ) ). + ENDCASE. + +* "add alias +* lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + IF io_rap_bo_node->is_virtual_root( ) = abap_true. + "add the following statement + "left outer join zcarrier_002 as carr on 0 = 0 + " data(left_outer_join) = lo_view->data_source->add_left_outer_join( io_data_source = io_rap_bo_node->childnodes[ 1 ]->data_source_name ). + + " Association. + DATA(condition) = xco_cp_ddl=>field( '0' )->eq( xco_cp_ddl=>field( '0' ) ). + "DATA(cardinality) = xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ). + + DATA mo_data_source TYPE REF TO if_xco_ddl_expr_data_source . + "mo_data_source = . + + DATA(left_outer_join) = lo_view->data_source->add_left_outer_join( xco_cp_ddl=>data_source->database_table( CONV #( root_node->childnodes[ 1 ]->data_source_name ) )->set_alias( CONV #( root_node->singleton_child_tab_name ) ) ). + + "@todo - add code after HFC2 2008 has been applied + left_outer_join->set_condition( condition ). + + lo_view->set_where( xco_cp_ddl=>field( 'I_Language.Language' )->eq( xco_cp_ddl=>expression->for( '$session.system_language' ) ) ). + + ENDIF. + + IF io_rap_bo_node->has_childs( ). " create_item_objects( ). + " Composition. + + "change to a new property "childnodes" which only contains the direct childs + LOOP AT io_rap_bo_node->childnodes INTO DATA(lo_childnode). + + lo_view->add_composition( lo_childnode->rap_node_objects-cds_view_r " mo_i_cds_item + )->set_cardinality( xco_cp_cds=>cardinality->zero_to_n + )->set_alias( '_' && lo_childnode->rap_node_objects-alias ). " mo_alias_item ). + + ENDLOOP. + + ENDIF. + + "Client field does not need to be specified in client-specific CDS view + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client . " co_client. + + IF io_rap_bo_node->add_basic_i_views = abap_true. + IF ls_header_fields-key_indicator = abap_true. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) + )->set_key( ). + ELSE. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-cds_view_field ) + ). + ENDIF. + ELSE. + IF ls_header_fields-key_indicator = abap_true. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name ) + )->set_key( )->set_alias( ls_header_fields-cds_view_field ). + ELSE. + lo_field = lo_view->add_field( xco_cp_ddl=>field( ls_header_fields-name ) + )->set_alias( ls_header_fields-cds_view_field ). + ENDIF. + ENDIF. + "add @Semantics annotation for currency code + IF ls_header_fields-currencycode IS NOT INITIAL. + READ TABLE io_rap_bo_node->lt_fields INTO DATA(ls_field) WITH KEY name = to_upper( ls_header_fields-currencycode ). + IF sy-subrc = 0. + "for example @Semantics.amount.currencyCode: 'CurrencyCode' + lo_field->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + "add @Semantics annotation for unit of measure + IF ls_header_fields-unitofmeasure IS NOT INITIAL. + CLEAR ls_field. + READ TABLE io_rap_bo_node->lt_fields INTO ls_field WITH KEY name = to_upper( ls_header_fields-unitofmeasure ). + IF sy-subrc = 0. + "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + lo_field->add_annotation( 'Semantics.quantity.unitOfMeasure' )->value->build( )->add_string( CONV #( ls_field-cds_view_field ) ). + ENDIF. + ENDIF. + + CASE ls_header_fields-name. + WHEN io_rap_bo_node->field_name-created_at. + lo_field->add_annotation( 'Semantics.systemDateTime.createdAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-created_by. + lo_field->add_annotation( 'Semantics.user.createdBy' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-last_changed_at. + lo_field->add_annotation( 'Semantics.systemDateTime.lastChangedAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-last_changed_by. + lo_field->add_annotation( 'Semantics.user.lastChangedBy' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-local_instance_last_changed_at. + lo_field->add_annotation( 'Semantics.systemDateTime.localInstanceLastChangedAt' )->value->build( )->add_boolean( abap_true ). + WHEN io_rap_bo_node->field_name-local_instance_last_changed_by. + lo_field->add_annotation( 'Semantics.user.localInstanceLastChangedBy' )->value->build( )->add_boolean( abap_true ). + ENDCASE. + + ENDLOOP. + + "IF create_item_objects( ). + IF io_rap_bo_node->has_childs( ). + + "change to a new property "childnodes" which only contains the direct childs + LOOP AT io_rap_bo_node->childnodes INTO lo_childnode. + + "publish association to item view + lo_view->add_field( xco_cp_ddl=>field( '_' && lo_childnode->rap_node_objects-alias ) ). + + ENDLOOP. + + ENDIF. + + IF io_rap_bo_node->is_root( ) = abap_false. + "publish association to parent + lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->parent_node->rap_node_objects-alias ) ). + ENDIF. + + IF io_rap_bo_node->is_grand_child_or_deeper( ). + "add assocation to root node + lo_view->add_field( xco_cp_ddl=>field( '_' && io_rap_bo_node->root_node->rap_node_objects-alias ) ). + ENDIF. + + "add associations + + "@todo + "add association if RAP BO is extensible + "association [1] to ZRAP625E_SalesOrder_001 as _Extension on $projection.HeaderUUID = _Extension.HeaderUUID + "reuse condition + + "add entries to lt_association for the above mentioned association + +* IF io_rap_bo_node->is_extensible( ) = abAP_TRUE. +* lo_view->add_association( io_rap_bo_node->rap_node_objects-extension_include +* )->set_alias( '_' && io_rap_bo_node->extension_association_name +* )->set_condition( lo_condition ). +* add_anno_abap_catalog_ext( +* io_view = lo_view +* i_allownewdatasources = abap_false +* i_elementsuffix = io_rap_bo_node->extensibility_element_suffix +* i_datasources = '_' && io_rap_bo_node->extension_association_name +* i_maximumfields = 100 +* ). +* +* ENDIF. + IF io_rap_bo_node->is_extensible( ) = abAP_TRUE. + + DATA extension_assocation TYPE zdmo_cl_rap_node=>ts_assocation . + CLEAR ls_condition_components. + CLEAR lt_condition_components. + DATA ext_condition_component TYPE zdmo_cl_rap_node=>ts_condition_fields. + DATA ext_condition_components TYPE zdmo_cl_rap_node=>tt_condition_fields . + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_key_fields) WHERE name <> io_rap_bo_node->field_name-client + AND key_indicator = abap_true. " co_client. + ext_condition_component-association_field = ls_key_fields-cds_view_field. + ext_condition_component-projection_field = ls_key_fields-cds_view_field. +* ls_condition_components-association_name = io_rap_bo_node->extension_association_name. + APPEND ext_condition_component TO ext_condition_components. + ENDLOOP. + + extension_assocation-cardinality = ZDMO_cl_rap_node=>cardinality-one. + extension_assocation-name = '_' && io_rap_bo_node->extension_association_name. + extension_assocation-target = io_rap_bo_node->rap_node_objects-extension_include_view. + extension_assocation-condition_components = ext_condition_components. + +* append extension_assocation to io_rap_bo_node->a lt_association. + + add_anno_abap_catalog_ext( + io_view = lo_view + i_allownewdatasources = abap_false + i_allownewcompositions = abap_true + i_elementsuffix = io_rap_bo_node->extensibility_element_suffix + i_datasources = '_' && io_rap_bo_node->extension_association_name + i_maximumfields = 100 + ). + + ENDIF. + + DATA(associations) = io_rap_bo_node->lt_association. + + IF extension_assocation IS NOT INITIAL. + APPEND extension_assocation TO associations. + ENDIF. + +* LOOP AT io_rap_bo_node->lt_association INTO DATA(ls_assocation). + LOOP AT associations INTO DATA(ls_assocation). + + CLEAR ls_condition_components. + CLEAR lt_condition_components. + LOOP AT ls_assocation-condition_components INTO DATA(ls_components). + ls_condition_components-association_field = ls_components-association_field. + ls_condition_components-projection_field = ls_components-projection_field. + ls_condition_components-association_name = ls_assocation-name. + APPEND ls_condition_components TO lt_condition_components. + ENDLOOP. + + lo_condition = create_condition( lt_condition_components ). + + DATA(lo_association) = lo_view->add_association( ls_assocation-target )->set_alias( + ls_assocation-name + )->set_condition( lo_condition ). + + CASE ls_assocation-cardinality . + WHEN ZDMO_cl_rap_node=>cardinality-one. + lo_association->set_cardinality( xco_cp_cds=>cardinality->one ). + WHEN ZDMO_cl_rap_node=>cardinality-one_to_n. + lo_association->set_cardinality( xco_cp_cds=>cardinality->one_to_n ). + WHEN ZDMO_cl_rap_node=>cardinality-zero_to_n. + lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_n ). + WHEN ZDMO_cl_rap_node=>cardinality-zero_to_one. + lo_association->set_cardinality( xco_cp_cds=>cardinality->zero_to_one ). + WHEN ZDMO_cl_rap_node=>cardinality-one_to_one. + "@todo: currently association[1] will be generated + "fix available with 2008 HFC2 + lo_association->set_cardinality( xco_cp_cds=>cardinality->range( iv_min = 1 iv_max = 1 ) ). + ENDCASE. + + "publish association + lo_view->add_field( xco_cp_ddl=>field( ls_assocation-name ) ). + + ENDLOOP. + + LOOP AT io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE cds_restricted_reuse_view = abap_true. + + lo_field = lo_view->add_field( xco_cp_ddl=>expression->for( additional_fields-name ) ). + IF additional_fields-cds_view_field IS NOT INITIAL. + lo_Field->set_alias( additional_fields-cds_view_field ). + ENDIF. + ENDLOOP. + + "add alias + lo_view->data_source->set_alias( io_rap_bo_node->entityname ). + + ENDMETHOD. + + + METHOD create_sap_object_node_type. + + DATA(lo_specification) = mo_put_operation->for-nont->add_object( io_rap_bo_node->rap_node_objects-sap_object_node_type + )->set_package( mo_package + )->create_form_specification( ). + + lo_specification->set_short_description( 'Generated SAP Object Node Type' ). + + lo_specification->set_name( io_rap_bo_node->rap_node_objects-sap_object_node_type + )->set_sap_object_type( io_rap_bo_node->root_node->rap_root_node_objects-sap_object_type ). + + lo_specification->set_root_node( io_rap_bo_node->is_root( ) ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_node_objects-sap_object_node_type. + generated_repository_object-object_type = 'NONT'. + APPEND generated_repository_object TO generated_repository_objects. + + + + ENDMETHOD. + + + METHOD create_sap_object_type. + + DATA(lo_specification) = mo_put_operation->for-ront->add_object( io_rap_bo_node->rap_root_node_objects-sap_object_type + )->set_package( io_rap_bo_node->package + )->create_form_specification( ). + lo_specification->set_short_description( 'Generated SAP Object Type' ). + + DATA(lo_type_category) = xco_cp_sap_object_type=>type_category->business_object. + + lo_specification->set_type_category( lo_type_category + )->set_name( io_rap_bo_node->rap_root_node_objects-sap_object_type ). + + ENDMETHOD. + + + METHOD create_service_binding. +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + DATA lv_service_binding_name TYPE sxco_srvb_object_name. + lv_service_binding_name = to_upper( io_rap_bo_node->root_node->rap_root_node_objects-service_binding ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = lv_service_binding_name. + generated_repository_object-object_type = 'SRVB'. + APPEND generated_repository_object TO generated_repository_objects. + + DATA lv_service_definition_name TYPE sxco_srvd_object_name. + lv_service_definition_name = to_upper( io_rap_bo_node->root_node->rap_root_node_objects-service_definition ). + + DATA(lo_specification_header) = mo_srvb_put_operation->for-srvb->add_object( lv_service_binding_name + )->set_package( mo_package + )->create_form_specification( ). + + lo_specification_header->set_short_description( |Service binding for { io_rap_bo_node->root_node->entityname }| ) ##no_text. + + + CASE io_rap_bo_node->root_node->binding_type. + WHEN io_rap_bo_node->binding_type_name-odata_v4_ui. + lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v4_ui ). + WHEN io_rap_bo_node->binding_type_name-odata_v2_ui. + lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_ui ). + WHEN io_rap_bo_node->binding_type_name-odata_v4_web_api. + lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v4_web_api ). + WHEN io_rap_bo_node->binding_type_name-odata_v2_web_api.. + lo_specification_header->set_binding_type( xco_cp_service_binding=>binding_type->odata_v2_web_api ). + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_binding_type + mv_value = io_rap_bo_node->root_node->binding_type + mv_value_2 = io_rap_bo_node->supported_binding_types. + ENDCASE. + + + lo_specification_header->add_service( )->add_version( '0001' )->set_service_definition( lv_service_definition_name ). + + +********************************************************************** +** End of deletion 2020 +********************************************************************** + ENDMETHOD. + + + METHOD create_service_definition. + + + TYPES: BEGIN OF ty_cds_views_used_by_assoc, + name TYPE ZDMO_cl_rap_node=>ts_assocation-name, " sxco_ddef_alias_name, + target TYPE ZDMO_cl_rap_node=>ts_assocation-target, + END OF ty_cds_views_used_by_assoc. + DATA lt_cds_views_used_by_assoc TYPE STANDARD TABLE OF ty_cds_views_used_by_assoc. + DATA ls_cds_views_used_by_assoc TYPE ty_cds_views_used_by_assoc. + + DATA(lo_specification_header) = mo_put_operation->for-srvd->add_object( io_rap_bo_node->rap_root_node_objects-service_definition + )->set_package( mo_package + )->create_form_specification( ). + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + generated_repository_object-object_name = io_rap_bo_node->rap_root_node_objects-service_definition. + generated_repository_object-object_type = 'SRVD'. + APPEND generated_repository_object TO generated_repository_objects. + + lo_specification_header->set_short_description( |Service definition for { io_rap_bo_node->root_node->entityname }| ) ##no_text. + + set_service_definition_annos( + io_specification = lo_specification_header + io_rap_bo_node = root_node + ). + +* IF root_node->is_extensible( ) = abap_true. +* "add @AbapCatalog.extensibility.extensible: true +* lo_specification_header->add_annotation( 'AbapCatalog.extensibility.extensible' )->value->build( )->add_boolean( abap_true ). +* ENDIF. +* +* lo_specification_header->add_annotation( 'ObjectModel.leadingEntity.name' )->value->build( )->add_string( CONV #( root_node->rap_node_objects-cds_view_p ) ). + + "add exposure for root node + + IF root_node->generate_custom_entity( ). + lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_r )->set_alias( root_node->rap_node_objects-alias ). + ELSE. + lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_p )->set_alias( root_node->rap_node_objects-alias ). + ENDIF. + +* CASE root_node->data_source_type. +* WHEN root_node->data_source_types-table OR root_node->data_source_types-cds_view. +* lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_p )->set_alias( root_node->rap_node_objects-alias ). +* +* WHEN root_node->data_source_types-structure OR root_node->data_source_types-abap_type. +* lo_specification_header->add_exposure( root_node->rap_node_objects-cds_view_r )->set_alias( root_node->rap_node_objects-alias ). +* ENDCASE. + "add exposure for all child nodes + LOOP AT root_node->all_childnodes INTO DATA(lo_childnode). + "add all nodes to the service definition + IF lo_childnode->generate_custom_entity( ). + lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_r )->set_alias( lo_childnode->rap_node_objects-alias ). + ELSE. + lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_p )->set_alias( lo_childnode->rap_node_objects-alias ). + ENDIF. +* CASE lo_childnode->data_source_type. +* WHEN lo_childnode->data_source_types-table OR lo_childnode->data_source_types-cds_view. +* lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_p )->set_alias( lo_childnode->rap_node_objects-alias ). +* WHEN lo_childnode->data_source_types-abap_type OR lo_childnode->data_source_types-structure. +* lo_specification_header->add_exposure( lo_childnode->rap_node_objects-cds_view_r )->set_alias( lo_childnode->rap_node_objects-alias ). +* ENDCASE. + + "create a list of all CDS views used in associations to the service definition + LOOP AT lo_childnode->lt_association INTO DATA(ls_assocation). + "remove the first character which is an underscore + ls_cds_views_used_by_assoc-name = substring( val = ls_assocation-name off = 1 ). + ls_cds_views_used_by_assoc-target = ls_assocation-target. + COLLECT ls_cds_views_used_by_assoc INTO lt_cds_views_used_by_assoc. + ENDLOOP. + LOOP AT lo_childnode->lt_valuehelp INTO DATA(ls_valuehelp). + ls_cds_views_used_by_assoc-name = ls_valuehelp-alias. + ls_cds_views_used_by_assoc-target = ls_valuehelp-name. + COLLECT ls_cds_views_used_by_assoc INTO lt_cds_views_used_by_assoc. + ENDLOOP. + ENDLOOP. + + "add exposure for all associations and value helps that have been collected (and condensed) in the step before + LOOP AT lt_cds_views_used_by_assoc INTO ls_cds_views_used_by_assoc. + lo_specification_header->add_exposure( ls_cds_views_used_by_assoc-target )->set_alias( ls_cds_views_used_by_assoc-name ). + ENDLOOP. + + + ENDMETHOD. + + + METHOD create_table. + + "add object name and type to list of generated repository objects + CLEAR generated_repository_object. + + DATA name_of_generated_table TYPE sxco_dbt_object_name. + + IF is_draft_table = abap_true. + name_of_generated_table = io_rap_bo_node->draft_table_name. + ELSE. + name_of_generated_table = io_rap_bo_node->table_name. + ENDIF. + + + DATA(lo_specification) = mo_draft_tabl_put_operation->for-tabl-for-database_table->add_object( name_of_generated_table + )->set_package( mo_package + )->create_form_specification( ). + + + IF is_draft_table = abap_true. + generated_repository_object-object_name = name_of_generated_table. + lo_specification->set_short_description( | Draft table for entity { io_rap_bo_node->rap_node_objects-cds_view_r } | ) ##no_text. + ELSE. + generated_repository_object-object_name = name_of_generated_table. + lo_specification->set_short_description( | Table for entity { io_rap_bo_node->rap_node_objects-cds_view_r } | ) ##no_text. + ENDIF. + generated_repository_object-object_type = 'TABL'. + APPEND generated_repository_object TO generated_repository_objects. + + + DATA database_table_field TYPE REF TO if_xco_gen_tabl_dbt_s_fo_field . + + "tables must be client dependent + "and the key field must be the first field of the table + +* IF is_draft_table = abap_true AND io_rap_bo_node->is_virtual_root( ) = abap_true. + database_table_field = lo_specification->add_field( 'MANDT' ). + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ). + database_table_field->set_not_null( ). + database_table_field->set_key_indicator( ). +* ENDIF. + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(table_field_line) + WHERE name <> io_rap_bo_node->field_name-client. + + DATA(cds_field_name_upper) = to_upper( table_field_line-cds_view_field ). + DATA(table_field_name_upper) = to_upper( table_field_line-name ). + + IF is_draft_table = abap_true. + database_table_field = lo_specification->add_field( CONV #( cds_field_name_upper ) ). + ELSE. + database_table_field = lo_specification->add_field( CONV #( table_field_name_upper ) ). + ENDIF. + + IF table_field_line-is_data_element = abap_true. + database_table_field->set_type( xco_cp_abap_dictionary=>data_element( table_field_line-data_element ) ). + ENDIF. + IF table_field_line-is_built_in_type = abap_true. + +* database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for( +* iv_type = to_upper( table_field_line-built_in_type ) +* iv_length = table_field_line-built_in_type_length +* iv_decimals = table_field_line-built_in_type_decimals +* ) ). + CASE to_lower( table_field_line-built_in_type ). + WHEN 'accp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ). + WHEN 'clnt'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ). + WHEN 'cuky'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ). + WHEN 'dats'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ). + WHEN 'df16_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ). + WHEN 'df34_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ). + WHEN 'fltp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ). + WHEN 'int1'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ). + WHEN 'int2'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ). + WHEN 'int4'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ). + WHEN 'int8'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ). + WHEN 'lang'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ). + WHEN 'tims'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ). + WHEN 'char'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( table_field_line-built_in_type_length ) ). + WHEN 'curr'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'dec' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'df16_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'df34_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'lchr' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( table_field_line-built_in_type_length ) ). + WHEN 'lraw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( table_field_line-built_in_type_length ) ). + WHEN 'numc' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( table_field_line-built_in_type_length ) ). + WHEN 'quan' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'raw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( table_field_line-built_in_type_length ) ). + WHEN 'rawstring'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( table_field_line-built_in_type_length ) ). + WHEN 'sstring' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( table_field_line-built_in_type_length ) ). + WHEN 'string' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( table_field_line-built_in_type_length ) ). + WHEN 'unit' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( table_field_line-built_in_type_length ) ). + WHEN OTHERS. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for( + iv_type = to_upper( table_field_line-built_in_type ) + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + ENDCASE. + + + + + ENDIF. + IF table_field_line-key_indicator = abap_true. + database_table_field->set_key_indicator( ). + "not_null must not be set for non-key fields of a draft table + "this is because otherwise one would not be able to store data in the draft table + "which is inconsistent and still being worked on + "for non-key fields this is set like in the ADT quick fix that generates a draft table + IF table_field_line-not_null = abap_true. + database_table_field->set_not_null( ). + ENDIF. + ENDIF. + + IF table_field_line-currencycode IS NOT INITIAL. + DATA(currkey_dbt_field_upper) = to_upper( table_field_line-currencycode ). + "get the cds view field name of the currency or quantity filed + DATA(cds_view_ref_field_name) = io_rap_bo_node->lt_fields[ name = currkey_dbt_field_upper ]-cds_view_field . + DATA(dbt_ref_field_name) = io_rap_bo_node->lt_fields[ name = currkey_dbt_field_upper ]-name. + IF is_draft_table = abap_true. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->draft_table_name ) ) )->set_reference_field( to_upper( cds_view_ref_field_name ) ). + ELSE. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->table_name ) ) )->set_reference_field( to_upper( dbt_ref_field_name ) ). + ENDIF. + ENDIF. + IF table_field_line-unitofmeasure IS NOT INITIAL. + DATA(quantity_dbt_field_upper) = to_upper( table_field_line-unitofmeasure ). + cds_view_ref_field_name = io_rap_bo_node->lt_fields[ name = quantity_dbt_field_upper ]-cds_view_field . + dbt_ref_field_name = io_rap_bo_node->lt_fields[ name = quantity_dbt_field_upper ]-name. + IF is_draft_table = abap_true. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->draft_table_name ) ) )->set_reference_field( to_upper( cds_view_ref_field_name ) ). + ELSE. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( io_rap_bo_node->table_name ) ) )->set_reference_field( to_upper( dbt_ref_field_name ) ). + ENDIF. + ENDIF. + ENDLOOP. + +********************************************************************** +** Begin of deletion 2020 +********************************************************************** + IF is_draft_table = abap_true. + lo_specification->add_include( )->set_structure( iv_structure = CONV #( to_upper( 'sych_bdl_draft_admin_inc' ) ) )->set_group_name( to_upper( '%admin' ) ). + ENDIF. +********************************************************************** +** End of deletion 2020 +********************************************************************** + + IF io_rap_bo_node->is_extensible( ) = abap_true. + lo_specification->add_include( )->set_structure( iv_structure = CONV #( to_upper( io_rap_bo_node->rap_node_objects-extension_include ) ) ). + set_table_enhancement_cat_any( lo_specification ). + ENDIF. + + "add additional fields if provided + LOOP AT io_rap_bo_node->lt_additional_fields INTO DATA(additional_fields) WHERE draft_table = abap_true. + + database_table_field = lo_specification->add_field( CONV #( to_upper( additional_fields-cds_view_field ) ) ). + + IF additional_fields-data_element IS NOT INITIAL. + database_table_field->set_type( xco_cp_abap_dictionary=>data_element( to_upper( additional_fields-data_element ) ) ). + ELSE. + + CASE to_lower( additional_fields-built_in_type ). + WHEN 'accp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ). + WHEN 'clnt'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ). + WHEN 'cuky'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ). + WHEN 'dats'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ). + WHEN 'df16_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ). + WHEN 'df34_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ). + WHEN 'fltp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ). + WHEN 'int1'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ). + WHEN 'int2'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ). + WHEN 'int4'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ). + WHEN 'int8'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ). + WHEN 'lang'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ). + WHEN 'tims'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ). + WHEN 'char'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( additional_fields-built_in_type_length ) ). + WHEN 'curr'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr( + iv_length = additional_fields-built_in_type_length + iv_decimals = additional_fields-built_in_type_decimals + ) ). + WHEN 'dec' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec( + iv_length = additional_fields-built_in_type_length + iv_decimals = additional_fields-built_in_type_decimals + ) ). + WHEN 'df16_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec( + iv_length = additional_fields-built_in_type_length + iv_decimals = additional_fields-built_in_type_decimals + ) ). + WHEN 'df34_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec( + iv_length = additional_fields-built_in_type_length + iv_decimals = additional_fields-built_in_type_decimals + ) ). + WHEN 'lchr' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( additional_fields-built_in_type_length ) ). + WHEN 'lraw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( additional_fields-built_in_type_length ) ). + WHEN 'numc' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( additional_fields-built_in_type_length ) ). + WHEN 'quan' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan( + iv_length = additional_fields-built_in_type_length + iv_decimals = additional_fields-built_in_type_decimals + ) ). + WHEN 'raw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( additional_fields-built_in_type_length ) ). + WHEN 'rawstring'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( additional_fields-built_in_type_length ) ). + WHEN 'sstring' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( additional_fields-built_in_type_length ) ). + WHEN 'string' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( additional_fields-built_in_type_length ) ). + WHEN 'unit' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( additional_fields-built_in_type_length ) ). + WHEN OTHERS. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for( + iv_type = to_upper( additional_fields-built_in_type ) + iv_length = additional_fields-built_in_type_length + iv_decimals = additional_fields-built_in_type_decimals + ) ). + ENDCASE. + + ENDIF. + + ENDLOOP. + + + ENDMETHOD. + + + METHOD create_with_rap_node_object. + result = NEW #( io_root_node = rap_node ). + ENDMETHOD. + + + METHOD exception_occured. + rv_exception_occured = put_exception_occured. + ENDMETHOD. + + + METHOD generate_bo. + + DATA framework_message TYPE zdmo_cl_rap_node=>t_framework_message_fields. + + DATA(rap_bo_name) = get_rap_bo_name( ). + + DATA log_entries TYPE STANDARD TABLE OF t_log_entry. + DATA log_entry TYPE t_log_entry. + DATA task_name TYPE string. + + log_entry-text = |Start generating { rap_bo_name }|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + put_exception_occured = abap_false. + + "do not generate repository objects + "used for testing purposes to allow skip of generation by only changing the json file + IF root_node->generate_only_node_hierachy = abap_true. + EXIT. + ENDIF. + + IF root_node->multi_edit = abap_true. + root_node = root_node->add_virtual_root_node( ). + ENDIF. + + assign_package( ). + + TRY. + " on premise create draft tables first + " uses mo_draft_tabl_put_opertion + IF root_node->draft_enabled = abap_true OR + root_node->create_table = abap_true OR + root_node->is_extensible( ) = abap_true. + + "create extension includes together with tables + IF root_node->is_extensible( ) = abap_true. + create_extension_include( root_node ). + LOOP AT root_node->all_childnodes INTO DATA(lo_child_node). + create_extension_include( lo_child_node ). + ENDLOOP. + ENDIF. + + "create draft tables + IF root_node->draft_enabled = abap_true. + task_name = 'create draft tables'. + create_table( + EXPORTING + io_rap_bo_node = root_node + is_draft_table = abap_true + ). + LOOP AT root_node->all_childnodes INTO lo_child_node. + create_table( + EXPORTING + io_rap_bo_node = lo_child_node + is_draft_table = abap_true + ). + ENDLOOP. + ENDIF. + + "create tables + IF root_node->create_table = abap_true. + task_name = 'create tables'. + create_table( + EXPORTING + io_rap_bo_node = root_node + is_draft_table = abap_false + ). + LOOP AT root_node->all_childnodes INTO lo_child_node. + create_table( + EXPORTING + io_rap_bo_node = lo_child_node + is_draft_table = abap_false + ). + ENDLOOP. + ENDIF. + + + + + DATA lo_result TYPE REF TO if_xco_gen_o_put_result . + + IF root_node->skip_activation = abap_true. + +********************************************************************** +** Begin of insertion 2020 +********************************************************************** +* lo_result = mo_draft_tabl_put_opertion->execute( VALUE #( ( xco_cp_generation=>put_operation_option->skip_activation ) ) ). +********************************************************************** +** End of deletion 2020 +********************************************************************** +********************************************************************** +** Begin of insertion 2020 +********************************************************************** + lo_result = mo_draft_tabl_put_operation->execute( ). +********************************************************************** +** End of insertion 2020 +********************************************************************** + ELSE. + lo_result = mo_draft_tabl_put_operation->execute( ). + ENDIF. + + + + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + + add_findings_to_output( + i_task_name = 'Generating draft tables' + i_findings = lo_findings + ). + +********************************************************************** + "add draft structures + "only needed for on premise systems with older release + "method is not implemented for xco cloud api +********************************************************************** + IF xco_api->on_premise_branch_is_used( ). + + IF root_node->draft_enabled = abap_true. + xco_api->add_draft_include( root_node->draft_table_name ). + LOOP AT root_node->all_childnodes INTO lo_child_node. + xco_api->add_draft_include( lo_child_node->draft_table_name ). + ENDLOOP. + ENDIF. + + IF root_node->is_extensible( ) = abap_true. + xco_api->add_enh_cat_and_anno_to_struct( + ext_include_structure_name = root_node->rap_node_objects-extension_include + extensibility_element_suffix = root_node->extensibility_element_suffix + ). + "the tables used as a data source have to be draft enabled + "so we only have to change the draft tables + IF root_node->draft_enabled = abap_true. + xco_api->add_enh_cat_to_table( root_node->draft_table_name ). + ENDIF. + LOOP AT root_node->all_childnodes INTO lo_child_node. + xco_api->add_enh_cat_and_anno_to_struct( + ext_include_structure_name = lo_child_node->rap_node_objects-extension_include + extensibility_element_suffix = lo_child_node->extensibility_element_suffix + ). + "the tables used as a data source have to be draft enabled + "so we only have to change the draft tables + IF root_node->draft_enabled = abap_true. + xco_api->add_enh_cat_to_table( lo_child_node->table_name ). + ENDIF. + ENDLOOP. + ENDIF. + + ENDIF. + + ENDIF. + + DATA has_extension_include TYPE abap_bool. + + IF root_node->data_source_type = zdmo_cl_rap_node=>data_source_types-table AND + root_node->is_extensible( ) = abap_true. + + "check table of root node + DATA(database_table) = xco_api->get_database_table( iv_name = to_upper( root_node->data_source_name ) ). + + "@todo check why table is not found when being generated + IF database_table->exists( ). + check_and_add_ext_incl_struc( root_node ). + ENDIF. + + LOOP AT root_node->all_childnodes INTO DATA(child_nodes_add_incl). + + "check table of root node + DATA(database_table_child) = xco_api->get_database_table( iv_name = to_upper( child_nodes_add_incl->data_source_name ) ). + + "@todo check why table is not found when being generated + IF database_table_child->exists( ). + check_and_add_ext_incl_struc( child_nodes_add_incl ). + ENDIF. + + + ENDLOOP. + + mo_patch_operation->execute( ). + + ENDIF. + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @rap_bo_name + INTO @DATA(rap_generator_bo). + + + "if rap generator is called via the behavior implementation class a table entry will exist. + "if rap generator class is called via command-line no table entry will exist. + "we will hence create an entity in the RAP BO + + IF rap_generator_bo IS INITIAL. +* store_bo( ). + ENDIF. + + + task_name = 'create entities'. + IF root_node->generate_custom_entity( ). + create_custom_entity( root_node ). + create_custom_query( root_node ). + ELSE. + create_r_cds_view( root_node ). + IF root_node->is_virtual_root( ) = abap_false. + create_i_cds_view( root_node ). + ENDIF. + create_p_cds_view( root_node ). + create_mde_view( root_node ). + ENDIF. + + IF root_node->transactional_behavior = abap_true. + task_name = 'create bdef'. + create_bdef( root_node ). + ENDIF. + + IF root_node->generate_custom_entity( ) = abap_false AND + root_node->transactional_behavior = abap_true. + task_name = 'create projection bdef'. + create_bdef_p( root_node ). + create_bdef_i( root_node ). + ENDIF. + + + IF root_node->generate_bil( ). + task_name = 'create BIL'. + create_bil( root_node ). + ENDIF. + + + + IF root_node->add_basic_i_views = abap_true. + task_name = 'create basic i view'. + create_i_cds_view_basic( root_node ). + ENDIF. + + IF root_node->add_sap_object_type = abap_true. + create_sap_object_type( root_node ). + create_sap_object_node_type( root_node ). + ENDIF. + + LOOP AT root_node->all_childnodes INTO DATA(lo_bo_node). + + IF root_node->add_sap_object_type = abap_true. + create_sap_object_node_type( lo_bo_node ). + ENDIF. + + IF lo_bo_node->generate_custom_entity( ). + create_custom_entity( lo_bo_node ). + create_custom_query( lo_bo_node ). + ELSE. + create_r_cds_view( lo_bo_node ). + IF lo_bo_node->root_node->is_virtual_root( ) = abap_false. + create_i_cds_view( lo_bo_node ). + ENDIF. + create_p_cds_view( lo_bo_node ). + create_mde_view( lo_bo_node ). + ENDIF. + + IF lo_bo_node->add_basic_i_views = abap_true. + task_name = 'create basic i view'. + create_i_cds_view_basic( lo_bo_node ). + ENDIF. + + IF lo_bo_node->get_implementation_type( ) = lo_bo_node->implementation_type-unmanaged_semantic. + create_control_structure( lo_bo_node ). + ENDIF. + + IF lo_bo_node->is_extensible( ) = abap_true. +* create_extension_include( lo_bo_node ). + create_extension_include_view( lo_bo_node ). + ENDIF. + + IF lo_bo_node->is_extensible( ) = abap_true AND + lo_bo_node->draft_enabled = abap_true. + create_draft_query_view( lo_bo_node ). + ENDIF. + + IF lo_bo_node->generate_bil( ). + create_bil( lo_bo_node ). + ENDIF. + + ENDLOOP. + + IF root_node->is_extensible( ) = abap_true. +* create_extension_include( root_node ). + create_extension_include_view( root_node ). + ENDIF. + + IF root_node->is_extensible( ) = abap_true AND + root_node->draft_enabled = abap_true. + create_draft_query_view( root_node ). + ENDIF. + + IF root_node->get_implementation_type( ) = root_node->implementation_type-unmanaged_semantic. + create_control_structure( root_node ). + ENDIF. + + IF root_node->publish_service = abap_true. + create_service_definition( root_node ). + ENDIF. + + + + + "start to create all objects beside service binding + + IF root_node->skip_activation = abap_true. + task_name = 'Generating cds views, bdef, bil and service defintion'. +********************************************************************** +** Start of deletion 2020 +********************************************************************** +* lo_result = mo_put_operation->execute( VALUE #( ( xco_cp_generation=>put_operation_option->skip_activation ) ) ). +********************************************************************** +** End of deletion 2020 +********************************************************************** +********************************************************************** +** End of insertion 2020 +********************************************************************** + lo_result = mo_put_operation->execute( ). +********************************************************************** +** End of insertion 2020 +********************************************************************** + ELSE. + lo_result = mo_put_operation->execute( ). + ENDIF. + + lo_findings = lo_result->findings. + + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + + add_findings_to_output( + i_task_name = 'Generating cds views, bdef, bil and service defintion' + i_findings = lo_findings + ). + + framework_message-message = 'Messages and warnings from ADT:'. + framework_message-severity = 'I'. + APPEND framework_message TO framework_messages. + + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(ls_findings). + framework_message-severity = ls_findings->message->value-msgty. + framework_message-object_type = ls_findings->object_type. + framework_message-object_name = ls_findings->object_name. + framework_message-message = ls_findings->message->get_text( ). + APPEND framework_message TO framework_messages. + ENDLOOP. + ENDIF. + + "if skip_activation is true the service definition will not be activated. + "it is hence not possible to generate a service binding on top + IF root_node->publish_service = abap_true AND root_node->skip_activation = abap_false. + + create_service_binding( root_node ). + + "service binding needs a separate put operation + lo_result = mo_srvb_put_operation->execute( ). + lo_findings = lo_result->findings. + + add_findings_to_output( + i_task_name = 'Generate service binding' + i_findings = lo_findings + ). + + DATA(lt_srvb_findings) = lo_findings->get( ). + + IF lt_srvb_findings IS NOT INITIAL. + + CLEAR framework_message. + + LOOP AT lt_srvb_findings INTO ls_findings. + + framework_message-severity = ls_findings->message->value-msgty. + framework_message-object_type = ls_findings->object_type. + framework_message-object_name = ls_findings->object_name. + framework_message-message = ls_findings->message->get_text( ). + APPEND framework_message TO framework_messages. + + ENDLOOP. + ENDIF. + + CLEAR log_entries. + log_entry-text = |Start publish service binding { root_node->rap_root_node_objects-service_binding }|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + DATA service_binding TYPE sxco_srvb_object_name. + service_binding = root_node->rap_root_node_objects-service_binding . + xco_api->publish_service_binding( service_binding ). + + ENDIF. + + + "if skip_activation is true the service definition will not be activated. + "it is hence not possible to generate a service binding on top + "we will thus have no service binding that can be used for registration + + + + + IF root_node->manage_business_configuration = abap_true AND root_node->skip_activation = abap_false. + + zz_add_business_configuration( CHANGING c_framework_messages = framework_messages ). + + ENDIF. + + CLEAR log_entries. + log_entry-text = |Generation finished|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + CATCH cx_xco_gen_put_exception INTO DATA(put_exception). + + DATA(put_exception_text) = put_exception->get_text( ). + + + CLEAR log_entries. + log_entry-text = put_exception_text. + log_entry-detaillevel = 1. + log_entry-severity = 'E'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + put_exception_occured = abap_true. + lo_findings = put_exception->findings. + lt_findings = lo_findings->get( ). + + add_findings_to_output( + i_task_name = 'Exception occured' + i_findings = lo_findings + ). + + CLEAR framework_message. + framework_message-message = 'PUT operation failed:'. + APPEND framework_message TO framework_messages. + + IF lt_findings IS NOT INITIAL. + CLEAR framework_message. + LOOP AT lt_findings INTO ls_findings. + + framework_message-severity = ls_findings->message->value-msgty. + framework_message-object_type = ls_findings->object_type. + framework_message-object_name = ls_findings->object_name. + framework_message-message = ls_findings->message->get_text( ). + APPEND framework_message TO framework_messages. + + CLEAR log_entries. + log_entry-text = ls_findings->message->get_text( ). + log_entry-detaillevel = 1. + log_entry-severity = ls_findings->message->value-msgty. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + ENDLOOP. + ENDIF. + EXIT. + CATCH cx_root INTO DATA(lx_root_exception). "if nothing else has been catched so far + + CLEAR framework_message. + framework_message-message = lx_root_exception->get_text( ). + APPEND framework_message TO framework_messages. + + ENDTRY. + + + + IF root_node->is_extensible( ) = abap_true. + + DATA released_object TYPE string . + + TRY. + + CLEAR log_entries. + log_entry-text = |Start C0- and C1 release|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + "release root node objects + + + + + +* DATA(api_state_handler_service_def) = cl_abap_api_state=>create_instance( api_key = VALUE #( +* object_type = 'SRVD' +* object_name = to_upper( |{ root_node->rap_root_node_objects-service_definition }| ) "'ZRAP630UI_Shop_051' ) +* ) ). + + + + DATA(api_state_handler_tabl) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'TABL' + object_name = to_upper( |{ root_node->data_source_name }| ) "'zrap630sshop_051' ) + ) ). + +* api_state_handler_tabl->release( +* EXPORTING +* release_contract = 'C0' +* use_in_cloud_development = abap_true +* use_in_key_user_apps = abap_false +* request = CONV #( root_node->transport_request ) +* ). + +********************************************************************** + + released_object = root_node->rap_root_node_objects-behavior_definition_r. + + DATA(api_state_handler_r_bdef) = cl_abap_api_state=>create_instance( + api_key = VALUE #( + object_type = 'BDEF' + object_name = to_upper( released_object ) "'ZRAP630R_ShopTP_051' ) + ) ). + + api_state_handler_r_bdef->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = root_node->rap_root_node_objects-behavior_definition_i. + + DATA(api_state_handler_i_bdef) = cl_abap_api_state=>create_instance( + api_key = VALUE #( + object_type = 'BDEF' + object_name = to_upper( released_object ) "'ZRAP630i_ShopTP_051' ) + ) ). + + "i-bdef must first be C1 and then C0 released + + api_state_handler_i_bdef->release( + EXPORTING + release_contract = 'C1' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + api_state_handler_i_bdef->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = root_node->rap_root_node_objects-behavior_definition_p. + + DATA(api_state_handler_p_bdef) = cl_abap_api_state=>create_instance( + api_key = VALUE #( + object_type = 'BDEF' + object_name = to_upper( released_object ) "'ZRAP630c_ShopTP_051' ) + ) ). + + api_state_handler_p_bdef->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + CLEAR log_entries. + log_entry-text = |BDEF's released|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + WAIT UP TO 1 SECONDS. + COMMIT WORK. + + released_object = root_node->rap_node_objects-extension_include. + + DATA(api_state_handler_struct) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'TABL' + object_name = to_upper( released_object ) "'zrap630sshop_051' ) + ) ). + + api_state_handler_struct->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + WAIT UP TO 1 SECONDS. + COMMIT WORK. + released_object = root_node->rap_node_objects-extension_include_view. + + DATA(api_state_handler_ext_view) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630E_Shop_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) "'ZRAP630E_Shop_051' ) + ) ). + + api_state_handler_ext_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = root_node->rap_node_objects-draft_query_view. + WAIT UP TO 1 SECONDS. + COMMIT WORK. + DATA(api_state_handler_D_qu_view) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630R_Shop_D_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) "'ZRAP630R_Shop_D_051' ) + ) ). + + api_state_handler_d_qu_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + WAIT UP TO 1 SECONDS. + COMMIT WORK. + + released_object = root_node->rap_node_objects-cds_view_r. + + DATA(api_state_handler_r_view) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630R_ShopTP_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) " 'ZRAP630R_ShopTP_051' ) + ) ). + + api_state_handler_r_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = root_node->rap_node_objects-cds_view_i. + WAIT UP TO 1 SECONDS. + COMMIT WORK. + DATA(api_state_handler_i_view) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630i_ShopTP_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) " 'ZRAP630i_ShopTP_051' ) + ) ). + + "cds interface view must first be C1 and then C0 released + + api_state_handler_i_view->release( + EXPORTING + release_contract = 'C1' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + WAIT UP TO 1 SECONDS. + COMMIT WORK. + api_state_handler_i_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = root_node->rap_node_objects-cds_view_p. + WAIT UP TO 1 SECONDS. + COMMIT WORK. + DATA(api_state_handler_c_view) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630c_ShopTP_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) " 'ZRAP630c_ShopTP_051' ) + ) ). + + api_state_handler_c_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + WAIT UP TO 1 SECONDS. + COMMIT WORK. + CLEAR log_entries. + log_entry-text = |Root node objects { root_node->entityname } released|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + "release cds views of child nodes + LOOP AT root_node->all_childnodes INTO DATA(child_node). + + released_object = child_node->rap_node_objects-extension_include. + + api_state_handler_struct = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'TABL' + object_name = to_upper( released_object ) "'zrap630sshop_051' ) + ) ). + + api_state_handler_struct->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = child_node->rap_node_objects-extension_include_view. + + api_state_handler_ext_view = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630E_Shop_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) "'ZRAP630E_Shop_051' ) + ) ). + + api_state_handler_ext_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = child_node->rap_node_objects-draft_query_view. + + api_state_handler_D_qu_view = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( |{ child_node->rap_node_objects-draft_query_view }| ) "'ZRAP630R_Shop_D_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( |{ child_node->rap_node_objects-draft_query_view }| ) "'ZRAP630R_Shop_D_051' ) + ) ). + + api_state_handler_d_qu_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + + + released_object = child_node->rap_node_objects-cds_view_r. + + api_state_handler_r_view = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630R_ShopTP_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) " 'ZRAP630R_ShopTP_051' ) + ) ). + + api_state_handler_r_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + + released_object = child_node->rap_node_objects-cds_view_i. + + api_state_handler_i_view = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630i_ShopTP_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) " 'ZRAP630i_ShopTP_051' ) + ) ). + + api_state_handler_i_view->release( + EXPORTING + release_contract = 'C1' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + api_state_handler_i_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + released_object = child_node->rap_node_objects-cds_view_p. + + api_state_handler_c_view = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'DDLS' + object_name = to_upper( released_object ) "'ZRAP630c_ShopTP_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( released_object ) " 'ZRAP630c_ShopTP_051' ) + ) ). + + api_state_handler_c_view->release( + EXPORTING + release_contract = 'C0' + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + request = CONV #( root_node->transport_request ) + ). + + CLEAR log_entries. + log_entry-text = |Child node objects { child_node->entityname } released|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + + ENDLOOP. + + + + "release service definition + "cannot be performed yet since the appropriate annotation cannot be yet set programmatically via XCO + +* api_state_handler_service_def->release( +* EXPORTING +* release_contract = 'C0' +* use_in_cloud_development = abap_true +* use_in_key_user_apps = abap_false +* request = CONV #( root_node->transport_request ) +* ). + + + CLEAR log_entries. + log_entry-text = |C0- and C1 release finished|. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + CATCH cx_abap_api_state INTO DATA(lx_abap_api_state). " API State Handler + DATA(lt_msg) = lx_abap_api_state->get_text( ). + CLEAR log_entries. + log_entry-text = |C0- or C1 release of { released_object } failed.|. + log_entry-detaillevel = 1. + log_entry-severity = 'E'. + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + CLEAR log_entries. + log_entry-text = lt_msg . + APPEND log_entry TO log_entries. + add_log_entries_for_rap_bo( + EXPORTING + i_rap_bo_name = rap_bo_name + i_log_entries = log_entries + ). + ENDTRY. + ENDIF. + + ENDMETHOD. + + + METHOD get_generated_repo_objects. + r_generated_repository_objects = generated_repository_objects. + ENDMETHOD. + + + METHOD get_rap_bo_name. + IF root_node->is_consistent( ). + rap_bo_name = root_node->rap_root_node_objects-behavior_definition_r. + ENDIF. + ENDMETHOD. + + + METHOD get_transport_layer. + + DATA(lo_package) = io_package. + DO. + DATA(ls_package) = lo_package->read( ). + IF ls_package-property-transport_layer->value EQ '$SPL'. + lo_package = ls_package-property-super_package. + CONTINUE. + ENDIF. + ro_transport_layer = ls_package-property-transport_layer. + EXIT. + ENDDO. + ENDMETHOD. + + + METHOD put_operation_execute. + super->put_operation_execute( + EXPORTING + i_put_operation = i_put_operation + i_skip_activation = i_skip_activation + RECEIVING + r_result = r_result + ). + ENDMETHOD. + + + METHOD store_bo. + + " data is stored in root_node + + DATA update_bonodes TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Node. + + + DATA update_fields TYPE TABLE FOR UPDATE ZDMO_R_RAPG_FieldTP. + DATA update_field TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_FieldTP. + + DATA cid TYPE i. + + + + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + +* WAIT UP TO 5 SECONDS. + + IF root_node->data_source_type = root_node->data_source_types-table. + DATA(lo_database_table) = xco_lib->get_database_table( CONV sxco_dbt_object_name( root_node->data_source_name ) ). + IF lo_database_table->exists( ) = abap_false. + COMMIT WORK. + ENDIF. + lo_database_table = xco_lib->get_database_table( CONV sxco_dbt_object_name( root_node->data_source_name ) ). + IF lo_database_table->exists( ) = abap_false. + RETURN. + ENDIF. + ENDIF. + + "create BO and root node via action + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + EXECUTE createProjectAndRootNode " createBOandRootNode + FROM VALUE #( ( + %cid = 'ROOT1' + %param-BdefImplementationType = root_node->get_implementation_type( ) + %param-BindingType = root_node->binding_type + %param-DraftEnabled = root_node->draft_enabled + %param-entityname = root_node->EntityName + %param-data_source_name = root_node->data_source_name + %param-DataSourceType = root_node->data_source_type + %param-package_name = root_node->package + %param-isExtensible = root_node->is_extensible( ) + ) ) + " check result + MAPPED DATA(mapped) + FAILED DATA(failed) + REPORTED DATA(reported). + + CHECK mapped-project[] IS NOT INITIAL. + + + "get copied root node + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project BY \_node + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) + RESULT DATA(copied_root_nodes). + + CHECK lines( copied_root_nodes ) = 1. + + DATA(copied_root_node) = copied_root_nodes[ 1 ]. + + "set fields for copied header and root node + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( AddToManageBusinessConfig + CustomizingTable + MultiInlineEdit + Suffix + Prefix + SkipActivation + AddIViewBasic +* isExtensible + "extensibilityElementSuffix + ) + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID + + AddToManageBusinessConfig = root_node->manage_business_configuration + CustomizingTable = root_node->is_customizing_table + MultiInlineEdit = root_node->multi_edit + + Suffix = root_node->Suffix + Prefix = root_node->Prefix + SkipActivation = root_node->skip_activation + + AddIViewBasic = root_node->add_basic_i_views +* isExtensible = rapbo-isExtensible + extensibilityElementSuffix = root_node->extensibility_element_suffix + ) ) + + FAILED DATA(failed_update_root_bo_node) + REPORTED DATA(reported_update_root_bo_node). + + "in a second modify we set the field names according to the data from the source project + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Node + UPDATE FIELDS ( +* DataSource + FieldNameCreatedAt + FieldNameCreatedby + FieldNameEtagMaster + FieldNameLastChangedAt + FieldNameLastChangedBy + FieldNameLocLastChangedAt + FieldNameObjectID + FieldNameParentUUID + FieldNameRootUUID + FieldNameTotalEtag + FieldNameUUID + ExtensibilityElementSuffix + ) + WITH VALUE #( ( + NodeUUID = copied_root_node-NodeUUID + %is_draft = if_abap_behv=>mk-on +* DataSource = root_node-DataSource + "check if the following fields have to be set using a seperate EML call + FieldNameCreatedAt = root_node->field_name-created_at + FieldNameCreatedby = root_node->field_name-created_by + FieldNameEtagMaster = root_node->Field_Name-etag_master + FieldNameLastChangedAt = root_node->Field_Name-last_changed_at + FieldNameLastChangedBy = root_node->Field_Name-last_changed_by + FieldNameLocLastChangedAt = root_node->Field_Name-local_instance_last_changed_at + FieldNameObjectID = root_node->object_id + FieldNameParentUUID = root_node->Field_Name-parent_uuid + FieldNameRootUUID = root_node->Field_Name-Root_UUID + FieldNameTotalEtag = root_node->Field_Name-total_etag + FieldNameUUID = root_node->Field_Name-uuid + ExtensibilityElementSuffix = root_node->extensibility_element_suffix + ) ) + FAILED DATA(failed_update_root_bo_node2) + REPORTED DATA(reported_update_root_bo_node2). + + + + + + "read copied project header data + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) + RESULT DATA(copied_rapbos). + + CHECK lines( copied_rapbos ) = 1. + + + "get created fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY node + BY \_field + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + NodeUUID = copied_root_nodes[ 1 ]-NodeUUID ) ) + RESULT DATA(new_fields). + + +* rapbo_node-EntityName + "When the project is marked as extensible tables of the source project have a dummy field. + + LOOP AT new_fields INTO DATA(new_field). + IF line_exists( root_node->lt_fields[ name = new_field-dbtablefield ] ). + update_field-FieldUUID = new_field-FieldUUID. + update_field-%is_draft = if_abap_behv=>mk-on. + update_field-CdsViewField = root_node->lt_fields[ name = new_field-dbtablefield ]-cds_view_field. + APPEND update_field TO update_fields. + ENDIF. + ENDLOOP. + + + + " loop at nodes of the source project beside the root node + + LOOP AT root_node->all_childnodes INTO DATA(rapbo_node). + + cid += 1. + + "get copied rapbo nodes + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project BY \_node + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) + RESULT DATA(copied_rapbo_nodes). + + "get uuid of parent node + DATA(uuid_of_parent_node) = copied_rapbo_nodes[ EntityName = rapbo_node->parent_node->EntityName ]-NodeUUID. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY node + EXECUTE addChildNode + FROM VALUE #( ( + %tky = VALUE #( %is_draft = if_abap_behv=>mk-on + NodeUUID = uuid_of_parent_node ) + %param-entity_name = rapbo_node->EntityName + %param-DataSourceName = rapbo_node->data_source_name + %param-DataSourceType = root_node->data_source_type + ) ) + + MAPPED DATA(mapped_add_child) + FAILED DATA(failed_add_child) + REPORTED DATA(reported_add_child). + + "in a second modify we set the field names according to the data from the source project + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Node + UPDATE FIELDS ( +* DataSource + FieldNameCreatedAt FieldNameCreatedby FieldNameEtagMaster FieldNameLastChangedAt FieldNameLastChangedBy + FieldNameLocLastChangedAt FieldNameObjectID FieldNameParentUUID FieldNameRootUUID FieldNameTotalEtag + FieldNameUUID + extensibilityElementSuffix + ) + WITH VALUE #( ( + + NodeUUID = mapped_add_child-node[ 1 ]-NodeUUID + %is_draft = if_abap_behv=>mk-on +* DataSource = rapbo_node-DataSource + "check if the following fields have to be set using a seperate EML call + fieldnamecreatedat = rapbo_node->field_name-created_at + fieldnamecreatedby = rapbo_node->field_name-created_by + fieldnameetagmaster = rapbo_node->field_name-etag_master + fieldnamelastchangedat = rapbo_node->field_name-last_changed_at + fieldnamelastchangedby = rapbo_node->field_name-last_changed_by + fieldnameloclastchangedat = rapbo_node->field_name-local_instance_last_changed_at + fieldnameobjectid = rapbo_node->object_id + fieldnameparentuuid = rapbo_node->field_name-parent_uuid + fieldnamerootuuid = rapbo_node->field_name-root_uuid + fieldnametotaletag = rapbo_node->field_name-total_etag + FieldNameUUID = rapbo_node->field_name-uuid + extensibilityElementSuffix = rapbo_node->extensibility_element_suffix + + ) ) + FAILED DATA(failed_update_child_bo_node2) + REPORTED DATA(reported_update_child_bo_node2). + + +* LOOP AT mapped_add_child-field INTO DATA(mapped_add_child_field). + +* ENTITY Project BY \_node +* ALL FIELDS +* WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on +* RapboUUID = mapped-project[ 1 ]-RapboUUID ) ) +* RESULT DATA(copied_rapbo_nodes). + + "get created fields + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY node + BY \_field + ALL FIELDS + WITH VALUE #( ( %is_draft = if_abap_behv=>mk-on + NodeUUID = mapped_add_child-node[ 1 ]-NodeUUID ) ) + RESULT new_fields. + + +* rapbo_node-EntityName + +*LOOP AT new_fields INTO DATA(new_field). +* IF line_exists( root_node->lt_fields[ name = new_field-dbtablefield ] ). +* update_field-FieldUUID = new_field-FieldUUID. +* update_field-%is_draft = if_abap_behv=>mk-on. +* update_field-CdsViewField = root_node->lt_fields[ name = new_field-dbtablefield ]-cds_view_field. +* APPEND update_field TO update_fields. +* ENDIF. +* ENDLOOP. + + + LOOP AT new_fields INTO new_field. + IF line_exists( rapbo_node->lt_fields[ name = new_field-dbtablefield ] ). + update_field-FieldUUID = new_field-FieldUUID. + update_field-%is_draft = if_abap_behv=>mk-on. + update_field-CdsViewField = rapbo_node->lt_fields[ name = new_field-dbtablefield ]-cds_view_field. + APPEND update_field TO update_fields. + ENDIF. + ENDLOOP. + + ENDLOOP. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Field + UPDATE FIELDS ( + CdsViewField + ) + WITH + update_fields + FAILED DATA(failed_update_child_bo_node3) + REPORTED DATA(reported_update_child_bo_node3). + +* APPEND VALUE #( +* "von der quelle hier im Schlüssel +* rapbouuid = rapbo-RapboUUID " mapped-rapgeneratorbo[ 1 ]-RapNodeUUID +* %is_draft = rapbo-%is_draft " mapped-rapgeneratorbo[ 1 ]-%is_draft +* "hier steht was rauskommt +* "also mapping der alten auf neue keys +* %param = VALUE #( %is_draft = mapped-project[ 1 ]-%is_draft +* %key = mapped-project[ 1 ]-%key ) ) TO result. + + ENDMETHOD. + + + METHOD zz_add_business_configuration. + + DATA framework_message TYPE zdmo_cl_rap_node=>t_framework_message_fields. + + TRY. + CLEAR framework_message. + framework_message-message = 'Messages from business configuration registration'. + framework_message-severity = 'I'. + APPEND framework_message TO c_framework_messages. + + + DATA(lo_business_configuration) = mbc_cp_api=>business_configuration( + iv_identifier = root_node->manage_business_config_names-identifier + iv_namespace = root_node->manage_business_config_names-namespace + ). + + lo_business_configuration->create( + iv_name = root_node->manage_business_config_names-name + iv_description = root_node->manage_business_config_names-description + iv_service_binding = CONV #( to_upper( root_node->rap_root_node_objects-service_binding ) ) + iv_service_name = CONV #( to_upper( root_node->rap_root_node_objects-service_binding ) ) + iv_service_version = 0001 + iv_root_entity_set = root_node->entityname + iv_transport = CONV #( mo_transport ) + iv_skip_root_entity_list_rep = root_node->is_virtual_root( ) + ). + + CLEAR framework_message. + framework_message-severity = 'S'. + framework_message-message = |{ root_node->manage_business_config_names-identifier } registered successfully.| . + APPEND framework_message TO c_framework_messages. + + CATCH cx_mbc_api_exception INTO DATA(lx_mbc_api_exception). + + put_exception_occured = abap_true. + + DATA(lt_messages) = lx_mbc_api_exception->if_xco_news~get_messages( ). + + CLEAR framework_message. + LOOP AT lt_messages INTO DATA(lo_message). + framework_message-severity = lo_message->value-msgty. + framework_message-message = lo_message->get_text( ). + APPEND framework_message TO c_framework_messages. + ENDLOOP. + ENDTRY. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator.clas.xml b/src/zdmo_cl_rap_generator.clas.xml new file mode 100644 index 0000000..7723f2a --- /dev/null +++ b/src/zdmo_cl_rap_generator.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>RAP Generator</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_asyn.clas.abap b/src/zdmo_cl_rap_generator_asyn.clas.abap new file mode 100644 index 0000000..e7bbe53 --- /dev/null +++ b/src/zdmo_cl_rap_generator_asyn.clas.abap @@ -0,0 +1,138 @@ +CLASS zdmo_cl_rap_generator_asyn DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_serializable_object . + INTERFACES if_bgmc_operation . + INTERFACES if_bgmc_op_single_tx_uncontr . + INTERFACES if_abap_parallel. + + METHODS constructor + IMPORTING + i_json_string TYPE ZDMO_R_RAPG_ProjectTP-JsonString + i_package_language_version TYPE ZDMO_R_RAPG_ProjectTP-PackageLanguageVersion + i_rap_bo_uuid TYPE ZDMO_R_RAPG_ProjectTP-RapBoUUID OPTIONAL. + + + PROTECTED SECTION. + PRIVATE SECTION. + DATA json_string TYPE ZDMO_R_RAPG_ProjectTP-JsonString. + DATA package_language_version TYPE ZDMO_R_RAPG_ProjectTP-PackageLanguageVersion. + DATA rap_bo_uuid TYPE ZDMO_R_RAPG_ProjectTP-RapBoUUID. + METHODS start_generator. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_ASYN IMPLEMENTATION. + + + METHOD constructor. + json_string = i_json_string. + package_language_version = i_package_language_version. + rap_bo_uuid = i_rap_bo_uuid. + ENDMETHOD. + + + METHOD if_abap_parallel~do. + start_generator( ). + ENDMETHOD. + + + METHOD if_bgmc_op_single_tx_uncontr~execute. + start_generator( ). + ENDMETHOD. + + + METHOD start_generator. + DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF rap_bo_uuid IS NOT INITIAL. + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + ALL FIELDS WITH VALUE #( ( %key-RapBoUUID = rap_bo_uuid + ) ) + RESULT DATA(items) + FAILED DATA(read_failed). + + "Fill job status fields + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText ) + WITH VALUE #( FOR item IN items ( %key = item-%key + JobStatus = 'R' + JobStatusCriticality = '2' "orange + JobStatusText = 'Running' + ) ) + REPORTED DATA(update_reported). + + COMMIT ENTITIES . + COMMIT WORK. + ENDIF. + + CASE package_language_version. + + WHEN zdmo_cl_rap_node=>package_abap_language_version-standard. + DATA(rap_generator_on_prem) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ). + DATA(framework_messages) = rap_generator_on_prem->generate_bo( ). + + + WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. + + "If in on premise systems packages with the language version abap_for_sap_cloud_platform are used + "we have to use the xco_cp libraries for generation and + "we have to use the xco on prem libraries for reading + + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + DATA(rap_generator) = zdmo_cl_rap_generator=>create_for_on_prem_development( json_string ). + ELSE. + rap_generator = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ). + ENDIF. + + framework_messages = rap_generator->generate_bo( ). + + WHEN OTHERS. + + IF rap_bo_uuid IS NOT INITIAL. + "Fill job status fields + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText ) + WITH VALUE #( FOR item IN items ( %key = item-%key + JobStatus = 'A' + JobStatusCriticality = '1' "orange + JobStatusText = 'Aborted' + ) ) + REPORTED DATA(update_reported_aborted). + COMMIT ENTITIES . + COMMIT WORK. + ENDIF. + + RAISE EXCEPTION TYPE zdmo_cx_rap_generator + EXPORTING + textid = zdmo_cx_rap_generator=>root_cause_exception. + + + ENDCASE. + + IF rap_bo_uuid IS NOT INITIAL. + + "Fill job status fields + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText ) + WITH VALUE #( FOR item IN items ( %key = item-%key + JobStatus = 'F' + JobStatusCriticality = '3' "green + JobStatusText = 'Finished' + ) ) + REPORTED DATA(update_reported_finished). + COMMIT ENTITIES . + COMMIT WORK. + + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_asyn.clas.xml b/src/zdmo_cl_rap_generator_asyn.clas.xml new file mode 100644 index 0000000..0faa65b --- /dev/null +++ b/src/zdmo_cl_rap_generator_asyn.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_ASYN</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>run RAP Generator asynchronously</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_base.clas.abap b/src/zdmo_cl_rap_generator_base.clas.abap new file mode 100644 index 0000000..0470fc2 --- /dev/null +++ b/src/zdmo_cl_rap_generator_base.clas.abap @@ -0,0 +1,197 @@ +CLASS zdmo_cl_rap_generator_base DEFINITION ABSTRACT + PUBLIC + CREATE PUBLIC . + + PUBLIC SECTION. + DATA : mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system, + mo_put_operation TYPE REF TO if_xco_cp_gen_d_o_put, + mo_draft_tabl_put_operation TYPE REF TO if_xco_cp_gen_d_o_put, + mo_put_operation1 TYPE REF TO if_xco_cp_gen_d_o_put, + mo_put_operation2 TYPE REF TO if_xco_cp_gen_d_o_put, + mo_srvb_put_operation TYPE REF TO if_xco_cp_gen_d_o_put, + mo_patch_operation TYPE REF TO if_xco_cp_gen_o_patch_mass, + mo_bdef_specification TYPE REF TO if_xco_cp_gen_bdef_s_form, + mo_table_specification TYPE REF TO if_xco_cp_gen_tabl_dbt_s_form, + mo_struct_specification TYPE REF TO if_xco_cp_gen_tabl_str_s_form, + mo_service_def_specification TYPE REF TO if_xco_cp_gen_srvd_s_form. + METHODS get_environment IMPORTING i_transport TYPE sxco_transport OPTIONAL + RETURNING VALUE(r_environment) TYPE REF TO if_xco_cp_gen_env_dev_system. + METHODS get_put_operation IMPORTING i_environment TYPE REF TO if_xco_cp_gen_env_dev_system + RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_cp_gen_d_o_put . + METHODS get_put_operation_for_devc IMPORTING i_environment TYPE REF TO if_xco_cp_gen_env_dev_system + RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_cp_gen_devc_d_o_put . + METHODS get_patch_operation IMPORTING i_environment TYPE REF TO if_xco_cp_gen_env_dev_system + RETURNING VALUE(r_patch_operation) TYPE REF TO if_xco_cp_gen_o_patch_mass. +* DATA : mo_environment TYPE REF TO if_xco_gen_environment, +* mo_put_operation TYPE REF TO if_xco_gen_o_mass_put, +* mo_put_operation1 TYPE REF TO if_xco_gen_o_mass_put, +* mo_put_operation2 TYPE REF TO if_xco_gen_o_mass_put, +* mo_draft_tabl_put_operation TYPE REF TO if_xco_gen_o_mass_put, +* mo_srvb_put_operation TYPE REF TO if_xco_gen_o_mass_put, +* mo_patch_operation type ref to if_xco_gen_o_patch_mass, +* mo_bdef_specification TYPE REF TO if_xco_gen_bdef_s_form, +* mo_table_specification TYPE REF TO if_xco_gen_tabl_dbt_s_form, +* mo_struct_specification TYPE REF TO if_xco_gen_tabl_str_s_form, +* mo_service_def_specification TYPE REF TO if_xco_gen_srvd_s_form. +* METHODS get_environment IMPORTING i_transport TYPE sxco_transport OPTIONAL +* RETURNING VALUE(r_environment) TYPE REF TO if_xco_gen_environment. +* METHODS get_put_operation_for_devc IMPORTING i_environment TYPE REF TO if_xco_gen_environment +* RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_gen_devc_o_put . +* METHODS get_put_operation IMPORTING i_environment TYPE REF TO if_xco_gen_environment +* RETURNING VALUE(r_put_operation) TYPE REF TO if_xco_gen_o_mass_put . +* METHODS get_patch_operation IMPORTING i_environment TYPE REF TO if_xco_gen_environment +* RETURNING VALUE(r_patch_operation) TYPE REF TO if_xco_gen_o_patch_mass. + + PROTECTED SECTION. + METHODS cds_p_view_set_provider_cntrct IMPORTING i_projection_view_spcification TYPE REF TO if_xco_gen_ddls_s_fo_p_view . + METHODS cds_i_view_set_provider_cntrct IMPORTING i_interface_view_spcification TYPE REF TO if_xco_gen_ddls_s_fo_p_view . + METHODS set_extensible_for_mapping IMPORTING io_mapping TYPE REF TO if_xco_gen_bdef_s_fo_b_mapping . + METHODS set_bdef_extensible_options IMPORTING io_specification LIKE mo_bdef_specification. + METHODS set_table_enhancement_cat_any IMPORTING io_specification LIKE mo_table_specification. + METHODS set_struct_enhancement_cat_any IMPORTING io_specification LIKE mo_struct_specification. + METHODS set_service_definition_annos IMPORTING io_specification LIKE mo_service_def_specification + io_rap_bo_node TYPE REF TO zdmo_cl_rap_node. + METHODS add_include_structure_to_table IMPORTING io_rap_bo_node TYPE REF TO ZDMO_cl_rap_node + RETURNING VALUE(r_success) TYPE abap_bool. + + + + METHODS put_operation_execute IMPORTING i_put_operation TYPE REF TO if_xco_cp_gen_d_o_put + i_skip_activation TYPE abap_boolean OPTIONAL + RETURNING VALUE(r_result) TYPE REF TO if_xco_gen_o_put_result. +* METHODS put_operation_execute IMPORTING i_put_operation TYPE REF TO if_xco_gen_o_mass_put +* i_skip_activation TYPE abap_boolean OPTIONAL +* RETURNING VALUE(r_result) TYPE REF TO if_xco_gen_o_put_result. + PRIVATE SECTION. + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_BASE IMPLEMENTATION. + + + METHOD add_include_structure_to_table. + + DATA extension_include_name TYPE sxco_ad_object_name . + DATA table_name TYPE sxco_dbt_object_name . + + extension_include_name = to_upper( io_rap_bo_node->rap_node_objects-extension_include ). + table_name = to_upper( io_rap_bo_node->data_source_name ). + + DATA(xco_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF xco_library->on_premise_branch_is_used( ). + xco_library->add_include_structure_to_table( + table_name = table_name + extension_include_name = extension_include_name + ). + ELSE. + "valid only for cloud + DATA(lo_change_specification) = mo_patch_operation->for-tabl-for-database_table->add_object( table_name )->create_change_specification( ). + lo_change_specification->for-insert->add_include( )->set_structure( extension_include_name ). + ENDIF. + + ENDMETHOD. + + + METHOD cds_i_view_set_provider_cntrct. + "valid as of 2022 + i_interface_view_spcification->set_provider_contract( io_provider_contract = xco_cp_cds=>provider_contract->transactional_interface ). + ENDMETHOD. + + + METHOD cds_p_view_set_provider_cntrct. + "valid as of 2022 + i_projection_view_spcification->set_provider_contract( io_provider_contract = xco_cp_cds=>provider_contract->transactional_query ). + ENDMETHOD. + + + METHOD get_environment. + r_environment = xco_cp_generation=>environment->dev_system( i_transport ) . +* IF i_transport IS NOT INITIAL. +* r_environment = xco_generation=>environment->transported( i_transport ). +* ELSE. +* r_environment = xco_generation=>environment->local. +* ENDIF. + ENDMETHOD. + + + METHOD get_patch_operation. + r_patch_operation = i_environment->create_patch_operation( ). +* r_patch_operation = i_environment->create_mass_patch_operation( ). + ENDMETHOD. + + + METHOD get_put_operation. + r_put_operation = i_environment->create_put_operation( ). +* r_put_operation = i_environment->create_mass_put_operation( ). + ENDMETHOD. + + + METHOD get_put_operation_for_devc. + "on prem interface of environment does not offer "for-devc" + r_put_operation = i_environment->for-devc->create_put_operation( ). + ENDMETHOD. + + + METHOD put_operation_execute. + "On premise there is no skip activation available +* IF i_skip_activation = abap_true. +* i_put_operation->add_option( XCO_GENERATION=>OPTION->SKIP_ACTIVATION ). +* r_result = i_put_operation->execute( ). +* RETURN. +* ENDIF. + r_result = i_put_operation->execute( ). + ENDMETHOD. + + + METHOD set_bdef_extensible_options. + "valid as of 2023 + io_specification->set_extensible_options( + VALUE #( + ( xco_cp_behavior_definition=>extensible_option->with_additional_save ) + ( xco_cp_behavior_definition=>extensible_option->with_determinations_on_modify ) + ( xco_cp_behavior_definition=>extensible_option->with_determinations_on_save ) + ( xco_cp_behavior_definition=>extensible_option->with_validations_on_save ) + ) + ). + ENDMETHOD. + + + METHOD set_extensible_for_mapping. + "valid as of 2023 + io_mapping->set_extensible( )->set_corresponding( ). + ENDMETHOD. + + + METHOD set_service_definition_annos. + "valid as of 2023 + IF io_rap_bo_node->is_extensible( ) = abap_true. + "add @AbapCatalog.extensibility.extensible: true + io_specification->add_annotation( 'AbapCatalog.extensibility.extensible' )->value->build( )->add_boolean( abap_true ). + ENDIF. + + "check if custom entities will be generated. + "if yes the leading entity is an r-view rather than a p-view + IF io_rap_bo_node->data_source_type = zdmo_cl_rap_node=>data_source_types-abstract_entity OR + io_rap_bo_node->data_source_type = zdmo_cl_rap_node=>data_source_types-abap_type . + io_specification->add_annotation( 'ObjectModel.leadingEntity.name' )->value->build( )->add_string( CONV #( io_rap_bo_node->rap_node_objects-cds_view_r ) ). + ELSE. + io_specification->add_annotation( 'ObjectModel.leadingEntity.name' )->value->build( )->add_string( CONV #( io_rap_bo_node->rap_node_objects-cds_view_p ) ). + ENDIF. + + ENDMETHOD. + + + METHOD set_struct_enhancement_cat_any. + "valid as of 2402 + io_specification->set_enhancement_category( xco_cp_table=>enhancement_category->extensible_any ). + ENDMETHOD. + + + METHOD set_table_enhancement_cat_any. + "valid as of 2402 + io_specification->set_enhancement_category( xco_cp_table=>enhancement_category->extensible_any ). + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_base.clas.xml b/src/zdmo_cl_rap_generator_base.clas.xml new file mode 100644 index 0000000..c86da45 --- /dev/null +++ b/src/zdmo_cl_rap_generator_base.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_BASE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Wrapper for xco environment</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_console.clas.abap b/src/zdmo_cl_rap_generator_console.clas.abap new file mode 100644 index 0000000..5ed4510 --- /dev/null +++ b/src/zdmo_cl_rap_generator_console.clas.abap @@ -0,0 +1,143 @@ +CLASS zdmo_cl_rap_generator_console DEFINITION + PUBLIC + INHERITING FROM cl_xco_cp_adt_simple_classrun + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + PROTECTED SECTION. + METHODS main REDEFINITION. + METHODS get_json_string + RETURNING VALUE(json_string) TYPE string. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_CONSOLE IMPLEMENTATION. + + + METHOD get_json_string. + json_string = '{' && |\r\n| && + '"namespace":"Z",' && |\r\n| && + '"package":"Z_PROJ_TEST",' && |\r\n| && + '"dataSourceType":"table",' && |\r\n| && + '"bindingType":"odata_v4_ui",' && |\r\n| && + '"implementationType":"managed_uuid",' && |\r\n| && + '"prefix":"",' && |\r\n| && + '"suffix":"_99",' && |\r\n| && + '"draftEnabled":true,' && |\r\n| && + '"multiInlineEdit":false,' && |\r\n| && + '"isCustomizingTable":false,' && |\r\n| && + '"addBusinessConfigurationRegistration":false,' && |\r\n| && +* '"transportRequest":"PM1K900006",' && |\r\n| && + '"publishservice":true,' && |\r\n| && + '"addbasiciviews":false,' && |\r\n| && + '"isextensible":false,' && |\r\n| && + '"hierarchy":' && |\r\n| && + '{' && |\r\n| && + ' "entityname":"SalesORder",' && |\r\n| && + ' "dataSource":"ZDMO_UUID_HEADER",' && |\r\n| && + ' "objectid":"SALESORDER_ID",' && |\r\n| && + ' "uuid":"HEADER_UUID",' && |\r\n| && + ' "parentUUID":"",' && |\r\n| && + ' "rootUUID":"",' && |\r\n| && + ' "etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + ' "totalEtag":"LAST_CHANGED_AT",' && |\r\n| && + ' "lastChangedAt":"LAST_CHANGED_AT",' && |\r\n| && + ' "lastChangedBy":"LAST_CHANGED_BY",' && |\r\n| && + ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + ' "createdAt":"CREATED_AT",' && |\r\n| && + ' "createdBy":"CREATED_BY",' && |\r\n| && + + + + ' "Children":' && |\r\n| && + ' [' && |\r\n| && + ' {' && |\r\n| && + ' "entityname":"Item",' && |\r\n| && + ' "dataSource":"ZDMO_UUID_ITEM",' && |\r\n| && + ' "objectid":"ITEM_ID",' && |\r\n| && + ' "uuid":"ITEM_UUID",' && |\r\n| && + ' "parentUUID":"PARENT_UUID",' && |\r\n| && + ' "rootUUID":"",' && |\r\n| && + ' "etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + ' "totalEtag":"",' && |\r\n| && + ' "lastChangedAt":"",' && |\r\n| && + ' "lastChangedBy":"",' && |\r\n| && + ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + ' "createdAt":"",' && |\r\n| && + ' "createdBy":"",' && |\r\n| && + + + ' "Children":' && |\r\n| && + ' [' && |\r\n| && + ' {' && |\r\n| && + ' "entityname":"SubItem",' && |\r\n| && + ' "dataSource":"ZDMO_UUID_S_ITEM",' && |\r\n| && + ' "objectid":"SCHEDULE_LINE_ID",' && |\r\n| && + ' "uuid":"SCHED_LINE_UUID",' && |\r\n| && + ' "parentUUID":"PARENT_UUID",' && |\r\n| && + ' "rootUUID":"ROOT_UUID",' && |\r\n| && + ' "etagMaster":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + ' "totalEtag":"",' && |\r\n| && + ' "lastChangedAt":"",' && |\r\n| && + ' "lastChangedBy":"",' && |\r\n| && + ' "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",' && |\r\n| && + ' "createdAt":"",' && |\r\n| && + ' "createdBy":""' && |\r\n| && + + + ' }' && |\r\n| && + ' ]' && |\r\n| && + ' }' && |\r\n| && + ' ]' && |\r\n| && + '}' && |\r\n| && + '}' . + ENDMETHOD. + + + METHOD main. + TRY. + DATA rap_generator_exception_occurd TYPE abap_bool. + DATA(json_string) = get_json_string( ). + + DATA(on_prem_xco_lib) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true. + DATA(rap_generator_on_prem) = ZDMO_cl_rap_generator=>create_for_on_prem_development( json_string ). + DATA(framework_messages) = rap_generator_on_prem->generate_bo( ). + rap_generator_exception_occurd = rap_generator_on_prem->exception_occured( ). + IF rap_generator_exception_occurd = abap_true. + out->write( |Caution: Exception occured | ) . + out->write( |Check repository objects of RAP BO { rap_generator_on_prem->get_rap_bo_name( ) }.| ) . + ELSE. + out->write( |RAP BO { rap_generator_on_prem->get_rap_bo_name( ) } generated successfully| ) . + ENDIF. + ELSE. + DATA(rap_generator) = ZDMO_cl_rap_generator=>create_for_cloud_development( json_string ). + LOOP AT rap_generator->root_node->lt_fields INTO DATA(field). + out->write( |field-built_in_type { field-built_in_type }| ). + out->write( |field-built_in_type_decimals { field-built_in_type_decimals }| ). + out->write( |field-built_in_type_length { field-built_in_type_length }| ). + + ENDLOOP. + EXIT. + framework_messages = rap_generator->generate_bo( ). + + + rap_generator_exception_occurd = rap_generator->exception_occured( ). + IF rap_generator_exception_occurd = abap_true. + out->write( |Caution: Exception occured | ) . + out->write( |Check repository objects of RAP BO { rap_generator->get_rap_bo_name( ) }.| ) . + ELSE. + out->write( |RAP BO { rap_generator->get_rap_bo_name( ) } generated successfully| ) . + ENDIF. + ENDIF. + CATCH ZDMO_cx_rap_generator INTO DATA(rap_generator_exception). + out->write( 'RAP Generator has raised the following exception:' ) . + out->write( rap_generator_exception->get_text( ) ). + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_console.clas.xml b/src/zdmo_cl_rap_generator_console.clas.xml new file mode 100644 index 0000000..499615a --- /dev/null +++ b/src/zdmo_cl_rap_generator_console.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_CONSOLE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>zcl_rap_generator_console_demo</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_del.clas.abap b/src/zdmo_cl_rap_generator_del.clas.abap new file mode 100644 index 0000000..011e8e6 --- /dev/null +++ b/src/zdmo_cl_rap_generator_del.clas.abap @@ -0,0 +1,1737 @@ +CLASS zdmo_cl_rap_generator_del DEFINITION +INHERITING FROM zdmo_cl_rap_generator_base + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS constructor + IMPORTING + i_boname TYPE ZDMO_R_RAPG_ProjectTP-BoName. + + METHODS rap_gen_project_objects_exist + IMPORTING + i_rap_generator_project TYPE ZDMO_R_RAPG_ProjectTP + RETURNING + VALUE(r_repository_objects_exist) TYPE abap_bool. + + METHODS start_deletion. + + PROTECTED SECTION. + PRIVATE SECTION. + + TYPES : BEGIN OF t_log_entry, + DetailLevel TYPE ballevel, + Severity TYPE symsgty, + Text TYPE bapi_msg, + TimeStamp TYPE timestamp, + END OF t_log_entry. + TYPES : t_log_entries TYPE STANDARD TABLE OF t_log_entry. + + DATA boname TYPE zdmo_rap_gen_entityname. + DATA bo_data TYPE ZDMO_R_RAPG_ProjectTP. + + DATA json_string TYPE ZDMO_R_RAPG_ProjectTP-JsonString. + DATA package_language_version TYPE ZDMO_R_RAPG_ProjectTP-PackageLanguageVersion. + DATA rap_bo_uuid TYPE ZDMO_R_RAPG_ProjectTP-RapBoUUID. + DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + + DATA delete_objects_in_package TYPE sxco_package. + DATA demo_mode TYPE abap_boolean VALUE abap_false. + + + + DATA test_bo_name TYPE ZDMO_R_RAPG_ProjectTP-BoName VALUE 'ZR_SalesOrderTP_LOG3'. +* DATA rap_bo_name TYPE ZDMO_R_RAPG_ProjectTP-BoName. + DATA perform_srvb_is_active_check TYPE abap_bool VALUE abap_false. + + "run in background Y/N? +* DATA run_in_background TYPE abap_bool VALUE abap_true. + DATA run_in_background TYPE abap_bool VALUE abap_false. + + "run in foreground Y/N? + DATA run_in_foreground TYPE abap_bool VALUE abap_true. +* DATA run_in_foreground TYPE abap_bool VALUE abap_false. + +* DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + DATA generated_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects. + DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object. + + DATA out TYPE REF TO if_oo_adt_classrun_out. +* DATA application_log TYPE REF TO if_bali_log . + + METHODS add_log_entries_for_rap_bo IMPORTING i_rap_bo_name TYPE sxco_cds_object_name OPTIONAL + i_log_entries TYPE t_log_entries + RETURNING VALUE(r_success) TYPE abap_boolean. + + METHODS generated_objects_are_deleted + IMPORTING +* i_rap_bo_name TYPE sxco_ar_object_name + i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects + EXPORTING r_existing_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects + RETURNING VALUE(r_objects_have_been_deleted) TYPE abap_bool. + + METHODS get_root_exception + IMPORTING !ix_exception TYPE REF TO cx_root + RETURNING VALUE(rx_root) TYPE REF TO cx_root . + + METHODS add_findings_to_output + IMPORTING i_task_name TYPE bapi_msg + i_findings TYPE REF TO if_xco_gen_o_findings + RETURNING VALUE(r_success) TYPE abap_bool +* RAISING cx_bali_runtime + . + METHODS add_text_to_app_log_or_console + IMPORTING i_text TYPE cl_bali_free_text_setter=>ty_text + i_severity TYPE cl_bali_free_text_setter=>ty_severity DEFAULT if_bali_constants=>c_severity_status +* RAISING cx_bali_runtime + . + METHODS get_objects_from_package + IMPORTING i_package TYPE sxco_package + RETURNING VALUE(r_repository_objects) TYPE zdmo_cl_rap_generator=>t_generated_repository_objects. + METHODS get_objects_from_rap_generator + IMPORTING i_rap_bo_name TYPE sxco_ar_object_name + RETURNING VALUE(r_repository_objects) TYPE zdmo_cl_rap_generator=>t_generated_repository_objects. + METHODS delete_generated_objects + IMPORTING i_rap_bo_name TYPE sxco_ar_object_name + i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects. + METHODS get_locking_transport + IMPORTING i_object_type TYPE if_xco_gen_o_finding=>tv_object_type + i_object_name TYPE if_xco_gen_o_finding=>tv_object_name + RETURNING VALUE(r_transport) TYPE sxco_transport. + METHODS service_binding_is_published + IMPORTING i_object_name TYPE if_xco_gen_o_finding=>tv_object_name + RETURNING VALUE(r_is_published) TYPE abap_bool. + + + METHODS delete_service_bindings + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_service_definitions + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_behavior_definitions + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_metadata_extensions + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_cds_views + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_classes + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_draft_tables + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS delete_structures + IMPORTING i_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects +* i_environment TYPE REF TO if_xco_cp_gen_env_dev_system +* RAISING cx_bali_runtime + . + METHODS Delete_RAP_Generator_Project + IMPORTING + i_rap_bo_name TYPE sxco_ar_object_name +* RAISING +* cx_bali_runtime + . + + METHODS delete_release_state + IMPORTING object_type TYPE if_abap_api_state=>ty_object_directory_type + object_name TYPE if_abap_api_state=>ty_object_directory_name + sub_object_type TYPE if_abap_api_state=>ty_sub_object_type OPTIONAL + sub_object_name TYPE if_abap_api_state=>ty_sub_object_name OPTIONAL +* release_contract TYPE if_abap_api_state=>ty_release_contract + request TYPE if_abap_api_state=>ty_request + RETURNING VALUE(r_release_state_is_deleted) TYPE abap_bool. + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_DEL IMPLEMENTATION. + + + METHOD add_findings_to_output. + + DATA text TYPE c LENGTH 200 . + DATA(finding_texts) = i_findings->get( ). + +********************************************************************** + + IF finding_texts IS NOT INITIAL. + LOOP AT finding_texts INTO DATA(finding_text). + text = |{ finding_text->object_type } { finding_text->object_name } { finding_text->message->get_text( ) }|. + add_text_to_app_log_or_console( + i_text = text + i_severity = finding_text->message->value-msgty + ). + ENDLOOP. + ENDIF. + +********************************************************************** + + + DATA log_entry TYPE t_log_entry. + DATA log_entries TYPE t_log_entries. + + log_entry-text = i_task_name. + log_entry-detaillevel = 1. + log_entry-severity = 'S'. + + IF i_findings->contain_warnings( ). + log_entry-severity = 'W'. + ENDIF. + + IF i_findings->contain_errors( ). + log_entry-severity = 'E'. + ENDIF. + + APPEND log_entry TO log_entries. + + finding_texts = i_findings->get( ). + + IF finding_texts IS NOT INITIAL. + LOOP AT finding_texts INTO finding_text. + log_entry-text = |{ finding_text->object_type } { finding_text->object_name } { finding_text->message->get_text( ) }|. + log_entry-severity = finding_text->message->value-msgty. + log_entry-detaillevel = 2. + APPEND log_entry TO log_entries. + ENDLOOP. + ENDIF. + + r_success = add_log_entries_for_rap_bo( + i_rap_bo_name = CONV #( boname ) + i_log_entries = log_entries + ). + + + + + ENDMETHOD. + + + METHOD add_log_entries_for_rap_bo. + + DATA create_rapbolog_cba TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log. + + DATA create_raplog_cba_line TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\_Log. + DATA log_entries LIKE create_raplog_cba_line-%target. + DATA log_entry LIKE LINE OF log_entries. +* DATA log_entries TYPE TABLE FOR CREATE ZDMO_R_RAPG_ProjectTP\\log . +* DATA log_entry TYPE STRUCTURE FOR CREATE ZDMO_R_RAPG_ProjectTP\\log . + DATA n TYPE i. + DATA time_stamp TYPE timestampl. + + GET TIME STAMP FIELD time_stamp. + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @boname + INTO @DATA(rap_generator_bo). + + CHECK sy-subrc = 0. + + LOOP AT i_log_entries INTO DATA(my_log_entry). + n += 1. + log_entry = VALUE #( %is_draft = if_abap_behv=>mk-off + %cid = |test{ n }| + Severity = my_log_entry-Severity + DetailLevel = my_log_entry-DetailLevel + Text = my_log_entry-Text + TimeStamp = time_stamp + ). + APPEND log_entry TO log_entries. + ENDLOOP. + + create_rapbolog_cba = VALUE #( ( %is_draft = if_abap_behv=>mk-off + %key-rapbouuid = rap_generator_bo-RapboUUID + %target = log_entries ) ) . + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY project + CREATE BY \_Log + FIELDS ( + LogItemNumber + DetailLevel + Severity + Text + TimeStamp + ) + WITH create_rapbolog_cba + MAPPED DATA(mapped) + FAILED DATA(failed) + REPORTED DATA(reported). + + + IF mapped-log IS NOT INITIAL. + COMMIT ENTITIES. + COMMIT WORK. + r_success = abap_true. + ENDIF. + IF failed-log IS NOT INITIAL. + r_success = abap_false. + ENDIF. + + ENDMETHOD. + + + METHOD add_text_to_app_log_or_console. + + DATA log_entry TYPE t_log_entry. + DATA log_entries TYPE t_log_entries. + + log_entry-text = i_text. + log_entry-detaillevel = 1. + log_entry-severity = i_severity. + APPEND log_entry TO log_entries. + + IF boname IS NOT INITIAL. + add_log_entries_for_rap_bo( + i_rap_bo_name = CONV #( boname ) + i_log_entries = log_entries + ). + ENDIF. + +* DATA(application_log_free_text) = cl_bali_free_text_setter=>create( +* severity = i_severity " if_bali_constants=>c_severity_status +* text = i_text ). +* application_log_free_text->set_detail_level( detail_level = '1' ). +* application_log->add_item( item = application_log_free_text ). +* cl_bali_log_db=>get_instance( )->save_log( +* log = application_log +* assign_to_current_appl_job = abap_true +* ). + + + +* ELSE. + + ENDMETHOD. + + + METHOD constructor. + super->constructor( ). + boname = i_boname. + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @i_boname + INTO @bo_data . + DATA(xco_on_prem_library) = NEW zdmo_cl_rap_xco_on_prem_lib( ). + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + ENDMETHOD. + + + METHOD delete_behavior_definitions. + DATA task_name TYPE bapi_msg VALUE 'delete behavior definitions'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. + DATA object_name TYPE sxco_cds_object_name. + DATA(delete_operation) = mo_environment->for-bdef->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + + IF bo_data-isExtensible = abap_true. + LOOP AT del_repository_objects INTO DATA(del_repository_object). + delete_release_state( + EXPORTING + object_type = del_repository_object-object_type + object_name = del_repository_object-object_name + request = del_repository_object-transport_request + RECEIVING + r_release_state_is_deleted = DATA(release_state_is_deleted) + ). + add_text_to_app_log_or_console( + i_text = |Delete release state { object_type } { object_name } - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDLOOP. + ENDIF. + + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD delete_cds_views. + DATA task_name TYPE bapi_msg VALUE 'delete cds views'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-cds_view_r. + DATA object_name TYPE sxco_cds_object_name. + DATA(delete_operation) = mo_environment->for-ddls->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + + IF bo_data-isExtensible = abap_true. + LOOP AT del_repository_objects INTO DATA(del_repository_object). + delete_release_state( + EXPORTING + object_type = del_repository_object-object_type + object_name = del_repository_object-object_name + request = del_repository_object-transport_request + RECEIVING + r_release_state_is_deleted = DATA(release_state_is_deleted) + ). + add_text_to_app_log_or_console( + i_text = |Delete release state { object_type } { object_name } - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDLOOP. + ENDIF. + + + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD delete_classes. + DATA task_name TYPE bapi_msg VALUE 'delete classes'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-behavior_implementation. + DATA object_name TYPE sxco_ad_object_name. + DATA(delete_operation) = mo_environment->for-clas->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD delete_draft_tables. + DATA task_name TYPE bapi_msg VALUE 'delete draft tables'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-draft_table. + DATA object_name TYPE sxco_dbt_object_name . + DATA(delete_operation) = mo_environment->for-tabl-for-database_table->create_delete_operation( ). + "end change + add_text_to_app_log_or_console( |Delete operation - warnings were raised.| ). + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( CONV #( object_name ) ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD delete_generated_objects. + + DATA transport_request TYPE sxco_transport. + DATA transport_requests TYPE STANDARD TABLE OF sxco_transport. + + DATA repository_objects_in_transprt TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + + DATA text TYPE cl_bali_free_text_setter=>ty_text . + + LOOP AT i_repository_objects INTO DATA(repository_object). + transport_request = repository_object-transport_request. +* IF transport_request IS NOT INITIAL. + COLLECT transport_request INTO transport_requests. +* ENDIF. + ENDLOOP. + +* DATA(rap_bo_name_in_upper_case) = to_upper( i_rap_bo_name ). +* SELECT SINGLE ABAPPackage FROM I_CustABAPObjDirectoryEntry +* WHERE ABAPObject = @rap_bo_name_in_upper_case +* AND ABAPObjectType = @zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r +* INTO @DATA(package). + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @i_rap_bo_name + INTO @DATA(rap_bo_header_data). + + SELECT SINGLE * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @rap_bo_header_data-RapboUUID + INTO @DATA(rap_bo_root_node_data). + + DATA(my_bdef) = xco_lib->get_behavior_definition( CONV sxco_cds_object_name( rap_bo_header_data-BoName ) ). + DATA(my_srvb) = xco_lib->get_service_binding( CONV sxco_srvb_object_name( rap_bo_root_node_data-ServiceBinding ) ). + + "@todo - add more checks + IF my_srvb->if_xco_ar_object~exists( ). + DATA(package) = my_srvb->content( )->service_binding->if_xco_ar_object~get_package( )->name. + ELSEIF my_bdef->if_xco_ar_object~exists( ). + package = my_bdef->content( )->behavior_definition->if_xco_ar_object~get_package( )->name. + ENDIF. + + package = bo_data-PackageName. + +* IF lines( transport_requests ) > 1. +* +* "if several transport requests are used take the first one and delete related objects +* "deletion has to be run several times until all objects have been deleted. +* +* transport_request = transport_requests[ 1 ] . +* +* ELSEIF lines( transport_requests ) = 1. +* +* transport_request = transport_requests[ 1 ] . +* +* ELSE. + +* IF delete_objects_in_package IS NOT INITIAL. +* package = delete_objects_in_package. +* ENDIF. + IF xco_lib->get_package( package )->exists( ) = abap_true. + DATA(package_records_changes) = xco_lib->get_package( package )->read( )-property-record_object_changes. + ELSE. + add_text_to_app_log_or_console( |Package { package } does not exist.| ). +* EXIT. + ENDIF. + + "generate a new transport request + IF package_records_changes = abap_true. + DATA(lo_transport_target) = xco_lib->get_package( package + )->read( )-property-transport_layer->get_transport_target( ). + DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value )->create_request( |Delete RAP Business object - entity name: { i_rap_bo_name } | ). + DATA(new_transport_request) = new_transport_object->value. + ENDIF. + + LOOP AT transport_requests INTO transport_request. + + DATA(transport_request_used) = transport_request. + + CLEAR repository_objects_in_transprt. + + LOOP AT i_repository_objects INTO DATA(repository_object_in_transport) WHERE transport_request = transport_request_used. + APPEND repository_object_in_transport TO repository_objects_in_transprt. + ENDLOOP. + + IF transport_request_used = ''. + transport_request_used = new_transport_request. + ENDIF. + + add_text_to_app_log_or_console( |Use transport request { transport_request_used }| ). + +* DATA(mo_environment) = xco_cp_generation=>environment->dev_system( transport_request ) . + +******************************************************************************** + "cloud + mo_environment = get_environment( transport_request_used ) . + +* mo_environment = xco_cp_generation=>environment->dev_system( transport_request ) . +******************************************************************************** + +********************************************************************** + "on premise +* IF xco_lib->get_package( package )->read( )-property-record_object_changes = abap_true. +* mo_environment = xco_generation=>environment->transported( transport_request ). +* ELSE. +* mo_environment = xco_generation=>environment->local. +* ENDIF. +********************************************************************** + + delete_service_bindings( repository_objects_in_transprt ). + delete_service_definitions( repository_objects_in_transprt ). + delete_behavior_definitions( repository_objects_in_transprt ). + delete_metadata_extensions( repository_objects_in_transprt ). + delete_cds_views( repository_objects_in_transprt ). + delete_classes( repository_objects_in_transprt ). + "the tables that are used as a data source will not be deleted since they have not been generated + delete_draft_tables( repository_objects_in_transprt ). + delete_structures( repository_objects_in_transprt ). + + ENDLOOP. + + ENDMETHOD. + + + METHOD delete_metadata_extensions. + DATA task_name TYPE bapi_msg VALUE 'metadata extensions'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-meta_data_extension. + DATA object_name TYPE sxco_cds_object_name. + DATA(delete_operation) = mo_environment->for-ddlx->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD Delete_RAP_Generator_Project. + + + ENDMETHOD. + + + METHOD delete_release_state. + + DATA release_contract TYPE if_abap_api_state=>ty_release_contract. + DATA log_entry TYPE t_log_entry. + DATA log_entries TYPE t_log_entries. + + TRY. + + CASE object_type. + + WHEN 'DDLS'. + DATA(api_state_handler) = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = object_type + object_name = to_upper( object_name ) "'ZRAP630E_Shop_051' ) + sub_object_type = 'CDS_STOB' + sub_object_name = to_upper( object_name ) "'ZRAP630E_Shop_051' ) + ) ). + + WHEN 'STRU'. + "internally we use object_type 'STRU' to be able to choose the correct + "xco generation api ->for->structure vs. ->for->table + + api_state_handler = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = 'TABL' + object_name = to_upper( object_name ) "'zrap630sshop_051' ) + ) ). + + WHEN OTHERS. + + api_state_handler = cl_abap_api_state=>create_instance( api_key = VALUE #( + object_type = object_type + object_name = to_upper( object_name ) "'zrap630sshop_051' ) + ) ). + + ENDCASE. + + release_contract = zdmo_cl_rap_node=>release_contract_c1. + + IF api_state_handler->is_released( + EXPORTING + release_contract = release_contract + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + ). + r_release_state_is_deleted = abap_false. + api_state_handler->delete_release_state( + release_contract = zdmo_cl_rap_node=>release_contract_c1 + request = request + ). + r_release_state_is_deleted = abap_true. + ELSE. + r_release_state_is_deleted = abap_true. + ENDIF. + + release_contract = zdmo_cl_rap_node=>release_contract_c0. + + IF api_state_handler->is_released( + EXPORTING + release_contract = release_contract + use_in_cloud_development = abap_true + use_in_key_user_apps = abap_false + ). + r_release_state_is_deleted = abap_false. + api_state_handler->delete_release_state( + release_contract = zdmo_cl_rap_node=>release_contract_c0 + request = request + ). + r_release_state_is_deleted = abap_true. + ELSE. + r_release_state_is_deleted = abap_true. + ENDIF. + + + CATCH cx_abap_api_state INTO DATA(bdef_del_rel_state_exception). + + + log_entry-text = |Delete release state - { release_contract } of { object_type } { object_name } .|. + log_entry-severity = 'E'. + log_entry-detaillevel = 1. + APPEND log_entry TO log_entries. + + log_entry-text = | { bdef_del_rel_state_exception->get_text( ) }.|. + log_entry-detaillevel = 2. + APPEND log_entry TO log_entries. + + add_log_entries_for_rap_bo( + i_rap_bo_name = CONV #( boname ) + i_log_entries = log_entries + ). + + ENDTRY. + + ENDMETHOD. + + + METHOD delete_service_bindings. + DATA task_name TYPE bapi_msg VALUE 'service bindings'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>root_node_object_types-service_binding. + DATA object_name TYPE sxco_srvb_object_name. + DATA(delete_operation) = mo_environment->for-srvb->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD delete_service_definitions. + DATA task_name TYPE bapi_msg VALUE 'service definitions'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>root_node_object_types-service_definition. + DATA object_name TYPE sxco_srvd_object_name. + DATA(delete_operation) = mo_environment->for-srvd->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD delete_structures. + DATA task_name TYPE bapi_msg VALUE 'structures'. + "begin change + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type VALUE zdmo_cl_rap_node=>node_object_types-control_structure. + DATA object_name TYPE sxco_ad_object_name . + DATA(delete_operation) = mo_environment->for-tabl-for-structure->create_delete_operation( ). + "end change + DATA del_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects . + LOOP AT i_repository_objects INTO DATA(repository_object) WHERE object_type = object_type. + APPEND repository_object TO del_repository_objects. + object_name = to_upper( repository_object-object_name ). + delete_operation->add_object( object_name ). + add_text_to_app_log_or_console( |{ object_type } { object_name } will be deleted.| ). + ENDLOOP. + CHECK del_repository_objects IS NOT INITIAL. + IF bo_data-isExtensible = abap_true. + LOOP AT del_repository_objects INTO DATA(del_repository_object). + delete_release_state( + EXPORTING + object_type = del_repository_object-object_type + object_name = del_repository_object-object_name + request = del_repository_object-transport_request + RECEIVING + r_release_state_is_deleted = DATA(release_state_is_deleted) + ). + add_text_to_app_log_or_console( + i_text = |Delete release state { object_type } { object_name } - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDLOOP. + ENDIF. + + TRY. + DATA(delete_operation_result) = delete_operation->execute( ). + IF delete_operation_result->findings->contain_errors( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - errors occured.| + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + IF delete_operation_result->findings->contain_warnings( ) = abap_true. + add_text_to_app_log_or_console( + i_text = |Delete operation - warnings were raised.| + i_severity = if_bali_constants=>c_severity_warning + ). + ENDIF. + IF delete_operation_result->findings->contain_errors( ) = abap_false AND + delete_operation_result->findings->contain_warnings( ) = abap_false. + add_text_to_app_log_or_console( + i_text = |Delete operation was successfull.| + i_severity = if_bali_constants=>c_severity_status + ). + ENDIF. + IF delete_operation_result->findings->get( ) IS NOT INITIAL. + add_text_to_app_log_or_console( |Findings.| ). + add_findings_to_output( + i_task_name = task_name + i_findings = delete_operation_result->findings + ). +* CATCH cx_bali_runtime.( delete_operation_result->findings ). + ENDIF. + CATCH cx_xco_gen_delete_exception INTO DATA(xco_delete_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + add_findings_to_output( + i_task_name = task_name + i_findings = xco_delete_exception->findings + ). +* CATCH cx_bali_runtime.( xco_delete_exception->findings ). + CATCH cx_root INTO DATA(srvb_deletion_exception). + add_text_to_app_log_or_console( + i_text = |Delete operation - Exception occured.| + i_severity = if_bali_constants=>c_severity_error + ). + DATA(delete_operation_text) = CONV cl_bali_free_text_setter=>ty_text( get_root_exception( srvb_deletion_exception )->get_longtext( ) ). + add_text_to_app_log_or_console( + i_text = delete_operation_text + i_severity = if_bali_constants=>c_severity_error + ). + ENDTRY. + ENDMETHOD. + + + METHOD generated_objects_are_deleted. + + DATA object_name TYPE if_xco_gen_o_finding=>tv_object_name . + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type. + + DATA number_of_objects_found TYPE i. + + + r_objects_have_been_deleted = abap_false. + + LOOP AT i_repository_objects INTO DATA(repository_object). + + object_name = to_upper( repository_object-object_name ). + + IF to_upper( repository_object-object_type ) = 'STRU'. + object_type = 'TABL'. + ELSE. + object_type = to_upper( repository_object-object_type ). + ENDIF. + + "when an object has been deleted but the transport request has not been released yet + "it will show up in I_CustABAPObjDirectoryEntry with the flag ABAPObjectIsDeleted = 'X' + + DATA(object_still_exists) = xco_lib->get_abap_obj_directory_entry( + EXPORTING + i_abap_object_type = object_type + i_abap_object_category = 'R3TR' + i_abap_object = object_name + ). + +* SELECT SINGLE * FROM I_CustABAPObjDirectoryEntry +* WHERE ABAPObject = @object_name +* AND ABAPObjectType = @object_type +* AND ABAPObjectIsDeleted = @abap_false +* INTO @DATA(object_still_exists). +* +* SELECT SINGLE * FROM I_ABAPObjectDirectoryEntry +* WHERE ABAPObject = @object_name +* AND ABAPObjectType = @object_type +* AND ABAPObjectIsDeleted = @abap_false +* INTO @DATA(object_still_exists2). + + IF object_still_exists IS NOT INITIAL. + IF object_still_exists-ABAPObjectIsDeleted = abap_false . + number_of_objects_found += 1. + APPEND repository_object TO r_existing_repository_objects. + ENDIF. + ENDIF. + + ENDLOOP. + + IF number_of_objects_found = 0. + r_objects_have_been_deleted = abap_true. + ENDIF. + + ENDMETHOD. + + + METHOD get_locking_transport. + + DATA object_type TYPE if_xco_gen_o_finding=>tv_object_type . + + IF i_object_type = 'STRU'. + object_type = 'TABL'. + ELSE. + object_type = i_object_type. + ENDIF. + + DATA(lo_transport_lock) = xco_cp_abap_repository=>object->for( + iv_type = object_type + iv_name = i_object_name + )->if_xco_cts_changeable~get_object( )->get_lock( ). + + + " we have not only to retrieve the locking task but the request to which the locking task belongs + " the transport_lock->get_transport() e.g. delivered the value PMDK900274. + " But when trying to delete objects like BDEF this failed with an error message such as + " Object R3TR BDEF ZR_BDTSTRAVELTP is already locked in request PMDK900273 of user CB0000000019 + + IF lo_transport_lock->exists( ) EQ abap_true. + DATA(locking_transport) = lo_transport_lock->get_transport( ). + r_transport = xco_cp_cts=>transport->for( locking_transport )->get_request( )->value. + ENDIF. + + ENDMETHOD. + + + METHOD get_objects_from_package. + DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object. + +* SELECT * FROM I_ABAPObjectDirectoryEntry WHERE ABAPPackage = @i_package +* INTO TABLE @DATA(objects_in_package) . + + DATA(objects_in_package) = xco_lib->get_objects_in_package( i_package ). + + LOOP AT objects_in_package INTO DATA(object_in_package). + generated_repository_object-object_name = object_in_package-ABAPObject. + generated_repository_object-object_type = object_in_package-ABAPObjectType. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDLOOP. + + ENDMETHOD. + + + METHOD get_objects_from_rap_generator. + DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object. + + SELECT SINGLE RapboUUID FROM ZDMO_R_RAPG_ProjectTP WHERE BoName = @i_rap_bo_name + INTO @DATA(rapnodeuuid) . + + SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @RapNodeUUID + INTO TABLE @DATA(bo_generated_objects). + + LOOP AT bo_generated_objects INTO DATA(bo_generated_object). + + generated_repository_object-hierarchy_distance_from_root = bo_generated_object-HierarchyDistanceFromRoot. + + IF bo_generated_object-IsRootNode = abap_true. + IF bo_generated_object-ServiceBinding IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-ServiceBinding. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-ServiceDefinition IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-ServiceDefinition. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_definition. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-CdsRView IS NOT INITIAL. + "bdef and cds r-view have the same name + generated_repository_object-object_name = bo_generated_object-CdsRView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-CdsPView IS NOT INITIAL. + "projection bdef and cds pr-view have the same name + generated_repository_object-object_name = bo_generated_object-CdsPView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_P. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-CdsIView IS NOT INITIAL. + "projection bdef and cds pr-view have the same name + generated_repository_object-object_name = bo_generated_object-CdsiView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_i. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + ENDIF. + "cds views + IF bo_generated_object-CdsRView IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-CdsRView. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_r. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-CdsiView IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-CdsiView. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + "basic i view + + IF bo_generated_object-CdsIViewBasic IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-CdsIViewBasic. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + " extension include view + + IF bo_generated_object-ExtensionIncludeView IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-ExtensionIncludeView. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-extension_include_view. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + + IF bo_generated_object-DraftQueryView IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-DraftQueryView. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_query_view. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + "cds projection view and metadata extension + IF bo_generated_object-CdsPView IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-CdsPView. + "add entry for projection view + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_p. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + "add entry for metadata extension + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-meta_data_extension. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + "Classes + IF bo_generated_object-BehaviorImplementationClass IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-BehaviorImplementationClass. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-behavior_implementation. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-QueryImplementationClass IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-QueryImplementationClass. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-query_implementation. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + "tables and structures + IF bo_generated_object-DraftTableName IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-DraftTableName. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_table. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + IF bo_generated_object-ControlStructure IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-ControlStructure. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-control_structure. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + IF bo_generated_object-ExtensionInclude IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-ExtensionInclude. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-extension_include. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + IF bo_generated_object-BehaviorImplementationClass IS NOT INITIAL. + generated_repository_object-object_name = bo_generated_object-BehaviorImplementationClass. + generated_repository_object-object_type = 'CLAS'. + generated_repository_object-transport_request = get_locking_transport( + i_object_type = generated_repository_object-object_type + i_object_name = generated_repository_object-object_name + ). + APPEND generated_repository_object TO r_repository_objects. + ENDIF. + + ENDLOOP. + + "remove objects that have been deleted from the list +* +* generated_objects_are_deleted( +* EXPORTING +* i_rap_bo_name = i_rap_bo_name +* i_repository_objects = r_repository_objects +* IMPORTING +* r_existing_repository_objects = r_repository_objects +* RECEIVING +* r_objects_have_been_deleted = DATA(objects_have_been_deleted) +* ). + + SORT r_repository_objects BY hierarchy_distance_from_root ASCENDING object_type ASCENDING object_type ASCENDING. + + ENDMETHOD. + + + METHOD get_root_exception. + rx_root = ix_exception. + WHILE rx_root->previous IS BOUND. + rx_root ?= rx_root->previous. + ENDWHILE. + ENDMETHOD. + + + METHOD rap_gen_project_objects_exist. + + DATA generated_repository_objects TYPE zdmo_cl_rap_generator=>t_generated_repository_objects. + DATA generated_repository_object TYPE zdmo_cl_rap_generator=>t_generated_repository_object. + +* DATA on_prem_xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. +* DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. +* +* on_prem_xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). +* +* IF on_prem_xco_lib->on_premise_branch_is_used( ) = abap_true. +* xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). +* ELSE. +* xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). +* ENDIF. + + SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @i_rap_generator_project-RapboUUID + INTO TABLE @DATA(rapbo_nodes). + + LOOP AT rapbo_nodes INTO DATA(rapbo_node). + "get repository object names and types + + CLEAR generated_repository_objects. + + IF rapbo_node-ServiceBinding IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-ServiceBinding. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-ServiceDefinition IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-ServiceDefinition. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-service_definition. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-CdsRView IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-CdsRView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. + APPEND generated_repository_object TO generated_repository_objects. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_r. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-CdsPView IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-CdsPView. + generated_repository_object-object_type = zdmo_cl_rap_node=>root_node_object_types-behavior_definition_p. + APPEND generated_repository_object TO generated_repository_objects. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_p. + APPEND generated_repository_object TO generated_repository_objects. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-meta_data_extension. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-CdsiView IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-CdsiView. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-cds_view_i. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-ControlStructure IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-ControlStructure. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-control_structure. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-BehaviorImplementationClass IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-BehaviorImplementationClass. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-behavior_implementation. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + IF rapbo_node-DraftTableName IS NOT INITIAL. + generated_repository_object-object_name = rapbo_node-DraftTableName. + generated_repository_object-object_type = zdmo_cl_rap_node=>node_object_types-draft_table. + APPEND generated_repository_object TO generated_repository_objects. + ENDIF. + + LOOP AT generated_repository_objects INTO generated_repository_object. + + CASE generated_repository_object-object_type. + + WHEN zdmo_cl_rap_node=>root_node_object_types-service_binding. + IF xco_lib->get_service_binding( CONV sxco_srvb_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>root_node_object_types-service_definition. + IF xco_lib->get_service_definition( CONV sxco_srvd_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>root_node_object_types-behavior_definition_r. "this checks also for behavior projection 'BDEF' + IF xco_lib->get_behavior_definition( CONV sxco_cds_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-behavior_implementation. "checks also for query implementation 'CLAS' + IF xco_lib->get_class( CONV sxco_ao_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-cds_view_r. "this checks also for i- and p-views as well as for custom entities + IF xco_lib->get_view( CONV sxco_cds_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-control_structure. + IF xco_lib->get_structure( CONV sxco_ad_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-draft_table. + IF xco_lib->get_database_table( CONV sxco_dbt_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN zdmo_cl_rap_node=>node_object_types-meta_data_extension. + IF xco_lib->get_metadata_extension( CONV sxco_cds_object_name( generated_repository_object-object_name ) )->if_xco_ar_object~exists( ) = abap_true. + r_repository_objects_exist = abap_true. + ENDIF. + WHEN OTHERS. + "do nothing + ENDCASE. + + ENDLOOP. + + ENDLOOP. + + ENDMETHOD. + + + METHOD service_binding_is_published. + + r_is_published = abap_false. + + "object names in I_CustABAPObjDirectoryEntry are stored in upper case + "( ABAPObjectCategory = 'R3TR' ABAPObjectType = 'SIA6' ABAPObject = 'ZUI_BDTSTRAVEL_O4_0001_G4BA_IBS' + + DATA(filter_string) = to_upper( i_object_name && '%' ). + + SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPObject LIKE @filter_string + AND ABAPObjectType = 'SIA6' + INTO TABLE @DATA(published_srvb_entries). + + IF lines( published_srvb_entries ) > 0. + r_is_published = abap_true. + ENDIF. + + ENDMETHOD. + + + METHOD start_deletion. + + TRY. +* IF application_log IS INITIAL. +* create_application_log( ). +* ENDIF. + + add_text_to_app_log_or_console( 'start method start_deletion( )' ). + + + add_text_to_app_log_or_console( |checking rap bo { BoName }| ). + + DATA(objects_to_be_deleted_1) = get_objects_from_rap_generator( BoName ). + + + "remove objects that have been deleted from the list + + generated_objects_are_deleted( + EXPORTING +* i_rap_bo_name = rap_generator_bo-BoName + i_repository_objects = objects_to_be_deleted_1 + IMPORTING + r_existing_repository_objects = DATA(objects_to_be_deleted) + RECEIVING + r_objects_have_been_deleted = DATA(objects_have_been_deleted) + ). + + + LOOP AT objects_to_be_deleted INTO DATA(object_to_be_deleted). + add_text_to_app_log_or_console( | Type: { object_to_be_deleted-object_type } Name: { object_to_be_deleted-object_name } locked by cts: { object_to_be_deleted-transport_request }| ). +* ENDLOOP. + + "unpublish service binding +* IF line_exists( objects_to_be_deleted[ object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding ] ). + IF object_to_be_deleted-object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding. + DATA(service_binding_to_be_deleted) = objects_to_be_deleted[ object_type = zdmo_cl_rap_node=>root_node_object_types-service_binding ]. + + "in cloud we have a validation that checks whether the service binding is still published + IF xco_lib->service_binding_is_published( CONV sxco_srvb_object_name( service_binding_to_be_deleted-object_name ) ). + add_text_to_app_log_or_console( |Service binding { service_binding_to_be_deleted-object_name } is published. | ). + IF demo_mode = abap_false. + add_text_to_app_log_or_console( |unpublishing { service_binding_to_be_deleted-object_name } | ). + xco_lib->un_publish_service_binding( CONV sxco_srvb_object_name( service_binding_to_be_deleted-object_name ) ). + ENDIF. + ENDIF. + + IF xco_lib->service_binding_is_published( CONV sxco_srvb_object_name( service_binding_to_be_deleted-object_name ) ) = abap_false. + add_text_to_app_log_or_console( |Service binding { service_binding_to_be_deleted-object_name } is not published.| ). + ENDIF. + + ENDIF. + ENDLOOP. + "start deletion + add_text_to_app_log_or_console( |Start deleting generated objects| ). + + IF demo_mode = abap_false. + + delete_generated_objects( + i_rap_bo_name = BoName + i_repository_objects = objects_to_be_deleted + ). + + + + IF generated_objects_are_deleted( +* i_rap_bo_name = rap_generator_bo-BoName + i_repository_objects = objects_to_be_deleted + ) = abap_true. + + add_text_to_app_log_or_console( + i_text = |All objects of { BoName } have been deleted. | + i_severity = if_bali_constants=>c_severity_status + ). + +* Delete_RAP_Generator_Project( rap_generator_bo-BoName ). + + ELSE. + add_text_to_app_log_or_console( + i_text = |Not all objects of { BoName } have been deleted. | + i_severity = if_bali_constants=>c_severity_error + ). + ENDIF. + ENDIF. + + +* CATCH cx_bali_runtime INTO DATA(application_log_exception). + CATCH cx_root INTO DATA(application_log_exception). + + DATA(exception_text) = application_log_exception->get_text( ). + exception_text = |Exception was raised: { exception_text }|. + add_text_to_app_log_or_console( + i_text = CONV #( exception_text ) + i_severity = if_bali_constants=>c_severity_error + ). + + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_del.clas.xml b/src/zdmo_cl_rap_generator_del.clas.xml new file mode 100644 index 0000000..5b70ffe --- /dev/null +++ b/src/zdmo_cl_rap_generator_del.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_DEL</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>run RAP Generator via bgPF</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_del_asyn.clas.abap b/src/zdmo_cl_rap_generator_del_asyn.clas.abap new file mode 100644 index 0000000..8a406e8 --- /dev/null +++ b/src/zdmo_cl_rap_generator_del_asyn.clas.abap @@ -0,0 +1,108 @@ +CLASS zdmo_cl_rap_generator_del_asyn DEFINITION +INHERITING FROM zdmo_cl_rap_generator_base + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_serializable_object . + INTERFACES if_bgmc_operation . + INTERFACES if_bgmc_op_single_tx_uncontr . + INTERFACES if_abap_parallel. + + METHODS constructor + IMPORTING + i_boname TYPE ZDMO_R_RAPG_ProjectTP-BoName. + + + PROTECTED SECTION. + PRIVATE SECTION. + + TYPES : BEGIN OF t_log_entry, + DetailLevel TYPE ballevel, + Severity TYPE symsgty, + Text TYPE bapi_msg, + TimeStamp TYPE timestamp, + END OF t_log_entry. + DATA boname TYPE zdmo_rap_gen_entityname. + METHODS start_deletion. + + METHODS get_root_exception + IMPORTING !ix_exception TYPE REF TO cx_root + RETURNING VALUE(rx_root) TYPE REF TO cx_root . + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_DEL_ASYN IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + boname = i_boname. + ENDMETHOD. + + + METHOD get_root_exception. + rx_root = ix_exception. + WHILE rx_root->previous IS BOUND. + rx_root ?= rx_root->previous. + ENDWHILE. + ENDMETHOD. + + + METHOD if_abap_parallel~do. + start_deletion( ). + ENDMETHOD. + + + METHOD if_bgmc_op_single_tx_uncontr~execute. + start_deletion( ). + ENDMETHOD. + + + METHOD start_deletion. + + SELECT SINGLE rapbouuid FROM ZDMO_R_RAPG_ProjectTP WHERE boname = @boname INTO @DATA(rap_bo_uuid). + + READ ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + ALL FIELDS WITH VALUE #( ( %key-RapBoUUID = rap_bo_uuid + ) ) + RESULT DATA(items) + FAILED DATA(read_failed). + + "Fill job status fields + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText ) + WITH VALUE #( FOR item IN items ( %key = item-%key + JobStatus = 'R' + JobStatusCriticality = '2' "green + JobStatusText = 'Running' + ) ) + REPORTED DATA(update_reported_finished1). + COMMIT ENTITIES . + COMMIT WORK. + + + DATA(rap_generator_del) = NEW zdmo_cl_rap_generator_del( boname ). + rap_generator_del->start_deletion( ). + + "Fill job status fields + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( JobStatus JobStatusCriticality JobStatusText ) + WITH VALUE #( FOR item IN items ( %key = item-%key + JobStatus = 'F' + JobStatusCriticality = '3' "green + JobStatusText = 'Finished' + ) ) + REPORTED DATA(update_reported_finished). + COMMIT ENTITIES . + COMMIT WORK. + + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_del_asyn.clas.xml b/src/zdmo_cl_rap_generator_del_asyn.clas.xml new file mode 100644 index 0000000..4067354 --- /dev/null +++ b/src/zdmo_cl_rap_generator_del_asyn.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_DEL_ASYN</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>run RAP Generator asynchronously</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_strtbgpf.clas.abap b/src/zdmo_cl_rap_generator_strtbgpf.clas.abap new file mode 100644 index 0000000..3912540 --- /dev/null +++ b/src/zdmo_cl_rap_generator_strtbgpf.clas.abap @@ -0,0 +1,85 @@ +CLASS zdmo_cl_rap_generator_strtbgpf DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + METHODS constructor + IMPORTING + i_bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn OPTIONAL + i_bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn OPTIONAL + i_operation_text TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + CLASS-METHODS create_for_del_bgpf + IMPORTING + i_bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn + i_operation_text TYPE string + RETURNING + VALUE(result) TYPE REF TO zdmo_cl_rap_generator_strtbgpf. + + CLASS-METHODS create_for_bgpf + IMPORTING + i_bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn + i_operation_text TYPE string + RETURNING + VALUE(result) TYPE REF TO zdmo_cl_rap_generator_strtbgpf. + + METHODS start_execution. + + PROTECTED SECTION. + PRIVATE SECTION. + DATA bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn . + DATA bgpf_del_operation TYPE REF TO zdmo_cl_rap_generator_del_asyn . + DATA async_process_name TYPE string. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_STRTBGPF IMPLEMENTATION. + + + METHOD constructor. + + super->constructor( ). + + IF i_bgpf_del_operation IS NOT INITIAL. + bgpf_del_operation = i_bgpf_del_operation. + ELSEIF i_bgpf_operation IS NOT INITIAL. + bgpf_operation = i_bgpf_operation. + ENDIF. + async_process_name = i_operation_text. + + ENDMETHOD. + + + METHOD create_for_bgpf. + result = NEW #( i_bgpf_operation = i_bgpf_operation + i_operation_text = i_operation_text ). + ENDMETHOD. + + + METHOD create_for_del_bgpf. + result = NEW #( i_bgpf_del_operation = i_bgpf_del_operation + i_operation_text = i_operation_text ). + ENDMETHOD. + + + METHOD start_execution. + TRY. + DATA(background_process) = cl_bgmc_process_factory=>get_default( )->create( ). + + IF bgpf_del_operation IS NOT INITIAL. + background_process->set_operation_tx_uncontrolled( bgpf_del_operation ). + background_process->set_name( CONV #( async_process_name ) ). + ELSEIF bgpf_operation IS NOT INITIAL. + background_process->set_operation_tx_uncontrolled( bgpf_operation ). + background_process->set_name( CONV #( async_process_name ) ). + ENDIF. + background_process->save_for_execution( ). + CATCH cx_bgmc. + "handle exception + assert 1 = 2. + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_strtbgpf.clas.xml b/src/zdmo_cl_rap_generator_strtbgpf.clas.xml new file mode 100644 index 0000000..97f8ca0 --- /dev/null +++ b/src/zdmo_cl_rap_generator_strtbgpf.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_STRTBGPF</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Start BGPGF</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_generator_test.clas.abap b/src/zdmo_cl_rap_generator_test.clas.abap new file mode 100644 index 0000000..ff3f5a1 --- /dev/null +++ b/src/zdmo_cl_rap_generator_test.clas.abap @@ -0,0 +1,812 @@ +CLASS zdmo_cl_rap_generator_test DEFINITION + PUBLIC + INHERITING FROM cl_xco_cp_adt_simple_classrun + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + PROTECTED SECTION. + METHODS main REDEFINITION. + METHODS get_json_string + RETURNING VALUE(json_string) TYPE string. + PRIVATE SECTION. + + TYPES : tt_bo_data TYPE STANDARD TABLE OF ZDMO_R_RAPG_ProjectTP, + tt_node_data TYPE STANDARD TABLE OF ZDMO_R_RAPG_NodeTP. + + TYPES : t_bo_data TYPE ZDMO_R_RAPG_ProjectTP, + t_node_data TYPE ZDMO_R_RAPG_NodeTP. + TYPES t_mapped TYPE RESPONSE FOR MAPPED EARLY ZDMO_R_RAPG_ProjectTP. + TYPES t_failed TYPE RESPONSE FOR FAILED EARLY ZDMO_R_RAPG_ProjectTP. + TYPES t_reported TYPE RESPONSE FOR REPORTED EARLY ZDMO_R_RAPG_ProjectTP. + + + DATA: generate_repository_objects TYPE abap_bool VALUE abap_false, + running_in_test_mode TYPE abap_bool, + PackageNameForAllTests TYPE sxco_package, + suffixForAllTests TYPE sxco_ar_object_name. + + + DATA mapped TYPE t_mapped. + DATA failed TYPE t_failed. + DATA reported TYPE t_reported. + + DATA update_node TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\node. + DATA update_rapbo TYPE TABLE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + + DATA update_node_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\node . + DATA update_rapbo_line TYPE STRUCTURE FOR UPDATE ZDMO_R_RAPG_ProjectTP\\Project. + + DATA wait_time_in_seconds TYPE i VALUE 1 . + + DATA et_parameters TYPE if_apj_rt_exec_object=>tt_templ_val . + + + + + METHODS: create_managed_uuid , + + create_managed_semantic , + + create_unmanaged_semantic , + + create_unmanaged_abstract, + + create_managed_uuid_O2 , + + create_three_level_uuid + IMPORTING i_bo_data TYPE tt_bo_data + i_node_data TYPE tt_node_data, + + create_two_level_semantic + IMPORTING i_bo_data TYPE tt_bo_data + i_node_data TYPE tt_node_data. + + + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_GENERATOR_TEST IMPLEMENTATION. + + + METHOD create_managed_semantic. + + + DATA : bo_data TYPE tt_bo_data, + node_data TYPE tt_node_data, + unique_string TYPE string VALUE 'f7nkQ'. + + bo_data = VALUE #( ( + PackageName = packagenameforalltests + Prefix = 'M_' + Suffix = suffixforalltests + ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_semantic + BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui + DataSourceType = zdmo_cl_rap_node=>data_source_types-table + DraftEnabled = abap_true + ) + ). + + node_data = VALUE #( ( + entityname = |Holiday| + DataSource = 'ZDMO_fcal_holi' + ) + ( + entityname = |HolidayText| + DataSource = 'ZDMO_fcal_holi_t' + ) + ). + + create_two_level_semantic( + i_bo_data = bo_data + i_node_data = node_data + ). + + ENDMETHOD. + + + METHOD create_managed_uuid. + + DATA : bo_data TYPE tt_bo_data, + node_data TYPE tt_node_data, + unique_string TYPE string VALUE 'f7nkQ'. + + bo_data = VALUE #( ( + PackageName = packagenameforalltests + Prefix = 'UUID_' + Suffix = suffixforalltests + ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_uuid + BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v4_ui + DataSourceType = zdmo_cl_rap_node=>data_source_types-table + DraftEnabled = abap_true + TransportRequest = '' + ) + ). + + node_data = VALUE #( ( + entityname = |Header| + DataSource = to_upper( 'zdmo_uuid_header' ) + FieldNameObjectID = to_upper( 'salesorder_id' ) + ) + ( + + entityname = |Item| + DataSource = to_upper( 'zdmo_uuid_item' ) + FieldNameObjectID = to_upper( 'item_id' ) + ) + ( + entityname = |SubItem| + FieldNameRootUUID = to_upper( 'root_uuid' ) + FieldNameParentUUID = to_upper( 'parent_uuid' ) + DataSource = to_upper( 'zdmo_uuid_s_item' ) + FieldNameObjectID = to_upper( 'schedule_line_id' ) + ) + ). + + create_three_level_uuid( + i_bo_data = bo_Data + i_node_data = node_data + ). + + + ENDMETHOD. + + + METHOD create_managed_uuid_o2. + + DATA : bo_data TYPE tt_bo_data, + node_data TYPE tt_node_data, + unique_string TYPE string VALUE 'f7nkQ'. + + bo_data = VALUE #( ( + PackageName = packagenameforalltests + Prefix = 'O2_' + Suffix = suffixforalltests + ImplementationType = zdmo_cl_rap_node=>implementation_type-managed_uuid + BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui + DataSourceType = zdmo_cl_rap_node=>data_source_types-table + DraftEnabled = abap_true + TransportRequest = '' + ) + ). + + node_data = VALUE #( ( + entityname = |Header| + DataSource = to_upper( 'zdmo_uuid_header' ) + FieldNameObjectID = to_upper( 'salesorder_id' ) + ) + ( + + entityname = |Item| + DataSource = to_upper( 'zdmo_uuid_item' ) + FieldNameObjectID = to_upper( 'item_id' ) + ) + ( + entityname = |SubItem| + FieldNameRootUUID = to_upper( 'root_uuid' ) + FieldNameParentUUID = to_upper( 'parent_uuid' ) + DataSource = to_upper( 'zdmo_uuid_s_item' ) + FieldNameObjectID = to_upper( 'schedule_line_id' ) + ) + ). + + create_three_level_uuid( + i_bo_data = bo_data + i_node_data = node_data + ). + + + ENDMETHOD. + + + METHOD create_three_level_uuid. + + DATA(bo_data) = i_bo_data. + DATA(node_data) = i_node_data. + + "create BO and root node + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + EXECUTE createProjectAndRootNode + FROM VALUE #( ( + %cid = 'ROOT1' + +* %param-packagename = bo_data[ 1 ]-PackageName + %param-BdefImplementationType = '' + %param-BindingType = '' + %param-DataSourceType = '' + %param-DraftEnabled = '' + %param-entityname = node_data[ 1 ]-EntityName + %param-data_source_name = '' + ) ) + MAPPED DATA(mapped) + FAILED DATA(failed) + REPORTED DATA(reported). + + " expect no failures and messages + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + " expect a newly created record in mapped tables + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbo' act = mapped-rapgeneratorbo ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ). + + + DATA(my_rapnodeuuid) = mapped-project[ 1 ]-RapboUUID. + DATA(my_rootnodeuuid) = mapped-node[ 1 ]-NodeUUID. + + + "set fields for RAP BO + CLEAR update_rapbo_line. + CLEAR update_rapbo. + MOVE-CORRESPONDING bo_data[ 1 ] TO update_rapbo_line. + update_rapbo_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on RapboUUID = my_rapnodeuuid ). + APPEND update_rapbo_line TO update_rapbo. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY project + UPDATE FIELDS ( + suffix + prefix +* ImplementationType +* DataSourceType +* BindingType +* DraftEnabled + TransportRequest + ) WITH update_rapbo + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed to set bo header data' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported to set bo header data' act = reported ). + + + "set fields for root node + "first set data source, then set objectID field + CLEAR update_node_line. + CLEAR update_node. + MOVE-CORRESPONDING node_data[ 1 ] TO update_node_line. + update_node_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on NodeUUID = my_rootnodeuuid ). + APPEND update_node_line TO update_node. + +* MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP +* ENTITY Node +* UPDATE FIELDS ( +* DataSource +* ) WITH update_node +* FAILED failed +* REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Node + UPDATE FIELDS ( + FieldNameObjectID + ) WITH update_node + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + "add child node + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY node + EXECUTE addChildDataSourceTable + FROM VALUE #( ( + %tky = VALUE #( %is_draft = if_abap_behv=>mk-on + NodeUUID = my_rootnodeuuid ) + %param-entity_name = node_data[ 2 ]-EntityName + %param-DataSourceName = node_data[ 2 ]-DataSource + ) ) + MAPPED mapped + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ). + + DATA(my_childnodeuuid) = mapped-node[ 1 ]-NodeUUID. + + "set fields for child node + "first set data source, then set objectID field + CLEAR update_node_line. + CLEAR update_node. + MOVE-CORRESPONDING node_data[ 2 ] TO update_node_line. + update_node_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on NodeUUID = my_childnodeuuid ). + APPEND update_node_line TO update_node. + +* MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP +* ENTITY Node +* UPDATE FIELDS ( +* DataSource +* ) WITH update_node +* FAILED failed +* REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Node + UPDATE FIELDS ( + FieldNameObjectID + ) WITH update_node + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + + "add grand child node + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY node + EXECUTE addChildDataSourceTable + FROM VALUE #( ( + %tky = VALUE #( %is_draft = if_abap_behv=>mk-on + NodeUUID = my_rootnodeuuid ) + %param-entity_name = node_data[ 3 ]-EntityName + %param-DataSourceName = node_data[ 3 ]-DataSource + ) ) + MAPPED mapped + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ). + + DATA(my_grandchildnodeuuid) = mapped-node[ 1 ]-NodeUUID. + + "set fields for grand child node + "first set data source, then set objectID field + CLEAR update_node_line. + CLEAR update_node. + MOVE-CORRESPONDING node_data[ 3 ] TO update_node_line. + update_node_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on NodeUUID = my_grandchildnodeuuid ). + APPEND update_node_line TO update_node. + +* MODIFY ENTITIES OF ZDMO_r_rapgeneratorbo +* ENTITY RAPGeneratorBONode +* UPDATE FIELDS ( +* DataSource +* ) WITH update_node +* FAILED failed +* REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Node + UPDATE FIELDS ( + FieldNameObjectID + FieldNameRootUUID + FieldNameParentUUID + ) WITH update_node + FAILED failed + REPORTED reported. + + "activate instance + MODIFY ENTITY ZDMO_R_RAPG_ProjectTP + EXECUTE + Activate FROM VALUE #( ( %key-RapboUUID = my_rapnodeuuid ) ) + MAPPED DATA(mapped_active) + FAILED DATA(failed_active) + REPORTED DATA(reported_active). + + "cl_abap_unit_assert=>assert_initial( msg = 'failed_active' act = failed_active ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported_active' act = reported_active ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped_active-rapgeneratorbo' act = mapped_active-rapgeneratorbo ). + + "commit data + COMMIT ENTITIES RESPONSES + FAILED DATA(commit_failed) + REPORTED DATA(commit_reported). + + "cl_abap_unit_assert=>assert_initial( msg = 'commit_failed' act = commit_failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'commit_reported' act = commit_reported ). + + "check committed data + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapboUUID = @my_rapnodeuuid INTO @DATA(rapbo). + + "cl_abap_unit_assert=>assert_not_initial( msg = 'No RAP BO found' act = rapbo ). + + SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @rapbo-RapboUUID INTO TABLE @DATA(rapbonodes). + + DATA(number_of_entities) = lines( rapbonodes ). + DATA(expected_number_of_entities) = lines( node_data ). + + "cl_abap_unit_assert=>assert_equals( act = rapbonodes[ 1 ]-HeaderUUID exp = rapbo-RapNodeUUID ). + "cl_abap_unit_assert=>assert_equals( act = number_of_entities exp = expected_number_of_entities ). + + "generate repository objects +* MODIFY ENTITY ZDMO_r_rapgeneratorbo +* EXECUTE +* createBO FROM VALUE #( ( +* %tky = VALUE #( %is_draft = if_abap_behv=>mk-off +* rapNodeUUID = my_rapnodeuuid ) +** %key-RapNodeUUID = my_rapnodeuuid +* ) ) +* MAPPED mapped +* FAILED failed +* REPORTED reported. +* +* "cl_abap_unit_assert=>assert_initial( msg = 'failed - generate objects' act = failed ). +* "cl_abap_unit_assert=>assert_initial( msg = 'reported - generate objects' act = reported ). +* +* COMMIT ENTITIES RESPONSES +* FAILED DATA(commit_failed2) +* REPORTED DATA(commit_reported2). + + "cl_abap_unit_assert=>assert_initial( msg = 'failed2 - generate objects' act = commit_failed2 ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported2 - generate objects' act = commit_reported2 ). + + et_parameters = VALUE #( + ( selname = zdmo_cl_rap_node=>job_selection_name + kind = if_apj_dt_exec_object=>parameter + sign = 'I' + option = 'EQ' + low = rapbo-BoName ) + ). + + TRY. + DATA rap_job TYPE REF TO zdmo_cl_rap_gen_in_background. + + rap_job = NEW #( ). + + + rap_job->if_apj_rt_exec_object~execute( it_parameters = et_parameters ). + CATCH cx_apj_rt_content INTO DATA(job_exception). + + ENDTRY. + + ENDMETHOD. + + + METHOD create_two_level_semantic. + + DATA(bo_data) = i_bo_data. + DATA(node_data) = i_node_data. + + "create BO and root node + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + EXECUTE createProjectAndRootNode + FROM VALUE #( ( + %cid = 'ROOT1' + +* %param-packagename = bo_data[ 1 ]-PackageName + %param-BdefImplementationType = '' + %param-BindingType = '' + %param-DataSourceType = '' + %param-DraftEnabled = '' + %param-entityname = node_data[ 1 ]-EntityName + %param-data_source_name = '' + ) ). + + " expect no failures and messages + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + " expect a newly created record in mapped tables + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbo' act = mapped-rapgeneratorbo ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ). + + + DATA(my_rapnodeuuid) = mapped-project[ 1 ]-RapboUUID. + DATA(my_rootnodeuuid) = mapped-node[ 1 ]-NodeUUID. + + + "set fields for RAP BO + CLEAR update_rapbo_line. + CLEAR update_rapbo. + MOVE-CORRESPONDING bo_data[ 1 ] TO update_rapbo_line. + update_rapbo_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on RapboUUID = my_rapnodeuuid ). + APPEND update_rapbo_line TO update_rapbo. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Project + UPDATE FIELDS ( + Prefix + Suffix +* ImplementationType +* BindingType +* DataSourceType +* DraftEnabled + TransportRequest + ) WITH update_rapbo + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed to set bo header data' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported to set bo header data' act = reported ). + + + "set fields for root node + "first set data source, then set objectID field + CLEAR update_node_line. + CLEAR update_node. + MOVE-CORRESPONDING node_data[ 1 ] TO update_node_line. + update_node_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on NodeUUID = my_rootnodeuuid ). + APPEND update_node_line TO update_node. + +* MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP +* ENTITY Node +* UPDATE FIELDS ( +* DataSource +* ) WITH update_node +* FAILED failed +* REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + "add child node + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY node + EXECUTE addChildDataSourceTable + FROM VALUE #( ( + %tky = VALUE #( %is_draft = if_abap_behv=>mk-on + NodeUUID = my_rootnodeuuid ) + %param-entity_name = node_data[ 2 ]-EntityName + ) ) + MAPPED mapped + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped-rapgeneratorbonode' act = mapped-rapgeneratorbonode ). + + DATA(my_childnodeuuid) = mapped-node[ 1 ]-NodeUUID. + + "set fields for child node + "first set data source, then set objectID field + CLEAR update_node_line. + CLEAR update_node. + MOVE-CORRESPONDING node_data[ 2 ] TO update_node_line. + update_node_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on NodeUUID = my_childnodeuuid ). + APPEND update_node_line TO update_node. + + + + "cl_abap_unit_assert=>assert_initial( msg = 'failed' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported' act = reported ). + + IF node_data[ 2 ]-FieldNameEtagMaster IS NOT INITIAL. + + CLEAR update_node_line. + CLEAR update_node. + MOVE-CORRESPONDING node_data[ 2 ] TO update_node_line. + update_node_line-FieldNameEtagMaster = node_data[ 2 ]-FieldNameEtagMaster. + update_node_line-%tky = VALUE #( %is_draft = if_abap_behv=>mk-on NodeUUID = my_childnodeuuid ). + APPEND update_node_line TO update_node. + + MODIFY ENTITIES OF ZDMO_R_RAPG_ProjectTP + ENTITY Node + UPDATE FIELDS ( + FieldNameEtagMaster + ) WITH update_node + FAILED failed + REPORTED reported. + + "cl_abap_unit_assert=>assert_initial( msg = 'failed to set etag master' act = failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported to set etag master' act = reported ). + + ENDIF. + + "activate instance + MODIFY ENTITY ZDMO_R_RAPG_ProjectTP + EXECUTE + Activate FROM VALUE #( ( %key-RapboUUID = my_rapnodeuuid ) ) + MAPPED DATA(mapped_active) + FAILED DATA(failed_active) + REPORTED DATA(reported_active). + + "cl_abap_unit_assert=>assert_initial( msg = 'failed_active' act = failed_active ). + "cl_abap_unit_assert=>assert_initial( msg = 'reported_active' act = reported_active ). + "cl_abap_unit_assert=>assert_not_initial( msg = 'mapped_active-rapgeneratorbo' act = mapped_active-rapgeneratorbo ). + + "commit data + COMMIT ENTITIES RESPONSES + FAILED DATA(commit_failed) + REPORTED DATA(commit_reported). + + "cl_abap_unit_assert=>assert_initial( msg = 'commit_failed' act = commit_failed ). + "cl_abap_unit_assert=>assert_initial( msg = 'commit_reported' act = commit_reported ). + + "check committed data + + SELECT SINGLE * FROM ZDMO_R_RAPG_ProjectTP WHERE RapboUUID = @my_rapnodeuuid INTO @DATA(rapbo). + + "cl_abap_unit_assert=>assert_not_initial( msg = 'No RAP BO found' act = rapbo ). + + SELECT * FROM ZDMO_R_RAPG_NodeTP WHERE rapboUUID = @rapbo-RapboUUID INTO TABLE @DATA(rapbonodes). + + DATA(number_of_entities) = lines( rapbonodes ). + DATA(expected_number_of_entities) = lines( node_data ). + + "cl_abap_unit_assert=>assert_equals( act = rapbonodes[ 1 ]-HeaderUUID exp = rapbo-RapNodeUUID ). + "cl_abap_unit_assert=>assert_equals( act = number_of_entities exp = expected_number_of_entities ). + +* "generate repository objects +* MODIFY ENTITY ZDMO_r_rapgeneratorbo +* EXECUTE +* createBO FROM VALUE #( ( +* %tky = VALUE #( %is_draft = if_abap_behv=>mk-off +* rapNodeUUID = my_rapnodeuuid ) +** %key-RapNodeUUID = my_rapnodeuuid +* ) ) +* MAPPED mapped +* FAILED failed +* REPORTED reported. +* +* "cl_abap_unit_assert=>assert_initial( msg = 'failed - generate objects' act = failed ). +* "cl_abap_unit_assert=>assert_initial( msg = 'reported - generate objects' act = reported ). +* +* COMMIT ENTITIES RESPONSES +* FAILED DATA(commit_failed2) +* REPORTED DATA(commit_reported2). +* +* "cl_abap_unit_assert=>assert_initial( msg = 'failed2 - generate objects' act = commit_failed2 ). +* "cl_abap_unit_assert=>assert_initial( msg = 'reported2 - generate objects' act = commit_reported2 ). +* +* +* + + + et_parameters = VALUE #( + ( selname = zdmo_cl_rap_node=>job_selection_name + kind = if_apj_dt_exec_object=>parameter + sign = 'I' + option = 'EQ' + low = rapbo-BoName ) + ). + + TRY. + DATA rap_job TYPE REF TO zdmo_cl_rap_gen_in_background. + + rap_job = NEW #( ). + + + rap_job->if_apj_rt_exec_object~execute( it_parameters = et_parameters ). + CATCH cx_apj_rt_content INTO DATA(job_exception). + + ENDTRY. + + ENDMETHOD. + + + METHOD create_unmanaged_abstract. + + + DATA : bo_data TYPE tt_bo_data, + node_data TYPE tt_node_data, + unique_string TYPE string VALUE 'f7nkQ'. + + bo_data = VALUE #( ( + PackageName = packagenameforalltests + Prefix = 'A_' + Suffix = suffixforalltests + ImplementationType = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic + BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui + DataSourceType = zdmo_cl_rap_node=>data_source_types-abstract_entity + DraftEnabled = abap_FALSE + TransportRequest = '' + ) + ). + + node_data = VALUE #( ( + entityname = |SalesOrder| + DataSource = 'ZDMO_TEST_ABSTRACT_ROOT_ENTITY' + ) + ( + entityname = |Item| + DataSource = 'ZDMO_TEST_ABSTRACT_CHILDENTITY' + FieldNameEtagMaster = 'DELIVERYDATE' + ) + ). + + create_two_level_semantic( + i_bo_data = bo_data + i_node_data = node_data + ). + + + ENDMETHOD. + + + METHOD create_unmanaged_semantic. + + DATA : bo_data TYPE tt_bo_data, + node_data TYPE tt_node_data, + unique_string TYPE string VALUE 'f7nkQ'. + + bo_data = VALUE #( ( + PackageName = packagenameforalltests + Prefix = 'U_' + Suffix = suffixforalltests + ImplementationType = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic + BindingType = zdmo_cl_rap_node=>binding_type_name-odata_v2_ui + DataSourceType = zdmo_cl_rap_node=>data_source_types-table + DraftEnabled = abap_FALSE + TransportRequest = '' + ) + ). + + node_data = VALUE #( ( + entityname = |Holiday| + DataSource = 'ZDMO_fcal_holi' + ) + ( + entityname = |HolidayText| + DataSource = 'ZDMO_fcal_holi_t' + ) + ). + + create_two_level_semantic( + i_bo_data = bo_data + i_node_data = node_data + ). + + + ENDMETHOD. + + + METHOD get_json_string. + json_string = '{ "Info" : "to be replaced with your JSON string" }' . + ENDMETHOD. + + + METHOD main. + + + out->write( 'start' ). + WAIT UP TO 10 SECONDS. + out->write( 'finish' ). + EXIT. + PackageNameForAllTests = 'ZDMO_DELETE_TESTS_EML3'. + suffixForAllTests = '_35' . + running_in_test_mode = abap_false. + + TRY. + + out->write( 'run create_managed_semantic' ). + create_managed_semantic( ). + out->write( |waiting { wait_time_in_seconds } seconds| ). + WAIT UP TO wait_time_in_seconds SECONDS. + + out->write( 'run create_managed_uuid' ). + create_managed_uuid( ). + out->write( |waiting { wait_time_in_seconds } seconds| ). + WAIT UP TO wait_time_in_seconds SECONDS. + + out->write( 'run create_managed_uuid_o2' ). + create_managed_uuid_o2( ). + out->write( |waiting { wait_time_in_seconds } seconds| ). + WAIT UP TO wait_time_in_seconds SECONDS. + + out->write( 'run create_unmanaged_abstract' ). + create_unmanaged_abstract( ). + out->write( |waiting { wait_time_in_seconds } seconds| ). + WAIT UP TO wait_time_in_seconds SECONDS. + + out->write( 'run create_unmanaged_semantic' ). + create_unmanaged_semantic( ). + + + CATCH ZDMO_cx_rap_generator INTO DATA(rap_generator_exception). + out->write( 'The following exception has been raised:' ) . + out->write( rap_generator_exception->get_text( ) ). + ENDTRY. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_generator_test.clas.xml b/src/zdmo_cl_rap_generator_test.clas.xml new file mode 100644 index 0000000..e2b5984 --- /dev/null +++ b/src/zdmo_cl_rap_generator_test.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_GENERATOR_TEST</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>zcl_rap_generator_console_demo</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_node.clas.abap b/src/zdmo_cl_rap_node.clas.abap new file mode 100644 index 0000000..3818a43 --- /dev/null +++ b/src/zdmo_cl_rap_node.clas.abap @@ -0,0 +1,7097 @@ +CLASS zdmo_cl_rap_node DEFINITION + PUBLIC + CREATE PUBLIC +* GLOBAL FRIENDS ZDMO_cl_rap_xco_json_visitor + . + + PUBLIC SECTION. + + CONSTANTS: + + job_template_name TYPE cl_apj_dt_create_content=>ty_template_name VALUE 'ZDMO_RAP_GEN_JOB_TEMPLATE', + job_catalog_name TYPE cl_apj_dt_create_content=>ty_catalog_name VALUE 'ZDMO_RAP_GEN_CATALOG_ENTRY', + job_class_name TYPE cl_apj_dt_create_content=>ty_class_name VALUE 'ZDMO_CL_RAP_GEN_IN_BACKGROUND', + job_del_template_name TYPE cl_apj_dt_create_content=>ty_template_name VALUE 'ZDMO_RAP_DEL_JOB_TEMPLATE', + job_del_catalog_name TYPE cl_apj_dt_create_content=>ty_catalog_name VALUE 'ZDMO_RAP_DEL_CATALOG_ENTRY', + job_del_class_name TYPE cl_apj_dt_create_content=>ty_class_name VALUE 'ZDMO_CL_RAP_DEL_APPL_JOB', + job_del_class_name_op TYPE cl_apj_dt_create_content=>ty_class_name VALUE 'ZDMO_CL_RAP_DEL_APPL_JOB', + job_catalog_text TYPE cl_apj_dt_create_content=>ty_text VALUE 'RAP Generator', + job_template_text TYPE cl_apj_dt_create_content=>ty_text VALUE 'RAP Generator', + "job_selection_name TYPE c LENGTH 8 VALUE 'I_VIEW', + job_selection_name TYPE c LENGTH 8 VALUE 'BO_NAME', + job_selection_description TYPE c LENGTH 255 VALUE 'RAP business object name', + application_log_object_name TYPE if_bali_object_handler=>ty_object VALUE 'ZDMO_RAP_GEN_APPLLOG', + application_log_object_text TYPE if_bali_object_handler=>ty_object_text VALUE 'Application Log of the RAP Generator', + application_log_sub_obj1_name TYPE if_bali_object_handler=>ty_object VALUE 'ZDMO_RAP_GEN_JOB', + application_log_sub_obj1_text TYPE if_bali_object_handler=>ty_object_text VALUE 'Detail information', + + minimal_search_string_length TYPE i VALUE 2, + + strict_mode_2 TYPE i VALUE 2, + + dummy_field_name TYPE sxco_ad_field_name VALUE 'DUMMY_FIELD', + dummy_field_cds_name TYPE sxco_cds_field_name VALUE 'DummyField', + extension_association_name TYPE sxco_cds_association_name VALUE 'Extension', + + BEGIN OF AbapCatalog_enhancement, + quotaMaximumFields TYPE i VALUE 500, + quotaMaximumBytes TYPE i VALUE 8160, + quotaShareCustomer TYPE i VALUE 50, + quotaSharePartner TYPE i VALUE 50, + END OF AbapCatalog_enhancement, + + BEGIN OF package_type, + development_package TYPE sychar01 VALUE ' ', + main_package TYPE sychar01 VALUE 'X', + structure_package TYPE sychar01 VALUE 'S', + END OF package_type, + + BEGIN OF package_abap_language_version, + standard TYPE sychar01 VALUE ' ', + abap_for_key_users TYPE sychar01 VALUE '2', + abap_for_sap_cloud_platform TYPE sychar01 VALUE '5', + END OF package_abap_language_version, + + BEGIN OF enhancement_category, + not_classified TYPE n LENGTH 1 VALUE '0', + cannot_be_enhanced TYPE n LENGTH 1 VALUE '1', + can_be_enhanced_c_like TYPE n LENGTH 1 VALUE '2', + can_be_enhanced_c_like_or_nmrc TYPE n LENGTH 1 VALUE '3', + can_be_enhanced_deep TYPE n LENGTH 1 VALUE '4', + END OF enhancement_category, + + "the RAP generator only supports certain combinations of implementation type and key type + BEGIN OF implementation_type, + managed_uuid TYPE string VALUE 'managed_uuid', + managed_semantic TYPE string VALUE 'managed_semantic', + unmanaged_semantic TYPE string VALUE 'unmanaged_semantic', + END OF implementation_type, + + BEGIN OF bdef_implementation_type, + managed TYPE string VALUE 'managed', + unmanaged TYPE string VALUE 'unmanaged', + END OF bdef_implementation_type, + + BEGIN OF abap_language_version, + standard TYPE string VALUE 'standard', + abap_for_cloud_development TYPE string VALUE 'abap_for_cloud_development', + END OF abap_language_version, + + BEGIN OF additional_fields_object_types, + cds_interface_view TYPE string VALUE 'cds_interface_view', + cds_restricted_reuse_view TYPE string VALUE 'cds_restricted_reuse_view', + cds_projection_view TYPE string VALUE 'cds_projection_view', + draft_table TYPE string VALUE 'draft_table', + END OF additional_fields_object_types, + + BEGIN OF root_node_repository_objects, + behavior_definition_r TYPE string VALUE 'behavior_definition', + behavior_definition_p TYPE string VALUE 'behavior_definition_projection', + behavior_definition_i TYPE string VALUE 'behavior_definition_interface', + service_definition TYPE string VALUE 'service_definition', + service_binding TYPE string VALUE 'service_binding', + sap_object_type TYPE string VALUE 'sap_object_type', + END OF root_node_repository_objects, + + BEGIN OF node_repository_objects, + custom_entity TYPE string VALUE 'custom_entity', + custom_query_impl_class TYPE string VALUE 'custom_query_implementation_class', + cds_view_i TYPE string VALUE 'cds_interface_view', + cds_view_i_basic TYPE string VALUE 'cds_interface_view_basic', + cds_view_r TYPE string VALUE 'cds_restricted_reuse_view', + cds_view_p TYPE string VALUE 'cds_projection_view', + extension_include TYPE string VALUE 'extension_include', + extension_include_view TYPE string VALUE 'extension_include_view', + draft_query_view TYPE string VALUE 'draft_query_view', + meta_data_extension TYPE string VALUE 'metadata_extension_view', + behavior_implementation TYPE string VALUE 'behavior_implementation_class', + draft_table TYPE string VALUE 'draft_table', + control_structure TYPE string VALUE 'control_structure', + sap_object_node_type TYPE string VALUE 'sap_object_node_type', + END OF node_repository_objects, + + BEGIN OF data_source_types, + table TYPE string VALUE 'table', + cds_view TYPE string VALUE 'cds_view', + abap_type TYPE string VALUE 'abap_type', + structure TYPE string VALUE 'structure', + abstract_entity TYPE string VALUE 'abstract_entity', + END OF data_source_types, + + BEGIN OF cardinality, + zero_to_one TYPE string VALUE 'zero_to_one', + one TYPE string VALUE 'one', + zero_to_n TYPE string VALUE 'zero_to_n', + one_to_n TYPE string VALUE 'one_to_n', + one_to_one TYPE string VALUE 'one_to_one', + END OF cardinality, + + + BEGIN OF additionalbinding_usage, + filter TYPE string VALUE 'FILTER', + filter_and_result TYPE string VALUE 'FILTER_AND_RESULT', + result TYPE string VALUE 'RESULT', + END OF additionalbinding_usage, + + BEGIN OF binding_type_name, + odata_v4_ui TYPE string VALUE 'odata_v4_ui', + odata_v2_ui TYPE string VALUE 'odata_v2_ui', + odata_v4_web_api TYPE string VALUE 'odata_v4_web_api', + odata_v2_web_api TYPE string VALUE 'odata_v2_web_api', + END OF binding_type_name, + + BEGIN OF protocol_version_suffix, + odata_v2 TYPE string VALUE '_O2', + odata_v4 TYPE string VALUE '_O4', + END OF protocol_version_suffix, + + BEGIN OF binding_type_prefix, + ui TYPE string VALUE 'UI_', + web_api TYPE string VALUE 'API_', + END OF binding_type_prefix, + + BEGIN OF node_object_prefix, + custom_entity TYPE string VALUE 'R_', + custom_query_impl_class TYPE string VALUE 'CL_CE_', + cds_view_i TYPE string VALUE 'I_', + cds_view_r TYPE string VALUE 'R_', + behavior_definition_r TYPE string VALUE 'R_', + behavior_definition_i TYPE string VALUE 'I_', + "ddic_view_i TYPE sxco_dbt_object_name, + cds_view_p TYPE string VALUE 'C_', + behavior_definition_p TYPE string VALUE 'C_', + meta_data_extension TYPE string VALUE 'C_', + behavior_implementation TYPE string VALUE 'BP_R_', + "avoid error - Underscore not permitted at 2nd or 3rd position + control_structure TYPE string VALUE 'S', + extension_include_view TYPE string VALUE 'E_', + draft_query_view TYPE string VALUE 'R_', + "avoid error - Underscore not permitted at 2nd or 3rd position + extension_include TYPE string VALUE 'S', + END OF node_object_prefix, + + BEGIN OF node_object_suffix, + control_structure TYPE string VALUE '_X', + draft_table TYPE c VALUE 'D', + "new suffix TP + transactional_processing TYPE string VALUE 'TP', + draft_query_view TYPE string VALUE '_D', + END OF node_object_suffix, + + + BEGIN OF max_length_object_type, + bdef TYPE i VALUE 30, + ddls TYPE i VALUE 30, + ddlx TYPE i VALUE 30, + srvd TYPE i VALUE 30, + stru TYPE i VALUE 30, + srvb TYPE i VALUE 26, + clas TYPE i VALUE 30, + devc TYPE i VALUE 20, + tabl TYPE i VALUE 16, + smbc TYPE i VALUE 20, + ront TYPE i VALUE 30, + nont TYPE i VALUE 30, + END OF max_length_object_type, + + BEGIN OF root_node_object_suffix, + behavior_definition_i TYPE string VALUE 'I_', + behavior_definition_p TYPE string VALUE 'C_', + service_definition TYPE string VALUE 'C_', + service_binding TYPE string VALUE 'C_', + END OF root_node_object_suffix, + + BEGIN OF root_node_object_types, + behavior_definition_r TYPE sxco_ar_object_type VALUE 'BDEF', + behavior_definition_p TYPE sxco_ar_object_type VALUE 'BDEF', + behavior_definition_i TYPE sxco_ar_object_type VALUE 'BDEF', + service_binding TYPE sxco_ar_object_type VALUE 'SRVB', + service_definition TYPE sxco_ar_object_type VALUE 'SRVD', + END OF root_node_object_types, + + BEGIN OF node_object_types, + cds_view_i TYPE sxco_ar_object_type VALUE 'DDLS', + cds_view_i_basic TYPE sxco_ar_object_type VALUE 'DDLS', + cds_view_r TYPE sxco_ar_object_type VALUE 'DDLS', + cds_view_p TYPE sxco_ar_object_type VALUE 'DDLS', + meta_data_extension TYPE sxco_ar_object_type VALUE 'DDLX', + behavior_implementation TYPE sxco_ar_object_type VALUE 'CLAS', + query_implementation TYPE sxco_ar_object_type VALUE 'CLAS', + custom_entity TYPE sxco_ar_object_type VALUE 'DDLS', + extension_include_view TYPE sxco_ar_object_type VALUE 'DDLS', + draft_query_view TYPE sxco_ar_object_type VALUE 'DDLS', + "internally we use 'STRU' + "in xco we have to use + "for tables + "i_environment->for-tabl-for-database_table->create_delete_operation( ). + "and the following code for structures + "i_environment->for-tabl-for-structure->create_delete_operation( ). + control_structure TYPE sxco_ar_object_type VALUE 'STRU', + extension_include TYPE sxco_ar_object_type VALUE 'STRU', + "*** + draft_table TYPE sxco_ar_object_type VALUE 'TABL', + END OF node_object_types, + + + supported_binding_types TYPE string VALUE 'odata_v4_ui, odata_v2_ui, odata_v4_web_api, odata_v2_web_api', + + uuid_type TYPE cl_xco_ad_built_in_type=>tv_type VALUE 'RAW', + uuid_length TYPE cl_xco_ad_built_in_type=>tv_length VALUE 16, + + singleton_field_name TYPE sxco_cds_field_name VALUE 'SingletonID', + singleton_suffix TYPE string VALUE '_S', + singleton_child_tab_name TYPE string VALUE 'child_tab', + + release_contract_c0 TYPE if_abap_api_state=>ty_release_contract VALUE 'C0', + release_contract_c1 TYPE if_abap_api_state=>ty_release_contract VALUE 'C1' + . + + + + . + + + TYPES: + + BEGIN OF t_framework_message_fields, + severity TYPE symsgty, + object_TYPE TYPE if_xco_gen_o_finding=>tv_object_type, + object_name TYPE if_xco_gen_o_finding=>tv_object_name, + message TYPE string, + END OF t_framework_message_fields, + + tt_framework_message_fields TYPE STANDARD TABLE OF t_framework_message_fields WITH EMPTY KEY, + + BEGIN OF root_cause_textid, + msgid TYPE symsgid, + msgno TYPE symsgno, + attr1 TYPE scx_attrname, + attr2 TYPE scx_attrname, + attr3 TYPE scx_attrname, + attr4 TYPE scx_attrname, + END OF root_cause_textid. + + TYPES: + BEGIN OF ts_manage_buiness_config, + namespace TYPE if_mbc_cp_api_business_config=>ty_namespace, + identifier TYPE if_mbc_cp_api_business_config=>ty_identifier, + name TYPE if_mbc_cp_api_business_config=>ty_name, + description TYPE if_mbc_cp_api_business_config=>ty_description, + END OF ts_manage_buiness_config. + + + TYPES: + BEGIN OF ts_field_name, + client TYPE string, + uuid TYPE string, + parent_uuid TYPE string, + root_uuid TYPE string, + created_by TYPE string, + created_at TYPE string, + last_changed_by TYPE string, + last_changed_at TYPE string, + local_instance_last_changed_at TYPE string, + local_instance_last_changed_by TYPE string, + language TYPE string, + etag_master TYPE string, + total_etag TYPE string, + + END OF ts_field_name. + + TYPES: + BEGIN OF ts_dataelement_name, + client TYPE string, + uuid TYPE string, + parent_uuid TYPE string, + root_uuid TYPE string, + created_by TYPE string, + created_at TYPE string, + last_changed_by TYPE string, + last_changed_at TYPE string, + local_instance_last_changed_at TYPE string, + local_instance_last_changed_by TYPE string, + language TYPE string, + etag_master TYPE string, + total_etag TYPE string, + + END OF ts_dataelement_name. + + TYPES: + BEGIN OF ts_builtintypeelement_name, + client TYPE string, + language TYPE string, + END OF ts_builtintypeelement_name. + + TYPES : tt_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node WITH EMPTY KEY. + TYPES : ty_childnode TYPE REF TO zdmo_cl_rap_node. + + TYPES : tt_semantic_key_fields TYPE TABLE OF sxco_ad_field_name. + TYPES : + BEGIN OF ts_semantic_key, + name TYPE sxco_ad_field_name, + cds_view_field TYPE sxco_ad_field_name, + END OF ts_semantic_key. + TYPES : tt_semantic_key TYPE TABLE OF ts_semantic_key. + + TYPES: + BEGIN OF ts_field, + name TYPE sxco_ad_object_name, + doma TYPE sxco_ad_object_name, + data_element TYPE sxco_ad_object_name, + key_indicator TYPE abap_bool, + not_null TYPE abap_bool, + domain_fixed_value TYPE abap_bool, + cds_view_field TYPE sxco_cds_field_name, + has_association TYPE abap_bool, + has_valuehelp TYPE abap_bool, + currencycode TYPE sxco_cds_field_name, + unitofmeasure TYPE sxco_cds_field_name, + is_data_element TYPE abap_bool, + is_built_in_type TYPE abap_bool, + is_hidden TYPE abap_bool, + is_currencycode TYPE abap_bool, + is_unitofmeasure TYPE abap_bool, + "built_in_type_object TYPE REF TO cl_xco_ad_built_in_type, + built_in_type TYPE c LENGTH 50 , " like abap_ cl_xco_ad_built_in_type=>tv_type, + built_in_type_length TYPE cl_xco_ad_built_in_type=>tv_length, + built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals, + END OF ts_field. + + TYPES : tt_fields TYPE STANDARD TABLE OF ts_field WITH EMPTY KEY. + + TYPES : tt_fields_default_key TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY. + + TYPES: + BEGIN OF ts_node_objects, + custom_entity TYPE sxco_cds_object_name, + custom_query_impl_class TYPE sxco_ao_object_name, + cds_view_i TYPE sxco_cds_object_name, + cds_view_i_basic TYPE sxco_cds_object_name, + cds_view_r TYPE sxco_cds_object_name, + ddic_view_i TYPE sxco_dbt_object_name, + cds_view_p TYPE sxco_cds_object_name, + meta_data_extension TYPE sxco_cds_object_name, + alias TYPE sxco_ddef_alias_name, + behavior_implementation TYPE sxco_ao_object_name, + control_structure TYPE sxco_ad_object_name, + draft_query_view TYPE sxco_cds_object_name, + extension_include_view TYPE sxco_cds_object_name, + extension_include TYPE sxco_ad_object_name, + sap_object_node_type TYPE sxco_cds_object_name, + END OF ts_node_objects. + + + + + TYPES: + BEGIN OF ts_root_node_objects, + behavior_definition_r TYPE sxco_cds_object_name, + behavior_definition_p TYPE sxco_cds_object_name, + behavior_definition_i TYPE sxco_cds_object_name, + service_definition TYPE sxco_ao_object_name, + service_binding TYPE sxco_ao_object_name, + sap_object_type TYPE sxco_cds_object_name, + END OF ts_root_node_objects. + + TYPES: + BEGIN OF ts_additional_fields_old, + field_name TYPE string, + alias TYPE sxco_ddef_alias_name, + data_element TYPE sxco_ad_object_name, + built_in_type TYPE cl_xco_ad_built_in_type=>tv_type, + built_in_type_length TYPE cl_xco_ad_built_in_type=>tv_length, + built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals, + localized TYPE abap_bool, + END OF ts_additional_fields_old, + + tt_additional_fields_old TYPE STANDARD TABLE OF ts_additional_fields_old WITH DEFAULT KEY. + + TYPES: + BEGIN OF ts_additional_fields, + name TYPE string, + cds_view_field TYPE sxco_ddef_alias_name, + data_element TYPE sxco_ad_object_name, + built_in_type TYPE cl_xco_ad_built_in_type=>tv_type, + built_in_type_length TYPE cl_xco_ad_built_in_type=>tv_length, + built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals, + is_hidden TYPE abap_bool, + localized TYPE abap_bool, + cds_interface_view TYPE abap_bool, + cds_restricted_reuse_view TYPE abap_bool, + cds_projection_view TYPE abap_bool, + draft_table TYPE abap_bool, + END OF ts_additional_fields, + + tt_additional_fields TYPE STANDARD TABLE OF ts_additional_fields WITH DEFAULT KEY. + + + TYPES: + BEGIN OF ts_objects_with_add_fields, + object TYPE string, + additional_fields TYPE tt_additional_fields_old, + END OF ts_objects_with_add_fields, + + tt_objects_with_add_fields TYPE STANDARD TABLE OF ts_objects_with_add_fields WITH DEFAULT KEY. + + TYPES: + BEGIN OF ts_abap_type, + prefix TYPE sxco_ao_object_name, + type_name TYPE sxco_ao_component_name, + END OF ts_abap_type. + + TYPES: + BEGIN OF ts_condition_fields, + projection_field TYPE sxco_cds_field_name, + association_field TYPE sxco_cds_field_name, + END OF ts_condition_fields, + + + tt_condition_fields TYPE STANDARD TABLE OF ts_condition_fields WITH EMPTY KEY, + + BEGIN OF ts_assocation, + name TYPE sxco_ddef_alias_name, + target TYPE sxco_cds_object_name, + condition_components TYPE tt_condition_fields, + cardinality TYPE string, + END OF ts_assocation, + + tt_assocation TYPE STANDARD TABLE OF ts_assocation, + + BEGIN OF ts_additionalbinding, + localelement TYPE sxco_cds_field_name, + element TYPE sxco_cds_field_name, + usage TYPE string, + END OF ts_additionalbinding, + + tt_addtionalbinding TYPE STANDARD TABLE OF ts_additionalbinding WITH DEFAULT KEY, + + BEGIN OF ts_valuehelp, + name TYPE sxco_cds_object_name, + alias TYPE sxco_ddef_alias_name, + localelement TYPE sxco_cds_field_name, + element TYPE sxco_cds_field_name, + additionalbinding TYPE tt_addtionalbinding, + useforvalidation TYPE abap_bool, + END OF ts_valuehelp, + + tt_valuehelp TYPE STANDARD TABLE OF ts_valuehelp WITH DEFAULT KEY + + . + + DATA generate_only_node_hierachy TYPE abap_bool. + + DATA xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + DATA data_source_type TYPE string READ-ONLY. + DATA lt_valuehelp TYPE tt_valuehelp READ-ONLY. + DATA lt_objects_with_add_fields TYPE tt_objects_with_add_fields READ-ONLY. + DATA lt_messages TYPE TABLE OF string READ-ONLY. + DATA field_name TYPE ts_field_name READ-ONLY. + DATA dataelement_name TYPE ts_dataelement_name READ-ONLY. + DATA builtintype_name TYPE ts_builtintypeelement_name READ-ONLY. + DATA lt_association TYPE tt_assocation READ-ONLY. + DATA rap_node_objects TYPE ts_node_objects READ-ONLY. + DATA rap_root_node_objects TYPE ts_root_node_objects READ-ONLY. + DATA lt_fields TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY READ-ONLY. + DATA lt_additional_fields TYPE STANDARD TABLE OF ts_additional_fields WITH DEFAULT KEY READ-ONLY. + DATA lt_all_fields TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY READ-ONLY. + DATA lt_fields_persistent_table TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY READ-ONLY. + DATA table_name TYPE sxco_dbt_object_name READ-ONLY. + DATA structure_name TYPE sxco_ad_object_name READ-ONLY. + DATA abap_type_name TYPE string. + DATA semantic_key TYPE tt_semantic_key. + DATA suffix TYPE string READ-ONLY. + DATA prefix TYPE string READ-ONLY. + DATA namespace TYPE string READ-ONLY. + + DATA entityname TYPE sxco_ddef_alias_name READ-ONLY. + DATA node_number TYPE i READ-ONLY. + DATA object_id TYPE sxco_ad_field_name READ-ONLY. + DATA object_id_cds_field_name TYPE sxco_ad_field_name READ-ONLY. + DATA all_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node READ-ONLY. + DATA childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node READ-ONLY. + DATA root_node TYPE REF TO zdmo_cl_rap_node READ-ONLY. + DATA parent_node TYPE REF TO zdmo_cl_rap_node READ-ONLY. + DATA is_finalized TYPE abap_bool READ-ONLY . + DATA package TYPE sxco_package READ-ONLY. + DATA lt_mapping TYPE HASHED TABLE OF if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping + WITH UNIQUE KEY cds_view_field dbtable_field. + DATA ls_mapping TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping . + DATA transactional_behavior TYPE abap_bool READ-ONLY. + DATA multi_edit TYPE abap_bool READ-ONLY. + DATA manage_business_configuration TYPE abap_bool READ-ONLY. + DATA manage_business_config_names TYPE ts_manage_buiness_config READ-ONLY. + DATA publish_service TYPE abap_bool READ-ONLY. + DATA add_basic_i_views TYPE abap_bool READ-ONLY. + DATA add_sap_object_type TYPE abap_bool READ-ONLY. + DATA cds_view_name TYPE string READ-ONLY. + DATA data_source_name TYPE string READ-ONLY. + DATA persistent_table_name TYPE string READ-ONLY. + DATA draft_table_name TYPE sxco_dbt_object_name READ-ONLY. + DATA binding_type TYPE string READ-ONLY. + DATA transport_request TYPE string READ-ONLY. + DATA draft_enabled TYPE abap_bool READ-ONLY . + DATA useuppercamelcase TYPE abap_bool READ-ONLY . + DATA skip_activation TYPE abap_bool READ-ONLY. + DATA add_meta_data_extensions TYPE abap_bool READ-ONLY. + DATA is_customizing_table TYPE abap_bool READ-ONLY. + DATA create_table TYPE abap_bool READ-ONLY. + DATA extensibility_element_Suffix TYPE string READ-ONLY. + + DATA mimic_adt_wizard TYPE abap_bool READ-ONLY. + + DATA view_type_value TYPE sychar01." ddddlsrctype . "char01 . + + DATA association_targets TYPE STANDARD TABLE OF sxco_cds_object_name WITH EMPTY KEY READ-ONLY. + DATA composition_targets TYPE STANDARD TABLE OF sxco_cds_object_name WITH EMPTY KEY READ-ONLY. + + " DATA rap_generator_xco_lib TYPE REF TO zif_rap_generator_xco_lib. + METHODS todo + IMPORTING todo TYPE string. + + METHODS constructor + IMPORTING io_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_xco_lib + IMPORTING io_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib + RAISING ZDMO_cx_rap_generator. + + METHODS set_has_transactional_behavior + IMPORTING iv_value TYPE abap_bool . + + METHODS set_add_sap_object_type + IMPORTING iv_value TYPE abap_bool DEFAULT abap_true. + + METHODS set_generate_only_node_hierach + IMPORTING iv_value TYPE abap_bool. + + METHODS add_multi_edit + IMPORTING iv_value TYPE abap_bool. + + METHODS add_to_manage_business_config + IMPORTING iv_value TYPE abap_bool . + + METHODS generate_bil + RETURNING VALUE(result) TYPE abap_bool. + + METHODS generate_custom_entity + RETURNING VALUE(result) TYPE abap_bool. + + METHODS set_mbc_namespace. + + + METHODS set_mbc_identifier + IMPORTING iv_value TYPE string . "if_mbc_cp_api_business_config=>ty_identifier. + + METHODS set_mbc_name + IMPORTING iv_value TYPE string. "if_mbc_cp_api_business_config=>ty_name. + + METHODS set_mbc_description + IMPORTING iv_value TYPE string. "if_mbc_cp_api_business_config=>ty_description. + + METHODS set_is_customizing_table + IMPORTING iv_value TYPE abap_bool. + + METHODS set_publish_service + IMPORTING iv_value TYPE abap_bool . + + METHODS set_add_basic_i_views + IMPORTING iv_value TYPE abap_bool. + + METHODS set_mimic_adt_wizard + IMPORTING iv_value TYPE abap_bool. + + METHODS set_draft_enabled + IMPORTING iv_value TYPE abap_bool . + + METHODS set_add_meta_data_extensions + IMPORTING iv_value TYPE abap_bool . + + METHODS set_skip_activation + IMPORTING iv_value TYPE abap_bool . + + METHODS check_data_elements_of_fields. + + METHODS set_mapping + IMPORTING it_field_mappings TYPE if_xco_gen_bdef_s_fo_b_mapping=>tt_field_mapping OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_package + IMPORTING VALUE(iv_package) TYPE sxco_package + RAISING ZDMO_cx_rap_generator. + + METHODS set_entity_name + IMPORTING VALUE(iv_entity_name) TYPE sxco_ddef_alias_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_ext_element_Suffix + IMPORTING VALUE(iv_ext_element_Suffix) TYPE string OPTIONAL + RAISING zdmo_cx_rap_Generator. + + METHODS get_implementation_type + RETURNING VALUE(rv_implementation_type) TYPE string. + + METHODS get_root_exception + IMPORTING + !ix_exception TYPE REF TO cx_root + RETURNING + VALUE(rx_root) TYPE REF TO cx_root . + + METHODS get_root_cause_textid + IMPORTING + ix_previous TYPE REF TO cx_root + RETURNING VALUE(rs_root_cause_textid) TYPE root_cause_textid. + + METHODS set_implementation_type + IMPORTING + VALUE(iv_implementation_type) TYPE string + RAISING ZDMO_cx_rap_generator. + + + + METHODS add_child + RETURNING VALUE(ro_child_node) + TYPE REF TO zdmo_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS add_virtual_root_node + RETURNING VALUE(ro_virtual_root_node) + TYPE REF TO zdmo_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + + + METHODS check_parameter + IMPORTING + iv_parameter_name TYPE string + iv_value TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS check_table_package_assignment + RAISING ZDMO_cx_rap_generator. + + METHODS finalize + RAISING ZDMO_cx_rap_generator. + + METHODS validate_bo + RAISING ZDMO_cx_rap_generator. + + METHODS get_fields + RAISING ZDMO_cx_rap_generator. + + METHODS set_fields + IMPORTING it_fields TYPE tt_fields + RAISING ZDMO_cx_rap_generator. + + METHODS get_fields_persistent_table + RAISING ZDMO_cx_rap_generator. + + METHODS set_namespace + IMPORTING + iv_namespace TYPE sxco_ar_object_name OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_prefix + IMPORTING + iv_prefix TYPE sxco_ar_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_suffix + IMPORTING + iv_suffix TYPE sxco_ar_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_parent + IMPORTING + io_parent_node TYPE REF TO zdmo_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS set_root + IMPORTING + io_root_node TYPE REF TO zdmo_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS is_root RETURNING VALUE(rv_is_root) TYPE abap_bool. + + METHODS is_extensible RETURNING VALUE(rv_is_extensible) TYPE abap_bool. + + METHODS is_virtual_root RETURNING VALUE(rv_is_virtual_root) TYPE abap_bool. + + METHODS is_child RETURNING VALUE(rv_is_child) TYPE abap_bool. + + METHODS is_uuid_based RETURNING VALUE(r_is_uuid_based) TYPE abap_bool. + + METHODS is_grand_child_or_deeper RETURNING VALUE(rv_is_grand_child) TYPE abap_bool. + + METHODS set_table + IMPORTING + iv_table TYPE sxco_ar_object_name OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_cds_view + IMPORTING + iv_cds_view TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_structure + IMPORTING + iv_structure TYPE sxco_ad_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_abap_type + IMPORTING iv_abap_type TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS split_and_check_abap_type_name + IMPORTING iv_abap_type_name TYPE string + EXPORTING ev_class_name TYPE sxco_ao_object_name + ev_type_name TYPE sxco_ao_component_name . + + METHODS table_is_locked_by_transport + IMPORTING iv_table_name TYPE sxco_dbt_object_name + RETURNING VALUE(rv_transport) TYPE sxco_transport. + + METHODS set_data_source + IMPORTING + iv_data_source TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS set_binding_type + IMPORTING + iv_binding_type TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS set_transport_request + IMPORTING + iv_transport_request TYPE sxco_transport OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_persistent_table + IMPORTING + iv_persistent_table TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_draft_table + IMPORTING + iv_draft_table TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_data_source_type + IMPORTING + iv_data_source_type TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS has_childs + RETURNING VALUE(rv_has_childs) TYPE abap_bool. + + METHODS set_semantic_key_fields + IMPORTING it_semantic_key TYPE tt_semantic_key_fields + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_cds_i_view + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_cds_i_view_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_cds_r_view + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_cds_r_view_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_cds_i_view_basic + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_cds_i_view_name_basic) TYPE sxco_cds_object_name + RAISING zdmo_cx_rap_generator. + + METHODS set_name_custom_entity + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_custom_entity_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_cds_p_view + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_cds_p_view_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_mde + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_mde_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + + METHODS set_name_behavior_impl + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_behavior_imp_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_custom_query_impl + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_custom_query_impl_class) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_behavior_def_r + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_behavior_dev_i_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_behavior_def_i + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_behavior_dev_i_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_behavior_def_p + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_behavior_dev_p_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_service_definition + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_service_definition_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_service_binding + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_service_binding_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_control_structure + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_controle_structure_name) TYPE sxco_dbt_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_extension_include + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_extension_include_name) TYPE sxco_dbt_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_extension_incl_view + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_extension_include_view_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_draft_query_view + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_draft_query_view_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_sap_object_type + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_sap_object_type_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS set_name_sap_node_object_type + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_sap_object_node_type_name) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS is_consistent + RETURNING VALUE(rv_is_consistent) TYPE abap_bool. + + METHODS set_field_name_client + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_language + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_uuid + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_parent_uuid + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_root_uuid + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_created_by + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_created_at + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_last_changed_by + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_last_changed_at + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_loc_last_chg_at + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_loc_last_chg_by + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_etag_master + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS set_field_name_total_etag + IMPORTING iv_string TYPE string OPTIONAL + RAISING ZDMO_cx_rap_generator. + + METHODS add_association + IMPORTING + iv_name TYPE sxco_ddef_alias_name + iv_target TYPE sxco_cds_object_name + it_condition_fields TYPE tt_condition_fields + iv_cardinality TYPE string + RAISING + ZDMO_cx_rap_generator. + + + METHODS add_valuehelp + IMPORTING + "alias used in service definition + iv_alias TYPE sxco_ddef_alias_name + "name of CDS view used as value help + iv_name TYPE sxco_cds_object_name + iv_localelement TYPE sxco_cds_field_name + iv_element TYPE sxco_cds_field_name + it_additional_binding TYPE tt_addtionalbinding OPTIONAL + iv_useForValidation TYPE abap_bool OPTIONAL + RAISING + ZDMO_cx_rap_generator. + +* METHODS add_additional_fields_old +* IMPORTING +* iv_object TYPE string +* it_additional_fields TYPE tt_additional_fields. + + METHODS add_additional_fields + IMPORTING + it_additional_fields TYPE tt_additional_fields. + + METHODS add_additonal_to_all_fields. + + METHODS add_fields_to_all_fields. + + + METHODS add_valuehelp_for_curr_quan. + + METHODS add_valuehelp_for_language. + + METHODS set_create_table + IMPORTING iv_create_table TYPE abap_bool DEFAULT abap_true. + + METHODS set_is_root_node + " IMPORTING io_is_root_node TYPE abap_bool OPTIONAL. + IMPORTING io_is_root_node TYPE abap_bool DEFAULT abap_true. + + METHODS set_is_virtual_root_node + IMPORTING io_is_root_node TYPE abap_bool OPTIONAL. + + METHODS set_object_id + IMPORTING + iv_object_id TYPE sxco_ad_field_name OPTIONAL + RAISING + ZDMO_cx_rap_generator. + + METHODS set_is_abstract_or_cust_entity + IMPORTING iv_value TYPE abap_bool DEFAULT abap_true. + + METHODS set_is_extensible + IMPORTING iv_value TYPE abap_bool DEFAULT abap_true. + + METHODS is_abstract_or_custom_entity + RETURNING VALUE(rv_is_abstract_or_cust_entity) TYPE abap_bool. + + PROTECTED SECTION. + + PRIVATE SECTION. + + DATA is_abstract_or_cust_entity TYPE abap_bool. + DATA todos TYPE TABLE OF string WITH EMPTY KEY . + DATA is_test_run TYPE abap_bool. + DATA implementationtype TYPE string. + DATA is_root_node TYPE abap_bool. + DATA bo_is_extensible TYPE abap_bool. + + DATA is_virtual_root_node TYPE abap_bool. + DATA is_child_node TYPE abap_bool. + DATA is_grand_child_node TYPE abap_bool. + DATA bo_node_is_consistent TYPE abap_bool. + DATA keytype TYPE string. + + METHODS add_additional_fields_old + IMPORTING + iv_object TYPE string + it_additional_fields TYPE tt_additional_fields_old. + + + METHODS add_to_all_childnodes + IMPORTING VALUE(io_child_node) TYPE REF TO zdmo_cl_rap_node. + + METHODS add_child_node_hierarchy + IMPORTING + child_node TYPE REF TO zdmo_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + METHODS check_repository_object_name + IMPORTING + iv_type TYPE sxco_ar_object_type + iv_name TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS get_extensib_element_suffix + IMPORTING i_number TYPE i + RETURNING VALUE(r_extensibility_element_suffix) TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS get_unique_repository_obj_name + IMPORTING + i_repository_object_type TYPE string + RETURNING VALUE(unique_repository_object_name) TYPE string + RAISING ZDMO_cx_rap_generator. + + METHODS right_string + IMPORTING + iv_length TYPE i + iv_string TYPE string + RETURNING VALUE(rv_string) TYPE string. + + METHODS set_number + IMPORTING + iv_number TYPE i + RAISING cx_parameter_invalid. + METHODS set_repository_object_names. + + + + METHODS admin_fields_exist + RETURNING VALUE(rv_admin_fields_exists) TYPE abap_bool. + + METHODS field_name_exists_in_cds_view + IMPORTING + iv_field_name TYPE string + RETURNING VALUE(rv_field_name_exists) TYPE abap_bool. + + + METHODS field_name_exists_in_db_table + IMPORTING + iv_field_name TYPE string + RETURNING VALUE(rv_field_name_exists) TYPE abap_bool. + + METHODS get_database_table_fields + IMPORTING + io_database_table TYPE REF TO if_xco_database_table + EXPORTING + et_fields TYPE tt_fields_default_key . + + METHODS get_valid_draft_table_name + IMPORTING iv_name TYPE sxco_dbt_object_name OPTIONAL + RETURNING VALUE(rv_ddic_i_view_name) TYPE sxco_dbt_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS get_valid_table_name + IMPORTING iv_name TYPE sxco_dbt_object_name OPTIONAL + draft_table_suffix TYPE c DEFAULT space + RETURNING VALUE(rv_ddic_i_view_name) TYPE sxco_dbt_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS get_field + IMPORTING + name TYPE ts_field-name + RETURNING VALUE(rs_field) TYPE ts_field. + + METHODS get_abap_type_components + IMPORTING + name TYPE string + RETURNING VALUE(et_fields) TYPE tt_fields_default_key . + + METHODS get_structure_components + IMPORTING + io_components TYPE REF TO if_xco_ad_structure + RETURNING VALUE(et_fields) + TYPE tt_fields_default_key . + + METHODS get_fields_cds_view + IMPORTING + io_cds_view_name TYPE sxco_cds_object_name + RETURNING VALUE(et_fields) + TYPE tt_fields_default_key . + + METHODS read_data_element + IMPORTING + io_data_element TYPE REF TO if_xco_ad_data_element + is_fields TYPE ts_field + EXPORTING + es_fields TYPE ts_field . + + METHODS read_domain + IMPORTING + io_domain TYPE REF TO if_xco_domain + is_fields TYPE ts_field + EXPORTING + es_fields TYPE ts_field. + + METHODS is_alpha_numeric + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_is_alpha_numeric) TYPE abap_bool. + + METHODS is_alphabetical_character_only + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_is_alphabetical_char_only) TYPE abap_bool. + + METHODS contains_no_blanks + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_contains_no_blanks) TYPE abap_bool. + + METHODS underscore_at_pos_2_3 + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_no_underscore_at_pos_2_3) TYPE abap_bool. + + METHODS get_valid_mbc_identifier + IMPORTING iv_name TYPE sxco_cds_object_name OPTIONAL + RETURNING VALUE(rv_mbc_identifier) TYPE sxco_cds_object_name + RAISING ZDMO_cx_rap_generator. + + METHODS Check_repository_object_exists + IMPORTING + iv_type TYPE string + iv_name TYPE string + RETURNING + VALUE(rv_object_already_exists) TYPE abap_bool. + + METHODS repo_object_name_is_used_in_bo + IMPORTING + iv_type TYPE string + iv_name TYPE string + RETURNING + VALUE(rv_repo_obj_name_is_used_in_bo) TYPE abap_bool. + + METHODS repo_obj_name_used_in_rap_gen + IMPORTING + iv_type TYPE string + iv_name TYPE string + RETURNING + VALUE(rv_repo_obj_name_used_rap_gen) TYPE abap_bool. + + METHODS GET_ABAP_DDIC_FROM_Int_TYPE + IMPORTING + iv_ABAP_DDIC_TYPE TYPE abap_typekind + iv_length TYPE i + iv_decimals TYPE i + EXPORTING + rv_Internal_ABAP_type TYPE cl_xco_ad_built_in_type=>tv_type + rv_length TYPE cl_xco_ad_built_in_type=>tv_length + rv_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals . + + METHODS build_repository_object_name + IMPORTING + i_repository_object_type TYPE string + i_entityname_abbreviated TYPE string +* i_binding TYPE string + i_unique_hex_number TYPE xstring + RETURNING + VALUE(r_repository_object_name) TYPE string. + + +* unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_definition_r }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. + +ENDCLASS. + + + +CLASS zdmo_cl_rap_node IMPLEMENTATION. + + + METHOD add_additional_fields. + LOOP AT it_additional_fields INTO DATA(additonal_field). + APPEND additonal_field TO lt_additional_fields. + ENDLOOP. +* "lt_all_fields = lt_fields. +* DATA all_fields_line LIKE LINE OF lt_all_fields. +* LOOP AT lt_additional_fields INTO DATA(additional_field). +* MOVE-CORRESPONDING additional_field TO all_fields_line. +* APPEND all_fields_line TO lt_all_fields. +* ENDLOOP. + ENDMETHOD. + + + METHOD add_additional_fields_old. + + + DATA lv_object TYPE string. + DATA ls_additional_fields TYPE ts_additional_fields_old. + DATA ls_object_with_add_fields TYPE ts_objects_with_add_fields. + + CASE to_lower( iv_object ). + + WHEN additional_fields_object_types-cds_interface_view. "'CDS_INTERFACE_VIEW'. + WHEN additional_fields_object_types-cds_projection_view. + WHEN additional_fields_object_types-draft_table. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>cannot_add_additional_fields + mv_value = iv_object. + ENDCASE. + + ls_object_with_add_fields-object = iv_object. + ls_object_with_add_fields-additional_fields = it_additional_fields. + + APPEND ls_object_with_add_fields TO lt_objects_with_add_fields. + + ENDMETHOD. + + + METHOD add_additonal_to_all_fields. + DATA all_fields_line LIKE LINE OF lt_all_fields. + LOOP AT lt_additional_fields INTO DATA(additional_field). + MOVE-CORRESPONDING additional_field TO all_fields_line. + APPEND all_fields_line TO lt_all_fields. + ENDLOOP. + ENDMETHOD. + + + METHOD add_association. + DATA lv_target TYPE string. + DATA ls_assocation TYPE ts_assocation. + + check_parameter( + EXPORTING + iv_parameter_name = 'Association' ##NO_TEXT + iv_value = CONV #( iv_name ) + ). + + lv_target = to_upper( iv_target ). + + DATA(underscore) = substring( val = iv_name len = 1 ). + + IF underscore <> '_'. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>starts_not_with_underscore + mv_value = CONV #( iv_name ). + ENDIF. + + + IF iv_cardinality = cardinality-one OR iv_cardinality = cardinality-one_to_n OR + iv_cardinality = cardinality-zero_to_n OR iv_cardinality = cardinality-zero_to_one + OR iv_cardinality = cardinality-one_to_one. + ls_assocation-cardinality = iv_cardinality. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>assocation_is_not_supported + mv_value = iv_cardinality. + ENDIF. + + FIELD-SYMBOLS: <fields> TYPE ts_field. + + "we only support the simple case where the condition contains only one field + " IF lines( it_condition_fields ) = 1. + LOOP AT lt_fields ASSIGNING <fields> WHERE cds_view_field = it_condition_fields[ 1 ]-projection_field. + <fields>-has_association = abap_true. + ENDLOOP. + + "Make sure that the association is also using UpperCamelCase + "IF useuppercamelcase = abap_true. + " ls_assocation-name = xco_cp=>string( iv_name )->split( '_' )->compose( xco_cp_string=>composition->pascal_case )->value. + "ELSE. + ls_assocation-name = iv_name. + "ENDIF. + ls_assocation-target = iv_target. + ls_assocation-condition_components = it_condition_fields. + + APPEND ls_assocation TO lt_association. + + " ENDIF. + + ENDMETHOD. + + + METHOD add_child. + + DATA lt_all_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node . + + DATA ls_childnode TYPE REF TO zdmo_cl_rap_node . + + ro_child_node = NEW zdmo_cl_rap_node( ). + + + "get settings from parent node + ro_child_node->set_parent( me ). + ro_child_node->set_root( me->root_node ). + ro_child_node->set_namespace( CONV #( me->namespace ) ). + ro_child_node->set_prefix( CONV #( me->prefix ) ). + ro_child_node->set_suffix( CONV #( me->suffix ) ). + ro_child_node->set_implementation_type( me->get_implementation_type( ) ). + ro_child_node->set_data_source_type( me->data_source_type ). + ro_child_node->set_xco_lib( me->xco_lib ). + ro_child_node->set_draft_enabled( draft_enabled ). + ro_child_node->set_is_customizing_table( me->is_customizing_table ). + ro_child_node->set_has_transactional_behavior( transactional_behavior ). + ro_child_node->set_create_table( create_table ). + ro_child_node->set_mimic_adt_wizard( mimic_adt_wizard ). + ro_child_node->set_number( lines( me->root_node->all_childnodes ) + 1 ). + ro_child_node->set_add_basic_i_views( me->add_basic_i_views ). + ro_child_node->set_is_extensible( me->is_extensible( ) ). + ro_child_node->set_add_sap_object_type( me->add_sap_object_type ). + + + "extensibility_element_suffix is set for each entity separately + "unique value based on the node_number +* IF me->is_extensible( ) = abap_true and me->extensibility_element_suffix is initial. +* DATA(extensibility_suffix_child) = get_extensib_element_suffix( ro_child_node->node_number ). +* ro_child_node->set_ext_element_suffix( extensibility_suffix_child ). +* ENDIF. + APPEND ro_child_node TO childnodes. + + lt_all_childnodes = me->root_node->all_childnodes. + me->root_node->add_to_all_childnodes( ro_child_node ). + + ENDMETHOD. + + + METHOD add_child_node_hierarchy. + "todo + "delete root node flag from child_node + "set parent_node to me + "set root_node to me + "loop at all childnodes and set root node to me + +* loop at child_node->all_childnodes into data(all_childnode). +* +* ENDLOOP. + + IF all_childnodes IS INITIAL. + "add the node itself and all of its child nodes to all_childnodes + APPEND child_node TO all_childnodes. + LOOP AT child_node->all_childnodes INTO DATA(grand_child). + APPEND grand_child TO all_childnodes. + ENDLOOP. + + ENDIF. + + IF childnodes IS INITIAL. + APPEND child_node TO childnodes. + ENDIF. + + ENDMETHOD. + + + METHOD add_fields_to_all_fields. + CLEAR lt_all_fields. + INSERT LINES OF lt_fields INTO TABLE lt_all_fields. + ENDMETHOD. + + + METHOD add_multi_edit. + multi_edit = iv_value. + ENDMETHOD. + + + METHOD add_to_all_childnodes. + APPEND io_child_node TO all_childnodes. + ENDMETHOD. + + + METHOD add_to_manage_business_config. + manage_business_configuration = iv_value. + ENDMETHOD. + + + METHOD add_valuehelp. + + DATA lv_target TYPE string. + DATA ls_valuehelp TYPE ts_valuehelp. + FIELD-SYMBOLS: <fields> TYPE ts_field. + + lv_target = to_upper( iv_name ). + + ls_valuehelp-alias = iv_alias. + ls_valuehelp-element = iv_element. + ls_valuehelp-localelement = iv_localelement. + ls_valuehelp-name = iv_name. + + IF iv_useforvalidation IS NOT INITIAL. + ls_valuehelp-useforvalidation = iv_useforvalidation. + ENDIF. + + IF it_additional_binding IS NOT INITIAL. + + LOOP AT it_additional_binding INTO DATA(ls_additional_binding). + + CASE ls_additional_binding-usage . + WHEN additionalbinding_usage-filter . + WHEN additionalbinding_usage-filter_and_result. + WHEN additionalbinding_usage-result . + WHEN '' . + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>usage_is_not_supported + mv_value = ls_additional_binding-usage. + ENDCASE. + + ENDLOOP. + + ENDIF. + + + ls_valuehelp-additionalbinding = it_additional_binding. + + APPEND ls_valuehelp TO lt_valuehelp. + + LOOP AT lt_fields ASSIGNING <fields> WHERE cds_view_field = iv_localelement. + <fields>-has_valuehelp = abap_true. + ENDLOOP. + + + ENDMETHOD. + + + METHOD add_valuehelp_for_curr_quan. + "add valuehelp for currency fields and quantity fields + LOOP AT lt_fields INTO DATA(field). + IF field-currencycode IS NOT INITIAL. + + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_curr>) WHERE name = field-currencycode. + <field_curr>-is_currencycode = abap_true. +* <field_curr>-is_hidden = abap_true. + ENDLOOP. + + "add_valuehelp will set the flag has_valuehelp to abap_true + IF lt_fields[ name = field-currencycode ]-has_valuehelp = abap_false. + add_valuehelp( + EXPORTING + iv_alias = 'Currency' + iv_name = 'I_Currency' + iv_localelement = lt_fields[ name = field-currencycode ]-cds_view_field + iv_element = 'Currency' + iv_useforvalidation = abap_true + ). + ENDIF. + ENDIF. + IF field-unitofmeasure IS NOT INITIAL. + + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_quan>) WHERE name = field-unitofmeasure. + <field_quan>-is_unitofmeasure = abap_true. +* <field_quan>-is_hidden = abap_true. + ENDLOOP. + + "add_valuehelp will set the flag has_valuehelp to abap_true + IF lt_fields[ name = field-unitofmeasure ]-has_valuehelp = abap_false. + add_valuehelp( + EXPORTING + iv_alias = 'UnitOfMeasure' + iv_name = 'I_UnitOfMeasure' + iv_localelement = lt_fields[ name = field-unitofmeasure ]-cds_view_field + iv_element = 'UnitOfMeasure' + iv_useforvalidation = abap_true + ). + ENDIF. + ENDIF. + + ENDLOOP. + ENDMETHOD. + + + METHOD add_valuehelp_for_language. + "add valuehelp for currency fields and quantity fields + + CHECK field_name-language IS NOT INITIAL. + + LOOP AT lt_fields INTO DATA(field). + IF field_name-language = to_upper( field-name ) AND field-has_valuehelp = abap_false. + add_valuehelp( + EXPORTING + iv_alias = 'Language' + iv_name = 'I_Language' + iv_localelement = field-cds_view_field + iv_element = 'Language' + iv_useforvalidation = abap_true + ). + ENDIF. + ENDLOOP. + ENDMETHOD. + + + METHOD add_virtual_root_node. + + ro_virtual_root_node = NEW zdmo_cl_rap_node( ). + + ro_virtual_root_node->set_namespace( CONV #( me->namespace ) ). + ro_virtual_root_node->set_prefix( CONV #( me->prefix ) ). + ro_virtual_root_node->set_suffix( CONV #( me->suffix ) ). + ro_virtual_root_node->set_implementation_type( me->get_implementation_type( ) ). + ro_virtual_root_node->set_data_source_type( data_source_types-cds_view ). + ro_virtual_root_node->set_xco_lib( me->xco_lib ). + ro_virtual_root_node->set_binding_type( me->binding_type ). + + ro_virtual_root_node->set_draft_enabled( me->draft_enabled ). + ro_virtual_root_node->set_entity_name( |{ me->entityname }{ singleton_suffix }| ). + + ro_virtual_root_node->set_transport_request( CONV #( me->transport_request ) ). + ro_virtual_root_node->set_package( me->package ). + ro_virtual_root_node->set_is_customizing_table( me->is_customizing_table ). + ro_virtual_root_node->add_to_manage_business_config( me->manage_business_configuration ). + + "ro_virtual_root_node->set_is_virtual_root_node( ). + + ro_virtual_root_node->add_child_node_hierarchy( me ). + ro_virtual_root_node->set_is_virtual_root_node( ). + me->set_is_root_node( abap_false ). + me->set_parent( ro_virtual_root_node ). + me->set_root( ro_virtual_root_node ). + + me->add_additional_fields( + VALUE #( + ( + name = '1' + cds_view_field = 'SingletonID' + built_in_type = 'INT1' + cds_interface_view = abap_true + cds_restricted_reuse_view = abap_true + cds_projection_view = abap_true + draft_table = abap_true + ) + ) + ). + + LOOP AT me->all_childnodes INTO DATA(childnode). + childnode->set_root( ro_virtual_root_node ). + childnode->add_additional_fields( + VALUE #( + ( + name = '1' + cds_view_field = 'SingletonID' + built_in_type = 'INT1' + cds_interface_view = abap_true + cds_restricted_reuse_view = abap_true + cds_projection_view = abap_true + draft_table = abap_true + ) + ) + ). + ENDLOOP. + + ENDMETHOD. + + + METHOD admin_fields_exist. + + rv_admin_fields_exists = abap_true. + + IF draft_enabled = abap_true. + "local_instance_last_changed_at + "last_changed_at + ELSE. + "last_changed_at + ENDIF. + + + + ENDMETHOD. + + + METHOD build_repository_object_name. + + DATA(entityname_abbreviated) = i_entityname_abbreviated. + + DATA protocol_version TYPE string. + DATA binding TYPE string. + + DATA object_specific_prefix TYPE string. + DATA object_specific_suffix TYPE string. + + DATA unique_hex_number TYPE c LENGTH 2. + + IF i_unique_hex_number = 00. + unique_hex_number = ''. + ELSE. + unique_hex_number = i_unique_hex_number. + ENDIF. + + CASE binding_type. + WHEN binding_type_name-odata_v2_ui. + protocol_version = protocol_version_suffix-odata_v2. + binding = binding_type_prefix-ui . + WHEN binding_type_name-odata_v4_ui. + protocol_version = protocol_version_suffix-odata_v4. + binding = binding_type_prefix-ui. + WHEN binding_type_name-odata_v2_web_api. + protocol_version = protocol_version_suffix-odata_v2. + binding = binding_type_prefix-web_api. + WHEN binding_type_name-odata_v4_web_api. + protocol_version = protocol_version_suffix-odata_v4. + binding = binding_type_prefix-web_api. + ENDCASE. + + DATA(prefix_wo_underscore) = prefix. + REPLACE '_' IN prefix_wo_underscore WITH ''. + + "prepare for the support of read-only services. Add 'TP' to object names + + IF transactional_behavior = abap_true. + DATA(suffix_transctional_processing) = node_object_suffix-transactional_processing. + ELSE. + suffix_transctional_processing = ''. + ENDIF. + + CASE i_repository_object_type. + + "root node repository objects + WHEN root_node_repository_objects-behavior_definition_r. "'BDEF'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_definition_r }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN root_node_repository_objects-behavior_definition_i. "'BDEF'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_definition_i }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN root_node_repository_objects-behavior_definition_p. "'BDEF'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_definition_p }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN root_node_repository_objects-service_binding. "'SRVB'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ binding }| && |{ entityname_abbreviated }{ unique_hex_number }{ protocol_version }{ suffix }|. + WHEN root_node_repository_objects-service_definition. "'SRVD' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ binding }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. + WHEN root_node_repository_objects-sap_object_type. "'RONT' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ root_node->entityname }| && |{ unique_hex_number }{ suffix }|. + + + "node repository objects + WHEN node_repository_objects-cds_view_i. "'DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_i }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN node_repository_objects-cds_view_i_basic. "'DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_i }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. + WHEN node_repository_objects-cds_view_r. "'DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_r }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN node_repository_objects-cds_view_p. "'DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-cds_view_p }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN node_repository_objects-meta_data_extension. "'DDLX'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-meta_data_extension }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN node_repository_objects-behavior_implementation. "'CLAS'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-behavior_implementation }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN node_repository_objects-custom_entity. "'DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-custom_entity }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix_transctional_processing }{ suffix }|. + WHEN node_repository_objects-custom_query_impl_class. "'CLAS'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-custom_query_impl_class }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. + WHEN node_repository_objects-control_structure. "'STRU'. + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-control_structure }| && |{ entityname_abbreviated }{ unique_hex_number }{ node_object_suffix-control_structure }{ suffix }|. + WHEN node_repository_objects-draft_table. "'TABL'. + r_repository_object_name = |{ namespace }{ prefix_wo_underscore }| && |{ entityname_abbreviated }{ unique_hex_number }{ node_object_suffix-draft_table }{ suffix }|. + "objects needed for extensions + + WHEN node_repository_objects-extension_include_view. "'DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-extension_include_view }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. + WHEN node_repository_objects-extension_include. "Structure' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-extension_include }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. + WHEN node_repository_objects-draft_query_view. "DDLS' . + r_repository_object_name = |{ namespace }{ prefix }| && |{ node_object_prefix-draft_query_view }| && |{ entityname_abbreviated }{ unique_hex_number }{ node_object_suffix-draft_query_view }{ suffix }|. + WHEN node_repository_objects-sap_object_node_type. "NONT' . + "SAP Object Node Type Name = SAP Object Type Name for Root Node + IF me->is_root( ). + r_repository_object_name = |{ namespace }{ prefix }| && |{ root_node->entityname }| && |{ unique_hex_number }{ suffix }|. + "r_repository_object_name = root_node->rap_root_node_objects-sap_object_type. + ELSE. +* r_repository_object_name = |{ namespace }{ prefix }| && |{ root_node->entityname }| && |{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. + r_repository_object_name = |{ namespace }{ prefix }| && |{ entityname }| && |{ unique_hex_number }{ suffix }|. + ENDIF. + ENDCASE. + + ENDMETHOD. + + + METHOD check_data_elements_of_fields. + + "@todo: + "add package1 as an attribute to the class zdmo_cl_rap_node so that it does not have to be calculated + "every time + "the same as the language version of the package. + +* DATA(package1) = xco_lib->get_package( package ). +* DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package ). + + + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<line>). + + IF <line>-is_data_element EQ abap_true. + + DATA(data_element) = xco_cp_abap_repository=>object->dtel->for( <line>-data_element ). + + "fallback to builtin types + IF data_element->exists( ) = abap_false. +* IF data_element->content( )->has_underlying_built_in_type( ). +* DATA(underlying_built_in_type) = data_element->content( )->get_underlying_built_in_type( ). +* <line>-built_in_type = underlying_built_in_type->type. +* <line>-built_in_type_length = underlying_built_in_type->length. +* <line>-built_in_type_decimals = underlying_built_in_type->decimals. + <line>-is_built_in_type = abap_true. + <line>-is_data_element = abap_false. +* ENDIF. + ENDIF. +* DATA api_state TYPE REF TO cl_xco_ars_api_state . +* TRY. +* data_element->get_api_state( RECEIVING ro_api_state = api_state ). +* CATCH cx_root INTO DATA(get_api_state_exc). +* ENDTRY. +* IF api_state IS INITIAL. +** IF api_state->get_release_state( )->value <> 'RELEASED' AND +** abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. +* +** IF data_element->content( )->has_underlying_built_in_type( ). +* +* DATA(underlying_built_in_type) = data_element->content( )->get_underlying_built_in_type( ). +* +* <line>-built_in_type = underlying_built_in_type->type. +* <line>-built_in_type_length = underlying_built_in_type->length. +* <line>-built_in_type_decimals = underlying_built_in_type->decimals. +* <line>-is_built_in_type = abap_true. +* <line>-is_data_element = abap_false. +* +** ENDIF. +* +* ELSEIF api_state->get_release_state( )->value <> 'RELEASED' AND +* abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. +* +** IF data_element->content( )->has_underlying_built_in_type( ). +* underlying_built_in_type = data_element->content( )->get_underlying_built_in_type( ). +* +* <line>-built_in_type = underlying_built_in_type->type. +* <line>-built_in_type_length = underlying_built_in_type->length. +* <line>-built_in_type_decimals = underlying_built_in_type->decimals. +* <line>-is_built_in_type = abap_true. +* <line>-is_data_element = abap_false. +* +** ENDIF. +* +* ENDIF. +* +* +* +* ENDIF. + + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + + METHOD check_parameter. + + "IF iv_value IS INITIAL. + " RAISE EXCEPTION TYPE ZDMO_CX_RAP_GENERATOR + " EXPORTING + " textid = ZDMO_CX_RAP_GENERATOR=>parameter_is_initial + " mv_parameter_name = |Object:{ iv_parameter_name } |. + "ENDIF. + + "@todo + "Simply return if iv_value is intial? + + "search for spaces + IF contains_no_blanks( CONV #( iv_value ) ) = abap_false. + APPEND |Name of { iv_parameter_name } { iv_value } contains spaces| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>contains_spaces + mv_value = |Object:{ iv_parameter_name } Name:{ iv_value }|. + ENDIF. + + "search for non alpha numeric characters + IF is_alpha_numeric( CONV #( iv_value ) ) = abap_false. + APPEND |Name of { iv_parameter_name } { iv_value } contains non alpha numeric characters| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>non_alpha_numeric_characters + mv_value = |Object:{ iv_parameter_name } Name:{ iv_value }|. + ENDIF. + + "check length + DATA(lv_max_length) = 30. + + IF strlen( iv_value ) > lv_max_length. + APPEND |Name of { iv_value } is too long ( { lv_max_length } chararcters max)| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_too_long + mv_value = |{ iv_value } ({ strlen( iv_value ) })| + mv_max_length = lv_max_length. + ENDIF. + + + ENDMETHOD. + + + METHOD Check_repository_object_exists. + + rv_object_already_exists = abap_false. + + + TRY. + CASE iv_type. + WHEN 'BDEF' . + IF xco_lib->get_behavior_definition( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'DDLS' . + IF xco_lib->get_data_definition( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'DDLX' . + IF xco_lib->get_metadata_extension( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'SRVD' . + IF xco_lib->get_service_definition( CONV #( iv_name ) )->if_xco_ar_object~exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'SRVB'. + IF xco_lib->get_service_binding( CONV #( iv_name ) )->if_xco_ar_object~exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'CLAS'. + IF xco_lib->get_class( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'DEVC'. + IF xco_lib->get_package( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'TABL'. + IF xco_lib->get_database_table( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'STRU'. + IF xco_lib->get_structure( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + + WHEN 'RONT'. + "todo xco_lib + IF xco_lib->get_sap_object_type( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + WHEN 'NONT'. + "todo xco_lib + IF xco_lib->get_sap_object_node_type( CONV #( iv_name ) )->exists( ). + rv_object_already_exists = abap_true. + ENDIF. + + WHEN 'SMBC'. +* IF xco_lib->get_structure( CONV #( lv_name ) )->exists( ). +* lv_object_already_exists = abap_true. +* ENDIF. + + + DATA(first_letter_mbc_namespace) = substring( val = me->namespace len = 1 ). + + "The MBC registration API uses a namespace only if it is a "real" namespace. + "If a customer namespace 'Y' or 'Z' is used or if + "SAP objects are created such as I_Test that also do not have a namespace + "then the MBC namespace must be initial. + + CASE first_letter_mbc_namespace. + WHEN '/' . + DATA(abap_object_mbc_name) = namespace && iv_name. + WHEN 'Y' OR 'Z'. + abap_object_mbc_name = namespace && iv_name. + WHEN OTHERS. + abap_object_mbc_name = iv_name. + ENDCASE. + + SELECT * FROM i_custabapobjdirectoryentry WHERE + abapobject = @abap_object_mbc_name AND abapobjectcategory = 'R3TR' AND abapobjecttype = 'SMBC' INTO TABLE @DATA(lt_smbc). + + IF lines( lt_smbc ) = 1. + rv_object_already_exists = abap_true. + ENDIF. + + WHEN OTHERS. + ENDCASE. + + CATCH cx_root INTO DATA(catch_xco_exc). + + DATA(text) = catch_xco_exc->get_text( ). + "in certain edge cases (clas could not be deleted completely) + "the xco libraries raise an error message + "CX_XCO_DEP_FM_CALL_EXCEPTION + "in case xco runs into an exception + "we assume that the object exists to be on the safe side + rv_object_already_exists = abap_true. + ENDTRY. + + ENDMETHOD. + + + METHOD check_repository_object_name. + + "parameters have to be set to upper case + "this will not be necessary in an upcoming release + + DATA lv_max_length TYPE i. + DATA(lv_type) = to_upper( iv_type ). + DATA(lv_name) = to_upper( iv_name ). + DATA lv_object_already_exists TYPE abap_bool. + + DATA(number_of_characters_namespace) = strlen( namespace ). + DATA(object_name_without_namespace) = substring( val = lv_name off = number_of_characters_namespace ). + + "check if repository already exists + + lv_object_already_exists = Check_repository_object_exists( iv_type = lv_type + iv_name = lv_name ). + + IF lv_object_already_exists = abap_true. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>repository_already_exists + mv_value = lv_name + mv_value_2 = lv_type. + ENDIF. + + + + + CASE lv_type. + WHEN 'BDEF' OR 'DDLS' OR 'DDLX' OR 'SRVD' OR 'STRU'. + lv_max_length = 30. + WHEN 'SRVB'. + lv_max_length = 26. + WHEN 'CLAS'. + lv_max_length = 30. + WHEN 'DEVC'. + lv_max_length = 20. + WHEN 'TABL'. + lv_max_length = 16. + WHEN 'SMBC'. + lv_max_length = 20. + WHEN 'RONT' OR 'NONT'. + lv_max_length = 30. + WHEN OTHERS. + ENDCASE. + + IF lv_type = 'STRU'. + lv_type = 'TABL(Structure)'. + ENDIF. + + IF lv_type = 'TABL'. + lv_type = 'TABL(Database Table)'. + ENDIF. + + "search for non alpha numeric characters + IF is_alpha_numeric( CONV #( object_name_without_namespace ) ) = abap_false. + APPEND |Name of { lv_type } { lv_name } contains non alpha numeric characters| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>non_alpha_numeric_characters + mv_value = | { lv_type }:{ lv_name }|. + ENDIF. + + "search for spaces + IF contains_no_blanks( CONV #( lv_name ) ) = abap_false. + APPEND |Name of { lv_type } { lv_name } contains spaces| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>contains_spaces + mv_value = |Object Type: { lv_type } Object Name:{ lv_name }|. + ENDIF. + + "check length + IF strlen( lv_name ) > lv_max_length. + APPEND |Name of { lv_type } is too long ( { lv_max_length } chararcters max)| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_too_long + mv_value = |{ lv_name } ({ strlen( lv_name ) })| + mv_max_length = lv_max_length. + ENDIF. + + "Check table and structures for "Underscore not permitted at 2nd or 3rd position" + IF ( lv_type = 'TABL(Database Table)' OR lv_type = 'TABL(Structure)' ) AND + underscore_at_pos_2_3( lv_name ) = abap_true. + APPEND |Name of { lv_name } - underscore not permitted at 2nd or 3rd position| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>underscore_not_at_pos_2_3 + mv_value = lv_name. + ENDIF. + + ENDMETHOD. + + + METHOD check_table_package_assignment. + + "check if tables that shall be used + "and the package that has been provided + "reside in the same software component + + " Get name of the software component of the package + "DATA(package_object) = xco_cp_abap_repository=>object->devc->for( package ). + DATA(package_object) = xco_lib->get_package( package ). + + DATA(swc_name_package) = package_object->read( )-property-software_component->name. + + "Compare with software components of tables + "check table of root node + + "create object for table + "DATA(lo_database_table) = xco_cp_abap_dictionary=>database_table( root_node->table_name ). + DATA(lo_database_table) = xco_lib->get_database_table( root_node->table_name ). + " Get package. + DATA(package_of_db_table) = lo_database_table->if_xco_ar_object~get_package( )->read( ). + " Software component. + DATA(swc_name_db_table) = package_of_db_table-property-software_component->name. + + IF swc_name_package <> swc_name_db_table. + IF NOT swc_name_db_table = 'ZDMO_SAP' AND swc_name_db_table = 'ZLOCAL'. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>software_comp_do_not_match + mv_table_name = CONV #( root_node->table_name ) + mv_package_name = CONV #( package ). + ENDIF. + ENDIF. + + "check tables of child nodes + + IF root_node->has_childs( ). + LOOP AT root_node->all_childnodes INTO DATA(ls_childnode). + + "lo_database_table = xco_cp_abap_dictionary=>database_table( ls_childnode->table_name ). + lo_database_table = xco_lib->get_database_table( ls_childnode->table_name ). + + package_of_db_table = lo_database_table->if_xco_ar_object~get_package( )->read( ). + swc_name_db_table = package_of_db_table-property-software_component->name. + IF swc_name_package <> swc_name_db_table. + IF NOT swc_name_db_table = 'ZDMO_SAP' AND swc_name_db_table = 'ZLOCAL'. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>software_comp_do_not_match + mv_table_name = CONV #( ls_childnode->table_name ) + mv_package_name = CONV #( package ). + ENDIF. + ENDIF. + ENDLOOP. + ENDIF. + + + + ENDMETHOD. + + + METHOD constructor. + + IF io_xco_lib IS NOT INITIAL. + xco_lib = io_xco_lib. + ELSE. + xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + + bo_node_is_consistent = abap_true. + is_finalized = abap_false. +* draft_enabled = abap_false. + useuppercamelcase = abap_true. + add_meta_data_extensions = abap_true. + skip_activation = abap_false. + add_sap_object_type = abap_true. + +* field_name-client = 'CLIENT'. +* field_name-uuid = 'UUID'. +* field_name-parent_uuid = 'PARENT_UUID'. +* field_name-root_uuid = 'ROOT_UUID'. +* field_name-created_by = 'CREATED_BY'. +* field_name-created_at = 'CREATED_AT'. +* field_name-last_changed_by = 'LAST_CHANGED_BY'. +* field_name-last_changed_at = 'LAST_CHANGED_AT'. +* field_name-local_instance_last_changed_at = 'LOCAL_LAST_CHANGED_AT'. +* field_name-local_instance_last_changed_by = 'LOCAL_LAST_CHANGED_BY'. +* field_name-language = 'SPRAS'. +* field_name-etag_master = 'LOCAL_LAST_CHANGED_AT'. +* field_name-total_etag = 'LAST_CHANGED_AT'. + + builtintype_name-client = 'CLNT'. + builtintype_name-language = 'LANG'. + + dataelement_name-client = 'MANDT'. + dataelement_name-language = 'SPRAS'. + dataelement_name-etag_master = 'ABP_LOCINST_LASTCHANGE_TSTMPL'. + dataelement_name-total_etag = 'ABP_LASTCHANGE_TSTMPL'. + + dataelement_name-last_changed_by = 'ABP_LASTCHANGE_USER'. + dataelement_name-last_changed_at = 'ABP_LASTCHANGE_TSTMPL'. + dataelement_name-created_by = 'ABP_CREATION_USER'. + dataelement_name-created_at = 'ABP_CREATION_TSTMPL'. + dataelement_name-local_instance_last_changed_by = 'ABP_LOCINST_LASTCHANGE_USER'. + dataelement_name-local_instance_last_changed_at = 'ABP_LOCINST_LASTCHANGE_TSTMPL'. + + publish_service = abap_true. + transactional_behavior = abap_true. +* binding_type = binding_type_name-odata_v4_ui. + + "xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + "xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + + TEST-SEAM runs_as_cut. + is_test_run = abap_false. + END-TEST-SEAM. + + ENDMETHOD. + + + METHOD contains_no_blanks. + rv_contains_no_blanks = abap_true. + FIND ALL OCCURRENCES OF REGEX '[[:space:]]' IN iv_string RESULTS DATA(blanks). + IF blanks IS NOT INITIAL. + rv_contains_no_blanks = abap_false. + ENDIF. + ENDMETHOD. + + + METHOD field_name_exists_in_cds_view. + rv_field_name_exists = abap_false. + LOOP AT lt_fields INTO DATA(ls_field). + IF ls_field-cds_view_field = iv_field_name. + rv_field_name_exists = abap_true. + ENDIF. + ENDLOOP. + ENDMETHOD. + + + METHOD field_name_exists_in_db_table. + "safety measure if field name in JSON is not upper case + DATA(lv_field_name_upper) = to_upper( iv_field_name ). + "Check the field list contains a field with this name + rv_field_name_exists = boolc( line_exists( lt_fields[ name = lv_field_name_upper ] ) ). + + ENDMETHOD. + + + METHOD finalize. + "namespace must be set for root node + "namespace for child objects will be set in method add_child( ) + + IF me->is_extensible( ) = abap_true AND me->extensibility_element_suffix IS INITIAL. + DATA(extensibility_suffix_child) = get_extensib_element_suffix( me->node_number ). + me->set_ext_element_suffix( extensibility_suffix_child ). + ENDIF. + + "extensible RAP BO's the generator enforces the use of SAPObjectTypes and SAPObjectNodeTypes + IF me->is_extensible( ) = abap_true. + me->set_add_sap_object_type( abap_true ) . + ENDIF. + + DATA manage_business_cfg_identifier TYPE if_mbc_cp_api_business_config=>ty_identifier. + + IF namespace IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_namespace_set. + ENDIF. + + IF create_table = abap_true AND table_name IS INITIAL. + table_name = get_valid_table_name( + "iv_name = space + draft_table_suffix = space + ) + . + ENDIF. + + IF create_table = abap_true AND persistent_table_name IS INITIAL. + persistent_table_name = table_name. + ENDIF. + IF create_table = abap_true AND lt_fields_persistent_table IS INITIAL. + lt_fields_persistent_table = lt_fields. + ENDIF. + + "check if table used as a data source is #extensible_any + IF bo_is_extensible = abap_true AND create_table = abap_false. + + DATA has_extension_include TYPE abap_bool. + DATA(database_table) = xco_lib->get_database_table( iv_name = to_upper( table_name ) ). + DATA(database_table_content) = database_table->content( ). + DATA(enhancement_category) = database_table_content->get_enhancement_category( )->value. + IF enhancement_category NE zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>table_not_extensible + mv_table_name = CONV #( table_name ) + mv_value = CONV #( 'EXTENSIBLE_ANY' ). + ENDIF. + + ENDIF. + + + + CASE data_source_type. + WHEN data_source_types-table. + IF table_name IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_data_source_set + mv_entity = entityname. + ENDIF. + WHEN data_source_types-cds_view OR data_source_types-abstract_entity. + IF cds_view_name IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_data_source_set + mv_entity = entityname. + ENDIF. + ENDCASE. + IF implementationtype = implementation_type-unmanaged_semantic OR + implementationtype = implementation_type-managed_semantic. + IF semantic_key IS INITIAL . + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_semantic_key_set. + ENDIF. + ENDIF. + + IF object_id IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_object_id_set + mv_entity = entityname. + ENDIF. + + IF lt_fields IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_fields_found + mv_entity = entityname. + ENDIF. + + "set root_uuid +* IF is_grand_child_or_deeper( ). +* set_field_name_root_uuid( root_node->field_name-uuid ). +* ENDIF. + + add_valuehelp_for_curr_quan( ). + "add additional checks from methods add_valuehelp( ), set_semantic_key_fields( ) and ADD ASSOCIATION( ) + + add_valuehelp_for_language( ). + + LOOP AT lt_valuehelp INTO DATA(value_help). + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_wo_value_help>) WHERE cds_view_field = value_help-localelement. + <field_wo_value_help>-has_valuehelp = abap_true. + ENDLOOP. + ENDLOOP. + + "hide administrative fields + "hide guid based fields + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_hidden>). + CASE to_upper( <field_hidden>-name ). + WHEN field_name-uuid. + <field_hidden>-is_hidden = abap_true. + WHEN field_name-last_changed_at. + <field_hidden>-is_hidden = abap_true. + WHEN field_name-last_changed_by . + <field_hidden>-is_hidden = abap_true. + WHEN field_name-created_at . + <field_hidden>-is_hidden = abap_true. + WHEN field_name-created_by . + <field_hidden>-is_hidden = abap_true. + WHEN field_name-parent_uuid . + <field_hidden>-is_hidden = abap_true. + WHEN field_name-root_uuid . + <field_hidden>-is_hidden = abap_true. + WHEN field_name-local_instance_last_changed_at. + <field_hidden>-is_hidden = abap_true. + WHEN field_name-local_instance_last_changed_by. + <field_hidden>-is_hidden = abap_true. + ENDCASE. + ENDLOOP. + "for custom entities the key has to be specified via the json file + IF data_source_type = data_source_types-structure. + LOOP AT semantic_key INTO DATA(ls_semantic_key). + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field_without_key>) WHERE name = ls_semantic_key-name. + <field_without_key>-key_indicator = abap_true. + ENDLOOP. + ENDLOOP. + "to get key fields on top we have to sort by key_indicator descending + SORT lt_fields BY key_indicator DESCENDING name ASCENDING. + ENDIF. + + "fill lt_all_fields only after lt_fields is finalized (e.g. is_hidden is added) + add_fields_to_all_fields( ). + add_additonal_to_all_fields( ). + + "if get_fields( ) is called before set_field_name_client + "the client field is added to the mapping though it must not be part of it + + DELETE lt_mapping WHERE dbtable_field = field_name-client. + + validate_bo( ). + + set_repository_object_names( ). + + + IF lt_messages IS NOT INITIAL AND is_root( ) = abap_false. + APPEND | Messages from { entityname } | TO me->root_node->lt_messages. + APPEND LINES OF lt_messages TO me->root_node->lt_messages. + ENDIF. + + IF bo_node_is_consistent = abap_true. + is_finalized = abap_true. + ENDIF. + + ENDMETHOD. + + + METHOD generate_bil. + + "for the root node we need the method get_global_authorization + "since authorization master( global ) is set in BDEF + DATA(is_root) = is_root( ). + + "virtual root node needs several methods in BIL + DATA(is_virtual_root_node) = is_virtual_root( ). + + "all nodes that use managed_uuid need a determination for the field object_id + IF get_implementation_type( ) = zdmo_cl_rap_node=>implementation_type-managed_uuid. + DATA(is_managed_uuid) = abap_true. + ENDIF. + + "all nodes that use managed_managed need a determination for the field object_id + IF get_implementation_type( ) = zdmo_cl_rap_node=>implementation_type-managed_semantic. + DATA(is_managed_semantic) = abap_true. + ENDIF. + + "all nodes of an unmanged BO need methods such as create, read, read by association being implemented + IF get_implementation_type( ) = zdmo_cl_rap_node=>implementation_type-unmanaged_semantic . + DATA(is_unmanaged_semantic) = abap_true. + ENDIF. + +* IF is_managed_semantic = abap_true. +* result = abap_false. +* EXIT. +* ENDIF. + + result = xsdbool( + ( +********************************************************************** +** Begin of deletion 2108 +********************************************************************** + is_root = abap_true OR +********************************************************************** +** End of deletion 2108 +********************************************************************** + is_virtual_root_node = abap_true OR + is_managed_uuid = abap_true OR + is_customizing_table = abap_true OR + is_unmanaged_semantic = abap_true + OR + is_managed_semantic = abap_true + ) + "if transactional_behavior is ABAP_FALSE no + "BIL must be created + AND + transactional_behavior = abap_true + ). + + + + ENDMETHOD. + + + METHOD generate_custom_entity. + + IF data_source_type = data_source_types-abap_type OR + data_source_type = data_source_types-structure OR + is_abstract_or_custom_entity( ) . + + result = abap_true. + + ELSE. + + result = abap_false. + + ENDIF. + + ENDMETHOD. + + + METHOD get_abap_ddic_from_int_type. + + +*Fixed Value +* +*Description + +*'ACCP' Posting Period YYYYMM +*'CHAR' Character String +*'CLNT' Client +*'CUKY' Currency key for currency fields +*'CURR' Currency Field in BCD Format +*'D16D' Decimal floating point number saved in BCD format +*'D16N' Floating point number (native HANA type SMALLDECIMAL) +*'D16R' Decimal floating point number saved as binary number +*'D16S' Decimal floating point number with scaling (obsolete) +*'D34D' Decimal floating point number saved in BCD format +*'D34N' Floating point number (native HANA type DECIMAL) +*'D34R' Decimal floating point number saved as binary number +*'D34S' Decimal floating point number with scaling (obsolete) +*'DATN' Date in format YYYYMMDD (native HANA type DATE) +*'DATS' Date in Format YYYYMMDD +*'DEC' Packed Number in BCD Format +*'FLTP' Floating Point Number +*'GGM1' Geometry (EWKB representation) +*'INT1' 1-Byte Integer, 0 to 255 +*'INT2' 2-byte integer, -32768 to 32767 +*'INT4' 4-byte integer, -2147483648 to +2147483647 +*'INT8' 8-Byte Integer +*'LANG' Language key +*'LCHR' Long Character String +*'LRAW' Long Byte String +*'NUMC' Numerical Text +*'PREC' Obsolete Data Type +*'QUAN' Quantity Field in BCD Format +*'RAW' Byte Sequence +*'RSTR' Byte String (BLOB) +*'SSTR' Character String +*'STRG' Character String (CLOB) +*'TIMN' Time in format HHMMSS (native HANA type TIME) +*'TIMS' Time in Format HHMMSS +*'UNIT' Unit key of a quantity field +*'UTCL' Time stamp (native HANA type TIMESTAMP) +*'VARC' Obsolete Data Type + + + CASE iv_abap_ddic_type . + WHEN 'C'. + rv_internal_abap_type = 'CHAR'. + rv_length = iv_length. + rv_decimals = iv_decimals. + WHEN 'B'. + rv_internal_abap_type = 'INT1'. + rv_length = 3. + rv_decimals = 0. + WHEN 'S'. + rv_internal_abap_type = 'INT2'. + rv_length = 5. + rv_decimals = 0. + WHEN 'I'. + rv_internal_abap_type = 'INT4'. + rv_length = 10. + rv_decimals = 0. + WHEN 'INT8'. + rv_internal_abap_type = 'INT8'. + rv_length = 19. + rv_decimals = 0. + WHEN 'F'. + rv_internal_abap_type = 'fltp'. + rv_length = 16. + rv_decimals = 16. + WHEN 'D'. + rv_internal_abap_type = 'dats'. + rv_length = 8. + rv_decimals = 0. + WHEN 'T'. + rv_internal_abap_type = 'tims'. + rv_length = 6. + rv_decimals = 0. + WHEN OTHERS. + "todo : Raise an exception instead? + rv_internal_abap_type = 'CHAR'. + rv_length = iv_length. + rv_decimals = iv_decimals. + ENDCASE. + + + + ENDMETHOD. + + + METHOD get_abap_type_components. + + DATA abap_class TYPE REF TO if_xco_ao_class . + DATA abap_type TYPE REF TO if_xco_ao_c_type . + DATA abap_class_name TYPE sxco_ao_object_name . + DATA abap_type_name TYPE sxco_ao_component_name. + + split_and_check_abap_type_name( + EXPORTING + iv_abap_type_name = name + IMPORTING + ev_class_name = abap_class_name + ev_type_name = abap_type_name + ). "( abap_type_name ). + + "abap class and type have been checked in split_and_check_abap_type_name( ) + abap_class = xco_cp_abap=>class( abap_class_name ). + abap_type = abap_class->definition->section-public->component->type( abap_type_name ). + + DATA(typing_method) = abap_type->content( )->get_typing_method( ). + DATA(typing_definition) = abap_type->content( )->get_typing_definition( ). + + IF typing_method->value = 1 AND typing_definition->has_value( ) = abap_true. + DATA(structure) = xco_lib->get_structure( CONV #( typing_definition->get_value( ) ) ). + ENDIF. + "io_components type ref to if_xco_ad_structure + IF structure IS NOT INITIAL. + et_fields = get_structure_components( structure ). + "the name of the structure is needed for the statement + "mapping for <structure name> control <control structure> in BDEF + structure_name = structure->name. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_abap_type_name + mv_value = | { abap_type_name } | + mv_entity = entityname + mv_value_2 = | ABAP type not supported. |. + ENDIF. + + ENDMETHOD. + + + METHOD get_database_table_fields. + + DATA table_fields TYPE ts_field . + + DATA(ls_database_table) = io_database_table->content( )->get( ). + + LOOP AT io_database_table->fields->all->get( ) INTO DATA(lo_field). + CLEAR table_fields. + DATA(lo_field_content) = lo_field->content( ). + DATA(lo_field_content_type) = lo_field_content->get_type( ). + DATA(ls_field) = lo_field_content->get( ). + + table_fields-name = lo_field->name. + IF useuppercamelcase = abap_true. + "table_fields-cds_view_field = to_mixed( table_fields-name ). + table_fields-cds_view_field = xco_cp=>string( table_fields-name )->split( '_' )->compose( xco_cp_string=>composition->pascal_case )->value. + ELSE. + table_fields-cds_view_field = table_fields-name. + ENDIF. + + "add hardcoded mappings + CASE table_fields-name. + WHEN 'SPRAS'. + IF useuppercamelcase = abap_true. + table_fields-cds_view_field = 'Language'. + ENDIF. + ENDCASE. + + table_fields-key_indicator = ls_field-key_indicator. + table_fields-not_null = ls_field-not_null. + table_fields-is_data_element = lo_field_content_type->is_data_element( ). + table_fields-is_built_in_type = lo_field_content_type->is_built_in_type( ). + IF table_fields-is_built_in_type = abap_true. + table_fields-built_in_type = lo_field_content_type->get_built_in_type( )->type. + table_fields-built_in_type_length = lo_field_content_type->get_built_in_type( )->length. + table_fields-built_in_type_decimals = lo_field_content_type->get_built_in_type( )->decimals. + ENDIF. + IF table_fields-name = 'QUANTITY'. + DATA(a) = 1. + ENDIF. + IF ls_field-type->is_data_element( ) EQ abap_true. + DATA(lo_data_element) = ls_field-type->get_data_element( ). + +* data(data_element) = xco_lib->get_data_element( lo_data_element->name ). + + + IF lo_data_element->content( )->has_underlying_built_in_type( ). + DATA(underlying_built_in_type) = lo_data_element->content( )->get_underlying_built_in_type( ). + +* IF xco_abap_dictionary=>data_element( lo_data_element->name )->content( )->has_underlying_built_in_type( ). +* DATA(underlying_built_in_type) = xco_abap_dictionary=>data_element( lo_data_element->name )->content( )->get_underlying_built_in_type( ). + +* IF xco_cp_abap_dictionary=>data_element( lo_data_element->name )->content( )->has_underlying_built_in_type( ). +* DATA(underlying_built_in_type) = xco_cp_abap_dictionary=>data_element( lo_data_element->name )->content( )->get_underlying_built_in_type( ). + + table_fields-built_in_type = underlying_built_in_type->type . + table_fields-built_in_type_decimals = underlying_built_in_type->decimals . + table_fields-built_in_type_length = underlying_built_in_type->length . + ENDIF. + + + IF lo_data_element->exists( ) = abap_true. + table_fields-data_element = lo_data_element->name. +* DATA api_state TYPE REF TO cl_xco_ars_api_state . +* lo_data_element->get_api_state( RECEIVING ro_api_state = api_state ). +* "in on prem systems the xco library will find any data element +* "if package has language version abap_for_cloud_development we have to ensure +* "that the data element is released +* IF api_state->get_release_state( )->value = 'RELEASED' . +* +* table_fields-data_element = lo_data_element->name. +* +* ELSE. +* +* +* ENDIF. + ELSE. + + "if xco cannot find the data element it is not released + "we have hence to fall back on built in types. + + table_fields-is_data_element = abap_false. + table_fields-is_built_in_type = abap_true. + + ENDIF. + +* read_data_element( +* EXPORTING +* io_data_element = lo_data_element +* is_fields = table_fields +* IMPORTING +* es_fields = table_fields +* ). + +* ELSE. +* IF ls_field-type->is_built_in_type( ) = abap_true. +* table_fields-built_in_type = ls_field-type->get_built_in_type( )->type. +* table_fields-built_in_type_length = ls_field-type->get_built_in_type( )->length. +* table_fields-built_in_type_decimals = ls_field-type->get_built_in_type( )->decimals. +* ENDIF. + ENDIF. + + DATA(currency_quantity) = ls_field-currency_quantity. + + IF currency_quantity IS NOT INITIAL. + CASE table_fields-built_in_type. + WHEN 'CURR'. + table_fields-currencycode = ls_field-currency_quantity-reference_field. + WHEN 'QUAN'. + table_fields-unitofmeasure = ls_field-currency_quantity-reference_field. + ENDCASE. + ENDIF. + + IF to_upper( right_string( iv_length = 2 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'ID'. + table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 2 ) && 'ID' . + ENDIF. + + IF to_upper( right_string( iv_length = 4 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'UUID'. + table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 4 ) && 'UUID' . + ENDIF. + + APPEND table_fields TO et_fields. + + ENDLOOP. + ENDMETHOD. + + + METHOD get_extensib_element_suffix. + + DATA alphabet TYPE string. + DATA test TYPE string. + DATA base TYPE i . + DATA number TYPE i. + DATA pos1 TYPE i. + DATA pos2 TYPE i. + DATA pos3 TYPE i. + + alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + base = strlen( alphabet ). + + pos1 = i_number DIV base. + pos2 = i_number - pos1 * base. + + + CASE namespace. + + WHEN 'Z' OR 'Y'. + + IF i_number < base * base. + DATA(character_1) = substring( val = alphabet off = pos1 len = 1 ). + DATA(character_2) = substring( val = alphabet off = pos2 len = 1 ). + r_extensibility_element_suffix = namespace && character_1 && character_2. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>too_many_nodes + mv_value = | { i_number } | + mv_entity = | 'Z.' & Max { base } x { base } possible.|. + ENDIF. + + WHEN OTHERS. + + IF i_number < base * base * base. + character_1 = substring( val = alphabet off = pos1 len = 1 ). + character_2 = substring( val = alphabet off = pos2 len = 1 ). + "For SAP or partner objects more than 625 nodes can + "be used ;-) + r_extensibility_element_suffix = 'Z' && character_1 && character_2. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>too_many_nodes + mv_value = | { i_number } | + mv_entity = | Max { base } x { base } x { base } possible.|. + ENDIF. + + ENDCASE. +*if namespace +*r_extensibility_element_suffix = + + + + + ENDMETHOD. + + + METHOD get_field. + "search fields from data source + READ TABLE lt_fields INTO rs_field WITH KEY name = to_upper( name ). + IF sy-subrc = 0. + RETURN. + ENDIF. + + + ENDMETHOD. + + + METHOD get_fields. + + + + DATA lo_struct_desc TYPE REF TO cl_abap_structdescr. + DATA lo_type_desc TYPE REF TO cl_abap_typedescr. + DATA lt_components TYPE cl_abap_structdescr=>component_table . + DATA ls_components LIKE LINE OF lt_components. + DATA dref_table TYPE REF TO data. + DATA ls_fields TYPE ts_field. + DATA semantic_key_fields TYPE tt_semantic_key_fields . + + + CASE data_source_type. + + WHEN data_source_types-table. + + + TEST-SEAM get_mock_data_fields. + "importing io_read_state type ref to cl_xco_ad_object_read_state default xco_abap_dictionary=>object_read_state->active_version + + DATA(lo_database_table) = xco_lib->get_database_table( iv_name = table_name ). + + get_database_table_fields( + EXPORTING + io_database_table = lo_database_table + IMPORTING + et_fields = lt_fields + ). + + + END-TEST-SEAM. + +* set_mapping( ). + + WHEN data_source_types-structure. + + DATA(lo_structure) = xco_lib->get_structure( iv_name = structure_name ). + + lt_fields = get_structure_components( lo_structure ). + + +* set_mapping( ). + + WHEN data_source_types-abap_type. + + lt_fields = get_abap_type_components( abap_type_name ). + +* set_mapping( ). + + WHEN data_source_types-cds_view OR data_source_types-abstract_entity. + + lt_fields = get_fields_cds_view( CONV #( cds_view_name ) ). " abap_type_components( abap_type_name ). + + + + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_data_source_type + mv_value = data_source_type. + + + ENDCASE. + + "determine automatically the name of the fields for the client key field and the language key field + "since there are different combinations possible that use either a dataelement or a built-in type + " e.g. + "key client : mandt; + "key client : abap.clnt + "key langu : spras; + "key langu : abap.lang; + + set_field_name_client( ). + set_field_name_language( ). + + "field name of client field must be known before semantic key fields are determined + + IF data_source_type <> data_source_types-structure AND + data_source_type <> data_source_types-abap_type . + + + + IF implementationtype = implementation_type-managed_semantic OR + implementationtype = implementation_type-unmanaged_semantic. + + CLEAR semantic_key_fields. + CLEAR semantic_key. + + LOOP AT lt_fields INTO ls_fields WHERE key_indicator = abap_true AND name <> field_name-client. + APPEND ls_fields-name TO semantic_key_fields. + ENDLOOP. + + set_semantic_key_fields( semantic_key_fields ). + + ENDIF. + ENDIF. + + "data source field names have be set to upper-case + "this is required if cds views or abstract entities + "are used as a data source + + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<line>). + <line>-name = to_upper( <line>-name ). + ENDLOOP. + + "fill lt_all_fields with the fields read from the data source. + "add additional fields to lt_all_fields if additional fields are added + "in add_additional_fields_2 + " lt_all_fields = lt_fields. + + set_mapping( ). + +* throws errors + check_data_elements_of_fields( ). + + ENDMETHOD. + + + METHOD get_fields_cds_view. + TYPES: + BEGIN OF ts_semantics_amount, + currencycode TYPE string, + END OF ts_semantics_amount. + DATA semantic_amount TYPE ts_semantics_amount. + + TYPES: + BEGIN OF ts_semantics_quantity, + unitofmeasure TYPE string, + END OF ts_semantics_quantity. + DATA semantic_quantity TYPE ts_semantics_quantity. + + TYPES : + BEGIN OF ts_field_name, + field_name TYPE sxco_cds_field_name, + END OF ts_field_name. + + DATA association_field_names TYPE STANDARD TABLE OF ts_field_name WITH EMPTY KEY. + DATA composition_field_names TYPE STANDARD TABLE OF ts_field_name WITH EMPTY KEY. + + + + DATA ls_fields TYPE ts_field. + DATA lo_fields TYPE sxco_t_cds_fields . + DATA lo_assoc TYPE sxco_t_cds_associations . + DATA lo_composition TYPE sxco_t_cds_compositions . + + DATA(lo_data_definition) = xco_lib->get_data_definition( CONV #( io_cds_view_name ) ). + DATA(view_type) = lo_data_definition->get_type( ). + + CLEAR lo_assoc. + CLEAR lo_composition. + +**lo_assoc = lo_data_definition->entity( )->associations->all->get( ). +** lo_composition = lo_data_definition->view_entity( )->compositions->all->get( ). +* lo_fields = lo_data_definition->entity( )->fields->all->get( ). +* view_type_value = view_type->value. + +********************************************************************** + " method entity( ) works for getting fields for all entity types + CASE view_type . + WHEN xco_cp_data_definition=>type->view_entity. + lo_assoc = lo_data_definition->view_entity( )->associations->all->get( ). + lo_composition = lo_data_definition->view_entity( )->compositions->all->get( ). + lo_fields = lo_data_definition->view_entity( )->fields->all->get( ). + view_type_value = view_type->value. + +* DATA(view_entity) = xco_lib->get_view_entity( CONV #( io_cds_view_name ) ). +* +* DATA(lo_view_entity_Fields) = view_entity->fields->all->get( ). + + TRY. + DATA(components_view) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( io_cds_view_name ) )->get_components( ). + CATCH cx_sy_rtti_type_not_released INTO DATA(cx_released_check_failed). + + DATA(rtti_released_check_text) = cx_released_check_failed->get_text( ). +* + + CATCH cx_root INTO DATA(cx_rtti_problem_view_entity). + + + DATA(rtti_problem_view_entity_text) = cx_rtti_problem_view_entity->get_text( ). +* DATA(rtti_problem_view_entity_root) = cl_message_helper=>get_latest_t100_exception( cx_rtti_problem_view_entity )->if_message~get_longtext( ). + + + "do nothing + "when components_view is initial we will only see the + "field names in the value help + ENDTRY. + + WHEN xco_cp_data_definition=>type->view. + lo_assoc = lo_data_definition->view( )->associations->all->get( ). + lo_composition = lo_data_definition->view( )->compositions->all->get( ). + lo_fields = lo_data_definition->view( )->fields->all->get( ). + view_type_value = view_type->value. + "get value of annotation @AbapCatalog.sqlViewName + "to retrieve the name of the sql view name + + +* DATA(view) = xco_lib->get_view_entity( CONV #( io_cds_view_name ) ). +* +* DATA(lo_view_Fields) = view->fields->all->get( ). +* +* lo_fields = lo_view_Fields. + TRY. + components_view = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_name( io_cds_view_name ) )->get_components( ). + CATCH cx_root INTO DATA(cx_rtti_problem_view). + + DATA(rtti_problem_view_text) = cx_rtti_problem_view->get_text( ). + +* DATA(rtti_problem_view_root) = cl_message_helper=>get_latest_t100_exception( cx_rtti_problem_view )->if_message~get_longtext( ). + + "do nothing + "when components_view is initial we will only see the + "field names in the value help + ENDTRY. + + WHEN xco_cp_data_definition=>type->abstract_entity. + set_is_abstract_or_cust_entity( ). + lo_fields = lo_data_definition->abstract_entity( )->fields->all->get( ). + " in abstract and custom entities associations and compositions are defined as fields + LOOP AT lo_fields INTO DATA(lo_field). + IF lo_field->content( )->get( )-association-target IS NOT INITIAL. + APPEND lo_field->name TO association_field_names. + APPEND lo_field->content( )->get( )-association-target TO association_targets. + ENDIF. + IF lo_field->content( )->get( )-composition-target IS NOT INITIAL. + APPEND lo_field->name TO composition_field_names. + APPEND lo_field->content( )->get( )-composition-target TO composition_targets. + ENDIF. + ENDLOOP. + view_type_value = view_type->value. + + WHEN xco_cp_data_definition=>type->custom_entity. + + set_is_abstract_or_cust_entity( ). + lo_fields = lo_data_definition->custom_entity( )->fields->all->get( ). + " in abstract and custom entities associations and compositions are defined as fields + LOOP AT lo_fields INTO lo_field. + IF lo_field->content( )->get( )-association-target IS NOT INITIAL. + APPEND lo_field->name TO association_field_names. + APPEND lo_field->content( )->get( )-association-target TO association_targets. + ENDIF. + IF lo_field->content( )->get( )-composition-target IS NOT INITIAL. + APPEND lo_field->name TO composition_field_names. + APPEND lo_field->content( )->get( )-composition-target TO composition_targets. + ENDIF. + ENDLOOP. + view_type_value = view_type->value. + + WHEN OTHERS. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>view_type_not_supported + mv_value = | { view_type->value } | + mv_entity = entityname. + + + ENDCASE. + + + LOOP AT lo_assoc INTO DATA(assoc). + APPEND to_upper( assoc->name ) TO association_field_names. + IF NOT assoc->content( )->get_to_parent_indicator( ). + APPEND assoc->content( )->get_target( ) TO association_targets. + ENDIF. + ENDLOOP. + LOOP AT lo_composition INTO DATA(composition_field). + APPEND to_upper( composition_field->content( )->get( )-alias ) TO composition_field_names. + APPEND composition_field->content( )->composition->target TO composition_targets. + ENDLOOP. + + + + + DATA is_association TYPE abap_bool. + DATA is_composition TYPE abap_bool. + + LOOP AT lo_fields INTO lo_field. + + CLEAR ls_fields. + CLEAR is_association. + CLEAR is_composition. + + IF line_exists( association_field_names[ field_name = lo_field->name ] ). + is_association = abap_true. + ENDIF. + + IF line_exists( composition_field_names[ field_name = lo_field->name ] ). + is_composition = abap_true. + ENDIF. + + "only add "real" fields to the field list + + IF is_association = abap_false AND is_composition = abap_false. + + + " DATA(underscore) = substring( val = lo_field->name len = 1 ). + + "skip associations that are added as field names as well + " IF underscore <> '_'. + + ls_fields-name = lo_field->name. + DATA(field_content) = lo_field->content( )->get( ). +* IF field_content-alias IS INITIAL. +* ls_fields-cds_view_field = ls_fields-name. +* ELSE. +* ls_fields-cds_view_field = field_content-alias. +* ENDIF. + + "This would retrieve field names such as _ageny.name when + "defined as _agency.name = AgencyName + +* ls_fields-name = field_content-expression->if_xco_text~get_lines( )->join( )->value. + + ls_fields-name = field_content-original_name. + ls_fields-cds_view_field = field_content-original_name. + + ls_fields-key_indicator = field_content-key_indicator. + + DATA(aggregated_annotations) = xco_lib->get_aggregated_annotations( lo_field ). + + IF aggregated_annotations->contain( 'SEMANTICS.AMOUNT' ). + TRY. + DATA(semantics_amount_annotation) = aggregated_annotations->pick( 'SEMANTICS.AMOUNT' )->get_value( ). + semantics_amount_annotation->write_to( REF #( semantic_amount ) ). + IF semantic_amount IS NOT INITIAL. + ls_fields-currencycode = to_upper( semantic_amount-currencycode ) . + ENDIF. + CATCH cx_root INTO DATA(exception). + ENDTRY. + ENDIF. + + "for example @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + IF aggregated_annotations->contain( 'SEMANTICS.QUANTITY' ). + TRY. + DATA(semantics_quantity_annotation) = aggregated_annotations->pick( 'SEMANTICS.QUANTITY' )->get_value( ). + semantics_quantity_annotation->write_to( REF #( semantic_quantity ) ). + IF semantic_quantity IS NOT INITIAL. + ls_fields-unitofmeasure = to_upper( semantic_quantity-unitofmeasure ). + ENDIF. + CATCH cx_root INTO exception. + ENDTRY. + ENDIF. + + "retrieve data elements or built in types + + DATA(field_type) = lo_field->content( )->get_type( ). + + "For views (CDS views with a SQL view) and entity views "field_type" turned out to be initial. + "For abstract entities it works + "To work around this blocker and to enable the use case of generating services + "based on Service Consumption Models (which are generating abstract entities) + "we skip filling the information of data elements and built in types for + "views and view entities for now + + "now we use RTTI to get the required information + "information is needed to determine administrative fields such as etags when + "data source is an entity or a view entity + + IF field_type IS NOT INITIAL. + + IF field_type->is_data_element( ). + + ls_fields-is_data_element = abap_true. + + DATA(lo_data_element) = field_type->get_data_element( ). + +* IF lo_data_element->exists( ) = abap_true. + ls_fields-data_element = lo_data_element->name. +* read_data_element( +* EXPORTING +* io_data_element = lo_data_element +* is_fields = ls_fields +* IMPORTING +* es_fields = ls_fields +* ). + + ELSEIF field_type->is_built_in_type( ). + + ls_fields-is_built_in_type = abap_true. + + ls_fields-built_in_type = field_type->get_built_in_type( )->type. + ls_fields-built_in_type_length = field_type->get_built_in_type( )->length. + ls_fields-built_in_type_decimals = field_type->get_built_in_type( )->decimals. + + + + + ENDIF. + + ELSE. + + CASE view_type . + WHEN xco_cp_data_definition=>type->view_entity OR + xco_cp_data_definition=>type->view. + + "components_view will be initial if the RTTI call above fails. + + DATA(ls_fields_name_to_upper) = to_upper( ls_fields-name ). + + IF line_exists( components_view[ name = ls_fields_name_to_upper ] ). + DATA(data_element_via_rtti) = components_view[ name = ls_fields_name_to_upper ]-type->get_relative_name( ). + IF data_element_via_rtti IS NOT INITIAL. + ls_fields-is_data_element = abap_true. + ls_fields-data_element = data_element_via_rtti. + ELSE. + ls_fields-is_built_in_type = abap_true. + ENDIF. + + + + "map type_kind 'C' to 'CHAR' + + "rv_internal_abap_type is of type char4 + + get_abap_ddic_from_int_type( + EXPORTING + iv_abap_ddic_type = components_view[ name = ls_fields_name_to_upper ]-type->type_kind + iv_length = components_view[ name = ls_fields_name_to_upper ]-type->length + iv_decimals = components_view[ name = ls_fields_name_to_upper ]-type->decimals + IMPORTING + rv_internal_abap_type = DATA(built_in_type) "ls_fields-built_in_type + rv_length = ls_fields-built_in_type_length + rv_decimals = ls_fields-built_in_type_decimals + ). + + ls_fields-built_in_type = built_in_type. + +* ls_fields-built_in_type = data_type_in_ABAP_Dictionary. +* ls_fields-built_in_type_length = components_view[ name = ls_fields-name ]-type->length. +* ls_fields-built_in_type_decimals = components_view[ name = ls_fields-name ]-type->decimals. + + ENDIF. + ENDCASE. + + ENDIF. + "abstract entities created from service consumption models + "contain an additional field for each field that contains + "a value control information + + IF ls_fields-data_element NE 'RAP_CP_ODATA_VALUE_CONTROL'. + APPEND ls_fields TO et_fields. + ENDIF. + + ENDIF. + + ENDLOOP. + + DATA a TYPE i. + a = 2. + + ENDMETHOD. + + + METHOD get_fields_persistent_table. + + DATA lt_components TYPE cl_abap_structdescr=>component_table . + DATA ls_fields TYPE ts_field. + DATA(lo_database_table) = xco_lib->get_database_table( CONV sxco_dbt_object_name( persistent_table_name ) ). + DATA(lt_fields_from_xco) = lo_database_table->fields->all->get( ). + LOOP AT lt_fields_from_xco INTO DATA(ls_fields_from_xco). + ls_fields-name = ls_fields_from_xco->name. + APPEND ls_fields TO lt_fields_persistent_table. + ENDLOOP. + + ENDMETHOD. + + + METHOD get_implementation_type. + rv_implementation_type = implementationtype. + ENDMETHOD. + + + METHOD get_root_cause_textid. + "error and success messages + TYPES: BEGIN OF ty_exception_text, + msgv1(50), + msgv2(50), + msgv3(50), + msgv4(50), + END OF ty_exception_text. + + DATA : lx_root_cause TYPE REF TO cx_root, + ls_exception_text TYPE ty_exception_text. + + "the caller of this method should retrieve the error message of the root cause + "that has been originally raised by the config facade + + lx_root_cause = ix_previous. + + WHILE lx_root_cause->previous IS BOUND. + lx_root_cause = lx_root_cause->previous. " Get the exception that caused this exception + ENDWHILE. + + "move the (long) text to a structure with 4 fields of length 50 characters each + "error messages longer than 200 characters are truncated. + "no exception is thrown opposed to using substring + ls_exception_text = lx_root_cause->get_longtext( ). + + IF ls_exception_text IS INITIAL. + ls_exception_text = lx_root_cause->get_text( ). + ENDIF. + + rs_root_cause_textid-attr1 = CONV #( ls_exception_text-msgv1 ). + rs_root_cause_textid-attr2 = CONV #( ls_exception_text-msgv2 ). + rs_root_cause_textid-attr3 = CONV #( ls_exception_text-msgv3 ). + rs_root_cause_textid-attr4 = CONV #( ls_exception_text-msgv4 ). + rs_root_cause_textid-msgid = 'ZDMO_CM_RAP_GEN_MSG'. + rs_root_cause_textid-msgno = 016. + + ENDMETHOD. + + + METHOD get_root_exception. + rx_root = ix_exception. + WHILE rx_root->previous IS BOUND. + rx_root ?= rx_root->previous. + ENDWHILE. + ENDMETHOD. + + + METHOD get_structure_components. + + DATA table_fields TYPE ts_field . + + LOOP AT io_components->components->all->get( ) INTO DATA(lo_field). + CLEAR table_fields. + DATA(lo_field_content) = lo_field->content( ). + DATA(lo_field_content_type) = lo_field_content->get_type( ). + DATA(ls_field) = lo_field_content->get( ). + + table_fields-name = lo_field->name. + IF useuppercamelcase = abap_true. + "table_fields-cds_view_field = to_mixed( table_fields-name ). + table_fields-cds_view_field = xco_cp=>string( table_fields-name )->split( '_' )->compose( xco_cp_string=>composition->pascal_case )->value. + ELSE. + table_fields-cds_view_field = table_fields-name. + ENDIF. + + "add hardcoded mappings + CASE table_fields-name. + WHEN 'SPRAS'. + IF useuppercamelcase = abap_true. + table_fields-cds_view_field = 'Language'. + ENDIF. + ENDCASE. + + table_fields-is_data_element = lo_field_content_type->is_data_element( ). + table_fields-is_built_in_type = lo_field_content_type->is_built_in_type( ). + IF table_fields-is_built_in_type = abap_true. + table_fields-built_in_type = lo_field_content_type->get_built_in_type( )->type. + table_fields-built_in_type_length = lo_field_content_type->get_built_in_type( )->length. + table_fields-built_in_type_decimals = lo_field_content_type->get_built_in_type( )->decimals. + ENDIF. + IF table_fields-name = 'QUANTITY'. + DATA(a) = 1. + ENDIF. + IF ls_field-type->is_data_element( ) EQ abap_true. + DATA(lo_data_element) = ls_field-type->get_data_element( ). + + read_data_element( + EXPORTING + io_data_element = lo_data_element + is_fields = table_fields + IMPORTING + es_fields = table_fields + ). + + ELSE. + IF ls_field-type->is_built_in_type( ) = abap_true. + table_fields-built_in_type = ls_field-type->get_built_in_type( )->type. + table_fields-built_in_type_length = ls_field-type->get_built_in_type( )->length. + table_fields-built_in_type_decimals = ls_field-type->get_built_in_type( )->decimals. + ENDIF. + ENDIF. + + DATA(currency_quantity) = ls_field-currency_quantity. + + IF currency_quantity IS NOT INITIAL. + CASE table_fields-built_in_type. + WHEN 'CURR'. + table_fields-currencycode = ls_field-currency_quantity-reference_field. + WHEN 'QUAN'. + table_fields-unitofmeasure = ls_field-currency_quantity-reference_field. + ENDCASE. + ENDIF. + + IF to_upper( right_string( iv_length = 2 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'ID'. + table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 2 ) && 'ID' . + ENDIF. + + IF to_upper( right_string( iv_length = 4 iv_string = CONV #( table_fields-cds_view_field ) ) ) = 'UUID'. + table_fields-cds_view_field = substring( val = table_fields-cds_view_field len = strlen( table_fields-cds_view_field ) - 4 ) && 'UUID' . + ENDIF. + + APPEND table_fields TO et_fields. + + ENDLOOP. + + + ENDMETHOD. + + + METHOD get_unique_repository_obj_name. + + DATA(object_already_exists) = abap_false. + DATA max_length_repo_object_name TYPE i. + DATA(repository_object_type) = i_repository_object_type . + DATA(number_of_characters_namespace) = strlen( namespace ). + + " CL_CE_ - characters used in custom query implementation class + " UI__O4 - characters used in service binding + " S_X - characters used in control structure + " BP_I - characters used in behavior implementation class + " R_TP - characters used in basic restricted view (transactional processing) + " => Max Number is +6 + + "prepare for the support of read-only services. Add 'TP' to object names + +* IF transactional_behavior = abap_true. +* DATA(suffix_transctional_processing) = node_object_suffix-transactional_processing. +* ELSE. +* suffix_transctional_processing = ''. +* ENDIF. + + DATA(mandatory_obj_name_components) = to_upper( namespace ) && to_upper( prefix ) && to_upper( suffix ) && 'CL_CE_'. + DATA(length_mandatory_name_comp) = strlen( mandatory_obj_name_components ). + + DATA(repository_object_tadir_type) = 'R3TR'. + + + CASE repository_object_type. + + "root node repository objects + WHEN root_node_repository_objects-behavior_definition_r. + repository_object_tadir_type = 'BDEF'. + max_length_repo_object_name = max_length_object_type-bdef. + WHEN root_node_repository_objects-behavior_definition_p. + repository_object_tadir_type = 'BDEF'. + max_length_repo_object_name = max_length_object_type-bdef. + WHEN root_node_repository_objects-behavior_definition_i. + repository_object_tadir_type = 'BDEF'. + max_length_repo_object_name = max_length_object_type-bdef. + WHEN root_node_repository_objects-service_binding. + repository_object_tadir_type = 'SRVB'. + max_length_repo_object_name = max_length_object_type-srvb. + WHEN root_node_repository_objects-service_definition. + repository_object_tadir_type = 'SRVD' . + max_length_repo_object_name = max_length_object_type-srvd. + WHEN root_node_repository_objects-sap_object_type. + repository_object_tadir_type = 'RONT'. + max_length_repo_object_name = max_length_object_type-ront. + "node repository objects + WHEN node_repository_objects-cds_view_i. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-cds_view_i_basic. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-cds_view_r. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-cds_view_p. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-meta_data_extension. + repository_object_tadir_type = 'DDLX'. + max_length_repo_object_name = max_length_object_type-ddlx. + WHEN node_repository_objects-behavior_implementation. + repository_object_tadir_type = 'CLAS'. + max_length_repo_object_name = max_length_object_type-clas. + WHEN node_repository_objects-custom_entity. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-custom_query_impl_class. + repository_object_tadir_type = 'CLAS'. + max_length_repo_object_name = max_length_object_type-clas. + WHEN node_repository_objects-control_structure. + repository_object_tadir_type = 'STRU'. + max_length_repo_object_name = max_length_object_type-stru. + WHEN node_repository_objects-draft_table. + repository_object_tadir_type = 'TABL'. + max_length_repo_object_name = max_length_object_type-tabl. + + WHEN node_repository_objects-extension_include. + repository_object_tadir_type = 'STRU'. + max_length_repo_object_name = max_length_object_type-stru. + WHEN node_repository_objects-extension_include_view. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-draft_query_view. + repository_object_tadir_type = 'DDLS' . + max_length_repo_object_name = max_length_object_type-ddls. + WHEN node_repository_objects-sap_object_node_type. + repository_object_tadir_type = 'NONT'. + max_length_repo_object_name = max_length_object_type-nont. + ENDCASE. + + DATA(remaining_num_characters) = max_length_repo_object_name - length_mandatory_name_comp. + + IF strlen( entityname ) > remaining_num_characters - 3. + DATA(entityname_abbreviated) = substring( val = entityname len = remaining_num_characters - 3 ). + ELSE. + entityname_abbreviated = entityname. + ENDIF. + + + DATA protocol_version TYPE string. +* DATA binding TYPE string. +* +* CASE binding_type. +* WHEN binding_type_name-odata_v2_ui. +* protocol_version = protocol_version_suffix-odata_v2. +* binding = binding_type_prefix-ui . +* WHEN binding_type_name-odata_v4_ui. +* protocol_version = protocol_version_suffix-odata_v4. +* binding = binding_type_prefix-ui. +* WHEN binding_type_name-odata_v2_web_api. +* protocol_version = protocol_version_suffix-odata_v2. +* binding = binding_type_prefix-web_api. +* WHEN binding_type_name-odata_v4_web_api. +* protocol_version = protocol_version_suffix-odata_v4. +* binding = binding_type_prefix-web_api. +* ENDCASE. + +* DATA(prefix_wo_underscore) = prefix. +* REPLACE '_' IN prefix_wo_underscore WITH ''. + + DATA(is_valid_repo_object_name) = abap_false. + + DATA unique_number TYPE i. + + unique_number = 0. + DATA(unique_hex_number) = CONV xstring( unique_number ). + +* lv_name = |{ namespace }{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|. + + unique_repository_object_name = build_repository_object_name( + i_repository_object_type = repository_object_type + i_entityname_abbreviated = entityname_abbreviated + i_unique_hex_number = unique_hex_number + ). + +* CASE repository_object_type. +* +* "root node repository objects +* WHEN root_node_repository_objects-behavior_definition_r. "'BDEF'. +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-behavior_definition_r }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN root_node_repository_objects-behavior_definition_p. "'BDEF'. +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-behavior_definition_p }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN root_node_repository_objects-service_binding. "'SRVB'. +* unique_repository_object_name = |{ namespace }{ binding }{ prefix }{ entityname_abbreviated }{ protocol_version }{ suffix }|. +* WHEN root_node_repository_objects-service_definition. "'SRVD' . +* unique_repository_object_name = |{ namespace }{ prefix }{ entityname_abbreviated }{ suffix }|. +* +* "node repository objects +* WHEN node_repository_objects-cds_view_i. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-cds_view_i }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN node_repository_objects-cds_view_r. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-cds_view_r }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN node_repository_objects-cds_view_p. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-cds_view_p }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN node_repository_objects-meta_data_extension. "'DDLX'. +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-meta_data_extension }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN node_repository_objects-behavior_implementation. "'CLAS'. +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-behavior_implementation }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN node_repository_objects-custom_entity. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-custom_entity }{ entityname_abbreviated }{ suffix_transctional_processing }{ suffix }|. +* WHEN node_repository_objects-custom_query_impl_class. "'CLAS'. +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-custom_query_impl_class }{ entityname_abbreviated }{ suffix }|. +* WHEN node_repository_objects-control_structure. "'STRU'. +* unique_repository_object_name = |{ namespace }{ prefix }{ node_object_prefix-control_structure }{ entityname_abbreviated }{ node_object_suffix-control_structure }{ suffix }|. +* WHEN node_repository_objects-draft_table. "'TABL'. +* unique_repository_object_name = |{ namespace }{ prefix_wo_underscore }{ entityname_abbreviated }{ node_object_suffix-draft_table }{ suffix }|. +* +* ENDCASE. + +* lv_name = to_upper( lv_name ). + + WHILE is_valid_repo_object_name = abap_false AND unique_number < 255 . + + + + "check if a repository object name with the same name exists elsewhere in the BO + + IF repo_object_name_is_used_in_bo( + iv_type = CONV string( repository_object_tadir_type ) + iv_name = unique_repository_object_name + ). + + is_valid_repo_object_name = abap_false. + + ELSE. + + "check if a repository object with this name already exists. + + IF check_repository_object_exists( + EXPORTING + iv_type = CONV string( repository_object_tadir_type ) + iv_name = unique_repository_object_name + ). + + is_valid_repo_object_name = abap_false. + + ELSE. + + "check if the repository object name is already used in another RAP Generator BO project + + IF repo_obj_name_used_in_rap_gen( + EXPORTING + iv_type = CONV string( repository_object_tadir_type ) + iv_name = unique_repository_object_name + ). + + is_valid_repo_object_name = abap_false. + + ELSE. + + "only when the object name is not used in the bo and + "if it does not exist as repository object we can create a new object + + is_valid_repo_object_name = abap_true. + + ENDIF. + + ENDIF. + + ENDIF. + + IF is_valid_repo_object_name = abap_false. + unique_number += 1 . + unique_hex_number = CONV xstring( unique_number ). + "lv_name = to_upper( namespace ) && to_upper( prefix ) && to_upper( lv_entityname ) && unique_hex_number && 'D' && to_upper( suffix ). +* lv_name = |{ namespace }{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|. + + unique_repository_object_name = build_repository_object_name( + i_repository_object_type = repository_object_type + i_entityname_abbreviated = entityname_abbreviated + i_unique_hex_number = unique_hex_number + ). + +* CASE repository_object_type. +* +* "root node repository objects +* WHEN root_node_repository_objects-behavior_definition_r. "'BDEF'. +* unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_definition_r }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN root_node_repository_objects-behavior_definition_p. "'BDEF'. +* unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_definition_p }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN root_node_repository_objects-service_binding. "'SRVB'. +* unique_repository_object_name = |{ namespace }{ binding }{ prefix }{ entityname_abbreviated }{ protocol_version }{ unique_hex_number }{ suffix }|. +* WHEN root_node_repository_objects-service_definition. "'SRVD' . +* unique_repository_object_name = |{ namespace }{ prefix }{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. +* +* "node repository objects +* WHEN node_repository_objects-cds_view_i. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ node_object_prefix-cds_view_i }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-cds_view_r. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ node_object_prefix-cds_view_r }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-cds_view_p. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ node_object_prefix-cds_view_p }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-meta_data_extension. "'DDLX'. +* unique_repository_object_name = |{ namespace }{ node_object_prefix-meta_data_extension }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-behavior_implementation. "'CLAS'. +* unique_repository_object_name = |{ namespace }{ node_object_prefix-behavior_implementation }{ prefix }{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-custom_entity. "'DDLS' . +* unique_repository_object_name = |{ namespace }{ node_object_prefix-custom_entity }{ prefix }{ entityname_abbreviated }{ suffix_transctional_processing }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-custom_query_impl_class. "'CLAS'. +* unique_repository_object_name = |{ namespace }{ node_object_prefix-custom_query_impl_class }{ prefix }{ entityname_abbreviated }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-control_structure. "'STRU'. +* unique_repository_object_name = |{ namespace }{ node_object_prefix-control_structure }{ prefix }{ entityname_abbreviated }{ node_object_suffix-control_structure }{ unique_hex_number }{ suffix }|. +* WHEN node_repository_objects-draft_table. "'TABL'. +* unique_repository_object_name = |{ namespace }{ prefix_wo_underscore }{ entityname_abbreviated }{ node_object_suffix-draft_table }{ unique_hex_number }{ suffix }|. +* +* ENDCASE. + + ENDIF. + ENDWHILE. + + ENDMETHOD. + + + METHOD get_valid_draft_table_name. + + rv_ddic_i_view_name = get_valid_table_name( + iv_name = iv_name + draft_table_suffix = node_object_suffix-draft_table + ). + + ENDMETHOD. + + + METHOD get_valid_mbc_identifier. + + "lv_name will be shortened to 16 characters + DATA lv_name TYPE string. + DATA lv_entityname TYPE sxco_ddef_alias_name. + DATA is_valid_mbc_identifier TYPE abap_bool. + DATA li_counter TYPE i. + + IF iv_name IS INITIAL. + " DATA(lv_name) = ||. + + + DATA(lv_mandatory_name_components) = to_upper( prefix ) && to_upper( suffix ). + DATA(max_length_mandatory_name_comp) = 10. + DATA(length_mandatory_name_comp) = strlen( lv_mandatory_name_components ). + DATA(remaining_num_characters) = 20 - length_mandatory_name_comp. + + IF length_mandatory_name_comp > max_length_mandatory_name_comp. + APPEND |{ lv_mandatory_name_components } mandatory components are too long more than { max_length_mandatory_name_comp } characters| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_too_long + mv_value = |{ lv_mandatory_name_components } mandatory components for MBC identifier | + mv_max_length = max_length_mandatory_name_comp. + ENDIF. + + IF strlen( entityname ) > remaining_num_characters - 3. + lv_entityname = substring( val = entityname len = remaining_num_characters - 3 ). + ELSE. + lv_entityname = entityname. + ENDIF. + + is_valid_mbc_identifier = abap_false. + + li_counter = 0. + DATA(unique_hex_number) = CONV xstring( li_counter ). + + lv_name = |{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|. + lv_name = to_upper( lv_name ). + + WHILE is_valid_mbc_identifier = abap_false AND li_counter < 255 . + "check if a table with this name alreardy exists. + + DATA(first_letter_mbc_namespace) = substring( val = me->namespace len = 1 ). + + "The MBC registration API uses a namespace only if it is a "real" namespace. + "If a customer namespace 'Y' or 'Z' is used or if + "SAP objects are created such as I_Test that also do not have a namespace + "then the MBC namespace must be initial. + + CASE first_letter_mbc_namespace. + WHEN '/' . + DATA(abap_object_mbc_name) = namespace && lv_name. + WHEN 'Y' OR 'Z'. + abap_object_mbc_name = namespace && lv_name. + WHEN OTHERS. + abap_object_mbc_name = lv_name. + ENDCASE. + + SELECT * FROM i_custabapobjdirectoryentry WHERE + abapobject = @abap_object_mbc_name AND abapobjectcategory = 'R3TR' AND abapobjecttype = 'SMBC' INTO TABLE @DATA(lt_smbc). + + IF lines( lt_smbc ) = 0. + is_valid_mbc_identifier = abap_true. + ENDIF. + + + +* IF NOT xco_lib->get_database_table( CONV #( lv_name ) )->exists( ). +* is_valid_draft_table_name = abap_true. +* ENDIF. +* +* "check if a table with the same existis elsewhere in the BO +* IF root_node->draft_table_name = lv_name. +* is_valid_draft_table_name = abap_false. +* ELSE. +* "check if draft table name is used elsewhere in the BO +* LOOP AT me->root_node->all_childnodes INTO DATA(lo_bo_node). +* IF lo_bo_node->draft_table_name = lv_name. +* is_valid_draft_table_name = abap_false. +* ENDIF. +* ENDLOOP. +* ENDIF. + IF is_valid_mbc_identifier = abap_false. + li_counter = li_counter + 1. + unique_hex_number = CONV xstring( li_counter ). + lv_name = |{ prefix }{ lv_entityname }{ unique_hex_number }{ suffix }|. + lv_name = to_upper( lv_name ). + ENDIF. + ENDWHILE. + + ELSE. + lv_name = iv_name. + ENDIF. + + "check if name already exists within the BO + + + check_repository_object_name( + EXPORTING + iv_type = 'SMBC' + iv_name = lv_name + ). + + "rap_node_objects-ddic_view_i = lv_name. + rv_mbc_identifier = lv_name. + "rv_ = lv_name. + + ENDMETHOD. + + + METHOD get_valid_table_name. + + "lv_name will be shortened to 16 characters + DATA lv_name TYPE string. + DATA lv_entityname TYPE sxco_ddef_alias_name. + DATA is_valid_table_name TYPE abap_bool. + DATA li_counter TYPE i. + "DATA draft_suffix TYPE c LENGTH 1 VALUE 'D'. + + IF iv_name IS INITIAL. + " DATA(lv_name) = ||. + + DATA(prefix_wo_underscore) = prefix. + REPLACE '_' IN prefix_wo_underscore WITH ''. + + DATA(lv_mandatory_name_components) = to_upper( namespace ) && to_upper( prefix_wo_underscore ) && to_upper( suffix ). + DATA(max_length_mandatory_name_comp) = 11. + DATA(length_mandatory_name_comp) = strlen( lv_mandatory_name_components ). + DATA(remaining_num_characters) = 16 - length_mandatory_name_comp. + + IF length_mandatory_name_comp > max_length_mandatory_name_comp. + APPEND |{ lv_mandatory_name_components } mandatory components are too long more than { max_length_mandatory_name_comp } characters| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_too_long + mv_value = |{ lv_mandatory_name_components } mandatory components for draft table | + mv_max_length = max_length_mandatory_name_comp. + ENDIF. + + IF strlen( entityname ) > remaining_num_characters - 3. + lv_entityname = substring( val = entityname len = remaining_num_characters - 3 ). + ELSE. + lv_entityname = entityname. + ENDIF. + + + is_valid_table_name = abap_false. + + li_counter = 0. + DATA(unique_hex_number) = CONV xstring( li_counter ). + "lv_name = to_upper( namespace ) && to_upper( prefix ) && to_upper( lv_entityname ) && unique_hex_number && 'D' && to_upper( suffix ). + lv_name = |{ namespace }{ prefix_wo_underscore }{ lv_entityname }{ unique_hex_number }{ draft_table_suffix }{ suffix }|. + lv_name = to_upper( lv_name ). + + WHILE is_valid_table_name = abap_false AND li_counter < 255 . + "check if a table with this name alreardy exists. + + IF NOT xco_lib->get_database_table( CONV #( lv_name ) )->exists( ). + is_valid_table_name = abap_true. + ENDIF. + IF root_node IS NOT INITIAL. + "check if a table with the same existis elsewhere in the BO + IF root_node->draft_table_name = lv_name. + is_valid_table_name = abap_false. + ELSE. + "check if draft table name is used elsewhere in the BO + LOOP AT me->root_node->all_childnodes INTO DATA(lo_bo_node). + IF lo_bo_node->draft_table_name = lv_name. + is_valid_table_name = abap_false. + ENDIF. + ENDLOOP. + ENDIF. + ENDIF. + + IF is_valid_table_name = abap_false. + li_counter = li_counter + 1. + unique_hex_number = CONV xstring( li_counter ). + "lv_name = to_upper( namespace ) && to_upper( prefix ) && to_upper( lv_entityname ) && unique_hex_number && 'D' && to_upper( suffix ). + lv_name = |{ namespace }{ prefix_wo_underscore }{ lv_entityname }{ unique_hex_number }{ draft_table_suffix }{ suffix }|. + lv_name = to_upper( lv_name ). + ENDIF. + ENDWHILE. + + ELSE. + lv_name = iv_name. + ENDIF. + + "check if name already exists within the BO + TEST-SEAM is_not_a_root_node. + + END-TEST-SEAM. + + check_repository_object_name( + EXPORTING + iv_type = 'TABL' + iv_name = lv_name + ). + + "rap_node_objects-ddic_view_i = lv_name. + + rv_ddic_i_view_name = lv_name. + ENDMETHOD. + + + METHOD has_childs. + IF childnodes IS NOT INITIAL. + rv_has_childs = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD is_abstract_or_custom_entity. + rv_is_abstract_or_cust_entity = is_abstract_or_cust_entity. + ENDMETHOD. + + + METHOD is_alphabetical_character_only. + rv_is_alphabetical_char_only = abap_true. + FIND ALL OCCURRENCES OF REGEX '[^a-zA-Z]' IN iv_string RESULTS DATA(non_alphabetical_characters). + IF non_alphabetical_characters IS NOT INITIAL. + rv_is_alphabetical_char_only = abap_false. + ENDIF. + ENDMETHOD. + + + METHOD is_alpha_numeric. + rv_is_alpha_numeric = abap_true. + FIND ALL OCCURRENCES OF REGEX '[^[:word:]]' IN iv_string RESULTS DATA(non_alpha_numeric_characters). + IF non_alpha_numeric_characters IS NOT INITIAL. + rv_is_alpha_numeric = abap_false. + ENDIF. + ENDMETHOD. + + + METHOD is_child. + rv_is_child = abap_false. + IF me->root_node = me->parent_node AND + me->is_root( ) = abap_false. + rv_is_child = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD is_consistent. + rv_is_consistent = bo_node_is_consistent. + ENDMETHOD. + + + METHOD is_extensible. + rv_is_extensible = bo_is_extensible. + ENDMETHOD. + + + METHOD is_grand_child_or_deeper. + rv_is_grand_child = abap_false. + IF me->root_node <> me->parent_node. + rv_is_grand_child = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD is_root. + rv_is_root = is_root_node. + ENDMETHOD. + + + METHOD is_uuid_based. + + SELECT * FROM @lt_fields AS fields WHERE key_indicator = @abap_true INTO TABLE @DATA(result_uuid). + + DELETE result_uuid WHERE data_element = dataelement_name-client. + DELETE result_uuid WHERE built_in_type = builtintype_name-client. + + DATA(numberofrecords) = lines( result_uuid ). + "the underlying built in type must be of type RAW and length 16 + "@todo: the check for the data element can be removed once we can check for + "the built in type of a non released domain + + IF numberofrecords = 1 AND ( result_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR + result_uuid[ 1 ]-data_element = 'XSDUUID_RAW' + ). + r_is_uuid_based = abap_true. + ELSEIF numberofrecords = 1 AND result_uuid[ 1 ]-built_in_type = uuid_type AND + result_uuid[ 1 ]-built_in_type_length = uuid_length . + r_is_uuid_based = abap_true. + ELSE. + r_is_uuid_based = abap_false. + ENDIF. + ENDMETHOD. + + + METHOD is_virtual_root. + rv_is_virtual_root = is_virtual_root_node. + ENDMETHOD. + + + METHOD read_data_element. + + es_fields = is_fields. + es_fields-data_element = io_data_element->name. + + DATA(ls_data_element) = io_data_element->content( )->get( ). + + "The call of is_domain( ) fails if: + "a) a built in type such as CUKY is used + "b) if language version 5 is used and if the underlying domain is not c1-released. + " In this case the check for existence failed < 2102 since the domain was not visible for the XCO_CP libraries + " As of 2102 the following call shall be used + " xco_cp_abap_dictionary=>data_element( ‘…’ )->content( )->has/get_underlying_built_in_type( ) + + + IF ls_data_element-data_type->is_domain( ) EQ abap_true. + DATA(lo_domain) = ls_data_element-data_type->get_domain( ). + + DATA api_state TYPE REF TO cl_xco_ars_api_state . + lo_domain->get_api_state( RECEIVING ro_api_state = api_state ). +* IF api_state->get_release_state( )->value = 'RELEASED'. + + DATA(package1) = xco_lib->get_package( package ). + DATA(software_compontent) = package1->read( )-property-software_component. + DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package ). + +* CASE abap_language_version_number. +* WHEN zdmo_cl_rap_node=>package_abap_language_version-standard. +* +* WHEN zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. +* +* +* +* WHEN OTHERS. +* "abap language version of package is not supported +* ASSERT 1 = 2. +* ENDCASE. + + + IF lo_domain->exists( ) = abap_true AND + api_state->get_release_state( )->value = 'RELEASED' AND + abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. + + read_domain( + EXPORTING + io_domain = lo_domain + is_fields = es_fields + IMPORTING + es_fields = es_fields + ). + + ELSEIF lo_domain->exists( ) = abap_true AND + abap_language_version_number = zdmo_cl_rap_node=>package_abap_language_version-standard. + + read_domain( + EXPORTING + io_domain = lo_domain + is_fields = es_fields + IMPORTING + es_fields = es_fields + ). + + ELSE. +* +* es_fields-built_in_type = ls_data_element-data_type->get_built_in_type( )->type. +* es_fields-built_in_type_length = ls_data_element-data_type->get_built_in_type( )->length. +* es_fields-built_in_type_decimals = ls_data_element-data_type->get_built_in_type( )->decimals. + "@todo: + "add code to call the methods + "if_xco_dtel_data_type~GET_UNDERLYING_BUILT_IN_TYPE + "if_xco_dtel_data_type~HAS_UNDERLYING_BUILT_IN_TYPE + + + IF xco_cp_abap_dictionary=>data_element( es_fields-data_element )->content( )->has_underlying_built_in_type( ). + DATA(underlying_built_in_type) = xco_cp_abap_dictionary=>data_element( es_fields-data_element )->content( )->get_underlying_built_in_type( ). + + es_fields-built_in_type = underlying_built_in_type->type. + es_fields-built_in_type_length = underlying_built_in_type->length. + es_fields-built_in_type_decimals = underlying_built_in_type->decimals. + + ENDIF. + + ENDIF. + ELSE. + IF ls_data_element-data_type->is_built_in_type( ) = abap_true. + es_fields-built_in_type = ls_data_element-data_type->get_built_in_type( )->type. + es_fields-built_in_type_length = ls_data_element-data_type->get_built_in_type( )->length. + es_fields-built_in_type_decimals = ls_data_element-data_type->get_built_in_type( )->decimals. + ENDIF. + ENDIF. + ENDMETHOD. + + + METHOD read_domain. + + es_fields = is_fields. + es_fields-doma = io_domain->name. + + DATA(lo_read_state) = xco_cp_abap_dictionary=>object_read_state->active_version. + + DATA(ls_domain) = io_domain->content( lo_read_state )->get( ). + + DATA(domain_built_in_type) = ls_domain-format->get_built_in_type( ). + IF domain_built_in_type IS NOT INITIAL. + es_fields-built_in_type = domain_built_in_type->type. + es_fields-built_in_type_length = domain_built_in_type->length. + es_fields-built_in_type_decimals = domain_built_in_type->decimals. + ENDIF. + + DATA(domain_fixed_values) = io_domain->fixed_values->all->get( lo_read_state ). + + IF domain_fixed_values IS NOT INITIAL. + es_fields-domain_fixed_value = abap_true. + ENDIF. + + ENDMETHOD. + + + METHOD repo_object_name_is_used_in_bo. + + rv_repo_obj_name_is_used_in_bo = abap_false. + + IF root_node IS INITIAL. + RETURN. + ENDIF. + + "check root repo names + + CASE iv_type. + WHEN 'BDEF'. + IF Iv_name = root_node->rap_root_node_objects-behavior_definition_r OR + iv_name = root_node->rap_root_node_objects-behavior_definition_p. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'SRVD'. + IF Iv_name = root_node->rap_root_node_objects-service_definition. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'SRVB'. + IF Iv_name = root_node->rap_root_node_objects-service_binding. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'SMBC'. + IF Iv_name = root_node->manage_business_config_names-identifier. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + ENDCASE. + + CASE iv_type. + WHEN 'DDLS' . + IF Iv_name = root_node->rap_node_objects-cds_view_r OR + iv_name = root_node->rap_node_objects-cds_view_p OR + iv_name = root_node->rap_node_objects-cds_view_i OR + iv_name = root_node->rap_node_objects-cds_view_i_basic. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'DDLX'. + IF Iv_name = root_node->rap_node_objects-meta_data_extension. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'STRU'. + IF Iv_name = root_node->rap_node_objects-control_structure. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'CLAS'. + IF Iv_name = root_node->rap_node_objects-behavior_implementation. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'TABL'. + IF Iv_name = root_node->draft_table_name. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + ENDCASE. + + + "check if draft table name is used elsewhere in the BO + LOOP AT me->root_node->all_childnodes INTO DATA(lo_bo_node). + + CASE iv_type. + WHEN 'DDLS' . + IF Iv_name = lo_bo_node->rap_node_objects-cds_view_r OR + iv_name = lo_bo_node->rap_node_objects-cds_view_p OR + iv_name = root_node->rap_node_objects-cds_view_i OR + iv_name = root_node->rap_node_objects-cds_view_i_basic. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'DDLX'. + IF Iv_name = lo_bo_node->rap_node_objects-meta_data_extension. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'STRU'. + IF Iv_name = lo_bo_node->rap_node_objects-control_structure. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'CLAS'. + IF Iv_name = lo_bo_node->rap_node_objects-behavior_implementation. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + WHEN 'TABL'. + IF Iv_name = lo_bo_node->draft_table_name. + rv_repo_obj_name_is_used_in_bo = abap_true. + ENDIF. + ENDCASE. + + + ENDLOOP. + + + + + + + + ENDMETHOD. + + + METHOD repo_obj_name_used_in_rap_gen. + + rv_repo_obj_name_used_rap_gen = abap_false. + + "check repository object names used in other rap generator projects + + CASE iv_type. + WHEN 'BDEF'. + SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTP WHERE CdsRView = @iv_name INTO @DATA(bdef_name_is_used). + SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsRView = @iv_name INTO @DATA(bdef_name_is_used_in_draft). + IF bdef_name_is_used IS NOT INITIAL OR bdef_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'SRVD'. + SELECT SINGLE ServiceDefinition FROM ZDMO_R_RAPG_NodeTP WHERE ServiceDefinition = @iv_name INTO @DATA(srvd_name_is_used). + SELECT SINGLE ServiceDefinition FROM ZDMO_R_RAPG_NodeTPDraft WHERE Servicedefinition = @iv_name INTO @DATA(srvd_name_is_used_in_draft). + IF srvd_name_is_used IS NOT INITIAL OR srvd_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'SRVB'. + SELECT SINGLE ServiceBinding FROM ZDMO_R_RAPG_NodeTP WHERE ServiceBinding = @iv_name INTO @DATA(srvb_name_is_used). + SELECT SINGLE ServiceDefinition FROM ZDMO_R_RAPG_NodeTPDraft WHERE Servicedefinition = @iv_name INTO @DATA(srvb_name_is_used_in_draft). + IF srvb_name_is_used IS NOT INITIAL OR srvb_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'SMBC'. + SELECT SINGLE BusinessConfName FROM ZDMO_R_RAPG_ProjectTP WHERE BusinessConfName = @iv_name INTO @DATA(smbc_name_is_used). + SELECT SINGLE BusinessConfName FROM ZDMO_R_RAPG_ProjectTPDraft WHERE BusinessConfName = @iv_name INTO @DATA(smbc_name_is_used_in_draft). + IF smbc_name_is_used IS NOT INITIAL OR smbc_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + ENDCASE. + + CASE iv_type. + WHEN 'DDLS' . + SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTP WHERE CdsRView = @iv_name INTO @DATA(cdsr_name_is_used). + SELECT SINGLE CdsRView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsRView = @iv_name INTO @DATA(cdsr_name_is_used_in_draft). + SELECT SINGLE CdsPView FROM ZDMO_R_RAPG_NodeTP WHERE CdsPView = @iv_name INTO @DATA(cdsp_name_is_used). + SELECT SINGLE CdsPView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsPView = @iv_name INTO @DATA(cdsp_name_is_used_in_draft). + + SELECT SINGLE CdsiView FROM ZDMO_R_RAPG_NodeTP WHERE CdsiView = @iv_name INTO @DATA(cdsi_name_is_used). + SELECT SINGLE CdsiView FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsiView = @iv_name INTO @DATA(cdsi_name_is_used_in_draft). + +* @todo add check when RAP BO is changed + SELECT SINGLE CdsiViewBasic FROM ZDMO_R_RAPG_NodeTP WHERE CdsiViewbasic = @iv_name INTO @DATA(cdsi_name_basic_is_used). + SELECT SINGLE cdsiviewbasic FROM ZDMO_R_RAPG_NodeTPDraft WHERE CdsiViewbasic = @iv_name INTO @DATA(cdsi_name_bas_is_used_in_draft). + + IF cdsr_name_is_used IS NOT INITIAL OR cdsr_name_is_used_in_draft IS NOT INITIAL OR + cdsp_name_is_used IS NOT INITIAL OR cdsp_name_is_used_in_draft IS NOT INITIAL OR + cdsi_name_is_used IS NOT INITIAL OR cdsi_name_is_used_in_draft IS NOT INITIAL OR + cdsi_name_basic_is_used IS NOT INITIAL OR cdsi_name_bas_is_used_in_draft IS NOT INITIAL + . + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'DDLX'. + SELECT SINGLE MdeView FROM ZDMO_R_RAPG_NodeTP WHERE MdeView = @iv_name INTO @DATA(Mde_name_is_used). + SELECT SINGLE MdeView FROM ZDMO_R_RAPG_NodeTPDraft WHERE MdeView = @iv_name INTO @DATA(mde_name_is_used_in_draft). + IF Mde_name_is_used IS NOT INITIAL OR Mde_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'STRU'. + SELECT SINGLE ControlStructure FROM ZDMO_R_RAPG_NodeTP WHERE ControlStructure = @iv_name INTO @DATA(stru_name_is_used). + SELECT SINGLE ControlStructure FROM ZDMO_R_RAPG_NodeTPDraft WHERE ControlStructure = @iv_name INTO @DATA(stru_name_is_used_in_draft). + IF stru_name_is_used IS NOT INITIAL OR stru_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'CLAS'. + SELECT SINGLE BehaviorImplementationClass FROM ZDMO_R_RAPG_NodeTP WHERE BehaviorImplementationClass = @iv_name INTO @DATA(clas_name_is_used). + SELECT SINGLE BehaviorImplementationClass FROM ZDMO_R_RAPG_NodeTPDraft WHERE BehaviorImplementationClass = @iv_name INTO @DATA(clas_name_is_used_in_draft). + IF clas_name_is_used IS NOT INITIAL OR clas_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + WHEN 'TABL'. + SELECT SINGLE DraftTableName FROM ZDMO_R_RAPG_NodeTP WHERE DraftTableName = @iv_name INTO @DATA(tabl_name_is_used). + SELECT SINGLE DraftTableName FROM ZDMO_R_RAPG_NodeTPDraft WHERE DraftTableName = @iv_name INTO @DATA(tabl_name_is_used_in_draft). + IF tabl_name_is_used IS NOT INITIAL OR tabl_name_is_used_in_draft IS NOT INITIAL. + rv_repo_obj_name_used_rap_gen = abap_true. + ENDIF. + ENDCASE. + ENDMETHOD. + + + METHOD right_string. + DATA(length_of_string) = strlen( iv_string ). + IF length_of_string >= iv_length. + rv_string = substring( val = iv_string off = length_of_string - iv_length len = iv_length ). + ENDIF. + ENDMETHOD. + + + METHOD set_abap_type. + + abap_type_name = to_upper( iv_abap_type ) . + + split_and_check_abap_type_name( abap_type_name ). + +* DATA(typing_method) = abap_type->content( )->get_typing_method( ). +* DATA(typing_definition) = abap_type->content( )->get_typing_definition( ). +* +* IF typing_method->value = 1 AND typing_definition->has_value( ) = abap_true. +* DATA(structure) = xco_lib->get_structure( CONV #( typing_definition->get_value( ) ) ). +* ENDIF. + + + + get_fields( ). + + ENDMETHOD. + + + METHOD set_add_basic_i_views. + add_basic_i_views = iv_value. + ENDMETHOD. + + + METHOD set_add_meta_data_extensions. + add_meta_data_extensions = iv_value. + ENDMETHOD. + + + METHOD set_add_sap_object_type. + add_sap_object_type = iv_value. + ENDMETHOD. + + + METHOD set_binding_type. + IF iv_binding_type = binding_type_name-odata_v2_ui OR iv_binding_type = binding_type_name-odata_v4_ui + OR iv_binding_type = binding_type_name-odata_v2_web_api OR iv_binding_type = binding_type_name-odata_v4_web_api + OR iv_binding_type = '' . + binding_type = iv_binding_type. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_binding_type + mv_value = binding_type + mv_value_2 = supported_binding_types. + ENDIF. + ENDMETHOD. + + + METHOD set_cds_view. + + DATA(lv_cds_view) = to_upper( iv_cds_view ) . + + + SELECT * FROM i_apisforsapcloudplatform WHERE releasedobjecttype = 'CDS_STOB' AND releasedobjectname = @lv_cds_view INTO TABLE @DATA(lt_result).. + + "check if CDS view used as target exists + IF lt_result IS INITIAL . + IF xco_lib->get_data_definition( CONV #( lv_cds_view ) )->exists( ) = abap_false . + APPEND | CDS View { lv_cds_view } does not exist | TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>cds_view_does_not_exist + mv_value = CONV #( lv_cds_view ). + ENDIF. + ENDIF. + +* DATA(cds_view_state) = xco_lib->get_data_definition( CONV #( lv_cds_view ) )->get_state( xco_cp_abap_dictionary=>object_read_state->active_version ). +* +* "DATA(check_state_active) = xco_cp_abap_dictionary=>object_state->active. +* +* IF cds_view_state <> xco_cp_abap_dictionary=>object_state->active. +* APPEND | Table { lv_table } is not active | TO lt_messages. +* bo_node_is_consistent = abap_false. +* RAISE EXCEPTION TYPE ZDMO_CX_RAP_GENERATOR +* EXPORTING +* textid = ZDMO_CX_RAP_GENERATOR=>table_is_inactive +* mv_value = CONV #( lv_table ). +* ENDIF. + + + cds_view_name = lv_cds_view. + + + + get_fields( ). + + + + + + ENDMETHOD. + + + METHOD set_create_table. + create_table = iv_create_table. + ENDMETHOD. + + + METHOD set_data_source. + + CASE data_source_type. + WHEN data_source_types-table. + set_table( CONV sxco_ar_object_name( iv_data_source ) ). + WHEN data_source_types-cds_view OR data_source_types-abstract_entity. + set_cds_view( CONV sxco_cds_object_name( iv_data_source ) ). + WHEN data_source_types-structure. + set_structure( CONV sxco_ad_object_name( iv_data_source ) ) . + WHEN data_source_types-abap_type. + set_abap_type( iv_data_source ). + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_data_source_type. + ENDCASE. + data_source_name = iv_data_source . + + + ENDMETHOD. + + + METHOD set_data_source_type. + + CASE iv_data_source_type. + + WHEN ''. + "do nothing and return + WHEN 'table'. + data_source_type = data_source_types-table. + WHEN 'cds_view'. + data_source_type = data_source_types-cds_view. + WHEN 'abap_type'. + data_source_type = data_source_types-abap_type. + WHEN 'structure'. + data_source_type = data_source_types-structure. + WHEN 'abstract_entity' . + data_source_type = data_source_types-abstract_entity. + WHEN OTHERS. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_data_source_type + mv_value = iv_data_source_type. + + ENDCASE. + + ENDMETHOD. + + + METHOD set_draft_enabled. + draft_enabled = iv_value. + ENDMETHOD. + + + METHOD set_entity_name. + + DATA lt_all_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node . + + check_parameter( + EXPORTING + iv_parameter_name = 'Entity' ##NO_TEXT + iv_value = CONV #( iv_entity_name ) + ). + + IF me->root_node IS NOT INITIAL. + + lt_all_childnodes = me->root_node->all_childnodes. + + LOOP AT lt_all_childnodes INTO DATA(ls_childnode). + IF ls_childnode->entityname = iv_entity_name. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>entity_name_is_not_unique + mv_entity = ls_childnode->entityname. + ENDIF. + ENDLOOP. + + ENDIF. + + entityname = iv_entity_name . + rap_node_objects-alias = entityname. + + ENDMETHOD. + + + METHOD set_ext_element_suffix. + + DATA lt_all_childnodes TYPE STANDARD TABLE OF REF TO zdmo_cl_rap_node . + + IF iv_ext_element_suffix IS NOT INITIAL. + + IF strlen( iv_ext_element_suffix ) NE 3. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_ext_element_Suffix + mv_value = |{ iv_ext_element_suffix } |. + ENDIF. + + IF is_alphabetical_character_only( iv_ext_element_suffix ) = abap_false. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_ext_element_Suffix + mv_value = |{ iv_ext_element_suffix } |. + ENDIF. + + IF me->root_node IS NOT INITIAL. + + lt_all_childnodes = me->root_node->all_childnodes. + + IF me->root_node->extensibility_element_suffix = iv_ext_element_suffix. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>ext_elem_suffix_is_not_unique + mv_value = me->root_node->extensibility_element_Suffix + mv_entity = me->root_node->entityname. + ENDIF. + + LOOP AT lt_all_childnodes INTO DATA(ls_childnode). + IF ls_childnode->extensibility_element_Suffix = iv_ext_element_suffix. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>ext_elem_suffix_is_not_unique + mv_value = ls_childnode->extensibility_element_Suffix + mv_entity = ls_childnode->entityname. + ENDIF. + ENDLOOP. + + ENDIF. + + + extensibility_element_Suffix = iv_ext_element_suffix. + ELSE. + +* IF bo_is_extensible = abap_true. +* RAISE EXCEPTION TYPE ZDMO_cx_rap_generator +* EXPORTING +* textid = ZDMO_cx_rap_generator=>no_ext_element_suffix_set. + extensibility_element_Suffix = get_extensib_element_suffix( node_number ). + +* ENDIF. + + ENDIF. + + ENDMETHOD. + + + METHOD set_fields. + + DATA semantic_key_fields TYPE tt_semantic_key_fields . + lt_fields = it_fields. + todo( 'method set_fields. Add validation for lt_fields.' ). + + set_field_name_client( ). + set_field_name_language( ). + + set_mapping( ). + + CASE implementationtype . + WHEN implementation_type-managed_semantic OR + implementation_type-unmanaged_semantic. + + LOOP AT lt_fields INTO DATA(ls_fields) WHERE key_indicator = abap_true AND name <> field_name-client. + APPEND ls_fields-name TO semantic_key_fields. + ENDLOOP. + + WHEN implementation_type-managed_uuid. + + APPEND object_id TO semantic_key_fields. + + WHEN OTHERS. + + ASSERT 1 = 2. + + ENDCASE. + + set_semantic_key_fields( semantic_key_fields ). + + lt_fields_persistent_table = lt_fields. + + ENDMETHOD. + + + METHOD set_field_name_client. + DATA number_of_client_fields TYPE i VALUE 0. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-client' + iv_value = iv_string + ). + field_name-client = to_upper( iv_string ). + EXIT. + ELSE. + LOOP AT lt_fields INTO DATA(field) WHERE key_indicator = abap_true. + "key client : mandt; + "or + "key client : abap.clnt + IF ( field-is_data_element = abap_true AND field-data_element = dataelement_name-client ) OR + ( field-is_built_in_type = abap_true AND field-built_in_type = builtintype_name-client ). + field_name-client = to_upper( field-name ). + number_of_client_fields += 1. + ENDIF. + ENDLOOP. + ENDIF. + IF field_name-client IS INITIAL. + field_name-client = 'MANDT'. + ENDIF. + ENDMETHOD. + + + METHOD set_field_name_created_at. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-created_at' + iv_value = iv_string + ). + field_name-created_at = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-created_at INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-created_at ] ). + field_name-created_at = to_upper( result_fields[ data_element = dataelement_name-created_at ]-name ). + EXIT. + ENDIF. + + "finally check if field follows certain naming conventions and uses data elements used + "commonly to store timestamps + + LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'created' AND name CS 'at') + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-created_at = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + + ENDMETHOD. + + + METHOD set_field_name_created_by. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-created_by' + iv_value = iv_string + ). + field_name-created_by = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-created_by INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-created_by ] ). + field_name-created_by = to_upper( result_fields[ data_element = dataelement_name-created_by ]-name ). + ENDIF. + + ENDMETHOD. + + + METHOD set_field_name_etag_master. + + + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-etag_master' + iv_value = iv_string + ). + field_name-etag_master = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-local_instance_last_changed_at INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ] ). + field_name-etag_master = to_upper( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ]-name ). + EXIT. + ENDIF. + + + LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'local' AND name CS 'last' AND name CS 'changed') + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-etag_master = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + IF field_name-etag_master IS NOT INITIAL. + EXIT. + ENDIF. + + LOOP AT lt_fields INTO ls_field WHERE ( name CS 'changed') + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-etag_master = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + ENDMETHOD. + + + METHOD set_field_name_language. + DATA number_of_langu_fields TYPE i VALUE 0. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-language' + iv_value = iv_string + ). + field_name-language = to_upper( iv_string ). + EXIT. + ELSE. + LOOP AT lt_fields INTO DATA(field) WHERE key_indicator = abap_true. + "key langu : spras; + "or + "key langu : abap.lang; + IF ( field-is_data_element = abap_true AND field-data_element = dataelement_name-language ) OR + ( field-is_built_in_type = abap_true AND field-built_in_type = builtintype_name-language ). + field_name-language = to_upper( field-name ). + number_of_langu_fields += 1. + +* add_valuehelp( +* EXPORTING +* iv_alias = 'Language' +* iv_name = 'I_Language' +* iv_localelement = field-cds_view_field +* iv_element = 'Language' +* ). + + + ENDIF. + ENDLOOP. + ENDIF. + ENDMETHOD. + + + METHOD set_field_name_last_changed_at. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-last_changed_at' + iv_value = iv_string + ). + field_name-last_changed_at = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-last_changed_at INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-last_changed_at ] ). + field_name-last_changed_at = to_upper( result_fields[ data_element = dataelement_name-last_changed_at ]-name ). + ENDIF. + + ENDMETHOD. + + + METHOD set_field_name_last_changed_by. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-last_changed_by' + iv_value = iv_string + ). + field_name-last_changed_by = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-last_changed_by INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-last_changed_by ] ). + field_name-last_changed_by = to_upper( result_fields[ data_element = dataelement_name-last_changed_by ]-name ). + ENDIF. + ENDMETHOD. + + + METHOD set_field_name_loc_last_chg_at. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-local_last_changed_at' + iv_value = iv_string + ). + field_name-local_instance_last_changed_at = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-local_instance_last_changed_at INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ] ). + field_name-local_instance_last_changed_at = to_upper( result_fields[ data_element = dataelement_name-local_instance_last_changed_at ]-name ). + ENDIF. + + LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'local' AND name CS 'last' AND name CS 'changed') + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-local_instance_last_changed_at = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + IF field_name-local_instance_last_changed_at IS NOT INITIAL. + EXIT. + ENDIF. + + LOOP AT lt_fields INTO ls_field WHERE ( name CS 'changed') + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-local_instance_last_changed_at = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + + + + + + + + + + + ENDMETHOD. + + + METHOD set_field_name_loc_last_chg_by. + + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-local_last_changed_by' + iv_value = iv_string + ). + field_name-local_instance_last_changed_by = to_upper( iv_string ). + EXIT. + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE data_element = @dataelement_name-local_instance_last_changed_by INTO TABLE @DATA(result_fields). + + IF line_exists( result_fields[ data_element = dataelement_name-local_instance_last_changed_by ] ). + field_name-local_instance_last_changed_by = to_upper( result_fields[ data_element = dataelement_name-local_instance_last_changed_by ]-name ). + ENDIF. + + ENDMETHOD. + + + METHOD set_field_name_parent_uuid. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-parent_uuid' + iv_value = iv_string + ). + field_name-parent_uuid = to_upper( iv_string ). + EXIT. + ENDIF. + + IF implementationtype = implementation_type-managed_uuid. + + SELECT * FROM @lt_fields AS fields WHERE ( key_indicator = @abap_false AND + ( data_element = 'SYSUUID_X16' OR + data_element = 'XSDUUID_RAW' + OR + ( built_in_type = @uuid_type AND + built_in_type_length = @uuid_length ) + ) + + + + ) + INTO TABLE @DATA(result_uuid). + + DATA(numberofrecords) = lines( result_uuid ). + + "the underlying built in type must be of type RAW and length 16 + "@todo: the check for the data element can be removed once we can check for + "the built in type of a non released domain + + IF numberofrecords = 1. + " that's ok + field_name-parent_uuid = to_upper( result_uuid[ 1 ]-name ). + EXIT. + ENDIF. + + IF numberofrecords > 1. + LOOP AT result_uuid INTO DATA(ls_field) WHERE ( name CS 'parent' AND name CS 'uuid'). + field_name-parent_uuid = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + ENDIF. + + + ENDIF. + + + ENDMETHOD. + + + METHOD set_field_name_root_uuid. + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-root_uuid' + iv_value = iv_string + ). + field_name-root_uuid = to_upper( iv_string ). + EXIT. + ENDIF. + + IF implementationtype = implementation_type-managed_uuid. + + SELECT * FROM @lt_fields AS fields WHERE ( key_indicator = @abap_false AND + ( data_element = 'SYSUUID_X16' OR + data_element = 'XSDUUID_RAW' + OR + ( built_in_type = @uuid_type AND + built_in_type_length = @uuid_length ) + ) + ) + INTO TABLE @DATA(result_uuid). + + DATA(numberofrecords) = lines( result_uuid ). + + "the underlying built in type must be of type RAW and length 16 + "@todo: the check for the data element can be removed once we can check for + "the built in type of a non released domain + + IF numberofrecords < 2. + EXIT. + ENDIF. + +* field_name-root_uuid = to_upper( result_uuid[ 1 ]-name ). + + + LOOP AT result_uuid INTO DATA(ls_field) WHERE ( name CS 'root' AND name CS 'uuid'). + field_name-root_uuid = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + + ENDIF. + + + ENDMETHOD. + + + METHOD set_field_name_total_etag. + "if value is set externally, take this one + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-total_etag' + iv_value = iv_string + ). + field_name-total_etag = to_upper( iv_string ). + EXIT. + ENDIF. + + IF draft_enabled = abap_false. + EXIT. + ENDIF. + "if no value is provided check for a standard data element + IF line_exists( lt_fields[ data_element = dataelement_name-last_changed_at ] ). + field_name-total_etag = to_upper( lt_fields[ data_element = dataelement_name-last_changed_at ]-name ). + EXIT. + ENDIF. + + LOOP AT lt_fields INTO DATA(ls_field) WHERE ( name CS 'last' AND name CS 'changed') AND NOT ( name CS 'local' ) + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-total_etag = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + IF field_name-total_etag IS NOT INITIAL. + EXIT. + ENDIF. + + "finally check if field follows certain naming conventions and uses data elements used + "commonly to store timestamps + + LOOP AT lt_fields INTO ls_field WHERE ( name CS 'changed') + AND ( data_element = 'TZNTSTMPL' OR + data_element = 'TIMESTAMPL' OR + data_element = 'RAP_CP_ODATA_V2_EDM_DATETIME' ). + field_name-total_etag = to_upper( ls_field-name ) . + EXIT. + ENDLOOP. + + ENDMETHOD. + + + METHOD set_field_name_uuid. + + IF iv_string IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'field_name-uuid' + iv_value = iv_string + ). + field_name-uuid = to_upper( iv_string ). + EXIT. + ENDIF. + + IF implementationtype = implementation_type-managed_uuid. + + SELECT * FROM @lt_fields AS fields WHERE key_indicator = @abap_true AND name <> @field_name-client + INTO TABLE @DATA(result_uuid). + + DATA(numberofrecords) = lines( result_uuid ). + + "the underlying built in type must be of type RAW and length 16 + "@todo: the check for the data element can be removed once we can check for + "the built in type of a non released domain + + IF numberofrecords = 1 AND ( result_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR + result_uuid[ 1 ]-data_element = 'XSDUUID_RAW' ). + " that's ok + field_name-uuid = to_upper( result_uuid[ 1 ]-name ). + ELSEIF numberofrecords = 1 AND result_uuid[ 1 ]-built_in_type = uuid_type AND + result_uuid[ 1 ]-built_in_type_length = uuid_length . + field_name-uuid = to_upper( result_uuid[ 1 ]-name ). + ENDIF. + + ENDIF. + + ENDMETHOD. + + + METHOD set_generate_only_node_hierach. + generate_only_node_hierachy = iv_value. + ENDMETHOD. + + + METHOD set_has_transactional_behavior. + transactional_behavior = iv_value. + ENDMETHOD. + + + METHOD set_implementation_type. + + CASE iv_implementation_type. + + WHEN ''. + "do nothing + WHEN implementation_type-managed_uuid. + implementationtype = implementation_type-managed_uuid. + WHEN implementation_type-managed_semantic. + implementationtype = implementation_type-managed_semantic. + WHEN implementation_type-unmanaged_semantic. + implementationtype = implementation_type-unmanaged_semantic. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>implementation_type_not_valid + mv_value = iv_implementation_type. + ENDCASE. + + ENDMETHOD. + + + METHOD set_is_abstract_or_cust_entity. + is_abstract_or_cust_entity = iv_value. + ENDMETHOD. + + + METHOD set_is_customizing_table. + is_customizing_table = iv_value. + ENDMETHOD. + + + METHOD set_is_extensible. + bo_is_extensible = iv_value. + ENDMETHOD. + + + METHOD set_is_root_node. + is_root_node = io_is_root_node. + IF is_root_node = abap_true. + set_root( me ). + set_parent( me ). + ENDIF. + ENDMETHOD. + + + METHOD set_is_virtual_root_node. + + + is_virtual_root_node = abap_true. + set_is_root_node( ). + "CLEAR childnodes. + "CLEAR all_childnodes. + + "field_name-last_changed_at = |max ({ singleton_child_tab_name }.last_changed_at)| . + field_name-total_etag = |max ({ singleton_child_tab_name }.{ childnodes[ 1 ]->field_name-total_etag } )| . + lt_fields = VALUE #( +* ( +* name = 'CLIENT' +* cds_view_field = 'Client' +* key_indicator = 'X' +* is_data_element = 'X' +* data_element = 'MANDT' +* ) + ( + name = '1' + cds_view_field = singleton_field_name + key_indicator = 'X' + is_built_in_type = 'X' + built_in_type = 'INT1' + built_in_type_length = 3 + ) + + + ). + + + + "DATA semantic_key_fields TYPE tt_semantic_key . + semantic_key = VALUE #( ( name = '1' cds_view_field = singleton_field_name ) ). + object_id = '1'. + object_id_cds_field_name = singleton_field_name . + is_finalized = abap_true. + cds_view_name = 'I_Language'. + + + me->add_additional_fields( + VALUE #( + "localInstanceLastChangedAt is used the customizing table becomes a child entity + "of the virtual root node + ( + "name = field_name-last_changed_at + name = field_name-total_etag + cds_view_field = 'LastChangedAtMax' + data_element = 'TIMESTAMPL' + cds_interface_view = abap_true + cds_restricted_reuse_view = abap_true + cds_projection_view = abap_true + draft_table = abap_true + ) + "cast( '' as sxco_transport) as Request, + ( + name = |cast( '' as sxco_transport)| + cds_view_field = 'Request' + data_element = 'sxco_transport' + cds_interface_view = abap_true + cds_restricted_reuse_view = abap_true + cds_projection_view = abap_true + draft_table = abap_true + ) + "cast( 'X' as abap_boolean) as HideTransport, + ( + name = |cast( 'X' as abap_boolean)| + cds_view_field = 'HideTransport' + data_element = 'abap_boolean' + cds_interface_view = abap_true + cds_restricted_reuse_view = abap_true + cds_projection_view = abap_true + draft_table = abap_true + is_hidden = abap_true + ) + ) + ). + + "fill lt_all_fields only after lt_fields is finalized (e.g. is_hidden is added) + add_fields_to_all_fields( ). + add_additonal_to_all_fields( ). + + data_source_name = 'I_Language'. + " data_source_type = '' + "set_ddic_view_i_name( ). + "misuse the logic to create unique name for sql view for i view + DATA(draft_tab_name) = get_valid_draft_table_name( ). + set_name_draft_table( CONV #( draft_tab_name ) ). "ddic_view_i + set_name_cds_i_view( ). + set_name_cds_r_view( ). + set_name_cds_p_view( ). + set_name_mde( ). + set_name_behavior_impl( ). + set_name_behavior_def_r( ). + set_name_behavior_def_p( ). + set_name_service_definition( ). + set_name_service_binding( ). + IF manage_business_configuration = abap_true. + + IF manage_business_config_names-identifier IS INITIAL. + + DATA(valid_mbc_identifier) = get_valid_mbc_identifier( ). + + set_mbc_identifier( CONV #( valid_mbc_identifier ) ). + ENDIF. + + IF manage_business_config_names-name IS INITIAL. + set_mbc_name( CONV #( |{ root_node->rap_node_objects-alias }{ root_node->suffix } maintenance| ) ). + ENDIF. + + IF manage_business_config_names-description IS INITIAL. + set_mbc_description( CONV #( |identifier { manage_business_config_names-identifier }| ) ). + ENDIF. + + set_mbc_namespace( ). + + ENDIF. + + ENDMETHOD. + + + METHOD set_mapping. + "an automatic mapping can only be calculated if the data source is a table + CLEAR lt_mapping. + + IF data_source_type = data_source_types-table + OR data_source_type = data_source_types-structure + OR data_source_type = data_source_types-abap_type. + + + IF it_field_mappings IS NOT INITIAL. + + LOOP AT it_field_mappings INTO DATA(ls_field_mapping) WHERE dbtable_field <> field_name-client. + + "field_is_not_in_datasource + "field_is_not_in_cds_view + + IF field_name_exists_in_db_table( CONV #( ls_field_mapping-dbtable_field ) ) = abap_true. + ls_mapping-dbtable_field = to_upper( ls_field_mapping-dbtable_field ). + ls_mapping-cds_view_field = ls_field_mapping-cds_view_field . + + "if external mapping is used + " the name of the cds view field is being adapted to the field set by the external mapping + " the automatic calculated mapping is adapted as well + + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<field>) WHERE name = to_upper( ls_field_mapping-dbtable_field ). + <field>-cds_view_field = ls_field_mapping-cds_view_field. + ENDLOOP. + + INSERT ls_mapping INTO TABLE lt_mapping. + + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_is_not_in_datasource + mv_table_name = CONV #( table_name ) + mv_value = CONV #( ls_field_mapping-dbtable_field ). + ENDIF. + + ENDLOOP. + ENDIF. + + "add mapping for fields that have not been mapped externally + LOOP AT lt_fields INTO DATA(ls_fields). + + ls_mapping-dbtable_field = ls_fields-name . + ls_mapping-cds_view_field = ls_fields-cds_view_field . + + DATA(mapping_exists) = xsdbool( line_exists( lt_mapping[ dbtable_field = ls_fields-name ] ) ). + "boolc( line_exists( lt_fields[ name = lv_field_name_upper ] ) ). + + IF mapping_exists = abap_false AND ls_fields-name <> field_name-client. + INSERT ls_mapping INTO TABLE lt_mapping. + ENDIF. + ENDLOOP. + + + ELSEIF ( data_source_type = data_source_types-cds_view OR data_source_type = data_source_types-abstract_entity ) AND + it_field_mappings IS NOT INITIAL. "data source is a CDS view and mapping is defined + + LOOP AT it_field_mappings INTO ls_field_mapping. + + IF field_name_exists_in_db_table( CONV #( ls_field_mapping-dbtable_field ) ) = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_is_not_in_datasource + mv_table_name = CONV #( table_name ) + mv_value = CONV #( ls_field_mapping-dbtable_field ). + ENDIF. + + IF field_name_exists_in_cds_view( CONV #( ls_field_mapping-cds_view_field ) ) = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_is_not_in_cds_view + mv_entity = CONV #( entityname ) + mv_value = CONV #( ls_field_mapping-dbtable_field ). + ENDIF. + + ls_mapping-dbtable_field = ls_field_mapping-dbtable_field. + ls_mapping-cds_view_field = ls_field_mapping-cds_view_field . + IF ls_field_mapping-dbtable_field <> field_name-client. + INSERT ls_mapping INTO TABLE lt_mapping. + ENDIF. + ENDLOOP. + + ENDIF. + ENDMETHOD. + + + METHOD set_mbc_description. + " check_parameter( + " EXPORTING + " iv_parameter_name = 'manage_business_config_names-description' + " iv_value = CONV string( iv_value ) + " ). + manage_business_config_names-description = iv_value. + ENDMETHOD. + + + METHOD set_mbc_identifier. + check_repository_object_name( + EXPORTING + iv_type = 'SMBC' + iv_name = iv_value + ). + + DATA(first_letter_mbc_namespace) = substring( val = me->namespace len = 1 ). + + "The MBC registration API uses a namespace only if it is a "real" namespace. + "If a customer namespace 'Y' or 'Z' is used or if + "SAP objects are created such as I_Test that also do not have a namespace + "then the MBC namespace must be initial. + + CASE first_letter_mbc_namespace. + WHEN '/' . + " DATA(abap_object_mbc_name) = namespace && lv_name. + manage_business_config_names-identifier = iv_value. + WHEN 'Y' OR 'Z'. + "abap_object_mbc_name = namespace && lv_name. + manage_business_config_names-identifier = namespace && iv_value. + WHEN OTHERS. + "abap_object_mbc_name = lv_name. + manage_business_config_names-identifier = iv_value. + ENDCASE. + + + + + ENDMETHOD. + + + METHOD set_mbc_name. + " check_parameter( + " EXPORTING + " iv_parameter_name = 'manage_business_config_names-name' + " iv_value = iv_value + " ). + manage_business_config_names-name = iv_value. + ENDMETHOD. + + + METHOD set_mbc_namespace. + + DATA(first_letter_mbc_namespace) = substring( val = me->namespace len = 1 ). + + "The MBC registration API uses a namespace only if it is a "real" namespace. + "If a customer namespace 'Y' or 'Z' is used or if + "SAP objects are created such as I_Test that also do not have a namespace + "then the MBC namespace must be initial. + + CASE first_letter_mbc_namespace. + WHEN '/' . + manage_business_config_names-namespace = namespace. + WHEN 'Y' OR 'Z'. + manage_business_config_names-namespace = ''. + WHEN OTHERS. + manage_business_config_names-namespace = ''. + ENDCASE. + + ENDMETHOD. + + + METHOD set_mimic_adt_wizard. + mimic_adt_wizard = iv_value. + ENDMETHOD. + + + METHOD set_namespace. + + IF iv_namespace IS NOT INITIAL. + + DATA(number_of_characters) = strlen( iv_namespace ). + DATA(first_character) = substring( val = iv_namespace len = 1 ). + DATA(last_character) = substring( val = iv_namespace off = number_of_characters - 1 len = 1 ). + + IF to_upper( first_character ) = 'Z' OR + to_upper( first_character ) = 'Y'. + check_parameter( + EXPORTING + iv_parameter_name = 'Namespace' + iv_value = CONV #( iv_namespace ) + ). + + + ELSEIF first_character = '/' AND last_character = '/'. + + DATA(remaining_characters) = substring( val = iv_namespace off = 1 len = number_of_characters - 2 ). + + check_parameter( + EXPORTING + iv_parameter_name = 'Namespace without slashes' + iv_value = CONV #( remaining_characters ) + ). + + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_namespace + mv_value = |iv_namespace|. + ENDIF. + + namespace = iv_namespace. + + ELSEIF package IS NOT INITIAL. + + DATA(first_character_package) = substring( val = package off = 0 len = 1 ). + DATA(package_name_length) = strlen( package ). + + IF to_upper( first_character_package ) = '$'. " package = '$TMP'. + namespace = 'Z'. + EXIT. + ENDIF. + + FIND ALL OCCURRENCES OF '/' + IN package + IGNORING CASE " case insensitive + RESULTS DATA(result). " TYPE match_result_tab + + IF lines( result ) = 2. + CHECK result[ 1 ]-offset = 0. + namespace = substring( val = package len = result[ 2 ]-offset + 1 ). + EXIT. + ENDIF. + +* DATA(first_character_package) = substring( val = package off = 0 len = 1 ). +* DATA(package_name_length) = strlen( package ). + + IF to_upper( first_character_package ) = 'Y'. + namespace = 'Y'. + EXIT. + ENDIF. + + IF to_upper( first_character_package ) = 'Z'. + namespace = 'Z'. + EXIT. + ENDIF. + + IF package_name_length > strlen( 'TEST_' ). + IF substring( val = package len = strlen( 'TEST_' ) ) = 'TEST_' . + namespace = 'Z'. + EXIT. + ENDIF. + ENDIF. + + namespace = ''. + EXIT. + + ENDIF. + + ENDMETHOD. + + + METHOD set_name_behavior_def_i. + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-behavior_definition_i ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'BDEF' + iv_name = lv_name + ). + + + IF is_root( ). + rap_root_node_objects-behavior_definition_i = lv_name. + rv_behavior_dev_i_name = lv_name. + ELSEIF is_test_run = abap_true. + rap_root_node_objects-behavior_definition_i = lv_name. + rv_behavior_dev_i_name = lv_name. + ELSE. + APPEND | { me->entityname } is not a root node. BDEF for an interface view is only generated for the root node| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_not_a_root_node + mv_entity = me->entityname. + ENDIF. + + + ENDMETHOD. + + + METHOD set_name_behavior_def_p. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-behavior_definition_p ). + ELSE. + lv_name = iv_name. + ENDIF. + + + check_repository_object_name( + EXPORTING + iv_type = 'BDEF' + iv_name = lv_name + ). + + IF is_root( ). + rap_root_node_objects-behavior_definition_p = lv_name. + rv_behavior_dev_p_name = lv_name. + ELSEIF is_test_run = abap_true. + rap_root_node_objects-behavior_definition_p = lv_name. + rv_behavior_dev_p_name = lv_name. + ELSE. + APPEND | { me->entityname } is not a root node. BDEF for a projection view is only generated for the root node| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_not_a_root_node + mv_entity = me->entityname. + ENDIF. + + ENDMETHOD. + + + METHOD set_name_behavior_def_r. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-behavior_definition_r ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'BDEF' + iv_name = lv_name + ). + + + IF is_root( ). + rap_root_node_objects-behavior_definition_r = lv_name. + rv_behavior_dev_i_name = lv_name. + ELSEIF is_test_run = abap_true. + rap_root_node_objects-behavior_definition_r = lv_name. + rv_behavior_dev_i_name = lv_name. + ELSE. + APPEND | { me->entityname } is not a root node. BDEF for an interface view is only generated for the root node| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_not_a_root_node + mv_entity = me->entityname. + ENDIF. + + + + ENDMETHOD. + + + METHOD set_name_behavior_impl. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }BP_I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-behavior_implementation ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'CLAS' + iv_name = lv_name + ). + + rap_node_objects-behavior_implementation = lv_name. + rv_behavior_imp_name = lv_name. + + + ENDMETHOD. + + + METHOD set_name_cds_i_view. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_i ). +* CATCH zdmo_cx_rap_generator. + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-cds_view_i = lv_name. + + rv_cds_i_view_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_cds_i_view_basic. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_i_basic ). +* CATCH zdmo_cx_rap_generator. + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-cds_view_i_basic = lv_name. + + rv_cds_i_view_name_basic = lv_name. + + ENDMETHOD. + + + METHOD set_name_cds_p_view. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_p ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-cds_view_p = lv_name. + + rv_cds_p_view_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_cds_r_view. + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-cds_view_r ). +* CATCH zdmo_cx_rap_generator. + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-cds_view_r = lv_name. + + rv_cds_r_view_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_control_structure. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }S{ prefix }{ entityname }_X{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-control_structure ). + ELSE. + lv_name = iv_name. + ENDIF. + + "four letter acronym for structures is normally 'TABL' but this is also used for tables. + "unfortunately tables in DDIC only allow names of length 16 + "so using another abbreviation + + check_repository_object_name( + EXPORTING + iv_type = 'STRU' + iv_name = lv_name + ). + + rap_node_objects-control_structure = lv_name. + + rv_controle_structure_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_custom_entity. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-custom_entity ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-custom_entity = lv_name. + + rv_custom_entity_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_custom_query_impl. + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }CL_CE_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-custom_query_impl_class ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'CLAS' + iv_name = lv_name + ). + + rap_node_objects-custom_query_impl_class = lv_name. + rv_custom_query_impl_class = lv_name. + ENDMETHOD. + + + METHOD set_name_draft_query_view. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-draft_query_view ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-draft_query_view = lv_name. + + rv_draft_query_view_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_draft_table. + + IF iv_draft_table IS INITIAL. + draft_table_name = get_valid_draft_table_name( ). + ELSE. + + DATA(lv_table) = to_upper( iv_draft_table ) . + + check_repository_object_name( + EXPORTING + iv_type = 'TABL' + iv_name = lv_table + ). + + draft_table_name = lv_table . + + ENDIF. + + ENDMETHOD. + + + METHOD set_name_extension_include. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }_S_EXT{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-extension_include ). + + ELSE. + lv_name = iv_name. + ENDIF. + + "four letter acronym for structures is normally 'TABL' but this is also used for tables. + "unfortunately tables in DDIC only allow names of length 16 + "so using another abbreviation + + check_repository_object_name( + EXPORTING + iv_type = 'STRU' + iv_name = lv_name + ). + + rap_node_objects-extension_include = lv_name. + + rv_extension_include_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_extension_incl_view. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-extension_include_view ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLS' + iv_name = lv_name + ). + + rap_node_objects-extension_include_view = lv_name. + + rv_extension_include_view_name = lv_name. + + + ENDMETHOD. + + + METHOD set_name_mde. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }C_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-meta_data_extension ). + ELSE. + lv_name = iv_name. + ENDIF. + + + IF lv_name IS INITIAL. + APPEND | Projection view name is still initial | TO lt_messages. + bo_node_is_consistent = abap_false. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'DDLX' + iv_name = lv_name + ). + + rap_node_objects-meta_data_extension = lv_name. + + rv_mde_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_sap_node_object_type. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = node_repository_objects-sap_object_node_type ). +* CATCH zdmo_cx_rap_generator. + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'NONT' + iv_name = lv_name + ). + + rap_node_objects-sap_object_node_type = lv_name. + + rv_sap_object_node_type_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_sap_object_type. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }I_{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-sap_object_type ). +* CATCH zdmo_cx_rap_generator. + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'RONT' + iv_name = lv_name + ). + + rap_root_node_objects-sap_object_type = lv_name. + + rv_sap_object_type_name = lv_name. + + ENDMETHOD. + + + METHOD set_name_service_binding. + + " From SAP Online Help + " Use the prefix + " UI_ if the service is exposed as a UI service. + " API_ if the service is exposed as Web API. + " Use the suffix + " _O2 if the service is bound to OData protocol version 2. + " _O4 if the service is bound to OData protocol version 4. + " Example: ZDMO_UI_TRAVEL_U_O2 + + DATA protocol_version TYPE string. + DATA binding TYPE string. + + CASE binding_type. + WHEN binding_type_name-odata_v2_ui. + protocol_version = protocol_version_suffix-odata_v2. + binding = binding_type_prefix-ui . + WHEN binding_type_name-odata_v4_ui. + protocol_version = protocol_version_suffix-odata_v4. + binding = binding_type_prefix-ui. + WHEN binding_type_name-odata_v2_web_api. + protocol_version = protocol_version_suffix-odata_v2. + binding = binding_type_prefix-web_api. + WHEN binding_type_name-odata_v4_web_api. + protocol_version = protocol_version_suffix-odata_v4. + binding = binding_type_prefix-web_api. + ENDCASE. + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }{ binding }{ prefix }{ entityname }{ suffix }{ protocol_version }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-service_binding ). + ELSE. + lv_name = iv_name. + ENDIF. + + IF rap_root_node_objects-service_definition IS INITIAL. + APPEND | service binding name is still initial | TO lt_messages. + bo_node_is_consistent = abap_false. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'SRVB' + iv_name = lv_name + ). + + + IF is_root( ). + rap_root_node_objects-service_binding = lv_name. + rv_service_binding_name = lv_name. + ELSEIF is_test_run = abap_true. + rap_root_node_objects-service_binding = lv_name. + rv_service_binding_name = lv_name. + ELSE. + APPEND | { me->entityname } is not a root node. Service binding can only be created for the root node| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_not_a_root_node + mv_entity = me->entityname. + ENDIF. + + ENDMETHOD. + + + METHOD set_name_service_definition. + + " Since a service definition - as a part of a business service - does not have different types or different specifications, there is (in general) no need for a prefix or suffix to differentiate meaning. + " Example: ZDMO_TRAVEL_U + " However, in use cases where no reuse of the same service definition is planned for UI and API services, the prefix may follow the rules of the service binding. + " Example: ZDMO_UI_TRAVEL_U + + IF iv_name IS INITIAL. +* DATA(lv_name) = |{ namespace }{ prefix }{ entityname }{ suffix }|. + DATA(lv_name) = get_unique_repository_obj_name( i_repository_object_type = root_node_repository_objects-service_definition ). + ELSE. + lv_name = iv_name. + ENDIF. + + check_repository_object_name( + EXPORTING + iv_type = 'SRVD' + iv_name = lv_name + ). + + + IF is_root( ). + rap_root_node_objects-service_definition = lv_name. + rv_service_definition_name = lv_name. + ELSEIF is_test_run = abap_true. + rap_root_node_objects-service_definition = lv_name. + rv_service_definition_name = lv_name. + ELSE. + APPEND | { me->entityname } is not a root node. Service defintion can only be created for the root node| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_not_a_root_node + mv_entity = me->entityname. + ENDIF. + + + + ENDMETHOD. + + + METHOD set_number. + node_number = iv_number. + ENDMETHOD. + + + METHOD set_object_id. + + IF iv_object_id IS NOT INITIAL. + check_parameter( + EXPORTING + iv_parameter_name = 'ObjectId' + iv_value = CONV #( iv_object_id ) + ). + + object_id = to_upper( iv_object_id ). + EXIT. + ENDIF. + + "determine object_id (=semantic key field) from semantic key fields + IF implementationtype = implementation_type-managed_semantic OR + implementationtype = implementation_type-unmanaged_semantic. + + + + IF is_root_node = abap_true AND line_exists( semantic_key[ 1 ] ). + object_id = semantic_key[ 1 ]. + ENDIF. + + IF ( is_child_node = abap_true OR is_grand_child_node = abap_true ) AND + line_exists( parent_node->semantic_key[ 1 ] ) AND + line_exists( semantic_key[ 1 ] ). + + LOOP AT semantic_key INTO DATA(semantic_key_field). + IF NOT line_exists( parent_node->semantic_key[ name = semantic_key_field-name ] ). + object_id = semantic_key_field-name. + EXIT. + ENDIF. + ENDLOOP. + + ENDIF. + + ENDIF. + ENDMETHOD. + + + METHOD set_package. + + IF NOT xco_lib->get_package( iv_package )->exists( ) OR iv_package IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>package_does_not_exist + mv_value = CONV #( iv_package ). + ENDIF. + + package = iv_package. + package = to_upper( package ). + + ENDMETHOD. + + + METHOD set_parent. + IF io_parent_node IS NOT INITIAL. + parent_node = io_parent_node. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>parameter_is_initial + mv_parameter_name = 'Parent node' ##NO_TEXT. + ENDIF. + ENDMETHOD. + + + METHOD set_persistent_table. + + todo( 'METHOD set_persistent_table. Check if method should be called if data_source is table' ). + + DATA(lv_table) = to_upper( iv_persistent_table ) . + + persistent_table_name = iv_persistent_table . + + IF create_table = abap_true. + + lt_fields_persistent_table = lt_fields. + + ELSE. + + IF data_source_type = data_source_types-table OR + data_source_type = data_source_types-cds_view OR + data_source_type = data_source_types-abstract_entity. + "check if table exists + IF xco_lib->get_database_table( CONV #( lv_table ) )->exists( ) = abap_false. + APPEND | Table { lv_table } does not exist| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>table_does_not_exist + mv_value = CONV #( lv_table ). + ENDIF. + + get_fields_persistent_table( ). + + " ELSEIF data_source_type = data_source_types-structure. + " @todo + " + " ELSEIF data_source_type = data_source_types-abap_type. + " @todo + + ENDIF. + + ENDIF. + + + ENDMETHOD. + + + METHOD set_prefix. + check_parameter( + EXPORTING + iv_parameter_name = 'Prefix' ##NO_TEXT + iv_value = CONV #( iv_prefix ) + ). + + prefix = iv_prefix. + + ENDMETHOD. + + + METHOD set_publish_service. + publish_service = iv_value. + ENDMETHOD. + + + METHOD set_repository_object_names. + + set_name_cds_r_view( rap_node_objects-cds_view_r ). + set_name_cds_i_view( rap_node_objects-cds_view_i ). + set_name_cds_i_view_basic( rap_node_objects-cds_view_i_basic ). + "we are using view entities as of 2008 and don't need to generate DDIC views anymore + "set_ddic_view_i_name( ). + set_name_custom_entity( rap_node_objects-cds_view_r ). + set_name_custom_query_impl( rap_node_objects-custom_query_impl_class ). + set_name_cds_p_view( rap_node_objects-cds_view_p ). + set_name_mde( rap_node_objects-cds_view_p ). + set_name_behavior_impl( rap_node_objects-behavior_implementation ). + + set_name_control_structure( rap_node_objects-control_structure ). + + + set_name_draft_query_view( rap_node_objects-draft_query_view ) . + set_name_extension_include( rap_node_objects-extension_include ). + set_name_extension_incl_view( rap_node_objects-extension_include_view ). + + set_name_sap_node_object_type( rap_node_objects-sap_object_node_type ). + + IF is_root( ). + set_name_behavior_def_r( rap_node_objects-cds_view_r ). + set_name_behavior_def_p( rap_node_objects-cds_view_p ). + set_name_behavior_def_i( rap_node_objects-cds_view_i ). + set_name_service_definition( rap_root_node_objects-service_definition ). + set_name_service_binding( rap_root_node_objects-service_binding ). + set_name_sap_object_type( rap_root_node_objects-sap_object_type ). + ENDIF. + + IF manage_business_configuration = abap_true. + + IF manage_business_config_names-identifier IS INITIAL. + + + DATA(valid_mbc_identifier) = get_valid_mbc_identifier( ). + set_mbc_identifier( CONV #( valid_mbc_identifier ) ). + + ENDIF. + + IF manage_business_config_names-name IS INITIAL. + set_mbc_name( CONV #( |{ root_node->rap_node_objects-alias }{ root_node->suffix } maintenance| ) ). + ENDIF. + + IF manage_business_config_names-description IS INITIAL. + set_mbc_description( CONV #( |identifier { manage_business_config_names-identifier }| ) ). + ENDIF. + + set_mbc_namespace( ). + + ENDIF. + + + ENDMETHOD. + + + METHOD set_root. + IF io_root_node IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>parameter_is_initial + mv_parameter_name = 'Parent node' ##NO_TEXT. + ENDIF. + IF me <> io_root_node. + root_node = io_root_node. + ELSE. + + IF me->is_root( ) . + root_node = io_root_node. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>is_not_a_root_node + mv_entity = io_root_node->entityname. + ENDIF. + ENDIF. + + ENDMETHOD. + + + METHOD set_semantic_key_fields. + DATA ls_semantic_key TYPE ts_semantic_key. + IF it_semantic_key IS INITIAL. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>parameter_is_initial + mv_parameter_name = 'Semantic key field(s)' ##NO_TEXT. + + ELSE. + + CLEAR semantic_key. + + LOOP AT it_semantic_key INTO DATA(ls_semantic_key_field). + + "the cds view field name will be retrieved in the + "finalize method because it can not + "be assumed at this point that set_datasource + "has already been called. + "This is because JSON files are used as input where the order of items + "is arbitrary + "Hence the order of the methods for setting the values cannot be enforced + "the semantic key field is data base field. The name has to be converted + "to uppercase since otherwise checks for field names will fail + + ls_semantic_key-name = to_upper( ls_semantic_key_field ). + APPEND ls_semantic_key TO semantic_key. + + ENDLOOP. + + ENDIF. + + ENDMETHOD. + + + METHOD set_skip_activation. + skip_activation = iv_value. + ENDMETHOD. + + + METHOD set_structure. + + DATA(lv_structure) = to_upper( iv_structure ) . + + + + + "check if structure exists and structure has an active version + IF xco_lib->get_structure( CONV #( lv_structure ) )->exists( ) = abap_false . + APPEND | Structure { lv_structure } does not exist| TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>table_does_not_exist + mv_value = CONV #( lv_structure ). + ENDIF. + + DATA(structure_state) = xco_lib->get_structure( CONV #( lv_structure ) )->get_state( xco_cp_abap_dictionary=>object_read_state->active_version ). + + DATA(check_state_active) = xco_cp_abap_dictionary=>object_state->active. + + IF structure_state <> xco_cp_abap_dictionary=>object_state->active. + APPEND | Structure { lv_structure } is not active | TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>table_is_inactive + mv_value = CONV #( lv_structure ). + ENDIF. + + structure_name = lv_structure. + + set_persistent_table( CONV #( lv_structure ) ). + + get_fields( ). + + + + + + + ENDMETHOD. + + + METHOD set_suffix. + + check_parameter( + EXPORTING + iv_parameter_name = 'Prefix' ##NO_TEXT + iv_value = CONV #( iv_suffix ) + ). + IF iv_suffix IS NOT INITIAL. + suffix = |{ iv_suffix }| . + ELSE. + suffix = iv_suffix. + ENDIF. + + ENDMETHOD. + + + METHOD set_table. + + DATA(lv_table) = to_upper( iv_table ) . + + IF create_table = abap_true. + + table_name = get_valid_table_name( + iv_name = CONV #( lv_table ) + draft_table_suffix = space + ) + . + set_persistent_table( CONV #( lv_table ) ). + ELSE. + + TEST-SEAM omit_table_existence_check. + + "check if table exists and table has an active version + IF xco_lib->get_database_table( CONV #( lv_table ) )->exists( ) = abap_false . + APPEND | Table { lv_table } does not exist| TO lt_messages ##NO_TEXT . + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>table_does_not_exist + mv_value = lv_table. + ENDIF. + +* data(table_delivery_class) = xco_lib->get_database_table( CONV #( lv_table ) )->content( )->get( )-delivery_class->value. + + DATA(table_state) = xco_lib->get_database_table( CONV #( lv_table ) )->get_state( xco_cp_abap_dictionary=>object_read_state->active_version ). + + DATA(check_state_active) = xco_cp_abap_dictionary=>object_state->active. + + IF table_state <> xco_cp_abap_dictionary=>object_state->active. + APPEND | Table { lv_table } is not active | TO lt_messages ##NO_TEXT . + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>table_is_inactive + mv_value = lv_table. + ENDIF. + END-TEST-SEAM. + + table_name = lv_table. + + set_persistent_table( CONV #( lv_table ) ). + + get_fields( ). + + ENDIF. + + + ENDMETHOD. + + + METHOD set_transport_request. + + "set_transport request is also called at end of set_package( ) + "this method will try to reuse any suitable modifiable transport that already exists for that package and that + "is owned by the developer + "If nevertheless a transport request is set externally this will overrule the automatic selection + "If no transport can be found a new transport will be generated + + IF me->package IS NOT INITIAL. + + DATA(record_object_changes) = xco_lib->get_package( me->package )->read( )-property-record_object_changes. + + IF record_object_changes = abap_false AND iv_transport_request IS NOT INITIAL. + DATA(error_details) = |{ me->package } does not record changes.|. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_transport_request + mv_value = CONV #( iv_transport_request ) + mv_value_2 = error_details. + ELSEIF record_object_changes = abap_false AND iv_transport_request IS INITIAL.. + EXIT. + ENDIF. + ELSE. + IF me->transport_request IS INITIAL. + "no package set, no transport can be set + EXIT. + ENDIF. + ENDIF. + + + "if transport request is provided take this one + IF iv_transport_request IS NOT INITIAL. + + DATA(transport_object) = xco_cp_cts=>transport->for( iv_transport_request ). + + IF transport_object->exists( ) = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>transport_does_not_exist + mv_value = CONV #( iv_transport_request ). + ENDIF. + + DATA(transport_status) = transport_object->get_status( )->value. + DATA(transport_desired_status) = xco_cp_transport=>status->modifiable->value. + + error_details = | Transport request is not modifiable.|. + + IF transport_status = transport_desired_status . + transport_request = iv_transport_request. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_transport_request + mv_value = CONV #( iv_transport_request ) + mv_value_2 = error_details. + ENDIF. + + "check if there is a modifiable transport request for this developer and this package + ELSEIF me->package IS NOT INITIAL. + + IF xco_lib->get_package( me->package )->read( )-property-record_object_changes = abap_true. + + + + + + "check if table is locked by a transport. if yes, take this one + IF me->data_source_type = data_source_types-table AND create_table = abap_false.. + DATA(transport_locking_table) = table_is_locked_by_transport( table_name ). + IF transport_locking_table IS NOT INITIAL. + transport_request = transport_locking_table. + ENDIF. + + "get transport from package + ELSE. + + DATA(lo_transport_target) = xco_lib->get_package( me->package + )->read( )-property-transport_layer->get_transport_target( ). + + DATA(lo_status_filter) = xco_cp_transport=>filter->status( xco_cp_transport=>status->modifiable ). + DATA(lo_owner_filter) = xco_cp_transport=>filter->owner( xco_cp_abap_sql=>constraint->equal( sy-uname ) ). + DATA(lo_request_type_filter) = xco_cp_transport=>filter->request_type( xco_cp_transport=>type->workbench_request ). + DATA(lo_request_target_filter) = xco_cp_transport=>filter->request_target( xco_cp_abap_sql=>constraint->equal( lo_transport_target->value ) ). + + DATA(lt_transports) = xco_cp_cts=>transports->where( VALUE #( + ( lo_status_filter ) + ( lo_owner_filter ) + ( lo_request_type_filter ) + ( lo_request_target_filter ) + ) )->resolve( xco_cp_transport=>resolution->request ). + + "similar logic as in ADT. Select the first suitable transport request + "and only if no modifiable transport request for the transport target can be found + "create a new transport request for the transport target + + IF lt_transports IS NOT INITIAL. + transport_request = lt_transports[ 1 ]->value. + ELSE. + DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value )->create_request( |RAP Business object - entity name: { me->entityname } | ). + transport_request = new_transport_object->value. + ENDIF. + + ENDIF. + + ENDIF. + + ENDIF. + + + ENDMETHOD. + + + METHOD set_xco_lib. + xco_lib = io_xco_lib. + ENDMETHOD. + + + METHOD split_and_check_abap_type_name. + + DATA abap_class_name TYPE sxco_ao_object_name . + DATA abap_type_name TYPE sxco_ao_component_name. + + DATA abap_class TYPE REF TO if_xco_ao_class. + DATA abap_type TYPE REF TO if_xco_ao_c_type. + + + SPLIT iv_abap_type_name AT '=>' INTO abap_class_name abap_type_name. + + abap_class = xco_cp_abap=>class( abap_class_name ). + + IF abap_class IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_abap_type_name + mv_value = | { iv_abap_type_name } | + mv_entity = entityname + mv_value_2 = | { abap_class_name } not found |. + ENDIF. + + abap_type = abap_class->definition->section-public->component->type( abap_type_name ). + + IF abap_type IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_abap_type_name + mv_value = | { iv_abap_type_name } | + mv_entity = entityname + mv_value_2 = | { abap_type_name } not found in class { abap_class_name } |. + ENDIF. + + ENDMETHOD. + + + METHOD table_is_locked_by_transport. + + DATA(lo_database_table) = xco_lib->get_database_table( iv_name = iv_table_name ). + + DATA(lo_lock) = lo_database_table->if_xco_cts_changeable~get_object( + )->get_lock( ). + + IF lo_lock->exists( ) EQ abap_true. + rv_transport = lo_lock->get_transport( ). + ENDIF. + + ENDMETHOD. + + + METHOD todo. + APPEND todo TO todos. + ENDMETHOD. + + + METHOD underscore_at_pos_2_3. + DATA underscore TYPE string VALUE '_'. + rv_no_underscore_at_pos_2_3 = abap_true. + DATA(string_pos_2_and_3) = substring( val = iv_string len = 2 off = 1 ). + FIND ALL OCCURRENCES OF underscore IN + string_pos_2_and_3 + RESULTS DATA(underscores_at_2_3). + IF underscores_at_2_3 IS INITIAL. + rv_no_underscore_at_pos_2_3 = abap_false. + ENDIF. + ENDMETHOD. + + + METHOD validate_bo. + + DATA(package_type) = xco_lib->get_package( root_node->package )->read( )-property-package_type->value. + + IF package_type <> zdmo_cl_rap_node=>package_type-development_package. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_package_type + mv_value = CONV #( package_type ) + mv_package_name = CONV #( root_node->package ). + ENDIF. + + + IF data_source_type = data_source_types-table. + "check if the client field (usually CLNT does exist + + SELECT * FROM @lt_fields AS fields WHERE name = @field_name-client AND + key_indicator = @abap_true + INTO TABLE @DATA(result_client) . + + IF result_client IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>clnt_is_not_key_field + mv_value = field_name-client. + ENDIF. + ENDIF. + + IF generate_custom_entity( ) AND draft_enabled = abap_true. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_draft_for_cust_entites + mv_entity = entityname. + ENDIF. + + + "avoid error + "ETag delegation not supported for unmanaged query implementation + IF ( is_child( ) OR is_grand_child_or_deeper( ) ) AND + generate_custom_entity( ). + IF NOT line_exists( lt_fields[ name = field_name-etag_master ] ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_etag_delegation_support + mv_entity = entityname. + ENDIF. + ENDIF. + "validate uuid key field structure, domains and names + + DATA key_fields TYPE string. + + IF implementationtype = implementation_type-managed_uuid. + + SELECT * FROM @lt_fields AS fields WHERE name = @field_name-uuid INTO TABLE @DATA(result_uuid). + + IF result_uuid IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_uuid_missing + mv_value = CONV #( field_name-uuid ). + ENDIF. + + DATA(numberofrecords) = lines( result_uuid ). + "the underlying built in type must be of type RAW and length 16 + "@todo: the check for the data element can be removed once we can check for + "the built in type of a non released domain + + IF numberofrecords = 1 AND ( to_upper( result_uuid[ 1 ]-data_element ) = 'SYSUUID_X16' OR + to_upper( result_uuid[ 1 ]-data_element ) = 'XSDUUID_RAW' ). + " that's ok + ELSEIF numberofrecords = 1 AND + ( result_uuid[ 1 ]-built_in_type_length <> uuid_length OR result_uuid[ 1 ]-built_in_type <> uuid_type ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>uuid_has_invalid_data_type + mv_value = CONV #( field_name-uuid ). + ENDIF. + + SELECT * FROM @lt_fields AS fields WHERE key_indicator = @abap_true + AND name <> @field_name-client + INTO TABLE @result_uuid. + + IF result_uuid IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>has_no_key_field + mv_entity = entityname. + ENDIF. + + numberofrecords = lines( result_uuid ). + + + IF numberofrecords = 1 AND result_uuid[ 1 ]-name <> field_name-uuid. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>uuid_is_not_key_field + mv_entity = entityname + mv_value = field_name-uuid. + ENDIF. + + IF numberofrecords > 1. + + LOOP AT result_uuid INTO DATA(result_uuid_line). + IF key_fields IS INITIAL. + key_fields = result_uuid_line-name. + ELSE. + key_fields = key_fields && ',' && result_uuid_line-name. + ENDIF. + ENDLOOP. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>more_than_one_key_field + mv_entity = entityname + mv_value = key_fields. + ENDIF. + + + + IF is_child( ) OR is_grand_child_or_deeper( ). + + SELECT * FROM @lt_fields AS fields WHERE name = @field_name-parent_uuid INTO TABLE @DATA(result_parent_uuid). + + IF result_parent_uuid IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_parent_uuid_missing + mv_value = CONV #( field_name-parent_uuid ). + ENDIF. + + numberofrecords = lines( result_parent_uuid ). + + IF numberofrecords = 1 AND ( result_parent_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR + result_parent_uuid[ 1 ]-data_element = 'XSDUUID_RAW' ). + " that's ok + ELSEIF numberofrecords = 1 AND + ( result_parent_uuid[ 1 ]-built_in_type_length <> uuid_length OR result_parent_uuid[ 1 ]-built_in_type <> uuid_type ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>uuid_has_invalid_data_type + mv_value = CONV #( field_name-parent_uuid ). + ENDIF. + + ENDIF. + + IF is_grand_child_or_deeper( ). + + SELECT * FROM @lt_fields AS fields WHERE name = @field_name-root_uuid INTO TABLE @DATA(result_root_uuid). + + IF result_root_uuid IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_root_uuid_missing + mv_value = CONV #( field_name-root_uuid ). + ENDIF. + + numberofrecords = lines( result_root_uuid ). + + IF numberofrecords = 1 AND ( result_root_uuid[ 1 ]-data_element = 'SYSUUID_X16' OR + result_root_uuid[ 1 ]-data_element = 'XSDUUID_RAW' ). + + " that's ok + ELSEIF numberofrecords = 1 AND + ( result_root_uuid[ 1 ]-built_in_type_length <> uuid_length OR result_root_uuid[ 1 ]-built_in_type <> uuid_type ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>uuid_has_invalid_data_type + mv_value = CONV #( field_name-root_uuid ). + ENDIF. + + ENDIF. + + + ENDIF. + + + "validate if a name for the draft_table has been specified + + IF me->draft_enabled = abap_true AND me->draft_table_name IS INITIAL. + + draft_table_name = get_valid_draft_table_name( ). + + IF draft_table_name IS INITIAL. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_draft_table_specified + mv_root_entity = me->root_node->entityname + mv_entity = me->entityname. + ENDIF. + ENDIF. + + + + + IF root_node->draft_enabled = abap_true. + + "validate if total etag field is present in the root entity of the draft enabled BO + IF is_root( ). + + IF line_exists( lt_fields[ name = field_name-total_etag ] ). + "DATA(last_changed_at) = lt_fields[ name = field_name-last_changed_at ]-cds_view_field. + ELSEIF line_exists( lt_additional_fields[ name = field_name-total_etag ] ). + "last_changed_at = lt_additional_fields[ name = field_name-last_changed_at ]-cds_view_field. + ELSE. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_total_etag_missing + mv_entity = entityname. + ENDIF. + + ENDIF. + + "validate if local etag field is present in each node of the draft enabled BO + " remove this check and use etag _dependent by instead +* IF line_exists( lt_fields[ name = field_name-local_instance_last_changed_at ] ). +* "DATA(last_changed_at) = lt_fields[ name = field_name-last_changed_at ]-cds_view_field. +* ELSEIF line_exists( lt_additional_fields[ name = field_name-local_instance_last_changed_at ] ). +* "last_changed_at = lt_additional_fields[ name = field_name-last_changed_at ]-cds_view_field. +* ELSE. +* RAISE EXCEPTION TYPE ZDMO_cx_rap_generator +* EXPORTING +* textid = ZDMO_cx_rap_generator=>field_local_etag_missing +* mv_value = field_name-local_instance_last_changed_at +* mv_entity = entityname. +* ENDIF. + + + ENDIF. + + "check if an etag has been specified + IF line_exists( lt_fields[ name = field_name-etag_master ] ). + ELSEIF line_exists( lt_additional_fields[ name = field_name-etag_master ] ). + ELSE. + IF is_root( ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_etag_master_missing + mv_entity = entityname. + ELSE. + APPEND |In entity: { entityname } no etag field has been specified { field_name-created_by } | TO lt_messages. + ENDIF. + ENDIF. + + "created_by : syuname; + "last_changed_by : syuname; + "local_last_changed_at : timestampl; + + IF implementationtype = implementation_type-managed_semantic OR + implementationtype = implementation_type-managed_uuid. + IF is_root( ). + IF line_exists( lt_fields[ name = field_name-created_by ] ). + ELSEIF line_exists( lt_additional_fields[ name = field_name-created_by ] ). + ELSE. + APPEND |{ entityname } is a managed BO. But { field_name-created_by } is not mapped| TO lt_messages. + ENDIF. + + IF line_exists( lt_fields[ name = field_name-created_at ] ). + ELSEIF line_exists( lt_additional_fields[ name = field_name-created_at ] ). + ELSE. + APPEND |{ entityname } is a managed BO. But { field_name-created_at } is not mapped| TO lt_messages. + ENDIF. + + IF line_exists( lt_fields[ name = field_name-last_changed_by ] ). + ELSEIF line_exists( lt_additional_fields[ name = field_name-last_changed_by ] ). + ELSE. + APPEND |{ entityname } is a managed BO. But { field_name-last_changed_by } is not mapped| TO lt_messages. + ENDIF. + + IF line_exists( lt_fields[ name = field_name-last_changed_at ] ). + ELSEIF line_exists( lt_additional_fields[ name = field_name-last_changed_at ] ). + ELSE. + APPEND |{ entityname } is a managed BO. But { field_name-last_changed_at } is not mapped| TO lt_messages. + ENDIF. + ENDIF. + IF line_exists( lt_fields[ name = field_name-local_instance_last_changed_at ] ). + ELSEIF line_exists( lt_additional_fields[ name = field_name-local_instance_last_changed_at ] ). + ELSE. + APPEND |{ entityname } is a managed BO. But { field_name-local_instance_last_changed_at } is not mapped| TO lt_messages. + ENDIF. + + ENDIF. + + "created_by : syuname; + "created_at : timestampl; + "last_changed_by : syuname; + "last_changed_at : timestampl; + "local_last_changed_at : timestampl; + + + + + "validate value helps + + DATA lv_target TYPE string. + DATA ls_valuehelp TYPE ts_valuehelp. + FIELD-SYMBOLS: <fields> TYPE ts_field. + + LOOP AT lt_valuehelp INTO ls_valuehelp. + + lv_target = to_upper( ls_valuehelp-name ). + + SELECT * FROM i_apisforsapcloudplatform WHERE releasedobjecttype = 'CDS_STOB' AND releasedobjectname = @lv_target INTO TABLE @DATA(lt_result).. + + "check if CDS view used as target exists + IF NOT ( lt_result IS NOT INITIAL OR xco_lib->get_data_definition( CONV #( lv_target ) )->exists( ) ). + APPEND | CDS View { lv_target } does not exist | TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>cds_view_does_not_exist + mv_value = CONV #( lv_target ). + ENDIF. + + "@todo - check if table name can be omitted for + "BO's that have structure as a data source + IF table_name IS INITIAL. + CASE data_source_type. + WHEN data_source_types-structure. + WHEN data_source_types-abap_type. + WHEN data_source_types-cds_view. + WHEN data_source_types-abstract_entity. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_table_set. + ENDCASE. + ENDIF. + + IF NOT field_name_exists_in_cds_view( CONV #( ls_valuehelp-localelement ) ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>not_a_field_in_cds_view + mv_value = CONV #( ls_valuehelp-localelement ) + mv_entity = me->entityname. + ENDIF. + + ENDLOOP. + + "validate associations + + LOOP AT lt_association INTO DATA(ls_assocation). + + lv_target = to_upper( ls_assocation-target ). + + SELECT * FROM i_apisforsapcloudplatform WHERE releasedobjecttype = 'CDS_STOB' AND releasedobjectname = @lv_target INTO TABLE @lt_result. + + "check if CDS view used as target exists + IF NOT ( lt_result IS NOT INITIAL OR xco_lib->get_data_definition( CONV #( lv_target ) )->exists( ) ). + APPEND | CDS View { lv_target } does not exist | TO lt_messages. + bo_node_is_consistent = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>cds_view_does_not_exist + mv_value = CONV #( lv_target ). + ENDIF. + + + LOOP AT ls_assocation-condition_components INTO DATA(ls_condition_fields). + IF NOT field_name_exists_in_cds_view( CONV #( ls_condition_fields-projection_field ) ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>not_a_field_in_cds_view + mv_value = CONV #( ls_condition_fields-projection_field ) + mv_entity = me->entityname. + ENDIF. + ENDLOOP. + ENDLOOP. + + "validate object id + IF object_id IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_object_id_set + mv_entity = entityname. + ELSE. + DATA object_id_upper_case TYPE sxco_ad_field_name. + object_id_upper_case = to_upper( object_id ). + + SELECT SINGLE * FROM @lt_fields AS db_field WHERE name = @object_id_upper_case INTO @DATA(result). + IF result IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_is_not_in_datasource + mv_value = CONV #( object_id_upper_case ) + mv_table_name = CONV #( table_name ). + ENDIF. + + object_id_cds_field_name = result-cds_view_field. + + ENDIF. + + "validate uuid key field + + IF implementationtype = implementation_type-managed_uuid. + + ENDIF. + + " validate semantic key fields + + IF implementationtype = implementation_type-unmanaged_semantic OR + implementationtype = implementation_type-managed_semantic. + + IF semantic_key IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_semantic_key_set. + ENDIF. + + FIELD-SYMBOLS <ls_semantic_key> LIKE LINE OF semantic_key. + + LOOP AT semantic_key ASSIGNING <ls_semantic_key>. + + SELECT SINGLE * FROM @lt_fields AS semantickeyalias WHERE name = @<ls_semantic_key>-name INTO @DATA(resultsemantickeyalias). + + IF resultsemantickeyalias IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>sematic_key_is_not_in_table + mv_semantic_key_field = CONV #( <ls_semantic_key>-name ) + mv_table_name = CONV #( table_name ). + ELSE. + <ls_semantic_key>-cds_view_field = resultsemantickeyalias-cds_view_field. + ENDIF. + CLEAR resultsemantickeyalias. + ENDLOOP. + + "mark semantic key fields as key fields in lt_fields + IF data_source_type = data_source_types-structure OR + data_source_type = data_source_types-abap_type. + LOOP AT semantic_key INTO DATA(semantic_key_field). + LOOP AT lt_fields ASSIGNING FIELD-SYMBOL(<line>) WHERE name = semantic_key_field-name. + <line>-key_indicator = abap_true. + ENDLOOP. + ENDLOOP. + ENDIF. + + + ENDIF. + + "validate mapping + + LOOP AT lt_mapping INTO DATA(ls_field_mapping). + + DATA(lv_dbtablefield) = to_upper( ls_field_mapping-dbtable_field ). + + + "check if database table field is part of the persistence table + "if table is set as datasource it is automatically set as persistence table + "if an unmanaged scenario is used no mapping can be derived from the data source + "or from the persistence table + IF implementationtype <> implementation_type-unmanaged_semantic. + SELECT SINGLE * FROM @lt_fields_persistent_table AS db_field WHERE name = @lv_dbtablefield INTO @DATA(result_dbtable_field). + + IF result_dbtable_field IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_is_not_in_datasource + mv_value = CONV #( ls_field_mapping-dbtable_field ) + mv_table_name = CONV #( table_name ). + ENDIF. + CLEAR result_dbtable_field. + ENDIF. + + + SELECT SINGLE * FROM @lt_fields AS cds_view_field WHERE cds_view_field = @ls_field_mapping-cds_view_field INTO @DATA(result_cds_view_field). + IF result_cds_view_field IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>field_is_not_in_cds_view + mv_value = CONV #( ls_field_mapping-cds_view_field ) + mv_entity = CONV #( rap_node_objects-cds_view_r ). + ENDIF. + CLEAR result_cds_view_field. + ENDLOOP. + + "check prerequisites for manage business configuration app + + IF me->manage_business_configuration = abap_true. + + IF me->draft_enabled = abap_false. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>not_draft_enabled + mv_value = CONV #( me->root_node->entityname ). + ENDIF. + + IF me->binding_type <> binding_type_name-odata_v4_ui. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_ui_v4_service_binding + mv_value = CONV #( me->root_node->entityname ). + ENDIF. + + + + ENDIF. + + IF me->root_node->publish_service = abap_true + AND me->root_node->skip_activation = abap_true. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>publish_needs_active_srvd. + + . + ENDIF. + + "validate settings for customizing table and mbc app + + IF is_customizing_table = abap_true AND is_grand_child_or_deeper( ). + "&1 Grandchild nodes are not supported for &2 = &3. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>grand_child_not_supported + mv_entity = entityname + mv_value = 'iscustomizingtable' + mv_value_2 = 'abap_true'. + + ENDIF. + + IF manage_business_configuration = abap_true AND is_grand_child_or_deeper( ). + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>grand_child_not_supported + mv_entity = entityname + mv_value = 'addtomanagebusinessconfiguration' + mv_value_2 = 'abap_true'. + ENDIF. + + IF data_source_type = data_source_types-structure. + + + + ENDIF. + + IF multi_edit = abap_true AND + ( binding_type <> binding_type_name-odata_v4_ui OR + draft_enabled = abap_false ). + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>mult_edit_not_supported + mv_entity = entityname. + + ENDIF. + + IF is_customizing_table = abap_true. + + DATA(customizing_database_table) = xco_lib->get_database_table( iv_name = table_name ). + + DATA(delivery_class) = customizing_database_table->content( )->get_delivery_class( )->value. + + IF delivery_class <> 'C'. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>delivery_class_c_required + mv_value = CONV #( table_name ) + mv_value_2 = CONV #( delivery_class ). + ENDIF. + + ENDIF. + + IF bo_is_extensible = abap_true AND extensibility_element_suffix IS INITIAL. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>no_ext_element_suffix_set. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_node.clas.testclasses.abap b/src/zdmo_cl_rap_node.clas.testclasses.abap new file mode 100644 index 0000000..1012428 --- /dev/null +++ b/src/zdmo_cl_rap_node.clas.testclasses.abap @@ -0,0 +1,1402 @@ +*"* use this source file for your ABAP unit test classes +CLASS ltc_rap_node DEFINITION FINAL FOR TESTING + DURATION MEDIUM + RISK LEVEL HARMLESS. + PUBLIC SECTION. + + PRIVATE SECTION. + + CONSTANTS: + gc_namespace_z TYPE sxco_ar_object_name VALUE 'Z', + gc_namespace_contains_blanks TYPE sxco_ar_object_name VALUE 'Z T', + gc_namespace_contains_nonalpha TYPE sxco_ar_object_name VALUE 'Z$T', + gc_root_entity_name TYPE sxco_ddef_alias_name VALUE 'Travel', + gc_root_entity_name_too_long TYPE sxco_ddef_alias_name VALUE 'T012345678901234567890123456789', + gc_root_ent_contains_blanks TYPE sxco_ddef_alias_name VALUE 'Trav el', + gc_root_ent_contains_nonalpha TYPE sxco_ddef_alias_name VALUE 'Trave&l', + gc_prefix_rap TYPE sxco_ar_object_name VALUE 'RAP_', + gc_prefix_contains_blanks TYPE sxco_ar_object_name VALUE 'R AP_', + gc_prefix_contains_nonalpha TYPE sxco_ar_object_name VALUE 'R%P_', + gc_suffix_4711 TYPE sxco_ar_object_name VALUE '_4711', + gc_suffix_contains_blanks TYPE sxco_ar_object_name VALUE '_4 11', + gc_suffix_contains_nonalpha TYPE sxco_ar_object_name VALUE '_4&11', + gc_protocol_version_odata_v4 TYPE sxco_ar_object_name VALUE '_O4', + gc_binding_ui TYPE sxco_ar_object_name VALUE 'UI_', + gc_ddic_view_i_name_z TYPE sxco_dbt_object_name VALUE 'TRAV00', + gc_entity_child1 TYPE sxco_ddef_alias_name VALUE 'Booking', + gc_entity_child2 TYPE sxco_ddef_alias_name VALUE 'Booking2', + gc_entity_grandchild11 TYPE sxco_ddef_alias_name VALUE 'BookingSuppl', + "managed uuid scenario with data source table + gc_root_table_mu TYPE sxco_dbt_object_name VALUE 'ZDMO_rapgen_bo', + gc_child_table_mu TYPE sxco_dbt_object_name VALUE 'ZDMO_rapgen_node', + gc_grandchild_table_mu TYPE sxco_dbt_object_name VALUE 'ZDMO_a_bksuppl_d', + + gc_root_table_uuid TYPE string VALUE 'travel_uuid', + gc_child_table_uuid TYPE string VALUE 'booking_uuid', + gc_grand_child_table_uuid TYPE string VALUE 'booksuppl_uuid', + "object id + gc_root_table_sem_key_mu TYPE string VALUE 'TRAVEL_ID', + gc_child_table_sem_key_mu TYPE string VALUE 'BOOKING_ID', + gc_grandchild_table_sem_key_mu TYPE string VALUE 'booking_supplement_id', + gc_etag_master_mu TYPE string VALUE 'lastchangedat', + "view + gc_view_name TYPE string VALUE 'I_Country', + gc_view_object_id TYPE sxco_ad_field_name VALUE 'Country', + gc_view_etag_master TYPE string VALUE 'CountryThreeLetterISOCode', + "view entity + gc_view_entity_name TYPE string VALUE 'DDCDS_CUSTOMER_DOMAIN_VALUE', + gc_view_entity_object_id TYPE sxco_ad_field_name VALUE 'domain_name', + gc_view_entity_etag_master TYPE string VALUE 'value_high', + "abstract entity + "ZDMO_TEST_ABSTRACT_CHILDENTITY + gc_abstract_entity_name TYPE string VALUE 'D_SELECTCUSTOMIZINGTRANSPTREQP ', + gc_abstract_entity_object_id TYPE sxco_ad_field_name VALUE 'TransportRequestID', + gc_abstract_entity_etag_master TYPE string VALUE 'TransportRequestID' + . + + + . + + TYPES: + BEGIN OF ts_field, + name TYPE sxco_ad_object_name, + doma TYPE sxco_ad_object_name, + key_indicator TYPE abap_bool, + not_null TYPE abap_bool, + domain_fixed_value TYPE abap_bool, + cds_view_field TYPE sxco_cds_field_name, + END OF ts_field. + + DATA: + mo_cut TYPE REF TO zdmo_cl_rap_node, + mo_xco_lib TYPE REF TO ZDMO_cl_rap_xco_lib. + + CLASS-METHODS: + class_setup, + class_teardown. + + METHODS: setup, + teardown, + set_namespace FOR TESTING RAISING cx_static_check, + set_prefix FOR TESTING RAISING cx_static_check, + set_suffix FOR TESTING RAISING cx_static_check, + set_cds_view_i_name FOR TESTING RAISING cx_static_check, + set_cds_view_p_name FOR TESTING RAISING cx_static_check, + set_mde_name FOR TESTING RAISING cx_static_check, + + set_behavior_def_i_name FOR TESTING RAISING cx_static_check , + set_behavior_def_p_name FOR TESTING RAISING cx_static_check , + set_behavior_impl_name FOR TESTING RAISING cx_static_check , + set_service_definition_name FOR TESTING RAISING cx_static_check, + set_service_binding_name FOR TESTING RAISING cx_static_check, + set_entityname FOR TESTING RAISING cx_static_check, + create_a_root_node FOR TESTING RAISING cx_static_check, + create_root_with_childs FOR TESTING RAISING cx_static_check, + + set_table FOR TESTING RAISING cx_static_check, + get_fields_from_table FOR TESTING RAISING cx_static_check, + get_fields_from_view FOR TESTING RAISING cx_static_check, + get_fields_from_view_entity FOR TESTING RAISING cx_static_check, + get_fields_from_abstractentity FOR TESTING RAISING cx_static_check, + check_for_key_field_uuid FOR TESTING RAISING cx_static_check, + check_for_parent_key_field FOR TESTING RAISING cx_static_check, + check_for_client_field FOR TESTING RAISING cx_static_check, + check_for_root_key_field FOR TESTING RAISING cx_static_check, + check_set_objectid_wo_data_src FOR TESTING RAISING cx_static_check, + "managed scenario + create_root_with_childs_u FOR TESTING RAISING cx_static_check. + + +ENDCLASS. + +CLASS zdmo_cl_rap_node DEFINITION LOCAL FRIENDS ltc_rap_node. + +CLASS ltc_rap_node IMPLEMENTATION. + + METHOD class_setup. + "create test doubles for the following tables that are read or written to by this class + "this should be only done once we thus do this in the class method class_setup + + + + ENDMETHOD. + + METHOD class_teardown. + + ENDMETHOD. + + METHOD setup. + + "mo_xco_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + mo_xco_lib = NEW ZDMO_cl_rap_xco_cloud_lib( ). + + "create test data so that three different nodes can be created + + DATA lt_fields_gc_root_mu TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY. + DATA lt_fields_gc_child_mu TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY. + DATA lt_fields_gc_grandchild_mu TYPE STANDARD TABLE OF ts_field WITH DEFAULT KEY. + + lt_fields_gc_root_mu = VALUE #( + ( name = 'CLIENT' key_indicator = 'X' not_null = 'X' cds_view_field = 'Client' ) + ( name = 'UUID' key_indicator = 'X' not_null = 'X' cds_view_field = 'Uuid' ) + ( name = 'TRAVEL_ID' cds_view_field = 'TravelId' ) + ( name = 'AGENCY_ID' cds_view_field = 'AgencyId' ) + ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' ) + ( name = 'BEGIN_DATE' cds_view_field = 'BeginDate' ) + ( name = 'END_DATE' cds_view_field = 'EndDate' ) + ( name = 'BOOKING_FEE' cds_view_field = 'BookingFee' ) + ( name = 'TOTAL_PRICE' cds_view_field = 'TotalPrice' ) + ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' ) + ( name = 'DESCRIPTION' cds_view_field = 'Description' ) + ( name = 'OVERALL_STATUS' cds_view_field = 'OverallStatus' ) + ( name = 'CREATED_BY' cds_view_field = 'CreatedBy' ) + ( name = 'CREATED_AT' cds_view_field = 'CreatedAt' ) + ( name = 'LAST_CHANGED_BY' cds_view_field = 'LastChangedBy' ) + ( name = 'LAST_CHANGED_AT' cds_view_field = 'LastChangedAt' ) + ). + + lt_fields_gc_child_mu = VALUE #( + ( name = 'CLIENT' key_indicator = 'X' not_null = 'X' cds_view_field = 'Client' ) + ( name = 'UUID' key_indicator = 'X' not_null = 'X' cds_view_field = 'Uuid' ) + ( name = 'PARENT_UUID' cds_view_field = 'ParentUuid' ) + ( name = 'BOOKING_ID' cds_view_field = 'BookingId' ) + ( name = 'BOOKING_DATE' cds_view_field = 'BookingDate' ) + ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' ) + ( name = 'CARRIER_ID' cds_view_field = 'CarrierId' ) + ( name = 'CONNECTION_ID' cds_view_field = 'ConnectionId' ) + ( name = 'FLIGHT_DATE' cds_view_field = 'FlightDate' ) + ( name = 'FLIGHT_PRICE' cds_view_field = 'FlightPrice' ) + ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' ) + ( name = 'BOOKING_STATUS' cds_view_field = 'BookingStatus' ) + ). + + lt_fields_gc_grandchild_mu = VALUE #( + ( name = 'CLIENT' key_indicator = 'X' not_null = 'X' cds_view_field = 'Client' ) + ( name = 'UUID' key_indicator = 'X' not_null = 'X' cds_view_field = 'Uuid' ) + ( name = 'PARENT_UUID' cds_view_field = 'ParentUuid' ) + ( name = 'ROOT_UUID' cds_view_field = 'RootUuid' ) + ( name = 'BOOKING_SUPPL_ID' cds_view_field = 'BookingSupplId' ) + ( name = 'ARTICLE' cds_view_field = 'Article' ) + ). + + ENDMETHOD. + + METHOD teardown. + "teardown is called for every test. So if data exists it should be cleared + ENDMETHOD. + + METHOD set_namespace. + + DATA : lv_namespace TYPE string. + + "Given is a node object + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + "When the namespace is set to 'Z' + "Then the member variable namespace of the node must have the value 'Z' as well + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + lv_namespace = mo_cut->namespace. + cl_abap_unit_assert=>assert_equals( exp = gc_namespace_z act = lv_namespace ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + "When a namespace that contains blanks is set then an exception with + "message id : ZDMO_cx_rap_generator=>contains_spaces-msgid + "message number : ZDMO_cx_rap_generator=>contains_spaces-msgno + "must be raised + + TRY. + mo_cut->set_namespace( gc_namespace_contains_blanks ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + ENDTRY. + + "When a namespace that contains non alpha numeric characters is set + "then an exception with + "message id : ZDMO_cx_rap_generator=>NON_ALPHA_NUMERIC_CHARACTERS-msgid + "message number : ZDMO_cx_rap_generator=>NON_ALPHA_NUMERIC_CHARACTERS-msgno + "must be raised + + TRY. + mo_cut->set_namespace( gc_namespace_contains_nonalpha ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + ENDTRY. + ENDMETHOD. + + METHOD set_prefix. + + DATA : lv_prefix TYPE string. + + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_prefix( gc_prefix_rap ). + + lv_prefix = mo_cut->prefix. + cl_abap_unit_assert=>assert_equals( exp = gc_prefix_rap act = lv_prefix ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_prefix( gc_prefix_contains_blanks ). + lv_prefix = mo_cut->prefix. + cl_abap_unit_assert=>assert_equals( exp = gc_prefix_rap act = lv_prefix ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + ENDTRY. + + TRY. + mo_cut->set_prefix( gc_prefix_contains_nonalpha ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + ENDTRY. + + ENDMETHOD. + + METHOD set_suffix. + + DATA : lv_suffix TYPE string. + + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_suffix( gc_suffix_4711 ). + lv_suffix = mo_cut->suffix. + cl_abap_unit_assert=>assert_equals( exp = gc_suffix_4711 act = lv_suffix ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_suffix( gc_suffix_contains_blanks ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + ENDTRY. + + TRY. + mo_cut->set_suffix( gc_suffix_contains_nonalpha ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + ENDTRY. + + ENDMETHOD. + + METHOD set_cds_view_i_name. + "check + DATA(lv_expected_name) = |{ gc_namespace_z }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + DATA lv_name TYPE string. + " Given is a node object + + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_cds_i_view( ). + lv_name = mo_cut->rap_node_objects-cds_view_i. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + METHOD set_cds_view_p_name. + "check + "|{ namespace }C_{ prefix }{ entityname }{ suffix }|. + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + DATA lv_name TYPE string. + + " Given is a node object + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_cds_p_view( ). + lv_name = mo_cut->rap_node_objects-cds_view_p. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + METHOD set_mde_name. + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + DATA lv_name TYPE string. + " Given is a node object + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_mde( ). + lv_name = mo_cut->rap_node_objects-meta_data_extension. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + ENDMETHOD. + + + METHOD set_behavior_def_i_name. + "check + TEST-INJECTION runs_as_cut. + is_test_run = abap_true. + END-TEST-INJECTION. + + DATA(lv_expected_name) = |{ gc_namespace_z }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA lv_name TYPE string. + " Given is a node object + + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_behavior_def_r( ). + lv_name = mo_cut->rap_root_node_objects-behavior_definition_r. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + METHOD set_behavior_def_p_name. + + TEST-INJECTION runs_as_cut. + is_test_run = abap_true. + END-TEST-INJECTION. + + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA lv_name TYPE string. + " Given is a node object + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_behavior_def_p( ). + lv_name = mo_cut->rap_root_node_objects-behavior_definition_p. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + METHOD set_behavior_impl_name. + + DATA(lv_expected_name) = |{ gc_namespace_z }BP_I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA lv_name TYPE string. + " Given is a node object + + TRY. + mo_cut = NEW #( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_behavior_impl( ). + lv_name = mo_cut->rap_node_objects-behavior_implementation. + + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + ENDMETHOD. + + METHOD set_entityname. + + DATA(lv_expected_name) = gc_root_entity_name . + + DATA lv_name TYPE string. + " Given is a node object + TRY. + mo_cut = NEW #( ). + mo_cut->set_entity_name( gc_root_entity_name ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + lv_name = mo_cut->entityname. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + TRY. + mo_cut = NEW #( ). + mo_cut->set_entity_name( gc_root_ent_contains_blanks ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>contains_spaces-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + ENDTRY. + + TRY. + mo_cut = NEW #( ). + mo_cut->set_entity_name( gc_root_ent_contains_nonalpha ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator . + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>non_alpha_numeric_characters-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + ENDTRY. + + ENDMETHOD. + + METHOD set_service_binding_name. + + TEST-INJECTION runs_as_cut. + is_test_run = abap_true. + END-TEST-INJECTION. + + "WHEN binding_type_name-odata_v4_ui. + " protocol_version = protocol_version_suffix-odata_v4. + " binding = binding_type_prefix-ui. + " DATA(lv_name) = |{ namespace }{ binding }{ prefix }{ entityname }{ suffix }{ protocol_version }|. + DATA(lv_expected_name) = |{ gc_namespace_z }{ gc_binding_ui }{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }{ gc_protocol_version_odata_v4 }|. + + DATA lv_name TYPE string. + " Given is a node object + TRY. + mo_cut = NEW #( ). + + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. +* gc_protocol_version_odata_v4 TYPE sxco_ar_object_name VALUE '_O4', +* gc_binding_ui TYPE sxco_ar_object_name VALUE 'UI_', + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_binding_type( mo_cut->binding_type_name-odata_v4_ui ). + + mo_cut->set_name_service_binding( ). + lv_name = mo_cut->rap_root_node_objects-service_binding. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + " lv_expected_name = |{ gc_namespace_z }UI_{ gc_root_entity_name_too_long }_M|. + + TRY. + mo_cut = NEW #( ). + mo_cut->set_entity_name( gc_root_entity_name_too_long ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_namespace( gc_namespace_z ). + "mo_cut->set_prefix( gc_prefix_rap ). + "mo_cut->set_suffix( gc_suffix_1234 ). + mo_cut->set_name_service_binding( ). + lv_name = mo_cut->rap_root_node_objects-service_binding. + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>is_too_long not raised' ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>is_too_long-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>is_too_long-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + ENDTRY. + + ENDMETHOD. + + METHOD set_service_definition_name. + TEST-INJECTION runs_as_cut. + is_test_run = abap_true. + END-TEST-INJECTION. + + " DATA(lv_name) = |{ namespace }{ prefix }{ entityname }{ suffix }|.. + DATA(lv_expected_name) = |{ gc_namespace_z }{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA lv_name TYPE string. + " Given is a node object + TRY. + mo_cut = NEW #( ). + mo_cut->set_entity_name( gc_root_entity_name ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_name_service_definition( ). + lv_name = mo_cut->rap_root_node_objects-service_definition. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + ENDMETHOD. + + METHOD create_a_root_node. + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA lv_name TYPE string. + DATA root_node_flag TYPE abap_boolean. + + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_data_source_type( mo_cut->data_source_types-table ). + "parameters are not mandatory + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + "node specific settings + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_data_source( CONV #( gc_root_table_MU ) ). + mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ). + mo_cut->set_field_name_uuid( gc_root_table_uuid ). + mo_cut->finalize( ). + lv_name = mo_cut->rap_node_objects-cds_view_p. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + root_node_flag = mo_cut->is_root_node. + cl_abap_unit_assert=>assert_equals( exp = abap_true act = root_node_flag ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + ENDMETHOD. + + METHOD create_root_with_childs. + + DATA lv_name TYPE string. + DATA lv_expected_name TYPE string. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_data_source_type( mo_cut->data_source_types-table ). + "parameters are not mandatory + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + "node specific settings + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_data_source( CONV #( gc_root_table_MU ) ). + mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ). + mo_cut->set_field_name_uuid( to_upper( 'travel_uuid' ) ). + mo_cut->finalize( ). + + + DATA(child1_bo) = mo_cut->add_child( ). + child1_bo->set_entity_name( gc_entity_child1 ). + child1_bo->set_data_source( 'ZDMO_a_booking_d' ). + child1_bo->set_object_id( 'BOOKING_ID' ). + child1_bo->set_field_name_uuid( to_upper( 'booking_uuid' ) ). + child1_bo->finalize( ). + + DATA(child2_bo) = mo_cut->add_child( ). + child2_bo->set_entity_name( gc_entity_child2 ). + child2_bo->set_data_source( 'ZDMO_a_booking_d' ). + child2_bo->set_object_id( 'BOOKING_ID' ). + child2_bo->set_field_name_uuid( to_upper( 'booking_uuid' ) ). + child2_bo->finalize( ). + + DATA(child11_bo) = child1_bo->add_child( ). + child11_bo->set_entity_name( gc_entity_grandchild11 ). + child11_bo->set_data_source( 'ZDMO_a_bksuppl_d' ). + child11_bo->set_object_id( to_upper( 'booking_supplement_id' ) ). + child11_bo->set_field_name_uuid( to_upper( 'booksuppl_uuid' ) ). + child11_bo->finalize( ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + lv_expected_name = |{ gc_namespace_z }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + lv_name = mo_cut->rap_root_node_objects-behavior_definition_r. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_namespace_z }I_{ gc_prefix_rap }{ gc_entity_child1 }{ gc_suffix_4711 }|. + lv_name = child1_bo->rap_node_objects-cds_view_i. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_namespace_z }BP_I_{ gc_prefix_rap }{ gc_entity_child2 }{ gc_suffix_4711 }|. + lv_name = child2_bo->rap_node_objects-behavior_implementation. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_entity_grandchild11 }{ gc_suffix_4711 }|. + lv_name = child11_bo->rap_node_objects-cds_view_p. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_root_entity_name }|. + lv_name = child11_bo->root_node->entityname. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + ENDMETHOD. + + METHOD get_fields_from_table. + + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA(lv_tablename) = gc_grandchild_table_mu. + "DATA(lv_tablename) = gc_child_table. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ). + mo_cut->set_entity_name( gc_root_entity_name ). + "ZDMO_agency + mo_cut->set_table( CONV #( lv_tablename ) ). + mo_cut->get_fields( ). + DATA(lt_fields) = mo_cut->lt_fields. + "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ). + cl_abap_unit_assert=>assert_not_initial( + EXPORTING + act = lt_fields + msg = 'No fields retrieved' + ). + LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields) WHERE name <> mo_cut->field_name-client. + IF ls_header_fields-name = mo_cut->field_name-root_uuid. + DATA(lv_root_uuid) = ls_header_fields-name. + ENDIF. + ENDLOOP. + + cl_abap_unit_assert=>assert_equals( msg = |Table { lv_tablename } has no field { mo_cut->field_name-root_uuid }| exp = mo_cut->field_name-root_uuid act = lv_root_uuid ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + + + ENDTRY. + + + "ZDMO_cx_rap_generator=>table_does_not_exist + ENDMETHOD. + + + METHOD get_fields_from_view. + + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA(lv_view_name) = gc_view_name. + "DATA(lv_tablename) = gc_child_table. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-cds_view ). + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_object_id( CONV #( gc_view_object_id ) ). + mo_cut->set_field_name_etag_master( gc_view_etag_master ). + "ZDMO_agency + mo_cut->set_cds_view( CONV #( lv_view_name ) ). + mo_cut->get_fields( ). + DATA(lt_fields) = mo_cut->lt_fields. + "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ). + cl_abap_unit_assert=>assert_not_initial( + EXPORTING + act = lt_fields + msg = 'No fields retrieved' + ). +* LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields) WHERE name <> mo_cut->field_name-client. +* IF ls_header_fields-name = mo_cut->field_name-etag_master. +* DATA(lv_etag_master) = ls_header_fields-name. +* ENDIF. +* ENDLOOP. + READ TABLE mo_cut->lt_fields WITH KEY name = mo_cut->field_name-etag_master INTO DATA(ls_etag_master). + IF sy-subrc = 0. + DATA(lv_etag_master) = ls_etag_master-name. + ENDIF. + cl_abap_unit_assert=>assert_equals( msg = |View { lv_view_name } has no field { mo_cut->field_name-etag_master }| exp = mo_cut->field_name-etag_master act = lv_etag_master ). + + + DATA(no_data_element_internal_type) = abap_false. + + LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields). + + IF ls_header_fields-is_built_in_type = abap_false AND + ls_header_fields-is_data_element = abap_false. + + cl_abap_unit_assert=>fail( msg = |Data source: { mo_cut->data_source_name } Field: { ls_header_Fields-name } No data element and internal type found. | ). + + ENDIF. + ENDLOOP. + + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + + + ENDTRY. + + + + ENDMETHOD. + + METHOD get_fields_from_view_entity. + + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA(lv_view_name) = gc_view_entity_name. + "DATA(lv_tablename) = gc_child_table. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-cds_view ). + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_object_id( CONV #( gc_view_entity_object_id ) ). + mo_cut->set_field_name_etag_master( gc_view_entity_etag_master ). + "ZDMO_agency + mo_cut->set_cds_view( CONV #( lv_view_name ) ). + mo_cut->get_fields( ). + DATA(lt_fields) = mo_cut->lt_fields. + "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ). + cl_abap_unit_assert=>assert_not_initial( + EXPORTING + act = lt_fields + msg = 'No fields retrieved' + ). + +* LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields) WHERE name <> mo_cut->field_name-client. +* IF ls_header_fields-name = mo_cut->field_name-etag_master. +* DATA(lv_etag_master) = ls_header_fields-name. +* ENDIF. +* ENDLOOP. + + READ TABLE mo_cut->lt_fields WITH KEY name = mo_cut->field_name-etag_master INTO DATA(ls_etag_master). + IF sy-subrc = 0. + DATA(lv_etag_master) = ls_etag_master-name. + ENDIF. + + cl_abap_unit_assert=>assert_equals( msg = |View { lv_view_name } has no field { mo_cut->field_name-etag_master }| exp = mo_cut->field_name-etag_master act = lv_etag_master ). + + + DATA(no_data_element_internal_type) = abap_false. + + LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields). + + IF ls_header_fields-is_built_in_type = abap_false AND + ls_header_fields-is_data_element = abap_false. + + cl_abap_unit_assert=>fail( msg = |Data source: { mo_cut->data_source_name } Field: { ls_header_Fields-name } No data element and internal type found. | ). + + ENDIF. + ENDLOOP. + + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + + + ENDTRY. + + + + ENDMETHOD. + + + METHOD get_fields_from_abstractentity. + + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + DATA(lv_view_name) = gc_abstract_entity_name. + "DATA(lv_tablename) = gc_child_table. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-cds_view ). + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_object_id( CONV #( gc_abstract_entity_object_id ) ). + mo_cut->set_field_name_etag_master( gc_abstract_entity_etag_master ). + "ZDMO_agency + mo_cut->set_cds_view( CONV #( lv_view_name ) ). + mo_cut->get_fields( ). + DATA(lt_fields) = mo_cut->lt_fields. + "cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>root_cause_exception not raised' ). + cl_abap_unit_assert=>assert_not_initial( + EXPORTING + act = lt_fields + msg = 'No fields retrieved' + ). +* LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields) WHERE name <> mo_cut->field_name-client. +* IF ls_header_fields-name = mo_cut->field_name-etag_master. +* DATA(lv_etag_master) = ls_header_fields-name. +* ENDIF. +* ENDLOOP. + + READ TABLE mo_cut->lt_fields WITH KEY name = mo_cut->field_name-etag_master INTO DATA(ls_etag_master). + IF sy-subrc = 0. + DATA(lv_etag_master) = ls_etag_master-name. + ENDIF. + + cl_abap_unit_assert=>assert_equals( msg = |View { lv_view_name } has no field { mo_cut->field_name-etag_master }| exp = mo_cut->field_name-etag_master act = lv_etag_master ). + + + DATA(no_data_element_internal_type) = abap_false. + + LOOP AT mo_cut->lt_fields INTO DATA(ls_header_fields). + + IF ls_header_fields-is_built_in_type = abap_false AND + ls_header_fields-is_data_element = abap_false. + + cl_abap_unit_assert=>fail( msg = |Data source: { mo_cut->data_source_name } Field: { ls_header_Fields-name } No data element and internal type found. | ). + + ENDIF. + ENDLOOP. + + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + + + ENDTRY. + + + + ENDMETHOD. + + + METHOD set_table. + DATA(lv_expected_name) = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_table( 'DoesNotExist' ). + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>table_does_not_exist not raised' ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>table_does_not_exist-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>table_does_not_exist-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + + ENDTRY. + "ZDMO_cx_rap_generator=>table_does_not_exist + ENDMETHOD. + + METHOD check_set_objectid_wo_data_src. + TRY. + mo_cut = NEW zdmo_cl_rap_node( ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + + + + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_is_root_node( ). + mo_cut->set_data_source_type( mo_cut->data_source_types-table ). + mo_cut->set_implementation_type( mo_cut->implementation_type-managed_uuid ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + "mo_cut->set_table( CONV #( gc_root_table_MU ) ). + mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ). + mo_cut->finalize( ). + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>no_datasource_set not raised' ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>no_data_source_set-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>no_data_source_set-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + ENDTRY. + + ENDMETHOD. + + METHOD check_for_key_field_uuid. + + TEST-INJECTION get_mock_data_fields. + + lt_fields = VALUE #( + ( name = 'CLIENT' key_indicator = 'X' not_null = 'X' cds_view_field = 'Client' ) + "( name = 'UUID' key_indicator = 'X' not_null = 'X' cds_view_field = 'Uuid' ) + ( name = 'TRAVEL_ID' cds_view_field = 'TravelId' ) + ( name = 'AGENCY_ID' cds_view_field = 'AgencyId' ) + ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' ) + ( name = 'BEGIN_DATE' cds_view_field = 'BeginDate' ) + ( name = 'END_DATE' cds_view_field = 'EndDate' ) + ( name = 'BOOKING_FEE' cds_view_field = 'BookingFee' ) + ( name = 'TOTAL_PRICE' cds_view_field = 'TotalPrice' ) + ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' ) + ( name = 'DESCRIPTION' cds_view_field = 'Description' ) + ( name = 'OVERALL_STATUS' cds_view_field = 'OverallStatus' ) + ( name = 'CREATED_BY' cds_view_field = 'CreatedBy' ) + ( name = 'CREATED_AT' cds_view_field = 'CreatedAt' ) + ( name = 'LAST_CHANGED_BY' cds_view_field = 'LastChangedBy' ) + ( name = 'LAST_CHANGED_AT' cds_view_field = 'LastChangedAt' ) + ). + + END-TEST-INJECTION. + + + TRY. + + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + + + + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ). + + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + + + mo_cut->set_data_source( CONV #( gc_root_table_MU ) ). + mo_cut->set_object_id( CONV sxco_ad_field_name( gc_root_table_sem_key_mu ) ). + mo_cut->finalize( ). + + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>field_uuid_missing not raised' ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_uuid_missing-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_uuid_missing-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + ENDTRY. + + + ENDMETHOD. + + METHOD check_for_client_field. + TEST-INJECTION get_mock_data_fields. + + lt_fields = VALUE #( + ( name = 'WRONGCLIENT' key_indicator = 'X' not_null = 'X' cds_view_field = 'Client' ) + ( name = 'UUID' key_indicator = 'X' data_element = 'SYSUUID_X16' not_null = 'X' cds_view_field = 'Uuid' ) + ( name = 'TRAVEL_ID' cds_view_field = 'TravelId' ) + ( name = 'AGENCY_ID' cds_view_field = 'AgencyId' ) + ( name = 'CUSTOMER_ID' cds_view_field = 'CustomerId' ) + ( name = 'BEGIN_DATE' cds_view_field = 'BeginDate' ) + ( name = 'END_DATE' cds_view_field = 'EndDate' ) + ( name = 'BOOKING_FEE' cds_view_field = 'BookingFee' ) + ( name = 'TOTAL_PRICE' cds_view_field = 'TotalPrice' ) + ( name = 'CURRENCY_CODE' cds_view_field = 'CurrencyCode' ) + ( name = 'DESCRIPTION' cds_view_field = 'Description' ) + ( name = 'OVERALL_STATUS' cds_view_field = 'OverallStatus' ) + ( name = 'CREATED_BY' cds_view_field = 'CreatedBy' ) + ( name = 'CREATED_AT' cds_view_field = 'CreatedAt' ) + ( name = 'LAST_CHANGED_BY' cds_view_field = 'LastChangedBy' ) + ( name = 'LAST_CHANGED_AT' cds_view_field = 'LastChangedAt' ) + ). + + END-TEST-INJECTION. + + + TRY. + + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + + + + + TRY. + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ). + + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + + + mo_cut->set_data_source( CONV #( gc_root_table_MU ) ). + mo_cut->set_object_id( CONV sxco_ad_field_name( gc_root_table_sem_key_mu ) ). + mo_cut->finalize( ). + + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>CLNT_is_not_key_field not raised' ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>CLNT_is_not_key_field-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>CLNT_is_not_key_field-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + ENDTRY. + + ENDMETHOD. + + METHOD check_for_parent_key_field. + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + + + + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + + + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_root( mo_cut ). + mo_cut->set_parent( mo_cut ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ). + mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ). + mo_cut->set_table( CONV #( gc_root_table_MU ) ). + mo_cut->set_field_name_uuid( gc_root_table_uuid ). + mo_cut->set_object_id( CONV sxco_ad_field_name( gc_root_table_sem_key_mu ) ). + " mo_cut->set_semantic_key_fields( VALUE #( ( CONV #( gc_root_table_sem_key_mu ) ) ) ). + mo_cut->finalize( ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + DATA(child1_bo) = mo_cut->add_child( ). + child1_bo->set_entity_name( gc_entity_child1 ). + child1_bo->set_table( iv_table = CONV #( gc_child_table_MU ) ). + child1_bo->set_object_id( CONV #( gc_child_table_sem_key_mu ) ). + child1_bo->set_field_name_uuid( gc_child_table_uuid ). + child1_bo->set_field_name_parent_uuid( 'does_not_exist' ). + child1_bo->finalize( ). + + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>field_parent_uuid_missing not raised' ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_parent_uuid_missing-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_parent_uuid_missing-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + + ENDTRY. + + ENDMETHOD. + + METHOD check_for_root_key_field. + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + + + + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-managed_uuid ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ). + + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_root( mo_cut ). + mo_cut->set_parent( mo_cut ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ). + mo_cut->set_table( CONV #( gc_root_table_MU ) ). + mo_cut->set_field_name_uuid( gc_root_table_uuid ). + "mo_cut->set_semantic_key_fields( VALUE #( ( CONV #( gc_root_table_sem_key_mu ) ) ) ). + mo_cut->finalize( ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + DATA(child1_bo) = mo_cut->add_child( ). + child1_bo->set_entity_name( gc_entity_child1 ). + child1_bo->set_table( iv_table = CONV #( gc_child_table_MU ) ). + "child1_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( CONV #( gc_child_table_sem_key_mu ) ) ) ). + child1_bo->set_object_id( CONV #( gc_child_table_sem_key_mu ) ). + child1_bo->set_field_name_uuid( gc_child_table_uuid ). + child1_bo->finalize( ). + + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + + ENDTRY. + + TRY. + DATA(child11_bo) = child1_bo->add_child( ). + child11_bo->set_entity_name( gc_entity_grandchild11 ). + child11_bo->set_table( iv_table = CONV #( gc_grandchild_table_mu ) ). + "child11_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( CONV #( gc_child_table_sem_key_mu ) ) ) ). + child11_bo->set_object_id( CONV #( gc_grandchild_table_sem_key_mu ) ). + child11_bo->set_field_name_uuid( gc_grand_child_table_uuid ). + child11_bo->set_field_name_root_uuid( 'does_not_exist' ). + child11_bo->finalize( ). + + cl_abap_unit_assert=>fail( msg = 'Exception ZDMO_cx_rap_generator=>field_root_uuid_missing not raised' ). + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_root_uuid_missing-msgid + act = lx_rap_generator->if_t100_message~t100key-msgid ). + + cl_abap_unit_assert=>assert_equals( exp = ZDMO_cx_rap_generator=>field_root_uuid_missing-msgno + act = lx_rap_generator->if_t100_message~t100key-msgno ). + + + ENDTRY. + ENDMETHOD. + + METHOD create_root_with_childs_u. + DATA lv_name TYPE string. + DATA lv_expected_name TYPE string. + + TRY. + mo_cut = NEW zdmo_cl_rap_node( mo_xco_lib ). + CATCH ZDMO_cx_rap_generator INTO DATA(lx_rap_generator). + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + mo_cut->set_is_root_node( ). + mo_cut->set_implementation_type( zdmo_cl_rap_node=>implementation_type-unmanaged_semantic ). + + mo_cut->set_entity_name( gc_root_entity_name ). + mo_cut->set_root( mo_cut ). + mo_cut->set_parent( mo_cut ). + mo_cut->set_object_id( CONV #( gc_root_table_sem_key_mu ) ). + mo_cut->set_data_source_type( zdmo_cl_rap_node=>data_source_types-table ). + mo_cut->set_namespace( gc_namespace_z ). + mo_cut->set_prefix( gc_prefix_rap ). + mo_cut->set_suffix( gc_suffix_4711 ). + mo_cut->set_table( 'ZDMO_TRAVEL' ). + mo_cut->set_semantic_key_fields( VALUE #( ( 'TRAVEL_ID' ) ) ). + mo_cut->set_field_name_etag_master( gc_etag_master_mu ). + mo_cut->finalize( ). + + DATA(child1_bo) = mo_cut->add_child( ). + child1_bo->set_entity_name( gc_entity_child1 ). + child1_bo->set_table( iv_table = 'ZDMO_BOOKING' ). + child1_bo->set_object_id( 'BOOKING_ID' ). + child1_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( 'BOOKING_ID' ) ( 'TRAVEL_ID' ) ) ). + child1_bo->finalize( ). + + DATA(child2_bo) = mo_cut->add_child( ). + child2_bo->set_entity_name( gc_entity_child2 ). + child2_bo->set_table( iv_table = 'ZDMO_BOOKING' ). + child2_bo->set_object_id( 'BOOKING_ID' ). + child2_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( 'BOOKING_ID' ) ( 'TRAVEL_ID' ) ) ). + child2_bo->finalize( ). + + + DATA(child11_bo) = child1_bo->add_child( ). + child11_bo->set_entity_name( gc_entity_grandchild11 ). + child11_bo->set_table( iv_table = 'ZDMO_BOOK_SUPPL' ). + child11_bo->set_semantic_key_fields( it_semantic_key = VALUE #( ( 'BOOKING_SUPPLEMENT_ID' ) ( 'BOOKING_ID' ) ( 'TRAVEL_ID' ) ) ). + child11_bo->set_object_id( 'BOOKING_SUPPLEMENT_ID'). + child11_bo->finalize( ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + + TRY. + + lv_expected_name = |{ gc_namespace_z }I_{ gc_prefix_rap }{ gc_root_entity_name }{ gc_suffix_4711 }|. + lv_name = mo_cut->rap_root_node_objects-behavior_definition_r. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_namespace_z }I_{ gc_prefix_rap }{ gc_entity_child1 }{ gc_suffix_4711 }|. + lv_name = child1_bo->rap_node_objects-cds_view_i. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_namespace_z }BP_I_{ gc_prefix_rap }{ gc_entity_child2 }{ gc_suffix_4711 }|. + lv_name = child2_bo->rap_node_objects-behavior_implementation. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_namespace_z }C_{ gc_prefix_rap }{ gc_entity_grandchild11 }{ gc_suffix_4711 }|. + lv_name = child11_bo->rap_node_objects-cds_view_p. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + lv_expected_name = |{ gc_root_entity_name }|. + lv_name = child11_bo->root_node->entityname. + cl_abap_unit_assert=>assert_equals( exp = lv_expected_name act = lv_name ). + + CATCH ZDMO_cx_rap_generator INTO lx_rap_generator. + cl_abap_unit_assert=>fail( msg = lx_rap_generator->get_text( ) ). + ENDTRY. + ENDMETHOD. + +ENDCLASS. diff --git a/src/zdmo_cl_rap_node.clas.xml b/src/zdmo_cl_rap_node.clas.xml new file mode 100644 index 0000000..782556b --- /dev/null +++ b/src/zdmo_cl_rap_node.clas.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_NODE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>node proxy base class</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + <WITH_UNIT_TESTS>X</WITH_UNIT_TESTS> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_xco_cloud_lib.clas.abap b/src/zdmo_cl_rap_xco_cloud_lib.clas.abap new file mode 100644 index 0000000..1bfa706 --- /dev/null +++ b/src/zdmo_cl_rap_xco_cloud_lib.clas.abap @@ -0,0 +1,266 @@ +CLASS zdmo_cl_rap_xco_cloud_lib DEFINITION INHERITING FROM ZDMO_cl_rap_xco_lib + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + + METHODS get_aggregated_annotations REDEFINITION. + METHODS get_behavior_definition REDEFINITION. + METHODS get_class REDEFINITION. + METHODS get_database_table REDEFINITION. + METHODS get_data_definition REDEFINITION. + METHODS get_metadata_extension REDEFINITION. + METHODS get_package REDEFINITION. + METHODS get_service_binding REDEFINITION. + METHODS get_service_definition REDEFINITION. + METHODS get_structure REDEFINITION. + METHODS get_view_entity REDEFINITION. + METHODS get_view REDEFINITION. + METHODS get_entity REDEFINITION. + METHODS get_abstract_entity REDEFINITION. + METHODS get_views REDEFINITION. + METHODS get_tables REDEFINITION. + METHODS get_structures REDEFINITION. + METHODS get_packages REDEFINITION. + METHODS service_binding_is_published REDEFINITION. + METHODS get_abap_obj_directory_entry REDEFINITION. + METHODS get_objects_in_package REDEFINITION. + + METHODS publish_service_binding REDEFINITION. + METHODS un_publish_service_binding REDEFINITION. + + METHODS get_sap_object_node_type REDEFINITION. + METHODS get_sap_object_type REDEFINITION. + + PROTECTED SECTION. + PRIVATE SECTION. + + + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_XCO_CLOUD_LIB IMPLEMENTATION. + + + METHOD get_abap_obj_directory_entry. + SELECT SINGLE * FROM + I_CustABAPObjDirectoryEntry "ObjDirectoryEntry + WHERE ABAPObjectType = @i_abap_object_type + AND ABAPObjectCategory = @i_abap_object_category + AND ABAPObject = @i_abap_object + INTO CORRESPONDING FIELDS OF @r_abap_object_directory_entry. + ENDMETHOD. + + + METHOD get_abstract_entity. + ro_abstract_entity = xco_cp_cds=>abstract_entity( iv_name ). + ENDMETHOD. + + + METHOD get_aggregated_annotations. + ro_aggregated_annotations = xco_cp_cds=>annotations->aggregated->of( io_field ). + ENDMETHOD. + + + METHOD get_behavior_definition. + ro_behavior_definition = xco_cp_abap_repository=>object->bdef->for( iv_name ). + ENDMETHOD. + + + METHOD get_class. + ro_class = xco_cp_abap_repository=>object->clas->for( iv_name ). + ENDMETHOD. + + + METHOD get_database_table. + ro_table = xco_cp_abap_repository=>object->tabl->database_table->for( iv_name ). + ENDMETHOD. + + + METHOD get_data_definition. + ro_data_definition = xco_cp_abap_repository=>object->ddls->for( iv_name ). + ENDMETHOD. + + + METHOD get_entity. + ro_entity = xco_cp_cds=>entity( iv_name ). + ENDMETHOD. + + + METHOD get_metadata_extension. + ro_metadata_extension = xco_cp_abap_repository=>object->ddlx->for( iv_name ). + ENDMETHOD. + + + METHOD get_objects_in_package. + SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPPackage = @i_package + INTO CORRESPONDING FIELDS OF TABLE @r_objects_in_package . + ENDMETHOD. + + + METHOD get_package. + ro_package = xco_cp_abap_repository=>object->devc->for( iv_name ). + ENDMETHOD. + + + METHOD get_packages. + IF it_filters IS NOT INITIAL. + rt_packages = xco_cp_abap_repository=>objects->devc->where( it_Filters +* VALUE #( +* ( io_filter ) +* ) + )->in( xco_cp_abap=>repository )->get( ). + ELSE. + rt_packages = xco_cp_abap_repository=>objects->devc->all->in( xco_cp_abap=>repository )->get( ). + ENDIF. + ENDMETHOD. + + + METHOD get_sap_object_node_type. + ro_sap_object_node_type = xco_cp_abap_repository=>object->nont->for( iv_name ). + ENDMETHOD. + + + METHOD get_sap_object_type. + ro_sap_object_type = xco_cp_abap_repository=>object->ront->for( iv_name ). + ENDMETHOD. + + + METHOD get_service_binding. + ro_service_binding = xco_cp_abap_repository=>object->srvb->for( iv_name ). + ENDMETHOD. + + + METHOD get_service_definition. + ro_service_definition = xco_cp_abap_repository=>object->srvd->for( iv_name ). + ENDMETHOD. + + + METHOD get_structure. + ro_structure = xco_cp_abap_repository=>object->tabl->structure->for( iv_name ). + ENDMETHOD. + + + METHOD get_structures. + IF it_filters IS NOT INITIAL. + rt_structures = xco_cp_abap_repository=>objects->tabl->structures->where( it_filters +* VALUE #( +* ( io_filter ) +* ) + )->in( xco_cp_abap=>repository )->get( ). + ELSE. + rt_structures = xco_cp_abap_repository=>objects->tabl->structures->all->in( xco_cp_abap=>repository )->get( ). + ENDIF. + ENDMETHOD. + + + METHOD get_tables. + IF it_filters IS NOT INITIAL. + rt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->where( it_filters +* VALUE #( +* ( io_filter ) +* ) + )->in( xco_cp_abap=>repository )->get( ). + + ELSE. + rt_tables = xco_cp_abap_repository=>objects->tabl->database_tables->all->in( xco_cp_abap=>repository )->get( ). + ENDIF. + ENDMETHOD. + + + METHOD get_view. + ro_view = xco_cp_cds=>view( iv_name ). + ENDMETHOD. + + + METHOD get_views. + IF it_filters IS NOT INITIAL. + rt_data_definitions = xco_cp_abap_repository=>objects->ddls->where( it_filters +* VALUE #( +* ( io_filter ) +* ) + )->in( xco_cp_abap=>repository )->get( ). + ELSE. + rt_data_definitions = xco_cp_abap_repository=>objects->ddls->all->in( xco_cp_abap=>repository )->get( ). + ENDIF. + ENDMETHOD. + + + METHOD get_view_entity. + ro_view_entity = xco_cp_cds=>view_entity( iv_name ). + ENDMETHOD. + + + METHOD publish_service_binding. +* DATA(lo_service_binding) = xco_cp_abap_repository=>object->srvb->for( '$SERVICE_BINDING_NAME$' ). + + DATA(lo_service_binding) = get_service_binding( i_service_binding ). + + " First we check whether the local service endpoint for LO_SERVICE_BINDING is + " currently published. + DATA(lv_is_published) = xco_cp_service_binding=>local_service_endpoint->odata_v4->is_published( lo_service_binding ). + + " Depending on whether the local service endpoint is currently published we either + " trigger an unpublish or a publish of the local service endpoint. + DATA lo_operation TYPE REF TO if_xco_srvb_operation. + + IF lv_is_published EQ abap_false. +* lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->unpublish( lo_service_binding ). +* ELSE. + lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->publish( lo_service_binding ). + " Note that both a publish as well as an unpublish operation are concrete + " realizations of an IF_XCO_SRVB_OPERATION and can thus be treated uniformly. + " Regardless of the concrete realization of the operation, its execution can + " always be triggered via the method EXECUTE. + lo_operation->execute( ). + ENDIF. + + + ENDMETHOD. + + + METHOD service_binding_is_published. + r_is_published = abap_false. + + "object names in I_CustABAPObjDirectoryEntry are stored in upper case + "( ABAPObjectCategory = 'R3TR' ABAPObjectType = 'SIA6' ABAPObject = 'ZUI_BDTSTRAVEL_O4_0001_G4BA_IBS' + + DATA(filter_string) = to_upper( i_service_binding && '%' ). + + SELECT * FROM I_CustABAPObjDirectoryEntry WHERE ABAPObject LIKE @filter_string + AND ABAPObjectType = 'SIA6' + INTO TABLE @DATA(published_srvb_entries). + + IF lines( published_srvb_entries ) > 0. + r_is_published = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD un_publish_service_binding. + + DATA(lo_service_binding) = get_service_binding( i_service_binding ). + + " First we check whether the local service endpoint for LO_SERVICE_BINDING is + " currently published. + DATA(lv_is_published) = xco_cp_service_binding=>local_service_endpoint->odata_v4->is_published( lo_service_binding ). + + " Depending on whether the local service endpoint is currently published we either + " trigger an unpublish or a publish of the local service endpoint. + DATA lo_operation TYPE REF TO if_xco_srvb_operation. + + IF lv_is_published EQ abap_true. + lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->unpublish( lo_service_binding ). +* ELSE. +* lo_operation = xco_cp_service_binding=>local_service_endpoint->odata_v4->operation->publish( lo_service_binding ). + " Note that both a publish as well as an unpublish operation are concrete + " realizations of an IF_XCO_SRVB_OPERATION and can thus be treated uniformly. + " Regardless of the concrete realization of the operation, its execution can + " always be triggered via the method EXECUTE. + lo_operation->execute( ). + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_xco_cloud_lib.clas.xml b/src/zdmo_cl_rap_xco_cloud_lib.clas.xml new file mode 100644 index 0000000..c13172e --- /dev/null +++ b/src/zdmo_cl_rap_xco_cloud_lib.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_XCO_CLOUD_LIB</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>xco cloud apis</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_xco_json_visitor.clas.abap b/src/zdmo_cl_rap_xco_json_visitor.clas.abap new file mode 100644 index 0000000..12989c9 --- /dev/null +++ b/src/zdmo_cl_rap_xco_json_visitor.clas.abap @@ -0,0 +1,969 @@ +CLASS zdmo_cl_rap_xco_json_visitor DEFINITION + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES: + if_xco_json_tree_visitor. + DATA root_node TYPE REF TO ZDMO_cl_rap_node READ-ONLY. + + METHODS constructor + IMPORTING io_root_node TYPE REF TO ZDMO_cl_rap_node + RAISING ZDMO_cx_rap_generator. + + DATA visits TYPE string_table READ-ONLY. + + PROTECTED SECTION. + PRIVATE SECTION. + + TYPES: BEGIN OF t_valuehelp, + alias TYPE sxco_ddef_alias_name, + name TYPE sxco_cds_object_name, + local_element TYPE sxco_cds_field_name, + element TYPE sxco_cds_field_name, + additional_binding TYPE ZDMO_cl_rap_node=>tt_addtionalbinding, + useforvalidation TYPE abap_bool, + END OF t_valuehelp. + + TYPES: BEGIN OF t_association, + name TYPE sxco_ddef_alias_name, + target TYPE sxco_cds_object_name, + cardinality TYPE string, + condition_fields TYPE ZDMO_cl_rap_node=>tt_condition_fields, + END OF t_association. + +* TYPES : BEGIN OF t_objects_with_add_fields, +* object TYPE string, +* additional_fields TYPE ZDMO_cl_rap_node=>tt_additional_fields_old, +* "localized TYPE abap_bool, +* END OF t_objects_with_add_fields. + + + TYPES tt_node_number TYPE STANDARD TABLE OF i. + + DATA: + + json_schema TYPE string, + parent_node TYPE REF TO ZDMO_cl_rap_node, + last_visited_member TYPE string, + current_node TYPE REF TO ZDMO_cl_rap_node, + object_number TYPE i, + array_level TYPE i, + array_level_children TYPE i, + array_level_valuehelps TYPE i, + array_level_associations TYPE i, + array_level_obj_with_add_f TYPE i, + in_value_helps TYPE abap_bool, + in_additional_binding TYPE abap_bool, + in_associations TYPE abap_bool, + in_conditions TYPE abap_bool, + in_mapping TYPE abap_bool, + in_fields TYPE abap_bool, + "in_objects_with_add_fields TYPE abap_bool, + in_additional_fields TYPE abap_bool, + in_keys TYPE abap_bool, + additional_binding TYPE ZDMO_cl_rap_node=>ts_additionalbinding, + value_help TYPE t_valuehelp, + condition_fields TYPE ZDMO_cl_rap_node=>ts_condition_fields, + association TYPE t_association, + additional_field TYPE ZDMO_cl_rap_node=>ts_additional_fields, + additional_fields TYPE ZDMO_cl_rap_node=>tt_additional_fields, +* objects_with_add_fields TYPE t_objects_with_add_fields, + field_mappings TYPE HASHED TABLE OF if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping + WITH UNIQUE KEY cds_view_field dbtable_field, + field_mapping TYPE if_xco_gen_bdef_s_fo_b_mapping=>ts_field_mapping, + key_fields TYPE TABLE OF sxco_ad_field_name, + field TYPE ZDMO_cl_rap_node=>ts_field, + fields TYPE ZDMO_cl_rap_node=>tt_fields, + node_number_stack TYPE tt_node_number. + + DATA last_entity TYPE string. + + METHODS in_any_array RETURNING VALUE(r_in_any_array) TYPE abap_bool. + +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_XCO_JSON_VISITOR IMPLEMENTATION. + + + METHOD constructor. + root_node = io_root_node. + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~enter_array. + array_level += 1. + CASE last_visited_member. + WHEN 'keys'. + CLEAR key_fields. + in_keys = abap_true. + WHEN 'children'. + APPEND |Enter array , node_number { current_node->node_number } , last_visited_member { last_visited_member } , entity { current_node->entityname }| TO visits. + +* IF current_node->is_child( ) OR current_node->is_grand_child_or_deeper( ). +* parent_node = current_node. +* ENDIF. + parent_node = current_node. + +* in_children = abap_true. + array_level_children = array_level. + WHEN 'valuehelps'. + in_value_helps = abap_true. + array_level_valuehelps = array_level. + WHEN 'additionalbinding'. + in_additional_binding = abap_true. + WHEN 'associations'. + in_associations = abap_true. + array_level_associations = array_level. + WHEN 'conditions'. + in_conditions = abap_true. +* WHEN 'objectswithadditionalfields'. +* in_objects_with_add_fields = abap_true. +* array_level_obj_with_add_f = array_level. + WHEN 'additionalfields'. + in_additional_fields = abap_true. + WHEN 'mapping'. + in_mapping = abap_true. + WHEN 'fields'. + in_fields = abap_true. + WHEN OTHERS. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_array_name + mv_value = last_visited_member. + ENDCASE. + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~enter_object. + + object_number += 1. + + IF last_visited_member = 'hierarchy'. + DATA(a) = 1. + ENDIF. + + IF in_additional_binding = abap_true. + CLEAR additional_binding. + ENDIF. + + IF in_conditions = abap_true. + CLEAR condition_fields. + ENDIF. + + IF in_additional_fields = abap_true. + CLEAR additional_field. + ENDIF. + + IF in_mapping = abap_true. + CLEAR field_mapping. + ENDIF. + + IF in_fields = abap_true. + CLEAR field. + ENDIF. + + + + IF in_additional_binding = abap_false AND + in_associations = abap_false AND + in_value_helps = abap_false AND + in_conditions = abap_false AND + in_mapping = abap_false AND + in_fields = abap_false AND + "in_objects_with_add_fields = abap_false AND + in_additional_fields = abap_false. + + IF object_number > 1. + + DATA(is_in_any_array) = in_any_array( ). + + IF current_node IS INITIAL. + parent_node = root_node. + current_node = root_node. + ELSE. + current_node = parent_node->add_child( ). + ENDIF. + + APPEND current_node->node_number TO node_number_stack. + + DATA(msg) = |Enter obj , node_number { current_node->node_number }, last_visited_member { last_visited_member } parent { parent_node->entityname } last { last_entity }| . + msg = msg && |object number { object_number }|. + msg = msg && |array_level { array_level }|. + msg = msg && |array_level_children { array_level_children }|. + APPEND msg TO visits. + ENDIF. + + ENDIF. + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~leave_array. + + array_level -= 1. + + IF in_additional_binding = abap_true . + in_additional_binding = abap_false. + ELSEIF in_value_helps = abap_true . + in_value_helps = abap_false. + ELSEIF in_conditions = abap_true. + in_conditions = abap_false. + ELSEIF in_associations = abap_true. + in_associations = abap_false. + ELSEIF in_additional_fields = abap_true. + in_additional_fields = abap_false. + + IF object_number = 1. + root_node->add_additional_fields( + EXPORTING + "iv_object = objects_with_add_fields-object + it_additional_fields = additional_fields + ). + CLEAR additional_fields. + + ELSE. + current_node->add_additional_fields( + EXPORTING + "iv_object = objects_with_add_fields-object + it_additional_fields = additional_fields + ). + CLEAR additional_fields. + ENDIF. + +* ELSEIF in_objects_with_add_fields = abap_true. +* in_objects_with_add_fields = abap_false. + + ELSEIF in_mapping = abap_true. + in_mapping = abap_false. + + IF object_number = 1. + root_node->set_mapping( + it_field_mappings = field_mappings + ). + CLEAR field_mappings. + ELSE. + current_node->set_mapping( + it_field_mappings = field_mappings + ). + CLEAR field_mappings. + ENDIF. + + ELSEIF in_fields = abap_true. + in_fields = abap_false. + + IF object_number = 1. + root_node->set_fields( + it_fields = fields + ). + + ELSE. + current_node->set_fields( + it_fields = fields + ). + + ENDIF. + +* loop at fields into data(field) where n. +* +* +* ENDLOOP. + + CLEAR fields. + CLEAR field_mappings. + + + ELSEIF in_keys = abap_true. + in_keys = abap_false. + current_node->set_semantic_key_fields( key_fields ). + CLEAR key_fields. + ELSE. + + DATA(is_in_any_array) = in_any_array( ). + DATA(a) = last_visited_member. + + + + + IF current_node->is_grand_child_or_deeper( ). + parent_node = current_node->parent_node->parent_node. +* current_node = current_node->parent_node. + ENDIF. + + IF current_node->is_child( ). + parent_node = current_node->parent_node. +* parent_node = root_node. +* current_node = current_node->parent_node. + ENDIF. + + APPEND |Leave array , node_number { current_node->node_number } , last_visited_member { last_visited_member } , entity { current_node->entityname } parent { parent_node->entityname } | TO visits. + + + ENDIF. + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~leave_object. + + object_number -= 1. + + "add valuehelp + + IF in_additional_binding = abap_true. + APPEND additional_binding TO value_help-additional_binding. + ENDIF. + + IF in_additional_binding = abap_false AND + in_value_helps = abap_true. + IF object_number = 1. + root_node->add_valuehelp( + EXPORTING + iv_alias = value_help-alias + iv_name = value_help-name + iv_localelement = value_help-local_element + iv_element = value_help-element + it_additional_binding = value_help-additional_binding + ). + CLEAR value_help. +*CATCH ZDMO_cx_rap_generator. + ELSE. + current_node->add_valuehelp( + EXPORTING + iv_alias = value_help-alias + iv_name = value_help-name + iv_localelement = value_help-local_element + iv_element = value_help-element + it_additional_binding = value_help-additional_binding + ). + CLEAR value_help. + ENDIF. + ENDIF. + + " add association + + IF in_conditions = abap_true. + APPEND condition_fields TO association-condition_fields. + ENDIF. + + IF in_conditions = abap_false AND + in_associations = abap_true. + IF object_number = 1. + root_node->add_association( + EXPORTING + iv_name = association-name + iv_target = association-target + it_condition_fields = association-condition_fields + iv_cardinality = association-cardinality + ). +* CATCH ZDMO_cx_rap_generator. + CLEAR association. +*CATCH ZDMO_cx_rap_generator. + ELSE. + current_node->add_association( + EXPORTING + iv_name = association-name + iv_target = association-target + it_condition_fields = association-condition_fields + iv_cardinality = association-cardinality + ). + CLEAR association. + ENDIF. + ENDIF. + + "add additonal fields + + IF in_additional_fields = abap_true. + APPEND additional_field TO additional_fields. + ENDIF. + + + + "add mapping + + IF in_mapping = abap_true. + INSERT field_mapping INTO TABLE field_mappings. + ENDIF. + + "add a field to the field list + IF in_fields = abap_true. + INSERT field INTO TABLE fields. + ENDIF. + + "check if we are leaving the object that defines a node + + IF in_any_array( ) = abap_false. + + DATA(a) = last_visited_member. + + DATA(num_of_childnodes) = lines( root_node->all_childnodes ). + DATA(num_of_parentnode) = current_node->parent_node->node_number. +* current_node = root_node->all_childnodes[ num_of_childnodes ]. + APPEND |Leave object , node_number { current_node->node_number } , last_visited_member { last_visited_member }, entity { current_node->entityname } | TO visits. + ENDIF. + "current_node->finalize( ). + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~on_end. + + + + LOOP AT root_node->all_childnodes INTO DATA(childnode). + childnode->finalize( ). + ENDLOOP. + + root_node->finalize( ). + +* DATA(my_bo_generator) = NEW zcl_rap_bo_generator( +* iv_package = root_node->package +* io_rap_bo_root_node = root_node +* ). +* +* DATA(lt_todos) = my_bo_generator->generate_bo( ). + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~on_start. + + CLEAR object_number. + "root_node = NEW ZDMO_cl_rap_node( ). + "root_node->set_is_root_node( ). + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~visit_boolean. + DATA error_message TYPE string. +* CHECK iv_value IS NOT INITIAL. + IF object_number = 1. + CASE last_visited_member. + + WHEN 'transactionalbehavior'. + root_node->set_has_transactional_behavior( iv_value ). + WHEN 'publishservice'. + root_node->set_publish_service( iv_value ). + WHEN 'addbasiciviews'. + root_node->set_add_basic_i_views( iv_value ). + WHEN 'isextensible'. + root_node->set_is_extensible( iv_value ). + WHEN 'draftenabled'. + root_node->set_draft_enabled( iv_value ). + WHEN 'addbusinessconfigurationregistration' . + root_node->add_to_manage_business_config( iv_value ). + WHEN 'skipactivation'. + root_node->set_skip_activation( iv_value ). + WHEN 'addmetadataextensions'. + root_node->set_add_meta_data_extensions( iv_value ). + WHEN 'iscustomizingtable'. + root_node->set_is_customizing_table( iv_value ). + WHEN 'multiinlineedit'. + root_node->add_multi_edit( iv_value ). + WHEN 'generateonlynodehierachy'. + root_node->set_generate_only_node_hierach( iv_value ). + WHEN 'createtable'. + root_node->set_create_table( iv_value ). + WHEN 'mimicadtwizard'. + root_node->set_mimic_adt_wizard( iv_value ). + when 'addsapobjecttype' . + root_node->set_add_sap_object_type( iv_value ). + WHEN OTHERS. + + error_message = |{ last_visited_member } in entity { root_node->entityname }| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + + ENDCASE. + ENDIF. + + + IF object_number > 1. + + IF in_value_helps = abap_true. + + CASE last_visited_member . + WHEN 'useforvalidation' . + value_help-useforvalidation = iv_value . + ENDCASE. + + + + ELSEIF in_additional_fields = abap_true. + + CASE last_visited_member . + WHEN 'localized'. + additional_field-localized = iv_value. + WHEN 'cdsinterfaceview'. + additional_field-cds_interface_view = iv_value . + WHEN 'cdsRestrictedReuseView'. + additional_field-cds_restricted_reuse_view = iv_value . + WHEN 'cdsprojectionview'. + additional_field-cds_projection_view = iv_value . + WHEN 'drafttable'. + additional_field-draft_table = iv_value . + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in objects with add. fields| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ELSEIF in_fields = abap_true. + + CASE last_visited_member . + WHEN 'iskey'. + field-key_indicator = iv_value . + WHEN 'notnull'. + field-not_null = iv_value . + WHEN 'isdomainfixedvalue'. + field-domain_fixed_value = iv_value . + WHEN 'ishidden'. + field-is_hidden = iv_value . + WHEN 'hasassociation'. + field-has_association = iv_value . + WHEN 'hasvaluehelp'. + field-has_valuehelp = iv_value . + WHEN 'isdataelement'. + field-is_data_element = iv_value . + WHEN 'isbuiltintype'. + field-is_built_in_type = iv_value . + WHEN 'iscurrencycode'. + field-is_currencycode = iv_value . + WHEN 'isunitofmeasure'. + field-is_unitofmeasure = iv_value . + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in fields| ##NO_TEXT. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ENDIF. + ENDIF. + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~visit_member. + + "we want to use camelCase in the json file + "but we do not want to enforce it here + + last_visited_member = to_lower( iv_name ). + + IF in_keys = abap_true. + DATA(key_field) = iv_name. + ENDIF. + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~visit_number. + DATA error_message TYPE string. + CHECK iv_value IS NOT INITIAL. + IF object_number = 1. + CASE last_visited_member. + +* WHEN 'transactionalbehavior'. +* root_node->add_transactional_behavior( iv_value ). + + WHEN OTHERS. + + error_message = |{ last_visited_member } in entity { root_node->entityname }| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + + ENDCASE. + ENDIF. + + + IF object_number > 1. + + IF in_additional_fields = abap_true. + + CASE last_visited_member . + WHEN 'builtintypelength'. + additional_field-built_in_type_length = iv_value. + WHEN 'builtintypedecimals'. + additional_field-built_in_type_decimals = iv_value . + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in objects with add. fields| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ELSEIF in_fields = abap_true. + + CASE last_visited_member . + WHEN 'builtintypelength'. + field-built_in_type_length = iv_value . + WHEN 'builtintypedecimals'. + field-built_in_type_decimals = iv_value . + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in fields| ##NO_TEXT. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + + ENDIF. + ENDIF. + + ENDMETHOD. + + + METHOD if_xco_json_tree_visitor~visit_string. + + DATA error_message TYPE string. + + IF iv_value IS INITIAL. + EXIT. + ENDIF. + + IF in_keys = abap_true. + APPEND iv_value TO key_fields. + ENDIF. + + IF object_number = 1. + CASE last_visited_member. + + + WHEN '$schema'. + json_schema = iv_value. + WHEN 'implementationtype'. + root_node->set_implementation_type( iv_value ). + WHEN 'namespace'. + root_node->set_namespace( CONV sxco_ar_object_name( iv_value ) ). + WHEN 'suffix'. + root_node->set_suffix( CONV sxco_ar_object_name( iv_value ) ). + WHEN 'prefix'. + root_node->set_prefix( CONV sxco_ar_object_name( iv_value ) ). + WHEN 'package'. + root_node->set_package( CONV sxco_package( iv_value ) ). + WHEN 'datasourcetype'. + root_node->set_data_source_type( iv_value ). + WHEN 'bindingtype'. + root_node->set_binding_type( iv_value ). + WHEN 'transportrequest'. + root_node->set_transport_request( CONV #( iv_value ) ). + WHEN 'businessconfigurationname'. + root_node->set_mbc_name( iv_value ). + WHEN 'businessconfigurationidentifier' . + root_node->set_mbc_identifier( iv_value ). + WHEN 'businessconfigurationdescription'. + root_node->set_mbc_description( iv_value ). + "WHEN 'extensibilityelementsuffix'. + " root_node->set_ext_element_suffix( iv_value ). + WHEN OTHERS. + + error_message = |{ last_visited_member } in entity { root_node->entityname }| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + + ENDCASE. + ENDIF. + + IF object_number > 1. + + IF in_additional_binding = abap_true. + + CASE last_visited_member . + + WHEN 'localelement'. + additional_binding-localelement = iv_value. + WHEN 'element'. + additional_binding-element = iv_value. + WHEN 'usage'. + additional_binding-usage = iv_value. + WHEN OTHERS. + + error_message = |{ last_visited_member } in entity { current_node->entityname } in additionalBinding| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ELSEIF in_value_helps = abap_true. + + CASE last_visited_member . + WHEN 'alias' . + value_help-alias = CONV sxco_cds_object_name( iv_value ). + WHEN 'name' . + value_help-name = CONV sxco_cds_object_name( iv_value ). + WHEN 'localelement'. + value_help-local_element = CONV sxco_cds_field_name( iv_value ). + WHEN 'element'. + value_help-element = CONV sxco_cds_field_name( iv_value ). + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in valueHelps| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + + ELSEIF in_conditions = abap_true. + + CASE last_visited_member . + WHEN 'projectionfield'. + condition_fields-projection_field = iv_value. + WHEN 'associationfield'. + condition_fields-association_field = iv_value. + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in conditions| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ELSEIF in_associations = abap_true. + + CASE last_visited_member . + WHEN 'name'. + association-name = CONV sxco_ddef_alias_name( iv_value ). + WHEN 'target' . + association-target = CONV sxco_cds_object_name( iv_value ). + WHEN 'cardinality'. + association-cardinality = iv_value. + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in associations| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ELSEIF in_additional_fields = abap_true. + + CASE last_visited_member . + WHEN 'name'. + additional_field-name = iv_value. + WHEN 'cdsviewfield'. + additional_field-cds_view_field = iv_value. + WHEN 'dataelement' . + additional_field-data_element = iv_value. + WHEN 'builtintype' . + additional_field-built_in_type = iv_value. + WHEN 'builtintypelength'. + additional_field-built_in_type_length = iv_value. + WHEN 'builtintypedecimals'. + additional_field-built_in_type_decimals = iv_value. + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in additional fields| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + +* ELSEIF in_objects_with_add_fields = abap_true. +* +* CASE last_visited_member . +* WHEN 'object'. +* objects_with_add_fields-object = iv_value . +* +* WHEN OTHERS. +* error_message = |{ last_visited_member } in entity { current_node->entityname } in objects with add. fields|. +* +* RAISE EXCEPTION TYPE ZDMO_cx_rap_generator +* EXPORTING +* textid = ZDMO_cx_rap_generator=>invalid_json_property_name +* mv_value = error_message. +* ENDCASE. + + ELSEIF in_mapping = abap_true. + CASE last_visited_member . + WHEN 'dbtable_field'. + field_mapping-dbtable_field = CONV sxco_cds_field_name( iv_value ). + WHEN 'cds_view_field' . + field_mapping-cds_view_field = CONV sxco_cds_field_name( iv_value ). + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in mapping| ##NO_TEXT. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + ELSEIF in_fields = abap_true. + + CASE last_visited_member . + WHEN 'abapfieldname'. + field-name = CONV sxco_cds_field_name( iv_value ). + WHEN 'domain' . + field-doma = CONV sxco_cds_field_name( iv_value ). + WHEN 'dataelement'. + field-data_element = CONV sxco_cds_field_name( iv_value ). + WHEN 'cdsviewfieldname'. + field-cds_view_field = CONV sxco_cds_field_name( iv_value ). + WHEN 'builtintype'. + field-built_in_type = CONV sxco_cds_field_name( iv_value ). + WHEN 'currencycode'. + field-currencycode = CONV sxco_cds_field_name( iv_value ). + WHEN 'unitofmeasure'. + field-unitofmeasure = CONV sxco_cds_field_name( iv_value ). + + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname } in fields| ##NO_TEXT. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + ENDCASE. + + + ELSEIF in_keys = abap_true. + DATA(test) = iv_value. + ELSE. + + CASE last_visited_member . + WHEN 'keys'. + "do nothing + + WHEN 'entityname'. + current_node->set_entity_name( CONV #( iv_value ) ). + last_entity = iv_value. + WHEN 'datasource'. + current_node->set_data_source( iv_value ). + WHEN 'persistenttable' . + current_node->set_persistent_table( iv_value ). + WHEN 'objectid'. + "current_node->set_semantic_key_fields( it_semantic_key = VALUE #( ( CONV #( iv_value ) ) ) ). + current_node->set_object_id( CONV sxco_ad_field_name( iv_value ) ). + WHEN 'uuid'. + current_node->set_field_name_uuid( iv_value ). + WHEN 'parentuuid'. + current_node->set_field_name_parent_uuid( iv_value ). + WHEN 'rootuuid'. + current_node->set_field_name_root_uuid( iv_value ). + WHEN 'createdby'. + current_node->set_field_name_created_by( iv_value ). + WHEN 'createdat'. + current_node->set_field_name_created_at( iv_value ). + WHEN 'lastchangedby'. + current_node->set_field_name_last_changed_by( iv_value ). + WHEN 'lastchangedat'. + current_node->set_field_name_last_changed_at( iv_value ). + WHEN 'localinstancelastchangedat'. + current_node->set_field_name_loc_last_chg_at( iv_value ). + WHEN 'localinstancelastchangedby'. + current_node->set_field_name_loc_last_chg_by( iv_value ). + WHEN 'etagmaster'. + current_node->set_field_name_etag_master( iv_value ). + WHEN 'totaletag'. + current_node->set_field_name_total_etag( iv_value ). + WHEN 'client'. + current_node->set_field_name_client( iv_value ). + WHEN 'language'. + current_node->set_field_name_language( iv_value ). + WHEN 'drafttable'. + current_node->set_name_draft_table( iv_value ). + WHEN 'cdsinterfaceview' . + current_node->set_name_cds_i_view( CONV #( iv_value ) ). + WHEN 'cdsinterfaceviewbasic'. + current_node->set_name_cds_i_view_basic( CONV #( iv_value ) ). + WHEN 'cdsrestrictedreuseview' . + current_node->set_name_cds_r_view( CONV #( iv_value ) ). + WHEN 'cdsprojectionview'. + current_node->set_name_cds_p_view( CONV #( iv_value ) ). + WHEN 'metadataextensionview'. + current_node->set_name_mde( CONV #( iv_value ) ). + WHEN 'behaviorimplementationclass'. + current_node->set_name_behavior_impl( CONV #( iv_value ) ). + WHEN 'servicedefinition'. + current_node->set_name_service_definition( CONV #( iv_value ) ). + WHEN 'servicebinding'. + current_node->set_name_service_binding( CONV #( iv_value ) ). + WHEN 'controlstructure'. + current_node->set_name_control_structure( CONV #( iv_value ) ). + WHEN 'customqueryimplementationclass'. + current_node->set_name_custom_query_impl( CONV #( iv_value ) ). + WHEN 'extensioninclude'. + current_node->set_name_extension_include( CONV #( iv_value ) ). + WHEN 'extensionincludeview'. + current_node->set_name_extension_incl_view( CONV #( iv_value ) ). + WHEN 'draftqueryview'. + current_node->set_name_draft_query_view( CONV #( iv_value ) ). + + WHEN 'sapobjecttype'. + current_node->set_name_sap_object_type( CONV #( iv_value ) ). + WHEN 'sapobjectnodetype'. + current_node->set_name_sap_node_object_type( CONV #( iv_value ) ). + + WHEN 'extensibilityelementsuffix'. + current_node->set_ext_element_suffix( iv_value ). + + WHEN 'textelement' . + error_message = |{ last_visited_member } in entity { current_node->entityname }| ##NO_TEXT. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>not_implemented + mv_value = error_message. + WHEN 'description'. + error_message = |{ last_visited_member } in entity { current_node->entityname }| ##NO_TEXT. + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>not_implemented + mv_value = error_message. + WHEN OTHERS. + error_message = |{ last_visited_member } in entity { current_node->entityname }| ##NO_TEXT. + + RAISE EXCEPTION TYPE ZDMO_cx_rap_generator + EXPORTING + textid = ZDMO_cx_rap_generator=>invalid_json_property_name + mv_value = error_message. + + + ENDCASE. + + ENDIF. + ENDIF. + + ENDMETHOD. + + + METHOD in_any_array. + r_in_any_array = abap_true. + IF in_additional_binding = abap_false AND + in_additional_fields = abap_false AND + in_associations = abap_false AND + in_conditions = abap_false AND + in_fields = abap_false AND + in_keys = abap_false AND + in_mapping = abap_false AND + in_value_helps = abap_false. + r_in_any_array = abap_false. + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_xco_json_visitor.clas.xml b/src/zdmo_cl_rap_xco_json_visitor.clas.xml new file mode 100644 index 0000000..96c9ecb --- /dev/null +++ b/src/zdmo_cl_rap_xco_json_visitor.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_XCO_JSON_VISITOR</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>traverse rap json file</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_xco_lib.clas.abap b/src/zdmo_cl_rap_xco_lib.clas.abap new file mode 100644 index 0000000..528b14f --- /dev/null +++ b/src/zdmo_cl_rap_xco_lib.clas.abap @@ -0,0 +1,336 @@ +CLASS zdmo_cl_rap_xco_lib DEFINITION ABSTRACT + PUBLIC + CREATE PUBLIC . + + PUBLIC SECTION. + + TYPES t_abap_obj_directory_entries TYPE STANDARD TABLE OF I_CustABAPObjDirectoryEntry WITH DEFAULT KEY. + TYPES t_abap_obj_directory_entry TYPE I_CustABAPObjDirectoryEntry. + + DATA todos TYPE TABLE OF string WITH EMPTY KEY READ-ONLY. + + CLASS-METHODS create_xco_lib + RETURNING + VALUE(result) TYPE REF TO zdmo_cl_rap_xco_lib. + + METHODS get_service_definition IMPORTING iv_name TYPE sxco_srvd_object_name + RETURNING VALUE(ro_service_definition) TYPE REF TO if_xco_service_definition . + METHODS get_service_binding IMPORTING iv_name TYPE sxco_srvb_object_name + RETURNING VALUE(ro_service_binding) TYPE REF TO if_xco_service_binding . + METHODS get_behavior_definition IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_behavior_definition) TYPE REF TO if_xco_behavior_definition . + METHODS get_class IMPORTING iv_name TYPE sxco_ao_object_name "sxco_cds_object_name + RETURNING VALUE(ro_class) TYPE REF TO if_xco_ao_class . + METHODS get_package IMPORTING iv_name TYPE sxco_package + RETURNING VALUE(ro_package) TYPE REF TO if_xco_package . + METHODS get_database_table IMPORTING iv_name TYPE sxco_dbt_object_name + RETURNING VALUE(ro_table) TYPE REF TO if_xco_database_table . + METHODS get_structure IMPORTING iv_name TYPE sxco_ad_object_name + RETURNING VALUE(ro_structure) TYPE REF TO if_xco_ad_structure . + METHODS get_data_definition IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_data_definition) TYPE REF TO if_xco_data_definition . + METHODS get_metadata_extension IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_metadata_extension) TYPE REF TO if_xco_metadata_extension . + METHODS get_view_entity IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_view_entity) TYPE REF TO if_xco_cds_view_entity . + METHODS get_view IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_view) TYPE REF TO if_xco_cds_view . + METHODS get_entity IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_entity) TYPE REF TO if_xco_cds_entity . + METHODS get_abstract_entity IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_abstract_entity) TYPE REF TO if_xco_cds_entity . + METHODS get_sap_object_type IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_sap_object_type) TYPE REF TO if_xco_sap_object_type . + METHODS get_sap_object_node_type IMPORTING iv_name TYPE sxco_cds_object_name + RETURNING VALUE(ro_sap_object_node_type) TYPE REF TO if_xco_sap_object_node_type . + + METHODS get_aggregated_annotations IMPORTING io_field TYPE REF TO if_xco_cds_field + RETURNING VALUE(ro_aggregated_annotations) TYPE REF TO if_xco_cds_annotations . + METHODS add_draft_include IMPORTING table_name TYPE sxco_dbt_object_name. + + METHODS add_include_structure_to_table IMPORTING table_name TYPE sxco_dbt_object_name + extension_include_name TYPE sxco_ad_object_name. + + METHODS add_enh_cat_to_table IMPORTING table_name TYPE sxco_dbt_object_name. + + METHODS add_enh_cat_and_anno_to_struct IMPORTING ext_include_structure_name TYPE sxco_ad_object_name + extensibility_element_suffix TYPE string. + + METHODS method_exists_in_interface IMPORTING interface_name TYPE any + method_name TYPE c + RETURNING VALUE(method_exists) TYPE abap_bool. + METHODS method_exists_in_class IMPORTING class_name TYPE any + method_name TYPE c + RETURNING VALUE(method_exists) TYPE abap_bool. + METHODS attribute_exists_in_class IMPORTING class_name TYPE any + attribute_name TYPE c + RETURNING VALUE(attribute_exists) TYPE abap_bool. + METHODS attribute_exists_in_interface IMPORTING interface_name TYPE any + attribute_name TYPE c + RETURNING VALUE(attribute_exists) TYPE abap_bool. + + METHODS get_tables IMPORTING it_filters TYPE sxco_t_ar_filters OPTIONAL "io_filter type ref to if_xco_ar_filter OPTIONAL + RETURNING VALUE(rt_tables) TYPE sxco_t_database_tables. + METHODS get_structures IMPORTING it_filters TYPE sxco_t_ar_filters OPTIONAL "io_filter type ref to if_xco_ar_filter OPTIONAL + RETURNING VALUE(rt_structures) TYPE sxco_t_ad_structures . + METHODS get_views IMPORTING it_filters TYPE sxco_t_ar_filters OPTIONAL"type ref to if_xco_ar_filter OPTIONAL + RETURNING VALUE(rt_data_definitions) TYPE sxco_t_data_definitions . + METHODS get_packages IMPORTING it_filters TYPE sxco_t_ar_filters OPTIONAL"io_filter type ref to if_xco_ar_filter OPTIONAL + RETURNING VALUE(rt_packages) TYPE sxco_t_packages . + + METHODS todo IMPORTING todo TYPE string. + + METHODS on_premise_branch_is_used RETURNING VALUE(r_value) TYPE abap_bool. + + METHODS get_abap_language_version IMPORTING iv_name TYPE sxco_package + RETURNING VALUE(r_abap_language_version) TYPE sychar01 . + + + METHODS get_root_exception IMPORTING ix_exception TYPE REF TO cx_root + RETURNING VALUE(rx_root) TYPE REF TO cx_root . + + METHODS publish_service_binding IMPORTING i_service_binding TYPE sxco_srvb_object_name + RAISING zdmo_cx_rap_generator. + + METHODS un_publish_service_binding IMPORTING i_service_binding TYPE sxco_srvb_object_name + RAISING zdmo_cx_rap_generator . + + METHODS service_binding_is_published IMPORTING i_service_binding TYPE sxco_srvb_object_name + RETURNING VALUE(r_is_published) TYPE abap_bool + RAISING zdmo_cx_rap_generator. + + METHODS get_ABAP_Obj_Directory_Entry IMPORTING i_ABAP_Object_Type TYPE t_abap_obj_directory_entry-ABAPObjectType "trobjtype "= 'DEVC' + i_ABAP_Object_Category TYPE t_abap_obj_directory_entry-ABAPObjectCategory "= 'R3TR' + i_ABAP_Object TYPE t_abap_obj_directory_entry-ABAPObject " @delete_objects_in_package + RETURNING VALUE(r_ABAP_Object_Directory_Entry) TYPE t_abap_obj_directory_entry. + + METHODS get_objects_in_package IMPORTING i_package TYPE sxco_package + RETURNING VALUE(r_objects_in_package) TYPE t_abap_obj_directory_entries. + + + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_XCO_LIB IMPLEMENTATION. + + + METHOD add_draft_include. + + ENDMETHOD. + + + METHOD add_enh_cat_and_anno_to_struct. + + ENDMETHOD. + + + METHOD add_enh_cat_to_table. + + ENDMETHOD. + + + METHOD add_include_structure_to_table. + + ENDMETHOD. + + + METHOD attribute_exists_in_class. + attribute_exists = abap_false. + DATA(descr_ref_class) = CAST cl_abap_classdescr( cl_abap_typedescr=>describe_by_name( class_name ) ). + IF line_exists( descr_ref_class->attributes[ name = to_upper( attribute_name ) ] ). + attribute_exists = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD attribute_exists_in_interface. + attribute_exists = abap_false. + DATA(descr_ref_intf) = CAST cl_abap_intfdescr( cl_abap_typedescr=>describe_by_name( interface_name ) ). + IF line_exists( descr_ref_intf->attributes[ name = to_upper( attribute_name ) ] ). + attribute_exists = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD create_xco_lib. + DATA xco_on_prem_lib TYPE REF TO ZDMO_cl_rap_xco_on_prem_lib. + xco_on_prem_lib = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + IF xco_on_prem_lib->on_premise_branch_is_used( ). + result = NEW ZDMO_cl_rap_xco_on_prem_lib( ). + ELSE. + result = NEW ZDMO_cl_rap_xco_cloud_lib( ). + ENDIF. + ENDMETHOD. + + + METHOD get_abap_language_version. + r_abap_language_version = ZDMO_cl_rap_node=>package_abap_language_version-abap_for_sap_cloud_platform. "abap_language_version-abap_for_cloud_development. + ENDMETHOD. + + + METHOD get_abap_obj_directory_entry. + + ENDMETHOD. + + + METHOD get_abstract_entity. + + ENDMETHOD. + + + METHOD get_aggregated_annotations. + + ENDMETHOD. + + + METHOD get_behavior_definition. + + ENDMETHOD. + + + METHOD get_class. + + ENDMETHOD. + + + METHOD get_database_table. + + ENDMETHOD. + + + METHOD get_data_definition. + + ENDMETHOD. + + + METHOD get_entity. + + ENDMETHOD. + + + METHOD get_metadata_extension. + + ENDMETHOD. + + + METHOD get_objects_in_package. + + ENDMETHOD. + + + METHOD get_package. + + ENDMETHOD. + + + METHOD get_packages. + + ENDMETHOD. + + + METHOD get_root_exception. + rx_root = ix_exception. + WHILE rx_root->previous IS BOUND. + rx_root ?= rx_root->previous. + ENDWHILE. + ENDMETHOD. + + + METHOD get_sap_object_node_type. + + ENDMETHOD. + + + METHOD get_sap_object_type. + + ENDMETHOD. + + + METHOD get_service_binding. + + ENDMETHOD. + + + METHOD get_service_definition. + + ENDMETHOD. + + + METHOD get_structure. + + ENDMETHOD. + + + METHOD get_structures. + + ENDMETHOD. + + + METHOD get_tables. + + ENDMETHOD. + + + METHOD get_view. + + ENDMETHOD. + + + METHOD get_views. + + ENDMETHOD. + + + METHOD get_view_entity. + + ENDMETHOD. + + + METHOD method_exists_in_class. + method_exists = abap_false. + DATA(descr_ref_class) = CAST cl_abap_classdescr( cl_abap_typedescr=>describe_by_name( class_name ) ). + IF line_exists( descr_ref_class->methods[ name = to_upper( method_name ) ] ). + method_exists = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD method_exists_in_interface. + method_exists = abap_false. + DATA(descr_ref_intf) = CAST cl_abap_intfdescr( cl_abap_typedescr=>describe_by_name( interface_name ) ). + IF line_exists( descr_ref_intf->methods[ name = to_upper( method_name ) ] ). + method_exists = abap_true. + ENDIF. + ENDMETHOD. + + + METHOD on_premise_branch_is_used. + r_value = abap_false. + ENDMETHOD. + + + METHOD publish_service_binding. + + ENDMETHOD. + + + METHOD service_binding_is_published. + + ENDMETHOD. + + + METHOD todo. + APPEND todo TO todos. + ENDMETHOD. + + + METHOD un_publish_service_binding. +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>method_not_implemented +* mv_value = 'un_publish_service_binding'. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_xco_lib.clas.xml b/src/zdmo_cl_rap_xco_lib.clas.xml new file mode 100644 index 0000000..ca36e2f --- /dev/null +++ b/src/zdmo_cl_rap_xco_lib.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_XCO_LIB</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Abstract class xco apis</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cl_rap_xco_on_prem_lib.clas.abap b/src/zdmo_cl_rap_xco_on_prem_lib.clas.abap new file mode 100644 index 0000000..5441d28 --- /dev/null +++ b/src/zdmo_cl_rap_xco_on_prem_lib.clas.abap @@ -0,0 +1,909 @@ +CLASS zdmo_cl_rap_xco_on_prem_lib DEFINITION INHERITING FROM ZDMO_cl_rap_xco_lib + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + METHODS get_aggregated_annotations REDEFINITION. + METHODS get_behavior_definition REDEFINITION. + METHODS get_class REDEFINITION. + METHODS get_database_table REDEFINITION. + METHODS get_data_definition REDEFINITION. + METHODS get_metadata_extension REDEFINITION. + METHODS get_package REDEFINITION. + METHODS get_service_binding REDEFINITION. + METHODS get_service_definition REDEFINITION. + METHODS get_structure REDEFINITION. + METHODS get_view_entity REDEFINITION. + METHODS get_view REDEFINITION. + METHODS get_entity REDEFINITION. + METHODS get_abstract_entity REDEFINITION. + METHODS add_draft_include REDEFINITION. + METHODS get_structures REDEFINITION. + METHODS get_tables REDEFINITION. + METHODS get_views REDEFINITION. + METHODS get_packages REDEFINITION. + METHODS on_premise_branch_is_used REDEFINITION. + METHODS get_abap_language_version REDEFINITION. + METHODS publish_service_binding REDEFINITION. + METHODS un_publish_service_binding REDEFINITION. + METHODS service_binding_is_published REDEFINITION. + METHODS get_abap_obj_directory_entry REDEFINITION. + METHODS get_objects_in_package REDEFINITION. + METHODS add_include_structure_to_table REDEFINITION. + METHODS add_enh_cat_to_table REDEFINITION. + METHODS add_enh_cat_and_anno_to_struct REDEFINITION. + METHODS get_sap_object_node_type redefinition. + methods get_sap_object_type REDEFINITION. + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CL_RAP_XCO_ON_PREM_LIB IMPLEMENTATION. + + + METHOD add_draft_include. +* DATA: +* draft_template_table_name TYPE ddobjname, +* draft_table_name TYPE ddobjname, +* lv_return TYPE syst_subrc, +* lt_dd03p TYPE TABLE OF dd03p, +* lt_dd03p_draft TYPE TABLE OF dd03p, +* lt_dd12v TYPE TABLE OF dd12v, +* lt_dd17v TYPE TABLE OF dd17v, +* ls_dd02v TYPE dd02v, +* ls_dd09l TYPE dd09l, +* state TYPE ddgotstate, +* position TYPE i. +* +* FIELD-SYMBOLS: +* <ls_dd03p> TYPE dd03p. +* +* draft_template_table_name = 'ZDMO_DRAFT_INCL'. +* draft_table_name = table_name. +* +* "get information about draft include from template table +* +* CALL FUNCTION 'DDIF_TABL_GET' +* EXPORTING +* name = draft_template_table_name +* state = 'A' +* IMPORTING +* gotstate = state +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p_draft +* dd12v_tab = lt_dd12v +* dd17v_tab = lt_dd17v +* EXCEPTIONS +* illegal_input = 1 +* OTHERS = 2. +* +* IF sy-subrc <> 0. +* "RAISE EXCEPTION TYPE cx_cnv_indx_iuuc. +* ASSERT 1 = 0. +* +* ENDIF. +* +* "get draft table information. +* CALL FUNCTION 'DDIF_TABL_GET' +* EXPORTING +* name = draft_table_name +* state = 'A' +* IMPORTING +* gotstate = state +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* dd12v_tab = lt_dd12v +* dd17v_tab = lt_dd17v +* EXCEPTIONS +* illegal_input = 1 +* OTHERS = 2. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* +* "add draft include structure to draft table +* IF lt_dd03p IS NOT INITIAL. +* +* +* position = lines( lt_dd03p ). +* +* +* LOOP AT lt_dd03p_draft INTO DATA(ls_dd03p_draft) . +* ls_dd03p_draft-tabname = draft_table_name. +* +* CASE ls_dd03p_draft-fieldname. +* WHEN '.INCLUDE'. +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* WHEN 'DRAFTENTITYCREATIONDATETIME' . +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* WHEN 'DRAFTENTITYLASTCHANGEDATETIME'. +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* WHEN 'DRAFTADMINISTRATIVEDATAUUID' . +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* WHEN 'DRAFTENTITYOPERATIONCODE' . +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* WHEN 'HASACTIVEENTITY' . +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* WHEN'DRAFTFIELDCHANGES'. +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* ENDCASE. +* ENDLOOP. +* ELSE. +* ASSERT 1 = 0. +* ENDIF. +* +* "change draft table +* CALL FUNCTION 'DDIF_TABL_PUT' +* EXPORTING +* name = draft_table_name +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* EXCEPTIONS +* tabl_not_found = 1 +* name_inconsistent = 2 +* tabl_inconsistent = 3 +* put_failure = 4 +* put_refused = 5 +* OTHERS = 6. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ELSE. +* +* CALL FUNCTION 'DDIF_TABL_ACTIVATE' +* EXPORTING +* name = draft_table_name +* auth_chk = ' ' +* IMPORTING +* rc = lv_return +* EXCEPTIONS +* not_found = 1 +* put_failure = 2 +* OTHERS = 3. +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* ENDIF. + + ENDMETHOD. + + + METHOD add_enh_cat_and_anno_to_struct. + +* DATA: change_structure_name TYPE ddobjname, +* lv_return TYPE syst_subrc, +* lt_dd03p TYPE TABLE OF dd03p, +* lt_dd03p_ext_incl TYPE TABLE OF dd03p, +* lt_dd12v TYPE TABLE OF dd12v, +* lt_dd17v TYPE TABLE OF dd17v, +* ls_dd02v TYPE dd02v, +* ls_dd09l TYPE dd09l, +* state TYPE ddgotstate, +* position TYPE i. +* +* FIELD-SYMBOLS: +* <ls_dd03p> TYPE dd03p. +* +* "type must be exactly the type being used by DDIF function modules +* change_structure_name = to_upper( ext_include_structure_name ). +* +* +* +* "get table information. +* CALL FUNCTION 'DDIF_TABL_GET' +* EXPORTING +* name = change_structure_name +* state = 'A' +* IMPORTING +* gotstate = state +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* dd12v_tab = lt_dd12v +* dd17v_tab = lt_dd17v +* EXCEPTIONS +* illegal_input = 1 +* OTHERS = 2. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* +* "for structure change ls_dd02v-EXCLASS = '4' and set quota and extensibility suffix +* +* ls_dd02v-exclass = zdmo_cl_rap_node=>enhancement_category-can_be_enhanced_deep. "'4'. +* ls_dd02v-field_suffix = extensibility_element_suffix. +* ls_dd02v-quota_max_fields = zdmo_cl_rap_node=>abapcatalog_enhancement-quotamaximumfields. +* ls_dd02v-quota_max_bytes = zdmo_cl_rap_node=>abapcatalog_enhancement-quotamaximumbytes. +* ls_dd02v-quota_share_partner = zdmo_cl_rap_node=>abapcatalog_enhancement-quotasharepartner. +* ls_dd02v-quota_share_customer = zdmo_cl_rap_node=>abapcatalog_enhancement-quotasharecustomer. +* +* "change table +* CALL FUNCTION 'DDIF_TABL_PUT' +* EXPORTING +* name = change_structure_name +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* EXCEPTIONS +* tabl_not_found = 1 +* name_inconsistent = 2 +* tabl_inconsistent = 3 +* put_failure = 4 +* put_refused = 5 +* OTHERS = 6. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ELSE. +* +* CALL FUNCTION 'DDIF_TABL_ACTIVATE' +* EXPORTING +* name = change_structure_name +* auth_chk = ' ' +* IMPORTING +* rc = lv_return +* EXCEPTIONS +* not_found = 1 +* put_failure = 2 +* OTHERS = 3. +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* ENDIF. + + + ENDMETHOD. + + + METHOD add_enh_cat_to_table. + +* DATA: change_table_name TYPE ddobjname, +* lv_return TYPE syst_subrc, +* lt_dd03p TYPE TABLE OF dd03p, +* lt_dd03p_ext_incl TYPE TABLE OF dd03p, +* lt_dd12v TYPE TABLE OF dd12v, +* lt_dd17v TYPE TABLE OF dd17v, +* ls_dd02v TYPE dd02v, +* ls_dd09l TYPE dd09l, +* state TYPE ddgotstate, +* position TYPE i. +* +* FIELD-SYMBOLS: +* <ls_dd03p> TYPE dd03p. +* +* "type must be exactly the type being used by DDIF function modules +* change_table_name = to_upper( table_name ). +* +* "get table information. +* CALL FUNCTION 'DDIF_TABL_GET' +* EXPORTING +* name = change_table_name +* state = 'A' +* IMPORTING +* gotstate = state +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* dd12v_tab = lt_dd12v +* dd17v_tab = lt_dd17v +* EXCEPTIONS +* illegal_input = 1 +* OTHERS = 2. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* +* "for table change ls_dd02v-EXCLASS = '4'. +* ls_dd02v-exclass = '4'. +* +* "change table +* CALL FUNCTION 'DDIF_TABL_PUT' +* EXPORTING +* name = change_table_name +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* EXCEPTIONS +* tabl_not_found = 1 +* name_inconsistent = 2 +* tabl_inconsistent = 3 +* put_failure = 4 +* put_refused = 5 +* OTHERS = 6. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ELSE. +* +* CALL FUNCTION 'DDIF_TABL_ACTIVATE' +* EXPORTING +* name = change_table_name +* auth_chk = ' ' +* IMPORTING +* rc = lv_return +* EXCEPTIONS +* not_found = 1 +* put_failure = 2 +* OTHERS = 3. +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* ENDIF. +* + + + ENDMETHOD. + + + METHOD add_include_structure_to_table. + +* +* DATA: change_table_name TYPE ddobjname, +* lv_return TYPE syst_subrc, +* lt_dd03p TYPE TABLE OF dd03p, +* lt_dd03p_ext_incl TYPE TABLE OF dd03p, +* lt_dd12v TYPE TABLE OF dd12v, +* lt_dd17v TYPE TABLE OF dd17v, +* ls_dd02v TYPE dd02v, +* ls_dd09l TYPE dd09l, +* state TYPE ddgotstate, +* position TYPE i. +* +* FIELD-SYMBOLS: +* <ls_dd03p> TYPE dd03p. +* +* "type must be exactly the type being used by DDIF function modules +* change_table_name = table_name. +* +* "get table information. +* CALL FUNCTION 'DDIF_TABL_GET' +* EXPORTING +* name = change_table_name +* state = 'A' +* IMPORTING +* gotstate = state +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* dd12v_tab = lt_dd12v +* dd17v_tab = lt_dd17v +* EXCEPTIONS +* illegal_input = 1 +* OTHERS = 2. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* +* "information about extension include +* +* lt_dd03p_ext_incl = VALUE #( +* ( tabname = |{ change_table_name }| fieldname = '.INCLUDE' ddlanguage = '' position = '0002' keyflag = '' mandatory = '' +* rollname = '' checktable = '' adminfield = '0' inttype = '' intlen = '000000' reftable = '' precfield = +* |{ extension_include_name }| reffield = '' conrout = '' notnull = '' domname = '' routputlen = '000000' memoryid = '' logflag = +* '' headlen = '00' scrlen1 = '00' scrlen2 = '00' scrlen3 = '00' dtelglobal = '' dtelmaster = '' reservedte = '' datatype +* = '' leng = '000000' outputlen = '000000' decimals = '000000' lowercase = '' signflag = '' langflag = '' valexi = '' +* entitytab = '' convexit = '' mask = ' S' masklen = '0000' actflag = '' ddtext = '' reptext = '' scrtext_s = '' +* scrtext_m = '' scrtext_l = '' dommaster = '' reservedom = '' domglobal = '' domname3l = '' shlporigin = '' shlpname = +* '' shlpfield = '' tabletype = '' depth = '00' comptype = 'S' deffdname = '' groupname = '' reftype = '' proxytype = '' +* languflag = '' exclass = '0' ltrflddis = '' bidictrlc = '' dbposition = '0000' anonymous = '' outputstyle = '00' +* nohistory = '' ampmformat = '' streamorloc = '' strorlocpos = '00' sql_passvalue = '' is_virtual = '' is_calculated = +* '' extendname = '' srs_id = '0000000000' ) +* ( tabname = |{ change_table_name }| fieldname = 'DUMMY_FIELD' ddlanguage = '' position = '0003' keyflag = '' mandatory = '' +* rollname = '' checktable = '' adminfield = '1' inttype = 'C' intlen = '000002' reftable = '' precfield = '' reffield = +* '' conrout = '' notnull = '' domname = '' routputlen = '000000' memoryid = '' logflag = '' headlen = '00' scrlen1 = +* '00' scrlen2 = '00' scrlen3 = '00' dtelglobal = '' dtelmaster = '' reservedte = '' datatype = 'CHAR' leng = '000001' +* outputlen = '000000' decimals = '000000' lowercase = '' signflag = '' langflag = '' valexi = '' entitytab = '' convexit +* = '' mask = ' CHAR' masklen = '0000' actflag = '' ddtext = '' reptext = '' scrtext_s = '' scrtext_m = '' scrtext_l = +* '' dommaster = '' reservedom = '' domglobal = '' domname3l = '' shlporigin = '' shlpname = '' shlpfield = '' tabletype +* = '' depth = '00' comptype = '' deffdname = '' groupname = '' reftype = '' proxytype = '' languflag = '' exclass = '0' +* ltrflddis = '' bidictrlc = '' dbposition = '0000' anonymous = '' outputstyle = '00' nohistory = '' ampmformat = '' +* streamorloc = '' strorlocpos = '00' sql_passvalue = '' is_virtual = '' is_calculated = '' extendname = '' srs_id = +* '0000000000' ) +* ) . +* +* "add extension include structure to table +* IF lt_dd03p IS NOT INITIAL. +* +* position = lines( lt_dd03p ). +* +* LOOP AT lt_dd03p_ext_incl INTO DATA(ls_dd03p_draft) . +* position += 1. +* ls_dd03p_draft-position = position. +* APPEND ls_dd03p_draft TO lt_dd03p. +* ENDLOOP. +* +* ELSE. +* ASSERT 1 = 0. +* ENDIF. +* +* "change table +* CALL FUNCTION 'DDIF_TABL_PUT' +* EXPORTING +* name = change_table_name +* dd02v_wa = ls_dd02v +* dd09l_wa = ls_dd09l +* TABLES +* dd03p_tab = lt_dd03p +* EXCEPTIONS +* tabl_not_found = 1 +* name_inconsistent = 2 +* tabl_inconsistent = 3 +* put_failure = 4 +* put_refused = 5 +* OTHERS = 6. +* +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ELSE. +* +* CALL FUNCTION 'DDIF_TABL_ACTIVATE' +* EXPORTING +* name = change_table_name +* auth_chk = ' ' +* IMPORTING +* rc = lv_return +* EXCEPTIONS +* not_found = 1 +* put_failure = 2 +* OTHERS = 3. +* IF sy-subrc <> 0. +* ASSERT 1 = 0. +* ENDIF. +* ENDIF. + + + + + ENDMETHOD. + + + METHOD get_abap_language_version. +* r_abap_language_version = xco_abap_language_version=>object_type->devc->get_object_language_version( CONV #( iv_name ) )->get_value( ). + ENDMETHOD. + + + METHOD get_abap_obj_directory_entry. +* SELECT SINGLE * FROM +* I_ABAPObjectDirectoryEntry "ObjDirectoryEntry +* WHERE ABAPObjectType = @i_abap_object_type +* AND ABAPObjectCategory = @i_abap_object_category +* AND ABAPObject = @i_abap_object +* INTO CORRESPONDING FIELDS OF @r_abap_object_directory_entry. + ENDMETHOD. + + + METHOD get_abstract_entity. +* IF method_exists_in_class( +* class_name = 'xco_cds' +* method_name = 'abstract_entity' +* ). +* CALL METHOD xco_cds=>('abstract_entity') +* EXPORTING +* iv_name = iv_name +* RECEIVING +* ro_abstract_entity = ro_abstract_entity. +* ENDIF. + ENDMETHOD. + + + METHOD get_aggregated_annotations. +* ro_aggregated_annotations = xco_cds=>annotations->aggregated->of( io_field ). + ENDMETHOD. + + + METHOD get_behavior_definition. +* ro_behavior_definition = xco_abap_repository=>object->bdef->for( iv_name ). + ENDMETHOD. + + + METHOD get_class. +* ro_class = xco_abap_repository=>object->clas->for( iv_name ). + ENDMETHOD. + + + METHOD get_database_table. +* ro_table = xco_abap_repository=>object->tabl->database_table->for( iv_name ). + ENDMETHOD. + + + METHOD get_data_definition. +* ro_data_definition = xco_abap_repository=>object->ddls->for( iv_name ). + ENDMETHOD. + + + METHOD get_entity. +* ro_entity = xco_cds=>view_entity( iv_name ). + ENDMETHOD. + + + METHOD get_metadata_extension. +* ro_metadata_extension = xco_abap_repository=>object->ddlx->for( iv_name ). + ENDMETHOD. + + + METHOD get_objects_in_package. +* SELECT * FROM I_ABAPObjectDirectoryEntry WHERE ABAPPackage = @i_package +* INTO CORRESPONDING FIELDS OF TABLE @r_objects_in_package . + ENDMETHOD. + + + METHOD get_package. +* ro_package = xco_abap_repository=>object->devc->for( iv_name ). + ENDMETHOD. + + + METHOD get_packages. +* IF it_filters IS NOT INITIAL. +* rt_packages = xco_abap_repository=>objects->devc->where( it_filters )->in( xco_cp_abap=>repository )->get( ). +* ELSE. +* rt_packages = xco_abap_repository=>objects->devc->all->in( xco_cp_abap=>repository )->get( ). +* ENDIF. + ENDMETHOD. + + + METHOD get_sap_object_node_type. +* ro_sap_object_node_type = xco_abap_repository=>object->nont->for( iv_name ). + ENDMETHOD. + + + METHOD get_sap_object_type. +* ro_sap_object_type = xco_abap_repository=>object->ront->for( iv_name ). + ENDMETHOD. + + + METHOD get_service_binding. +* ro_service_binding = xco_abap_repository=>object->srvb->for( iv_name ). + ENDMETHOD. + + + METHOD get_service_definition. +* ro_service_definition = xco_abap_repository=>object->srvd->for( iv_name ). + ENDMETHOD. + + + METHOD get_structure. +* ro_structure = xco_abap_repository=>object->tabl->structure->for( iv_name ). + ENDMETHOD. + + + METHOD get_structures. +** IF io_filter IS NOT INITIAL. +** rt_structures = xco_abap_repository=>objects->tabl->structures->where( VALUE #( +** ( io_filter ) +** ) )->in( xco_abap=>repository )->get( ). +** ELSE. +** rt_structures = xco_abap_repository=>objects->tabl->structures->all->in( xco_abap=>repository )->get( ). +** ENDIF. + ENDMETHOD. + + + METHOD get_tables. +* IF it_filters IS NOT INITIAL. +* rt_tables = xco_abap_repository=>objects->tabl->database_tables->where( it_filters )->in( xco_abap=>repository )->get( ). +* +* ELSE. +* rt_tables = xco_abap_repository=>objects->tabl->database_tables->all->in( xco_abap=>repository )->get( ). +* ENDIF. + ENDMETHOD. + + + METHOD get_view. +* ro_view = xco_cds=>view( iv_name ). + ENDMETHOD. + + + METHOD get_views. +* IF it_filters IS NOT INITIAL. +* rt_data_definitions = xco_abap_repository=>objects->ddls->where( it_filters )->in( xco_abap=>repository )->get( ). +* ELSE. +* rt_data_definitions = xco_abap_repository=>objects->ddls->all->in( xco_abap=>repository )->get( ). +* ENDIF. + ENDMETHOD. + + + METHOD get_view_entity. +* ro_view_entity = xco_cds=>view_entity( iv_name ). + ENDMETHOD. + + + METHOD on_premise_branch_is_used. + "get default value abap_false + super->on_premise_branch_is_used( ). +* r_value = abap_true. + ENDMETHOD. + + + METHOD publish_service_binding. +* CHECK get_service_binding( i_service_binding )->if_xco_ar_object~exists( ). +* DATA(service_binding_name_to_upper) = to_upper( i_service_binding ). +* DATA(service_binding) = get_service_binding( CONV #( service_binding_name_to_upper ) ). +* DATA(package) = service_binding->if_xco_ar_object~get_package( ). +* DATA(transport_target) = package->read( )-property-transport_layer->get_transport_target( ). +* DATA(transport_target_name) = transport_target->value. +* DATA(new_transport_object) = xco_cts=>transports->customizing( iv_target = transport_target_name )->create_request( |Publish: { i_service_binding } | ). +* DATA(transport_request) = new_transport_object->value. +* DATA(service_binding_name) = to_upper( i_service_binding ). +* IF service_binding_is_published( i_service_binding ) = abap_false. +* DATA(service_binding_type) = service_binding->content( )->get_binding_type( )->value. +* IF service_binding_type-bind_type = 'ODATA'. +* +* CASE service_binding_type-bind_type_version . +* WHEN 'V4'. +* TRY. +* +* /iwfnd/cl_v4_cof_facade=>publish_group( +* EXPORTING +* iv_group_id = CONV /iwfnd/v4_med_group_id( service_binding_name ) +* iv_system_alias = 'LOCAL' +** iv_do_not_transport = ABAP_true +* iv_suppress_dialog = abap_true +* CHANGING +* cv_transport = transport_request +* ). +* CATCH /iwfnd/cx_gateway INTO DATA(publish_locally_exception). +* DATA(root_exception_text) = get_root_exception( publish_locally_exception )->get_text( ). +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>service_binding_publish_err +* mv_value = root_exception_text. +* ENDTRY. +* +* WHEN 'V2'. +* +* DATA: lo_config_facade TYPE REF TO /iwfnd/cl_cof_facade. +* DATA: lx_cof TYPE REF TO /iwfnd/cx_cof. +* DATA: lx_previous TYPE REF TO cx_root . +* DATA: lx_root_cause TYPE REF TO /iwfnd/cx_base . +* DATA: lv_service_id TYPE /iwfnd/med_mdl_srg_identifier. +* DATA: lv_service_name_tech TYPE /iwfnd/med_mdl_srg_name ##NEEDED. +* +* " activate service +* +* DATA(a) = 2. +* +* TRY. +* lo_config_facade = /iwfnd/cl_cof_facade=>get_instance( ). +* +* lo_config_facade->activate_service( +* EXPORTING +* iv_service_name_bep = CONV #( service_binding_name ) +* iv_service_version_bep = '0001' +* iv_prefix = 'Z' +* iv_system_alias = 'LOCAL' +* iv_package = '$TMP' +** iv_process_mode = /iwfnd/if_mgw_core_types=>gcs_process_mode-co_deployed_only +* iv_shorten_long_names = abap_true +* iv_suppress_dialog = abap_true +* IMPORTING +* ev_srg_identifier = lv_service_id +* ev_tech_service_name = lv_service_name_tech +* ). +* +* +* DATA(result) = lv_service_id. +* +* CATCH cx_root INTO lx_previous. +* +* WHILE lx_previous->previous IS NOT INITIAL ."BOUND. +* lx_previous = lx_previous->previous. " Get the exception that caused this exception +* TRY. +* lx_root_cause ?= lx_previous. +* CATCH cx_sy_move_cast_error. +* ENDTRY. +* ENDWHILE. +* +* DATA(root_cause) = lx_root_cause->get_text( ). +* +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>service_binding_publish_err +* mv_value = root_cause. +* +* ENDTRY. +* +* +* WHEN OTHERS. +* DATA(b) = service_binding_type-bind_type. +* DATA(c) = service_binding_type-bind_type_version. +* ENDCASE. +* ENDIF. +* ENDIF. + ENDMETHOD. + + + METHOD service_binding_is_published. +* r_is_published = abap_false. +* CHECK get_service_binding( i_service_binding )->if_xco_ar_object~exists( ). +* DATA(service_binding_name_to_upper) = to_upper( i_service_binding ). +* DATA(service_binding) = get_service_binding( CONV #( service_binding_name_to_upper ) ). +* DATA(service_binding_type) = service_binding->content( )->get_binding_type( )->value. +* +* IF service_binding_type-bind_type = 'ODATA' AND service_binding_type-bind_type_version = 'V4'. +* TRY. +* /iwfnd/cl_v4_cof_facade=>get_published_groups( +* IMPORTING +* et_publish_group_info = DATA(published_service_groups) ). +* CATCH /iwfnd/cx_gateway INTO DATA(get_service_groups_exception). +* DATA(root_exception_text) = get_root_exception( get_service_groups_exception )->get_text( ). +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>root_cause_exception +* mv_value = 'Error getting service groups' +* mv_value_2 = root_exception_text. +* EXIT. +* ENDTRY. +* +* IF line_exists( published_service_groups[ group_id = service_binding_name_to_upper ] ). " Service group is already published +* r_is_published = abap_true. +* ELSE. +* r_is_published = abap_false. +* ENDIF. +* +* ELSEIF service_binding_type-bind_type = 'ODATA' AND service_binding_type-bind_type_version = 'V2'. +* +* DATA: lo_config_facade TYPE REF TO /iwfnd/cl_cof_facade. +* DATA: lx_cof TYPE REF TO /iwfnd/cx_cof. +* DATA: lx_previous TYPE REF TO cx_root . +* DATA: lx_root_cause TYPE REF TO /iwfnd/cx_base . +* DATA: lv_service_id TYPE /iwfnd/med_mdl_srg_identifier. +* DATA: lv_service_name_tech TYPE /iwfnd/med_mdl_srg_name ##NEEDED. +* +* +* +* TRY. +* +* " activate service +* lo_config_facade = /iwfnd/cl_cof_facade=>get_instance( ). +* lo_config_facade->is_service_active( +* EXPORTING +* iv_service_name_bep = CONV #( service_binding_name_to_upper ) +* iv_service_version_bep = '0001' +** iv_prefix = +** iv_shorten_long_names = +* IMPORTING +* ev_active = r_is_published +* ). +** CATCH /iwfnd/cx_cof. +* CATCH cx_root INTO DATA(v2_check_activation_exc). +* +* DATA(root_exception_text2) = get_root_exception( v2_check_activation_exc )->get_text( ). +* +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>root_cause_exception +* mv_value = 'Error checking if service binding is active' +* mv_value_2 = root_exception_text2. +* +* +* ENDTRY. +* ENDIF. + + ENDMETHOD. + + + METHOD un_publish_service_binding. +* CHECK get_service_binding( i_service_binding )->if_xco_ar_object~exists( ). +* DATA(service_binding_name_to_upper) = to_upper( i_service_binding ). +* DATA(service_binding) = get_service_binding( CONV #( service_binding_name_to_upper ) ). +* DATA(package) = service_binding->if_xco_ar_object~get_package( ). +* DATA(transport_target) = package->read( )-property-transport_layer->get_transport_target( ). +* DATA(transport_target_name) = transport_target->value. +* DATA(new_transport_object) = xco_cts=>transports->customizing( iv_target = transport_target_name )->create_request( |Unpublish: { i_service_binding } | ). +* DATA(transport_request) = new_transport_object->value. +* +* IF service_binding_is_published( i_service_binding ) = abap_true. +* +* DATA(service_binding_type) = service_binding->content( )->get_binding_type( )->value. +* +* IF service_binding_type-bind_type = 'ODATA' . +* +* CASE service_binding_type-bind_type_version. +* +* WHEN 'V4'. +* +* TRY. +* DATA(service_binding_name) = to_upper( i_service_binding ). +* /iwfnd/cl_v4_cof_facade=>unpublish_group( +* EXPORTING +* iv_group_id = CONV /iwfnd/v4_med_group_id( service_binding_name ) +* iv_suppress_dialog = abap_true +* CHANGING +* cv_transport = transport_request +* ). +* CATCH /iwfnd/cx_gateway INTO DATA(un_publish_locally_exception). +* "handle exception +* DATA(root_exception_text) = get_root_exception( un_publish_locally_exception )->get_text( ). +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>service_binding_un_publish_err +* mv_value = root_exception_text. +* ENDTRY. +* +* WHEN 'V2'. +* +* " do nothing right now yet +* +* DATA: lo_config_facade TYPE REF TO /iwfnd/cl_cof_facade. +* DATA: lx_cof TYPE REF TO /iwfnd/cx_cof. +* DATA: lx_previous TYPE REF TO cx_root . +* DATA: lx_root_cause TYPE REF TO /iwfnd/cx_base . +* DATA: lv_service_id TYPE /iwfnd/med_mdl_srg_identifier. +* DATA: lv_service_name_tech TYPE /iwfnd/med_mdl_srg_name ##NEEDED. +* +* TRY. +* +* DATA object_name TYPE /iwfnd/med_mdl_srg_name . +* object_name = service_binding_name_to_upper. +**-check whether service group already exists +* SELECT SINGLE srv_identifier FROM /iwfnd/i_med_srh +* INTO @DATA(lv_srg_identifier) +* WHERE object_name = @object_name +* AND service_version = '0001'. +* +* IF sy-subrc EQ 0. +* +* " deactivate service +* lo_config_facade = /iwfnd/cl_cof_facade=>get_instance( ). +* lo_config_facade->deactivate_service( +* iv_service_identifier = lv_srg_identifier +** iv_transport_cust = space +** iv_transport_dev = space +** iv_suppress_dialog = +* ). +** CATCH /iwfnd/cx_cof. +* +* ENDIF. +* +* CATCH cx_root INTO DATA(v2_check_activation_exc). +* +* DATA(root_exception_text2) = get_root_exception( v2_check_activation_exc )->get_text( ). +* +* RAISE EXCEPTION TYPE zdmo_cx_rap_generator +* EXPORTING +* textid = zdmo_cx_rap_generator=>root_cause_exception +* mv_value = 'Error checking if service binding is active' +* mv_value_2 = root_exception_text2. +* +* +* ENDTRY. +* +* ENDCASE. +* +* ENDIF. +* +* ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cl_rap_xco_on_prem_lib.clas.xml b/src/zdmo_cl_rap_xco_on_prem_lib.clas.xml new file mode 100644 index 0000000..ffad09b --- /dev/null +++ b/src/zdmo_cl_rap_xco_on_prem_lib.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CL_RAP_XCO_ON_PREM_LIB</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>xco on premise apis</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cm_rap_gen_msg.msag.xml b/src/zdmo_cm_rap_gen_msg.msag.xml new file mode 100644 index 0000000..4242421 --- /dev/null +++ b/src/zdmo_cm_rap_gen_msg.msag.xml @@ -0,0 +1,524 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_MSAG" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <T100A> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MASTERLANG>E</MASTERLANG> + <STEXT>Message class for the RAP Generator</STEXT> + </T100A> + <T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>001</MSGNR> + <TEXT>&1 is neither a child node nor a grand child node of the root entity &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>002</MSGNR> + <TEXT>&1 contains non alpha numeric characters.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>003</MSGNR> + <TEXT>&1 contains spaces.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>004</MSGNR> + <TEXT>&1 is too long. (&2 characters max).</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>005</MSGNR> + <TEXT>Node &1 is not consistent</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>006</MSGNR> + <TEXT>&1 is not a supported implementation type.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>007</MSGNR> + <TEXT>No namespace has been set for the root node.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>008</MSGNR> + <TEXT>Node &1 is not finalized.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>009</MSGNR> + <TEXT>Node &1 is not a root node.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>010</MSGNR> + <TEXT>The specified semantic key field &1 is not a field of table &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>011</MSGNR> + <TEXT>Repository object &1 already exists</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>012</MSGNR> + <TEXT>Cannot check object type &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>013</MSGNR> + <TEXT>Parameter &1 is initial.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>014</MSGNR> + <TEXT>Package &1 does not exist</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>015</MSGNR> + <TEXT>Table &1 does not exist.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>016</MSGNR> + <TEXT>&1 &2 &3 &4</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>017</MSGNR> + <TEXT>Table contains no UUID based key field &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>018</MSGNR> + <TEXT>Table contains no field &1 for parent uuid</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>019</MSGNR> + <TEXT>Table contains no field &1 for root uuid</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>020</MSGNR> + <TEXT>No table name set</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>021</MSGNR> + <TEXT>No semantic key set</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>022</MSGNR> + <TEXT>Object name &1 is not unique within BO</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>023</MSGNR> + <TEXT>Table &1 and package &2 are not in the same software component</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>024</MSGNR> + <TEXT>CDS view &1 does not exist</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>025</MSGNR> + <TEXT>Association name must start with an underscore '_'.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>026</MSGNR> + <TEXT>Wrong cardinality. Use one, one_to_n, zero_to_n or zero_to_one.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>027</MSGNR> + <TEXT>&1 is not a field name in cds view of entity &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>028</MSGNR> + <TEXT>Wrong usage &1. Use FILTER, FILTER_AND_RESULT or RESULT.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>029</MSGNR> + <TEXT>Invalid json array name &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>030</MSGNR> + <TEXT>Invalid json object name &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>031</MSGNR> + <TEXT>Invalid json property name &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>032</MSGNR> + <TEXT>Field &1 is not in data source &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>033</MSGNR> + <TEXT>Field &1 is not in cds view &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>034</MSGNR> + <TEXT>No objectId set in &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>035</MSGNR> + <TEXT>Invalid data source type &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>036</MSGNR> + <TEXT>No data source set for entity &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>037</MSGNR> + <TEXT>Value of namespace &1 is not valid. Use Y..., Z... or /.../.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>038</MSGNR> + <TEXT>&1 is not the key field of &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>039</MSGNR> + <TEXT>Type of &1 is not UUID in 16 Bytes (Raw Format)</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>040</MSGNR> + <TEXT>Entity &1 has too many key fields &2. Only one of type UUID is allowed.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>041</MSGNR> + <TEXT>Entity &1 has no key field.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>042</MSGNR> + <TEXT>Invalid binding type &1. Use &2 instead.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>043</MSGNR> + <TEXT>Invalid transport request &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>044</MSGNR> + <TEXT>No draft table specified for entity &1 in draft enabled BO &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>045</MSGNR> + <TEXT>Table &1 is inactive.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>046</MSGNR> + <TEXT>Cannot add additional fields to object type &1.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>047</MSGNR> + <TEXT>&1 not implemented. Additional info &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>048</MSGNR> + <TEXT>&1 not draft enabled</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>049</MSGNR> + <TEXT>&1 has no UI V4 service binding</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>050</MSGNR> + <TEXT>Admin field &1 is missing in table &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>051</MSGNR> + <TEXT>Tranport request &1 does not exist</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>052</MSGNR> + <TEXT>Underscore not permitted at 2nd or 3rd position object name &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>053</MSGNR> + <TEXT>publish_service = abap_true and skip_activation = abap_true not possible</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>054</MSGNR> + <TEXT>&1 Grandchild nodes are not supported for &2 = &3.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>055</MSGNR> + <TEXT>No total etag field found in &2. lastChangedAt mapped as &1.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>056</MSGNR> + <TEXT>No etag master field found in &2. Etag master mapped as &1.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>057</MSGNR> + <TEXT>ABAP type &1 specified for &2 is not valid: &3.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>058</MSGNR> + <TEXT>For multi-edit BO &1 must be draft enabled and must use OData V4</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>059</MSGNR> + <TEXT>For customizing BO &1 must be draft enabled and must use OData V4</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>060</MSGNR> + <TEXT>Customizing table &1 must use delivery class 'C' not '&2'.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>061</MSGNR> + <TEXT>&1: view type &2 not supported</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>062</MSGNR> + <TEXT>Entity &1 does not contain any fields.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>063</MSGNR> + <TEXT>&1: No draft support for custom entities.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>064</MSGNR> + <TEXT>Job scheduling error &1 &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>065</MSGNR> + <TEXT>&1: Invalid package type &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>066</MSGNR> + <TEXT>&1: Set Etag master in custom child entities.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>067</MSGNR> + <TEXT>For multi-edit and cust. only use datasource type 'table' not &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>068</MSGNR> + <TEXT>For multi-edit and cust. only use imp. type 'managed_semantic' not &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>069</MSGNR> + <TEXT>Services registered in Maintain Business Conf. App can only have 2 Levels</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>070</MSGNR> + <TEXT>Mandatory field &1 for entity &2 is initial</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>071</MSGNR> + <TEXT>Mandatory field &1 for rap generator project &2 is initial</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>072</MSGNR> + <TEXT>&1: No OData V4 support for custom entities.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>073</MSGNR> + <TEXT>Service Binding &1 is still published. Unpulish it and close tab in ADT.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>074</MSGNR> + <TEXT>Service binding - publishing error &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>075</MSGNR> + <TEXT>Service binding - un-publishing error &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>076</MSGNR> + <TEXT>Method not implemented &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>077</MSGNR> + <TEXT>Generated repository objects still exist for rap bo &1</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>078</MSGNR> + <TEXT>&1: OData V4 UI servicebindings require draft</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>079</MSGNR> + <TEXT>Datasource type &3 does not support impl. type &1, only &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>080</MSGNR> + <TEXT>Extension element suffix &1 must consist of 3 alphabetical characters.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>081</MSGNR> + <TEXT>No extension element suffix set</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>082</MSGNR> + <TEXT>Extension element suffix &1 in entity &2 is not unique</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>083</MSGNR> + <TEXT>RAP BO has too many node &1. Reason: &2.</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>084</MSGNR> + <TEXT>Table &1 locked by transport &2</TEXT> + </T100> + <T100> + <SPRSL>E</SPRSL> + <ARBGB>ZDMO_CM_RAP_GEN_MSG</ARBGB> + <MSGNR>085</MSGNR> + <TEXT>Table &1 is not extensible &2</TEXT> + </T100> + </T100> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cx_rap_gen_custom_entity.clas.abap b/src/zdmo_cx_rap_gen_custom_entity.clas.abap new file mode 100644 index 0000000..112dfae --- /dev/null +++ b/src/zdmo_cx_rap_gen_custom_entity.clas.abap @@ -0,0 +1,46 @@ +CLASS zdmo_cx_rap_gen_custom_entity DEFINITION + PUBLIC + INHERITING FROM cx_rap_query_provider + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + METHODS constructor + IMPORTING + !textid LIKE if_t100_message=>t100key OPTIONAL + !previous LIKE previous OPTIONAL . + + CONSTANTS: + + BEGIN OF query_failed, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '016', + attr1 TYPE scx_attrname VALUE 'attr1', + attr2 TYPE scx_attrname VALUE 'attr2', + attr3 TYPE scx_attrname VALUE 'attr3', + attr4 TYPE scx_attrname VALUE 'attr4', + END OF query_failed + . + + + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CX_RAP_GEN_CUSTOM_ENTITY IMPLEMENTATION. + + + METHOD constructor ##ADT_SUPPRESS_GENERATION. + super->constructor( previous = previous ). + + CLEAR me->textid. + IF textid IS INITIAL. + if_t100_message~t100key = if_t100_message=>default_textid. + ELSE. + if_t100_message~t100key = textid. + ENDIF. + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cx_rap_gen_custom_entity.clas.xml b/src/zdmo_cx_rap_gen_custom_entity.clas.xml new file mode 100644 index 0000000..c66037e --- /dev/null +++ b/src/zdmo_cx_rap_gen_custom_entity.clas.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CX_RAP_GEN_CUSTOM_ENTITY</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Exceptions raised by custom entities</DESCRIPT> + <CATEGORY>40</CATEGORY> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_cx_rap_generator.clas.abap b/src/zdmo_cx_rap_generator.clas.abap new file mode 100644 index 0000000..2f94d39 --- /dev/null +++ b/src/zdmo_cx_rap_generator.clas.abap @@ -0,0 +1,772 @@ +CLASS zdmo_cx_rap_generator DEFINITION + PUBLIC + INHERITING FROM cx_xco_runtime_exception + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + +* INTERFACES if_t100_dyn_msg . +* INTERFACES if_t100_message . + + CONSTANTS: + + gc_msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + + + BEGIN OF is_no_child_nor_grandchild, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '001', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE 'MV_ROOT_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF is_no_child_nor_grandchild, + BEGIN OF non_alpha_numeric_characters, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '002', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF non_alpha_numeric_characters, + BEGIN OF contains_spaces, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '003', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF contains_spaces, + BEGIN OF is_too_long, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '004', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_MAX_LENGTH', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF is_too_long, + BEGIN OF node_is_not_consistent, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '005', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF node_is_not_consistent, + BEGIN OF entity_name_is_not_unique, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '005', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF entity_name_is_not_unique, + BEGIN OF implementation_type_not_valid, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '006', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF implementation_type_not_valid, + BEGIN OF no_namespace_set, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '007', + attr1 TYPE scx_attrname VALUE '', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_namespace_set, + BEGIN OF node_is_not_finalized, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '008', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF node_is_not_finalized, + BEGIN OF is_not_a_root_node, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '009', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF is_not_a_root_node, + BEGIN OF sematic_key_is_not_in_table, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '010', + attr1 TYPE scx_attrname VALUE 'MV_SEMANTIC_KEY_FIELD', + attr2 TYPE scx_attrname VALUE 'MV_TABLE_NAME', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF sematic_key_is_not_in_table, + BEGIN OF repository_already_exists, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '011', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF repository_already_exists, + BEGIN OF cannot_check_object_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '012', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF cannot_check_object_type, + BEGIN OF parameter_is_initial, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '013', + attr1 TYPE scx_attrname VALUE 'MV_PARAMETER_NAME', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF parameter_is_initial, + BEGIN OF package_does_not_exist, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '014', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF package_does_not_exist, + BEGIN OF table_does_not_exist, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '015', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF table_does_not_exist, + BEGIN OF root_cause_exception, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '016', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE 'MV_PARAMETER', + attr4 TYPE scx_attrname VALUE '', + END OF root_cause_exception, + BEGIN OF field_uuid_missing, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '017', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_uuid_missing, + BEGIN OF field_parent_uuid_missing, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '018', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_parent_uuid_missing, + BEGIN OF field_root_uuid_missing, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '019', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_root_uuid_missing, + BEGIN OF no_table_set, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '020', + attr1 TYPE scx_attrname VALUE '', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_table_set, + BEGIN OF no_semantic_key_set, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '021', + attr1 TYPE scx_attrname VALUE '', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_semantic_key_set, + BEGIN OF object_name_is_not_unique, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '022', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF object_name_is_not_unique, + BEGIN OF software_comp_do_not_match, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '023', + attr1 TYPE scx_attrname VALUE 'MV_TABLE_NAME', + attr2 TYPE scx_attrname VALUE 'MV_PACKAGE_NAME', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF software_comp_do_not_match, + BEGIN OF cds_view_does_not_exist, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '024', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF cds_view_does_not_exist, + BEGIN OF starts_not_with_underscore, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '025', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF starts_not_with_underscore, + BEGIN OF assocation_is_not_supported, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '026', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF assocation_is_not_supported, + BEGIN OF not_a_field_in_cds_view, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '027', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF not_a_field_in_cds_view, + BEGIN OF usage_is_not_supported, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '028', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF usage_is_not_supported, + BEGIN OF invalid_json_array_name, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '029', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_json_array_name, + BEGIN OF invalid_json_object_name, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '030', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_json_object_name, + BEGIN OF invalid_json_property_name, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '031', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_json_property_name, + BEGIN OF field_is_not_in_datasource, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '032', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_TABLE_NAME', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_is_not_in_datasource, + BEGIN OF field_is_not_in_cds_view, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '033', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_is_not_in_cds_view, + + BEGIN OF no_object_id_set, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '034', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_object_id_set, + BEGIN OF invalid_data_source_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '035', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_data_source_type, + BEGIN OF no_data_source_set, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '036', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_data_source_set, + BEGIN OF invalid_namespace, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '037', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_namespace, + BEGIN OF uuid_is_not_key_field, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '038', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF uuid_is_not_key_field, + BEGIN OF uuid_has_invalid_data_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '039', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF uuid_has_invalid_data_type, + BEGIN OF more_than_one_key_field, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '040', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE 'MV_VALUE', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF more_than_one_key_field, + BEGIN OF has_no_key_field, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '041', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF has_no_key_field, + BEGIN OF invalid_binding_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '042', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_binding_type, + BEGIN OF invalid_transport_request, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '043', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_transport_request, + BEGIN OF no_draft_table_specified, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '044', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE 'MV_ROOT_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_draft_table_specified, + BEGIN OF table_is_inactive, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '045', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF table_is_inactive, + BEGIN OF cannot_add_additional_fields, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '046', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF cannot_add_additional_fields, + + BEGIN OF not_implemented, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '047', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF not_implemented, + BEGIN OF not_draft_enabled, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '048', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF not_draft_enabled, + BEGIN OF no_ui_v4_service_binding, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '049', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_ui_v4_service_binding, + BEGIN OF admin_field_missing, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '050', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF admin_field_missing, + BEGIN OF transport_does_not_exist, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '051', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF transport_does_not_exist, + BEGIN OF underscore_not_at_pos_2_3, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '052', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF underscore_not_at_pos_2_3, + BEGIN OF publish_needs_active_srvd, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '053', + attr1 TYPE scx_attrname VALUE '', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF publish_needs_active_srvd, + BEGIN OF grand_child_not_supported, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '054', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE 'MV_VALUE', + attr3 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr4 TYPE scx_attrname VALUE '', + END OF grand_child_not_supported, + BEGIN OF field_total_etag_missing, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '055', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_total_etag_missing, + BEGIN OF field_etag_master_missing, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '056', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF field_etag_master_missing, + BEGIN OF invalid_abap_type_name, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '057', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_abap_type_name, + BEGIN OF clnt_is_not_key_field, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '038', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF clnt_is_not_key_field, + BEGIN OF mult_edit_not_supported, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '058', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF mult_edit_not_supported, + BEGIN OF delivery_class_c_required, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '060', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF delivery_class_c_required, + BEGIN OF view_type_not_supported, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '061', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE 'MV_VALUE', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF view_type_not_supported, + BEGIN OF no_fields_found, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '062', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_fields_found, + BEGIN OF no_draft_for_cust_entites, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '063', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_draft_for_cust_entites, + BEGIN OF job_scheduling_error, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '064', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF job_scheduling_error, + BEGIN OF invalid_package_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '065', + attr1 TYPE scx_attrname VALUE 'MV_PACKAGE_NAME', + attr2 TYPE scx_attrname VALUE 'MV_VALUE', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_package_type, + BEGIN OF no_etag_delegation_support, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '066', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_etag_delegation_support, + BEGIN OF multi_edit_datasource_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '067', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF multi_edit_datasource_type, + BEGIN OF multi_edit_implementation_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '068', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF multi_edit_implementation_type, + BEGIN OF exceeds_max_mbc_hierachy_level, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '069', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF exceeds_max_mbc_hierachy_level, + BEGIN OF mandatory_field_for_entity, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '070', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF mandatory_field_for_entity, + BEGIN OF mandatory_field_for_project, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '071', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF mandatory_field_for_project, + BEGIN OF no_odatav4_for_cust_entites, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '072', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_odatav4_for_cust_entites, + BEGIN OF service_binding_is_published, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '073', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF service_binding_is_published, + BEGIN OF service_binding_publish_err, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '074', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF service_binding_publish_err, + BEGIN OF service_binding_un_publish_err, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '075', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF service_binding_un_publish_err, + BEGIN OF method_not_implemented, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '076', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF method_not_implemented, + BEGIN OF generated_objects_still_exist, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '077', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF generated_objects_still_exist, + BEGIN OF no_odatav4_UI_srvb_wo_draft, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '078', + attr1 TYPE scx_attrname VALUE 'MV_ENTITY', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_odatav4_UI_srvb_wo_draft + , + "Datasource type &3 does not support impl. type &1, only &2. + BEGIN OF data_source_invalid_imp_type, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '079', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE 'MV_PARAMETER_NAME', + attr4 TYPE scx_attrname VALUE '', + END OF data_source_invalid_imp_type, + BEGIN OF invalid_ext_element_Suffix, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '080', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF invalid_ext_element_Suffix, + BEGIN OF no_ext_element_Suffix_set, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '081', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE '', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF no_ext_element_Suffix_set, + BEGIN OF ext_elem_suffix_is_not_unique, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '082', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_ENTITY', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF ext_elem_suffix_is_not_unique, + BEGIN OF too_many_nodes, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '083', + attr1 TYPE scx_attrname VALUE 'MV_VALUE', + attr2 TYPE scx_attrname VALUE 'MV_VALUE_2', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF too_many_nodes, + begin of table_locked_by_transport, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '084', + attr1 TYPE scx_attrname VALUE 'MV_TABLE_NAME', + attr2 TYPE scx_attrname VALUE 'MV_VALUE', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF table_locked_by_transport, + begin of table_not_extensible, + msgid TYPE symsgid VALUE 'ZDMO_CM_RAP_GEN_MSG', + msgno TYPE symsgno VALUE '085', + attr1 TYPE scx_attrname VALUE 'MV_TABLE_NAME', + attr2 TYPE scx_attrname VALUE 'MV_VALUE', + attr3 TYPE scx_attrname VALUE '', + attr4 TYPE scx_attrname VALUE '', + END OF table_not_extensible + . + + + + DATA mv_entity TYPE sxco_ddef_alias_name. + DATA mv_root_entity TYPE sxco_ddef_alias_name. + DATA mv_value TYPE string. + DATA mv_value_2 TYPE string. + DATA mv_max_length TYPE i. + DATA mv_parameter_name TYPE string. + DATA mv_semantic_key_field TYPE string. + DATA mv_table_name TYPE string. + DATA mv_package_name TYPE string. + + CLASS-METHODS class_constructor . + METHODS constructor + IMPORTING + !textid LIKE if_t100_message=>t100key OPTIONAL + !previous LIKE previous OPTIONAL + !mv_entity TYPE sxco_ddef_alias_name OPTIONAL + !mv_root_entity TYPE sxco_ddef_alias_name OPTIONAL + !mv_value TYPE string OPTIONAL + !mv_value_2 TYPE string OPTIONAL + !mv_max_length TYPE i OPTIONAL + !mv_parameter_name TYPE string OPTIONAL + !mv_semantic_key_field TYPE string OPTIONAL + !mv_table_name TYPE string OPTIONAL + !mv_package_name TYPE string OPTIONAL . + + PROTECTED SECTION. + PRIVATE SECTION. +ENDCLASS. + + + +CLASS ZDMO_CX_RAP_GENERATOR IMPLEMENTATION. + + + METHOD class_constructor. + ENDMETHOD. + + + METHOD constructor ##ADT_SUPPRESS_GENERATION. + CALL METHOD super->constructor + EXPORTING + previous = previous + textid = textid. + me->mv_entity = mv_entity. + me->mv_root_entity = mv_root_entity. + me->mv_value = mv_value. + me->mv_value_2 = mv_value_2. + me->mv_max_length = mv_max_length. + me->mv_parameter_name = mv_parameter_name. + me->mv_semantic_key_field = mv_semantic_key_field. + me->mv_table_name = mv_table_name. + me->mv_package_name = mv_package_name. + CLEAR me->textid. + IF textid IS INITIAL. + if_t100_message~t100key = if_t100_message=>default_textid. + ELSE. + if_t100_message~t100key = textid. + ENDIF. + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_cx_rap_generator.clas.xml b/src/zdmo_cx_rap_generator.clas.xml new file mode 100644 index 0000000..4c9317d --- /dev/null +++ b/src/zdmo_cx_rap_generator.clas.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_CX_RAP_GENERATOR</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>Exceptions RAP Generator</DESCRIPT> + <CATEGORY>40</CATEGORY> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_draft_incl.tabl.xml b/src/zdmo_draft_incl.tabl.xml new file mode 100644 index 0000000..93d2869 --- /dev/null +++ b/src/zdmo_draft_incl.tabl.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_DRAFT_INCL</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <LANGDEP>X</LANGDEP> + <DDTEXT>Draft table with include used as a template</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_DRAFT_INCL</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>SEMANTIC_KEY</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000010</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000005</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>.INCLUDE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD> + <MASK> S</MASK> + <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT> + <COMPTYPE>S</COMPTYPE> + <GROUPNAME>%ADMIN</GROUPNAME> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_DRAFT_INCL</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_fcal_holi.tabl.xml b/src/zdmo_fcal_holi.tabl.xml new file mode 100644 index 0000000..99cc02b --- /dev/null +++ b/src/zdmo_fcal_holi.tabl.xml @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_FCAL_HOLI</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>Holiday Calendar</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <MAINFLAG>X</MAINFLAG> + <CONTFLAG>C</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_FCAL_HOLI</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>MANDT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>HOLIDAY_ID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>ZDMO_FCAL_HOLIDAY_ID</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>MONTH_OF_HOLIDAY</FIELDNAME> + <ROLLNAME>FDT_MONTH</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DAY_OF_HOLIDAY</FIELDNAME> + <ROLLNAME>FDT_DAY_OF_MONTH</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CONFIGDEPRECATIONCODE</FIELDNAME> + <ROLLNAME>CONFIG_DEPRECATION_CODE</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_FCAL_HOLI</TABNAME> + <CCLASS>CUS_DEV_SUP_RO</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_fcal_holi_t.tabl.xml b/src/zdmo_fcal_holi_t.tabl.xml new file mode 100644 index 0000000..00c37ac --- /dev/null +++ b/src/zdmo_fcal_holi_t.tabl.xml @@ -0,0 +1,108 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_FCAL_HOLI_T</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>Holiday Calendar Text Table</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <MAINFLAG>X</MAINFLAG> + <CONTFLAG>C</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_FCAL_HOLI_T</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <UEBERSETZ>X</UEBERSETZ> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>MANDT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SPRAS</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SPRAS</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <SHLPORIGIN>D</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + <LANGUFLAG>X</LANGUFLAG> + </DD03P> + <DD03P> + <FIELDNAME>HOLIDAY_ID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>ZDMO_FCAL_HOLIDAY_ID</ROLLNAME> + <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <SHLPORIGIN>P</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FCAL_DESCRIPTION</FIELDNAME> + <ROLLNAME>SXCO_AO_SHORT_DESCRIPTION</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <DD05M_TABLE> + <DD05M> + <FIELDNAME>HOLIDAY_ID</FIELDNAME> + <FORTABLE>ZDMO_FCAL_HOLI_T</FORTABLE> + <FORKEY>CLIENT</FORKEY> + <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE> + <CHECKFIELD>CLIENT</CHECKFIELD> + <PRIMPOS>0001</PRIMPOS> + <DOMNAME>MANDT</DOMNAME> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + </DD05M> + <DD05M> + <FIELDNAME>HOLIDAY_ID</FIELDNAME> + <FORTABLE>ZDMO_FCAL_HOLI_T</FORTABLE> + <FORKEY>HOLIDAY_ID</FORKEY> + <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE> + <CHECKFIELD>HOLIDAY_ID</CHECKFIELD> + <PRIMPOS>0002</PRIMPOS> + <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME> + <DATATYPE>NUMC</DATATYPE> + <LENG>000006</LENG> + </DD05M> + </DD05M_TABLE> + <DD08V_TABLE> + <DD08V> + <FIELDNAME>HOLIDAY_ID</FIELDNAME> + <CHECKTABLE>ZDMO_FCAL_HOLI</CHECKTABLE> + <FRKART>TEXT</FRKART> + <CARD>CN</CARD> + <CHECKFLAG>X</CHECKFLAG> + <CARDLEFT>1</CARDLEFT> + </DD08V> + </DD08V_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_FCAL_HOLI_T</TABNAME> + <CCLASS>CUS_DEV_SUP_RO</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_fcal_holiday_id.doma.xml b/src/zdmo_fcal_holiday_id.doma.xml new file mode 100644 index 0000000..0085cc7 --- /dev/null +++ b/src/zdmo_fcal_holiday_id.doma.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD01V> + <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DATATYPE>NUMC</DATATYPE> + <LENG>000006</LENG> + <OUTPUTLEN>000006</OUTPUTLEN> + <DDTEXT>Holiday ID</DDTEXT> + <DOMMASTER>E</DOMMASTER> + </DD01V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_fcal_holiday_id.dtel.xml b/src/zdmo_fcal_holiday_id.dtel.xml new file mode 100644 index 0000000..ecfdf0f --- /dev/null +++ b/src/zdmo_fcal_holiday_id.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_FCAL_HOLIDAY_ID</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Holiday ID</DDTEXT> + <REPTEXT>Holiday ID</REPTEXT> + <SCRTEXT_S>id</SCRTEXT_S> + <SCRTEXT_M>Holiday ID</SCRTEXT_M> + <SCRTEXT_L>Holiday ID</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_gen_rap110_single.clas.abap b/src/zdmo_gen_rap110_single.clas.abap new file mode 100644 index 0000000..95ddff2 --- /dev/null +++ b/src/zdmo_gen_rap110_single.clas.abap @@ -0,0 +1,2586 @@ +CLASS zdmo_gen_rap110_single DEFINITION + +INHERITING FROM zdmo_cl_rap_generator_base +************************************************************************** +** +** Welcome to the RAP110 travel exercise generator! +** +** STAND: 2023-05-08 --> OKAY +** Adjust superpackage and TR +** ... +************************************************************************** + + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_oo_adt_classrun. + METHODS constructor + IMPORTING i_unique_suffix TYPE string OPTIONAL. + + PROTECTED SECTION. + + PRIVATE SECTION. + + + CONSTANTS: + co_prefix TYPE string VALUE 'ZRAP110_', + co_zlocal_package TYPE sxco_package VALUE 'ZLOCAL', +* co_zrap110_ex_package TYPE sxco_package VALUE 'ZRAP110_EXERCISES'. + co_zrap110_ex_package TYPE sxco_package VALUE 'ZLOCAL'. +* co_zrap110_ex_package TYPE sxco_package VALUE 'ZRAP110_DRYRUN'. + + + + + + + + + + DATA xco_on_prem_library TYPE REF TO zdmo_cl_rap_xco_on_prem_lib. + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA package_name TYPE sxco_package . + DATA unique_suffix TYPE string. +* DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system. + DATA transport TYPE sxco_transport . + "database tables + DATA table_name_root TYPE sxco_dbt_object_name. + DATA table_name_child TYPE sxco_dbt_object_name. + DATA draft_table_name_root TYPE sxco_dbt_object_name. + DATA draft_table_name_child TYPE sxco_dbt_object_name. + DATA data_generator_class_name TYPE sxco_ad_object_name. + DATA calc_travel_elem_class_name TYPE sxco_ad_object_name. + DATA calc_booking_elem_class_name TYPE sxco_ad_object_name. + DATA eml_playground_class_name TYPE sxco_ad_object_name. + "CDS views + DATA r_view_name_travel TYPE sxco_cds_object_name. + DATA r_view_name_booking TYPE sxco_cds_object_name. + DATA c_view_name_travel TYPE sxco_cds_object_name. + DATA c_view_name_booking TYPE sxco_cds_object_name. + DATA i_view_name_travel TYPE sxco_cds_object_name. + DATA i_view_name_booking TYPE sxco_cds_object_name. + DATA create_mde_files TYPE abap_bool. + "Behavior pools + DATA beh_impl_name_travel TYPE sxco_ao_object_name. + DATA beh_impl_name_booking TYPE sxco_ao_object_name. + "business service + DATA srv_definition_name TYPE sxco_srvd_object_name. + DATA srv_binding_o4_name TYPE sxco_srvb_service_name. + DATA debug_modus TYPE abap_bool VALUE abap_true. + + + TYPES: BEGIN OF t_table_fields, + field TYPE sxco_ad_field_name, + is_key TYPE abap_bool, + not_null TYPE abap_bool, + currencyCode TYPE sxco_cds_field_name, + unitOfMeasure TYPE sxco_cds_field_name, + data_element TYPE sxco_ad_object_name, + built_in_type TYPE cl_xco_ad_built_in_type=>tv_type, + built_in_type_length TYPE cl_xco_ad_built_in_type=>tv_length, + built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals, + END OF t_table_fields. + + TYPES: tt_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field. + + METHODS create_tables IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out . + + METHODS create_rap_bo IMPORTING out TYPE REF TO if_oo_adt_classrun_out + EXPORTING eo_root_node TYPE REF TO zdmo_cl_rap_node . + METHODS delete_iview_and_mde IMPORTING out TYPE REF TO if_oo_adt_classrun_out . + + METHODS create_abs_ent_a_create_travel IMPORTING out TYPE REF TO if_oo_adt_classrun_out . + METHODS create_abs_ent_a_daystoflight IMPORTING out TYPE REF TO if_oo_adt_classrun_out. + METHODS create_abs_ent_a_travel IMPORTING out TYPE REF TO if_oo_adt_classrun_out. + + METHODS create_number_range IMPORTING out TYPE REF TO if_oo_adt_classrun_out. + + METHODS create_additional_objects IMPORTING out TYPE REF TO if_oo_adt_classrun_out. + + METHODS get_unique_suffix IMPORTING VALUE(s_prefix) TYPE string RETURNING VALUE(s_unique_suffix) TYPE string. + METHODS create_transport RETURNING VALUE(lo_transport) TYPE sxco_transport. + METHODS create_super_package. "only needed on-prem + METHODS create_package IMPORTING VALUE(lo_transport) TYPE sxco_transport. + METHODS create_package_in_zlocal IMPORTING VALUE(lo_transport) TYPE sxco_transport. + + +* METHODS generate_table IMPORTING io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put +* table_fields TYPE tt_fields +* table_name TYPE sxco_dbt_object_name +* table_short_description TYPE if_xco_cp_gen_tabl_dbt_s_form=>tv_short_description. +* +* METHODS generate_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put . +* METHODS generate_virt_elem_trav_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put . +* METHODS generate_virt_elem_book_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put . +* METHODS generate_eml_playground_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation TYPE REF TO if_xco_cp_gen_d_o_put . + + METHODS generate_table IMPORTING io_put_operation LIKE mo_put_operation " TYPE REF TO if_xco_gen_o_mass_put + table_fields TYPE tt_fields + table_name TYPE sxco_dbt_object_name + table_short_description TYPE if_xco_cp_gen_tabl_dbt_s_form=>tv_short_description. + + METHODS generate_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation . + METHODS generate_virt_elem_trav_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation . + METHODS generate_virt_elem_book_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation . + METHODS generate_eml_playground_class IMPORTING VALUE(lo_transport) TYPE sxco_transport io_put_operation LIKE mo_put_operation. + + + + + + +* METHODS generate_data. + METHODS get_root_table_fields RETURNING VALUE(root_table_fields) TYPE tt_fields. + METHODS get_child_table_fields RETURNING VALUE(child_table_fields) TYPE tt_fields. +* +* METHODS release_data_generator_class IMPORTING VALUE(lo_transport) TYPE sxco_transport. + METHODS get_json_string RETURNING VALUE(json_string) TYPE string. + METHODS generate_cds_mde IMPORTING io_out TYPE REF TO if_oo_adt_classrun_out + io_root_node TYPE REF TO zdmo_cl_rap_node . +ENDCLASS. + + + +CLASS ZDMO_GEN_RAP110_SINGLE IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + + xco_on_prem_library = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + "check whether being on cloud or on prem + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + IF i_unique_suffix IS INITIAL. + unique_suffix = get_unique_suffix( co_prefix ). + ELSE. + unique_suffix = i_unique_suffix. + ENDIF. + + ENDMETHOD. + + + METHOD create_abs_ent_a_create_travel. + + TRY. + DATA(mo_put_operation2) = get_put_operation( mo_environment ). + DATA(lo_interface_specification) = mo_put_operation2->for-ddls->add_object( |ZRAP110_A_Create_Travel_{ unique_suffix }| + )->set_package( package_name + )->create_form_specification( ). + "add entity description + DATA(lo_abstract_entity) = lo_interface_specification->set_short_description( 'Parameter for Creating Travel+Booking' + )->add_abstract_entity( ). + "add view annotation + lo_abstract_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Parameter for Creating Travel+Booking' ). + " Add fields. + DATA(lo_identifier) = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'customer_id' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/customer_id' ) ). + + + DATA(lo_valuebuilder) = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Customer_StdVH' ) + )->add_member( 'element' )->add_string( CONV #( 'CustomerID' ) + )->end_record( ). + +* lo_valuebuilder->add_member( 'additionalBinding' +* )->begin_array( ). +* DATA(lo_record) = lo_valuebuilder->begin_record( +* )->add_member( 'localElement' )->add_string( CONV #( ls_additionalbinding-localelement ) +* )->add_member( 'element' )->add_string( CONV #( ls_additionalbinding-element ) +* ). +* IF ls_additionalbinding-usage IS NOT INITIAL. +* lo_record->add_member( 'usage' )->add_enum( CONV #( ls_additionalbinding-usage ) ). +* ENDIF. +* lo_valuebuilder->end_record( ). +* lo_valuebuilder->end_array( ). + lo_valuebuilder->end_record( )->end_array( ). + + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'carrier_id' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/carrier_id' ) ). + + + lo_valuebuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Flight_StdVH' ) + )->add_member( 'element' )->add_string( CONV #( 'AirlineID' ) + )->end_record( ). + + lo_valuebuilder->add_member( 'additionalBinding' + )->begin_array( ). + DATA(lo_record) = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( 'flight_date' ) + )->add_member( 'element' )->add_string( CONV #( 'FlightDate' ) + ). + lo_record->add_member( 'usage' )->add_enum( CONV #( 'RESULT' ) ). + lo_valuebuilder->end_record( ). + + lo_record = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( 'connection_id' ) + )->add_member( 'element' )->add_string( CONV #( 'ConnectionID' ) + ). + lo_record->add_member( 'usage' )->add_enum( CONV #( 'RESULT' ) ). + + + lo_valuebuilder->end_record( ). + lo_valuebuilder->end_array( ). + lo_valuebuilder->end_record( )->end_array( ). + + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'connection_id' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/connection_id' ) ). + + lo_valuebuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Flight_StdVH' ) + )->add_member( 'element' )->add_string( CONV #( 'AirlineID' ) + )->end_record( ). + + lo_valuebuilder->add_member( 'additionalBinding' + )->begin_array( ). + + lo_record = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( 'flight_date' ) + )->add_member( 'element' )->add_string( CONV #( 'FlightDate' ) + ). + lo_record->add_member( 'usage' )->add_enum( CONV #( 'RESULT' ) ). + lo_valuebuilder->end_record( ). + + lo_record = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( 'carrier_id' ) + )->add_member( 'element' )->add_string( CONV #( 'AirlineID' ) + ). + lo_record->add_member( 'usage' )->add_enum( CONV #( 'FILTER_AND_RESULT' ) ). + lo_valuebuilder->end_record( ). + + lo_valuebuilder->end_array( ). + + lo_valuebuilder->end_record( )->end_array( ). + + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'flight_date' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/flight_date' ) ). + + lo_valuebuilder = lo_identifier->add_annotation( 'Consumption.valueHelpDefinition' )->value->build( ). + lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'entity' + )->begin_record( + )->add_member( 'name' )->add_string( CONV #( '/DMO/I_Flight_StdVH' ) + )->add_member( 'element' )->add_string( CONV #( 'AirlineID' ) + )->end_record( ). + + lo_valuebuilder->add_member( 'additionalBinding' + )->begin_array( ). + lo_record = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( 'carrier_id' ) + )->add_member( 'element' )->add_string( CONV #( 'AirlineID' ) + ). + lo_record->add_member( 'usage' )->add_enum( CONV #( 'FILTER_AND_RESULT' ) ). + lo_valuebuilder->end_record( ). + + lo_record = lo_valuebuilder->begin_record( + )->add_member( 'localElement' )->add_string( CONV #( 'connection_id' ) + )->add_member( 'element' )->add_string( CONV #( 'ConnectionID' ) + ). + lo_record->add_member( 'usage' )->add_enum( CONV #( 'FILTER_AND_RESULT' ) ). + + lo_valuebuilder->end_record( ). + lo_valuebuilder->end_array( ). + lo_valuebuilder->end_record( )->end_array( ). + + DATA(lo_result) = mo_put_operation2->execute( ). + + " handle findings + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception). + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ). + DATA(class_gen_findings) = class_gen_exception->findings. + lt_findings = class_gen_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + + ENDMETHOD. + + + METHOD create_abs_ent_a_daystoflight. + TRY. + DATA(mo_put_operation2) = get_put_operation( mo_environment ). + DATA(lo_interface_specification) = mo_put_operation2->for-ddls->add_object( |ZRAP110_A_DaysToFlight_{ unique_suffix }| + )->set_package( package_name + )->create_form_specification( ). + "add entity description + DATA(lo_abstract_entity) = lo_interface_specification->set_short_description( 'Abstract entity for Days To Flight' + )->add_abstract_entity( ). + "add view annotation + lo_abstract_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Abstract entity for Days To Flight' ). + " Add fields. + DATA(lo_identifier) = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'initial_days_to_flight' ) + )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'remaining_days_to_flight' ) + )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'booking_status_indicator' ) + )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'days_to_flight_indicator' ) + )->set_type( xco_cp_abap_dictionary=>data_element( 'abap.int4' ) ). + + DATA(lo_result) = mo_put_operation2->execute( ). + + " handle findings + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception). + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ). + DATA(class_gen_findings) = class_gen_exception->findings. + lt_findings = class_gen_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + + ENDMETHOD. + + + METHOD create_abs_ent_a_travel. "Abstract entity for Travel + TRY. + DATA(mo_put_operation2) = get_put_operation( mo_environment ). + DATA(lo_interface_specification) = mo_put_operation2->for-ddls->add_object( |ZRAP110_A_TRAVEL_{ unique_suffix }| + )->set_package( package_name + )->create_form_specification( ). + "add entity description + DATA(lo_abstract_entity) = lo_interface_specification->set_short_description( 'Parameter for Creating Travel+Booking' + )->add_abstract_entity( ). + "add view annotation + lo_abstract_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Parameter for Creating Travel+Booking' ). + " Add fields. + DATA(lo_identifier) = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'travel_id' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/travel_id' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'agency_id' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/agency_id' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'customer_id' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/customer_id' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'overall_status' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/overall_status' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'description' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/description' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'total_price' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/total_price' ) ). + lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'currency_code' ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'currency_code' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/currency_code' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'begin_date' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/begin_date' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'end_date' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/end_date' ) ). + lo_identifier = lo_abstract_entity->add_field( xco_cp_ddl=>field( 'email_address' ) + )->set_type( xco_cp_abap_dictionary=>data_element( '/dmo/email_address' ) ). + + DATA(lo_result) = mo_put_operation2->execute( ). + + " handle findings + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception). + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ). + DATA(class_gen_findings) = class_gen_exception->findings. + lt_findings = class_gen_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + ENDMETHOD. + + + METHOD create_additional_objects. + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + TRY. + "generate Travel virtual element class + IF debug_modus = abap_true. + out->write( 'generate Travel virtual element class' ). + ENDIF. + DATA(mo_put_operation2) = get_put_operation( mo_environment ). + generate_virt_elem_trav_class( + EXPORTING + io_put_operation = mo_put_operation2 + lo_transport = transport + ). + DATA(lo_result) = mo_put_operation2->execute( ). + + " handle findings + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception). + DATA(class_gen_findings) = class_gen_exception->findings. + lt_findings = class_gen_findings->get( ). + IF debug_modus = abap_true. + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception )->if_message~get_longtext( ) ). + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + + TRY. + "generate Booking virtual element class + DATA(mo_put_operation3) = get_put_operation( mo_environment ). + generate_virt_elem_book_class( + EXPORTING + io_put_operation = mo_put_operation3 + lo_transport = transport + ). + + lo_result = mo_put_operation3->execute( ). + + " handle findings + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception_02). + DATA(class_gen_findings_02) = class_gen_exception_02->findings. + lt_findings = class_gen_findings_02->get( ). + IF debug_modus = abap_true. + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception_02 )->if_message~get_longtext( ) ). + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + + TRY. + "generate Booking virtual element class + DATA(mo_put_operation4) = get_put_operation( mo_environment ). + generate_data_generator_class( + EXPORTING + io_put_operation = mo_put_operation4 + lo_transport = transport + ). + + lo_result = mo_put_operation4->execute( ). + + " handle findings + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception_03). + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception_03 )->if_message~get_longtext( ) ). + DATA(class_gen_findings_03) = class_gen_exception_03->findings. + lt_findings = class_gen_findings_03->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + + TRY. + "generate EML playground class class + DATA(mo_put_operation5) = get_put_operation( mo_environment ). + generate_eml_playground_class( + EXPORTING + io_put_operation = mo_put_operation5 + lo_transport = transport + ). + + lo_result = mo_put_operation5->execute( ). + + " handle findings + lo_findings = lo_result->findings. + lt_findings = lo_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + out->write( lt_findings ). + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(class_gen_exception_05). + out->write( cl_message_helper=>get_latest_t100_exception( class_gen_exception_05 )->if_message~get_longtext( ) ). + DATA(class_gen_findings_05) = class_gen_exception_05->findings. + lt_findings = class_gen_findings_05->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + + """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""ENDE + """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" + ENDMETHOD. + + + METHOD create_number_range. + DATA: + lv_object TYPE cl_numberrange_objects=>nr_attributes-object, + lv_devclass TYPE cl_numberrange_objects=>nr_attributes-devclass, + lv_corrnr TYPE cl_numberrange_objects=>nr_attributes-corrnr. + + DATA: lt_interval TYPE cl_numberrange_intervals=>nr_interval, + ls_interval TYPE cl_numberrange_intervals=>nr_nriv_line. + + ls_interval-nrrangenr = '01'. + ls_interval-fromnumber = '00000001'. + ls_interval-tonumber = '99999999'. + ls_interval-procind = 'I'. + APPEND ls_interval TO lt_interval. + + + DATA: group_id TYPE string, + error_flag TYPE c. + + group_id = unique_suffix. + + CLEAR error_flag. + + lv_object = |ZRAP110{ group_id }|. + lv_devclass = |ZRAP110_{ group_id }|. + lv_corrnr = transport. + + TRY. + cl_numberrange_objects=>create( + EXPORTING + attributes = VALUE #( object = lv_object + domlen = '/DMO/TRAVEL_ID' + percentage = 10 + buffer = abap_false + noivbuffer = 0 + devclass = lv_devclass + corrnr = lv_corrnr ) + obj_text = VALUE #( object = lv_object + langu = 'E' + txt = |RAP110 Travel ID group { group_id }| + txtshort = 'RAP110 Travel ID' ) + IMPORTING + errors = DATA(lt_errors) + returncode = DATA(lv_returncode) + ). + + CATCH cx_nr_object_not_found INTO DATA(lx_nr_object_not_found). + ASSERT 1 = 1. error_flag = '1'. + + CATCH cx_number_ranges INTO DATA(lx_number_ranges). + ASSERT 1 = 1. error_flag = '2'. + + ENDTRY. + + + TRY. + + CALL METHOD cl_numberrange_intervals=>create + EXPORTING + interval = lt_interval + object = lv_object + subobject = ' ' + IMPORTING + error = DATA(lv_error) + error_inf = DATA(ls_error) + error_iv = DATA(lt_error_iv) + warning = DATA(lv_warning). + + CATCH cx_nr_object_not_found INTO lx_nr_object_not_found. + ASSERT 1 = 1. error_flag = '3'. + + CATCH cx_number_ranges INTO lx_number_ranges. + ASSERT 1 = 1. error_flag = '4'. + + ENDTRY. + + COMMIT WORK. + + IF error_flag > 0. + out->write( |Number Range Object: { lv_object } Package: { lv_devclass } Transport: { lv_corrnr } Error: { error_flag }| ). + ELSE. + out->write( |Number Range Object: { lv_object } Package: { lv_devclass } created.| ). + ENDIF. + + + + ENDMETHOD. + + + METHOD create_package. + DATA(package_environment) = get_environment( lo_transport ). + DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ). + DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ). + lo_specification->set_short_description( '#Generated RAP110 tutorial package' ). + lo_specification->properties->set_super_package( co_zrap110_ex_package )->set_software_component( co_zlocal_package ). + DATA(lo_result) = lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_package_in_zlocal. + DATA(package_environment) = get_environment( lo_transport ). + DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ). + DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ). + lo_specification->set_short_description( '#Generated RAP110 tutorial package' ). + lo_specification->properties->set_super_package( co_zlocal_package )->set_software_component( co_zlocal_package ). + DATA(lo_result) = lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_rap_bo. + + DATA(json_string) = get_json_string( ). " get json document + + "BO generation + TRY. + DATA(rap_bo_generator) = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ). + eo_root_node = rap_bo_generator->root_node. + + DATA(lt_todos) = rap_bo_generator->generate_bo( ). + IF debug_modus = abap_true. + " handle findings + out->write( | rap bo generated { rap_bo_generator->root_node->rap_node_objects-cds_view_r }| ). + LOOP AT lt_todos INTO DATA(ls_todo). + out->write( ls_todo-message ). + ENDLOOP. + ENDIF. + CATCH cx_xco_gen_put_exception INTO DATA(bo_gen_exception). + out->write( cl_message_helper=>get_latest_t100_exception( bo_gen_exception )->if_message~get_longtext( ) ). + DATA(bo_gen_findings) = bo_gen_exception->findings. + DATA(lt_findings) = bo_gen_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + CATCH zdmo_cx_rap_generator INTO DATA(rap_generator_exception). + IF debug_modus = abap_true. + out->write( cl_message_helper=>get_latest_t100_exception( rap_generator_exception )->if_message~get_longtext( ) ). + ENDIF. + EXIT. + ENDTRY. + + ENDMETHOD. + + + METHOD create_super_package. + DATA(lo_environment) = get_environment( ). + DATA(lo_put_operation) = get_put_operation_for_devc( lo_environment ). + DATA(lo_specification) = lo_put_operation->add_object( co_zlocal_package )->create_form_specification( ). + lo_specification->set_short_description( 'RAP110 tutorial super package' ). + lo_specification->properties->set_software_component( 'LOCAL' ). + lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_tables. + + mo_environment = get_environment( transport ). + mo_put_operation = get_put_operation( mo_environment )."->create_put_operation( ). + DATA(lo_objects_put_operation) = get_put_operation( mo_environment ). + + DATA(lo_table_root) = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_root ) ). + DATA(lo_table_child) = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_child ) ). + + DATA table_generated TYPE abap_bool. + DATA table_exists TYPE abap_bool. + + DATA(root_table_fields) = get_root_table_fields( ). + DATA(child_table_fields) = get_child_table_fields( ). + + IF lo_table_root->exists( + io_origin = xco_cp_table=>origin->local( ) + ) = abap_false AND + lo_table_child->exists( + io_origin = xco_cp_table=>origin->local( ) + ) = abap_false. + + "generate of travel table + generate_table( + EXPORTING + io_put_operation = lo_objects_put_operation + table_fields = root_table_fields + table_name = table_name_root + table_short_description = 'Travel data' + ). + "generate of booking table + generate_table( + EXPORTING + io_put_operation = lo_objects_put_operation + table_fields = child_table_fields + table_name = table_name_child + table_short_description = 'Booking data' + ). + + TRY. + "create the tables + DATA(lo_result) = lo_objects_put_operation->execute( ). + IF debug_modus = abap_true. + io_out->write( | - Table { table_name_child } has been created.| ). + io_out->write( | - Table { table_name_root } has been created.| ). + + " handle findings + DATA(lo_findings) = lo_result->findings. + DATA(lt_findings) = lo_findings->get( ). + IF lt_findings IS NOT INITIAL. + io_out->write( lt_findings ). + ENDIF. + ENDIF. + CATCH cx_xco_gen_put_exception INTO DATA(table_exception). + io_out->write( cl_message_helper=>get_latest_t100_exception( table_exception )->if_message~get_longtext( ) ). + DATA(table_findings) = table_exception->findings. + lt_findings = table_findings->get( ). + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + io_out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + EXIT. + ENDTRY. + ELSE. + table_exists = abap_true. + io_out->write( | - Table { table_name_root } already exists.| ). + ENDIF. + ENDMETHOD. + + + METHOD create_transport. + DATA(ls_package) = xco_lib->get_package( co_zlocal_package ). + IF ls_package->read( )-property-record_object_changes = abap_true. +* DATA(ls_package) = xco_cp_abap_repository=>package->for( co_zlocal_package )->read( ). + DATA(lv_transport_layer) = ls_package->read( )-property-transport_layer->value. + DATA(lv_transport_target) = ls_package->read( )-property-transport_layer->get_transport_target( )->value. + DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( '#Generated RAP110 tutorial transport request' ). + lo_transport = lo_transport_request->value. + ENDIF. + ENDMETHOD. + + + METHOD delete_iview_and_mde. + "CDS MDE deletion and generation + TRY. + + DATA lv_del_transport TYPE sxco_transport. + lv_del_transport = transport. + IF debug_modus = abap_true. + out->write( |use transport for deletion { lv_del_transport }| ). + ENDIF. + IF lv_del_transport IS INITIAL. + DATA(cts_obj) = xco_cp_abap_repository=>object->for( + EXPORTING + iv_type = 'DDLX' + iv_name = to_upper( c_view_name_travel ) + )->if_xco_cts_changeable~get_object( ). + lv_del_transport = cts_obj->get_lock( )->get_transport( ). + lv_del_transport = xco_cp_cts=>transport->for( lv_del_transport )->get_request( )->value. + ENDIF. + + DATA(mo_environment2) = get_environment( lv_del_transport ). +* mo_environment2 = get_environment( lv_del_transport ). "xco_cp_generation=>environment->dev_system( lv_del_transport ). + DATA(lo_delete_ddlx_operation) = mo_environment2->for-ddlx->create_delete_operation( ). + lo_delete_ddlx_operation->add_object( c_view_name_travel ). + lo_delete_ddlx_operation->add_object( c_view_name_booking ). + DATA(result_del_ddlx) = lo_delete_ddlx_operation->execute( ). + + IF debug_modus = abap_true. + out->write( |Success: deleting CDS MDE objects| ). + DATA(lt_findings) = result_del_ddlx->findings->get( ). + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + + DATA(lo_delete_bdef_iview_operation) = mo_environment2->for-bdef->create_delete_operation( ). + lo_delete_bdef_iview_operation->add_object( i_view_name_travel ). + + IF debug_modus = abap_true. + out->write( |add object i bdef for deletion { i_view_name_travel } | ). + ENDIF. + DATA(result_del_bdef) = lo_delete_bdef_iview_operation->execute( ). + + IF debug_modus = abap_true. + out->write( |Success: deleting bdef interface | ). + lt_findings = result_del_bdef->findings->get( ). + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + + DATA(lo_delete_cds_iview_operation) = mo_environment2->for-ddls->create_delete_operation( ). + lo_delete_cds_iview_operation->add_object( i_view_name_travel ). + lo_delete_cds_iview_operation->add_object( i_view_name_booking ). + IF debug_modus = abap_true. + out->write( |add object i view for deletion { i_view_name_travel } and { i_view_name_booking } | ). + ENDIF. + DATA(result_del_ddls) = lo_delete_cds_iview_operation->execute( ). + + IF debug_modus = abap_true. + out->write( |Success: deleting CDS interface objects| ). + lt_findings = result_del_ddls->findings->get( ). + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + + CATCH cx_xco_gen_put_exception INTO DATA(bo_del_exception). + out->write( 'error occured' ). + out->write( cl_message_helper=>get_latest_t100_exception( bo_del_exception )->if_message~get_longtext( ) ). + DATA(bo_del_findings) = bo_del_exception->findings. + lt_findings = bo_del_findings->get( ). + IF debug_modus = abap_true. + IF lt_findings IS NOT INITIAL. + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDTRY. + + ENDMETHOD. + + + METHOD generate_cds_mde. + + DATA: pos TYPE i VALUE 0, + lo_field TYPE REF TO if_xco_gen_ddlx_s_fo_field, + lv_del_transport TYPE sxco_transport. + +* DATA(json_string) = get_json_string( ). " get json document +* DATA(rap_bo_generator) = zdmo_cl_rap_generator=>create_for_cloud_development( json_string ). + DATA(io_rap_bo_node) = io_root_node . + + DATA(cts_obj) = xco_cp_abap_repository=>object->for( + EXPORTING + iv_type = 'DDLX' + iv_name = to_upper( c_view_name_travel ) + )->if_xco_cts_changeable~get_object( ). + lv_del_transport = cts_obj->get_lock( )->get_transport( ). + lv_del_transport = xco_cp_cts=>transport->for( lv_del_transport )->get_request( )->value. + + DATA(mo_environment) = xco_cp_generation=>environment->dev_system( lv_del_transport ). + DATA(mo_put_operation) = mo_environment->create_put_operation( ). +* DATA(lv_package) = io_rap_bo_node->root_node->package. + + + + DATA(lo_specification) = mo_put_operation->for-ddlx->add_object( io_rap_bo_node->rap_node_objects-meta_data_extension + )->set_package( package_name + )->create_form_specification( ). + + lo_specification->set_short_description( |MDE for { io_rap_bo_node->rap_node_objects-alias }| + )->set_layer( xco_cp_metadata_extension=>layer->customer + )->set_view( io_rap_bo_node->rap_node_objects-cds_view_p ). . + + lo_specification->add_annotation( 'UI' )->value->build( + )->begin_record( + )->add_member( 'headerInfo' + )->begin_record( + )->add_member( 'typeName' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'typeNamePlural' )->add_string( io_rap_bo_node->rap_node_objects-alias && 's' + )->add_member( 'title' + )->begin_record( + )->add_member( 'type' )->add_enum( 'STANDARD' + )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'value' )->add_string( io_rap_bo_node->object_id_cds_field_name && '' + )->end_record( + )->end_record( + "presentationVariant: [ { sortOrder: [{ by: 'TravelID', direction: #DESC }], visualizations: [{type: #AS_LINEITEM}] }] } + )->add_member( 'presentationVariant' + )->begin_array( + )->begin_record( + )->add_member( 'sortOrder' + )->begin_array( + )->begin_record( + )->add_member( 'by' )->add_string( 'TravelID' + )->add_member( 'direction' )->add_enum( 'DESC' + )->end_record( + )->end_array( + )->add_member( 'visualizations' + )->begin_array( + )->begin_record( + )->add_member( 'type' )->add_enum( 'AS_LINEITEM' + )->end_record( + )->end_array( + )->end_record( + )->end_array( + )->end_record( ). + + + LOOP AT io_rap_bo_node->lt_fields INTO DATA(ls_header_fields) WHERE name <> io_rap_bo_node->field_name-client. + "increase position + pos += 10. + lo_field = lo_specification->add_field( ls_header_fields-cds_view_field ). + + "put facet annotation in front of the first + IF pos = 10. + IF io_rap_bo_node->is_root( ) = abap_true. + IF io_rap_bo_node->has_childs( ). + lo_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'id' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'COLLECTION' + )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->begin_record( + )->add_member( 'id' )->add_string( 'idIdentification' + )->add_member( 'parentId' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( 'General Information' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->begin_record( + )->add_member( 'id' )->add_string( 'idLineitem' + )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' + )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 20 + )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias + )->end_record( + )->end_array( ). + ELSE. + lo_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'id' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'COLLECTION' + )->add_member( 'label' )->add_string( io_rap_bo_node->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->begin_record( + )->add_member( 'id' )->add_string( 'idIdentification' + )->add_member( 'parentId' )->add_string( 'idCollection' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( 'General Information' + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->end_array( ). + ENDIF. + ELSE. + IF io_rap_bo_node->has_childs( ). + lo_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( +* )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'id' )->add_string( 'id' && io_rap_bo_node->rap_node_objects-alias + )->add_member( 'purpose' )->add_enum( 'STANDARD' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->begin_record( + )->add_member( 'id' )->add_string( 'idLineitem' + )->add_member( 'type' )->add_enum( 'LINEITEM_REFERENCE' + )->add_member( 'label' )->add_string( io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias && '' + )->add_member( 'position' )->add_number( 20 + )->add_member( 'targetElement' )->add_string( '_' && io_rap_bo_node->childnodes[ 1 ]->rap_node_objects-alias + )->end_record( + )->end_array( ). + ELSE. + lo_field->add_annotation( 'UI.facet' )->value->build( + )->begin_array( + )->begin_record( +* )->add_member( 'id' )->add_string( CONV #( 'id' && io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'id' )->add_string( 'id' && io_rap_bo_node->rap_node_objects-alias + )->add_member( 'purpose' )->add_enum( 'STANDARD' + )->add_member( 'type' )->add_enum( 'IDENTIFICATION_REFERENCE' + )->add_member( 'label' )->add_string( CONV #( io_rap_bo_node->rap_node_objects-alias ) + )->add_member( 'position' )->add_number( 10 + )->end_record( + )->end_array( ). + ENDIF. + ENDIF. + ENDIF. + + CASE to_upper( ls_header_fields-name ). + WHEN io_rap_bo_node->field_name-uuid. + "hide technical key field (uuid) + lo_field->add_annotation( 'UI.hidden' )->value->build( )->add_boolean( iv_value = abap_true ). + + WHEN io_rap_bo_node->field_name-last_changed_by OR + io_rap_bo_node->field_name-last_changed_at OR + io_rap_bo_node->field_name-created_at OR io_rap_bo_node->field_name-created_by OR + io_rap_bo_node->field_name-local_instance_last_changed_at OR + io_rap_bo_node->field_name-parent_uuid OR io_rap_bo_node->field_name-root_uuid OR + 'MIME_TYPE' OR 'FILE_NAME'. + "hide administrative fields and guid-based fields + lo_field->add_annotation( 'UI.hidden' )->value->build( )->add_boolean( iv_value = abap_true ). + +* WHEN 'LAST_CHANGED_AT' OR +* 'CREATED_BY' OR 'LOCAL_CREATED_AT' OR 'LOCAL_LAST_CHANGED_BY' + . + "do nothing. Admin fields not needed on the UI. + + WHEN 'CURRENCY_CODE'. + "do nothing. The currency will be automatically displayed with the associated amount fields + +* """"""""""""""""""""""""""""""""""""""""""""""""""""""""""" +* "display field only on object page +* DATA(lo_valuebuilder) = lo_field->add_annotation( 'UI.lineItem' )->value->build( ). +* DATA(lo_record) = lo_valuebuilder->begin_array( +* )->begin_record( +* )->add_member( 'position' )->add_number( pos "). +* )->add_member( 'importance' )->add_enum( 'HIGH'). +* +* "label for fields based on a built-in type +* IF ls_header_fields-is_data_element = abap_false. +* lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ). +* ENDIF. +* lo_valuebuilder->end_record( )->end_array( ). +* +* lo_valuebuilder = lo_field->add_annotation( 'UI.identification' )->value->build( ). +* lo_record = lo_valuebuilder->begin_array( +* )->begin_record( +* )->add_member( 'position' )->add_number( pos ). +* IF ls_header_fields-is_data_element = abap_false. +* lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ). +* ENDIF. +* lo_valuebuilder->end_record( )->end_array( ). + + WHEN OTHERS. + "display field + DATA lo_valuebuilder TYPE REF TO if_xco_gen_cds_s_fo_ann_v_bldr . + + IF ls_header_fields-name <> 'CURRENCY_CODE' AND ls_header_fields-name <> 'DESCRIPTION' + AND ls_header_fields-name <> 'TOTAL_PRICE' AND ls_header_fields-name <> 'BOOKING_FEE' + AND ls_header_fields-name <> 'BEGIN_DATE' AND ls_header_fields-name <> 'END_DATE' + AND ls_header_fields-name <> 'ATTACHMENT'. + " line item page + lo_valuebuilder = lo_field->add_annotation( 'UI.lineItem' )->value->build( ). + DATA(lo_record) = lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( pos "). + )->add_member( 'importance' )->add_enum( 'HIGH'). + + "label for fields based on a built-in type + IF ls_header_fields-is_data_element = abap_false. + lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ). + ENDIF. + lo_valuebuilder->end_record( )->end_array( ). + ENDIF. + + "object page + lo_valuebuilder = lo_field->add_annotation( 'UI.identification' )->value->build( ). + lo_record = lo_valuebuilder->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( pos ). + IF ls_header_fields-is_data_element = abap_false. + lo_record->add_member( 'label' )->add_string( CONV #( ls_header_fields-cds_view_field ) ). + ENDIF. + "add label + IF ls_header_fields-name = 'ATTACHMENT'. + lo_record->add_member( 'label' )->add_string( CONV #( 'Upload a File' ) ). + ENDIF. + lo_valuebuilder->end_record( )->end_array( ). + + "text alignment + IF ls_header_fields-name = 'CUSTOMER_ID' . + lo_field->add_annotation( 'UI.textArrangement' )->value->build( )->add_enum( iv_value = 'TEXT_FIRST' ). + ELSEIF ls_header_fields-name = 'OVERALL_STATUS' OR ls_header_fields-name = 'BOOKING_STATUS'. + lo_field->add_annotation( 'UI.textArrangement' )->value->build( )->add_enum( iv_value = 'TEXT_ONLY' ). + ENDIF. + + "selection fields + IF + ls_header_fields-name = 'TRAVEL_ID' OR + ls_header_fields-name = 'CUSTOMER_ID' OR + ls_header_fields-name = 'AGENCY_ID' . + + lo_field->add_annotation( 'UI.selectionField' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( pos + )->end_record( + )->end_array( ). + ENDIF. + IF io_rap_bo_node->is_root( ) = abap_true AND + io_rap_bo_node->get_implementation_type( ) = io_rap_bo_node->implementation_type-managed_uuid AND + ls_header_fields-name = io_rap_bo_node->object_id. + + lo_field->add_annotation( 'UI.selectionField' )->value->build( + )->begin_array( + )->begin_record( + )->add_member( 'position' )->add_number( pos + )->end_record( + )->end_array( ). + ENDIF. + ENDCASE. + ENDLOOP. + + TRY. + + mo_put_operation->execute( ). + + CATCH cx_xco_gen_put_exception INTO DATA(bo_del_exception). + IF debug_modus = abap_true. + io_out->write( 'error occured' ). + io_out->write( cl_message_helper=>get_latest_t100_exception( bo_del_exception )->if_message~get_longtext( ) ). + DATA(bo_del_findings) = bo_del_exception->findings. + DATA(lt_findings) = bo_del_findings->get( ). + IF lt_findings IS NOT INITIAL. + IF debug_modus = abap_true. + LOOP AT lt_findings INTO DATA(finding). + io_out->write( finding->message->get_text( ) ). + ENDLOOP. + ENDIF. + ENDIF. + ENDIF. + ENDTRY. + + ENDMETHOD. + + + METHOD generate_data_generator_class. + EXIT. "comment this line out if generation is needed + + DATA(lo_specification) = io_put_operation->for-clas->add_object( data_generator_class_name + )->set_package( package_name + )->create_form_specification( ). + lo_specification->set_short_description( |This class generates the test data| ). + + lo_specification->set_short_description( 'Data generator class' ). + lo_specification->definition->add_interface( 'if_oo_adt_classrun' ). + lo_specification->implementation->add_method( |if_oo_adt_classrun~main| + )->set_source( VALUE #( + + " business logic to fill both tables with demo data + ( | DELETE FROM ('{ table_name_root }').| ) + ( | " insert travel demo data | ) + ( | INSERT ('{ table_name_root }') FROM ( | ) + ( | SELECT | ) + + ( | FROM /dmo/travel AS travel | ) + ( | FIELDS | ) + ( | travel~travel_id AS travel_id, | ) + ( | travel~agency_id AS agency_id, | ) + ( | travel~customer_id AS customer_id, | ) + ( | travel~begin_date AS begin_date, | ) + ( | travel~end_date AS end_date, | ) + ( | travel~booking_fee AS booking_fee, | ) + ( | travel~total_price AS total_price, | ) + ( | travel~currency_code AS currency_code, | ) + ( | travel~description AS description, | ) + ( | CASE travel~status "Status [N(New) \| P(Planned) \| B(Booked) \| X(Cancelled)] | ) + ( | WHEN 'N' THEN 'O' | ) + ( | WHEN 'P' THEN 'O' | ) + ( | WHEN 'B' THEN 'A' | ) + ( | ELSE 'X' | ) + ( | END AS overall_status, "Travel Status [A(Accepted) \| O(Open) \| X(Cancelled)] | ) + ( | travel~createdby AS created_by, | ) + ( | travel~createdat AS created_at, | ) + ( | travel~lastchangedby AS last_changed_by, | ) + ( | travel~lastchangedat AS last_changed_at | ) + ( | ORDER BY travel_id UP TO 5 ROWS | ) + ( | ). | ) + ( | COMMIT WORK. | ) + + ( | " define FROM clause dynamically | ) + ( | DATA: dyn_table_name TYPE string. | ) + ( | dyn_table_name = \| /dmo/booking AS booking \| | ) + ( | && \| JOIN \{ '{ table_name_root }' \} AS z \| | ) + ( | && \| ON booking~travel_id = z~travel_id \|. | ) + + ( | DELETE FROM ('{ table_name_child }'). | ) + ( | " insert booking demo data | ) + ( | INSERT ('{ table_name_child }') FROM ( | ) + ( | SELECT | ) + ( | FROM (dyn_table_name) | ) + ( | FIELDS | ) + ( | z~travel_id AS travel_id , | ) + ( | booking~booking_id AS booking_id , | ) + ( | booking~booking_date AS booking_date ,| ) + ( | booking~customer_id AS customer_id ,| ) + ( | booking~carrier_id AS carrier_id ,| ) + ( | booking~connection_id AS connection_id ,| ) + ( | booking~flight_date AS flight_date ,| ) + ( | booking~flight_price AS flight_price ,| ) + ( | booking~currency_code AS currency_code ,| ) + ( | CASE z~overall_status ""Travel Status [A(Accepted) \| O(Open) \| X(Cancelled)]| ) + ( | WHEN 'O' THEN 'N'| ) + ( | WHEN 'P' THEN 'N'| ) + ( | WHEN 'A' THEN 'B'| ) + ( | ELSE 'X'| ) + ( | END AS booking_status, "Booking Status [N(New) \| B(Booked) \| X(Cancelled)]| ) + ( | z~last_changed_at AS last_changed_at| ) + ( | ).| ) + ( | COMMIT WORK.| ) + + ) ). + + ENDMETHOD. + + + METHOD generate_eml_playground_class. + + eml_playground_class_name = |zrap110_eml_playground_{ unique_suffix }|. + + DATA(lo_specification) = io_put_operation->for-clas->add_object( eml_playground_class_name + )->set_package( package_name + )->create_form_specification( ). + lo_specification->set_short_description( | EML Playground Class ({ unique_suffix })| ). + lo_specification->definition->add_interface( 'if_oo_adt_classrun' ). + lo_specification->implementation->add_method( |if_oo_adt_classrun~main| + )->set_source( VALUE #( + "EML with function + ( | "declare internal table using derived type | ) + ( | DATA travel_keys TYPE TABLE FOR READ IMPORT ZRAP110_R_TravelTP_{ unique_suffix } . | ) + ( | | ) + ( | "fill in relevant travel keys for READ request | ) + ( | travel_keys = VALUE #( ( TravelID = 'xxxxx' ) | ) + ( | "( TravelID = '...' ) | ) + ( | ). | ) + ( | | ) + ( | "insert your coding here | ) + ( | "read _travel_ instances for specified key | ) + ( | READ ENTITIES OF ZRAP110_R_TravelTP_{ unique_suffix } | ) + ( | ENTITY Travel | ) + ( |* ALL FIELDS | ) + ( | FIELDS ( TravelID AgencyID CustomerID BeginDate EndDate ) | ) + ( | WITH travel_keys | ) + ( | RESULT DATA(lt_travels_read) | ) + ( | FAILED DATA(failed) | ) + ( | REPORTED DATA(reported). | ) + ( | | ) + ( | "console output | ) + ( | out->write( \| ***Exercise 10: Implement the Base BO Behavior - Functions*** \| ). | ) + ( |* out->write( lt_travels_read ). | ) + ( | IF failed IS NOT INITIAL. | ) + ( | out->write( \|- [ERROR] Cause for failed read: \{ failed-travel[ 1 ]-%fail-cause \} \| ). | ) + ( | ENDIF. | ) + ( | | ) + ( | "read relevant booking instances | ) + ( | READ ENTITIES OF ZRAP110_R_TravelTP_{ unique_suffix } | ) + ( | ENTITY Travel BY \\_Booking | ) + ( | FROM CORRESPONDING #( lt_travels_read ) | ) + ( | RESULT DATA(lt_bookings_read) | ) + ( | LINK DATA(travels_to_bookings). | ) + ( | | ) + ( |* "execute function getDaysToFlight | ) + ( |* READ ENTITIES OF ZRAP110_R_TravelTP_{ unique_suffix } | ) + ( |* ENTITY Booking | ) + ( |* EXECUTE getDaysToFlight | ) + ( |* FROM VALUE #( FOR link IN travels_to_bookings ( %tky = link-target-%tky ) ) | ) + ( |* RESULT DATA(days_to_flight). | ) + ( |* | ) + ( |* "output result structure | ) + ( |* LOOP AT days_to_flight ASSIGNING FIELD-SYMBOL(<days_to_flight>). | ) + ( |* out->write( \| TravelID = \{ <days_to_flight>-%tky-TravelID \} \| ). | ) + ( |* out->write( \| BookingID = \{ <days_to_flight>-%tky-BookingID \} \| ). | ) + ( |* out->write( \| RemainingDaysToFlight = \{ <days_to_flight>-%param-remaining_days_to_flight \} \| ). | ) + ( |* out->write( \| InitialDaysToFlight = \{ <days_to_flight>-%param-initial_days_to_flight \} \| ). | ) + ( |* out->write( \| --------------- \| ). | ) + ( |* ENDLOOP. | ) + ( | | ) + ) ). +* + ENDMETHOD. + + + METHOD generate_table. + DATA(lo_specification) = io_put_operation->for-tabl-for-database_table->add_object( table_name + )->set_package( package_name + )->create_form_specification( ). + + lo_specification->set_short_description( table_short_description ). + lo_specification->set_data_maintenance( xco_cp_database_table=>data_maintenance->allowed_with_restrictions ). + lo_specification->set_delivery_class( xco_cp_database_table=>delivery_class->c ). + + DATA database_table_field TYPE REF TO if_xco_gen_tabl_dbt_s_fo_field . + + LOOP AT table_fields INTO DATA(table_field_line). + database_table_field = lo_specification->add_field( table_field_line-field ). + + IF table_field_line-is_key = abap_true. + database_table_field->set_key_indicator( ). + ENDIF. + IF table_field_line-not_null = abap_true. + database_table_field->set_not_null( ). + ENDIF. + IF table_field_line-currencycode IS NOT INITIAL. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-currencycode ) ). + ENDIF. + IF table_field_line-unitofmeasure IS NOT INITIAL. + database_table_field->currency_quantity->set_reference_table( CONV #( to_upper( table_name ) ) )->set_reference_field( to_upper( table_field_line-unitofmeasure ) ). + ENDIF. + IF table_field_line-data_element IS NOT INITIAL. + database_table_field->set_type( xco_cp_abap_dictionary=>data_element( table_field_line-data_element ) ). + ELSE. + CASE to_lower( table_field_line-built_in_type ). + WHEN 'accp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->accp ). + WHEN 'clnt'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->clnt ). + WHEN 'cuky'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ). + WHEN 'dats'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dats ). + WHEN 'df16_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_raw ). + WHEN 'df34_raw'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_raw ). + WHEN 'fltp'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->fltp ). + WHEN 'int1'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int1 ). + WHEN 'int2'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int2 ). + WHEN 'int4'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int4 ). + WHEN 'int8'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->int8 ). + WHEN 'lang'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lang ). + WHEN 'tims'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->tims ). + WHEN 'char'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->char( table_field_line-built_in_type_length ) ). + WHEN 'curr'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->curr( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'dec' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'df16_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df16_dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'df34_dec'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->df34_dec( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'lchr' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lchr( table_field_line-built_in_type_length ) ). + WHEN 'lraw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->lraw( table_field_line-built_in_type_length ) ). + WHEN 'numc' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->numc( table_field_line-built_in_type_length ) ). + WHEN 'quan' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->quan( + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + WHEN 'raw' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->raw( table_field_line-built_in_type_length ) ). + WHEN 'rawstring'. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->rawstring( table_field_line-built_in_type_length ) ). + WHEN 'sstring' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->sstring( table_field_line-built_in_type_length ) ). + WHEN 'string' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->string( table_field_line-built_in_type_length ) ). + WHEN 'unit' . + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->unit( table_field_line-built_in_type_length ) ). + WHEN OTHERS. + database_table_field->set_type( xco_cp_abap_dictionary=>built_in_type->for( + iv_type = to_upper( table_field_line-built_in_type ) + iv_length = table_field_line-built_in_type_length + iv_decimals = table_field_line-built_in_type_decimals + ) ). + ENDCASE. + ENDIF. + ENDLOOP. + ENDMETHOD. + + + METHOD generate_virt_elem_book_class. + + DATA(lo_specification) = io_put_operation->for-clas->add_object( calc_booking_elem_class_name + )->set_package( package_name + )->create_form_specification( ). + + lo_specification->set_short_description( |Calculate Booking Virtual Elements| ). +* lo_specification->definition->add_interface( 'if_sadl_exit_calc_element_read' ). +* lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~get_calculation_info | +* )->set_source( VALUE #( +* +* ( | IF iv_entity EQ 'ZRAP110_C_BOOKINGTP_{ unique_suffix }'. "Booking BO node | ) +* ( | LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_booking_calc_element>). | ) +* ( | CASE <fs_booking_calc_element>. | ) +* ( | WHEN 'INITIALDAYSTOFLIGHT'. | ) +* ( | COLLECT `BOOKINGDATE` INTO et_requested_orig_elements. | ) +* ( | COLLECT `FLIGHTDATE` INTO et_requested_orig_elements. | ) +* ( | | ) +* ( | WHEN 'REMAININGDAYSTOFLIGHT'. | ) +* ( | COLLECT `FLIGHTDATE` INTO et_requested_orig_elements. | ) +* ( | | ) +* ( | WHEN 'DAYSTOFLIGHTINDICATOR'. | ) +* ( | COLLECT `FLIGHTDATE` INTO et_requested_orig_elements. | ) +* ( | | ) +* ( | WHEN 'BOOKINGSTATUSINDICATOR'. | ) +* ( | COLLECT `BOOKINGSTATUS` INTO et_requested_orig_elements. | ) +* ( | | ) +* ( | ENDCASE. | ) +* ( | ENDLOOP. | ) +* ( | ENDIF. | ) +* ( | | ) +* ) ). + +* lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~calculate | +* )->set_source( VALUE #( +* ( | IF it_requested_calc_elements IS INITIAL. | ) +* ( | EXIT. | ) +* ( | ENDIF. | ) +* ( | | ) +* ( | LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_req_calc_elements>). | ) +* ( | | ) +* ( | CASE <fs_req_calc_elements>. | ) +* ( | "virtual elements from BOOKING entity | ) +* ( | WHEN 'INITIALDAYSTOFLIGHT' OR 'REMAININGDAYSTOFLIGHT' | ) +* ( | OR 'DAYSTOFLIGHTINDICATOR' OR 'BOOKINGSTATUSINDICATOR'. | ) +* ( | | ) +* ( | DATA lt_book_original_data TYPE STANDARD TABLE OF ZRAP110_C_BookingTP_{ unique_suffix } WITH DEFAULT KEY. | ) +* ( | lt_book_original_data = CORRESPONDING #( it_original_data ). | ) +* ( | LOOP AT lt_book_original_data ASSIGNING FIELD-SYMBOL(<fs_book_original_data>). | ) +* ( | | ) +* ( |* <fs_book_original_data> = zrap110_calc_book_elem_{ unique_suffix }=>calculate_days_to_flight( <fs_book_original_data> ). | ) +* ( | | ) +* ( | ENDLOOP. | ) +* ( | | ) +* ( | ct_calculated_data = CORRESPONDING #( lt_book_original_data ). | ) +* ( | | ) +* ( | ENDCASE. | ) +* ( | ENDLOOP. | ) +* ) ). +* +* lo_specification->definition->remove_interface( 'if_sadl_exit' ). + + ENDMETHOD. + + + METHOD generate_virt_elem_trav_class. + + DATA(lo_specification) = io_put_operation->for-clas->add_object( calc_travel_elem_class_name + )->set_package( package_name + )->create_form_specification( ). + + lo_specification->set_short_description( |Calculate Travel Virtual Elements| ). +* lo_specification->definition->add_interface( 'if_sadl_exit_calc_element_read' ). +* lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~get_calculation_info | +* )->set_source( VALUE #( +* +* ( | IF iv_entity EQ 'ZRAP110_C_TRAVELTP_{ unique_suffix }'. "Travel BO node | ) +* ( | LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_travel_calc_element>). | ) +* ( | CASE <fs_travel_calc_element>. | ) +* ( | WHEN 'OVERALLSTATUSINDICATOR'. | ) +* ( | APPEND 'OVERALLSTATUS' TO et_requested_orig_elements. | ) +* ( | | ) +* ( | ENDCASE. | ) +* ( | ENDLOOP. | ) +* ( | ENDIF. | ) +* ( | | ) +* ) ). + +* lo_specification->implementation->add_method( |if_sadl_exit_calc_element_read~calculate | +* )->set_source( VALUE #( +* ( | IF it_requested_calc_elements IS INITIAL. | ) +* ( | EXIT. | ) +* ( | ENDIF. | ) +* ( | | ) +* ( | LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_req_calc_elements>). | ) +* ( | CASE <fs_req_calc_elements>. | ) +* ( | "virtual elements from TRAVEL entity | ) +* ( | WHEN 'OVERALLSTATUSINDICATOR'. | ) +* ( | | ) +* ( | DATA lt_trav_original_data TYPE STANDARD TABLE OF ZRAP110_C_TravelTP_{ unique_suffix } WITH DEFAULT KEY. | ) +* ( | lt_trav_original_data = CORRESPONDING #( it_original_data ). | ) +* ( | LOOP AT lt_trav_original_data ASSIGNING FIELD-SYMBOL(<fs_trav_original_data>). | ) +* ( | | ) +* ( |* <fs_trav_original_data> = zrap110_calc_trav_elem_{ unique_suffix }=>calculate_trav_status_ind( <fs_trav_original_data> ). | ) +* ( | | ) +* ( | ENDLOOP. | ) +* ( | | ) +* ( | ct_calculated_data = CORRESPONDING #( lt_trav_original_data ). | ) +* ( | | ) +* ( | ENDCASE. | ) +* ( | ENDLOOP. | ) +* ) ). +* +* lo_specification->definition->remove_interface( 'if_sadl_exit' ). + + ENDMETHOD. + + + METHOD get_child_table_fields. + child_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_id' + data_element = '/dmo/travel_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'booking_id' + data_element = '/dmo/booking_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'booking_date' + data_element = '/dmo/booking_date' ) + ( field = 'customer_id' + data_element = '/dmo/customer_id' ) + ( field = 'carrier_id' + data_element = '/dmo/carrier_id' ) + ( field = 'connection_id' + data_element = '/dmo/connection_id' ) + ( field = 'flight_date' + data_element = '/dmo/flight_date' ) + ( field = 'flight_price' + data_element = '/dmo/flight_price' + currencycode = 'currency_code' ) + ( field = 'currency_code' + data_element = '/dmo/currency_code' ) + ( field = 'booking_status' + data_element = '/dmo/booking_status' ) + ( field = 'local_last_changed_at' + data_element = 'abp_locinst_lastchange_tstmpl' ) + ). + ENDMETHOD. + + + METHOD get_json_string. + + " build the json document + json_string = + +|\{\r\n| & +| "namespace":"Z",\r\n| & +| "package":"{ package_name }", \r\n| & +| "bindingType":"odata_v4_ui", \r\n| & +| "implementationType":"managed_semantic",\r\n| & +| "prefix":"RAP110_",\r\n| & +| "suffix":"_{ unique_suffix }",\r\n| & +| "datasourcetype": "table",\r\n| & +| "draftEnabled":true,\r\n| & +********** +| "createtable":true,\r\n| & +********** + + +| "multiInlineEdit":false,\r\n| & +| "isCustomizingTable":false,\r\n| & +| "addBusinessConfigurationRegistration":false,\r\n| & +| "transportRequest":"{ transport }",\r\n| & +|\r\n| & +| "hierarchy":\r\n| & +| \{\r\n| & +| "entityname":"Travel",\r\n| & +| "dataSource":"{ table_name_root }",\r\n| & +| "objectid":"TRAVEL_ID",\r\n| & +| "uuid":"",\r\n| & +| "parentUUID":"",\r\n| & +| "rootUUID":"",\r\n| & +| "etagMaster":"LOCAL_LAST_CHANGED_AT",\r\n| & +| "totalEtag":"LAST_CHANGED_AT",\r\n| & +| "lastChangedAt":"LAST_CHANGED_AT",\r\n| & +| "lastChangedBy":"",\r\n| & +| "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",\r\n| & +| "createdAt":"CREATED_AT",\r\n| & +| "createdBy":"",\r\n| & +| "draftTable":"{ draft_table_name_root }",\r\n| & +* | "cdsInterfaceView":"{ i_view_name_travel }",\r\n| & +| "cdsRestrictedReuseView":"{ r_view_name_travel }",\r\n| & +| "cdsProjectionView":"{ c_view_name_travel }",\r\n| & +| "metadataExtensionView":"{ c_view_name_travel }",\r\n| & +|\r\n| & +| "behaviorImplementationClass":"{ beh_impl_name_travel }",\r\n| & +| \r\n| & +| "serviceDefinition":"{ srv_definition_name }",\r\n| & +| "serviceBinding":"{ srv_binding_o4_name }",\r\n| & +| "controlStructure":"",\r\n| & +| "customQueryImplementationClass":"",\r\n| & +| "associations": [ \r\n| & +| \{\r\n| & +| "name": "_Agency",\r\n| & +| "target": "/DMO/I_Agency",\r\n| & +| "cardinality": "zero_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "AgencyID",\r\n| & +| "associationField": "AgencyID" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_Customer",\r\n| & +| "target": "/DMO/I_Customer",\r\n| & +| "cardinality": "zero_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CustomerID",\r\n| & +| "associationField": "CustomerID" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_OverallStatus",\r\n| & +| "target": "/DMO/I_Overall_Status_VH",\r\n| & +| "cardinality": "one_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "OverallStatus",\r\n| & +| "associationField": "OverallStatus" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_Currency",\r\n| & +| "target": "I_Currency",\r\n| & +| "cardinality": "zero_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CurrencyCode",\r\n| & +| "associationField": "Currency" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \}\r\n| & +| ], | & +| "valueHelps": [ \r\n| & +| \{\r\n| & +| "alias": "Agency",\r\n| & +| "name": "/DMO/I_Agency_StdVH",\r\n| & +| "localElement": "AgencyID",\r\n| & +| "element": "AgencyID"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "CustomerVh",\r\n| & +| "name": "/DMO/I_Customer_StdVH",\r\n| & +| "localElement": "CustomerID",\r\n| & +| "element": "CustomerID"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "CurrencyVh",\r\n| & +| "name": "I_CurrencyStdVH",\r\n| & +| "localElement": "CurrencyCode",\r\n| & +| "element": "Currency"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "OverallStatusVh",\r\n| & +| "name": "/DMO/I_Overall_Status_VH",\r\n| & +| "localElement": "OverallStatus",\r\n| & +| "element": "OverallStatus"\r\n| & +| \}\r\n| & +| ], | && +*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +*| "objectswithadditionalfields": [| && |\r\n| && +*' {' && |\r\n| && +*' "object": "cds_projection_view",' && |\r\n| && +*' "additionalfields": [' && |\r\n| && +*' {' && |\r\n| && +*' "fieldname": "_Agency.Name",' && |\r\n| && +*' "alias": "AgencyName"' && |\r\n| && +*' },' && |\r\n| && +*' {' && |\r\n| && +*' "fieldname": "_Customer.LastName",' && |\r\n| && +*' "alias": "CustomerName"' && |\r\n| && +*' }' && |\r\n| && +*' ]' && |\r\n| && +*' }' && |\r\n| && +*' ],' && |\r\n| && + + +*| \{\r\n| & +*| "fieldname": "_OverallStatus._Text.Text",\r\n| & +*| "alias": "OverallStatusText",\r\n| & +*| "localized": "true"\r\n| & +*| \}\r\n| & + +*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +*| "mapping":\r\n| & +*| [\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CLIENT",\r\n| & +*| "cds_view_field":"Client"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"TRAVEL_ID",\r\n| & +*| "cds_view_field":"TravelID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"AGENCY_ID",\r\n| & +*| "cds_view_field":"AgencyID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CUSTOMER_ID",\r\n| & +*| "cds_view_field":"CustomerID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"BEGIN_DATE",\r\n| & +*| "cds_view_field":"BeginDate"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"END_DATE",\r\n| & +*| "cds_view_field":"EndDate"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"BOOKING_FEE",\r\n| & +*| "cds_view_field":"BookingFee"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"TOTAL_PRICE",\r\n| & +*| "cds_view_field":"TotalPrice"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CURRENCY_CODE",\r\n| & +*| "cds_view_field":"CurrencyCode"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"DESCRIPTION",\r\n| & +*| "cds_view_field":"Description"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"ATTACHMENT",\r\n| & +*| "cds_view_field":"Attachment"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"MIME_TYPE",\r\n| & +*| "cds_view_field":"MimeType"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"FILE_NAME",\r\n| & +*| "cds_view_field":"FileName"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"OVERALL_STATUS",\r\n| & +*| "cds_view_field":"OverallStatus"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CREATED_BY",\r\n| & +*| "cds_view_field":"CreatedBy"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"LOCAL_CREATED_AT",\r\n| & +*| "cds_view_field":"LocalCreatedAt"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"LOCAL_LAST_CHANGED_BY",\r\n| & +*| "cds_view_field":"LocalLastChangedBy"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"LOCAL_LAST_CHANGED_AT",\r\n| & +*| "cds_view_field":"LocalLastChangedAt"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"LAST_CHANGED_AT",\r\n| & +*| "cds_view_field":"LastChangedAt"\r\n| & +*| \}\r\n| & +*| ],\r\n| && + +********************************************************************** + +'"fields": [' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CLIENT",' && |\r\n| && +' "dataelement": "MANDT",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "TRAVEL_ID",' && |\r\n| && +' "dataelement": "/dmo/travel_id",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true,' && |\r\n| && +' "cdsviewfieldname": "TravelID"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "AGENCY_ID",' && |\r\n| && +' "dataelement": "/dmo/agency_id",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "AgencyID"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CUSTOMER_ID",' && |\r\n| && +' "dataelement": "/dmo/customer_id",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "CustomerID"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "BEGIN_DATE",' && |\r\n| && +' "dataelement": "/dmo/begin_date",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "BeginDate"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "END_DATE",' && |\r\n| && +' "dataelement": "/dmo/end_date",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "EndDate"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "BOOKING_FEE",' && |\r\n| && +' "dataelement": "/dmo/booking_fee",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "currencycode": "CURRENCY_CODE",' && |\r\n| && +' "cdsviewfieldname": "BookingFee"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "TOTAL_PRICE",' && |\r\n| && +' "dataelement": "/dmo/total_price",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "currencycode": "CURRENCY_CODE",' && |\r\n| && +' "cdsviewfieldname": "TotalPrice"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CURRENCY_CODE",' && |\r\n| && +' "dataelement": "/dmo/currency_code",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "CurrencyCode"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "DESCRIPTION",' && |\r\n| && +' "dataelement": "/dmo/description",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "Description"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "OVERALL_STATUS",' && |\r\n| && +' "dataelement": "/dmo/overall_status",' && |\r\n| && +' "cdsviewfieldname": "OverallStatus",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "ATTACHMENT",' && |\r\n| && +' "dataelement": "/dmo/attachment",' && |\r\n| && +' "cdsviewfieldname": "Attachment",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "MIME_TYPE",' && |\r\n| && +' "dataelement": "/dmo/mime_type",' && |\r\n| && +' "cdsviewfieldname": "MimeType",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "FILE_NAME",' && |\r\n| && +' "dataelement": "/dmo/filename",' && |\r\n| && +' "cdsviewfieldname": "FileName",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LAST_CHANGED_AT",' && |\r\n| && +' "dataelement": "ABP_LASTCHANGE_TSTMPL",' && |\r\n| && +' "cdsviewfieldname": "LastChangedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CREATED_BY",' && |\r\n| && +' "dataelement": "abp_creation_user",' && |\r\n| && +' "cdsviewfieldname": "CreatedBy",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CREATED_AT",' && |\r\n| && +' "dataelement": "abp_creation_tstmpl",' && |\r\n| && +' "cdsviewfieldname": "CreatedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LOCAL_LAST_CHANGED_BY",' && |\r\n| && +' "dataelement": "abp_locinst_lastchange_user",' && |\r\n| && +' "cdsviewfieldname": "LocalLastChangedBy",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LOCAL_LAST_CHANGED_AT",' && |\r\n| && +' "dataelement": "abp_locinst_lastchange_tstmpl",' && |\r\n| && +' "cdsviewfieldname": "LocalLastChangedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' }' && |\r\n| && +' ],' && + + +********** + +| "Children":\r\n| & +| [\r\n| & +| \{\r\n| & +| "entityname":"Booking",\r\n| & +| "dataSource":"{ table_name_child }",\r\n| & +| "objectid":"BOOKING_ID",\r\n| & +| "uuid":"",\r\n| & +| "parentUUID":"",\r\n| & +| "rootUUID":"",\r\n| & +| "etagMaster":"LOCAL_LAST_CHANGED_AT",\r\n| & +| "totalEtag":"",\r\n| & +| "lastChangedAt":"",\r\n| & +| "lastChangedBy":"",\r\n| & +| "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",\r\n| & +| "createdAt":"",\r\n| & +| "createdBy":"",\r\n| & +| "draftTable":"{ draft_table_name_child }",\r\n| & +* | "cdsInterfaceView":"{ i_view_name_booking }",\r\n| & +| "cdsRestrictedReuseView":"{ r_view_name_booking }",\r\n| & +| "cdsProjectionView":"{ c_view_name_booking }",\r\n| & +| "metadataExtensionView":"{ c_view_name_booking }",\r\n| & +| "behaviorImplementationClass":"{ beh_impl_name_booking }",\r\n| & +| "serviceDefinition":"",\r\n| & +| "serviceBinding":"",\r\n| & +| "controlStructure":"",\r\n| & +| "customQueryImplementationClass":"",\r\n| & +| "associations": [ \r\n| & +| \{\r\n| & +| "name": "_Customer",\r\n| & +| "target": "/DMO/I_Customer",\r\n| & +| "cardinality": "one_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CustomerID",\r\n| & +| "associationField": "CustomerID" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_Carrier",\r\n| & +| "target": "/DMO/I_Carrier",\r\n| & +| "cardinality": "one_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CarrierID",\r\n| & +| "associationField": "AirlineID" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_Connection",\r\n| & +| "target": "/DMO/I_Connection",\r\n| & +| "cardinality": "one_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CarrierID",\r\n| & +| "associationField": "AirlineID" \r\n| & +| \},\r\n| & +| \{\r\n| & +| "projectionField": "ConnectionID",\r\n| & +| "associationField": "ConnectionID" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_Flight",\r\n| & +| "target": "/DMO/I_Flight",\r\n| & +| "cardinality": "one_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CarrierID",\r\n| & +| "associationField": "AirlineID" \r\n| & +| \},\r\n| & +| \{\r\n| & +| "projectionField": "ConnectionID",\r\n| & +| "associationField": "ConnectionID" \r\n| & +| \},\r\n| & +| \{\r\n| & +| "projectionField": "FlightDate",\r\n| & +| "associationField": "FlightDate" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_BookingStatus",\r\n| & +| "target": "/DMO/I_Booking_Status_VH",\r\n| & +| "cardinality": "one_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "BookingStatus",\r\n| & +| "associationField": "BookingStatus" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "name": "_Currency",\r\n| & +| "target": "I_Currency",\r\n| & +| "cardinality": "zero_to_one",\r\n| & +| "conditions": [\r\n| & +| \{\r\n| & +| "projectionField": "CurrencyCode",\r\n| & +| "associationField": "Currency" \r\n| & +| \}\r\n| & +| ]\r\n| & +| \}\r\n| & +| ], | & +| "valueHelps": [ \r\n| & +| \{\r\n| & +| "alias": "CustomerVh",\r\n| & +| "name": "/DMO/I_Customer_StdVH",\r\n| & +| "localElement": "CustomerID",\r\n| & +| "element": "CustomerID"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "Airline",\r\n| & +| "name": "/DMO/I_Flight",\r\n| & +| "localElement": "CarrierID",\r\n| & +| "element": "AirlineID",\r\n| & +| "additionalBinding": [ \r\n| & +| \{\r\n| & +| "localElement": "FlightDate",\r\n| & +| "element": "FlightDate"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "localElement": "ConnectionID",\r\n| & +| "element": "ConnectionID"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "FlightPrice",\r\n| & +| "element": "Price"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "CurrencyCode",\r\n| & +| "element": "CurrencyCode"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \} \r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "Flight",\r\n| & +| "name": "/DMO/I_Flight",\r\n| & +| "localElement": "ConnectionID",\r\n| & +| "element": "ConnectionID",\r\n| & +| "additionalBinding": [ \r\n| & +| \{\r\n| & +| "localElement": "FlightDate",\r\n| & +| "element": "FlightDate"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "localElement": "CarrierID",\r\n| & +| "element": "AirlineID"\r\n| & +| ,"usage": "FILTER_AND_RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "FlightPrice",\r\n| & +| "element": "Price"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "CurrencyCode",\r\n| & +| "element": "CurrencyCode"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \} \r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "Date",\r\n| & +| "name": "/DMO/I_Flight",\r\n| & +| "localElement": "FlightDate",\r\n| & +| "element": "FlightDate",\r\n| & +| "additionalBinding": [ \r\n| & +| \{\r\n| & +| "localElement": "CarrierID",\r\n| & +| "element": "AirlineID"\r\n| & +| ,"usage": "FILTER_AND_RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "ConnectionID",\r\n| & +| "element": "ConnectionID"\r\n| & +| ,"usage": "FILTER_AND_RESULT"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "localElement": "FlightPrice",\r\n| & +| "element": "Price"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "CurrencyCode",\r\n| & +| "element": "CurrencyCode"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \} \r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "Date",\r\n| & +| "name": "/DMO/I_Flight",\r\n| & +| "localElement": "FlightPrice",\r\n| & +| "element": "Price",\r\n| & +| "additionalBinding": [ \r\n| & +| \{\r\n| & +| "localElement": "CarrierID",\r\n| & +| "element": "AirlineID"\r\n| & +| ,"usage": "FILTER_AND_RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "ConnectionID",\r\n| & +| "element": "ConnectionID"\r\n| & +| ,"usage": "FILTER_AND_RESULT"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "localElement": "FlightDate",\r\n| & +| "element": "FlightDate"\r\n| & +| ,"usage": "FILTER_AND_RESULT"\r\n| & +| \}, \r\n| & +| \{\r\n| & +| "localElement": "CurrencyCode",\r\n| & +| "element": "CurrencyCode"\r\n| & +| ,"usage": "RESULT"\r\n| & +| \} \r\n| & +| ]\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "Currencyvh2",\r\n| & +| "name": "I_CurrencyStdVH",\r\n| & +| "localElement": "CurrencyCode",\r\n| & +| "element": "Currency"\r\n| & +| \},\r\n| & +| \{\r\n| & +| "alias": "BookingStatus",\r\n| & +| "name": "/DMO/I_Booking_Status_VH",\r\n| & +| "localElement": "BookingStatus",\r\n| & +| "element": "BookingStatus"\r\n| & +| \}\r\n| & +| ], | && +*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +*| "objectswithadditionalfields": [ | && |\r\n| && +*' {' && |\r\n| && +*' "object": "cds_projection_view",' && |\r\n| && +*' "additionalfields": [' && |\r\n| && +*' {' && |\r\n| && +*' "fieldname": "_Customer.LastName",' && |\r\n| && +*' "alias": "CustomerName"' && |\r\n| && +*' },' && |\r\n| && +*' {' && |\r\n| && +*' "fieldname": "_Carrier.LastName",' && |\r\n| && +*' "alias": "CarrierName"' && |\r\n| && +*' }' && |\r\n| && +*' ]' && |\r\n| && +*' }' && |\r\n| && +*' ],' && |\r\n| && + +*| \{\r\n| & +*| "fieldname": "_BookingStatus._Text.Text",\r\n| & +*| "alias": "BookingStatusText",\r\n| & +*| "localized": "true" \r\n| & +*| \}\r\n| & + +*"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +*| "mapping":\r\n| & +*| [\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CLIENT",\r\n| & +*| "cds_view_field":"Client"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"TRAVEL_ID",\r\n| & +*| "cds_view_field":"TravelID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"BOOKING_ID",\r\n| & +*| "cds_view_field":"BookingID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"BOOKING_DATE",\r\n| & +*| "cds_view_field":"BookingDate"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CUSTOMER_ID",\r\n| & +*| "cds_view_field":"CustomerID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CARRIER_ID",\r\n| & +*| "cds_view_field":"CarrierID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CONNECTION_ID",\r\n| & +*| "cds_view_field":"ConnectionID"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"FLIGHT_DATE",\r\n| & +*| "cds_view_field":"FlightDate"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"FLIGHT_PRICE",\r\n| & +*| "cds_view_field":"FlightPrice"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"CURRENCY_CODE",\r\n| & +*| "cds_view_field":"CurrencyCode"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"BOOKING_STATUS",\r\n| & +*| "cds_view_field":"BookingStatus"\r\n| & +*| \},\r\n| & +*| \{\r\n| & +*| "dbtable_field":"LOCAL_LAST_CHANGED_AT",\r\n| & +*| "cds_view_field":"LocalLastChangedAt"\r\n| & +*| \}\r\n| & +*| ],\r\n| && + +************ +'"fields": [' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CLIENT",' && |\r\n| && +' "dataelement": "MANDT",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "TRAVEL_ID",' && |\r\n| && +' "dataelement": "/dmo/travel_id",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "TravelID",' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "BOOKING_ID",' && |\r\n| && +' "dataelement": "/dmo/booking_id",' && |\r\n| && +' "cdsviewfieldname": "BookingID",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "BOOKING_DATE",' && |\r\n| && +' "dataelement": "/dmo/booking_date",' && |\r\n| && +' "cdsviewfieldname": "BookingDate",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CUSTOMER_ID",' && |\r\n| && +' "dataelement": "/dmo/customer_id",' && |\r\n| && +' "cdsviewfieldname": "CustomerID",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CARRIER_ID",' && |\r\n| && +' "dataelement": "/dmo/carrier_id",' && |\r\n| && +' "cdsviewfieldname": "CarrierID",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CONNECTION_ID",' && |\r\n| && +' "dataelement": "/dmo/connection_id",' && |\r\n| && +' "cdsviewfieldname": "ConnectionID",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "FLIGHT_DATE",' && |\r\n| && +' "dataelement": "/dmo/flight_date",' && |\r\n| && +' "cdsviewfieldname": "FlightDate",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "BOOKING_STATUS",' && |\r\n| && +' "dataelement": "/dmo/booking_status",' && |\r\n| && +' "cdsviewfieldname": "BookingStatus",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "FLIGHT_PRICE",' && |\r\n| && +' "dataelement": "/dmo/flight_price",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "cdsviewfieldname": "FlightPrice",' && |\r\n| && +' "currencycode": "CURRENCY_CODE"' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CURRENCY_CODE",' && |\r\n| && +' "dataelement": "/dmo/currency_code",' && |\r\n| && +' "cdsviewfieldname": "CurrencyCode",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LOCAL_LAST_CHANGED_AT",' && |\r\n| && +' "dataelement": "abp_locinst_lastchange_tstmpl",' && |\r\n| && +' "cdsviewfieldname": "LocalLastChangedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' }' && |\r\n| && +' ]' && + +********* + +| \}\r\n| & +| ]\r\n| & +| \}\r\n| & +| \}| +. + + ENDMETHOD. + + + METHOD get_root_table_fields. + root_table_fields = VALUE tt_fields( + ( field = 'client' + data_element = 'mandt' + is_key = 'X' + not_null = 'X' ) + ( field = 'travel_id' + data_element = '/dmo/travel_id' + is_key = 'X' + not_null = 'X' ) + ( field = 'agency_id' + data_element = '/dmo/agency_id' ) + ( field = 'customer_id' + data_element = '/dmo/customer_id' ) + ( field = 'begin_date' + data_element = '/dmo/begin_date' ) + ( field = 'end_date' + data_element = '/dmo/end_date' ) + ( field = 'booking_fee' + data_element = '/dmo/booking_fee' + currencycode = 'currency_code' ) + ( field = 'total_price' + data_element = '/dmo/total_price' + currencycode = 'currency_code' ) + ( field = 'currency_code' + data_element = '/dmo/currency_code' ) + ( field = 'description' + data_element = '/dmo/description' ) + ( field = 'overall_status' + data_element = '/dmo/overall_status' ) + ( field = 'attachment' + data_element = '/dmo/attachment' ) + ( field = 'mime_type' + data_element = '/dmo/mime_type' ) + ( field = 'file_name' + data_element = '/dmo/filename' ) + ( field = 'created_by' + data_element = 'abp_creation_user' ) + ( field = 'local_created_at' + data_element = 'abp_creation_tstmpl' ) + ( field = 'local_last_changed_by' + data_element = 'abp_locinst_lastchange_user' ) + ( field = 'local_last_changed_at' + data_element = 'abp_locinst_lastchange_tstmpl' ) + ( field = 'last_changed_at' + data_element = 'abp_lastchange_tstmpl' ) + ). + ENDMETHOD. + + + METHOD get_unique_suffix. + + DATA: ls_package_name TYPE sxco_package, + is_valid_package TYPE abap_bool, + step_number TYPE i. + + DATA: ascii_hex TYPE x LENGTH 3. + DATA ascii_hex_string TYPE string. + s_unique_suffix = ''. + is_valid_package = abap_false. + ascii_hex = 1. + ascii_hex_string = ascii_hex. + ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ). + + WHILE is_valid_package = abap_false. + + "check package name + ls_package_name = s_prefix && ascii_hex_string. + DATA(lo_package) = xco_lib->get_package( ls_package_name ). " xco_cp_abap_repository=>object->devc->for( ls_package_name ). + IF NOT lo_package->exists( ). + is_valid_package = abap_true. + s_unique_suffix = ascii_hex_string. + ELSE. + ascii_hex += 1. + ascii_hex_string = ascii_hex. + ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ). + + step_number += 1. + ENDIF. + + IF step_number > 10000. + ASSERT 1 = 2. + ENDIF. + + ENDWHILE. + + ENDMETHOD. + + + METHOD if_oo_adt_classrun~main. + + debug_modus = abap_true. + +* transport = 'D23K900976'. " <-- maintain your transport request here + package_name = 'ZRAP110_' && unique_suffix. + + + DATA(lo_transport_target) = xco_lib->get_package( co_zrap110_ex_package + )->read( )-property-transport_layer->get_transport_target( ). + + DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value )->create_request( |Package name: { package_name } | ). + transport = new_transport_object->value. + + out->write( | RAP110 exercise generator | ). + out->write( | ------------------------------------- | ). + . + + "database tables + table_name_root = to_upper( |zrap110_atrav{ unique_suffix }| ). + table_name_child = to_upper( |zrap110_abook{ unique_suffix }| ). + draft_table_name_root = to_upper( |zrap110_dtrav{ unique_suffix }| ). + draft_table_name_child = to_upper( |zrap110_dbook{ unique_suffix }| ). + data_generator_class_name = |zrap110_data_generator_{ unique_suffix }|. + "CDS views + r_view_name_travel = to_upper( |zrap110_R_TravelTP_{ unique_suffix }| ). + r_view_name_booking = to_upper( |zrap110_R_BookingTP_{ unique_suffix }| ). + c_view_name_travel = to_upper( |zrap110_C_TravelTP_{ unique_suffix }| ). + c_view_name_booking = to_upper( |zrap110_C_BookingTP_{ unique_suffix }| ) . + i_view_name_travel = |zrap110_I_TravelTP_{ unique_suffix }|. + i_view_name_booking = |zrap110_I_BookingTP_{ unique_suffix }|. + calc_travel_elem_class_name = |zrap110_calc_trav_elem_{ unique_suffix }|. + calc_booking_elem_class_name = |zrap110_calc_book_elem_{ unique_suffix }|. + eml_playground_class_name = |zrap110_eml_playground_{ unique_suffix }|. + create_mde_files = abap_true. + "behavior pools + beh_impl_name_travel = |zrap110_BP_TravelTP_{ unique_suffix }|. + beh_impl_name_booking = |zrap110_BP_BookingTP_{ unique_suffix }|. + "business service + srv_definition_name = |zrap110_UI_Travel_{ unique_suffix }|. + srv_binding_o4_name = |zrap110_UI_Travel_O4_{ unique_suffix }|. + + + " to upper + package_name = to_upper( package_name ). + unique_suffix = to_upper( unique_suffix ). + + out->write( | Use transport { transport }| ). + + DATA(my_package) = xco_lib->get_package( package_name ). + IF my_package->exists( ) = abap_false. + out->write( | Info: Suffix "{ unique_suffix }" will be used. | ). + ELSE. + out->write( | Note: Package "{ package_name }" already exists. | ). + ENDIF. + + TRY. + "create package + create_package( transport ). + CATCH cx_root INTO DATA(package_exception). + IF debug_modus = abap_true. + out->write( | Error during create_package( ). | ). + ENDIF. + ENDTRY. + +* create_tables( out ). + + mo_environment = get_environment( transport ). + mo_put_operation = get_put_operation( mo_environment )."->create_put_operation( ). + + "create abstract entities + create_abs_ent_a_create_travel( out ). + create_abs_ent_a_daystoflight( out ). + create_abs_ent_a_travel( out ). + + DATA(lo_table_root) = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_root ) ). + DATA(lo_table_child) = xco_cp_abap_repository=>object->tabl->for( CONV #( table_name_child ) ). + + +* IF lo_table_root->exists( ) = abap_true AND +* lo_table_child->exists( ) = abap_true. + + create_rap_bo( + EXPORTING + out = out + IMPORTING + eo_root_node = DATA(root_node) + ).. + + delete_iview_and_mde( out = out ). + +* ENDIF. + + DATA(lo_travel_bdef) = xco_cp_abap_repository=>object->bdef->for( CONV #( r_view_name_travel ) ). +* DATA(lo_travel_bdef) = xco_cp_abap_repository=>object->bdef->for( r_view_name_travel ). + + IF lo_travel_bdef->exists( ). + generate_cds_mde( + io_out = out + io_root_node = root_node + ). + generate_cds_mde( + io_out = out + io_root_node = root_node->all_childnodes[ 1 ] + ). + create_additional_objects( out = out ). + ENDIF. + + create_number_range( out = out ). + + out->write( | The following package got created for you and includes everything you need: { package_name } | ). + out->write( | In the "Project Explorer" right click on "Favorite Packages" and click on "Add Package...". | ). + out->write( | Enter "{ package_name }" and click OK. | ). + + + + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_gen_rap110_single.clas.xml b/src/zdmo_gen_rap110_single.clas.xml new file mode 100644 index 0000000..06302b3 --- /dev/null +++ b/src/zdmo_gen_rap110_single.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_GEN_RAP110_SINGLE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>zdmo_gen_rap110_single</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_gen_rap630_single.clas.abap b/src/zdmo_gen_rap630_single.clas.abap new file mode 100644 index 0000000..4b32076 --- /dev/null +++ b/src/zdmo_gen_rap630_single.clas.abap @@ -0,0 +1,680 @@ +CLASS zDMO_gen_rap630_single DEFINITION + +INHERITING FROM zdmo_cl_rap_generator_base +************************************************************************** +** +** Welcome to the RAP110 travel exercise generator! +** +** STAND: 2023-05-08 --> OKAY +** Adjust superpackage and TR +** ... +************************************************************************** + + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES if_oo_adt_classrun. + METHODS constructor + IMPORTING i_unique_suffix TYPE string OPTIONAL. + + PROTECTED SECTION. + + PRIVATE SECTION. + + + CONSTANTS: + co_prefix TYPE string VALUE 'ZRAP630_', + co_entity_name TYPE string VALUE 'Shop', + co_session_name TYPE string VALUE 'RAP630', + co_software_component_base_bo TYPE sxco_package VALUE 'ZLOCAL', + co_software_component_ext_bo TYPE sxco_package VALUE 'ZLOCAL', + co_super_package_base_bo TYPE sxco_package VALUE 'ZLOCAL', + co_super_package_ext_bo TYPE sxco_package VALUE 'ZLOCAL' +* co_super_package_base_bo TYPE sxco_package VALUE 'ZRAP630', +* co_super_package_ext_bo TYPE sxco_package VALUE 'ZRAP630_EXT' + . + + + + + + + + + + + + DATA xco_on_prem_library TYPE REF TO zdmo_cl_rap_xco_on_prem_lib. + DATA xco_lib TYPE REF TO zdmo_cl_rap_xco_lib. + DATA package_name TYPE sxco_package . + DATA extension_package_name TYPE sxco_package . + DATA unique_suffix TYPE string. +* DATA mo_environment TYPE REF TO if_xco_cp_gen_env_dev_system. + DATA transport TYPE sxco_transport . + DATA transport_extensions TYPE sxco_transport . + "database tables + DATA table_name_root TYPE sxco_dbt_object_name. + DATA table_name_child TYPE sxco_dbt_object_name. + DATA draft_table_name_root TYPE sxco_dbt_object_name. + DATA draft_table_name_child TYPE sxco_dbt_object_name. + DATA data_generator_class_name TYPE sxco_ad_object_name. + DATA calc_travel_elem_class_name TYPE sxco_ad_object_name. + DATA calc_booking_elem_class_name TYPE sxco_ad_object_name. + DATA eml_playground_class_name TYPE sxco_ad_object_name. + "CDS views + DATA r_view_name_travel TYPE sxco_cds_object_name. + DATA r_view_name_booking TYPE sxco_cds_object_name. + DATA c_view_name_travel TYPE sxco_cds_object_name. + DATA c_view_name_booking TYPE sxco_cds_object_name. + DATA i_view_name_travel TYPE sxco_cds_object_name. + DATA i_view_basic_name_travel TYPE sxco_cds_object_name. + DATA i_view_name_booking TYPE sxco_cds_object_name. + DATA create_mde_files TYPE abap_bool. + "Behavior pools + DATA beh_impl_name_travel TYPE sxco_ao_object_name. + DATA beh_impl_name_booking TYPE sxco_ao_object_name. + "business service + DATA srv_definition_name TYPE sxco_srvd_object_name. + DATA srv_binding_o4_name TYPE sxco_srvb_service_name. + DATA debug_modus TYPE abap_bool VALUE abap_true. + + + TYPES: BEGIN OF t_table_fields, + field TYPE sxco_ad_field_name, + is_key TYPE abap_bool, + not_null TYPE abap_bool, + currencyCode TYPE sxco_cds_field_name, + unitOfMeasure TYPE sxco_cds_field_name, + data_element TYPE sxco_ad_object_name, + built_in_type TYPE cl_xco_ad_built_in_type=>tv_type, + built_in_type_length TYPE cl_xco_ad_built_in_type=>tv_length, + built_in_type_decimals TYPE cl_xco_ad_built_in_type=>tv_decimals, + END OF t_table_fields. + + TYPES: tt_fields TYPE STANDARD TABLE OF t_table_fields WITH KEY field. + + METHODS create_rap_bo IMPORTING out TYPE REF TO if_oo_adt_classrun_out + EXPORTING eo_root_node TYPE REF TO zdmo_cl_rap_node . + + METHODS get_unique_suffix IMPORTING VALUE(s_prefix) TYPE string RETURNING VALUE(s_unique_suffix) TYPE string. + METHODS create_transport RETURNING VALUE(lo_transport) TYPE sxco_transport. + METHODS create_package IMPORTING VALUE(lo_transport) TYPE sxco_transport. + METHODS create_extension_package IMPORTING VALUE(lo_transport) TYPE sxco_transport. + + METHODS get_json_string RETURNING VALUE(json_string) TYPE string. + + METHODS generate_vh_custom_entity IMPORTING VALUE(lo_transport) TYPE sxco_transport . + + +ENDCLASS. + + + +CLASS ZDMO_GEN_RAP630_SINGLE IMPLEMENTATION. + + + METHOD constructor. + super->constructor( ). + + xco_on_prem_library = NEW zdmo_cl_rap_xco_on_prem_lib( ). + + "check whether being on cloud or on prem + IF xco_on_prem_library->on_premise_branch_is_used( ) = abap_true. + xco_lib = NEW zdmo_cl_rap_xco_on_prem_lib( ). + ELSE. + xco_lib = NEW zdmo_cl_rap_xco_cloud_lib( ). + ENDIF. + + IF i_unique_suffix IS INITIAL. + unique_suffix = get_unique_suffix( co_prefix ). + ELSE. + unique_suffix = i_unique_suffix. + ENDIF. + + ENDMETHOD. + + + METHOD create_extension_package. + DATA(package_environment) = get_environment( lo_transport ). + DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ). + DATA(lo_specification) = lo_put_operation->add_object( extension_package_name )->create_form_specification( ). + lo_specification->set_short_description( |#Generated { co_session_name } extension tutorial package| ). + lo_specification->properties->set_super_package( co_software_component_ext_bo )->set_software_component( co_software_component_ext_bo ). + DATA(lo_result) = lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_package. + DATA(package_environment) = get_environment( lo_transport ). + DATA(lo_put_operation) = get_put_operation_for_devc( package_environment ). + DATA(lo_specification) = lo_put_operation->add_object( package_name )->create_form_specification( ). + lo_specification->set_short_description( |#Generated { co_session_name } tutorial package| ). + lo_specification->properties->set_super_package( co_software_component_base_bo )->set_software_component( co_software_component_base_bo ). +* lo_specification->properties->set_super_package( 'ZRAP630' )->set_software_component( co_software_component_base_bo ). + DATA(lo_result) = lo_put_operation->execute( ). + ENDMETHOD. + + + METHOD create_rap_bo. + + DATA(json_string) = get_json_string( ). " get json document + + DATA(abap_language_version_number) = xco_lib->get_abap_language_version( package_name ). + + DATA background_process TYPE REF TO if_bgmc_process_single_op. + DATA bgpf_operation TYPE REF TO zdmo_cl_rap_generator_asyn . + bgpf_operation = NEW zdmo_cl_rap_generator_asyn( + i_json_string = json_string + i_package_language_version = abap_language_version_number +* i_rap_bo_uuid = + ). + TRY. + background_process = cl_bgmc_process_factory=>get_default( )->create( ). + background_process->set_operation_tx_uncontrolled( bgpf_operation ). + background_process->set_name( CONV #( |Generate { r_view_name_travel } | ) ). + background_process->save_for_execution( ). + CATCH cx_bgmc INTO DATA(bgmc_exception). + "handle exception + out->write( |BGPF error { bgmc_exception->get_text( ) }| ). + ENDTRY. + COMMIT WORK. + + ENDMETHOD. + + + METHOD create_transport. + DATA(ls_package) = xco_lib->get_package( co_software_component_base_bo ). + IF ls_package->read( )-property-record_object_changes = abap_true. +* DATA(ls_package) = xco_cp_abap_repository=>package->for( co_zlocal_package )->read( ). + DATA(lv_transport_layer) = ls_package->read( )-property-transport_layer->value. + DATA(lv_transport_target) = ls_package->read( )-property-transport_layer->get_transport_target( )->value. + DATA(lo_transport_request) = xco_cp_cts=>transports->workbench( lv_transport_target )->create_request( '#Generated RAP110 tutorial transport request' ). + lo_transport = lo_transport_request->value. + ENDIF. + ENDMETHOD. + + + METHOD generate_vh_custom_entity. + DATA(vh_environment) = get_environment( lo_transport ). + DATA(lo_put_operation) = get_put_operation( vh_environment ). ""ZRAP630I_VH_Product_{ unique_suffix }" + DATA(lo_interface_specification) = lo_put_operation->for-ddls->add_object( |ZRAP630I_VH_Product_{ unique_suffix }| + )->set_package( package_name + )->create_form_specification( ). + "add entity description + DATA(lo_custom_entity) = lo_interface_specification->set_short_description( 'Value help for products' + )->add_custom_entity( ). + + + + " Annotations can be added to custom entities. + lo_custom_entity->add_annotation( 'ObjectModel.query.implementedBy' )->value->build( )->add_string( |ABAP:{ to_upper( data_generator_class_name ) }| ). + + + "add view annotation + lo_custom_entity->add_annotation( 'EndUserText.label' )->value->build( )->add_string( 'Value help for products' ). + " Add fields. + + + + DATA(lo_identifier) = lo_custom_entity->add_field( xco_cp_ddl=>field( 'Product' ) + )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 40 ) ). + lo_identifier->set_key( ). + lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'ProductText' ) + )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 40 ) ). + + lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'ProductGroup' ) + )->set_type( xco_cp_abap_dictionary=>built_in_type->char( 40 ) ). + lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'Price' ) + )->set_type( xco_cp_abap_dictionary=>built_in_type->curr( + iv_length = 15 + iv_decimals = 2 + ) ). + lo_identifier->add_annotation( 'Semantics.amount.currencyCode' )->value->build( )->add_string( 'Currency' ). + lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'Currency' ) + )->set_type( xco_cp_abap_dictionary=>built_in_type->cuky ). + lo_identifier = lo_custom_entity->add_field( xco_cp_ddl=>field( 'BaseUnit' ) + )->set_type( xco_cp_abap_dictionary=>built_in_type->unit( 3 ) ). + + +* DATA(package_environment) = get_environment( lo_transport ). +* DATA(lo_put_operation) = get_put_operation( package_environment ). + + + + DATA(lo_specification) = lo_put_operation->for-clas->add_object( data_generator_class_name + )->set_package( package_name + )->create_form_specification( ). + lo_specification->set_short_description( |This class provide value help data| ). + + + DATA(lo_public_section) = lo_specification->definition->section-public. + lo_public_section->add_type( 't_products' + )->for_table_type( + io_row_type = xco_cp_abap_dictionary=>table_type( |ZRAP630I_VH_Product_{ unique_suffix }| ) + io_primary_key = xco_cp_table_type=>primary_key->not_specified( xco_cp_table_type=>key_category->not_specified ) ). + + lo_public_section->add_method( 'get_products' + )->add_returning_parameter( 'products' + )->set_type( lo_specification->own->type( 't_products' ) ). + + lo_public_section->add_data( 'producty' + )->set_type( lo_specification->own->type( 't_products' ) + )->set_read_only( ). + + lo_specification->implementation->add_method( |get_products| + )->set_source( VALUE #( + ( |"| ) + ( | products = VALUE #( | ) + ( | ( Product = 'ZPRINTER01' ProductText = 'Printer Professional ABC' Price = '500.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'ZPRINTER02' ProductText = 'Printer Platinum' Price = '800.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D001' ProductText = 'Mobile Phone' Price = '850.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D002' ProductText = 'Table PC' Price = '900.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D003' ProductText = 'Office Table' Price = '599.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D004' ProductText = 'Office Chair' Price = '449.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D005' ProductText = 'Developer Notebook' Price = '3150.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D006' ProductText = 'Mouse' Price = '79.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D007' ProductText = 'Headset' Price = '159.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ( Product = 'D008' ProductText = 'Keyboard' Price = '39.00 ' Currency = 'EUR' ProductGroup = 'L001' BaseUnit = 'ST' ) | ) + ( | ). | ) + + + + ) + ) . + + lo_specification->set_short_description( 'Value help for products' ). + lo_specification->definition->add_interface( 'if_rap_query_provider' ). + lo_specification->implementation->add_method( |if_rap_query_provider~select| + )->set_source( VALUE #( + + " business logic to fill both tables with demo data + ( | DATA business_data TYPE TABLE OF ZRAP630I_VH_Product_{ unique_suffix }.| ) + ( | DATA business_data_line TYPE ZRAP630I_VH_Product_{ unique_suffix } . | ) + ( | DATA(skip) = io_request->get_paging( )->get_offset( ). | ) + ( | DATA(requested_fields) = io_request->get_requested_elements( ). | ) + ( | DATA(sort_order) = io_request->get_sort_elements( ). | ) + ( | TRY. | ) + ( | DATA(filter_condition) = io_request->get_filter( )->get_as_sql_string( ). | ) + ( | business_data = get_products( ).| ) + ( | SELECT * FROM @business_data AS implementation_types| ) + ( | WHERE (filter_condition) INTO TABLE @business_data.| ) + ( | io_response->set_total_number_of_records( lines( business_data ) ).| ) + ( | io_response->set_data( business_data ).| ) + ( | CATCH cx_root INTO DATA(exception).| ) + ( | DATA(exception_message) = cl_message_helper=>get_latest_t100_exception( exception )->if_message~get_longtext( ).| ) + ( | DATA(exception_t100_key) = cl_message_helper=>get_latest_t100_exception( exception )->t100key.| ) + ( | RAISE EXCEPTION TYPE zdmo_cx_rap_gen_custom_entity| ) + ( | EXPORTING | ) + ( | textid = VALUE scx_t100key( msgid = exception_t100_key-msgid | ) + ( | msgno = exception_t100_key-msgno| ) + ( | attr1 = exception_t100_key-attr1| ) + ( | attr2 = exception_t100_key-attr2| ) + ( | attr3 = exception_t100_key-attr3| ) + ( | attr4 = exception_t100_key-attr4 )| ) + ( | previous = exception.| ) + ( | ENDTRY. | ) + ( | | ) + ) ). + + + + + + + DATA(lo_result) = lo_put_operation->execute( ). + + + + + + ENDMETHOD. + + + METHOD get_json_string. + + " build the json document + json_string = + +|\{\r\n| & +| "namespace":"Z",\r\n| & +| "package":"{ package_name }", \r\n| & +| "bindingType":"odata_v4_ui", \r\n| & +| "implementationType":"managed_uuid",\r\n| & +| "prefix":"{ co_session_name }",\r\n| & +| "suffix":"_{ unique_suffix }",\r\n| & +| "datasourcetype": "table",\r\n| & +| "draftEnabled":true,\r\n| & +********** +| "createtable":true,\r\n| & +********** +| "publishservice":true,\r\n| & +| "isextensible":true,\r\n| & +*| "extensibilityElementSuffix":"ZAA",\r\n| & + +"| "addbasiciviews":false,\r\n| & +| "addbasiciviews":true,\r\n| & +| "multiInlineEdit":false,\r\n| & +| "isCustomizingTable":false,\r\n| & +| "addBusinessConfigurationRegistration":false,\r\n| & +| "transportRequest":"{ transport }",\r\n| & +|\r\n| & +| "hierarchy":\r\n| && +| \{\r\n| && +| "entityname":"{ co_entity_name }",\r\n| && +| "dataSource":"{ table_name_root }",\r\n| && +| "objectid":"ORDER_ID",\r\n| && +| "uuid":"ORDER_UUID",\r\n| && +| "parentUUID":"",\r\n| && +| "rootUUID":"",\r\n| && +| "etagMaster":"LOCAL_LAST_CHANGED_AT",\r\n| && +| "totalEtag":"LAST_CHANGED_AT",\r\n| && +| "lastChangedAt":"LAST_CHANGED_AT",\r\n| && +| "lastChangedBy":"LAST_CHANGED_BY",\r\n| && +| "localInstanceLastChangedBy":"LOCAL_LAST_CHANGED_BY",\r\n| && +| "localInstanceLastChangedAt":"LOCAL_LAST_CHANGED_AT",\r\n| && +| "createdAt":"CREATED_AT",\r\n| && +| "createdBy":"CREATED_BY",\r\n| && +| "extensibilityElementSuffix":"ZAA",\r\n| & + +| "valueHelps": [ \r\n| & +| \{\r\n| & +| "alias": "Product",\r\n| & +| "name": "ZRAP630I_VH_Product_{ unique_suffix }",\r\n| & +| "localElement": "OrderedItem",\r\n| & +| "element": "Product"\r\n| & +| \}\r\n| & + +| ], | && +********************************************************************** + +'"fields": [' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CLIENT",' && |\r\n| && +' "dataelement": "MANDT",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "ORDER_UUID",' && |\r\n| && +' "dataelement": "sysuuid_x16",' && |\r\n| && +' "isdataelement": true,' && |\r\n| && +' "iskey": true,' && |\r\n| && +' "notnull": true,' && |\r\n| && +' "cdsviewfieldname": "OrderUUID"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "ORDER_ID",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "CHAR",' && |\r\n| && +' "builtintypelength": 10,' && |\r\n| && +' "cdsviewfieldname": "OrderID"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "ORDERED_ITEM",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "CHAR",' && |\r\n| && +' "builtintypelength": 40,' && |\r\n| && +' "cdsviewfieldname": "OrderedItem"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "CURRENCY_CODE",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "CUKY",' && |\r\n| && +' "builtintypelength": 5,' && |\r\n| && +' "cdsviewfieldname": "CurrencyCode"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "ORDER_ITEM_PRICE",' && |\r\n| && +' "currencycode": "CURRENCY_CODE",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "CURR",' && |\r\n| && +' "builtintypelength": 11,' && |\r\n| && +' "builtintypedecimals": 2,' && |\r\n| && +' "cdsviewfieldname": "OrderItemPrice"' && |\r\n| && +' },' && |\r\n| && + + + +' {' && |\r\n| && +' "abapfieldname": "DELIVERY_DATE",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "DATS",' && |\r\n| && +' "cdsviewfieldname": "DeliveryDate"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "OVERALL_STATUS",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "CHAR",' && |\r\n| && +' "builtintypelength": 30,' && |\r\n| && +' "cdsviewfieldname": "OverallStatus"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "NOTES",' && |\r\n| && +' "isbuiltintype": true,' && |\r\n| && +' "builtintype": "CHAR",' && |\r\n| && +' "builtintypelength": 256,' && |\r\n| && +' "cdsviewfieldname": "Notes"' && |\r\n| && +' },' && |\r\n| && + +' {' && |\r\n| && +' "abapfieldname": "LAST_CHANGED_AT",' && |\r\n| && +' "dataelement": "ABP_LASTCHANGE_TSTMPL",' && |\r\n| && +' "cdsviewfieldname": "LastChangedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CREATED_BY",' && |\r\n| && +' "dataelement": "abp_creation_user",' && |\r\n| && +' "cdsviewfieldname": "CreatedBy",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "CREATED_AT",' && |\r\n| && +' "dataelement": "abp_creation_tstmpl",' && |\r\n| && +' "cdsviewfieldname": "CreatedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LOCAL_LAST_CHANGED_BY",' && |\r\n| && +' "dataelement": "abp_locinst_lastchange_user",' && |\r\n| && +' "cdsviewfieldname": "LocalLastChangedBy",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LAST_CHANGED_BY",' && |\r\n| && +' "dataelement": "ABP_LASTCHANGE_USER",' && |\r\n| && +' "cdsviewfieldname": "LastChangedBy",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' },' && |\r\n| && +' {' && |\r\n| && +' "abapfieldname": "LOCAL_LAST_CHANGED_AT",' && |\r\n| && +' "dataelement": "abp_locinst_lastchange_tstmpl",' && |\r\n| && +' "cdsviewfieldname": "LocalLastChangedAt",' && |\r\n| && +' "isdataelement": true' && |\r\n| && +' }' && |\r\n| && +' ]' && + + +********** + + +********* + +| \}\r\n| & +| \}| +. + + ENDMETHOD. + + + METHOD get_unique_suffix. + + DATA: ls_package_name TYPE sxco_package, + + is_valid_package TYPE abap_bool, + step_number TYPE i. + + DATA: ascii_hex TYPE x LENGTH 3. + DATA ascii_hex_string TYPE string. + s_unique_suffix = ''. + is_valid_package = abap_false. + ascii_hex = 90. + ascii_hex_string = ascii_hex. + ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ). + + WHILE is_valid_package = abap_false. + + "check package name(s) + ls_package_name = s_prefix && ascii_hex_string. + + DATA(lo_package) = xco_lib->get_package( ls_package_name ). " xco_cp_abap_repository=>object->devc->for( ls_package_name ). + DATA(extension_package) = xco_lib->get_package( extension_package_name ). " xco_cp_abap_repository=>object->devc->for( ls_package_name ). + + IF NOT lo_package->exists( ) AND + NOT extension_package->exists( ). + is_valid_package = abap_true. + s_unique_suffix = ascii_hex_string. + ELSE. + ascii_hex += 1. + ascii_hex_string = ascii_hex. + ascii_hex_string = substring( val = ascii_hex_string off = strlen( ascii_hex_string ) - 3 len = 3 ). + + step_number += 1. + ENDIF. + + IF step_number > 10000. + ASSERT 1 = 2. + ENDIF. + + ENDWHILE. + + ENDMETHOD. + + + METHOD if_oo_adt_classrun~main. + + debug_modus = abap_true. + +* transport = 'D23K900976'. " <-- maintain your transport request here + package_name = co_prefix && unique_suffix. + extension_package_name = package_name && '_EXT' . + + DATA(lo_transport_target) = xco_lib->get_package( co_software_component_base_bo + )->read( )-property-transport_layer->get_transport_target( ). + + DATA(new_transport_object) = xco_cp_cts=>transports->workbench( lo_transport_target->value )->create_request( |Package name: { package_name } | ). + transport = new_transport_object->value. + + + DATA(lo_transport_target_ext) = xco_lib->get_package( co_software_component_ext_bo + )->read( )-property-transport_layer->get_transport_target( ). + + DATA(new_transport_object_ext) = xco_cp_cts=>transports->workbench( lo_transport_target_ext->value )->create_request( |Package name: { extension_package_name } | ). + transport_extensions = new_transport_object_ext->value. + + out->write( | { co_session_name } exercise generator | ). + out->write( | ------------------------------------- | ). + . + + "database tables + table_name_root = to_upper( |{ co_prefix }ashop{ unique_suffix }| ). + draft_table_name_root = to_upper( |{ co_prefix }dshop{ unique_suffix }| ). + "CDS views + r_view_name_travel = to_upper( |{ co_prefix }R_{ co_entity_name }TP_{ unique_suffix }| ). + c_view_name_travel = to_upper( |{ co_prefix }C_{ co_entity_name }TP_{ unique_suffix }| ). + i_view_name_travel = |{ co_prefix }I_{ co_entity_name }TP_{ unique_suffix }|. + i_view_basic_name_travel = |{ co_prefix }I_{ co_entity_name }_{ unique_suffix }|. + "behavior pools + beh_impl_name_travel = |{ co_prefix }BP_{ co_entity_name }TP_{ unique_suffix }|. + "business service + srv_definition_name = |{ co_prefix }UI_{ co_entity_name }_{ unique_suffix }|. + srv_binding_o4_name = |{ co_prefix }UI_{ co_entity_name }_O4_{ unique_suffix }|. + + + " to upper + package_name = to_upper( package_name ). + unique_suffix = to_upper( unique_suffix ). + + out->write( | Use transport { transport }| ). + + DATA(my_package) = xco_lib->get_package( package_name ). + IF my_package->exists( ) = abap_false. + out->write( | Info: Suffix "{ unique_suffix }" will be used. | ). + ELSE. + out->write( | Note: Package "{ package_name }" already exists. | ). + ENDIF. + + TRY. + "create package + create_package( transport ). + create_extension_package( transport_extensions ). + CATCH cx_xco_gen_put_exception INTO DATA(put_exception). + out->write( 'error creating packages' ). + DATA(lt_findings) = put_exception->findings->get( ). + LOOP AT lt_findings INTO DATA(finding). + out->write( finding->message->get_text( ) ). + ENDLOOP. + EXIT. + CATCH cx_root INTO DATA(package_exception). + IF debug_modus = abap_true. + out->write( | Error during create_package( ). | ). + ENDIF. + EXIT. + ENDTRY. + + data_generator_class_name = |zrap630_cl_vh_product_{ unique_suffix }|. + + + TRY. + + generate_vh_custom_entity( transport ). +* generate_behavior_impl_class( transport ). + CATCH cx_xco_gen_put_exception INTO DATA(put_vh_exception). + out->write( 'error creating custom entity' ). + lt_findings = put_vh_exception->findings->get( ). + LOOP AT lt_findings INTO finding. + out->write( finding->message->get_text( ) ). + ENDLOOP. + EXIT. + ENDTRY. + + + + + + mo_environment = get_environment( transport ). + mo_put_operation = get_put_operation( mo_environment )."->create_put_operation( ). + + TRY. + create_rap_bo( + EXPORTING + out = out + IMPORTING + eo_root_node = DATA(root_node) + ). + CATCH cx_xco_gen_put_exception INTO put_exception. + out->write( 'error creating rap bo' ). + lt_findings = put_exception->findings->get( ). + LOOP AT lt_findings INTO finding. + out->write( | { finding->message->get_type( )->value }: { finding->message->get_text( ) } | ). + ENDLOOP. + EXIT. + ENDTRY. + out->write( | The following packages got created for you and will include everything you need: | ). + out->write( | - "{ package_name }" and | ). + out->write( | - "{ extension_package_name }" | ). + out->write( | In the "Project Explorer" right click on "Favorite Packages" and click on "Add Package...". | ). + out->write( | Select both (!) packages "{ package_name }" and { extension_package_name } and click OK. | ). + out->write( | The generation process has been started asynchronously in the backend | ). + out->write( | and it will take some minutes to complete. | ). + ENDMETHOD. +ENDCLASS. diff --git a/src/zdmo_gen_rap630_single.clas.xml b/src/zdmo_gen_rap630_single.clas.xml new file mode 100644 index 0000000..1179385 --- /dev/null +++ b/src/zdmo_gen_rap630_single.clas.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <VSEOCLASS> + <CLSNAME>ZDMO_GEN_RAP630_SINGLE</CLSNAME> + <LANGU>E</LANGU> + <DESCRIPT>zdmo_gen_rap110_single</DESCRIPT> + <STATE>1</STATE> + <CLSCCINCL>X</CLSCCINCL> + <FIXPT>X</FIXPT> + <UNICODE>X</UNICODE> + </VSEOCLASS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_holiday_id_swc.dtel.xml b/src/zdmo_holiday_id_swc.dtel.xml new file mode 100644 index 0000000..6adc397 --- /dev/null +++ b/src/zdmo_holiday_id_swc.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_HOLIDAY_ID_SWC</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_FCAL_HOLIDAY_ID</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Holiday ID</DDTEXT> + <REPTEXT>Holiday ID</REPTEXT> + <SCRTEXT_S>id</SCRTEXT_S> + <SCRTEXT_M>Holiday ID</SCRTEXT_M> + <SCRTEXT_L>Holiday ID</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.asddls b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.asddls new file mode 100644 index 0000000..e7a264f --- /dev/null +++ b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.asddls @@ -0,0 +1,15 @@ +@EndUserText.label: 'RAP Generator - Data Sources' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2' +@Search.searchable: true +define custom entity ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT +{ + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + @EndUserText.label: 'Data Source Name' + + key name : abap.char( 50 ); + + @EndUserText.label: 'Parent Data Source Name' + parent_data_source : sxco_cds_object_name; + +} diff --git a/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.baseinfo b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.xml b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.xml new file mode 100644 index 0000000..77e1a40 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_abstrct_ent.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_get_cds_views.ddls.asddls b/src/zdmo_i_rap_gen_get_cds_views.ddls.asddls new file mode 100644 index 0000000..776fb97 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_cds_views.ddls.asddls @@ -0,0 +1,15 @@ +@EndUserText.label: 'RAP Generator - Data Sources' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2' +@Search.searchable: true +define custom entity ZDMO_I_RAP_GEN_GET_CDS_VIEWS +{ + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + @EndUserText.label: 'Data Source Name' + + key name : abap.char( 50 ); + @UI.hidden: true + @EndUserText.label: 'Parent Data Source Name' + parent_data_source : sxco_cds_object_name; + +} diff --git a/src/zdmo_i_rap_gen_get_cds_views.ddls.baseinfo b/src/zdmo_i_rap_gen_get_cds_views.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_cds_views.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_get_cds_views.ddls.xml b/src/zdmo_i_rap_gen_get_cds_views.ddls.xml new file mode 100644 index 0000000..bb4f0b9 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_cds_views.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_GET_CDS_VIEWS</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_get_tables.ddls.asddls b/src/zdmo_i_rap_gen_get_tables.ddls.asddls new file mode 100644 index 0000000..ff30ee2 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_tables.ddls.asddls @@ -0,0 +1,12 @@ +@EndUserText.label: 'RAP Generator - Data Sources' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2' +@Search.searchable: true +define custom entity ZDMO_I_RAP_GEN_GET_TABLES +{ + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + @EndUserText.label: 'Data Source Name' + + key name : abap.char( 50 ); + +} diff --git a/src/zdmo_i_rap_gen_get_tables.ddls.baseinfo b/src/zdmo_i_rap_gen_get_tables.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_tables.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_get_tables.ddls.xml b/src/zdmo_i_rap_gen_get_tables.ddls.xml new file mode 100644 index 0000000..832e554 --- /dev/null +++ b/src/zdmo_i_rap_gen_get_tables.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_GET_TABLES</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_add_child.ddls.asddls b/src/zdmo_i_rap_gen_param_add_child.ddls.asddls new file mode 100644 index 0000000..7d69960 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_child.ddls.asddls @@ -0,0 +1,6 @@ +@EndUserText.label: 'contains parameter(s) to create new nodes' +define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_CHILD +{ + @EndUserText.label: 'Child Entity Name' + entity_name : zdmo_rap_gen_entityname; +} diff --git a/src/zdmo_i_rap_gen_param_add_child.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_child.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_child.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_add_child.ddls.xml b/src/zdmo_i_rap_gen_param_add_child.ddls.xml new file mode 100644 index 0000000..d768637 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_child.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_CHILD</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_add_node.ddls.asddls b/src/zdmo_i_rap_gen_param_add_node.ddls.asddls new file mode 100644 index 0000000..3d2fc30 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_node.ddls.asddls @@ -0,0 +1,42 @@ +@EndUserText.label: 'Parameter(s) to create new nodes' +define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_NODE +{ + @EndUserText.label: 'Entity Name' + entity_name : zdmo_rap_gen_entityname; + +// +// @Consumption.valueHelpDefinition: +// [{ +// qualifier: 'MyValueHelpA', +// entity: { name:'ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT', element:'name' }, +// enabled: #(' ELEMENT_OF_REFERENCED_ENTITY: isabstractentity') +// }, +// { +// qualifier: 'MyValueHelpB', +// entity: { name:'C_RAP_MDBU_VALUEHELP_B', element:'CountryAvailability' }, +// enabled: #('ELEMENT_OF_REFERENCED_ENTITY: xxx') +// }] +//// +// @Consumption.valueHelpDefinition: [{ entity: { name: 'ZDMO_I_RAP_GENERATOR_DATA_SRC2', +// element: 'name' } +// , +// additionalBinding: [{element: 'type', +// localElement: #( ' ELEMENT_OF_REFERENCED_ENTITY: DataSourceType'), +// usage: #FILTER +// }] +// }] + + DataSourceName : abap.char(30); +// @EndUserText.label : 'Datasource Type' +// @UI.defaultValue: #('ELEMENT_OF_REFERENCED_ENTITY:DataSourceType') + DataSourceType : abap.char(30); +// @EndUserText.label: 'Data Source Name' +// @Consumption.valueHelpDefinition: [{ entity: +// { name : 'ZDMO_I_RAP_GENERATOR_DATA_SRC2' , element: 'name' } +// , +// additionalBinding: [{ element: 'type', +// localElement: 'DataSourceType' }] +// }] +// +// DataSourceName : abap.char(30); +} diff --git a/src/zdmo_i_rap_gen_param_add_node.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_node.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_node.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_add_node.ddls.xml b/src/zdmo_i_rap_gen_param_add_node.ddls.xml new file mode 100644 index 0000000..a4a824e --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_node.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_add_nodea.ddls.asddls b/src/zdmo_i_rap_gen_param_add_nodea.ddls.asddls new file mode 100644 index 0000000..188421f --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodea.ddls.asddls @@ -0,0 +1,21 @@ +@EndUserText.label: 'Parameter(s) to create new nodes' +define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_NODEA +{ + @EndUserText.label : 'Entity Name' + entity_name : zdmo_rap_gen_entityname; + + @Consumption.valueHelpDefinition: [{ entity: { name: 'ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT', + element: 'name' } + , + additionalBinding: [{ element: 'parent_data_source', + localElement: 'parent_data_source' }] + }] + @EndUserText.label : 'Data Source Name' + DataSourceName : abap.char(30); + +// @UI.defaultValue : #('ELEMENT_OF_REFERENCED_ENTITY:DataSource') + @UI.hidden : true + @EndUserText.label: 'Parent Data Source Name' + parent_data_source : zdmo_rap_gen_entityname; + +} diff --git a/src/zdmo_i_rap_gen_param_add_nodea.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_nodea.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodea.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_add_nodea.ddls.xml b/src/zdmo_i_rap_gen_param_add_nodea.ddls.xml new file mode 100644 index 0000000..506602c --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodea.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODEA</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_add_nodec.ddls.asddls b/src/zdmo_i_rap_gen_param_add_nodec.ddls.asddls new file mode 100644 index 0000000..b013146 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodec.ddls.asddls @@ -0,0 +1,19 @@ +@EndUserText.label: 'Parameter(s) to create new nodes' +define abstract entity ZDMO_I_RAP_GEN_PARAM_ADD_NODEC +{ + @EndUserText.label : 'Entity Name' + entity_name : zdmo_rap_gen_entityname; + + @Consumption.valueHelpDefinition: [{ entity: { name: 'ZDMO_I_RAP_GEN_GET_CDS_VIEWS', + element: 'name' } + , + additionalBinding: [{ element: 'parent_data_source', + localElement: 'parent_data_source' }] + }] + @EndUserText.label: 'Data Source Name' + DataSourceName : abap.char(30); +// @UI.defaultValue : #('ELEMENT_OF_REFERENCED_ENTITY:DataSource') + @UI.hidden: true + @EndUserText.label: 'Parent Data Source Name' + parent_data_source : zdmo_rap_gen_entityname; +} diff --git a/src/zdmo_i_rap_gen_param_add_nodec.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_nodec.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodec.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_add_nodec.ddls.xml b/src/zdmo_i_rap_gen_param_add_nodec.ddls.xml new file mode 100644 index 0000000..b2beaf4 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodec.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODEC</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_add_nodet.ddls.asddls b/src/zdmo_i_rap_gen_param_add_nodet.ddls.asddls new file mode 100644 index 0000000..9b6a806 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodet.ddls.asddls @@ -0,0 +1,16 @@ +@EndUserText.label: 'Parameter(s) to create new nodes' +define abstract entity ZDMO_I_RAP_GEN_PARAM_Add_nodeT +{ + @EndUserText.label: 'Entity Name' + entity_name : zdmo_rap_gen_entityname; + + @Consumption.valueHelpDefinition: [{ entity: { name: 'ZDMO_I_RAP_gen_get_tables', + element: 'name' } + }] + @EndUserText.label: 'Data Source Name' + DataSourceName : abap.char(30); + +// @UI.defaultValue: #('ELEMENT_OF_REFERENCED_ENTITY:DataSource') +// parent_entity_name : zdmo_rap_gen_entityname; + +} diff --git a/src/zdmo_i_rap_gen_param_add_nodet.ddls.baseinfo b/src/zdmo_i_rap_gen_param_add_nodet.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodet.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_add_nodet.ddls.xml b/src/zdmo_i_rap_gen_param_add_nodet.ddls.xml new file mode 100644 index 0000000..1463484 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_add_nodet.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_ADD_NODET</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new RAP BOs with a root node</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_copy_proj.ddls.asddls b/src/zdmo_i_rap_gen_param_copy_proj.ddls.asddls new file mode 100644 index 0000000..27baee7 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_copy_proj.ddls.asddls @@ -0,0 +1,8 @@ +@EndUserText.label: 'contains parameter(s) to copy projects' +define abstract entity ZDMO_I_RAP_GEN_PARAM_COPY_PROJ +{ +// Use the same name as in the root view ZDMO_R_RapGeneratorBO + @EndUserText.label: 'Package' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}] + PackageName : sxco_package; +} diff --git a/src/zdmo_i_rap_gen_param_copy_proj.ddls.baseinfo b/src/zdmo_i_rap_gen_param_copy_proj.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_copy_proj.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_copy_proj.ddls.xml b/src/zdmo_i_rap_gen_param_copy_proj.ddls.xml new file mode 100644 index 0000000..26729f0 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_copy_proj.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_COPY_PROJ</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new child nodes</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_new_proj.ddls.asddls b/src/zdmo_i_rap_gen_param_new_proj.ddls.asddls new file mode 100644 index 0000000..5b9702a --- /dev/null +++ b/src/zdmo_i_rap_gen_param_new_proj.ddls.asddls @@ -0,0 +1,44 @@ +@EndUserText.label: 'Parameter(s) to create new projects' +define abstract entity ZDMO_I_RAP_GEN_PARAM_NEW_PROJ +{ + + // @UI.defaultValue : 'table' + @EndUserText.label : 'Datasource Type' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_DSRC_TYPE', element: 'type' }}] + DataSourceType : abap.char(30); + // @UI.defaultValue : 'managed' + @EndUserText.label : 'Implementation type' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_IMPL_TYP2', element: 'name' }}] + + BdefImplementationType : abap.char(50); + // @UI.defaultValue : 'odata_v4_ui' + @EndUserText.label : 'Binding type' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_BIND_TYPE', element: 'name' }}] + BindingType : abap.char(30); + // @UI.defaultValue : 'X' + @EndUserText.label : 'Draft enabled' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_BOOL_VH', element: 'bool_value' }}] + DraftEnabled : abap_boolean; + + @EndUserText.label : 'is extensible' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_BOOL_VH', element: 'bool_value' }}] + isExtensible : abap_boolean; + + @EndUserText.label : 'Root Entity Name' + EntityName : zdmo_rap_gen_entityname; + + @Consumption.valueHelpDefinition: [{ entity: + { name : 'ZDMO_I_RAP_GENERATOR_DATA_SRC2' , element: 'name' } + , + additionalBinding: [{ element: 'type', + localElement: 'DataSourceType' }] + }] + @EndUserText.label : 'Data Source Name' + data_source_name : abap.char(30); + + @EndUserText.label : 'Package' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}] + package_name : abap.char(30); + + +} diff --git a/src/zdmo_i_rap_gen_param_new_proj.ddls.baseinfo b/src/zdmo_i_rap_gen_param_new_proj.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_new_proj.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_new_proj.ddls.xml b/src/zdmo_i_rap_gen_param_new_proj.ddls.xml new file mode 100644 index 0000000..4120bba --- /dev/null +++ b/src/zdmo_i_rap_gen_param_new_proj.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_NEW_PROJ</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new child nodes</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_gen_param_rapbonode.ddls.asddls b/src/zdmo_i_rap_gen_param_rapbonode.ddls.asddls new file mode 100644 index 0000000..331f3e9 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_rapbonode.ddls.asddls @@ -0,0 +1,14 @@ +@EndUserText.label: 'contains parameter(s) to create new nodes' +define abstract entity ZDMO_I_RAP_GEN_PARAM_RAPBONODE +{ + @EndUserText.label: 'Root Entity Name' + entity_name : zdmo_rap_gen_entityname; + @EndUserText.label: 'Package' + @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_PACKAGE', element: 'name' }}] + package_name : sxco_package; +// @EndUserText.label: 'ABAP Language Version' +// @Consumption.defaultValue : 'abap_for_cloud_development' +// @Consumption.valueHelpDefinition: [{entity: {name: 'ZDMO_I_RAP_GENERATOR_ABAP_VERS', element: 'language_version' }}] +// language_version : abap.char( 30 ); + +} diff --git a/src/zdmo_i_rap_gen_param_rapbonode.ddls.baseinfo b/src/zdmo_i_rap_gen_param_rapbonode.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_rapbonode.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_gen_param_rapbonode.ddls.xml b/src/zdmo_i_rap_gen_param_rapbonode.ddls.xml new file mode 100644 index 0000000..ac9c711 --- /dev/null +++ b/src/zdmo_i_rap_gen_param_rapbonode.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GEN_PARAM_RAPBONODE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Action Parameter(s) to create new child nodes</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_abap_vers.ddls.asddls b/src/zdmo_i_rap_generator_abap_vers.ddls.asddls new file mode 100644 index 0000000..a9768aa --- /dev/null +++ b/src/zdmo_i_rap_generator_abap_vers.ddls.asddls @@ -0,0 +1,7 @@ +@EndUserText.label: 'RAP Generator - ABAP Language Version' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_ABAP_VERS' +define custom entity ZDMO_I_RAP_GENERATOR_ABAP_VERS +{ + key language_version : abap.char( 30 ); +} diff --git a/src/zdmo_i_rap_generator_abap_vers.ddls.baseinfo b/src/zdmo_i_rap_generator_abap_vers.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_abap_vers.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_abap_vers.ddls.xml b/src/zdmo_i_rap_generator_abap_vers.ddls.xml new file mode 100644 index 0000000..7fa110c --- /dev/null +++ b/src/zdmo_i_rap_generator_abap_vers.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_ABAP_VERS</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - ABAP Language Version Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_appl_log.ddls.asddls b/src/zdmo_i_rap_generator_appl_log.ddls.asddls new file mode 100644 index 0000000..7ac962f --- /dev/null +++ b/src/zdmo_i_rap_generator_appl_log.ddls.asddls @@ -0,0 +1,73 @@ +@EndUserText.label: 'RAP Generator - Application Log' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_SHOW_APPL_LOG' +//@Search.searchable: true + +@UI: { + headerInfo: { + title: { + type: #STANDARD, + label: 'Item Number', + value: 'Log_item_number' + }, + typeName: 'AppLogEntry', + typeNamePlural: 'AppLogEntries'}, + presentationVariant: [{ + maxItems: 20, + visualizations: [{type: #AS_LINEITEM}] + }] + } + + +define custom entity ZDMO_I_RAP_GENERATOR_appl_log +{ + @UI.facet : [ + { + id : 'idIdentification', + type : #IDENTIFICATION_REFERENCE, + label : 'General Information', + position : 10 + } + ] + key Log_handle : balloghndl; + @UI.lineItem : [ { + position : 10 , + importance : #HIGH, + label : 'Log item number' } ] + @UI.identification: [ { + position : 10 , + importance : #HIGH, + label : 'Log item number' } ] + @EndUserText.label: 'Logitemnumber' + @UI.selectionField: [ { position: 20 } ] + key Log_item_number : balmnr; + + @UI.lineItem : [ { + position : 10 , + importance : #HIGH, + criticality : 'criticality', + label : 'Severity' } ] + + severity : symsgty; + category : abap.char(1); + criticality : abap.int1; + @UI.lineItem : [ { + position : 90 , + importance : #HIGH, + label : 'Detail level' } ] + @UI.identification: [ { + position : 90 , + importance : #HIGH, + label : 'Detail level' } ] + detail_level : ballevel; + timestamp : abap.utclong; + @UI.lineItem : [ { + position : 100 , + importance : #HIGH, + label : 'Message text' } ] + @UI.identification: [ { + position : 100 , + importance : #HIGH, + label : 'Message text' } ] + message_text : abap.sstring( 512 ); + +} diff --git a/src/zdmo_i_rap_generator_appl_log.ddls.baseinfo b/src/zdmo_i_rap_generator_appl_log.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_appl_log.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_appl_log.ddls.xml b/src/zdmo_i_rap_generator_appl_log.ddls.xml new file mode 100644 index 0000000..2059ecd --- /dev/null +++ b/src/zdmo_i_rap_generator_appl_log.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_APPL_LOG</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Show application log entries</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_bind_type.ddls.asddls b/src/zdmo_i_rap_generator_bind_type.ddls.asddls new file mode 100644 index 0000000..42bebb4 --- /dev/null +++ b/src/zdmo_i_rap_generator_bind_type.ddls.asddls @@ -0,0 +1,7 @@ +@EndUserText.label: 'RAP Generator - Binding Type' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_BIND_TYPE' +define custom entity ZDMO_I_RAP_GENERATOR_BIND_TYPE +{ + key name : abap.char( 50 ); +} diff --git a/src/zdmo_i_rap_generator_bind_type.ddls.baseinfo b/src/zdmo_i_rap_generator_bind_type.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_bind_type.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_bind_type.ddls.xml b/src/zdmo_i_rap_generator_bind_type.ddls.xml new file mode 100644 index 0000000..16c2c94 --- /dev/null +++ b/src/zdmo_i_rap_generator_bind_type.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_BIND_TYPE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Binding Types Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_bool_vh.ddls.asddls b/src/zdmo_i_rap_generator_bool_vh.ddls.asddls new file mode 100644 index 0000000..88e58e5 --- /dev/null +++ b/src/zdmo_i_rap_generator_bool_vh.ddls.asddls @@ -0,0 +1,9 @@ +@EndUserText.label: 'value help for boolean values' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_BOOLEANS' +define custom entity zdmo_I_rap_generator_bool_VH +{ + @ObjectModel.text.element: ['name'] + key bool_value : abap_boolean; + name : abap.char(10); +} diff --git a/src/zdmo_i_rap_generator_bool_vh.ddls.baseinfo b/src/zdmo_i_rap_generator_bool_vh.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_bool_vh.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_bool_vh.ddls.xml b/src/zdmo_i_rap_generator_bool_vh.ddls.xml new file mode 100644 index 0000000..9dbb72a --- /dev/null +++ b/src/zdmo_i_rap_generator_bool_vh.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_BOOL_VH</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>value help for boolean values</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_data_src2.ddls.asddls b/src/zdmo_i_rap_generator_data_src2.ddls.asddls new file mode 100644 index 0000000..44c434e --- /dev/null +++ b/src/zdmo_i_rap_generator_data_src2.ddls.asddls @@ -0,0 +1,15 @@ +@EndUserText.label: 'RAP Generator - Data Sources' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DATA_SRC_2' +@Search.searchable: true +define custom entity ZDMO_I_RAP_GENERATOR_DATA_SRC2 +{ + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + @EndUserText.label : 'Data Source Name' + key name : abap.char( 50 ); + @UI.hidden : true + key type : abap.char( 20 ); + @UI.hidden: true + parent_data_source : sxco_cds_object_name; + +} diff --git a/src/zdmo_i_rap_generator_data_src2.ddls.baseinfo b/src/zdmo_i_rap_generator_data_src2.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_data_src2.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_data_src2.ddls.xml b/src/zdmo_i_rap_generator_data_src2.ddls.xml new file mode 100644 index 0000000..846fc41 --- /dev/null +++ b/src/zdmo_i_rap_generator_data_src2.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_DATA_SRC2</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Data Sources Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_dsrc_type.ddls.asddls b/src/zdmo_i_rap_generator_dsrc_type.ddls.asddls new file mode 100644 index 0000000..61783d3 --- /dev/null +++ b/src/zdmo_i_rap_generator_dsrc_type.ddls.asddls @@ -0,0 +1,8 @@ +@EndUserText.label: 'RAP Generator - Datasource Type' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_DSRC_TYPE' +define custom entity ZDMO_I_RAP_GENERATOR_DSRC_TYPE +{ + @EndUserText.label: 'Data Source Type' + key type : abap.char( 50 ); +} diff --git a/src/zdmo_i_rap_generator_dsrc_type.ddls.baseinfo b/src/zdmo_i_rap_generator_dsrc_type.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_dsrc_type.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_dsrc_type.ddls.xml b/src/zdmo_i_rap_generator_dsrc_type.ddls.xml new file mode 100644 index 0000000..1467d4f --- /dev/null +++ b/src/zdmo_i_rap_generator_dsrc_type.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_DSRC_TYPE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Data Source Types Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_fields.ddls.asddls b/src/zdmo_i_rap_generator_fields.ddls.asddls new file mode 100644 index 0000000..0671857 --- /dev/null +++ b/src/zdmo_i_rap_generator_fields.ddls.asddls @@ -0,0 +1,24 @@ +@EndUserText.label: 'RAP Generator - Datsource Fields' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_FIELDS' +define custom entity ZDMO_I_RAP_GENERATOR_FIELDS +{ + @EndUserText.label : 'Field Name' + key field : abap.char( 30 ); + @UI.hidden : true + key name : abap.char( 50 ); + @UI.hidden : true + key type : abap.char( 20 ); + @UI.hidden : true + key language_version : abap.char(30); + @EndUserText.label : 'Data element' + data_element : sxco_ad_object_name; + @EndUserText.label : 'Built in type' + built_in_type : abap.char( 4 ); + @EndUserText.label : 'Length' + built_in_type_length : abap.numc( 6 ); + @EndUserText.label : 'Decimals' + built_in_type_decimals : abap.numc( 6 ); + + +} diff --git a/src/zdmo_i_rap_generator_fields.ddls.baseinfo b/src/zdmo_i_rap_generator_fields.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_fields.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_fields.ddls.xml b/src/zdmo_i_rap_generator_fields.ddls.xml new file mode 100644 index 0000000..ddd8578 --- /dev/null +++ b/src/zdmo_i_rap_generator_fields.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_FIELDS</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Data Source Fields - Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_impl_typ2.ddls.asddls b/src/zdmo_i_rap_generator_impl_typ2.ddls.asddls new file mode 100644 index 0000000..9b9c89a --- /dev/null +++ b/src/zdmo_i_rap_generator_impl_typ2.ddls.asddls @@ -0,0 +1,8 @@ +@EndUserText.label: 'RAP Generator - Implementation Types' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_IMPL_TYPE2' +define custom entity ZDMO_I_RAP_GENERATOR_IMPL_TYP2 +{ + @EndUserText.label: 'Implementation Type' + key name : abap.char( 50 ); +} diff --git a/src/zdmo_i_rap_generator_impl_typ2.ddls.baseinfo b/src/zdmo_i_rap_generator_impl_typ2.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_impl_typ2.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_impl_typ2.ddls.xml b/src/zdmo_i_rap_generator_impl_typ2.ddls.xml new file mode 100644 index 0000000..136eca9 --- /dev/null +++ b/src/zdmo_i_rap_generator_impl_typ2.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_IMPL_TYP2</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Implementation Types - Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_impl_type.ddls.asddls b/src/zdmo_i_rap_generator_impl_type.ddls.asddls new file mode 100644 index 0000000..f0abed2 --- /dev/null +++ b/src/zdmo_i_rap_generator_impl_type.ddls.asddls @@ -0,0 +1,7 @@ +@EndUserText.label: 'RAP Generator - Implementation Types' +@ObjectModel.resultSet.sizeCategory: #XS +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_IMPL_TYPE' +define custom entity ZDMO_I_RAP_GENERATOR_IMPL_TYPE +{ + key name : abap.char( 50 ); +} diff --git a/src/zdmo_i_rap_generator_impl_type.ddls.baseinfo b/src/zdmo_i_rap_generator_impl_type.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_impl_type.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_impl_type.ddls.xml b/src/zdmo_i_rap_generator_impl_type.ddls.xml new file mode 100644 index 0000000..96ccb3e --- /dev/null +++ b/src/zdmo_i_rap_generator_impl_type.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_IMPL_TYPE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Implementation Types - Value Help</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_job_stat.ddls.asddls b/src/zdmo_i_rap_generator_job_stat.ddls.asddls new file mode 100644 index 0000000..6bdedea --- /dev/null +++ b/src/zdmo_i_rap_generator_job_stat.ddls.asddls @@ -0,0 +1,11 @@ +@EndUserText.label: 'Job status of jobs scheduled by the RAP Generator UI' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_JOB_STATUS' +define custom entity ZDMO_I_RAP_GENERATOR_JOB_STAT +{ + + key job_name : abap.char(32); + key job_count : abap.char(8); + job_status : abap.char(1); + status_text : abap.char(60); + +} diff --git a/src/zdmo_i_rap_generator_job_stat.ddls.baseinfo b/src/zdmo_i_rap_generator_job_stat.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_job_stat.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_job_stat.ddls.xml b/src/zdmo_i_rap_generator_job_stat.ddls.xml new file mode 100644 index 0000000..863edf1 --- /dev/null +++ b/src/zdmo_i_rap_generator_job_stat.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_JOB_STAT</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Job status of jobs scheduled by the RAP Generator UI</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_i_rap_generator_package.ddls.asddls b/src/zdmo_i_rap_generator_package.ddls.asddls new file mode 100644 index 0000000..2a74002 --- /dev/null +++ b/src/zdmo_i_rap_generator_package.ddls.asddls @@ -0,0 +1,14 @@ +@EndUserText.label: 'RAP Generator - Packages' +@ObjectModel.query.implementedBy: 'ABAP:ZDMO_CL_RAP_GEN_GET_PACKAGE' +@Search.searchable: true +define custom entity ZDMO_I_RAP_GENERATOR_PACKAGE +{ + + + @Search.defaultSearchElement: true + @Search.fuzzinessThreshold: 0.90 + @EndUserText.label: 'Package Name' + key name : abap.char( 50 ); + @UI.hidden : true + key language_version : abap.char(30); +} diff --git a/src/zdmo_i_rap_generator_package.ddls.baseinfo b/src/zdmo_i_rap_generator_package.ddls.baseinfo new file mode 100644 index 0000000..8a07ae1 --- /dev/null +++ b/src/zdmo_i_rap_generator_package.ddls.baseinfo @@ -0,0 +1,17 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_i_rap_generator_package.ddls.xml b/src/zdmo_i_rap_generator_package.ddls.xml new file mode 100644 index 0000000..9e3a916 --- /dev/null +++ b/src/zdmo_i_rap_generator_package.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_I_RAP_GENERATOR_PACKAGE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>RAP Generator - Packages</DDTEXT> + <SOURCE_TYPE>Q</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_fieldtp.ddls.asddls b/src/zdmo_r_rapg_fieldtp.ddls.asddls new file mode 100644 index 0000000..a518a40 --- /dev/null +++ b/src/zdmo_r_rapg_fieldtp.ddls.asddls @@ -0,0 +1,20 @@ +@AccessControl.authorizationCheck: #NOT_REQUIRED +@Metadata.allowExtensions: true +@EndUserText.label: 'CDS View forField' +define view entity ZDMO_R_RAPG_FieldTP + as select from zdmo_rapgen_flds + association to parent ZDMO_R_RAPG_NodeTP as _Node on $projection.NodeUUID = _Node.NodeUUID + association [1] to ZDMO_R_RAPG_ProjectTP as _Project on $projection.RapboUUID = _Project.RapBoUUID +{ + key field_uuid as FieldUUID, + node_uuid as NodeUUID, + rapbo_uuid as RapboUUID, + is_key as IsKey, + dbtable_field as DbtableField, + cds_view_field as CdsViewField, + @Semantics.systemDateTime.localInstanceLastChangedAt: true + local_last_changed_at as LocalLastChangedAt, + _Node, + _Project + +} diff --git a/src/zdmo_r_rapg_fieldtp.ddls.baseinfo b/src/zdmo_r_rapg_fieldtp.ddls.baseinfo new file mode 100644 index 0000000..b9cd7cc --- /dev/null +++ b/src/zdmo_r_rapg_fieldtp.ddls.baseinfo @@ -0,0 +1,22 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_RAPGEN_FLDS" +], +"ASSOCIATED": +[ +"ZDMO_R_RAPG_NODETP", +"ZDMO_R_RAPG_PROJECTTP" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_fieldtp.ddls.xml b/src/zdmo_r_rapg_fieldtp.ddls.xml new file mode 100644 index 0000000..4fe840b --- /dev/null +++ b/src/zdmo_r_rapg_fieldtp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_R_RAPG_FIELDTP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>CDS View for Field</DDTEXT> + <SOURCE_TYPE>W</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_logtp.ddls.asddls b/src/zdmo_r_rapg_logtp.ddls.asddls new file mode 100644 index 0000000..23a00d7 --- /dev/null +++ b/src/zdmo_r_rapg_logtp.ddls.asddls @@ -0,0 +1,27 @@ +@AccessControl.authorizationCheck: #NOT_REQUIRED +@Metadata.allowExtensions: true +@EndUserText.label: 'CDS View forLog' +define view entity ZDMO_R_RAPG_LogTP + as select from zdmo_rapgen_log + association to parent ZDMO_R_RAPG_ProjectTP as _Project on $projection.RapBoUUID = _Project.RapBoUUID +{ + key log_uuid as LogUUID, + rapbo_uuid as RapBoUUID, + log_item_number as LogItemNumber, + detail_level as DetailLevel, + severity as Severity, + case + when severity = 'S' then 3 //successul / green + when severity = 'I' then 0 //information / grey + when severity = 'W' then 2 //warning / orange + when severity = 'E' then 1 //error / red + when severity = 'A' then 1 //error / red + else 0 //not specified / grey + end as Criticality, + text as Text, + time_stamp as TimeStamp, + @Semantics.systemDateTime.localInstanceLastChangedAt: true + local_last_changed_at as LocalLastChangedAt, + _Project + +} diff --git a/src/zdmo_r_rapg_logtp.ddls.baseinfo b/src/zdmo_r_rapg_logtp.ddls.baseinfo new file mode 100644 index 0000000..11421e9 --- /dev/null +++ b/src/zdmo_r_rapg_logtp.ddls.baseinfo @@ -0,0 +1,21 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_RAPGEN_LOG" +], +"ASSOCIATED": +[ +"ZDMO_R_RAPG_PROJECTTP" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_logtp.ddls.xml b/src/zdmo_r_rapg_logtp.ddls.xml new file mode 100644 index 0000000..b2def0c --- /dev/null +++ b/src/zdmo_r_rapg_logtp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_R_RAPG_LOGTP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>CDS View for Log</DDTEXT> + <SOURCE_TYPE>W</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_nodetp.ddls.asddls b/src/zdmo_r_rapg_nodetp.ddls.asddls new file mode 100644 index 0000000..439ab12 --- /dev/null +++ b/src/zdmo_r_rapg_nodetp.ddls.asddls @@ -0,0 +1,80 @@ +@AccessControl.authorizationCheck: #NOT_REQUIRED +@Metadata.allowExtensions: true +@EndUserText.label: 'CDS View forNode' + +define view entity ZDMO_R_RAPG_NodeTP + as select from zdmo_rapgen_node + association to parent ZDMO_R_RAPG_ProjectTP as _Project on $projection.RapBoUUID = _Project.RapBoUUID + composition [0..*] of ZDMO_R_RAPG_FieldTP as _Field + // association [0..*] to ZDMO_R_RAPG_NodeTP as _Entity on $projection.RapBoUUID = _Entity.RapBoUUID +{ + + key node_uuid as NodeUUID, + header_uuid as RapBoUUID, + parent_uuid as ParentUUID, + root_uuid as RootUUID, + node_number as NodeNumber, + is_root_node as IsRootNode, + entity_name as EntityName, + parent_entity_name as ParentEntityName, + data_source as DataSource, + parent_data_source as ParentDataSource, + view_type_value as ViewTypeValue, + field_name_object_id as FieldNameObjectID, + field_name_etag_master as FieldNameEtagMaster, + field_name_total_etag as FieldNameTotalEtag, + field_name_uuid as FieldNameUUID, + field_name_parent_uuid as FieldNameParentUUID, + field_name_root_uuid as FieldNameRootUUID, + field_name_created_by as FieldNameCreatedBy, + field_name_created_at as FieldNameCreatedAt, + field_name_last_changed_by as FieldNameLastChangedBy, + field_name_last_changed_at as FieldNameLastChangedAt, + field_name_loc_last_changed_at as FieldNameLocLastChangedAt, + cds_i_view as CdsIView, + cds_i_view_basic as CdsIViewBasic, + cds_r_view as CdsRView, + cds_p_view as CdsPView, + mde_view as MdeView, + behavior_implementation_class as BehaviorImplementationClass, + service_definition as ServiceDefinition, + service_binding as ServiceBinding, + control_structure as ControlStructure, + query_implementation_class as QueryImplementationClass, + draft_table_name as DraftTableName, + extension_include as ExtensionInclude, + extension_include_view as ExtensionIncludeView, + draft_query_view as DraftQueryView, + hierarchy_distance_from_root as HierarchyDistanceFromRoot, + hierarchy_descendant_count as HierarchyDescendantCount, + hierarchy_drill_state as HierarchyDrillState, + hierarchy_preorder_rank as HierarchyPreorderRank, + @Semantics.systemDateTime.localInstanceLastChangedAt: true + local_last_changed_at as LocalLastChangedAt, + extensibility_element_suffix as ExtensibilityElementSuffix, + sap_object_node_type as SAPObjectNodeType, + sap_object_type as SAPObjectType, + cast( case + when is_root_node = 'X' then ' ' + else 'X' + end as abap_boolean ) as isChildNode, + + cast( case + when _Project.DataSourceType = 'table' then 'X' + else ' ' + end as abap_boolean ) as isTable, + cast( case + when _Project.DataSourceType = 'cds_view' then 'X' + else ' ' + end as abap_boolean ) as isCDSview, + cast( case + when _Project.DataSourceType = 'abstract_entity' then 'X' + else ' ' + end as abap_boolean ) as isAbstractEntity, + + _Field, + _Project + // , + // _Entity + +} diff --git a/src/zdmo_r_rapg_nodetp.ddls.baseinfo b/src/zdmo_r_rapg_nodetp.ddls.baseinfo new file mode 100644 index 0000000..f35d8da --- /dev/null +++ b/src/zdmo_r_rapg_nodetp.ddls.baseinfo @@ -0,0 +1,23 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_R_RAPG_PROJECTTP", +"ZDMO_RAPGEN_NODE" +], +"ASSOCIATED": +[ +"ZDMO_R_RAPG_FIELDTP", +"ZDMO_R_RAPG_PROJECTTP" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_nodetp.ddls.xml b/src/zdmo_r_rapg_nodetp.ddls.xml new file mode 100644 index 0000000..83ab823 --- /dev/null +++ b/src/zdmo_r_rapg_nodetp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_R_RAPG_NODETP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>CDS View for Node</DDTEXT> + <SOURCE_TYPE>W</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_nodetpdraft.ddls.asddls b/src/zdmo_r_rapg_nodetpdraft.ddls.asddls new file mode 100644 index 0000000..fafc69c --- /dev/null +++ b/src/zdmo_r_rapg_nodetpdraft.ddls.asddls @@ -0,0 +1,66 @@ +@AbapCatalog.viewEnhancementCategory: [#NONE] +@AccessControl.authorizationCheck: #NOT_REQUIRED +@EndUserText.label: 'CDS view for draft entries' +@Metadata.ignorePropagatedAnnotations: true +@ObjectModel.usageType:{ + serviceQuality: #X, + sizeCategory: #S, + dataClass: #MIXED +} +define view entity ZDMO_R_RAPG_NodeTPDraft + as select from zdmo_rapgnode00d +{ + key nodeuuid as Nodeuuid, + rapbouuid as Rapbouuid, + parentuuid as Parentuuid, + rootuuid as Rootuuid, + nodenumber as Nodenumber, + isrootnode as Isrootnode, + entityname as Entityname, + parententityname as Parententityname, + datasource as Datasource, + parentdatasource as Parentdatasource, + viewtypevalue as Viewtypevalue, + fieldnameobjectid as Fieldnameobjectid, + fieldnameetagmaster as Fieldnameetagmaster, + fieldnametotaletag as Fieldnametotaletag, + fieldnameuuid as Fieldnameuuid, + fieldnameparentuuid as Fieldnameparentuuid, + fieldnamerootuuid as Fieldnamerootuuid, + fieldnamecreatedby as Fieldnamecreatedby, + fieldnamecreatedat as Fieldnamecreatedat, + fieldnamelastchangedby as Fieldnamelastchangedby, + fieldnamelastchangedat as Fieldnamelastchangedat, + fieldnameloclastchangedat as Fieldnameloclastchangedat, + cdsiview as Cdsiview, + cdsiviewbasic as Cdsiviewbasic, + cdsrview as Cdsrview, + cdspview as Cdspview, + mdeview as Mdeview, + behaviorimplementationclass as Behaviorimplementationclass, + servicedefinition as Servicedefinition, + servicebinding as Servicebinding, + controlstructure as Controlstructure, + queryimplementationclass as Queryimplementationclass, + drafttablename as Drafttablename, + hierarchydistancefromroot as Hierarchydistancefromroot, + hierarchydescendantcount as Hierarchydescendantcount, + hierarchydrillstate as Hierarchydrillstate, + hierarchypreorderrank as Hierarchypreorderrank, + locallastchangedat as Locallastchangedat, + ischildnode as Ischildnode, + istable as Istable, + iscdsview as Iscdsview, + isabstractentity as Isabstractentity, + draftentitycreationdatetime as Draftentitycreationdatetime, + draftentitylastchangedatetime as Draftentitylastchangedatetime, + draftadministrativedatauuid as Draftadministrativedatauuid, + draftentityoperationcode as Draftentityoperationcode, + hasactiveentity as Hasactiveentity, + draftfieldchanges as Draftfieldchanges, + sapobjectnodetype as Sapojbectnodetype, + sapobjecttype as sapobjecttype +} +where + draftentityoperationcode <> 'D' // IF_DRAFT_CONSTANTS=>co_operation_code-deleted + and draftentityoperationcode <> 'L' // IF_DRAFT_CONSTANTS=>co_operation_code-redeleted diff --git a/src/zdmo_r_rapg_nodetpdraft.ddls.baseinfo b/src/zdmo_r_rapg_nodetpdraft.ddls.baseinfo new file mode 100644 index 0000000..621c5a6 --- /dev/null +++ b/src/zdmo_r_rapg_nodetpdraft.ddls.baseinfo @@ -0,0 +1,19 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_RAPGNODE00D" +], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_nodetpdraft.ddls.xml b/src/zdmo_r_rapg_nodetpdraft.ddls.xml new file mode 100644 index 0000000..f22f379 --- /dev/null +++ b/src/zdmo_r_rapg_nodetpdraft.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_R_RAPG_NODETPDRAFT</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>CDS view for draft entries</DDTEXT> + <SOURCE_TYPE>W</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_projecttp.bdef.asbdef b/src/zdmo_r_rapg_projecttp.bdef.asbdef new file mode 100644 index 0000000..4f7cc26 --- /dev/null +++ b/src/zdmo_r_rapg_projecttp.bdef.asbdef @@ -0,0 +1,387 @@ +managed implementation in class zdmo_bp_rapg_all unique; + + +strict; +with draft; + +define behavior for ZDMO_R_RAPG_ProjectTP alias Project +//implementation in class ZDMO_BP_R_RAPG_Project unique +persistent table zdmo_rapgen_bo +with additional save +draft table zdmo_rapgproj00d +etag master LocalLastChangedAt +lock master +total etag LastChangedAt +authorization master ( global ) + +{ + field ( readonly ) + RapBoUUID, + BoName, + // set when being created + ImplementationType, + DataSourceType, + BindingType, + DraftEnabled, + PackageName, + Namespace, + isExtensible, + // RAP Generator Parameters + JsonString, + //ADT + ADTLink, + // administrative fields + CreatedAt, + CreatedBy, + LastChangedBy, + LastChangedAt, + LocalLastChangedAt; + + // field ( mandatory ) + // PackageName; + + // field ( features : instance ) ADTLink; + field ( features : instance ) MultiInlineEdit, CustomizingTable, AddToManageBusinessConfig; + + field ( features : instance ) PublishService; + + field ( numbering : managed ) RapBoUUID; + + internal create; + update; + delete; + + draft action ( features : instance ) Edit; + draft action Activate; + draft action Discard; + draft action Resume; + draft determine action Prepare + { + determination ( always ) createJSONString; + validation ( always ) mandatory_fields_check; + validation ( always ) Node~mandatory_fields_check; + validation ( always ) is_customizing_table; + validation ( always ) check_for_allowed_combinations; + } + + + determine action check_allowed_combinations_det + { + validation ( always ) check_for_allowed_combinations; + } + + static action createProjectAndRootNode parameter ZDMO_I_RAP_GEN_PARAM_NEW_PROJ result [1] $self; + action ( features : instance ) copyProject parameter ZDMO_I_RAP_GEN_PARAM_COPY_PROJ result [1] $self; + action ( features : instance ) generateProject result [1] $self; + action ( features : instance ) deleteProject result [1] $self; + + determination createJsonString on save { create; } + + determination CalculateBoName on save { create; } + determination SetRepositoryObjectNames on modify { field Suffix, Prefix, AddIViewBasic, PublishService, AddSAPObjectType; } + + side effects + { + field Suffix affects field * , entity _Node ; + field Prefix affects field * , entity _Node; + field AddIViewBasic affects field * , entity _Node; + field PublishService affects field * , entity _Node; + field AddSAPObjectType affects field * , entity _Node; + } + + validation generated_objects_are_deleted on save { delete; } + validation mandatory_fields_check on save { create; } + validation is_customizing_table on save { create; } + validation check_for_allowed_combinations on save { create; } + + association _Log { create; with draft; } + association _Node { create; with draft; } + mapping for zdmo_rapgen_bo + { + RapBoUUID = RAP_NODE_UUID; + BoName = BO_NAME; + RootEntityName = ROOT_ENTITY_NAME; + Namespace = NAMESPACE; + PackageName = PACKAGE_NAME; + TransportRequest = TRANSPORT_REQUEST; + SkipActivation = SKIP_ACTIVATION; + AddIViewBasic = add_i_view_basic; + ImplementationType = IMPLEMENTATION_TYPE; + AbapLanguageVersion = ABAP_LANGUAGE_VERSION; + PackageLanguageVersion = PACKAGE_LANGUAGE_VERSION; + DataSourceType = DATA_SOURCE_TYPE; + BindingType = BINDING_TYPE; + DraftEnabled = DRAFT_ENABLED; + Suffix = SUFFIX; + Prefix = PREFIX; + MultiInlineEdit = MULTI_INLINE_EDIT; + CustomizingTable = CUSTOMIZING_TABLE; + PublishService = PUBLISH_SERVICE; + AddToManageBusinessConfig = ADD_TO_MANAGE_BUSINESS_CONFIG; + BusinessConfName = BUSINESS_CONF_NAME; + BusinessConfIdentifier = BUSINESS_CONF_IDENTIFIER; + BusinessConfDescription = BUSINESS_CONF_DESCRIPTION; + CreatedAt = CREATED_AT; + CreatedBy = CREATED_BY; + LastChangedBy = LAST_CHANGED_BY; + LastChangedAt = LAST_CHANGED_AT; + LocalLastChangedAt = LOCAL_LAST_CHANGED_AT; + JsonString = JSON_STRING; + JsonIsValid = JSON_IS_VALID; + BoIsGenerated = BO_IS_GENERATED; + BoIsDeleted = BO_IS_DELETED; + ApplJobLogHandle = APPL_JOB_LOG_HANDLE; + JobCount = JOB_COUNT; + JobName = JOB_NAME; + ADTLink = ADT_LINK; + hasSematicKey = has_semantic_key; + isExtensible = is_extensible; + extensibilityElementSuffix = extensibility_element_suffix; + JobStatus = job_status; + JobStatusCriticality = job_status_criticality; + JobStatusText = job_status_text; + SAPObjectType = sap_object_type; + } + + + + +} + +define behavior for ZDMO_R_RAPG_LogTP alias Log +//implementation in class ZDMO_BP_R_RAPG_Log unique +persistent table zdmo_rapgen_log +draft table zdmo_rapglog00d +etag master LocalLastChangedAt +lock dependent by _Project +authorization dependent by _Project + +{ + field ( readonly ) + LogUUID, + RapBoUUID, + // LogItemNumber, + LocalLastChangedAt; + + field ( numbering : managed ) + LogUUID; + + + update; + delete; + + association _Project { with draft; } + + determination CalculateLogItemNumber on save { create; } + mapping for zdmo_rapgen_log + { + LogUUID = LOG_UUID; + RapBoUUID = RAPBO_UUID; + LogItemNumber = LOG_ITEM_NUMBER; + DetailLevel = DETAIL_LEVEL; + Severity = SEVERITY; + Text = TEXT; + TimeStamp = TIME_STAMP; + LocalLastChangedAt = LOCAL_LAST_CHANGED_AT; + } + + +} + +define behavior for ZDMO_R_RAPG_NodeTP alias Node +//implementation in class ZDMO_BP_R_RAPG_Node unique +persistent table zdmo_rapgen_node +draft table zdmo_rapgnode00d +etag master LocalLastChangedAt +lock dependent by _Project +authorization dependent by _Project + +{ + field ( readonly ) + NodeUUID, + RapBoUUID, + EntityName, + ParentEntityName, + IsRootNode, + DataSource, + ParentDataSource, + // FieldNameUUID, + MdeView, + //Hierarchy information (to be adapted) + HierarchyDescendantCount, + HierarchyDistanceFromRoot, + HierarchyDrillState, + HierarchyPreorderRank, + //administrative field + LocalLastChangedAt; + + + field ( features : instance ) + FieldNameRootUUID, + FieldNameUUID, + FieldNameParentUUID, + ControlStructure, + DraftTableName, + CdsIViewBasic, + FieldNameTotalEtag, + FieldNameEtagMaster, + QueryImplementationClass, + ServiceBinding, + ServiceDefinition, + FieldNameLastChangedAt, + FieldNameLastChangedBy, + FieldNameCreatedAt, + FieldNameCreatedBy, + //fields for extensible RAP BO's + ExtensibilityElementSuffix, + DraftQueryView, + ExtensionInclude, + ExtensionIncludeView, + SAPObjectType, + SAPObjectNodeType + ; + + // ExtensionInclude; + + + + // field ( mandatory : create ) EntityName, DataSource ; + + // field ( readonly ) ParentEntityName; + + field ( mandatory ) FieldNameObjectID; + + field ( numbering : managed ) NodeUUID; + + + + update; + delete; + + // static action ( features : global ) createRootNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self; + // action ( features : instance ) addChildNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self; + action ( features : instance ) SetRepositoryObjectNames; + + + // static action createRootNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self; + internal action addChildNode parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODE result [1] $self; + action ( features : instance ) addChildDataSourceTable parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODEt; // "result [1] $self; + action ( features : instance ) addChildDataSourceCDSview parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODEc; // result [1] $self; + action ( features : instance ) addChildDataSourceAbsEntity parameter ZDMO_I_RAP_GEN_PARAM_ADD_NODEa; // result [1] $self; + + side effects + { + action addChildDataSourceTable affects entity _Project._Node; + action addChildDataSourceCDSview affects entity _Project._Node; + action addChildDataSourceAbsEntity affects entity _Project._Node; + } + + determination CalculateEntityName on save { create; } + determination SetRepositoryObjectNames_det on modify + { create; + field EntityName; + } + determination SetFieldNames on modify + { create; + field DataSource; + } + validation mandatory_fields_check on save { create; } + association _Project { with draft; } + association _Field { create; with draft; } + mapping for zdmo_rapgen_node + { + NodeUUID = NODE_UUID; + RapBoUUID = HEADER_UUID; + ParentUUID = PARENT_UUID; + RootUUID = ROOT_UUID; + NodeNumber = NODE_NUMBER; + IsRootNode = IS_ROOT_NODE; + EntityName = ENTITY_NAME; + ParentEntityName = PARENT_ENTITY_NAME; + DataSource = DATA_SOURCE; + ParentDataSource = PARENT_DATA_SOURCE; + ViewTypeValue = VIEW_TYPE_VALUE; + FieldNameObjectID = FIELD_NAME_OBJECT_ID; + FieldNameEtagMaster = FIELD_NAME_ETAG_MASTER; + FieldNameTotalEtag = FIELD_NAME_TOTAL_ETAG; + FieldNameUUID = FIELD_NAME_UUID; + FieldNameParentUUID = FIELD_NAME_PARENT_UUID; + FieldNameRootUUID = FIELD_NAME_ROOT_UUID; + FieldNameCreatedBy = FIELD_NAME_CREATED_BY; + FieldNameCreatedAt = FIELD_NAME_CREATED_AT; + FieldNameLastChangedBy = FIELD_NAME_LAST_CHANGED_BY; + FieldNameLastChangedAt = FIELD_NAME_LAST_CHANGED_AT; + FieldNameLocLastChangedAt = FIELD_NAME_LOC_LAST_CHANGED_AT; + CdsIView = CDS_I_VIEW; + CdsIViewBasic = cds_i_view_basic; + CdsRView = CDS_R_VIEW; + CdsPView = CDS_P_VIEW; + MdeView = MDE_VIEW; + BehaviorImplementationClass = BEHAVIOR_IMPLEMENTATION_CLASS; + ServiceDefinition = SERVICE_DEFINITION; + ServiceBinding = SERVICE_BINDING; + SAPObjectType = sap_object_type; + SAPObjectNodeType = sap_object_node_type; + ControlStructure = CONTROL_STRUCTURE; + QueryImplementationClass = QUERY_IMPLEMENTATION_CLASS; + DraftTableName = DRAFT_TABLE_NAME; + ExtensionInclude = extension_include; + ExtensionIncludeView = extension_include_view; + DraftQueryView = draft_query_view; + extensibilityElementSuffix = extensibility_element_suffix; + HierarchyDistanceFromRoot = HIERARCHY_DISTANCE_FROM_ROOT; + HierarchyDescendantCount = HIERARCHY_DESCENDANT_COUNT; + HierarchyDrillState = HIERARCHY_DRILL_STATE; + HierarchyPreorderRank = HIERARCHY_PREORDER_RANK; + LocalLastChangedAt = LOCAL_LAST_CHANGED_AT; + } + + + + + +} + +define behavior for ZDMO_R_RAPG_FieldTP alias Field +//implementation in class ZDMO_BP_R_RAPG_Field unique +persistent table zdmo_rapgen_flds +draft table zdmo_rapgfiel00d +etag master LocalLastChangedAt +lock dependent by _Project +authorization dependent by _Project + +{ + field ( readonly ) + FieldUUID, + NodeUUID, + RapboUUID, + DbtableField, + LocalLastChangedAt; + + field ( features : instance ) + IsKey; + + field ( numbering : managed ) + FieldUUID; + + + update; + delete; + + association _Node { with draft; } + association _Project { with draft; } + + determination CalculateDbtableField on save { create; } + mapping for zdmo_rapgen_flds + { + FieldUUID = FIELD_UUID; + NodeUUID = NODE_UUID; + RapboUUID = RAPBO_UUID; + IsKey = is_key; + DbtableField = DBTABLE_FIELD; + CdsViewField = CDS_VIEW_FIELD; + LocalLastChangedAt = LOCAL_LAST_CHANGED_AT; + } + + +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_projecttp.bdef.xml b/src/zdmo_r_rapg_projecttp.bdef.xml new file mode 100644 index 0000000..7a9e094 --- /dev/null +++ b/src/zdmo_r_rapg_projecttp.bdef.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_BDEF" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <BDEF> + <NAME>ZDMO_R_RAPG_PROJECTTP</NAME> + <TYPE>BDEF/BDO</TYPE> + <DESCRIPTION>Behavior for ZDMO_R_RAPG_ProjectTP</DESCRIPTION> + <DESCRIPTION_TEXT_LIMIT>60</DESCRIPTION_TEXT_LIMIT> + <LANGUAGE>EN</LANGUAGE> + <LINKS> + <item> + <HREF>./zdmo_r_rapg_projecttp/source/main/versions</HREF> + <REL>http://www.sap.com/adt/relations/versions</REL> + <TITLE>Historic versions</TITLE> + </item> + <item> + <HREF>./zdmo_r_rapg_projecttp/source/main</HREF> + <REL>http://www.sap.com/adt/relations/source</REL> + <TYPE>text/plain</TYPE> + <TITLE>Source Content</TITLE> + </item> + <item> + <HREF>./zdmo_r_rapg_projecttp/source/main</HREF> + <REL>http://www.sap.com/adt/relations/source</REL> + <TYPE>text/html</TYPE> + <TITLE>Source Content (HTML)</TITLE> + </item> + </LINKS> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION> + <SOURCE_URI>./zdmo_r_rapg_projecttp/source/main</SOURCE_URI> + <SOURCE_TYPE>ABAP_SOURCE</SOURCE_TYPE> + <SOURCE_FIXED_POINT_ARITHMETIC>true</SOURCE_FIXED_POINT_ARITHMETIC> + <SOURCE_UNICODE_CHECKS_ACTIVE>true</SOURCE_UNICODE_CHECKS_ACTIVE> + </BDEF> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_projecttp.ddls.asddls b/src/zdmo_r_rapg_projecttp.ddls.asddls new file mode 100644 index 0000000..7829ca4 --- /dev/null +++ b/src/zdmo_r_rapg_projecttp.ddls.asddls @@ -0,0 +1,65 @@ +@AccessControl.authorizationCheck: #NOT_REQUIRED +@Metadata.allowExtensions: true +@EndUserText.label: 'CDS View forProject' +define root view entity ZDMO_R_RAPG_ProjectTP + as select from zdmo_rapgen_bo + composition [0..*] of ZDMO_R_RAPG_LogTP as _Log + composition [0..*] of ZDMO_R_RAPG_NodeTP as _Node +{ + key rap_node_uuid as RapBoUUID, + bo_name as BoName, + root_entity_name as RootEntityName, + namespace as Namespace, + package_name as PackageName, + transport_request as TransportRequest, + skip_activation as SkipActivation, + add_i_view_basic as AddIViewBasic, + publish_service as PublishService, + implementation_type as ImplementationType, + abap_language_version as AbapLanguageVersion, + package_language_version as PackageLanguageVersion, + data_source_type as DataSourceType, + binding_type as BindingType, + draft_enabled as DraftEnabled, + suffix as Suffix, + prefix as Prefix, + multi_inline_edit as MultiInlineEdit, + customizing_table as CustomizingTable, + add_to_manage_business_config as AddToManageBusinessConfig, + business_conf_name as BusinessConfName, + business_conf_identifier as BusinessConfIdentifier, + business_conf_description as BusinessConfDescription, + @Semantics.systemDateTime.createdAt: true + created_at as CreatedAt, + @Semantics.user.createdBy: true + created_by as CreatedBy, + @Semantics.user.lastChangedBy: true + last_changed_by as LastChangedBy, + @Semantics.systemDateTime.lastChangedAt: true + last_changed_at as LastChangedAt, + @Semantics.systemDateTime.localInstanceLastChangedAt: true + local_last_changed_at as LocalLastChangedAt, + json_string as JsonString, + json_is_valid as JsonIsValid, + bo_is_generated as BoIsGenerated, + bo_is_deleted as BoIsDeleted, + appl_job_log_handle as ApplJobLogHandle, + job_count as JobCount, + job_name as JobName, + adt_link as ADTLink, + is_managed as isManaged, + is_extensible as isExtensible, + extensibility_element_suffix as extensibilityElementSuffix, + does_not_use_unmanaged_query as doesNotUseUnmanagedQuery, + has_semantic_key as hasSematicKey, + + job_status as JobStatus, + job_status_criticality as JobStatusCriticality, + job_status_text as JobStatusText, + + sap_object_type as SAPObjectType, + add_sap_object_type as AddSAPObjectType, + _Log, + _Node + +} diff --git a/src/zdmo_r_rapg_projecttp.ddls.baseinfo b/src/zdmo_r_rapg_projecttp.ddls.baseinfo new file mode 100644 index 0000000..417769d --- /dev/null +++ b/src/zdmo_r_rapg_projecttp.ddls.baseinfo @@ -0,0 +1,22 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_RAPGEN_BO" +], +"ASSOCIATED": +[ +"ZDMO_R_RAPG_LOGTP", +"ZDMO_R_RAPG_NODETP" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_projecttp.ddls.xml b/src/zdmo_r_rapg_projecttp.ddls.xml new file mode 100644 index 0000000..f33a6a0 --- /dev/null +++ b/src/zdmo_r_rapg_projecttp.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_R_RAPG_PROJECTTP</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>CDS View for Project</DDTEXT> + <SOURCE_TYPE>W</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_r_rapg_projecttpdraft.ddls.asddls b/src/zdmo_r_rapg_projecttpdraft.ddls.asddls new file mode 100644 index 0000000..5a476a7 --- /dev/null +++ b/src/zdmo_r_rapg_projecttpdraft.ddls.asddls @@ -0,0 +1,59 @@ +@AbapCatalog.viewEnhancementCategory: [#NONE] +@AccessControl.authorizationCheck: #NOT_REQUIRED +@EndUserText.label: 'CDS view for draft entries' +@Metadata.ignorePropagatedAnnotations: true +@ObjectModel.usageType:{ + serviceQuality: #X, + sizeCategory: #S, + dataClass: #MIXED +} +define view entity ZDMO_R_RAPG_ProjectTPDraft + as select from zdmo_rapgproj00d +{ + key rapbouuid as Rapbouuid, + boname as Boname, + rootentityname as Rootentityname, + namespace as Namespace, + packagename as Packagename, + transportrequest as Transportrequest, + skipactivation as Skipactivation, + implementationtype as Implementationtype, + abaplanguageversion as Abaplanguageversion, + packagelanguageversion as Packagelanguageversion, + datasourcetype as Datasourcetype, + bindingtype as Bindingtype, + draftenabled as Draftenabled, + suffix as Suffix, + prefix as Prefix, + multiinlineedit as Multiinlineedit, + customizingtable as Customizingtable, + addtomanagebusinessconfig as Addtomanagebusinessconfig, + businessconfname as Businessconfname, + businessconfidentifier as Businessconfidentifier, + businessconfdescription as Businessconfdescription, + createdat as Createdat, + createdby as Createdby, + lastchangedby as Lastchangedby, + lastchangedat as Lastchangedat, + locallastchangedat as Locallastchangedat, + jsonstring as Jsonstring, + jsonisvalid as Jsonisvalid, + boisgenerated as Boisgenerated, + boisdeleted as Boisdeleted, + appljobloghandle as Appljobloghandle, + jobcount as Jobcount, + jobname as Jobname, + adtlink as Adtlink, + ismanaged as Ismanaged, + doesnotuseunmanagedquery as Doesnotuseunmanagedquery, + hassematickey as Hassematickey, + draftentitycreationdatetime as Draftentitycreationdatetime, + draftentitylastchangedatetime as Draftentitylastchangedatetime, + draftadministrativedatauuid as Draftadministrativedatauuid, + draftentityoperationcode as Draftentityoperationcode, + hasactiveentity as Hasactiveentity, + draftfieldchanges as Draftfieldchanges +} +where + draftentityoperationcode <> 'D' // IF_DRAFT_CONSTANTS=>co_operation_code-deleted + and draftentityoperationcode <> 'L' // IF_DRAFT_CONSTANTS=>co_operation_code-redeleted diff --git a/src/zdmo_r_rapg_projecttpdraft.ddls.baseinfo b/src/zdmo_r_rapg_projecttpdraft.ddls.baseinfo new file mode 100644 index 0000000..6ee3cc2 --- /dev/null +++ b/src/zdmo_r_rapg_projecttpdraft.ddls.baseinfo @@ -0,0 +1,19 @@ +{ +"BASEINFO": +{ +"FROM": +[ +"ZDMO_RAPGPROJ00D" +], +"ASSOCIATED": +[], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_r_rapg_projecttpdraft.ddls.xml b/src/zdmo_r_rapg_projecttpdraft.ddls.xml new file mode 100644 index 0000000..7ae089a --- /dev/null +++ b/src/zdmo_r_rapg_projecttpdraft.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_R_RAPG_PROJECTTPDRAFT</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>CDS view for draft entries</DDTEXT> + <SOURCE_TYPE>W</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_abaplangversion.doma.xml b/src/zdmo_rap_gen_abaplangversion.doma.xml new file mode 100644 index 0000000..8b07529 --- /dev/null +++ b/src/zdmo_rap_gen_abaplangversion.doma.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD01V> + <DOMNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</DOMNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <OUTPUTLEN>000030</OUTPUTLEN> + <LOWERCASE>X</LOWERCASE> + <DDTEXT>ABAP Language Version</DDTEXT> + <DOMMASTER>E</DOMMASTER> + </DD01V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_abaplangversion.dtel.xml b/src/zdmo_rap_gen_abaplangversion.dtel.xml new file mode 100644 index 0000000..6b2251b --- /dev/null +++ b/src/zdmo_rap_gen_abaplangversion.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>ABAP Language Version</DDTEXT> + <REPTEXT>ABAP Language Version</REPTEXT> + <SCRTEXT_S>ABAP Vers.</SCRTEXT_S> + <SCRTEXT_M>ABAP Language Vers.</SCRTEXT_M> + <SCRTEXT_L>ABAP Language Version</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_cds_view_field.doma.xml b/src/zdmo_rap_gen_cds_view_field.doma.xml new file mode 100644 index 0000000..cd2aacc --- /dev/null +++ b/src/zdmo_rap_gen_cds_view_field.doma.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD01V> + <DOMNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</DOMNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <OUTPUTLEN>000030</OUTPUTLEN> + <LOWERCASE>X</LOWERCASE> + <DDTEXT>Entity Name</DDTEXT> + <DOMMASTER>E</DOMMASTER> + </DD01V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_cds_view_field.dtel.xml b/src/zdmo_rap_gen_cds_view_field.dtel.xml new file mode 100644 index 0000000..2d7310a --- /dev/null +++ b/src/zdmo_rap_gen_cds_view_field.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>CDS view field name</DDTEXT> + <REPTEXT>CDS view field name</REPTEXT> + <SCRTEXT_S>CDS field</SCRTEXT_S> + <SCRTEXT_M>CDS view field</SCRTEXT_M> + <SCRTEXT_L>CDS view field name</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_draft_enabled.dtel.xml b/src/zdmo_rap_gen_draft_enabled.dtel.xml new file mode 100644 index 0000000..c1bba05 --- /dev/null +++ b/src/zdmo_rap_gen_draft_enabled.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_DRAFT_ENABLED</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ABAP_BOOLEAN</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Draft enabled</DDTEXT> + <REPTEXT>Draft enabled</REPTEXT> + <SCRTEXT_S>Draft</SCRTEXT_S> + <SCRTEXT_M>Draft enabled</SCRTEXT_M> + <SCRTEXT_L>Draft enabled</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_entityname.doma.xml b/src/zdmo_rap_gen_entityname.doma.xml new file mode 100644 index 0000000..e34755c --- /dev/null +++ b/src/zdmo_rap_gen_entityname.doma.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD01V> + <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DATATYPE>CHAR</DATATYPE> + <LENG>000040</LENG> + <OUTPUTLEN>000040</OUTPUTLEN> + <LOWERCASE>X</LOWERCASE> + <DDTEXT>Entity Name</DDTEXT> + <DOMMASTER>E</DOMMASTER> + </DD01V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_entityname.dtel.xml b/src/zdmo_rap_gen_entityname.dtel.xml new file mode 100644 index 0000000..541f669 --- /dev/null +++ b/src/zdmo_rap_gen_entityname.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Entity Name</DDTEXT> + <REPTEXT>Entity Name</REPTEXT> + <SCRTEXT_S>EntityName</SCRTEXT_S> + <SCRTEXT_M>Entity Name</SCRTEXT_M> + <SCRTEXT_L>Entity Name</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_namespace.doma.xml b/src/zdmo_rap_gen_namespace.doma.xml new file mode 100644 index 0000000..5818de4 --- /dev/null +++ b/src/zdmo_rap_gen_namespace.doma.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD01V> + <DOMNAME>ZDMO_RAP_GEN_NAMESPACE</DOMNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DATATYPE>CHAR</DATATYPE> + <LENG>000010</LENG> + <OUTPUTLEN>000010</OUTPUTLEN> + <DDTEXT>Namespace</DDTEXT> + <DOMMASTER>E</DOMMASTER> + </DD01V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_namespace.dtel.xml b/src/zdmo_rap_gen_namespace.dtel.xml new file mode 100644 index 0000000..872633a --- /dev/null +++ b/src/zdmo_rap_gen_namespace.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_NAMESPACE</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_RAP_GEN_NAMESPACE</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Namespace</DDTEXT> + <REPTEXT>Namespace</REPTEXT> + <SCRTEXT_S>Namespace</SCRTEXT_S> + <SCRTEXT_M>Namespace</SCRTEXT_M> + <SCRTEXT_L>Namespace</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_parent_entityname.dtel.xml b/src/zdmo_rap_gen_parent_entityname.dtel.xml new file mode 100644 index 0000000..edb8674 --- /dev/null +++ b/src/zdmo_rap_gen_parent_entityname.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_PARENT_ENTITYNAME</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Entity Name</DDTEXT> + <REPTEXT>Parent Entity Name</REPTEXT> + <SCRTEXT_S>Parent Ent</SCRTEXT_S> + <SCRTEXT_M>Parent Entity Name</SCRTEXT_M> + <SCRTEXT_L>Parent Entity Name</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rap_gen_root_entityname.dtel.xml b/src/zdmo_rap_gen_root_entityname.dtel.xml new file mode 100644 index 0000000..7914fc6 --- /dev/null +++ b/src/zdmo_rap_gen_root_entityname.dtel.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD04V> + <ROLLNAME>ZDMO_RAP_GEN_ROOT_ENTITYNAME</ROLLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DOMNAME>ZDMO_RAP_GEN_ENTITYNAME</DOMNAME> + <HEADLEN>55</HEADLEN> + <SCRLEN1>10</SCRLEN1> + <SCRLEN2>20</SCRLEN2> + <SCRLEN3>40</SCRLEN3> + <DDTEXT>Entity Name</DDTEXT> + <REPTEXT>Root Entity Name</REPTEXT> + <SCRTEXT_S>Root Ent.</SCRTEXT_S> + <SCRTEXT_M>Root Entity Name</SCRTEXT_M> + <SCRTEXT_L>Root Entity Name</SCRTEXT_L> + <DTELMASTER>E</DTELMASTER> + <REFKIND>D</REFKIND> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + </DD04V> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapg_project01.srvd.srvdsrv b/src/zdmo_rapg_project01.srvd.srvdsrv new file mode 100644 index 0000000..4a37838 --- /dev/null +++ b/src/zdmo_rapg_project01.srvd.srvdsrv @@ -0,0 +1,18 @@ +@ObjectModel.leadingEntity.name: 'ZDMO_C_RAPG_ProjectTP' +define service ZDMO_RAPG_Project01 { + expose ZDMO_C_RAPG_ProjectTP as Project; + expose ZDMO_C_RAPG_LogTP as Log; + expose ZDMO_C_RAPG_NodeTP as Node; + expose ZDMO_C_RAPG_FieldTP as Field; + expose ZDMO_I_RAP_GENERATOR_DSRC_TYPE as DataSourceTypes; + expose ZDMO_I_RAP_GENERATOR_BIND_TYPE as BindingTypes; + expose ZDMO_I_RAP_GENERATOR_ABAP_VERS as ABAPLanguageVersions; + expose ZDMO_I_RAP_GENERATOR_PACKAGE as Packages; + expose ZDMO_I_RAP_GENERATOR_FIELDS as DataSourceFields; + expose zdmo_I_rap_generator_bool_VH as DraftEnabled; + expose ZDMO_I_RAP_GENERATOR_DATA_SRC2 as DataSources2; + expose ZDMO_I_RAP_GENERATOR_IMPL_TYP2 as ImplementationTypes2; + expose ZDMO_I_RAP_GEN_GET_ABSTRCT_ENT as AbstractEntities; + expose ZDMO_I_RAP_GEN_GET_CDS_VIEWS as CDSViews; + expose ZDMO_I_RAP_GEN_GET_TABLES as Tables; +} \ No newline at end of file diff --git a/src/zdmo_rapg_project01.srvd.xml b/src/zdmo_rapg_project01.srvd.xml new file mode 100644 index 0000000..4722088 --- /dev/null +++ b/src/zdmo_rapg_project01.srvd.xml @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_SRVD" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <SRVD> + <NAME>ZDMO_RAPG_PROJECT01</NAME> + <TYPE>SRVD/SRV</TYPE> + <DESCRIPTION>Service definition for Project</DESCRIPTION> + <LANGUAGE>EN</LANGUAGE> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + <SOURCE_URI>./zdmo_rapg_project01/source/main</SOURCE_URI> + <SOURCE_TYPE>ABAP_SOURCE</SOURCE_TYPE> + <SOURCE_ORIGIN_DESCRIPTION>ABAP Development Tools</SOURCE_ORIGIN_DESCRIPTION> + <SRVD_SOURCE_TYPE>S</SRVD_SOURCE_TYPE> + <SRVD_SOURCE_TYPE_DESC>Definition</SRVD_SOURCE_TYPE_DESC> + </SRVD> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgen_bo.tabl.xml b/src/zdmo_rapgen_bo.tabl.xml new file mode 100644 index 0000000..ec800b9 --- /dev/null +++ b/src/zdmo_rapgen_bo.tabl.xml @@ -0,0 +1,398 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGEN_BO</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>RAP Generator Business Object Header</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGEN_BO</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>RAP_NODE_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BO_NAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ROOT_ENTITY_NAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ROOT_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NAMESPACE</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_NAMESPACE</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PACKAGE_NAME</FIELDNAME> + <ROLLNAME>SXCO_PACKAGE</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>TRANSPORT_REQUEST</FIELDNAME> + <ROLLNAME>SXCO_TRANSPORT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SKIP_ACTIVATION</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PUBLISH_SERVICE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ADD_I_VIEW_BASIC</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>IMPLEMENTATION_TYPE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ABAP_LANGUAGE_VERSION</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PACKAGE_LANGUAGE_VERSION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DATA_SOURCE_TYPE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>BINDING_TYPE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DRAFT_ENABLED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SUFFIX</FIELDNAME> + <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PREFIX</FIELDNAME> + <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>MULTI_INLINE_EDIT</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CUSTOMIZING_TABLE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>IS_EXTENSIBLE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSIBILITY_ELEMENT_SUFFIX</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000003</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ADD_TO_MANAGE_BUSINESS_CONFIG</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BUSINESS_CONF_NAME</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000100</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000050</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>BUSINESS_CONF_IDENTIFIER</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000040</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000020</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>BUSINESS_CONF_DESCRIPTION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000100</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000050</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>CREATED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CREATED_BY</FIELDNAME> + <ROLLNAME>SYUNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LAST_CHANGED_BY</FIELDNAME> + <ROLLNAME>SYUNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>JSON_STRING</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>g</INTTYPE> + <INTLEN>000008</INTLEN> + <DATATYPE>STRG</DATATYPE> + <MASK> STRG</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JSON_IS_VALID</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BO_IS_GENERATED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BO_IS_DELETED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>APPL_JOB_LOG_HANDLE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000064</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000032</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOB_COUNT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000016</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000008</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOB_NAME</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000064</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000032</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ADT_LINK</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000510</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000255</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HAS_SEMANTIC_KEY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>IS_MANAGED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DOES_NOT_USE_UNMANAGED_QUERY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>JOB_STATUS</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOB_STATUS_TEXT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000040</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000020</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOB_STATUS_CRITICALITY</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000001</INTLEN> + <DATATYPE>INT1</DATATYPE> + <LENG>000003</LENG> + <MASK> INT1</MASK> + </DD03P> + <DD03P> + <FIELDNAME>SAP_OBJECT_TYPE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ADD_SAP_OBJECT_TYPE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGEN_BO</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgen_flds.tabl.xml b/src/zdmo_rapgen_flds.tabl.xml new file mode 100644 index 0000000..efa36d5 --- /dev/null +++ b/src/zdmo_rapgen_flds.tabl.xml @@ -0,0 +1,91 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGEN_FLDS</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>Fields of a rap bo node</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGEN_FLDS</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NODE_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>RAPBO_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>IS_KEY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DBTABLE_FIELD</FIELDNAME> + <ROLLNAME>SXCO_AD_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDS_VIEW_FIELD</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGEN_FLDS</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgen_log.tabl.xml b/src/zdmo_rapgen_log.tabl.xml new file mode 100644 index 0000000..c064fc8 --- /dev/null +++ b/src/zdmo_rapgen_log.tabl.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGEN_LOG</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>RAP Generator Business Object Nodes</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGEN_LOG</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>LOG_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>RAPBO_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOG_ITEM_NUMBER</FIELDNAME> + <ROLLNAME>BALMNR</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DETAIL_LEVEL</FIELDNAME> + <ROLLNAME>BALLEVEL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SEVERITY</FIELDNAME> + <ROLLNAME>SYMSGTY</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>TEXT</FIELDNAME> + <ROLLNAME>BAPI_MSG</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>TIME_STAMP</FIELDNAME> + <ROLLNAME>TIMESTAMP</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGEN_LOG</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgen_node.tabl.xml b/src/zdmo_rapgen_node.tabl.xml new file mode 100644 index 0000000..cfbed43 --- /dev/null +++ b/src/zdmo_rapgen_node.tabl.xml @@ -0,0 +1,339 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGEN_NODE</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>RAP Generator Business Object Nodes</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGEN_NODE</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>NODE_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>HEADER_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PARENT_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ROOT_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NODE_NUMBER</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000001</INTLEN> + <DATATYPE>INT1</DATATYPE> + <LENG>000003</LENG> + <MASK> INT1</MASK> + </DD03P> + <DD03P> + <FIELDNAME>IS_ROOT_NODE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ENTITY_NAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PARENT_ENTITY_NAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_PARENT_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DATA_SOURCE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>PARENT_DATA_SOURCE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>VIEW_TYPE_VALUE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_OBJECT_ID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_ETAG_MASTER</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_TOTAL_ETAG</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_UUID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_PARENT_UUID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_ROOT_UUID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_CREATED_BY</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_CREATED_AT</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_LAST_CHANGED_BY</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELD_NAME_LOC_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDS_I_VIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDS_I_VIEW_BASIC</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDS_R_VIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDS_P_VIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>MDE_VIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BEHAVIOR_IMPLEMENTATION_CLASS</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SERVICE_DEFINITION</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SERVICE_BINDING</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CONTROL_STRUCTURE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>QUERY_IMPLEMENTATION_CLASS</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DRAFT_TABLE_NAME</FIELDNAME> + <ROLLNAME>SXCO_DBT_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSION_INCLUDE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSION_INCLUDE_VIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DRAFT_QUERY_VIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHY_DISTANCE_FROM_ROOT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000004</INTLEN> + <DATATYPE>INT4</DATATYPE> + <LENG>000010</LENG> + <MASK> INT4</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHY_DESCENDANT_COUNT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000004</INTLEN> + <DATATYPE>INT4</DATATYPE> + <LENG>000010</LENG> + <MASK> INT4</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHY_DRILL_STATE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>g</INTTYPE> + <INTLEN>000008</INTLEN> + <DATATYPE>SSTR</DATATYPE> + <LENG>000020</LENG> + <MASK> SSTR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHY_PREORDER_RANK</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000004</INTLEN> + <DATATYPE>INT4</DATATYPE> + <LENG>000010</LENG> + <MASK> INT4</MASK> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSIBILITY_ELEMENT_SUFFIX</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000003</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>SAP_OBJECT_NODE_TYPE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SAP_OBJECT_TYPE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGEN_NODE</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgfiel00d.tabl.xml b/src/zdmo_rapgfiel00d.tabl.xml new file mode 100644 index 0000000..e07039f --- /dev/null +++ b/src/zdmo_rapgfiel00d.tabl.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGFIEL00D</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <LANGDEP>X</LANGDEP> + <DDTEXT> Draft table for entity ZDMO_R_RAPG_FieldTP</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>4</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGFIEL00D</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>MANDT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDUUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NODEUUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>RAPBOUUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ISKEY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DBTABLEFIELD</FIELDNAME> + <ROLLNAME>SXCO_AD_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDSVIEWFIELD</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_CDS_VIEW_FIELD</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>.INCLUDE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD> + <MASK> S</MASK> + <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT> + <COMPTYPE>S</COMPTYPE> + <GROUPNAME>%ADMIN</GROUPNAME> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGFIEL00D</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapglog00d.tabl.xml b/src/zdmo_rapglog00d.tabl.xml new file mode 100644 index 0000000..600a6bf --- /dev/null +++ b/src/zdmo_rapglog00d.tabl.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGLOG00D</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <LANGDEP>X</LANGDEP> + <DDTEXT>Draft table for entity ZDMO_R_RAPG_LOGTP</DDTEXT> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>4</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGLOG00D</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>4</TABKAT> + <TABART>APPL1</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>MANDT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>MANDT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOGUUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>RAPBOUUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOGITEMNUMBER</FIELDNAME> + <ROLLNAME>BALMNR</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DETAILLEVEL</FIELDNAME> + <ROLLNAME>BALLEVEL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SEVERITY</FIELDNAME> + <ROLLNAME>SYMSGTY</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CRITICALITY</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000001</INTLEN> + <DATATYPE>INT1</DATATYPE> + <LENG>000003</LENG> + <MASK> INT1</MASK> + </DD03P> + <DD03P> + <FIELDNAME>TEXT</FIELDNAME> + <ROLLNAME>BAPI_MSG</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>TIMESTAMP</FIELDNAME> + <ROLLNAME>TIMESTAMP</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>.INCLUDE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD> + <MASK> S</MASK> + <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT> + <COMPTYPE>S</COMPTYPE> + <GROUPNAME>%ADMIN</GROUPNAME> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGLOG00D</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgnode00d.tabl.xml b/src/zdmo_rapgnode00d.tabl.xml new file mode 100644 index 0000000..323fad0 --- /dev/null +++ b/src/zdmo_rapgnode00d.tabl.xml @@ -0,0 +1,377 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGNODE00D</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <LANGDEP>X</LANGDEP> + <DDTEXT>Draft table for entity ZDMO_R_RAPG_NODETP</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>4</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGNODE00D</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>4</TABKAT> + <TABART>APPL1</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>MANDT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>MANDT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NODEUUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>RAPBOUUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PARENTUUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ROOTUUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NODENUMBER</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000001</INTLEN> + <DATATYPE>INT1</DATATYPE> + <LENG>000003</LENG> + <MASK> INT1</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ISROOTNODE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ENTITYNAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PARENTENTITYNAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_PARENT_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DATASOURCE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>PARENTDATASOURCE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>VIEWTYPEVALUE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMEOBJECTID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMEETAGMASTER</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMETOTALETAG</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMEUUID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMEPARENTUUID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMEROOTUUID</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMECREATEDBY</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMECREATEDAT</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMELASTCHANGEDBY</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMELASTCHANGEDAT</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>FIELDNAMELOCLASTCHANGEDAT</FIELDNAME> + <ROLLNAME>SXCO_AD_FIELD_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDSIVIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDSIVIEWBASIC</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDSRVIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CDSPVIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>MDEVIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BEHAVIORIMPLEMENTATIONCLASS</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SERVICEDEFINITION</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SERVICEBINDING</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CONTROLSTRUCTURE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>QUERYIMPLEMENTATIONCLASS</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DRAFTTABLENAME</FIELDNAME> + <ROLLNAME>SXCO_DBT_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSIONINCLUDE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSIONINCLUDEVIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>DRAFTQUERYVIEW</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHYDISTANCEFROMROOT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000004</INTLEN> + <DATATYPE>INT4</DATATYPE> + <LENG>000010</LENG> + <MASK> INT4</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHYDESCENDANTCOUNT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000004</INTLEN> + <DATATYPE>INT4</DATATYPE> + <LENG>000010</LENG> + <MASK> INT4</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHYDRILLSTATE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>g</INTTYPE> + <INTLEN>000008</INTLEN> + <DATATYPE>SSTR</DATATYPE> + <LENG>000020</LENG> + <MASK> SSTR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HIERARCHYPREORDERRANK</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000004</INTLEN> + <DATATYPE>INT4</DATATYPE> + <LENG>000010</LENG> + <MASK> INT4</MASK> + </DD03P> + <DD03P> + <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSIBILITYELEMENTSUFFIX</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000003</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>SAPOBJECTNODETYPE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SAPOBJECTTYPE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ISCHILDNODE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ISTABLE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ISCDSVIEW</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ISABSTRACTENTITY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>.INCLUDE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD> + <MASK> S</MASK> + <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT> + <COMPTYPE>S</COMPTYPE> + <GROUPNAME>%ADMIN</GROUPNAME> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGNODE00D</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_rapgproj00d.tabl.xml b/src/zdmo_rapgproj00d.tabl.xml new file mode 100644 index 0000000..4e3eb5d --- /dev/null +++ b/src/zdmo_rapgproj00d.tabl.xml @@ -0,0 +1,405 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_RAPGPROJ00D</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <LANGDEP>X</LANGDEP> + <DDTEXT>Draft table for entity ZDMO_R_RAPG_PROJECTTP</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>4</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_RAPGPROJ00D</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>4</TABKAT> + <TABART>APPL1</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>MANDT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>MANDT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>RAPBOUUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BONAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ROOTENTITYNAME</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ROOT_ENTITYNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>NAMESPACE</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_NAMESPACE</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PACKAGENAME</FIELDNAME> + <ROLLNAME>SXCO_PACKAGE</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>TRANSPORTREQUEST</FIELDNAME> + <ROLLNAME>SXCO_TRANSPORT</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SKIPACTIVATION</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ADDIVIEWBASIC</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PUBLISHSERVICE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>IMPLEMENTATIONTYPE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ABAPLANGUAGEVERSION</FIELDNAME> + <ROLLNAME>ZDMO_RAP_GEN_ABAPLANGVERSION</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PACKAGELANGUAGEVERSION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DATASOURCETYPE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>BINDINGTYPE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000060</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000030</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DRAFTENABLED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SUFFIX</FIELDNAME> + <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PREFIX</FIELDNAME> + <ROLLNAME>SXCO_AR_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>MULTIINLINEEDIT</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CUSTOMIZINGTABLE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ADDTOMANAGEBUSINESSCONFIG</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BUSINESSCONFNAME</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000100</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000050</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>BUSINESSCONFIDENTIFIER</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000040</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000020</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>BUSINESSCONFDESCRIPTION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000100</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000050</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>CREATEDAT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CREATEDBY</FIELDNAME> + <ROLLNAME>SYUNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LASTCHANGEDBY</FIELDNAME> + <ROLLNAME>SYUNAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LASTCHANGEDAT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCALLASTCHANGEDAT</FIELDNAME> + <ROLLNAME>TIMESTAMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>JSONSTRING</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>g</INTTYPE> + <INTLEN>000008</INTLEN> + <DATATYPE>STRG</DATATYPE> + <MASK> STRG</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JSONISVALID</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BOISGENERATED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>BOISDELETED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>APPLJOBLOGHANDLE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000064</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000032</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOBCOUNT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000016</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000008</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOBNAME</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000064</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000032</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ADTLINK</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000510</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000255</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ISMANAGED</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ISEXTENSIBLE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>EXTENSIBILITYELEMENTSUFFIX</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000003</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DOESNOTUSEUNMANAGEDQUERY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>HASSEMATICKEY</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>JOBSTATUS</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOBSTATUSCRITICALITY</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>X</INTTYPE> + <INTLEN>000001</INTLEN> + <DATATYPE>INT1</DATATYPE> + <LENG>000003</LENG> + <MASK> INT1</MASK> + </DD03P> + <DD03P> + <FIELDNAME>JOBSTATUSTEXT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000040</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000020</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>SAPOBJECTTYPE</FIELDNAME> + <ROLLNAME>SXCO_CDS_OBJECT_NAME</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ADDSAPOBJECTTYPE</FIELDNAME> + <ROLLNAME>ABAP_BOOLEAN</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <VALEXI>X</VALEXI> + <SHLPORIGIN>F</SHLPORIGIN> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>.INCLUDE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <PRECFIELD>SYCH_BDL_DRAFT_ADMIN_INC</PRECFIELD> + <MASK> S</MASK> + <DDTEXT>Standard Include for Draft Administration (BDL Syntax Check)</DDTEXT> + <COMPTYPE>S</COMPTYPE> + <GROUPNAME>%ADMIN</GROUPNAME> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_RAPGPROJ00D</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_test.tabl.xml b/src/zdmo_test.tabl.xml new file mode 100644 index 0000000..fc05a53 --- /dev/null +++ b/src/zdmo_test.tabl.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_TEST</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>test</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_TEST</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>TEST</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000050</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000025</LENG> + <MASK> CHAR</MASK> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_TEST</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_test_abstract_childentity.ddls.asddls b/src/zdmo_test_abstract_childentity.ddls.asddls new file mode 100644 index 0000000..c211fff --- /dev/null +++ b/src/zdmo_test_abstract_childentity.ddls.asddls @@ -0,0 +1,44 @@ +@EndUserText.label: 'Test entity - abstract - child' +@OData.entitySet.name: 'SalesOrderLineItemSet' +@OData.entityType.name: 'SalesOrderLineItem' +define abstract entity ZDMO_TEST_ABSTRACT_CHILDENTITY +{ + key SalesOrderID : abap.char( 10 ); + key ItemPosition : abap.char( 10 ); + ProductID : abap.char( 10 ); + @OData.property.valueControl: 'Note_vc' + Note : abap.char( 255 ); + Note_vc : rap_cp_odata_value_control; + @OData.property.valueControl: 'NoteLanguage_vc' + NoteLanguage : abap.char( 2 ); + NoteLanguage_vc : rap_cp_odata_value_control; + @OData.property.valueControl: 'CurrencyCode_vc' + @Semantics.currencyCode: true + CurrencyCode : abap.cuky( 5 ); + CurrencyCode_vc : rap_cp_odata_value_control; + @OData.property.valueControl: 'GrossAmount_vc' + @Semantics.amount.currencyCode: 'CurrencyCode' + GrossAmount : abap.curr( 16, 2 ); + GrossAmount_vc : rap_cp_odata_value_control; + @OData.property.valueControl: 'NetAmount_vc' + @Semantics.amount.currencyCode: 'CurrencyCode' + NetAmount : abap.curr( 16, 2 ); + NetAmount_vc : rap_cp_odata_value_control; + @OData.property.valueControl: 'TaxAmount_vc' + @Semantics.amount.currencyCode: 'CurrencyCode' + TaxAmount : abap.curr( 16, 2 ); + TaxAmount_vc : rap_cp_odata_value_control; + DeliveryDate : rap_cp_odata_v2_edm_datetime; + @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + Quantity : abap.dec( 13, 2 ); + @OData.property.valueControl: 'QuantityUnit_vc' + @Semantics.unitOfMeasure: true + QuantityUnit : abap.unit( 3 ); + QuantityUnit_vc : rap_cp_odata_value_control; + + @OData.property.name: 'ToHeader' + //A dummy on-condition is required for associations in abstract entities + //On-condition is not relevant for runtime + _ToHeader : association [1] to ZDMO_TEST_ABSTRACT_ROOT_ENTITY on 1 = 1; + +} diff --git a/src/zdmo_test_abstract_childentity.ddls.baseinfo b/src/zdmo_test_abstract_childentity.ddls.baseinfo new file mode 100644 index 0000000..9b23289 --- /dev/null +++ b/src/zdmo_test_abstract_childentity.ddls.baseinfo @@ -0,0 +1,19 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[ +"ZDMO_TEST_ABSTRACT_ROOT_ENTITY" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_test_abstract_childentity.ddls.xml b/src/zdmo_test_abstract_childentity.ddls.xml new file mode 100644 index 0000000..cd7ba49 --- /dev/null +++ b/src/zdmo_test_abstract_childentity.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_TEST_ABSTRACT_CHILDENTITY</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Test entity - abstract - child</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_test_abstract_grandchilde.ddls.asddls b/src/zdmo_test_abstract_grandchilde.ddls.asddls new file mode 100644 index 0000000..e6913a3 --- /dev/null +++ b/src/zdmo_test_abstract_grandchilde.ddls.asddls @@ -0,0 +1,22 @@ +@EndUserText.label: 'Test entity - abstract - child' +@OData.entitySet.name: 'ScheduleLineItemSet' +@OData.entityType.name: 'ScheduleLineItem' +define abstract entity ZDMO_TEST_ABSTRACT_GRANDCHILDE +{ + key SalesOrderID : abap.char( 10 ); + key ItemPosition : abap.char( 10 ); + key ScheduleLine : abap.numc( 4 ); + + DeliveryDate : rap_cp_odata_v2_edm_datetime; + @Semantics.quantity.unitOfMeasure: 'QuantityUnit' + Quantity : abap.dec( 13, 2 ); + @Semantics.unitOfMeasure: true + QuantityUnit : abap.unit( 3 ); + + + @OData.property.name: 'ToHeader' + //A dummy on-condition is required for associations in abstract entities + //On-condition is not relevant for runtime + _ToItem : association [1] to ZDMO_TEST_ABSTRACT_CHILDENTITY on 1 = 1; + +} diff --git a/src/zdmo_test_abstract_grandchilde.ddls.baseinfo b/src/zdmo_test_abstract_grandchilde.ddls.baseinfo new file mode 100644 index 0000000..a4c5e5e --- /dev/null +++ b/src/zdmo_test_abstract_grandchilde.ddls.baseinfo @@ -0,0 +1,19 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[ +"ZDMO_TEST_ABSTRACT_CHILDENTITY" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_test_abstract_grandchilde.ddls.xml b/src/zdmo_test_abstract_grandchilde.ddls.xml new file mode 100644 index 0000000..30c4989 --- /dev/null +++ b/src/zdmo_test_abstract_grandchilde.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_TEST_ABSTRACT_GRANDCHILDE</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Test entity - abstract - root</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_test_abstract_root_entity.ddls.asddls b/src/zdmo_test_abstract_root_entity.ddls.asddls new file mode 100644 index 0000000..f19faa2 --- /dev/null +++ b/src/zdmo_test_abstract_root_entity.ddls.asddls @@ -0,0 +1,63 @@ +@EndUserText.label: 'Test entity - abstract - root' + @OData.entitySet.name: 'SalesOrderSet' + @OData.entityType.name: 'SalesOrder' +define abstract entity ZDMO_TEST_ABSTRACT_ROOT_ENTITY +{ + key SalesOrderID : abap.char( 10 ) ; + @OData.property.valueControl: 'Note_vc' + Note : abap.char( 255 ) ; + Note_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'NoteLanguage_vc' + NoteLanguage : abap.char( 2 ) ; + NoteLanguage_vc : rap_cp_odata_value_control ; + CustomerID : abap.char( 10 ) ; + @OData.property.valueControl: 'CustomerName_vc' + CustomerName : abap.char( 80 ) ; + CustomerName_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'CurrencyCode_vc' + @Semantics.currencyCode: true + CurrencyCode : abap.cuky( 5 ) ; + CurrencyCode_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'GrossAmount_vc' + @Semantics.amount.currencyCode: 'CurrencyCode' + GrossAmount : abap.curr( 16, 2 ) ; + GrossAmount_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'NetAmount_vc' + @Semantics.amount.currencyCode: 'CurrencyCode' + NetAmount : abap.curr( 16, 2 ) ; + NetAmount_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'TaxAmount_vc' + @Semantics.amount.currencyCode: 'CurrencyCode' + TaxAmount : abap.curr( 16, 2 ) ; + TaxAmount_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'LifecycleStatus_vc' + LifecycleStatus : abap.char( 1 ) ; + LifecycleStatus_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'LifecycleStatusDescription_vc' + LifecycleStatusDescription : abap.char( 60 ) ; + LifecycleStatusDescription_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'BillingStatus_vc' + BillingStatus : abap.char( 1 ) ; + BillingStatus_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'BillingStatusDescription_vc' + BillingStatusDescription : abap.char( 60 ) ; + BillingStatusDescription_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'DeliveryStatus_vc' + DeliveryStatus : abap.char( 1 ) ; + DeliveryStatus_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'DeliveryStatusDescription_vc' + DeliveryStatusDescription : abap.char( 60 ) ; + DeliveryStatusDescription_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'CreatedAt_vc' + CreatedAt : rap_cp_odata_v2_edm_datetime ; + CreatedAt_vc : rap_cp_odata_value_control ; + @OData.property.valueControl: 'ChangedAt_vc' + ChangedAt : rap_cp_odata_v2_edm_datetime ; + ChangedAt_vc : rap_cp_odata_value_control ; + + @OData.property.name: 'ToLineItems' +//A dummy on-condition is required for associations in abstract entities +//On-condition is not relevant for runtime + _ToLineItems : association [0..*] to ZDMO_TEST_ABSTRACT_CHILDENTITY on 1 = 1; + +} diff --git a/src/zdmo_test_abstract_root_entity.ddls.baseinfo b/src/zdmo_test_abstract_root_entity.ddls.baseinfo new file mode 100644 index 0000000..a4c5e5e --- /dev/null +++ b/src/zdmo_test_abstract_root_entity.ddls.baseinfo @@ -0,0 +1,19 @@ +{ +"BASEINFO": +{ +"FROM": +[], +"ASSOCIATED": +[ +"ZDMO_TEST_ABSTRACT_CHILDENTITY" +], +"BASE": +[], +"ANNO_REF": +[], +"SCALAR_FUNCTION": +[], +"VERSION":0, +"ANNOREF_EVALUATION_ERROR":"" +} +} \ No newline at end of file diff --git a/src/zdmo_test_abstract_root_entity.ddls.xml b/src/zdmo_test_abstract_root_entity.ddls.xml new file mode 100644 index 0000000..d4b3800 --- /dev/null +++ b/src/zdmo_test_abstract_root_entity.ddls.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_DDLS" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DDLS> + <DDLNAME>ZDMO_TEST_ABSTRACT_ROOT_ENTITY</DDLNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <DDTEXT>Test entity - abstract - root</DDTEXT> + <SOURCE_TYPE>A</SOURCE_TYPE> + </DDLS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_ui_rapg_project_o2.srvb.xml b/src/zdmo_ui_rapg_project_o2.srvb.xml new file mode 100644 index 0000000..343e998 --- /dev/null +++ b/src/zdmo_ui_rapg_project_o2.srvb.xml @@ -0,0 +1,86 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_SRVB" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <SRVB> + <METADATA> + <NAME>ZDMO_UI_RAPG_PROJECT_O2</NAME> + <TYPE>SRVB/SVB</TYPE> + <DESCRIPTION>Service binding for RAP Generator</DESCRIPTION> + <LANGUAGE>EN</LANGUAGE> + <LINKS> + <item> + <HREF>versions</HREF> + <REL>http://www.sap.com/adt/relations/versions</REL> + <TITLE>Historic versions</TITLE> + </item> + <item> + <HREF>/sap/bc/adt/businessservices/odatav2/ZDMO_UI_RAPG_PROJECT_O2</HREF> + <REL>http://www.sap.com/categories/odatav2</REL> + <TYPE>application/vnd.sap.adt.businessservices.odatav2.v2+xml</TYPE> + <TITLE>ODATAV2</TITLE> + </item> + <item> + <HREF>/sap/bc/adt/businessservices/testclass</HREF> + <REL>http://www.sap.com/categories/testclass</REL> + <TYPE>application/vnd.sap.adt.businessservices.testclass.v1+xml</TYPE> + <TITLE>TESTCLASS</TITLE> + </item> + <item> + <HREF>/sap/bc/adt/businessservices/testclass</HREF> + <REL>http://www.sap.com/categories/testclass</REL> + <TYPE>application/vnd.sap.adt.businessservices.testclassv4.v1+xml</TYPE> + <TITLE>TESTCLASSV4</TITLE> + </item> + <item> + <HREF>/sap/bc/adt/businessservices/semanticversion</HREF> + <REL>http://www.sap.com/categories/semanticversion</REL> + <TYPE>application/vnd.sap.adt.businessservices.semanticversion.v1+xml</TYPE> + <TITLE>SemanticVersion</TITLE> + </item> + <item> + <HREF>./zdmo_ui_rapg_project_o2</HREF> + <REL>http://www.sap.com/adt/relations/source</REL> + <TYPE>text/html</TYPE> + <TITLE>Landing Page (HTML)</TITLE> + </item> + </LINKS> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION> + </METADATA> + <CONTENT> + <BIND_TYPE_IMPL> + <NAME>ZDMO_UI_RAPG_PROJECT_O2</NAME> + </BIND_TYPE_IMPL> + <BIND_TYPE>ODATA</BIND_TYPE> + <BIND_TYPE_VERSION>V2</BIND_TYPE_VERSION> + <SERVICES> + <item> + <SERVICE_NAME>ZDMO_UI_RAPG_PROJECT_O2</SERVICE_NAME> + <SERVICE_CONTENT> + <item> + <SERVICE_VERSION>0001</SERVICE_VERSION> + <RELEASE_STATE>NOT_RELEASED</RELEASE_STATE> + <SRVD_REF> + <URI>/sap/bc/adt/ddic/srvd/sources/zdmo_rapg_project01</URI> + <TYPE>SRVD/SRV</TYPE> + <NAME>ZDMO_RAPG_PROJECT01</NAME> + </SRVD_REF> + <BIND_TYPE_DATA> + <CONTENT> + <ENCODING>base64</ENCODING> + </CONTENT> + </BIND_TYPE_DATA> + </item> + </SERVICE_CONTENT> + </item> + </SERVICES> + </CONTENT> + <CONTRACT>C1</CONTRACT> + <RELEASE_SUPPORTED>true</RELEASE_SUPPORTED> + <PUBLISHED>true</PUBLISHED> + <BINDING_CREATED>true</BINDING_CREATED> + </SRVB> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_ui_rapg_project_o4.srvb.xml b/src/zdmo_ui_rapg_project_o4.srvb.xml new file mode 100644 index 0000000..0a91dfb --- /dev/null +++ b/src/zdmo_ui_rapg_project_o4.srvb.xml @@ -0,0 +1,50 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_SRVB" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <SRVB> + <METADATA> + <NAME>ZDMO_UI_RAPG_PROJECT_O4</NAME> + <TYPE>SRVB/SVB</TYPE> + <DESCRIPTION>RAP Generator</DESCRIPTION> + <LANGUAGE>EN</LANGUAGE> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION> + </METADATA> + <CONTENT> + <BIND_TYPE_IMPL> + <NAME>ZDMO_UI_RAPG_PROJECT_O4</NAME> + </BIND_TYPE_IMPL> + <BIND_TYPE>ODATA</BIND_TYPE> + <BIND_TYPE_VERSION>V4</BIND_TYPE_VERSION> + <SERVICES> + <item> + <SERVICE_NAME>ZDMO_RAPG_PROJECT01</SERVICE_NAME> + <SERVICE_CONTENT> + <item> + <SERVICE_VERSION>0001</SERVICE_VERSION> + <RELEASE_STATE>NOT_RELEASED</RELEASE_STATE> + <SRVD_REF> + <URI>/sap/bc/adt/ddic/srvd/sources/zdmo_rapg_project01</URI> + <TYPE>SRVD/SRV</TYPE> + <NAME>ZDMO_RAPG_PROJECT01</NAME> + </SRVD_REF> + <BIND_TYPE_DATA> + <CONTENT> + <ENCODING>base64</ENCODING> + </CONTENT> + </BIND_TYPE_DATA> + </item> + </SERVICE_CONTENT> + </item> + </SERVICES> + </CONTENT> + <CONTRACT>C1</CONTRACT> + <RELEASE_SUPPORTED>true</RELEASE_SUPPORTED> + <PUBLISHED>true</PUBLISHED> + <BINDING_CREATED>true</BINDING_CREATED> + <ALLOWED_ACTION>UNPUBLISH</ALLOWED_ACTION> + </SRVB> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_ui_rapg_project_o4_0001_g4ba.sco2.xml b/src/zdmo_ui_rapg_project_o4_0001_g4ba.sco2.xml new file mode 100644 index 0000000..f80e6e8 --- /dev/null +++ b/src/zdmo_ui_rapg_project_o4_0001_g4ba.sco2.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_SCO2" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <SCO2> + <IBS_ID>ZDMO_UI_RAPG_PROJECT_O4_0001_G4BA</IBS_ID> + <IBS_TYPE>G4BA</IBS_TYPE> + <ODATA_V4_GROUP_ID>ZDMO_UI_RAPG_PROJECT_O4</ODATA_V4_GROUP_ID> + <REL_FOR_CUST_CSCN>X</REL_FOR_CUST_CSCN> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + <NAME>ZDMO_UI_RAPG_PROJECT_O4_0001_G4BA</NAME> + <DESCRIPTION>ZDMO_UI_RAPG_PROJECT_O4</DESCRIPTION> + <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION> + </SCO2> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_ui_rapg_project_o4_0_00001_ibs.sia6.xml b/src/zdmo_ui_rapg_project_o4_0_00001_ibs.sia6.xml new file mode 100644 index 0000000..fda34f5 --- /dev/null +++ b/src/zdmo_ui_rapg_project_o4_0_00001_ibs.sia6.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_SIA6" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <SIA6> + <MAIN_OBJECT> + <NAME>ZDMO_UI_RAPG_PROJECT_O4_0_00001_IBS</NAME> + <TYPE>SIA6</TYPE> + <DESCRIPTION>ZDMO_UI_RAPG_PROJECT_O4</DESCRIPTION> + <RESPONSIBLE>CB9980000000</RESPONSIBLE> + <MASTER_LANGUAGE>EN</MASTER_LANGUAGE> + <MASTER_SYSTEM>PMD</MASTER_SYSTEM> + <PACKAGE_REF> + <PACKAGE_NAME>ZDMO_RAP_GENERATOR</PACKAGE_NAME> + </PACKAGE_REF> + <ABAP_LANGU_VERSION>5</ABAP_LANGU_VERSION> + </MAIN_OBJECT> + <APP_ID>ZDMO_UI_RAPG_PROJECT_O4_0_00001_IBS</APP_ID> + <APP_TYPE>IBS</APP_TYPE> + <ABAP_LANGUAGE_VERSION>5</ABAP_LANGUAGE_VERSION> + <SECONDARY_ID>ZDMO_UI_RAPG_PROJECT_O4_0001_G4BA</SECONDARY_ID> + <PUBLISH_STATUS>p</PUBLISH_STATUS> + </SIA6> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_uuid_header.tabl.xml b/src/zdmo_uuid_header.tabl.xml new file mode 100644 index 0000000..96ce497 --- /dev/null +++ b/src/zdmo_uuid_header.tabl.xml @@ -0,0 +1,138 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_UUID_HEADER</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>Demo for tables with UUID based keys - Header</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>1</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_UUID_HEADER</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>HEADER_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SALESORDER_ID</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000020</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000010</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>CUSTOMER</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000020</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000010</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>TOTAL_AMOUNT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>P</INTTYPE> + <INTLEN>000008</INTLEN> + <REFTABLE>ZDMO_UUID_HEADER</REFTABLE> + <REFFIELD>CURRENCY_CODE</REFFIELD> + <DATATYPE>CURR</DATATYPE> + <LENG>000015</LENG> + <DECIMALS>000002</DECIMALS> + <MASK> CURR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>CURRENCY_CODE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000010</INTLEN> + <DATATYPE>CUKY</DATATYPE> + <LENG>000005</LENG> + <MASK> CUKY</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DESCRIPTION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000510</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000255</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>OVERALL_STATUS</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>CREATED_AT</FIELDNAME> + <ROLLNAME>ABP_CREATION_TSTMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>CREATED_BY</FIELDNAME> + <ROLLNAME>ABP_CREATION_USER</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LAST_CHANGED_BY</FIELDNAME> + <ROLLNAME>ABP_LASTCHANGE_USER</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>ABP_LASTCHANGE_TSTMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>ABP_LOCINST_LASTCHANGE_TSTMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_UUID_HEADER</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_uuid_item.tabl.xml b/src/zdmo_uuid_item.tabl.xml new file mode 100644 index 0000000..f74b749 --- /dev/null +++ b/src/zdmo_uuid_item.tabl.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_UUID_ITEM</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>Demo for tables with UUID based keys - Header</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>4</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_UUID_ITEM</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>ITEM_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PARENT_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ITEM_ID</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000012</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000006</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>QUANTITY</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>P</INTTYPE> + <INTLEN>000007</INTLEN> + <REFTABLE>ZDMO_UUID_ITEM</REFTABLE> + <REFFIELD>QUANTITY_UNIT</REFFIELD> + <DATATYPE>QUAN</DATATYPE> + <LENG>000013</LENG> + <DECIMALS>000003</DECIMALS> + <MASK> QUAN</MASK> + </DD03P> + <DD03P> + <FIELDNAME>QUANTITY_UNIT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <DATATYPE>UNIT</DATATYPE> + <LENG>000003</LENG> + <MASK> UNIT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>AMOUNT</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>P</INTTYPE> + <INTLEN>000008</INTLEN> + <REFTABLE>ZDMO_UUID_ITEM</REFTABLE> + <REFFIELD>CURRENCY_CODE</REFFIELD> + <DATATYPE>CURR</DATATYPE> + <LENG>000015</LENG> + <DECIMALS>000002</DECIMALS> + <MASK> CURR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>CURRENCY_CODE</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000010</INTLEN> + <DATATYPE>CUKY</DATATYPE> + <LENG>000005</LENG> + <MASK> CUKY</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DESCRIPTION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000510</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000255</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>OVERALL_STATUS</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>ABP_LOCINST_LASTCHANGE_TSTMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_UUID_ITEM</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit> diff --git a/src/zdmo_uuid_s_item.tabl.xml b/src/zdmo_uuid_s_item.tabl.xml new file mode 100644 index 0000000..ac3ee38 --- /dev/null +++ b/src/zdmo_uuid_s_item.tabl.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="utf-8"?> +<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0"> + <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> + <asx:values> + <DD02V> + <TABNAME>ZDMO_UUID_S_ITEM</TABNAME> + <DDLANGUAGE>E</DDLANGUAGE> + <TABCLASS>TRANSP</TABCLASS> + <CLIDEP>X</CLIDEP> + <DDTEXT>Demo for tables with UUID based keys - Header</DDTEXT> + <MASTERLANG>E</MASTERLANG> + <CONTFLAG>A</CONTFLAG> + <EXCLASS>4</EXCLASS> + </DD02V> + <DD09L> + <TABNAME>ZDMO_UUID_S_ITEM</TABNAME> + <AS4LOCAL>A</AS4LOCAL> + <TABKAT>0</TABKAT> + <TABART>APPL0</TABART> + <BUFALLOW>N</BUFALLOW> + </DD09L> + <DD03P_TABLE> + <DD03P> + <FIELDNAME>CLIENT</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000006</INTLEN> + <NOTNULL>X</NOTNULL> + <DATATYPE>CLNT</DATATYPE> + <LENG>000003</LENG> + <MASK> CLNT</MASK> + </DD03P> + <DD03P> + <FIELDNAME>SCHED_LINE_UUID</FIELDNAME> + <KEYFLAG>X</KEYFLAG> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <NOTNULL>X</NOTNULL> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>PARENT_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>ROOT_UUID</FIELDNAME> + <ROLLNAME>SYSUUID_X16</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + <DD03P> + <FIELDNAME>SCHEDULE_LINE_ID</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000012</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000006</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>DESCRIPTION</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000510</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000255</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>OVERALL_STATUS</FIELDNAME> + <ADMINFIELD>0</ADMINFIELD> + <INTTYPE>C</INTTYPE> + <INTLEN>000002</INTLEN> + <DATATYPE>CHAR</DATATYPE> + <LENG>000001</LENG> + <MASK> CHAR</MASK> + </DD03P> + <DD03P> + <FIELDNAME>LOCAL_LAST_CHANGED_AT</FIELDNAME> + <ROLLNAME>ABP_LOCINST_LASTCHANGE_TSTMPL</ROLLNAME> + <ADMINFIELD>0</ADMINFIELD> + <COMPTYPE>E</COMPTYPE> + </DD03P> + </DD03P_TABLE> + <TABL_EXTRAS> + <TDDAT> + <TABNAME>ZDMO_UUID_S_ITEM</TABNAME> + <CCLASS>CUS_DEV_SUP_DA</CCLASS> + </TDDAT> + </TABL_EXTRAS> + </asx:values> + </asx:abap> +</abapGit>