abapGit/src/objects/zcl_abapgit_object_avas.clas.abap
larshp 25f6284493 implement GET_DESERIALIZE_STEPS
this is a quick fix, field LATE_DESER will be removed in future
2019-03-12 07:37:56 -07:00

279 lines
6.7 KiB
ABAP

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.
DATA: ls_meta TYPE zif_abapgit_definitions=>ty_metadata.
ls_meta = get_metadata( ).
IF ls_meta-late_deser = abap_true.
APPEND zif_abapgit_object=>gc_step_id-late TO rt_steps.
ELSEIF ls_meta-ddic = abap_true.
APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps.
ELSE.
APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
ENDIF.
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: <ls_value> LIKE LINE OF ls_avas-values,
<ls_link> 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 <ls_value>.
CLEAR: <ls_value>-set_by, <ls_value>-changed_on.
ENDLOOP.
LOOP AT ls_avas-links ASSIGNING <ls_link>.
CLEAR: <ls_link>-set_by, <ls_link>-changed_on.
ENDLOOP.
io_xml->add(
iv_name = 'AVAS'
ig_data = ls_avas ).
ENDMETHOD.
ENDCLASS.