diff --git a/src/objects/zcl_abapgit_object_avas.clas.abap b/src/objects/zcl_abapgit_object_avas.clas.abap new file mode 100644 index 000000000..9ce4c72a7 --- /dev/null +++ b/src/objects/zcl_abapgit_object_avas.clas.abap @@ -0,0 +1,256 @@ +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 . + 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. + + + lv_id = ms_item-obj_name. + + TRY. + CREATE OBJECT ro_avas + EXPORTING + im_assignment_id = lv_id. + CATCH cx_pak_wb_object_locked + cx_pak_not_authorized + cx_pak_invalid_state + cx_pak_invalid_data. + zcx_abapgit_exception=>raise( |AVAS error| ). + 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~compare_to_remote_version. + CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null. + 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_metadata. + + rs_metadata = get_metadata( ). + + ENDMETHOD. + + + METHOD zif_abapgit_object~has_changed_since. + rv_changed = abap_true. + 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. diff --git a/src/objects/zcl_abapgit_object_avas.clas.xml b/src/objects/zcl_abapgit_object_avas.clas.xml new file mode 100644 index 000000000..09d341f56 --- /dev/null +++ b/src/objects/zcl_abapgit_object_avas.clas.xml @@ -0,0 +1,18 @@ + + + + + + ZCL_ABAPGIT_OBJECT_AVAS + 1 + E + AVAS + 2 + 1 + X + X + X + + + +