CLASS zcl_abapgit_object_avas DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_object . PROTECTED SECTION. TYPES: BEGIN OF ty_header, guid TYPE guid_32, attribute TYPE cls_attribute_name, object TYPE pak_object_key, END OF ty_header . TYPES: BEGIN OF ty_avas, header TYPE ty_header, values TYPE cls_value_assignments, links TYPE cls_linked_objects, END OF ty_avas . METHODS insert_assignments IMPORTING !is_avas TYPE ty_avas RAISING zcx_abapgit_exception . METHODS insert_links IMPORTING !is_avas TYPE ty_avas . METHODS instantiate RETURNING VALUE(ro_avas) TYPE REF TO cl_cls_attr_value_assignment RAISING zcx_abapgit_exception . PRIVATE SECTION. ENDCLASS. CLASS ZCL_ABAPGIT_OBJECT_AVAS IMPLEMENTATION. METHOD insert_assignments. DATA: lt_assignment TYPE STANDARD TABLE OF cls_assignment, ls_assignment LIKE LINE OF lt_assignment, ls_value LIKE LINE OF is_avas-values. LOOP AT is_avas-values INTO ls_value. CLEAR ls_assignment. ls_assignment-guid = is_avas-header-guid. ls_assignment-value = ls_value-value. ls_assignment-trobjtype = is_avas-header-object-trobjtype. ls_assignment-sobj_name = is_avas-header-object-sobj_name. ls_assignment-object_type = is_avas-header-object-object_type. ls_assignment-sub_key = is_avas-header-object-sub_key. ls_assignment-attribute = is_avas-header-attribute. ls_assignment-set_by = sy-uname. ls_assignment-changed_on = sy-datum. ls_assignment-remark = ls_value-remark. APPEND ls_assignment TO lt_assignment. ENDLOOP. DELETE FROM cls_assignment WHERE guid = is_avas-header-guid. INSERT cls_assignment FROM TABLE lt_assignment. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error inserting into CLS_ASSIGNMENT| ). ENDIF. ENDMETHOD. METHOD insert_links. * todo, how does links work? * LOOP AT ls_avas-links INTO ls_linked_obj. * ENDLOOP. ** DELETE FROM cls_linked_obj WHERE guid = ls_avas-header-guid. ** INSERT cls_linked_obj FROM TABLE lt_linked. * if sy-subrc <> 0. * endif. ENDMETHOD. METHOD instantiate. DATA: lv_id TYPE guid_32, lx_err TYPE REF TO cx_root. lv_id = ms_item-obj_name. TRY. CREATE OBJECT ro_avas EXPORTING im_assignment_id = lv_id. CATCH cx_pak_wb_object_locked INTO lx_err. zcx_abapgit_exception=>raise( |AVAS { lv_id }: locked: { lx_err->get_longtext( ) }| ). CATCH cx_pak_not_authorized INTO lx_err. zcx_abapgit_exception=>raise( |AVAS { lv_id }: not authorized: { lx_err->get_longtext( ) }| ). CATCH cx_pak_invalid_state INTO lx_err. zcx_abapgit_exception=>raise( |AVAS { lv_id }: invalid state: { lx_err->get_longtext( ) }| ). CATCH cx_pak_invalid_data INTO lx_err. zcx_abapgit_exception=>raise( |AVAS { lv_id }: invalid data: { lx_err->get_longtext( ) }| ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~changed_by. DATA: lo_avas TYPE REF TO cl_cls_attr_value_assignment. lo_avas = instantiate( ). lo_avas->if_pak_wb_object~get_last_changed( IMPORTING ex_changed_by = rv_user ). IF rv_user IS INITIAL. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lo_avas TYPE REF TO cl_cls_attr_value_assignment. lo_avas = instantiate( ). TRY. lo_avas->if_cls_attr_value_assignment~lock_and_refresh( im_allow_popups = abap_false ). CATCH cx_pak_invalid_state cx_pak_invalid_data cx_pak_not_authorized cx_pak_wb_object_locked. zcx_abapgit_exception=>raise( |AVAS error| ). ENDTRY. lo_avas->if_pak_wb_object~delete( ). lo_avas->if_pak_wb_object~save( ). lo_avas->if_pak_wb_object_internal~unlock( ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: ls_avas TYPE ty_avas. io_xml->read( EXPORTING iv_name = 'AVAS' CHANGING cg_data = ls_avas ). * The AVAS API cannot be used in this case, as it will always create a new GUID ASSERT NOT ls_avas-header-guid IS INITIAL. tadir_insert( iv_package ). insert_assignments( ls_avas ). insert_links( ls_avas ). * corr_insert? ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_guid TYPE cls_assignment-guid. SELECT SINGLE guid FROM cls_assignment INTO lv_guid WHERE guid = ms_item-obj_name. rv_bool = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD zif_abapgit_object~get_comparator. RETURN. ENDMETHOD. METHOD zif_abapgit_object~get_deserialize_steps. APPEND zif_abapgit_object=>gc_step_id-abap 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 = 'CLS_ENQUEUE_STRU' iv_argument = |{ ms_item-obj_name }| ). ENDMETHOD. METHOD zif_abapgit_object~jump. zcx_abapgit_exception=>raise( |Todo, AVAS jump| ). ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: lo_avas TYPE REF TO cl_cls_attr_value_assignment, ls_avas TYPE ty_avas. FIELD-SYMBOLS: LIKE LINE OF ls_avas-values, LIKE LINE OF ls_avas-links. lo_avas = instantiate( ). ls_avas-header-guid = lo_avas->if_cls_attr_value_assignment~get_guid( ). ls_avas-header-attribute = lo_avas->if_cls_attr_value_assignment~get_attribute( ). ls_avas-header-object = lo_avas->if_cls_attr_value_assignment~get_object( ). lo_avas->if_cls_attr_value_assignment~get_values( IMPORTING ex_values = ls_avas-values ). lo_avas->if_cls_attr_value_assignment~get_links( IMPORTING ex_links = ls_avas-links ). LOOP AT ls_avas-values ASSIGNING . CLEAR: -set_by, -changed_on. ENDLOOP. LOOP AT ls_avas-links ASSIGNING . CLEAR: -set_by, -changed_on. ENDLOOP. io_xml->add( iv_name = 'AVAS' ig_data = ls_avas ). ENDMETHOD. ENDCLASS.