CLASS zcl_abapgit_object_dtdc DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. METHODS constructor IMPORTING !is_item TYPE zif_abapgit_definitions=>ty_item !iv_language TYPE spras !io_files TYPE REF TO zcl_abapgit_objects_files OPTIONAL !io_i18n_params TYPE REF TO zcl_abapgit_i18n_params OPTIONAL RAISING zcx_abapgit_type_not_supported. PROTECTED SECTION. PRIVATE SECTION. METHODS: clear_fields CHANGING cs_dynamic_cache TYPE any, clear_field IMPORTING iv_fieldname TYPE csequence CHANGING cs_dynamic_cache TYPE any, fill_metadata_from_db CHANGING cs_dynamic_cache TYPE any RAISING zcx_abapgit_exception, get_wb_object_operator RETURNING VALUE(ri_wb_object_operator) TYPE REF TO object RAISING zcx_abapgit_exception, has_own_wb_data_class RETURNING VALUE(rv_supported) TYPE abap_bool. DATA: mr_dynamic_cache TYPE REF TO data, mv_dynamic_cache_key TYPE seu_objkey, mv_has_own_wb_data_class TYPE abap_bool, mi_persistence TYPE REF TO if_wb_object_persist, mi_wb_object_operator TYPE REF TO object. ENDCLASS. CLASS zcl_abapgit_object_dtdc IMPLEMENTATION. METHOD clear_field. FIELD-SYMBOLS: TYPE data. ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_dynamic_cache TO . IF sy-subrc = 0. CLEAR: . ENDIF. ENDMETHOD. METHOD clear_fields. clear_field( EXPORTING iv_fieldname = 'METADATA-CREATED_AT' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-CREATED_BY' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-CHANGED_AT' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-CHANGED_BY' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-MASTER_LANGUAGE' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-RESPONSIBLE' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-PACKAGE_REF' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-ABAP_LANGUAGE_VERSION' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'METADATA-ABAP_LANGU_VERSION' CHANGING cs_dynamic_cache = cs_dynamic_cache ). clear_field( EXPORTING iv_fieldname = 'CONTENT-SOURCE' CHANGING cs_dynamic_cache = cs_dynamic_cache ). ENDMETHOD. METHOD constructor. super->constructor( is_item = is_item iv_language = iv_language io_files = io_files io_i18n_params = io_i18n_params ). mv_dynamic_cache_key = ms_item-obj_name. mv_has_own_wb_data_class = has_own_wb_data_class( ). TRY. IF mv_has_own_wb_data_class = abap_true. CREATE DATA mr_dynamic_cache TYPE ('CL_DTDC_WB_OBJECT_DATA=>TY_DTDC_OBJECT_DATA'). ELSE. CREATE DATA mr_dynamic_cache TYPE ('CL_BLUE_SOURCE_OBJECT_DATA=>TY_OBJECT_DATA'). ENDIF. CREATE OBJECT mi_persistence TYPE ('CL_DTDC_OBJECT_PERSIST'). CATCH cx_sy_create_error. RAISE EXCEPTION TYPE zcx_abapgit_type_not_supported EXPORTING obj_type = is_item-obj_type. ENDTRY. ENDMETHOD. METHOD fill_metadata_from_db. DATA: li_wb_object_operator TYPE REF TO object, lr_dynamic_cache_old TYPE REF TO data. FIELD-SYMBOLS: TYPE any, TYPE xsddatetime_z, TYPE syuname, TYPE xsddatetime_z, TYPE syuname. li_wb_object_operator = get_wb_object_operator( ). IF mv_has_own_wb_data_class = abap_true. CREATE DATA lr_dynamic_cache_old TYPE ('CL_DTDC_WB_OBJECT_DATA=>TY_DTDC_OBJECT_DATA'). ELSE. CREATE DATA lr_dynamic_cache_old TYPE ('CL_BLUE_SOURCE_OBJECT_DATA=>TY_OBJECT_DATA'). ENDIF. ASSIGN lr_dynamic_cache_old->* TO . ASSERT sy-subrc = 0. CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') IMPORTING data = . ASSIGN COMPONENT 'METADATA-CREATED_BY' OF STRUCTURE cs_dynamic_cache TO . ASSERT sy-subrc = 0. ASSIGN COMPONENT 'METADATA-CREATED_AT' OF STRUCTURE cs_dynamic_cache TO . ASSERT sy-subrc = 0. ASSIGN COMPONENT 'METADATA-CREATED_BY' OF STRUCTURE TO . ASSERT sy-subrc = 0. ASSIGN COMPONENT 'METADATA-CREATED_AT' OF STRUCTURE TO . ASSERT sy-subrc = 0. = . = . ENDMETHOD. METHOD get_wb_object_operator. DATA: ls_object_type TYPE wbobjtype, lx_error TYPE REF TO cx_root. IF mi_wb_object_operator IS BOUND. ri_wb_object_operator = mi_wb_object_operator. ENDIF. ls_object_type-objtype_tr = 'DTDC'. ls_object_type-subtype_wb = 'DF'. TRY. CALL METHOD ('CL_WB_OBJECT_OPERATOR')=>('CREATE_INSTANCE') EXPORTING object_type = ls_object_type object_key = mv_dynamic_cache_key RECEIVING result = mi_wb_object_operator. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise_with_text( lx_error ). ENDTRY. ri_wb_object_operator = mi_wb_object_operator. ENDMETHOD. METHOD has_own_wb_data_class. DATA: lr_own_type TYPE REF TO data, lx_error TYPE REF TO cx_root. TRY. CREATE DATA lr_own_type TYPE ('CL_DTDC_WB_OBJECT_DATA=>TY_DTDC_OBJECT_DATA'). rv_supported = abap_true. CATCH cx_root INTO lx_error. rv_supported = abap_false. ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~changed_by. DATA: li_object_data_model TYPE REF TO if_wb_object_data_model, lx_error TYPE REF TO cx_root, li_wb_object_operator TYPE REF TO object. TRY. li_wb_object_operator = get_wb_object_operator( ). CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') IMPORTING eo_object_data = li_object_data_model. rv_user = li_object_data_model->get_changed_by( ). CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise_with_text( lx_error ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lx_error TYPE REF TO cx_root, li_wb_object_operator TYPE REF TO object. TRY. li_wb_object_operator = get_wb_object_operator( ). CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~DELETE') EXPORTING transport_request = iv_transport. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise_with_text( lx_error ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: li_object_data_model TYPE REF TO if_wb_object_data_model, li_wb_object_operator TYPE REF TO object, lx_error TYPE REF TO cx_root. FIELD-SYMBOLS: TYPE any, TYPE data. ASSIGN mr_dynamic_cache->* TO . ASSERT sy-subrc = 0. io_xml->read( EXPORTING iv_name = 'DTDC' CHANGING cg_data = ). li_wb_object_operator = get_wb_object_operator( ). TRY. IF mv_has_own_wb_data_class = abap_true. CREATE OBJECT li_object_data_model TYPE ('CL_DTDC_WB_OBJECT_DATA'). ELSE. CREATE OBJECT li_object_data_model TYPE ('CL_BLUE_SOURCE_OBJECT_DATA'). ENDIF. ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . ASSERT sy-subrc = 0. = mo_files->read_string( 'asdtdc' ). tadir_insert( iv_package ). IF zif_abapgit_object~exists( ) = abap_true. " We need to populate created_at, created_by, because otherwise update is not possible fill_metadata_from_db( CHANGING cs_dynamic_cache = ). li_object_data_model->set_data( ). CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') EXPORTING io_object_data = li_object_data_model transport_request = iv_transport. ELSE. li_object_data_model->set_data( ). CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~CREATE') EXPORTING io_object_data = li_object_data_model data_selection = 'P' " if_wb_object_data_selection_co=>c_properties package = iv_package transport_request = iv_transport. CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~UPDATE') EXPORTING io_object_data = li_object_data_model data_selection = 'D' " if_wb_object_data_selection_co=>c_data_content transport_request = iv_transport. ENDIF. CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~ACTIVATE'). corr_insert( iv_package ). CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise_with_text( lx_error ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~exists. TRY. mi_persistence->get( p_object_key = mv_dynamic_cache_key p_version = 'A' p_existence_check_only = abap_true ). rv_bool = abap_true. CATCH cx_swb_exception. rv_bool = abap_false. ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~get_comparator. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_order. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_steps. APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps. ENDMETHOD. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. METHOD zif_abapgit_object~is_active. rv_active = is_active( ). ENDMETHOD. METHOD zif_abapgit_object~is_locked. rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'ESWB_EO' iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). ENDMETHOD. METHOD zif_abapgit_object~jump. " Covered by ZCL_ABAPGIT_OBJECTS=>JUMP ENDMETHOD. METHOD zif_abapgit_object~map_filename_to_object. RETURN. ENDMETHOD. METHOD zif_abapgit_object~map_object_to_filename. RETURN. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: li_wb_object_operator TYPE REF TO object, li_object_data_model TYPE REF TO if_wb_object_data_model, lx_error TYPE REF TO cx_root, lv_source TYPE string. FIELD-SYMBOLS: TYPE any, TYPE string. ASSIGN mr_dynamic_cache->* TO . ASSERT sy-subrc = 0. TRY. li_wb_object_operator = get_wb_object_operator( ). CALL METHOD li_wb_object_operator->('IF_WB_OBJECT_OPERATOR~READ') EXPORTING version = 'A' IMPORTING data = eo_object_data = li_object_data_model. ASSIGN COMPONENT 'CONTENT-SOURCE' OF STRUCTURE TO . ASSERT sy-subrc = 0. lv_source = . clear_fields( CHANGING cs_dynamic_cache = ). CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise_with_text( lx_error ). ENDTRY. io_xml->add( iv_name = 'DTDC' ig_data = ). mo_files->add_string( iv_ext = 'asdtdc' iv_string = lv_source ). ENDMETHOD. ENDCLASS.