CLASS zcl_abapgit_object_ddls DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. INTERFACES zif_abapgit_object. ALIASES mo_files FOR zif_abapgit_object~mo_files. PROTECTED SECTION. METHODS open_adt_stob IMPORTING iv_ddls_name TYPE tadir-obj_name RAISING zcx_abapgit_exception. PRIVATE SECTION. METHODS is_baseinfo_supported RETURNING VALUE(rv_supported) TYPE abap_bool . METHODS read_baseinfo RETURNING VALUE(rv_baseinfo_string) TYPE string. ENDCLASS. CLASS zcl_abapgit_object_ddls IMPLEMENTATION. METHOD is_baseinfo_supported. DATA: lr_data_baseinfo TYPE REF TO data, lx_error TYPE REF TO cx_root. TRY. CREATE DATA lr_data_baseinfo TYPE ('IF_DD_DDL_TYPES=>TY_S_BASEINFO_STRING_SAVE'). rv_supported = abap_true. CATCH cx_root INTO lx_error. rv_supported = abap_false. ENDTRY. ENDMETHOD. METHOD open_adt_stob. DATA: lr_data TYPE REF TO data, lo_ddl TYPE REF TO object, lx_error TYPE REF TO cx_root. FIELD-SYMBOLS: TYPE STANDARD TABLE. FIELD-SYMBOLS: TYPE STANDARD TABLE. FIELD-SYMBOLS: TYPE any. FIELD-SYMBOLS: TYPE any. FIELD-SYMBOLS: TYPE any. FIELD-SYMBOLS: TYPE any. TRY. CREATE DATA lr_data TYPE ('IF_DD_DDL_TYPES=>TY_T_DDOBJ'). ASSIGN lr_data->* TO . CREATE DATA lr_data LIKE LINE OF . ASSIGN lr_data->* TO . CREATE DATA lr_data TYPE ('IF_DD_DDL_TYPES=>TY_T_ENTITY_OF_VIEW'). ASSIGN lr_data->* TO . CREATE DATA lr_data LIKE LINE OF . ASSIGN lr_data->* TO . CLEAR . ASSIGN COMPONENT 'NAME' OF STRUCTURE TO . = iv_ddls_name. INSERT INTO TABLE . CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~GET_VIEWNAME_FROM_ENTITYNAME') EXPORTING ddnames = IMPORTING view_of_entity = . READ TABLE ASSIGNING INDEX 1. IF sy-subrc = 0. ASSIGN COMPONENT 'DDLNAME' OF STRUCTURE TO . jump_adt( iv_obj_name = iv_obj_type = 'DDLS' ). ENDIF. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. ENDMETHOD. METHOD read_baseinfo. TRY. rv_baseinfo_string = mo_files->read_string( 'baseinfo' ). CATCH zcx_abapgit_exception. " File not found. That's ok, as the object could have been created in a " system where baseinfo wasn't supported. RETURN. ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~changed_by. DATA: lo_ddl TYPE REF TO object, lr_data TYPE REF TO data, lx_error TYPE REF TO cx_root. FIELD-SYMBOLS: TYPE any, TYPE any. CREATE DATA lr_data TYPE ('DDDDLSRCV'). ASSIGN lr_data->* TO . CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. TRY. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~READ') EXPORTING name = ms_item-obj_name get_state = 'A' IMPORTING ddddlsrcv_wa = . ASSIGN COMPONENT 'AS4USER' OF STRUCTURE TO . IF sy-subrc = 0. rv_user = . ENDIF. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. IF rv_user IS INITIAL. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lo_ddl TYPE REF TO object, lx_error TYPE REF TO cx_root. CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. TRY. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~DELETE') EXPORTING name = ms_item-obj_name. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = |DDLS, { ms_item-obj_name } { lx_error->get_text( ) }| ix_previous = lx_error ). ENDTRY. ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: lo_ddl TYPE REF TO object, lr_data TYPE REF TO data, lr_data_baseinfo TYPE REF TO data, lx_error TYPE REF TO cx_root. FIELD-SYMBOLS: TYPE any, TYPE any, TYPE any, TYPE any, TYPE any. TRY. CREATE DATA lr_data TYPE ('DDDDLSRCV'). ASSIGN lr_data->* TO . io_xml->read( EXPORTING iv_name = 'DDLS' CHANGING cg_data = ). ASSIGN COMPONENT 'SOURCE' OF STRUCTURE TO . ASSERT sy-subrc = 0. = mo_files->read_string( 'asddls' ). CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. IF is_baseinfo_supported( ) = abap_true. CREATE DATA lr_data_baseinfo TYPE ('IF_DD_DDL_TYPES=>TY_S_BASEINFO_STRING_SAVE'). ASSIGN lr_data_baseinfo->* TO . ASSIGN COMPONENT 'BASEINFO_STRING' OF STRUCTURE TO . ASSERT sy-subrc = 0. = read_baseinfo( ). ASSIGN COMPONENT 'DDLNAME' OF STRUCTURE TO . ASSERT sy-subrc = 0. = ms_item-obj_name. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~SAVE') EXPORTING name = ms_item-obj_name put_state = 'N' ddddlsrcv_wa = baseinfo_string = . ELSE. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~SAVE') EXPORTING name = ms_item-obj_name put_state = 'N' ddddlsrcv_wa = . ENDIF. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~WRITE_TADIR') EXPORTING objectname = ms_item-obj_name devclass = iv_package prid = 0. corr_insert( iv_package ). CATCH cx_root INTO lx_error. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~DELETE') EXPORTING name = ms_item-obj_name prid = 0. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. zcl_abapgit_objects_activation=>add_item( ms_item ). ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_state TYPE objstate, lo_ddl TYPE REF TO object. CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. TRY. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~READ') EXPORTING name = ms_item-obj_name IMPORTING got_state = lv_state. rv_bool = boolc( NOT lv_state IS INITIAL ). CATCH cx_root. 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 = 'ESDICT' iv_argument = |{ ms_item-obj_type }{ ms_item-obj_name }| ). ENDMETHOD. METHOD zif_abapgit_object~jump. DATA: lv_typename TYPE typename. DATA: lv_ddtypekind TYPE ddtypekind. lv_typename = ms_item-obj_name. CALL FUNCTION 'DDIF_TYPEINFO_GET' EXPORTING typename = lv_typename IMPORTING typekind = lv_ddtypekind. CASE lv_ddtypekind. WHEN 'STOB'. open_adt_stob( ms_item-obj_name ). WHEN OTHERS. zcx_abapgit_exception=>raise( 'DDLS Jump Error' ). ENDCASE. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: lo_ddl TYPE REF TO object, lr_data TYPE REF TO data, lr_data_baseinfo TYPE REF TO data, lt_clr_comps TYPE STANDARD TABLE OF fieldname WITH DEFAULT KEY, lx_error TYPE REF TO cx_root. FIELD-SYMBOLS: TYPE any, TYPE any, LIKE LINE OF lt_clr_comps, TYPE ANY TABLE, TYPE any, TYPE any, TYPE any. TRY. CREATE DATA lr_data TYPE ('DDDDLSRCV'). ASSIGN lr_data->* TO . CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. IF is_baseinfo_supported( ) = abap_true. CREATE DATA lr_data_baseinfo TYPE ('IF_DD_DDL_TYPES=>TY_T_BASEINFO_STRING'). ASSIGN lr_data_baseinfo->* TO . ASSIGN lr_data_baseinfo->* TO . CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~READ') EXPORTING name = ms_item-obj_name get_state = 'A' IMPORTING ddddlsrcv_wa = baseinfo_string = . LOOP AT ASSIGNING . ASSIGN COMPONENT 'DDLNAME' OF STRUCTURE TO . ASSERT sy-subrc = 0. ASSIGN COMPONENT 'AS4LOCAL' OF STRUCTURE TO . ASSERT sy-subrc = 0. IF = ms_item-obj_name AND = 'A'. ASSIGN COMPONENT 'BASEINFO_STRING' OF STRUCTURE TO . ASSERT sy-subrc = 0. mo_files->add_string( iv_ext = 'baseinfo' iv_string = ). EXIT. ENDIF. ENDLOOP. ELSE. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~READ') EXPORTING name = ms_item-obj_name get_state = 'A' IMPORTING ddddlsrcv_wa = . ENDIF. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise( iv_text = lx_error->get_text( ) ix_previous = lx_error ). ENDTRY. APPEND 'AS4USER' TO lt_clr_comps. APPEND 'AS4DATE' TO lt_clr_comps. APPEND 'AS4TIME' TO lt_clr_comps. APPEND 'ACTFLAG' TO lt_clr_comps. APPEND 'CHGFLAG' TO lt_clr_comps. APPEND 'ABAP_LANGUAGE_VERSION' TO lt_clr_comps. LOOP AT lt_clr_comps ASSIGNING . ASSIGN COMPONENT OF STRUCTURE TO . IF sy-subrc = 0. CLEAR . ENDIF. ENDLOOP. ASSIGN COMPONENT 'SOURCE' OF STRUCTURE TO . ASSERT sy-subrc = 0. mo_files->add_string( iv_ext = 'asddls' iv_string = ). CLEAR . io_xml->add( iv_name = 'DDLS' ig_data = ). ENDMETHOD. ENDCLASS.