CLASS zcl_abapgit_object_ddls 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_exception. 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. METHODS format_source_before_serialize CHANGING cv_string TYPE string. ENDCLASS. CLASS zcl_abapgit_object_ddls IMPLEMENTATION. METHOD constructor. DATA lo_ddl TYPE REF TO object. super->constructor( is_item = is_item iv_language = iv_language io_files = io_files io_i18n_params = io_i18n_params ). TRY. CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. CATCH cx_root. zcx_abapgit_exception=>raise( 'Object type DDLS is not supported by this system' ). ENDTRY. ENDMETHOD. METHOD format_source_before_serialize. DATA: lv_len TYPE i, lv_lastchar1 TYPE c, lv_lastchar2 TYPE c. " New line included in 751+ by CL_DD_DDL_HANDLER=>ADD_BASEOBJS_INFO_TO_DDLS " Change for 750- lv_len = strlen( cv_string ) - 1. IF lv_len < 0. RETURN. ENDIF. lv_lastchar1 = cv_string+lv_len(1). lv_len = strlen( cv_string ) - 2. IF lv_len < 0. RETURN. ENDIF. lv_lastchar2 = cv_string+lv_len(1). " only add a line break, if the last character is unequal to cr_lf and newline ! IF lv_lastchar1 <> cl_abap_char_utilities=>cr_lf AND lv_lastchar1 <> cl_abap_char_utilities=>newline AND lv_lastchar1 <> space OR ( lv_lastchar1 = space AND ( lv_lastchar2 <> cl_abap_char_utilities=>cr_lf AND lv_lastchar2 <> cl_abap_char_utilities=>newline ) ). cv_string = |{ cv_string }{ cl_abap_char_utilities=>cr_lf }|. ENDIF. ENDMETHOD. 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 . zcl_abapgit_adt_link=>jump( iv_obj_name = iv_obj_type = 'DDLS' ). ENDIF. CATCH cx_root INTO lx_error. zcx_abapgit_exception=>raise_with_text( 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. TRY. CREATE DATA lr_data TYPE ('DDDDLSRCV'). ASSIGN lr_data->* TO . CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. 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_with_text( lx_error ). ENDTRY. IF rv_user IS INITIAL. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lt_deltab TYPE TABLE OF dcdeltb, ls_deltab TYPE dcdeltb, lt_gentab TYPE TABLE OF dcgentb, lv_rc TYPE sy-subrc. " CL_DD_DDL_HANDLER->DELETE does not work for CDS views that reference other views " To drop any views regardless of reference, we use delnoref = false ls_deltab-objtyp = 'DDLS'. ls_deltab-objname = ms_item-obj_name. APPEND ls_deltab TO lt_deltab. CALL FUNCTION 'DD_MASS_ACT_C3' EXPORTING ddmode = 'O' inactive = abap_true write_log = abap_false delall = abap_true delnoref = abap_false prid = -1 IMPORTING act_rc = lv_rc TABLES gentab = lt_gentab deltab = lt_deltab EXCEPTIONS access_failure = 1 no_objects = 2 locked = 3 OTHERS = 4. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. corr_insert( iv_package ). " rebuild object list to delete remaining TADIR entry CALL FUNCTION 'WB_TREE_UPDATE_OBJECTLIST' EXPORTING p_object_type = 'DF' p_object_name = ms_item-obj_name p_operation = 'DELETE' EXCEPTIONS OTHERS = 0. 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, 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' ). ASSIGN COMPONENT 'ABAP_LANGUAGE_VERSION' OF STRUCTURE TO . IF sy-subrc = 0. set_abap_language_version( CHANGING cv_abap_language_version = ). ENDIF. 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. TRY. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~SAVE') EXPORTING name = ms_item-obj_name put_state = 'N' ddddlsrcv_wa = baseinfo_string = save_language_version = abap_true. CATCH cx_sy_dyn_call_param_not_found. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~SAVE') EXPORTING name = ms_item-obj_name put_state = 'N' ddddlsrcv_wa = baseinfo_string = . ENDTRY. 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. IF lo_ddl IS NOT INITIAL. " Attempt clean-up but catch error if it doesn't work TRY. CALL METHOD lo_ddl->('IF_DD_DDL_HANDLER~DELETE') EXPORTING name = ms_item-obj_name prid = 0. CATCH cx_root ##NO_HANDLER. ENDTRY. ENDIF. zcx_abapgit_exception=>raise_with_text( 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. TRY. CALL METHOD ('CL_DD_DDL_HANDLER_FACTORY')=>('CREATE') RECEIVING handler = lo_ddl. 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_order. 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( ). 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. IF lv_ddtypekind = 'STOB'. open_adt_stob( ms_item-obj_name ). rv_exit = abap_true. ENDIF. 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: 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, 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_with_text( lx_error ). ENDTRY. ASSIGN COMPONENT 'ABAP_LANGUAGE_VERSION' OF STRUCTURE TO . IF sy-subrc = 0. clear_abap_language_version( CHANGING cv_abap_language_version = ). ENDIF. 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_LANGU_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. format_source_before_serialize( CHANGING cv_string = ). mo_files->add_string( iv_ext = 'asddls' iv_string = ). CLEAR . io_xml->add( iv_name = 'DDLS' ig_data = ). ENDMETHOD. ENDCLASS.