CLASS lcl_aff_helper DEFINITION. PUBLIC SECTION. CLASS-METHODS: get_descriptions_compo_subco IMPORTING iv_language TYPE sy-langu iv_clif_name TYPE seoclsname RETURNING VALUE(rs_properties) TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions , get_descr_comp_subc_w_exposure IMPORTING iv_language TYPE sy-langu iv_clif_name TYPE seoclsname iv_exposure TYPE seoexpose DEFAULT seoc_exposure_public RETURNING VALUE(rs_properties) TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions , set_descriptions_compo_subco IMPORTING iv_clif_name TYPE seoclsname iv_language TYPE langu is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions . PRIVATE SECTION. TYPES: BEGIN OF ty_component, visibility TYPE seoexpose, cmpname TYPE seocmpname, descript TYPE seodescr, cmptype TYPE seocmptype, END OF ty_component, BEGIN OF ty_sub_component, cmpname TYPE seocmpname, sconame TYPE seosconame, descript TYPE seodescr, scotype TYPE seoscotype, END OF ty_sub_component, ty_compontents TYPE STANDARD TABLE OF ty_component, ty_sub_compontents TYPE STANDARD TABLE OF ty_sub_component. CLASS-METHODS: get_attributes IMPORTING is_components TYPE ty_compontents RETURNING VALUE(rs_result) TYPE zif_abapgit_aff_oo_types_v1=>ty_component_descriptions, get_methods IMPORTING is_components TYPE ty_compontents is_sub_components TYPE ty_sub_compontents RETURNING VALUE(rs_result) TYPE zif_abapgit_aff_oo_types_v1=>ty_methods, get_types IMPORTING is_components TYPE ty_compontents RETURNING VALUE(rs_result) TYPE zif_abapgit_aff_oo_types_v1=>ty_component_descriptions, get_events IMPORTING is_components TYPE ty_compontents is_sub_components TYPE ty_sub_compontents RETURNING VALUE(rs_result) TYPE zif_abapgit_aff_oo_types_v1=>ty_events, set_methods IMPORTING iv_clif_name TYPE seoclsname iv_language TYPE langu is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions, set_attributes IMPORTING iv_clif_name TYPE seoclsname iv_language TYPE langu is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions, set_events IMPORTING iv_clif_name TYPE seoclsname iv_language TYPE langu is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions, set_types IMPORTING iv_clif_name TYPE seoclsname iv_language TYPE langu is_properties TYPE zif_abapgit_aff_oo_types_v1=>ty_descriptions . ENDCLASS. CLASS lcl_aff_helper IMPLEMENTATION. METHOD get_descr_comp_subc_w_exposure. DATA: lt_components TYPE ty_compontents, lt_sub_components TYPE ty_sub_compontents. SELECT df~exposure AS visibility component~cmpname component_text~descript component~cmptype INTO TABLE lt_components FROM seocompo AS component LEFT OUTER JOIN seocompotx AS component_text ON component~cmpname = component_text~cmpname AND component~clsname = component_text~clsname AND component_text~langu = iv_language INNER JOIN seocompodf AS df ON component~clsname = df~clsname AND component~cmpname = df~cmpname WHERE component~clsname = iv_clif_name AND df~exposure = iv_exposure. "#EC CI_BUFFJOIN SELECT sub_component~cmpname sub_component~sconame sub_component_text~descript sub_component~scotype INTO TABLE lt_sub_components FROM seosubco AS sub_component JOIN seosubcotx AS sub_component_text ON sub_component~clsname = sub_component_text~clsname AND sub_component~cmpname = sub_component_text~cmpname AND sub_component~sconame = sub_component_text~sconame INNER JOIN seocompodf AS df ON sub_component~clsname = df~clsname AND sub_component~cmpname = df~cmpname WHERE sub_component~clsname = iv_clif_name AND df~exposure = iv_exposure AND sub_component_text~langu = iv_language AND sub_component_text~descript <> space. "#EC CI_BUFFJOIN rs_properties-attributes = get_attributes( lt_components ). rs_properties-methods = get_methods( is_components = lt_components is_sub_components = lt_sub_components ). rs_properties-events = get_events( is_components = lt_components is_sub_components = lt_sub_components ). rs_properties-types = get_types( lt_components ). ENDMETHOD. METHOD get_descriptions_compo_subco. TYPES: BEGIN OF ty_helper_type, cmpname TYPE seocmpname, descript TYPE seodescr, cmptype TYPE seocmptype, END OF ty_helper_type. DATA: lt_components TYPE STANDARD TABLE OF ty_helper_type, lt_sub_components TYPE ty_sub_compontents, lt_components_exp TYPE ty_compontents, ls_component_exp LIKE LINE OF lt_components_exp. FIELD-SYMBOLS: LIKE LINE OF lt_components. SELECT component~cmpname component_text~descript component~cmptype INTO TABLE lt_components FROM seocompo AS component LEFT OUTER JOIN seocompotx AS component_text ON component~cmpname = component_text~cmpname AND component~clsname = component_text~clsname AND component_text~langu = iv_language WHERE component~clsname = iv_clif_name. "#EC CI_BUFFJOIN SELECT sub_component~cmpname sub_component~sconame sub_component_text~descript sub_component~scotype INTO TABLE lt_sub_components FROM seosubco AS sub_component JOIN seosubcotx AS sub_component_text ON sub_component~clsname = sub_component_text~clsname AND sub_component~cmpname = sub_component_text~cmpname AND sub_component~sconame = sub_component_text~sconame WHERE sub_component~clsname = iv_clif_name AND sub_component_text~langu = iv_language AND sub_component_text~descript <> space. "#EC CI_BUFFJOIN LOOP AT lt_components ASSIGNING . CLEAR ls_component_exp. MOVE-CORRESPONDING TO ls_component_exp. INSERT ls_component_exp INTO TABLE lt_components_exp. ENDLOOP. rs_properties-attributes = get_attributes( lt_components_exp ). rs_properties-methods = get_methods( is_components = lt_components_exp is_sub_components = lt_sub_components ). rs_properties-events = get_events( is_components = lt_components_exp is_sub_components = lt_sub_components ). rs_properties-types = get_types( lt_components_exp ). ENDMETHOD. METHOD get_attributes. DATA: lo_component TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. FIELD-SYMBOLS TYPE ty_component. LOOP AT is_components ASSIGNING WHERE cmptype = seoo_cmptype_attribute AND descript IS NOT INITIAL. lo_component-name = -cmpname. lo_component-description = -descript. INSERT lo_component INTO TABLE rs_result. ENDLOOP. ENDMETHOD. METHOD get_methods. DATA: lo_method TYPE zif_abapgit_aff_oo_types_v1=>ty_method, lo_exception TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description, lo_parameter TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. FIELD-SYMBOLS TYPE ty_sub_component. FIELD-SYMBOLS TYPE ty_component. LOOP AT is_components ASSIGNING WHERE cmptype = seoo_cmptype_method. lo_method-name = -cmpname. lo_method-description = -descript. LOOP AT is_sub_components ASSIGNING WHERE cmpname = -cmpname. CASE -scotype. WHEN seos_scotype_parameter. lo_parameter-name = -sconame. lo_parameter-description = -descript. INSERT lo_parameter INTO TABLE lo_method-parameters. WHEN seos_scotype_exception. lo_exception-name = -sconame. lo_exception-description = -descript. INSERT lo_exception INTO TABLE lo_method-exceptions. ENDCASE. ENDLOOP. IF lo_method-description IS NOT INITIAL OR lo_method-exceptions IS NOT INITIAL OR lo_method-parameters IS NOT INITIAL. INSERT lo_method INTO TABLE rs_result. ENDIF. ENDLOOP. ENDMETHOD. METHOD get_types. DATA: lo_type TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. FIELD-SYMBOLS: TYPE ty_component. LOOP AT is_components ASSIGNING WHERE cmptype = seoo_cmptype_type AND descript IS NOT INITIAL. lo_type-name = -cmpname. lo_type-description = -descript. INSERT lo_type INTO TABLE rs_result. ENDLOOP. ENDMETHOD. METHOD get_events. DATA: lo_parameter TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description, lo_event TYPE zif_abapgit_aff_oo_types_v1=>ty_event. FIELD-SYMBOLS TYPE ty_component. FIELD-SYMBOLS TYPE ty_sub_component. LOOP AT is_components ASSIGNING WHERE cmptype = seoo_cmptype_event. lo_event-name = -cmpname. lo_event-description = -descript. LOOP AT is_sub_components ASSIGNING WHERE cmpname = -cmpname. lo_parameter-name = -sconame. lo_parameter-description = -descript. INSERT lo_parameter INTO TABLE lo_event-parameters. ENDLOOP. IF lo_event-description IS NOT INITIAL OR lo_event-parameters IS NOT INITIAL. INSERT lo_event INTO TABLE rs_result. ENDIF. ENDLOOP. ENDMETHOD. METHOD set_attributes. DATA: lo_attribute TYPE seocompotx. FIELD-SYMBOLS: TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. LOOP AT is_properties-attributes ASSIGNING . lo_attribute-clsname = iv_clif_name. lo_attribute-cmpname = -name. lo_attribute-langu = iv_language. lo_attribute-descript = -description. MODIFY seocompotx FROM lo_attribute. ENDLOOP. ENDMETHOD. METHOD set_methods. DATA: lo_method TYPE seocompotx, lo_method_exception TYPE seosubcotx, lo_method_parameter TYPE seosubcotx. FIELD-SYMBOLS: TYPE zif_abapgit_aff_oo_types_v1=>ty_method, TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description, TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. LOOP AT is_properties-methods ASSIGNING . lo_method-clsname = iv_clif_name. lo_method-cmpname = -name. lo_method-langu = iv_language. lo_method-descript = -description. MODIFY seocompotx FROM lo_method. LOOP AT -parameters ASSIGNING . lo_method_parameter-clsname = iv_clif_name. lo_method_parameter-cmpname = -name. lo_method_parameter-sconame = -name. lo_method_parameter-langu = iv_language. lo_method_parameter-descript = -description. MODIFY seosubcotx FROM lo_method_parameter. ENDLOOP. LOOP AT -exceptions ASSIGNING . lo_method_exception-clsname = iv_clif_name. lo_method_exception-cmpname = -name. lo_method_exception-sconame = -name. lo_method_exception-langu = iv_language. lo_method_exception-descript = -description. MODIFY seosubcotx FROM lo_method_exception. ENDLOOP. ENDLOOP. ENDMETHOD. METHOD set_events. DATA: lo_event_parameter TYPE seosubcotx, lo_event TYPE seocompotx. FIELD-SYMBOLS: TYPE zif_abapgit_aff_oo_types_v1=>ty_event, TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. LOOP AT is_properties-events ASSIGNING . lo_event-clsname = iv_clif_name. lo_event-cmpname = -name. lo_event-langu = iv_language. lo_event-descript = -description. MODIFY seocompotx FROM lo_event. LOOP AT -parameters ASSIGNING . lo_event_parameter-clsname = iv_clif_name. lo_event_parameter-cmpname = -name. lo_event_parameter-sconame = -name. lo_event_parameter-langu = iv_language. lo_event_parameter-descript = -description. MODIFY seosubcotx FROM lo_event_parameter. ENDLOOP. ENDLOOP. ENDMETHOD. METHOD set_types. DATA: lo_type TYPE seocompotx. FIELD-SYMBOLS: TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. LOOP AT is_properties-types ASSIGNING . lo_type-clsname = iv_clif_name. lo_type-cmpname = -name. lo_type-langu = iv_language. lo_type-descript = -description. MODIFY seocompotx FROM lo_type. ENDLOOP. ENDMETHOD. METHOD set_descriptions_compo_subco. set_attributes( is_properties = is_properties iv_clif_name = iv_clif_name iv_language = iv_language ). set_methods( is_properties = is_properties iv_clif_name = iv_clif_name iv_language = iv_language ). set_events( is_properties = is_properties iv_clif_name = iv_clif_name iv_language = iv_language ). set_types( is_properties = is_properties iv_clif_name = iv_clif_name iv_language = iv_language ). ENDMETHOD. ENDCLASS. CLASS lcl_aff_type_mapping DEFINITION. PUBLIC SECTION. INTERFACES zif_abapgit_aff_type_mapping. PRIVATE SECTION. METHODS set_abapgit_descriptions IMPORTING is_clsname TYPE seoclsname is_intf_aff TYPE zif_abapgit_aff_intf_v1=>ty_main EXPORTING et_descriptions TYPE zif_abapgit_oo_object_fnc=>ty_seocompotx_tt et_descriptions_sub TYPE zif_abapgit_oo_object_fnc=>ty_seosubcotx_tt. ENDCLASS. CLASS lcl_aff_type_mapping IMPLEMENTATION. METHOD zif_abapgit_aff_type_mapping~to_aff. DATA: ls_data_abapgit TYPE zcl_abapgit_object_intf=>ty_intf, ls_data_aff TYPE zif_abapgit_aff_intf_v1=>ty_main. ls_data_abapgit = iv_data. ls_data_aff-format_version = '1'. " get header ls_data_aff-header-description = ls_data_abapgit-vseointerf-descript. ls_data_aff-header-abap_language_version = ls_data_abapgit-vseointerf-unicode. ls_data_aff-header-original_language = ls_data_abapgit-vseointerf-langu. " get category and proxy ls_data_aff-category = ls_data_abapgit-vseointerf-category. ls_data_aff-proxy = ls_data_abapgit-vseointerf-clsproxy. " get descriptions ls_data_aff-descriptions = lcl_aff_helper=>get_descriptions_compo_subco( iv_language = ls_data_aff-header-original_language iv_clif_name = ls_data_abapgit-vseointerf-clsname ). es_data = ls_data_aff. ENDMETHOD. METHOD zif_abapgit_aff_type_mapping~to_abapgit. DATA: ls_data_abapgit TYPE zcl_abapgit_object_intf=>ty_intf, ls_data_aff TYPE zif_abapgit_aff_intf_v1=>ty_main, lv_classname TYPE seoclsname. ls_data_aff = iv_data. lv_classname = iv_object_name. set_abapgit_descriptions( EXPORTING is_clsname = lv_classname is_intf_aff = ls_data_aff IMPORTING et_descriptions = ls_data_abapgit-description et_descriptions_sub = ls_data_abapgit-description_sub ). ls_data_abapgit-vseointerf-clsname = iv_object_name. ls_data_abapgit-vseointerf-descript = ls_data_aff-header-description. ls_data_abapgit-vseointerf-category = ls_data_aff-category. ls_data_abapgit-vseointerf-unicode = ls_data_aff-header-abap_language_version. ls_data_abapgit-vseointerf-langu = ls_data_aff-header-original_language. ls_data_abapgit-vseointerf-clsproxy = ls_data_aff-proxy. ls_data_abapgit-vseointerf-exposure = seoc_exposure_public. ls_data_abapgit-vseointerf-state = seoc_state_implemented. es_data = ls_data_abapgit. ENDMETHOD. METHOD set_abapgit_descriptions. DATA ls_description TYPE seocompotx. DATA ls_description_subco TYPE seosubcotx. FIELD-SYMBOLS TYPE zif_abapgit_aff_oo_types_v1=>ty_component_description. FIELD-SYMBOLS TYPE zif_abapgit_aff_oo_types_v1=>ty_method. FIELD-SYMBOLS TYPE zif_abapgit_aff_oo_types_v1=>ty_event. LOOP AT is_intf_aff-descriptions-types ASSIGNING . ls_description-clsname = is_clsname. ls_description-cmpname = -name. ls_description-langu = is_intf_aff-header-original_language. ls_description-descript = -description. APPEND ls_description TO et_descriptions. ENDLOOP. LOOP AT is_intf_aff-descriptions-attributes ASSIGNING . ls_description-clsname = is_clsname. ls_description-cmpname = -name. ls_description-langu = is_intf_aff-header-original_language. ls_description-descript = -description. APPEND ls_description TO et_descriptions. ENDLOOP. LOOP AT is_intf_aff-descriptions-methods ASSIGNING . ls_description-clsname = is_clsname. ls_description-cmpname = -name. ls_description-langu = is_intf_aff-header-original_language. ls_description-descript = -description. APPEND ls_description TO et_descriptions. LOOP AT -parameters ASSIGNING . ls_description_subco-clsname = ls_description-clsname. ls_description_subco-cmpname = ls_description-cmpname. ls_description_subco-langu = ls_description-langu. ls_description_subco-sconame = -name. ls_description_subco-descript = -description. APPEND ls_description_subco TO et_descriptions_sub. ENDLOOP. LOOP AT -exceptions ASSIGNING . ls_description_subco-clsname = ls_description-clsname. ls_description_subco-cmpname = ls_description-cmpname. ls_description_subco-langu = ls_description-langu. ls_description_subco-sconame = -name. ls_description_subco-descript = -description. APPEND ls_description_subco TO et_descriptions_sub. ENDLOOP. ENDLOOP. LOOP AT is_intf_aff-descriptions-events ASSIGNING . ls_description-clsname = is_clsname. ls_description-cmpname = -name. ls_description-langu = is_intf_aff-header-original_language. ls_description-descript = -description. APPEND ls_description TO et_descriptions. LOOP AT -parameters ASSIGNING . ls_description_subco-clsname = ls_description-clsname. ls_description_subco-cmpname = ls_description-cmpname. ls_description_subco-langu = ls_description-langu. ls_description_subco-sconame = -name. ls_description_subco-descript = -description. APPEND ls_description_subco TO et_descriptions_sub. ENDLOOP. ENDLOOP. ENDMETHOD. ENDCLASS. CLASS lcl_aff_metadata_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS serialize IMPORTING is_intf TYPE zcl_abapgit_object_intf=>ty_intf RETURNING VALUE(rv_result) TYPE xstring RAISING zcx_abapgit_exception. CLASS-METHODS deserialize IMPORTING iv_data TYPE xstring RETURNING VALUE(rv_result) TYPE zif_abapgit_aff_intf_v1=>ty_main RAISING zcx_abapgit_exception. PRIVATE SECTION. CLASS-METHODS: "! For serialization "! @parameter rt_result | Map/table that associates ABAP values to JSON values (enums) get_mappings RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_enum_mappings, "! For serialization "! @parameter rt_result | Paths that will not be serialized (depending on value) get_paths_to_skip RETURNING VALUE(rt_result) TYPE zcl_abapgit_json_handler=>ty_skip_paths. ENDCLASS. CLASS lcl_aff_metadata_handler IMPLEMENTATION. METHOD serialize. DATA: ls_data_aff TYPE zif_abapgit_aff_intf_v1=>ty_main, lx_exception TYPE REF TO cx_root, lo_aff_handler TYPE REF TO zcl_abapgit_json_handler, lo_aff_mapper TYPE REF TO zif_abapgit_aff_type_mapping, lt_enum_mappings TYPE zcl_abapgit_json_handler=>ty_enum_mappings, lt_paths_to_skip TYPE zcl_abapgit_json_handler=>ty_skip_paths. CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping. lo_aff_mapper->to_aff( EXPORTING iv_data = is_intf IMPORTING es_data = ls_data_aff ). lt_enum_mappings = get_mappings( ). lt_paths_to_skip = get_paths_to_skip( ). CREATE OBJECT lo_aff_handler. TRY. rv_result = lo_aff_handler->serialize( iv_data = ls_data_aff iv_enum_mappings = lt_enum_mappings iv_skip_paths = lt_paths_to_skip ). CATCH cx_root INTO lx_exception. zcx_abapgit_exception=>raise_with_text( lx_exception ). ENDTRY. ENDMETHOD. METHOD get_mappings. DATA: ls_category_mapping TYPE zcl_abapgit_json_handler=>ty_enum_mapping, ls_json_abap_mapping TYPE zcl_abapgit_json_handler=>ty_json_abap_mapping, lt_json_abap_mappings TYPE zcl_abapgit_json_handler=>ty_json_abap_mappings. ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-general. ls_json_abap_mapping-json = 'standard'. APPEND ls_json_abap_mapping TO lt_json_abap_mappings. ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-classic_badi. ls_json_abap_mapping-json = 'classicBadi'. APPEND ls_json_abap_mapping TO lt_json_abap_mappings. ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-business_static_components. ls_json_abap_mapping-json = 'businessStaticComponents'. APPEND ls_json_abap_mapping TO lt_json_abap_mappings. ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-db_procedure_proxy. ls_json_abap_mapping-json = 'dbProcedureProxy'. APPEND ls_json_abap_mapping TO lt_json_abap_mappings. ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-web_dynpro_runtime. ls_json_abap_mapping-json = 'webDynproRuntime'. APPEND ls_json_abap_mapping TO lt_json_abap_mappings. ls_json_abap_mapping-abap = zif_abapgit_aff_intf_v1=>co_category-enterprise_service. ls_json_abap_mapping-json = 'enterpriseService'. APPEND ls_json_abap_mapping TO lt_json_abap_mappings. ls_category_mapping-path = '/category'. ls_category_mapping-mappings = lt_json_abap_mappings. APPEND ls_category_mapping TO rt_result. ENDMETHOD. METHOD get_paths_to_skip. DATA: ls_path_to_skipp TYPE zcl_abapgit_json_handler=>ty_path_value_pair. ls_path_to_skipp-path = '/category'. ls_path_to_skipp-value = 'standard'. APPEND ls_path_to_skipp TO rt_result. ENDMETHOD. METHOD deserialize. DATA: lo_ajson TYPE REF TO zcl_abapgit_json_handler, lx_exception TYPE REF TO cx_static_check, lt_enum_mappings TYPE zcl_abapgit_json_handler=>ty_enum_mappings, lt_default_abap_langu_version TYPE zcl_abapgit_json_handler=>ty_path_value_pair, lt_values_for_initial TYPE zcl_abapgit_json_handler=>ty_skip_paths. lt_values_for_initial = get_paths_to_skip( ). lt_default_abap_langu_version-path = '/header/abap_language_version'. lt_default_abap_langu_version-value = zif_abapgit_dot_abapgit=>c_abap_language_version-standard. APPEND lt_default_abap_langu_version TO lt_values_for_initial. lt_enum_mappings = get_mappings( ). CREATE OBJECT lo_ajson. TRY. lo_ajson->deserialize( EXPORTING iv_content = iv_data iv_defaults = lt_values_for_initial iv_enum_mappings = lt_enum_mappings IMPORTING ev_data = rv_result ). CATCH cx_static_check INTO lx_exception. zcx_abapgit_exception=>raise_with_text( lx_exception ). ENDTRY. ENDMETHOD. ENDCLASS.