abapGit/src/objects/zcl_abapgit_object_iobj.clas.abap
2025-04-16 13:52:45 +02:00

530 lines
18 KiB
ABAP

CLASS zcl_abapgit_object_iobj 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_field
IMPORTING
iv_fieldname TYPE string
CHANGING
cg_metadata TYPE any.
ENDCLASS.
CLASS zcl_abapgit_object_iobj IMPLEMENTATION.
METHOD constructor.
DATA lr_viobj TYPE REF TO data.
super->constructor(
is_item = is_item
iv_language = iv_language
io_files = io_files
io_i18n_params = io_i18n_params ).
TRY.
CREATE DATA lr_viobj TYPE ('RSD_S_VIOBJ').
CATCH cx_sy_create_data_error.
RAISE EXCEPTION TYPE zcx_abapgit_type_not_supported EXPORTING obj_type = is_item-obj_type.
ENDTRY.
ENDMETHOD.
METHOD clear_field.
FIELD-SYMBOLS: <lg_field> TYPE data.
ASSIGN COMPONENT iv_fieldname
OF STRUCTURE cg_metadata
TO <lg_field>.
ASSERT sy-subrc = 0.
CLEAR: <lg_field>.
ENDMETHOD.
METHOD zif_abapgit_object~changed_by.
DATA: lv_objna TYPE c LENGTH 30,
lr_viobj TYPE REF TO data.
FIELD-SYMBOLS:
<lg_tstpnm> TYPE any,
<lg_viobj> TYPE any.
lv_objna = ms_item-obj_name.
CREATE DATA lr_viobj TYPE ('RSD_S_VIOBJ').
ASSIGN lr_viobj->* TO <lg_viobj>.
CALL FUNCTION 'RSD_IOBJ_GET'
EXPORTING
i_iobjnm = lv_objna
i_objvers = 'A'
IMPORTING
e_s_viobj = <lg_viobj>
EXCEPTIONS
iobj_not_found = 1
illegal_input = 2
bct_comp_invalid = 3
* not_authorized = 4 " not in lower releases
OTHERS = 5.
IF sy-subrc = 0.
ASSIGN COMPONENT 'TSTPNM' OF STRUCTURE <lg_viobj> TO <lg_tstpnm>.
rv_user = <lg_tstpnm>.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_object~delete.
TYPES: BEGIN OF ty_iobj,
objnm TYPE c LENGTH 30.
TYPES END OF ty_iobj.
DATA: lt_iobjname TYPE STANDARD TABLE OF ty_iobj,
lv_subrc TYPE sy-subrc.
APPEND ms_item-obj_name TO lt_iobjname.
CALL FUNCTION 'RSDG_IOBJ_MULTI_DELETE'
EXPORTING
i_t_iobjnm = lt_iobjname
i_check_dependent = abap_false
i_manual = abap_false
IMPORTING
e_subrc = lv_subrc.
IF lv_subrc <> 0.
zcx_abapgit_exception=>raise( |Error when deleting InfoObject { ms_item-obj_name }| ).
ENDIF.
corr_insert( iv_package ).
TRY.
" In case of IOBJ dependencies, tadir entry might be leftover so we remove it
tadir_delete( ).
CATCH zcx_abapgit_exception ##NO_HANDLER.
ENDTRY.
ENDMETHOD.
METHOD zif_abapgit_object~deserialize.
DATA:
lr_details TYPE REF TO data,
lr_infoobj TYPE REF TO data,
ls_return TYPE bapiret2,
lt_return TYPE STANDARD TABLE OF bapiret2,
lr_compounds TYPE REF TO data,
lr_attributes TYPE REF TO data,
lr_navigationattributes TYPE REF TO data,
lr_atrnavinfoprovider TYPE REF TO data,
lr_hierarchycharacteristics TYPE REF TO data,
lr_elimination TYPE REF TO data,
lr_hanafieldsmapping TYPE REF TO data,
lr_xxlattributes TYPE REF TO data.
FIELD-SYMBOLS:
<lg_details> TYPE any,
<lt_compounds> TYPE STANDARD TABLE,
<lt_attributes> TYPE STANDARD TABLE,
<lt_navigationattributes> TYPE STANDARD TABLE,
<lt_atrnavinfoprovider> TYPE STANDARD TABLE,
<lt_hierarchycharacteristics> TYPE STANDARD TABLE,
<lt_elimination> TYPE STANDARD TABLE,
<lt_hanafieldsmapping> TYPE STANDARD TABLE,
<lt_xxlattributes> TYPE STANDARD TABLE,
<lg_infoobject> TYPE data,
<lt_infoobjects> TYPE STANDARD TABLE.
CREATE DATA lr_details TYPE ('BAPI6108').
CREATE DATA lr_compounds TYPE STANDARD TABLE OF ('BAPI6108CM').
CREATE DATA lr_attributes TYPE STANDARD TABLE OF ('BAPI6108AT').
CREATE DATA lr_navigationattributes TYPE STANDARD TABLE OF ('BAPI6108AN').
CREATE DATA lr_atrnavinfoprovider TYPE STANDARD TABLE OF ('BAPI6108NP').
CREATE DATA lr_hierarchycharacteristics TYPE STANDARD TABLE OF ('BAPI6108HC').
CREATE DATA lr_elimination TYPE STANDARD TABLE OF ('BAPI6108IE').
CREATE DATA lr_hanafieldsmapping TYPE STANDARD TABLE OF ('BAPI6108HANA_MAP').
CREATE DATA lr_xxlattributes TYPE STANDARD TABLE OF ('BAPI6108ATXXL').
CREATE DATA lr_infoobj TYPE STANDARD TABLE OF ('BAPI6108').
ASSIGN lr_details->* TO <lg_details>.
ASSIGN lr_compounds->* TO <lt_compounds>.
ASSIGN lr_attributes->* TO <lt_attributes>.
ASSIGN lr_navigationattributes->* TO <lt_navigationattributes>.
ASSIGN lr_atrnavinfoprovider->* TO <lt_atrnavinfoprovider>.
ASSIGN lr_hierarchycharacteristics->* TO <lt_hierarchycharacteristics>.
ASSIGN lr_elimination->* TO <lt_elimination>.
ASSIGN lr_hanafieldsmapping->* TO <lt_hanafieldsmapping>.
ASSIGN lr_xxlattributes->* TO <lt_xxlattributes>.
ASSIGN lr_infoobj->* TO <lt_infoobjects>.
io_xml->read( EXPORTING iv_name = 'IOBJ'
CHANGING cg_data = <lg_details> ).
io_xml->read( EXPORTING iv_name = 'COMPOUNDS'
CHANGING cg_data = <lt_compounds> ).
io_xml->read( EXPORTING iv_name = 'ATTRIBUTES'
CHANGING cg_data = <lt_attributes> ).
io_xml->read( EXPORTING iv_name = 'NAVIGATION_ATTRIBUTES'
CHANGING cg_data = <lt_navigationattributes> ).
io_xml->read( EXPORTING iv_name = 'ATTR_NAVIGATION'
CHANGING cg_data = <lt_atrnavinfoprovider> ).
io_xml->read( EXPORTING iv_name = 'HIERARCHY'
CHANGING cg_data = <lt_hierarchycharacteristics> ).
io_xml->read( EXPORTING iv_name = 'ELIMINATION'
CHANGING cg_data = <lt_elimination> ).
io_xml->read( EXPORTING iv_name = 'HANA_FIELDS_MAPPING'
CHANGING cg_data = <lt_hanafieldsmapping> ).
io_xml->read( EXPORTING iv_name = 'XXL_ATTRIBUTES'
CHANGING cg_data = <lt_xxlattributes> ).
" Number ranges are local (should not have been serialized)
clear_field( EXPORTING iv_fieldname = 'NUMBRANR'
CHANGING cg_metadata = <lg_details> ).
TRY.
ASSIGN
COMPONENT 'INFOOBJECT'
OF STRUCTURE <lg_details>
TO <lg_infoobject>.
ASSERT sy-subrc = 0.
IF zif_abapgit_object~exists( ) = abap_false.
TRY.
CALL FUNCTION 'BAPI_IOBJ_CREATE'
EXPORTING
details = <lg_details>
IMPORTING
return = ls_return
TABLES
compounds = <lt_compounds>
attributes = <lt_attributes>
navigationattributes = <lt_navigationattributes>
atrnavinfoprovider = <lt_atrnavinfoprovider>
hierarchycharacteristics = <lt_hierarchycharacteristics>
elimination = <lt_elimination>
hanafieldsmapping = <lt_hanafieldsmapping>
xxlattributes = <lt_xxlattributes> ##ARG_OK.
CATCH cx_sy_dyn_call_param_not_found.
CALL FUNCTION 'BAPI_IOBJ_CREATE'
EXPORTING
details = <lg_details>
IMPORTING
return = ls_return
TABLES
compounds = <lt_compounds>
attributes = <lt_attributes>
navigationattributes = <lt_navigationattributes>
atrnavinfoprovider = <lt_atrnavinfoprovider>
hierarchycharacteristics = <lt_hierarchycharacteristics>
elimination = <lt_elimination>.
ENDTRY.
ELSE.
TRY.
CALL FUNCTION 'BAPI_IOBJ_CHANGE'
EXPORTING
infoobject = <lg_infoobject>
details = <lg_details>
IMPORTING
return = ls_return
TABLES
compounds = <lt_compounds>
attributes = <lt_attributes>
navigationattributes = <lt_navigationattributes>
atrnavinfoprovider = <lt_atrnavinfoprovider>
hierarchycharacteristics = <lt_hierarchycharacteristics>
elimination = <lt_elimination>
hanafieldsmapping = <lt_hanafieldsmapping>
xxlattributes = <lt_xxlattributes> ##ARG_OK.
CATCH cx_sy_dyn_call_param_not_found.
CALL FUNCTION 'BAPI_IOBJ_CHANGE'
EXPORTING
infoobject = <lg_infoobject>
details = <lg_details>
IMPORTING
return = ls_return
TABLES
compounds = <lt_compounds>
attributes = <lt_attributes>
navigationattributes = <lt_navigationattributes>
atrnavinfoprovider = <lt_atrnavinfoprovider>
hierarchycharacteristics = <lt_hierarchycharacteristics>
elimination = <lt_elimination>.
ENDTRY.
ENDIF.
IF ls_return-type = 'E'.
zcx_abapgit_exception=>raise( |Error when creating iobj: { ls_return-message }| ).
ENDIF.
APPEND <lg_infoobject> TO <lt_infoobjects>.
CALL FUNCTION 'BAPI_IOBJ_ACTIVATE_MULTIPLE'
TABLES
infoobjects = <lt_infoobjects>
return = lt_return.
READ TABLE lt_return WITH KEY type = 'E' INTO ls_return.
IF sy-subrc = 0.
zcx_abapgit_exception=>raise( |Error when activating iobj: { ls_return-message }| ).
ENDIF.
CATCH cx_sy_dyn_call_illegal_func.
zcx_abapgit_exception=>raise( |Necessary BW function modules not found| ).
ENDTRY.
tadir_insert( iv_package ).
corr_insert( iv_package ).
ENDMETHOD.
METHOD zif_abapgit_object~exists.
DATA: lv_iobjnm TYPE c LENGTH 30.
SELECT SINGLE iobjnm
FROM ('RSDIOBJ')
INTO lv_iobjnm
WHERE iobjnm = 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_order.
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.
DATA: lv_objna TYPE c LENGTH 30,
lr_viobj TYPE REF TO data.
FIELD-SYMBOLS:
<lg_objstat> TYPE any,
<lg_viobj> TYPE any.
lv_objna = ms_item-obj_name.
CREATE DATA lr_viobj TYPE ('RSD_S_VIOBJ').
ASSIGN lr_viobj->* TO <lg_viobj>.
CALL FUNCTION 'RSD_IOBJ_GET'
EXPORTING
i_iobjnm = lv_objna
i_objvers = 'A'
IMPORTING
e_s_viobj = <lg_viobj>.
ASSIGN COMPONENT 'OBJSTAT' OF STRUCTURE <lg_viobj> TO <lg_objstat>.
IF <lg_objstat> = 'ACT' AND sy-subrc = 0.
rv_active = abap_true.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_object~is_locked.
DATA: lv_object TYPE eqegraarg.
lv_object = ms_item-obj_name.
OVERLAY lv_object WITH ' '.
lv_object = lv_object && '*'.
rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'E_BIW_PROV'
iv_argument = lv_object ).
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:
lv_iobjnam TYPE rsiobjnm,
ls_return TYPE bapiret2,
lr_details TYPE REF TO data,
lr_compounds TYPE REF TO data,
lr_attributes TYPE REF TO data,
lr_navigationattributes TYPE REF TO data,
lr_atrnavinfoprovider TYPE REF TO data,
lr_hierarchycharacteristics TYPE REF TO data,
lr_elimination TYPE REF TO data,
lr_hanafieldsmapping TYPE REF TO data,
lr_xxlattributes TYPE REF TO data.
FIELD-SYMBOLS:
<lg_details> TYPE any,
<lt_compounds> TYPE STANDARD TABLE,
<lt_attributes> TYPE STANDARD TABLE,
<lt_navigationattributes> TYPE STANDARD TABLE,
<lt_atrnavinfoprovider> TYPE STANDARD TABLE,
<lt_hierarchycharacteristics> TYPE STANDARD TABLE,
<lt_elimination> TYPE STANDARD TABLE,
<lt_hanafieldsmapping> TYPE STANDARD TABLE,
<lt_xxlattributes> TYPE STANDARD TABLE.
CREATE DATA lr_details TYPE ('BAPI6108').
CREATE DATA lr_compounds TYPE STANDARD TABLE OF ('BAPI6108CM').
CREATE DATA lr_attributes TYPE STANDARD TABLE OF ('BAPI6108AT').
CREATE DATA lr_navigationattributes TYPE STANDARD TABLE OF ('BAPI6108AN').
CREATE DATA lr_atrnavinfoprovider TYPE STANDARD TABLE OF ('BAPI6108NP').
CREATE DATA lr_hierarchycharacteristics TYPE STANDARD TABLE OF ('BAPI6108HC').
CREATE DATA lr_elimination TYPE STANDARD TABLE OF ('BAPI6108IE').
CREATE DATA lr_hanafieldsmapping TYPE STANDARD TABLE OF ('BAPI6108HANA_MAP').
CREATE DATA lr_xxlattributes TYPE STANDARD TABLE OF ('BAPI6108ATXXL').
ASSIGN lr_details->* TO <lg_details>.
ASSIGN lr_compounds->* TO <lt_compounds>.
ASSIGN lr_attributes->* TO <lt_attributes>.
ASSIGN lr_navigationattributes->* TO <lt_navigationattributes>.
ASSIGN lr_atrnavinfoprovider->* TO <lt_atrnavinfoprovider>.
ASSIGN lr_hierarchycharacteristics->* TO <lt_hierarchycharacteristics>.
ASSIGN lr_elimination->* TO <lt_elimination>.
ASSIGN lr_hanafieldsmapping->* TO <lt_hanafieldsmapping>.
ASSIGN lr_xxlattributes->* TO <lt_xxlattributes>.
lv_iobjnam = ms_item-obj_name.
TRY.
CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
EXPORTING
infoobject = lv_iobjnam
IMPORTING
details = <lg_details>
return = ls_return
TABLES
compounds = <lt_compounds>
attributes = <lt_attributes>
navigationattributes = <lt_navigationattributes>
atrnavinfoprovider = <lt_atrnavinfoprovider>
hierarchycharacteristics = <lt_hierarchycharacteristics>
elimination = <lt_elimination>
hanafieldsmapping = <lt_hanafieldsmapping>
xxlattributes = <lt_xxlattributes> ##ARG_OK.
CATCH cx_sy_dyn_call_param_not_found.
CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
EXPORTING
infoobject = lv_iobjnam
IMPORTING
details = <lg_details>
return = ls_return
TABLES
compounds = <lt_compounds>
attributes = <lt_attributes>
navigationattributes = <lt_navigationattributes>
atrnavinfoprovider = <lt_atrnavinfoprovider>
hierarchycharacteristics = <lt_hierarchycharacteristics>
elimination = <lt_elimination>.
ENDTRY.
IF ls_return-type = 'E'.
zcx_abapgit_exception=>raise( |Error getting details of InfoObject: { ls_return-message }| ).
ENDIF.
clear_field( EXPORTING iv_fieldname = 'TSTPNM'
CHANGING cg_metadata = <lg_details> ).
clear_field( EXPORTING iv_fieldname = 'TIMESTMP'
CHANGING cg_metadata = <lg_details> ).
clear_field( EXPORTING iv_fieldname = 'DBROUTID'
CHANGING cg_metadata = <lg_details> ).
" Number ranges are local
clear_field( EXPORTING iv_fieldname = 'NUMBRANR'
CHANGING cg_metadata = <lg_details> ).
io_xml->add( iv_name = 'IOBJ'
ig_data = <lg_details> ).
io_xml->add( iv_name = 'COMPOUNDS'
ig_data = <lt_compounds> ).
io_xml->add( iv_name = 'ATTRIBUTES'
ig_data = <lt_attributes> ).
io_xml->add( iv_name = 'NAVIGATION_ATTRIBUTES'
ig_data = <lt_navigationattributes> ).
io_xml->add( iv_name = 'ATTR_NAVIGATION'
ig_data = <lt_atrnavinfoprovider> ).
io_xml->add( iv_name = 'HIERARCHY'
ig_data = <lt_hierarchycharacteristics> ).
io_xml->add( iv_name = 'ELIMINATION'
ig_data = <lt_elimination> ).
io_xml->add( iv_name = 'HANA_FIELDS_MAPPING'
ig_data = <lt_hanafieldsmapping> ).
io_xml->add( iv_name = 'XXL_ATTRIBUTES'
ig_data = <lt_xxlattributes> ).
ENDMETHOD.
ENDCLASS.