CLASS zcl_abapgit_object_tran 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. PRIVATE SECTION. TYPES: tty_param_values TYPE STANDARD TABLE OF rsparam WITH NON-UNIQUE DEFAULT KEY . CONSTANTS: c_oo_program(9) VALUE '\PROGRAM=' ##NO_TEXT. CONSTANTS: c_oo_class(7) VALUE '\CLASS=' ##NO_TEXT. CONSTANTS: c_oo_method(8) VALUE '\METHOD=' ##NO_TEXT. CONSTANTS c_oo_tcode TYPE tcode VALUE 'OS_APPLICATION' ##NO_TEXT. CONSTANTS: c_oo_frclass(30) VALUE 'CLASS' ##NO_TEXT. CONSTANTS: c_oo_frmethod(30) VALUE 'METHOD' ##NO_TEXT. CONSTANTS: c_oo_frupdtask(30) VALUE 'UPDATE_MODE' ##NO_TEXT. CONSTANTS c_oo_synchron TYPE c VALUE 'S' ##NO_TEXT. CONSTANTS c_oo_asynchron TYPE c VALUE 'U' ##NO_TEXT. CONSTANTS c_true TYPE c VALUE 'X' ##NO_TEXT. CONSTANTS c_false TYPE c VALUE space ##NO_TEXT. DATA: mt_bcdata TYPE STANDARD TABLE OF bdcdata . METHODS shift_param CHANGING !ct_rsparam TYPE s_param !cs_tstcp TYPE tstcp . METHODS add_data IMPORTING !iv_fnam TYPE bdcdata-fnam !iv_fval TYPE clike . METHODS call_se93 RAISING zcx_abapgit_exception . METHODS set_oo_parameters IMPORTING !it_rsparam TYPE s_param CHANGING !cs_rsstcd TYPE rsstcd . METHODS split_parameters CHANGING !ct_rsparam TYPE s_param !cs_rsstcd TYPE rsstcd !cs_tstcp TYPE tstcp !cs_tstc TYPE tstc . METHODS split_parameters_comp IMPORTING !ig_type TYPE any !ig_param TYPE any CHANGING !cg_value TYPE any . METHODS serialize_texts IMPORTING !io_xml TYPE REF TO zcl_abapgit_xml_output RAISING zcx_abapgit_exception . METHODS deserialize_texts IMPORTING !io_xml TYPE REF TO zcl_abapgit_xml_input RAISING zcx_abapgit_exception . METHODS deserialize_oo_transaction IMPORTING !iv_package TYPE devclass !is_tstc TYPE tstc !is_tstcc TYPE tstcc !is_tstct TYPE tstct !is_rsstcd TYPE rsstcd RAISING zcx_abapgit_exception . ENDCLASS. CLASS ZCL_ABAPGIT_OBJECT_TRAN IMPLEMENTATION. METHOD add_data. DATA: ls_bcdata LIKE LINE OF mt_bcdata. ls_bcdata-fnam = iv_fnam. ls_bcdata-fval = iv_fval. APPEND ls_bcdata TO mt_bcdata. ENDMETHOD. METHOD call_se93. DATA: lt_message TYPE STANDARD TABLE OF bdcmsgcoll. FIELD-SYMBOLS: TYPE bdcmsgcoll. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = 'SE93' mode_val = 'N' TABLES using_tab = mt_bcdata mess_tab = lt_message EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error deserializing { ms_item-obj_type } { ms_item-obj_name }| ). ENDIF. LOOP AT lt_message ASSIGNING WHERE msgtyp CA 'EAX'. MESSAGE ID -msgid TYPE -msgtyp NUMBER -msgnr WITH -msgv1 -msgv2 -msgv3 -msgv4 INTO sy-msgli. zcx_abapgit_exception=>raise_t100( ). ENDLOOP. ENDMETHOD. METHOD deserialize_oo_transaction. " You should remember that we don't use batch input just for fun, " but because FM RPY_TRANSACTION_INSERT doesn't support OO transactions. DATA: ls_bcdata TYPE bdcdata. CLEAR mt_bcdata. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0390'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'TSTC-TCODE' iv_fval = is_tstc-tcode ). IF zif_abapgit_object~exists( ) = abap_true. add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=CHNG' ). ELSE. add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=ADD' ). ENDIF. ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0300'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'TSTCT-TTEXT' iv_fval = is_tstct-ttext ). add_data( iv_fnam = 'RSSTCD-S_CLASS' iv_fval = 'X' ). add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=ENTR' ). ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'RSSTCD-S_TRFRAME' iv_fval = is_rsstcd-s_trframe ). add_data( iv_fnam = 'RSSTCD-S_UPDTASK' iv_fval = is_rsstcd-s_updtask ). add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=TR_FRAMEWORK' ). ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'RSSTCD-CLASSNAME' iv_fval = is_rsstcd-classname ). add_data( iv_fnam = 'RSSTCD-METHOD' iv_fval = is_rsstcd-method ). IF is_rsstcd-s_local IS NOT INITIAL. add_data( iv_fnam = 'RSSTCD-S_LOCAL' iv_fval = is_rsstcd-s_local ). ENDIF. IF is_rsstcd-s_updlok IS NOT INITIAL. add_data( iv_fnam = 'RSSTCD-S_UPDLOK' iv_fval = is_rsstcd-s_updlok ). ENDIF. add_data( iv_fnam = 'TSTC-PGMNA' iv_fval = is_tstc-pgmna ). IF is_tstcc-s_webgui = '2'. add_data( iv_fnam = 'G_IAC_EWT' iv_fval = abap_true ). add_data( iv_fnam = 'BDC_OKCODE' iv_fval = 'MAKE_PROFI' ). ls_bcdata-program = 'SAPLSEUK'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. ELSEIF is_tstcc-s_webgui IS NOT INITIAL. add_data( iv_fnam = 'TSTCC-S_WEBGUI' iv_fval = is_tstcc-s_webgui ). ENDIF. IF is_tstcc-s_pervas IS NOT INITIAL. add_data( iv_fnam = 'TSTCC-S_PERVAS' iv_fval = is_tstcc-s_pervas ). ENDIF. IF is_tstcc-s_service IS NOT INITIAL. add_data( iv_fnam = 'TSTCC-S_SERVICE' iv_fval = is_tstcc-s_service ). ENDIF. IF is_tstcc-s_platin IS NOT INITIAL. add_data( iv_fnam = 'TSTCC-S_PLATIN' iv_fval = is_tstcc-s_platin ). ENDIF. IF is_tstcc-s_win32 IS NOT INITIAL. add_data( iv_fnam = 'TSTCC-S_WIN32' iv_fval = is_tstcc-s_win32 ). ENDIF. add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=WB_SAVE' ). ls_bcdata-program = 'SAPLSTRD'. ls_bcdata-dynpro = '0100'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'KO007-L_DEVCLASS' iv_fval = iv_package ). add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=ADD' ). ls_bcdata-program = 'BDC_OKCODE'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=WB_BACK' ). ls_bcdata-program = 'BDC_OKCODE'. ls_bcdata-dynpro = '0360'. ls_bcdata-dynbegin = 'X'. APPEND ls_bcdata TO mt_bcdata. add_data( iv_fnam = 'BDC_OKCODE' iv_fval = '=WB_BACK' ). call_se93( ). ENDMETHOD. METHOD deserialize_texts. DATA lt_tpool_i18n TYPE TABLE OF tstct. FIELD-SYMBOLS LIKE LINE OF lt_tpool_i18n. " Read XML-files data io_xml->read( EXPORTING iv_name = 'I18N_TPOOL' CHANGING cg_data = lt_tpool_i18n ). " Force t-code name (security reasons) LOOP AT lt_tpool_i18n ASSIGNING . -tcode = ms_item-obj_name. ENDLOOP. IF lines( lt_tpool_i18n ) > 0. MODIFY tstct FROM TABLE lt_tpool_i18n. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Update of t-code translations failed' ). ENDIF. ENDIF. ENDMETHOD. METHOD serialize_texts. DATA lt_tpool_i18n TYPE TABLE OF tstct. " Skip master language - it was already serialized " Don't serialize t-code itself SELECT sprsl ttext INTO CORRESPONDING FIELDS OF TABLE lt_tpool_i18n FROM tstct WHERE sprsl <> mv_language AND tcode = ms_item-obj_name. "#EC CI_GENBUFF IF lines( lt_tpool_i18n ) > 0. SORT lt_tpool_i18n BY sprsl ASCENDING. io_xml->add( iv_name = 'I18N_TPOOL' ig_data = lt_tpool_i18n ). ENDIF. ENDMETHOD. METHOD set_oo_parameters. DATA: ls_param LIKE LINE OF it_rsparam. IF cs_rsstcd-call_tcode = c_oo_tcode. cs_rsstcd-s_trframe = c_true. LOOP AT it_rsparam INTO ls_param. CASE ls_param-field. WHEN c_oo_frclass. cs_rsstcd-classname = ls_param-value. WHEN c_oo_frmethod. cs_rsstcd-method = ls_param-value. WHEN c_oo_frupdtask. IF ls_param-value = c_oo_synchron. cs_rsstcd-s_upddir = c_true. cs_rsstcd-s_updtask = c_false. cs_rsstcd-s_updlok = c_false. ELSEIF ls_param-value = c_oo_asynchron. cs_rsstcd-s_upddir = c_false. cs_rsstcd-s_updtask = c_true. cs_rsstcd-s_updlok = c_false. ELSE. cs_rsstcd-s_upddir = c_false. cs_rsstcd-s_updtask = c_false. cs_rsstcd-s_updlok = c_true. ENDIF. ENDCASE. ENDLOOP. ENDIF. ENDMETHOD. METHOD shift_param. DATA: ls_param LIKE LINE OF ct_rsparam, lv_length TYPE i. FIELD-SYMBOLS TYPE any. DO 254 TIMES. IF cs_tstcp-param = space. EXIT. ENDIF. CLEAR ls_param. IF cs_tstcp-param CA '='. CHECK sy-fdpos <> 0. ASSIGN cs_tstcp-param(sy-fdpos) TO . ls_param-field = . IF ls_param-field(1) = space. SHIFT ls_param-field. ENDIF. sy-fdpos = sy-fdpos + 1. SHIFT cs_tstcp-param BY sy-fdpos PLACES. IF cs_tstcp-param CA ';'. IF sy-fdpos <> 0. ASSIGN cs_tstcp-param(sy-fdpos) TO . ls_param-value = . IF ls_param-value(1) = space. SHIFT ls_param-value. ENDIF. ENDIF. sy-fdpos = sy-fdpos + 1. SHIFT cs_tstcp-param BY sy-fdpos PLACES. APPEND ls_param TO ct_rsparam. ELSE. lv_length = strlen( cs_tstcp-param ). CHECK lv_length > 0. ASSIGN cs_tstcp-param(lv_length) TO . ls_param-value = . IF ls_param-value(1) = space. SHIFT ls_param-value. ENDIF. lv_length = lv_length + 1. SHIFT cs_tstcp-param BY lv_length PLACES. APPEND ls_param TO ct_rsparam. ENDIF. ENDIF. ENDDO. ENDMETHOD. METHOD split_parameters. * see subroutine split_parameters in include LSEUKF01 DATA: lv_off TYPE i, lv_param_beg TYPE i. CLEAR cs_rsstcd-s_vari. IF cs_tstcp-param(1) = '\'. " OO-Transaktion ohne FR split_parameters_comp( EXPORTING ig_type = c_oo_program ig_param = cs_tstcp-param CHANGING cg_value = cs_tstc-pgmna ). split_parameters_comp( EXPORTING ig_type = c_oo_class ig_param = cs_tstcp-param CHANGING cg_value = cs_rsstcd-classname ). split_parameters_comp( EXPORTING ig_type = c_oo_method ig_param = cs_tstcp-param CHANGING cg_value = cs_rsstcd-method ). IF NOT cs_tstc-pgmna IS INITIAL. cs_rsstcd-s_local = c_true. ENDIF. RETURN. ELSEIF cs_tstcp-param(1) = '@'. " Transaktionsvariante cs_rsstcd-s_vari = c_true. IF cs_tstcp-param(2) = '@@'. cs_rsstcd-s_ind_vari = c_true. lv_off = 2. ELSE. CLEAR cs_rsstcd-s_ind_vari. lv_off = 1. ENDIF. IF cs_tstcp-param CA ' '. ENDIF. sy-fdpos = sy-fdpos - lv_off. IF sy-fdpos > 0. cs_rsstcd-call_tcode = cs_tstcp-param+lv_off(sy-fdpos). sy-fdpos = sy-fdpos + 1 + lv_off. cs_rsstcd-variant = cs_tstcp-param+sy-fdpos. ENDIF. ELSEIF cs_tstcp-param(1) = '/'. cs_rsstcd-st_tcode = c_true. cs_rsstcd-st_prog = space. IF cs_tstcp-param+1(1) = '*'. cs_rsstcd-st_skip_1 = c_true. ELSE. CLEAR cs_rsstcd-st_skip_1. ENDIF. IF cs_tstcp-param CA ' '. ENDIF. lv_param_beg = sy-fdpos + 1. sy-fdpos = sy-fdpos - 2. IF sy-fdpos > 0. cs_rsstcd-call_tcode = cs_tstcp-param+2(sy-fdpos). ENDIF. SHIFT cs_tstcp-param BY lv_param_beg PLACES. ELSE. cs_rsstcd-st_tcode = space. cs_rsstcd-st_prog = c_true. ENDIF. shift_param( CHANGING ct_rsparam = ct_rsparam cs_tstcp = cs_tstcp ). set_oo_parameters( EXPORTING it_rsparam = ct_rsparam CHANGING cs_rsstcd = cs_rsstcd ). ENDMETHOD. METHOD split_parameters_comp. DATA: lv_off TYPE i. IF ig_param CS ig_type. lv_off = sy-fdpos + strlen( ig_type ). cg_value = ig_param+lv_off. IF cg_value CA '\'. CLEAR cg_value+sy-fdpos. ENDIF. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. METHOD zif_abapgit_object~delete. DATA: lv_transaction TYPE tstc-tcode. lv_transaction = ms_item-obj_name. CALL FUNCTION 'RPY_TRANSACTION_DELETE' EXPORTING transaction = lv_transaction EXCEPTIONS not_excecuted = 1 object_not_found = 0 OTHERS = 3. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Error from RPY_TRANSACTION_DELETE' ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~deserialize. CONSTANTS: lc_hex_tra TYPE x VALUE '00', * c_hex_men TYPE x VALUE '01', lc_hex_par TYPE x VALUE '02', lc_hex_rep TYPE x VALUE '80', * c_hex_rpv TYPE x VALUE '10', lc_hex_obj TYPE x VALUE '08'. DATA: lv_dynpro TYPE d020s-dnum, ls_tstc TYPE tstc, lv_type TYPE rglif-docutype, ls_tstct TYPE tstct, ls_tstcc TYPE tstcc, ls_tstcp TYPE tstcp, lt_param_values TYPE tty_param_values, ls_rsstcd TYPE rsstcd. IF zif_abapgit_object~exists( ) = abap_true. zif_abapgit_object~delete( ). ENDIF. io_xml->read( EXPORTING iv_name = 'TSTC' CHANGING cg_data = ls_tstc ). io_xml->read( EXPORTING iv_name = 'TSTCC' CHANGING cg_data = ls_tstcc ). io_xml->read( EXPORTING iv_name = 'TSTCT' CHANGING cg_data = ls_tstct ). io_xml->read( EXPORTING iv_name = 'TSTCP' CHANGING cg_data = ls_tstcp ). lv_dynpro = ls_tstc-dypno. CASE ls_tstc-cinfo. WHEN lc_hex_tra. lv_type = ststc_c_type_dialog. WHEN lc_hex_rep. lv_type = ststc_c_type_report. WHEN lc_hex_par. lv_type = ststc_c_type_parameters. WHEN lc_hex_obj. lv_type = ststc_c_type_object. * todo, or ststc_c_type_variant? WHEN OTHERS. zcx_abapgit_exception=>raise( 'Transaction, unknown CINFO' ). ENDCASE. IF ls_tstcp IS NOT INITIAL. split_parameters( CHANGING ct_rsparam = lt_param_values cs_rsstcd = ls_rsstcd cs_tstcp = ls_tstcp cs_tstc = ls_tstc ). ENDIF. CASE lv_type. WHEN ststc_c_type_object. deserialize_oo_transaction( iv_package = iv_package is_tstc = ls_tstc is_tstcc = ls_tstcc is_tstct = ls_tstct is_rsstcd = ls_rsstcd ). WHEN OTHERS. CALL FUNCTION 'RPY_TRANSACTION_INSERT' EXPORTING transaction = ls_tstc-tcode program = ls_tstc-pgmna dynpro = lv_dynpro language = mv_language development_class = iv_package transaction_type = lv_type shorttext = ls_tstct-ttext called_transaction = ls_rsstcd-call_tcode called_transaction_skip = ls_rsstcd-st_skip_1 variant = ls_rsstcd-variant cl_independend = ls_rsstcd-s_ind_vari html_enabled = ls_tstcc-s_webgui java_enabled = ls_tstcc-s_platin wingui_enabled = ls_tstcc-s_win32 TABLES param_values = lt_param_values EXCEPTIONS cancelled = 1 already_exist = 2 permission_error = 3 name_not_allowed = 4 name_conflict = 5 illegal_type = 6 object_inconsistent = 7 db_access_error = 8 OTHERS = 9. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Error from RPY_TRANSACTION_INSERT' ). ENDIF. ENDCASE. " Texts deserializing (translations) deserialize_texts( io_xml ). ENDMETHOD. METHOD zif_abapgit_object~exists. DATA: lv_tcode TYPE tstc-tcode. SELECT SINGLE tcode FROM tstc INTO lv_tcode WHERE tcode = ms_item-obj_name. "#EC CI_GENBUFF 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 = zif_abapgit_object~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. DATA: lv_object TYPE eqegraarg. lv_object = |TN{ ms_item-obj_name }|. OVERLAY lv_object WITH ' '. lv_object = lv_object && '*'. rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'EEUDB' iv_argument = lv_object ). ENDMETHOD. METHOD zif_abapgit_object~jump. DATA: lt_bdcdata TYPE TABLE OF bdcdata. FIELD-SYMBOLS: LIKE LINE OF lt_bdcdata. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -program = 'SAPLSEUK'. -dynpro = '0390'. -dynbegin = abap_true. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = 'BDC_OKCODE'. -fval = '=SHOW'. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = 'TSTC-TCODE'. -fval = ms_item-obj_name. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'GIT' EXPORTING tcode = 'SE93' mode_val = 'E' TABLES using_tab = lt_bdcdata EXCEPTIONS system_failure = 1 communication_failure = 2 resource_failure = 3 OTHERS = 4 ##fm_subrc_ok. "#EC CI_SUBRC ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: lv_transaction TYPE tstc-tcode, lt_tcodes TYPE TABLE OF tstc, ls_tcode LIKE LINE OF lt_tcodes, ls_tstct TYPE tstct, ls_tstcp TYPE tstcp, lt_gui_attr TYPE TABLE OF tstcc, ls_gui_attr LIKE LINE OF lt_gui_attr. lv_transaction = ms_item-obj_name. CALL FUNCTION 'RPY_TRANSACTION_READ' EXPORTING transaction = lv_transaction TABLES tcodes = lt_tcodes gui_attributes = lt_gui_attr EXCEPTIONS permission_error = 1 cancelled = 2 not_found = 3 object_not_found = 4 OTHERS = 5. IF sy-subrc = 4 OR sy-subrc = 3. RETURN. ELSEIF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'Error from RPY_TRANSACTION_READ' ). ENDIF. SELECT SINGLE * FROM tstct INTO ls_tstct WHERE sprsl = mv_language AND tcode = lv_transaction. "#EC CI_SUBRC "#EC CI_GENBUFF SELECT SINGLE * FROM tstcp INTO ls_tstcp WHERE tcode = lv_transaction. "#EC CI_SUBRC "#EC CI_GENBUFF READ TABLE lt_tcodes INDEX 1 INTO ls_tcode. ASSERT sy-subrc = 0. READ TABLE lt_gui_attr INDEX 1 INTO ls_gui_attr. ASSERT sy-subrc = 0. io_xml->add( iv_name = 'TSTC' ig_data = ls_tcode ). io_xml->add( iv_name = 'TSTCC' ig_data = ls_gui_attr ). io_xml->add( iv_name = 'TSTCT' ig_data = ls_tstct ). IF ls_tstcp IS NOT INITIAL. io_xml->add( iv_name = 'TSTCP' ig_data = ls_tstcp ). ENDIF. " Texts serializing (translations) serialize_texts( io_xml ). ENDMETHOD. ENDCLASS.