diff --git a/docs/ref-supported.md b/docs/ref-supported.md index 6461602cb..0e5a883be 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -7,6 +7,7 @@ order: 20 Type | Description | Supported :------------ | :------------ | ------------: ACID | Checkpoint Group | Yes +AMSD | Logical Database Schema AOBJ | Archiving Object | [#804](https://github.com/larshp/abapGit/issues/804) AREA | InfoArea | Yes ASFC | Field Catalog | Yes diff --git a/src/objects/zcl_abapgit_object_amsd.clas.abap b/src/objects/zcl_abapgit_object_amsd.clas.abap new file mode 100644 index 000000000..54681664c --- /dev/null +++ b/src/objects/zcl_abapgit_object_amsd.clas.abap @@ -0,0 +1,415 @@ +CLASS zcl_abapgit_object_amsd DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. + + PUBLIC SECTION. + INTERFACES zif_abapgit_object. + ALIASES mo_files FOR zif_abapgit_object~mo_files. + METHODS: + constructor + IMPORTING + is_item TYPE zif_abapgit_definitions=>ty_item + iv_language TYPE spras + RAISING + zcx_abapgit_exception. + + PRIVATE SECTION. + METHODS: + clear_fields + CHANGING + cs_logical_db_schema TYPE any, + + clear_field + IMPORTING + iv_fieldname TYPE csequence + CHANGING + cs_logical_db_schema TYPE any, + + fill_metadata_from_db + CHANGING + cs_logical_db_schema TYPE any + RAISING + cx_wb_object_operation_error + zcx_abapgit_exception, + + get_transport_req_if_needed + IMPORTING + iv_package TYPE devclass + RETURNING + VALUE(rv_transport_request) TYPE trkorr + RAISING + zcx_abapgit_exception, + + get_wb_object_operator + RETURNING + VALUE(ri_wb_object_operator) TYPE REF TO if_wb_object_operator + RAISING + zcx_abapgit_exception. + + DATA: + mr_logical_db_schema TYPE REF TO data, + mv_logical_db_schema_key TYPE seu_objkey, + mi_persistence TYPE REF TO if_wb_object_persist, + mi_wb_object_operator TYPE REF TO if_wb_object_operator. + +ENDCLASS. + + + +CLASS zcl_abapgit_object_amsd IMPLEMENTATION. + + + METHOD clear_field. + + FIELD-SYMBOLS: TYPE data. + + ASSIGN COMPONENT iv_fieldname OF STRUCTURE cs_logical_db_schema + TO . + ASSERT sy-subrc = 0. + + CLEAR: . + + ENDMETHOD. + + + METHOD clear_fields. + + clear_field( + EXPORTING + iv_fieldname = 'METADATA-CREATED_AT' + CHANGING + cs_logical_db_schema = cs_logical_db_schema ). + + clear_field( + EXPORTING + iv_fieldname = 'METADATA-CREATED_BY' + CHANGING + cs_logical_db_schema = cs_logical_db_schema ). + + clear_field( + EXPORTING + iv_fieldname = 'METADATA-CHANGED_AT' + CHANGING + cs_logical_db_schema = cs_logical_db_schema ). + + clear_field( + EXPORTING + iv_fieldname = 'METADATA-CHANGED_BY' + CHANGING + cs_logical_db_schema = cs_logical_db_schema ). + + ENDMETHOD. + + + METHOD constructor. + + super->constructor( + is_item = is_item + iv_language = iv_language ). + + mv_logical_db_schema_key = ms_item-obj_name. + + TRY. + CREATE DATA mr_logical_db_schema TYPE ('CL_AMDP_SCHEMA_OBJECT_DATA=>TY_OBJECT_DATA'). + CREATE OBJECT mi_persistence TYPE ('CL_AMDP_SCHEMA_OBJECT_PERSIST'). + + CATCH cx_sy_create_error. + zcx_abapgit_exception=>raise( |AMSD not supported by your NW release| ). + ENDTRY. + + ENDMETHOD. + + + METHOD fill_metadata_from_db. + + DATA: + li_wb_object_operator TYPE REF TO if_wb_object_operator, + lr_logical_db_schema_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( ). + + CREATE DATA lr_logical_db_schema_old TYPE ('CL_AMDP_SCHEMA_OBJECT_DATA=>TY_OBJECT_DATA'). + ASSIGN lr_logical_db_schema_old->* TO . + ASSERT sy-subrc = 0. + + li_wb_object_operator->read( IMPORTING data = ). + + ASSIGN COMPONENT 'METADATA-CREATED_BY' OF STRUCTURE cs_logical_db_schema + TO . + ASSERT sy-subrc = 0. + + ASSIGN COMPONENT 'METADATA-CREATED_AT' OF STRUCTURE cs_logical_db_schema + 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_transport_req_if_needed. + + DATA: li_sap_package TYPE REF TO zif_abapgit_sap_package. + + li_sap_package = zcl_abapgit_factory=>get_sap_package( iv_package ). + + IF li_sap_package->are_changes_recorded_in_tr_req( ) = abap_true. + rv_transport_request = zcl_abapgit_default_transport=>get_instance( )->get( )-ordernum. + ENDIF. + + ENDMETHOD. + + + METHOD get_wb_object_operator. + + DATA: + ls_object_type TYPE wbobjtype, + lx_error TYPE REF TO cx_wb_object_operation_error. + + IF mi_wb_object_operator IS BOUND. + ri_wb_object_operator = mi_wb_object_operator. + ENDIF. + + ls_object_type-objtype_tr = 'AMSD'. + ls_object_type-subtype_wb = 'TYP'. + + TRY. + mi_wb_object_operator = cl_wb_object_operator=>create_instance( + object_type = ls_object_type + object_key = mv_logical_db_schema_key ). + + CATCH cx_wb_object_operation_error INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = lx_error ). + ENDTRY. + + ri_wb_object_operator = mi_wb_object_operator. + + 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_wb_object_operation_error. + + TRY. + get_wb_object_operator( )->read( IMPORTING eo_object_data = li_object_data_model ). + + rv_user = li_object_data_model->get_changed_by( ). + + CATCH cx_wb_object_operation_error INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = lx_error ). + ENDTRY. + + ENDMETHOD. + + + METHOD zif_abapgit_object~delete. + + DATA: + lx_error TYPE REF TO cx_wb_object_operation_error, + lv_transport_request TYPE trkorr. + + lv_transport_request = get_transport_req_if_needed( iv_package ). + + TRY. + get_wb_object_operator( )->delete( lv_transport_request ). + + CATCH cx_wb_object_operation_error INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = 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 if_wb_object_operator, + lx_error TYPE REF TO cx_static_check, + lv_transport_request TYPE trkorr. + + FIELD-SYMBOLS: + TYPE any. + + ASSIGN mr_logical_db_schema->* TO . + ASSERT sy-subrc = 0. + + io_xml->read( + EXPORTING + iv_name = 'AMSD' + CHANGING + cg_data = ). + + li_wb_object_operator = get_wb_object_operator( ). + + TRY. + CREATE OBJECT li_object_data_model TYPE ('CL_AMDP_SCHEMA_OBJECT_DATA'). + + tadir_insert( iv_package ). + + lv_transport_request = get_transport_req_if_needed( 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_logical_db_schema = ). + li_object_data_model->set_data( ). + + li_wb_object_operator->update( + io_object_data = li_object_data_model + transport_request = lv_transport_request ). + + ELSE. + + li_object_data_model->set_data( ). + + li_wb_object_operator->create( + io_object_data = li_object_data_model + data_selection = if_wb_object_data_selection_co=>c_properties + package = iv_package + transport_request = lv_transport_request ). + + li_wb_object_operator->update( + io_object_data = li_object_data_model + data_selection = if_wb_object_data_selection_co=>c_data_content + transport_request = lv_transport_request ). + + ENDIF. + + li_wb_object_operator->activate( ). + + corr_insert( iv_package ). + + CATCH cx_swb_exception cx_wb_object_operation_error INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = lx_error ). + ENDTRY. + + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + TRY. + mi_persistence->get( + p_object_key = mv_logical_db_schema_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_steps. + APPEND zif_abapgit_object=>gc_step_id-ddic TO rt_steps. + ENDMETHOD. + + + METHOD zif_abapgit_object~get_metadata. + rs_metadata = get_metadata( ). + + rs_metadata-ddic = abap_true. + rs_metadata-delete_tadir = abap_true. + 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. + + CALL FUNCTION 'RS_TOOL_ACCESS' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type + in_new_window = abap_true + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |RC={ sy-subrc } from RS_TOOL_ACCESS| ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + + DATA: + li_object_data_model TYPE REF TO if_wb_object_data_model, + lx_error TYPE REF TO cx_wb_object_operation_error. + + FIELD-SYMBOLS: + TYPE any. + + ASSIGN mr_logical_db_schema->* TO . + ASSERT sy-subrc = 0. + + TRY. + get_wb_object_operator( )->read( + EXPORTING + version = 'A' + IMPORTING + data = + eo_object_data = li_object_data_model ). + + clear_fields( CHANGING cs_logical_db_schema = ). + + CATCH cx_wb_object_operation_error INTO lx_error. + zcx_abapgit_exception=>raise( + iv_text = lx_error->get_text( ) + ix_previous = lx_error ). + ENDTRY. + + io_xml->add( + iv_name = 'AMSD' + ig_data = ). + + ENDMETHOD. +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_amsd.clas.xml b/src/objects/zcl_abapgit_object_amsd.clas.xml new file mode 100644 index 000000000..ede046582 --- /dev/null +++ b/src/objects/zcl_abapgit_object_amsd.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_OBJECT_AMSD + E + AMSD Logical Database Schema + 1 + X + X + X + + + +