*&---------------------------------------------------------------------* *& Include ZABAPGIT_OBJECTS *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_objects_activation DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_activation DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS add IMPORTING iv_type TYPE trobjtype iv_name TYPE clike RAISING lcx_exception. CLASS-METHODS add_item IMPORTING is_item TYPE ty_item RAISING lcx_exception. CLASS-METHODS activate RAISING lcx_exception. CLASS-METHODS clear. PRIVATE SECTION. CLASS-DATA: gt_ddic TYPE TABLE OF dwinactiv, gt_programs TYPE TABLE OF dwinactiv. ENDCLASS. "lcl_objects_activation DEFINITION *----------------------------------------------------------------------* * CLASS lcl_objects_activation IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_activation IMPLEMENTATION. METHOD add_item. add( iv_type = is_item-obj_type iv_name = is_item-obj_name ). ENDMETHOD. "add_item METHOD clear. CLEAR: gt_ddic, gt_programs. ENDMETHOD. "clear METHOD activate. * ddic IF NOT gt_ddic IS INITIAL. CALL FUNCTION 'RS_WORKING_OBJECTS_ACTIVATE' EXPORTING activate_ddic_objects = abap_true with_popup = abap_true TABLES objects = gt_ddic EXCEPTIONS excecution_error = 1 cancelled = 2 insert_into_corr_error = 3 OTHERS = 4. IF sy-subrc <> 0. lcx_exception=>raise( 'error from RS_WORKING_OBJECTS_ACTIVATE' ). ENDIF. ENDIF. * programs IF NOT gt_programs IS INITIAL. CALL FUNCTION 'RS_WORKING_OBJECTS_ACTIVATE' EXPORTING activate_ddic_objects = abap_false with_popup = abap_true TABLES objects = gt_programs EXCEPTIONS excecution_error = 1 cancelled = 2 insert_into_corr_error = 3 OTHERS = 4. IF sy-subrc <> 0. lcx_exception=>raise( 'error from RS_WORKING_OBJECTS_ACTIVATE' ). ENDIF. ENDIF. ENDMETHOD. "activate METHOD add. * function group SEWORKINGAREA * function module RS_INSERT_INTO_WORKING_AREA * class CL_WB_ACTIVATION_WORK_AREA DATA: lt_objects TYPE dwinactiv_tab, lv_obj_name TYPE dwinactiv-obj_name. FIELD-SYMBOLS: LIKE LINE OF lt_objects. lv_obj_name = iv_name. * todo, refactoring CASE iv_type. WHEN 'CLAS' OR 'WDYN'. CALL FUNCTION 'RS_INACTIVE_OBJECTS_IN_OBJECT' EXPORTING obj_name = lv_obj_name object = iv_type TABLES inactive_objects = lt_objects EXCEPTIONS object_not_found = 1 OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( 'Error from RS_INACTIVE_OBJECTS_IN_OBJECT' ). ENDIF. APPEND LINES OF lt_objects TO gt_programs. WHEN 'DOMA' OR 'DTEL' OR 'TABL' OR 'INDX' OR 'TTYP' OR 'VIEW' OR 'SHLP' OR 'ENQU' OR 'SFSW' OR 'SFBF' OR 'SFBS'. * todo also insert_into_working_area? APPEND INITIAL LINE TO gt_ddic ASSIGNING . -object = iv_type. -obj_name = lv_obj_name. WHEN 'REPS' OR 'DYNP' OR 'CUAD' OR 'REPT' OR 'INTF' OR 'FUNC' OR 'ENHO' OR 'TYPE' OR 'XSLT' OR 'WEBI'. * these seem to go into the workarea automatically APPEND INITIAL LINE TO gt_programs ASSIGNING . -object = iv_type. -obj_name = lv_obj_name. WHEN OTHERS. lcx_exception=>raise( 'activate, unknown type' ). ENDCASE. ENDMETHOD. "activate ENDCLASS. "lcl_objects_activation IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_objects_files DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_files DEFINITION FINAL. PUBLIC SECTION. METHODS: constructor IMPORTING is_item TYPE ty_item, add_string IMPORTING iv_extra TYPE clike OPTIONAL iv_ext TYPE string iv_string TYPE string RAISING lcx_exception, read_string IMPORTING iv_extra TYPE clike OPTIONAL iv_ext TYPE string RETURNING VALUE(rv_string) TYPE string RAISING lcx_exception, add_xml IMPORTING iv_extra TYPE clike OPTIONAL io_xml TYPE REF TO lcl_xml_output iv_normalize TYPE sap_bool DEFAULT abap_true is_metadata TYPE ty_metadata OPTIONAL RAISING lcx_exception, * needed since type-check during dynamic call fails even if the object is compatible add_xml_from_plugin IMPORTING iv_extra TYPE clike OPTIONAL io_xml TYPE REF TO object iv_normalize TYPE sap_bool DEFAULT abap_true RAISING lcx_exception ##called, read_xml IMPORTING iv_extra TYPE clike OPTIONAL RETURNING VALUE(ro_xml) TYPE REF TO lcl_xml_input RAISING lcx_exception, read_abap IMPORTING iv_extra TYPE clike OPTIONAL iv_error TYPE sap_bool DEFAULT abap_true RETURNING VALUE(rt_abap) TYPE abaptxt255_tab RAISING lcx_exception, add_abap IMPORTING iv_extra TYPE clike OPTIONAL it_abap TYPE STANDARD TABLE RAISING lcx_exception, add IMPORTING is_file TYPE ty_file, get_files RETURNING VALUE(rt_files) TYPE ty_files_tt, set_files IMPORTING it_files TYPE ty_files_tt. PRIVATE SECTION. DATA: ms_item TYPE ty_item, mt_files TYPE ty_files_tt. METHODS: filename IMPORTING iv_extra TYPE clike OPTIONAL iv_ext TYPE string RETURNING VALUE(rv_filename) TYPE string. ENDCLASS. "lcl_objects_files DEFINITION *----------------------------------------------------------------------* * INTERFACE lif_object DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* INTERFACE lif_object. METHODS: serialize IMPORTING io_xml TYPE REF TO lcl_xml_output RAISING lcx_exception, deserialize IMPORTING iv_package TYPE devclass io_xml TYPE REF TO lcl_xml_input RAISING lcx_exception, delete RAISING lcx_exception, exists RETURNING VALUE(rv_bool) TYPE abap_bool RAISING lcx_exception, changed_by RETURNING VALUE(rv_user) TYPE xubname RAISING lcx_exception, jump RAISING lcx_exception, get_metadata RETURNING VALUE(rs_metadata) TYPE ty_metadata. DATA: mo_files TYPE REF TO lcl_objects_files. ENDINTERFACE. "lif_object DEFINITION *----------------------------------------------------------------------* * CLASS lcl_objects_files IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_files IMPLEMENTATION. METHOD constructor. ms_item = is_item. ENDMETHOD. "constructor METHOD add. APPEND is_file TO mt_files. ENDMETHOD. "add METHOD get_files. rt_files = mt_files. ENDMETHOD. "get_files METHOD set_files. mt_files = it_files. ENDMETHOD. "set_files METHOD read_string. DATA: lv_filename TYPE string. FIELD-SYMBOLS: LIKE LINE OF mt_files. lv_filename = filename( iv_extra = iv_extra iv_ext = iv_ext ). "#EC NOTEXT READ TABLE mt_files ASSIGNING WITH KEY filename = lv_filename. IF sy-subrc <> 0. lcx_exception=>raise( 'html not found' ). ENDIF. rv_string = lcl_convert=>xstring_to_string_utf8( -data ). ENDMETHOD. "read_string METHOD read_abap. DATA: lv_filename TYPE string, lv_abap TYPE string. FIELD-SYMBOLS: LIKE LINE OF mt_files. CLEAR rt_abap. lv_filename = filename( iv_extra = iv_extra iv_ext = 'abap' ). "#EC NOTEXT READ TABLE mt_files ASSIGNING WITH KEY filename = lv_filename. IF sy-subrc <> 0. IF iv_error = abap_true. lcx_exception=>raise( 'abap not found' ). ELSE. RETURN. ENDIF. ENDIF. lv_abap = lcl_convert=>xstring_to_string_utf8( -data ). SPLIT lv_abap AT gc_newline INTO TABLE rt_abap. ENDMETHOD. "read_abap METHOD add_abap. DATA: lv_source TYPE string, ls_file TYPE ty_file. CONCATENATE LINES OF it_abap INTO lv_source SEPARATED BY gc_newline. ls_file-path = '/'. ls_file-filename = filename( iv_extra = iv_extra iv_ext = 'abap' ). "#EC NOTEXT ls_file-data = lcl_convert=>string_to_xstring_utf8( lv_source ). APPEND ls_file TO mt_files. ENDMETHOD. "abap_to_file METHOD add_string. DATA: ls_file TYPE ty_file. ls_file-path = '/'. ls_file-filename = filename( iv_extra = iv_extra iv_ext = iv_ext ). "#EC NOTEXT ls_file-data = lcl_convert=>string_to_xstring_utf8( iv_string ). APPEND ls_file TO mt_files. ENDMETHOD. "add_string METHOD add_xml. DATA: lv_xml TYPE string, ls_file TYPE ty_file. lv_xml = io_xml->render( iv_normalize = iv_normalize is_metadata = is_metadata ). ls_file-path = '/'. ls_file-filename = filename( iv_extra = iv_extra iv_ext = 'xml' ). "#EC NOTEXT REPLACE FIRST OCCURRENCE OF REGEX '<\?xml version="1\.0" encoding="[\w-]+"\?>' IN lv_xml WITH ''. ASSERT sy-subrc = 0. ls_file-data = lcl_convert=>string_to_xstring_utf8( lv_xml ). APPEND ls_file TO mt_files. ENDMETHOD. "do METHOD read_xml. DATA: lv_filename TYPE string, lv_xml TYPE string. FIELD-SYMBOLS: LIKE LINE OF mt_files. lv_filename = filename( iv_extra = iv_extra iv_ext = 'xml' ). "#EC NOTEXT READ TABLE mt_files ASSIGNING WITH KEY filename = lv_filename. IF sy-subrc <> 0. lcx_exception=>raise( 'xml not found' ). ENDIF. lv_xml = lcl_convert=>xstring_to_string_utf8( -data ). CREATE OBJECT ro_xml EXPORTING iv_xml = lv_xml. ENDMETHOD. "read_xml METHOD filename. DATA: lv_obj_name TYPE string. IF ms_item-obj_type = 'SICF'. * multiple SICF nodes with same name cannot be added to repository lv_obj_name = ms_item-obj_name(15). ELSE. lv_obj_name = ms_item-obj_name. ENDIF. * handle namespaces REPLACE ALL OCCURRENCES OF '/' IN lv_obj_name WITH '#'. IF iv_extra IS INITIAL. CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_ext INTO rv_filename. "#EC NOTEXT ELSE. CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_extra '.' iv_ext INTO rv_filename. "#EC NOTEXT ENDIF. TRANSLATE rv_filename TO LOWER CASE. ENDMETHOD. "filename METHOD add_xml_from_plugin. * this method wraps add_xml as in the plugin. This is necessary as the wrapped * xml-object in the plugin can only be typed to object. * ABAP does not perform implicit type casts (also if compatible) in signatures, * therefore this method's signature is typed ref to object DATA lo_xml TYPE REF TO lcl_xml_output. lo_xml ?= io_xml. me->add_xml( iv_extra = iv_extra io_xml = lo_xml iv_normalize = iv_normalize ). ENDMETHOD. "add_xml_from_plugin ENDCLASS. "lcl_objects_files IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_objects_super DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_super DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: constructor IMPORTING is_item TYPE ty_item iv_language TYPE spras. CONSTANTS: c_user_unknown TYPE xubname VALUE 'UNKNOWN'. PROTECTED SECTION. DATA: ms_item TYPE ty_item, mv_language TYPE spras. METHODS: get_metadata RETURNING VALUE(rs_metadata) TYPE ty_metadata, corr_insert IMPORTING iv_package TYPE devclass RAISING lcx_exception, jump_se11 IMPORTING iv_radio TYPE string iv_field TYPE string RAISING lcx_exception. ENDCLASS. "lcl_objects_super DEFINITION ********************************************************************** * Enable plugins CLASS lcl_objects_bridge DEFINITION INHERITING FROM lcl_objects_super FINAL. PUBLIC SECTION. CLASS-METHODS class_constructor. METHODS constructor IMPORTING is_item TYPE ty_item RAISING cx_sy_create_object_error. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. PRIVATE SECTION. DATA: mo_plugin TYPE REF TO object. TYPES: BEGIN OF ty_s_objtype_map, obj_typ TYPE trobjtype, plugin_class TYPE seoclsname, END OF ty_s_objtype_map, ty_t_objtype_map TYPE SORTED TABLE OF ty_s_objtype_map WITH UNIQUE KEY obj_typ. CLASS-DATA gt_objtype_map TYPE ty_t_objtype_map. ENDCLASS. "lcl_objects_bridge DEFINITION *----------------------------------------------------------------------* * CLASS lcl_objects_bridge IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_bridge IMPLEMENTATION. METHOD lif_object~get_metadata. CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~GET_METADATA') RECEIVING rs_metadata = rs_metadata. ENDMETHOD. "lif_object~get_metadata METHOD lif_object~changed_by. rv_user = c_user_unknown. " todo ENDMETHOD. METHOD constructor. DATA ls_objtype_map LIKE LINE OF gt_objtype_map. super->constructor( is_item = is_item iv_language = gc_english ). * determine the responsible plugin READ TABLE gt_objtype_map INTO ls_objtype_map WITH TABLE KEY obj_typ = is_item-obj_type. IF sy-subrc = 0. CREATE OBJECT mo_plugin TYPE (ls_objtype_map-plugin_class). CALL METHOD mo_plugin->('SET_ITEM') EXPORTING iv_obj_type = is_item-obj_type iv_obj_name = is_item-obj_name. ELSE. RAISE EXCEPTION TYPE cx_sy_create_object_error EXPORTING classname = 'LCL_OBJECTS_BRIDGE'. ENDIF. ENDMETHOD. "constructor METHOD lif_object~serialize. CALL METHOD mo_plugin->('WRAP_SERIALIZE') EXPORTING io_xml = io_xml. ENDMETHOD. "lif_object~serialize METHOD lif_object~deserialize. DATA: lx_plugin TYPE REF TO cx_static_check. TRY. CALL METHOD mo_plugin->('WRAP_DESERIALIZE') EXPORTING iv_package = iv_package io_xml = io_xml. CATCH cx_static_check INTO lx_plugin. RAISE EXCEPTION TYPE lcx_exception EXPORTING ix_previous = lx_plugin iv_text = lx_plugin->get_text( ). ENDTRY. ENDMETHOD. "lif_object~deserialize METHOD lif_object~delete. DATA lx_plugin TYPE REF TO cx_static_check. TRY. CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~DELETE'). CATCH cx_static_check INTO lx_plugin. RAISE EXCEPTION TYPE lcx_exception EXPORTING ix_previous = lx_plugin iv_text = lx_plugin->get_text( ). ENDTRY. ENDMETHOD. "lif_object~delete METHOD lif_object~exists. CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~EXISTS') RECEIVING rv_bool = rv_bool. ENDMETHOD. "lif_object~exists METHOD lif_object~jump. CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~JUMP'). ENDMETHOD. "lif_object~jump METHOD class_constructor. DATA lt_plugin_class TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY. DATA lv_plugin_class LIKE LINE OF lt_plugin_class. DATA lo_plugin TYPE REF TO object. DATA lt_plugin_obj_type TYPE objtyptable. DATA ls_objtype_map LIKE LINE OF gt_objtype_map. SELECT ext~clsname FROM vseoextend AS ext INTO TABLE lt_plugin_class WHERE ext~refclsname LIKE 'ZCL_ABAPGIT_OBJECT%' AND ext~version = '1'. "#EC CI_SUBRC CLEAR gt_objtype_map. LOOP AT lt_plugin_class INTO lv_plugin_class WHERE table_line <> 'ZCL_ABAPGIT_OBJECT_BY_SOBJ'. * have the generic plugin only as fallback TRY. CREATE OBJECT lo_plugin TYPE (lv_plugin_class). CATCH cx_sy_create_object_error. CONTINUE. ">>>>>>>>>>>>>> ENDTRY. CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES') IMPORTING rt_obj_type = lt_plugin_obj_type. ls_objtype_map-plugin_class = lv_plugin_class. LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ. INSERT ls_objtype_map INTO TABLE gt_objtype_map. IF sy-subrc <> 0. * No exception in class-contructor possible. * Anyway, a shortdump is more appropriate in this case ASSERT 'There must not be' = |multiple ABAPGit-Plugins for the same object type { ls_objtype_map-obj_typ }|. ENDIF. ENDLOOP. ENDLOOP. "at plugins * and the same for the generic plugin if exists * have the generic plugin only as fallback LOOP AT lt_plugin_class INTO lv_plugin_class WHERE table_line = 'ZCL_ABAPGIT_OBJECT_BY_SOBJ'. CREATE OBJECT lo_plugin TYPE (lv_plugin_class). CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES') RECEIVING rt_obj_type = lt_plugin_obj_type. ls_objtype_map-plugin_class = lv_plugin_class. LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ. INSERT ls_objtype_map INTO TABLE gt_objtype_map. "knowingly ignore the subrc ENDLOOP. ENDLOOP. "at plugins ENDMETHOD. "class_constructor ENDCLASS. "lcl_objects_bridge IMPLEMENTATION ********************************************************************** CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super. PUBLIC SECTION. TYPES: BEGIN OF ty_progdir, name TYPE progdir-name, state TYPE progdir-state, sqlx TYPE progdir-sqlx, edtx TYPE progdir-edtx, varcl TYPE progdir-varcl, dbapl TYPE progdir-dbapl, dbna TYPE progdir-dbna, clas TYPE progdir-clas, type TYPE progdir-type, occurs TYPE progdir-occurs, subc TYPE progdir-subc, appl TYPE progdir-appl, secu TYPE progdir-secu, cnam TYPE progdir-cnam, cdat TYPE progdir-cdat, unam TYPE progdir-unam, udat TYPE progdir-udat, vern TYPE progdir-vern, levl TYPE progdir-levl, rstat TYPE progdir-rstat, rmand TYPE progdir-rmand, rload TYPE progdir-rload, fixpt TYPE progdir-fixpt, sset TYPE progdir-sset, sdate TYPE progdir-sdate, stime TYPE progdir-stime, idate TYPE progdir-idate, itime TYPE progdir-itime, ldbname TYPE progdir-ldbname, uccheck TYPE progdir-uccheck, END OF ty_progdir. METHODS serialize_program IMPORTING io_xml TYPE REF TO lcl_xml_output OPTIONAL is_item TYPE ty_item io_files TYPE REF TO lcl_objects_files iv_program TYPE programm OPTIONAL iv_extra TYPE clike OPTIONAL RAISING lcx_exception. METHODS read_progdir IMPORTING iv_program TYPE programm RETURNING VALUE(rs_progdir) TYPE ty_progdir. METHODS deserialize_program IMPORTING is_progdir TYPE ty_progdir it_source TYPE abaptxt255_tab it_tpool TYPE textpool_table iv_package TYPE devclass RAISING lcx_exception. PROTECTED SECTION. TYPES: ty_spaces_tt TYPE STANDARD TABLE OF i WITH DEFAULT KEY. TYPES: BEGIN OF ty_tpool. INCLUDE TYPE textpool. TYPES: split TYPE c LENGTH 8. TYPES: END OF ty_tpool. TYPES: ty_tpool_tt TYPE STANDARD TABLE OF ty_tpool WITH DEFAULT KEY. TYPES: BEGIN OF ty_dynpro, header TYPE rpy_dyhead, containers TYPE dycatt_tab, fields TYPE dyfatc_tab, flow_logic TYPE swydyflow, spaces TYPE ty_spaces_tt, END OF ty_dynpro. TYPES: ty_dynpro_tt TYPE STANDARD TABLE OF ty_dynpro WITH DEFAULT KEY. TYPES: BEGIN OF ty_cua, adm TYPE rsmpe_adm, sta TYPE STANDARD TABLE OF rsmpe_stat WITH DEFAULT KEY, fun TYPE STANDARD TABLE OF rsmpe_funt WITH DEFAULT KEY, men TYPE STANDARD TABLE OF rsmpe_men WITH DEFAULT KEY, mtx TYPE STANDARD TABLE OF rsmpe_mnlt WITH DEFAULT KEY, act TYPE STANDARD TABLE OF rsmpe_act WITH DEFAULT KEY, but TYPE STANDARD TABLE OF rsmpe_but WITH DEFAULT KEY, pfk TYPE STANDARD TABLE OF rsmpe_pfk WITH DEFAULT KEY, set TYPE STANDARD TABLE OF rsmpe_staf WITH DEFAULT KEY, doc TYPE STANDARD TABLE OF rsmpe_atrt WITH DEFAULT KEY, tit TYPE STANDARD TABLE OF rsmpe_titt WITH DEFAULT KEY, biv TYPE STANDARD TABLE OF rsmpe_buts WITH DEFAULT KEY, END OF ty_cua. METHODS serialize_dynpros IMPORTING iv_program_name TYPE programm RETURNING VALUE(rt_dynpro) TYPE ty_dynpro_tt RAISING lcx_exception. METHODS serialize_cua IMPORTING iv_program_name TYPE programm RETURNING VALUE(rs_cua) TYPE ty_cua RAISING lcx_exception. METHODS deserialize_dynpros IMPORTING it_dynpros TYPE ty_dynpro_tt RAISING lcx_exception. METHODS deserialize_cua IMPORTING iv_program_name TYPE programm is_cua TYPE ty_cua RAISING lcx_exception. CLASS-METHODS: add_tpool IMPORTING it_tpool TYPE textpool_table RETURNING VALUE(rt_tpool) TYPE ty_tpool_tt, read_tpool IMPORTING it_tpool TYPE ty_tpool_tt RETURNING VALUE(rt_tpool) TYPE ty_tpool_tt. PRIVATE SECTION. METHODS: condense_flow EXPORTING et_spaces TYPE ty_spaces_tt CHANGING ct_flow TYPE swydyflow, uncondense_flow IMPORTING it_flow TYPE swydyflow it_spaces TYPE ty_spaces_tt RETURNING VALUE(rt_flow) TYPE swydyflow. ENDCLASS. "lcl_objects_program DEFINITION *----------------------------------------------------------------------* * CLASS lcl_objects_program IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_program IMPLEMENTATION. METHOD condense_flow. DATA: lv_spaces LIKE LINE OF et_spaces. FIELD-SYMBOLS: LIKE LINE OF ct_flow. CLEAR et_spaces. LOOP AT ct_flow ASSIGNING . lv_spaces = 0. WHILE NOT -line IS INITIAL AND -line(1) = space. lv_spaces = lv_spaces + 1. -line = -line+1. ENDWHILE. APPEND lv_spaces TO et_spaces. ENDLOOP. ENDMETHOD. METHOD uncondense_flow. DATA: lv_spaces LIKE LINE OF it_spaces. FIELD-SYMBOLS: LIKE LINE OF it_flow, LIKE LINE OF rt_flow. LOOP AT it_flow ASSIGNING . APPEND INITIAL LINE TO rt_flow ASSIGNING . -line = -line. READ TABLE it_spaces INDEX sy-tabix INTO lv_spaces. IF sy-subrc = 0. SHIFT -line RIGHT BY lv_spaces PLACES IN CHARACTER MODE. ENDIF. ENDLOOP. ENDMETHOD. METHOD serialize_program. DATA: ls_progdir TYPE ty_progdir, lv_program_name TYPE programm, lt_dynpros TYPE ty_dynpro_tt, ls_cua TYPE ty_cua, lt_source TYPE TABLE OF abaptxt255, lt_tpool TYPE textpool_table, ls_tpool LIKE LINE OF lt_tpool, lo_xml TYPE REF TO lcl_xml_output. IF iv_program IS INITIAL. lv_program_name = is_item-obj_name. ELSE. lv_program_name = iv_program. ENDIF. CALL FUNCTION 'RPY_PROGRAM_READ' EXPORTING program_name = lv_program_name with_lowercase = abap_true TABLES source_extended = lt_source textelements = lt_tpool EXCEPTIONS cancelled = 1 not_found = 2 permission_error = 3 OTHERS = 4. IF sy-subrc = 2. RETURN. ELSEIF sy-subrc <> 0. lcx_exception=>raise( 'Error reading program' ). ENDIF. ls_progdir = read_progdir( lv_program_name ). IF io_xml IS BOUND. lo_xml = io_xml. ELSE. CREATE OBJECT lo_xml. ENDIF. lo_xml->add( iv_name = 'PROGDIR' ig_data = ls_progdir ). IF ls_progdir-subc = '1'. lt_dynpros = serialize_dynpros( lv_program_name ). lo_xml->add( iv_name = 'DYNPROS' ig_data = lt_dynpros ). ls_cua = serialize_cua( lv_program_name ). lo_xml->add( iv_name = 'CUA' ig_data = ls_cua ). ENDIF. IF lines( lt_tpool ) = 1. READ TABLE lt_tpool INDEX 1 INTO ls_tpool. ASSERT sy-subrc = 0. IF ls_tpool-id = 'R' AND ls_tpool-key = '' AND ls_tpool-length = 0. DELETE lt_tpool INDEX 1. ENDIF. ENDIF. lo_xml->add( iv_name = 'TPOOL' ig_data = add_tpool( lt_tpool ) ). IF NOT io_xml IS BOUND. io_files->add_xml( iv_extra = iv_extra io_xml = lo_xml ). ENDIF. io_files->add_abap( iv_extra = iv_extra it_abap = lt_source ). ENDMETHOD. "serialize_program METHOD deserialize_program. DATA: lv_exists TYPE sap_bool, lv_progname TYPE reposrc-progname, ls_tpool LIKE LINE OF it_tpool, lv_title TYPE rglif-title, ls_progdir_new TYPE progdir. FIELD-SYMBOLS: TYPE any. CALL FUNCTION 'RS_CORR_INSERT' EXPORTING object = is_progdir-name object_class = 'ABAP' devclass = iv_package master_language = mv_language mode = 'INSERT' EXCEPTIONS cancelled = 1 permission_failure = 2 unknown_objectclass = 3 OTHERS = 4. IF sy-subrc = 1. lcx_exception=>raise( 'Cancelled' ). ELSEIF sy-subrc <> 0. lcx_exception=>raise( 'error from RS_CORR_INSERT' ). ENDIF. READ TABLE it_tpool INTO ls_tpool WITH KEY id = 'R'. "#EC CI_SUBRC IF sy-subrc = 0. * there is a bug in RPY_PROGRAM_UPDATE, the header line of TTAB is not * cleared, so the title length might be inherited from a different program. ASSIGN ('(SAPLSIFP)TTAB') TO . IF sy-subrc = 0. CLEAR . ENDIF. lv_title = ls_tpool-entry. ENDIF. SELECT SINGLE progname FROM reposrc INTO lv_progname WHERE progname = is_progdir-name AND r3state = 'A'. IF sy-subrc = 0. lv_exists = abap_true. ELSE. lv_exists = abap_false. ENDIF. IF lv_exists = abap_true. CALL FUNCTION 'RPY_PROGRAM_UPDATE' EXPORTING program_name = is_progdir-name title_string = lv_title save_inactive = 'I' TABLES source_extended = it_source EXCEPTIONS cancelled = 1 permission_error = 2 not_found = 3 OTHERS = 4. IF sy-subrc <> 0. IF sy-msgid = 'EU' AND sy-msgno = '510'. lcx_exception=>raise( 'User is currently editing program' ). ELSE. lcx_exception=>raise( 'PROG, error updating' ). ENDIF. ENDIF. ELSE. * function module RPY_PROGRAM_INSERT cannot handle function group includes INSERT REPORT is_progdir-name FROM it_source STATE 'I' PROGRAM TYPE is_progdir-subc. IF sy-subrc <> 0. lcx_exception=>raise( 'error from INSERT REPORT' ). ENDIF. IF NOT it_tpool[] IS INITIAL. INSERT TEXTPOOL is_progdir-name FROM it_tpool LANGUAGE mv_language STATE 'I'. IF sy-subrc <> 0. lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). ENDIF. ENDIF. ENDIF. CALL FUNCTION 'READ_PROGDIR' EXPORTING i_progname = is_progdir-name i_state = 'I' IMPORTING e_progdir = ls_progdir_new EXCEPTIONS not_exists = 1 OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( 'not found in PROGDIR' ). ENDIF. * todo, package? ls_progdir_new-ldbname = is_progdir-ldbname. ls_progdir_new-dbna = is_progdir-dbna. ls_progdir_new-dbapl = is_progdir-dbapl. ls_progdir_new-rload = is_progdir-rload. ls_progdir_new-fixpt = is_progdir-fixpt. ls_progdir_new-varcl = is_progdir-varcl. ls_progdir_new-appl = is_progdir-appl. ls_progdir_new-rstat = is_progdir-rstat. CALL FUNCTION 'UPDATE_PROGDIR' EXPORTING i_progdir = ls_progdir_new i_progname = ls_progdir_new-name i_state = ls_progdir_new-state EXCEPTIONS not_executed = 1 OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( 'PROG, error inserting' ). ENDIF. lcl_objects_activation=>add( iv_type = 'REPS' iv_name = is_progdir-name ). ENDMETHOD. "deserialize_program METHOD read_progdir. DATA: ls_sapdir TYPE progdir. CALL FUNCTION 'READ_PROGDIR' EXPORTING i_progname = iv_program i_state = 'A' IMPORTING e_progdir = ls_sapdir. MOVE-CORRESPONDING ls_sapdir TO rs_progdir. CLEAR: rs_progdir-edtx, rs_progdir-cnam, rs_progdir-cdat, rs_progdir-unam, rs_progdir-udat, rs_progdir-levl, rs_progdir-vern, rs_progdir-rmand, rs_progdir-sdate, rs_progdir-stime, rs_progdir-idate, rs_progdir-itime. ENDMETHOD. "read_progdir METHOD serialize_cua. CALL FUNCTION 'RS_CUA_INTERNAL_FETCH' EXPORTING program = iv_program_name language = mv_language state = 'A' IMPORTING adm = rs_cua-adm TABLES sta = rs_cua-sta fun = rs_cua-fun men = rs_cua-men mtx = rs_cua-mtx act = rs_cua-act but = rs_cua-but pfk = rs_cua-pfk set = rs_cua-set doc = rs_cua-doc tit = rs_cua-tit biv = rs_cua-biv EXCEPTIONS not_found = 1 unknown_version = 2 OTHERS = 3. IF sy-subrc <> 0. lcx_exception=>raise( 'error from RS_CUA_INTERNAL_FETCH' ). ENDIF. ENDMETHOD. "serialize_cua METHOD serialize_dynpros. DATA: ls_header TYPE rpy_dyhead, lt_containers TYPE dycatt_tab, lt_fields_to_containers TYPE dyfatc_tab, lt_flow_logic TYPE swydyflow, lt_d020s TYPE TABLE OF d020s. FIELD-SYMBOLS: LIKE LINE OF lt_d020s, TYPE scrpostyle, LIKE LINE OF lt_fields_to_containers, LIKE LINE OF rt_dynpro. CALL FUNCTION 'RS_SCREEN_LIST' EXPORTING dynnr = '' progname = iv_program_name TABLES dynpros = lt_d020s EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc = 2. lcx_exception=>raise( 'error from screen_list' ). ENDIF. * loop dynpros and skip generated selection screens LOOP AT lt_d020s ASSIGNING WHERE type <> 'S'. CALL FUNCTION 'RPY_DYNPRO_READ' EXPORTING progname = iv_program_name dynnr = -dnum IMPORTING header = ls_header TABLES containers = lt_containers fields_to_containers = lt_fields_to_containers flow_logic = lt_flow_logic EXCEPTIONS cancelled = 1 not_found = 2 permission_error = 3 OTHERS = 4. IF sy-subrc <> 0. lcx_exception=>raise( 'Error while reading dynpro' ). ENDIF. LOOP AT lt_fields_to_containers ASSIGNING . * output style is a NUMC field, the XML conversion will fail if it contains invalid value * field does not exist in all versions ASSIGN COMPONENT 'OUTPUTSTYLE' OF STRUCTURE TO . IF sy-subrc = 0 AND = ' '. CLEAR . ENDIF. ENDLOOP. APPEND INITIAL LINE TO rt_dynpro ASSIGNING . -header = ls_header. -containers = lt_containers. -fields = lt_fields_to_containers. condense_flow( IMPORTING et_spaces = -spaces CHANGING ct_flow = lt_flow_logic ). -flow_logic = lt_flow_logic. ENDLOOP. ENDMETHOD. "serialize_dynpros METHOD deserialize_dynpros. DATA: lv_name TYPE dwinactiv-obj_name, ls_dynpro LIKE LINE OF it_dynpros. * ls_dynpro is changed by the function module, a field-symbol will cause * the program to dump since it_dynpros cannot be changed LOOP AT it_dynpros INTO ls_dynpro. ls_dynpro-flow_logic = uncondense_flow( it_flow = ls_dynpro-flow_logic it_spaces = ls_dynpro-spaces ). CALL FUNCTION 'RPY_DYNPRO_INSERT' EXPORTING header = ls_dynpro-header suppress_exist_checks = abap_true TABLES containers = ls_dynpro-containers fields_to_containers = ls_dynpro-fields flow_logic = ls_dynpro-flow_logic EXCEPTIONS cancelled = 1 already_exists = 2 program_not_exists = 3 not_executed = 4 missing_required_field = 5 illegal_field_value = 6 field_not_allowed = 7 not_generated = 8 illegal_field_position = 9 OTHERS = 10. IF sy-subrc <> 2 AND sy-subrc <> 0. lcx_exception=>raise( 'error from RPY_DYNPRO_INSERT' ). ENDIF. * todo, RPY_DYNPRO_UPDATE? CONCATENATE ls_dynpro-header-program ls_dynpro-header-screen INTO lv_name RESPECTING BLANKS. ASSERT NOT lv_name IS INITIAL. lcl_objects_activation=>add( iv_type = 'DYNP' iv_name = lv_name ). ENDLOOP. ENDMETHOD. "deserialize_dynpros METHOD add_tpool. FIELD-SYMBOLS: LIKE LINE OF it_tpool, LIKE LINE OF rt_tpool. LOOP AT it_tpool ASSIGNING . APPEND INITIAL LINE TO rt_tpool ASSIGNING . MOVE-CORRESPONDING TO . IF -id = 'S'. -split = -entry. -entry = -entry+8. ENDIF. ENDLOOP. ENDMETHOD. "add_tpool METHOD read_tpool. FIELD-SYMBOLS: LIKE LINE OF it_tpool, LIKE LINE OF rt_tpool. LOOP AT it_tpool ASSIGNING . APPEND INITIAL LINE TO rt_tpool ASSIGNING . MOVE-CORRESPONDING TO . IF -id = 'S'. CONCATENATE -split -entry INTO -entry RESPECTING BLANKS. ENDIF. ENDLOOP. ENDMETHOD. "read_tpool METHOD deserialize_cua. DATA: ls_tr_key TYPE trkey. IF is_cua-adm IS INITIAL. RETURN. ENDIF. SELECT SINGLE devclass INTO ls_tr_key-devclass FROM tadir WHERE pgmid = 'R3TR' AND object = ms_item-obj_type AND obj_name = ms_item-obj_name. "#EC CI_GENBUFF IF sy-subrc <> 0. lcx_exception=>raise( 'not found in tadir' ). ENDIF. ls_tr_key-obj_type = ms_item-obj_type. ls_tr_key-obj_name = iv_program_name. ls_tr_key-sub_type = 'CUAD'. ls_tr_key-sub_name = ms_item-obj_name. sy-tcode = 'SE41' ##write_ok. " evil hack, workaround to handle fixes in note 2159455 CALL FUNCTION 'RS_CUA_INTERNAL_WRITE' EXPORTING program = ms_item-obj_name language = mv_language tr_key = ls_tr_key adm = is_cua-adm state = 'I' TABLES sta = is_cua-sta fun = is_cua-fun men = is_cua-men mtx = is_cua-mtx act = is_cua-act but = is_cua-but pfk = is_cua-pfk set = is_cua-set doc = is_cua-doc tit = is_cua-tit biv = is_cua-biv EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( 'error from RS_CUA_INTERNAL_WRITE' ). ENDIF. lcl_objects_activation=>add( iv_type = 'CUAD' iv_name = ms_item-obj_name ). ENDMETHOD. "deserialize_cua ENDCLASS. "lcl_objects_program IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_objects_super IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects_super IMPLEMENTATION. METHOD constructor. ms_item = is_item. ASSERT NOT ms_item IS INITIAL. mv_language = iv_language. ASSERT NOT mv_language IS INITIAL. ENDMETHOD. "constructor METHOD jump_se11. DATA: lt_bdcdata TYPE TABLE OF bdcdata. FIELD-SYMBOLS: LIKE LINE OF lt_bdcdata. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -program = 'SAPLSD_ENTRY'. -dynpro = '1000'. -dynbegin = abap_true. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = 'BDC_OKCODE'. -fval = '=WB_DISPLAY'. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = iv_radio. -fval = abap_true. APPEND INITIAL LINE TO lt_bdcdata ASSIGNING . -fnam = iv_field. -fval = ms_item-obj_name. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' STARTING NEW TASK 'GIT' EXPORTING tcode = 'SE11' 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. "jump_se11 METHOD get_metadata. rs_metadata-class = cl_abap_classdescr=>describe_by_object_ref( me )->get_relative_name( ). rs_metadata-version = 'v1.0.0' ##no_text. ENDMETHOD. "get_metadata METHOD corr_insert. DATA: ls_object TYPE ddenqs. ls_object-objtype = ms_item-obj_type. ls_object-objname = ms_item-obj_name. CALL FUNCTION 'RS_CORR_INSERT' EXPORTING object = ls_object object_class = 'DICT' devclass = iv_package master_language = mv_language mode = 'INSERT' EXCEPTIONS cancelled = 1 permission_failure = 2 unknown_objectclass = 3 OTHERS = 4. IF sy-subrc = 1. lcx_exception=>raise( 'Cancelled' ). ELSEIF sy-subrc <> 0. lcx_exception=>raise( 'error from RS_CORR_INSERT' ). ENDIF. ENDMETHOD. "corr_insert ENDCLASS. "lcl_objects_super IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_object DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_objects DEFINITION FINAL. PUBLIC SECTION. TYPES: ty_types_tt TYPE STANDARD TABLE OF tadir-object WITH DEFAULT KEY. CLASS-METHODS serialize IMPORTING is_item TYPE ty_item iv_language TYPE spras io_log TYPE REF TO lcl_log OPTIONAL RETURNING VALUE(rt_files) TYPE ty_files_tt RAISING lcx_exception. CLASS-METHODS deserialize IMPORTING io_repo TYPE REF TO lcl_repo RAISING lcx_exception. CLASS-METHODS delete IMPORTING it_tadir TYPE ty_tadir_tt RAISING lcx_exception. CLASS-METHODS jump IMPORTING is_item TYPE ty_item RAISING lcx_exception. CLASS-METHODS changed_by IMPORTING is_item TYPE ty_item RETURNING VALUE(rv_user) TYPE xubname RAISING lcx_exception. CLASS-METHODS is_supported IMPORTING is_item TYPE ty_item RETURNING VALUE(rv_bool) TYPE abap_bool. CLASS-METHODS exists IMPORTING is_item TYPE ty_item RETURNING VALUE(rv_bool) TYPE abap_bool. CLASS-METHODS supported_list RETURNING VALUE(rt_types) TYPE ty_types_tt. PRIVATE SECTION. CLASS-METHODS check_duplicates IMPORTING it_files TYPE ty_files_tt RAISING lcx_exception. CLASS-METHODS create_object IMPORTING is_item TYPE ty_item iv_language TYPE spras is_metadata TYPE ty_metadata OPTIONAL RETURNING VALUE(ri_obj) TYPE REF TO lif_object RAISING lcx_exception. CLASS-METHODS prioritize_deser IMPORTING it_results TYPE ty_results_tt RETURNING VALUE(rt_results) TYPE ty_results_tt. CLASS-METHODS path_to_package IMPORTING iv_top TYPE devclass iv_start TYPE string iv_path TYPE string RETURNING VALUE(rv_package) TYPE devclass RAISING lcx_exception. CLASS-METHODS class_name IMPORTING is_item TYPE ty_item RETURNING VALUE(rv_class_name) TYPE string. CLASS-METHODS resolve_ddic CHANGING ct_tadir TYPE ty_tadir_tt RAISING lcx_exception. CLASS-METHODS warning_overwrite IMPORTING io_repo TYPE REF TO lcl_repo CHANGING ct_results TYPE ty_results_tt RAISING lcx_exception. CLASS-METHODS warning_package IMPORTING is_item TYPE ty_item iv_package TYPE devclass RETURNING VALUE(rv_cancel) TYPE abap_bool RAISING lcx_exception. CLASS-METHODS update_package_tree IMPORTING iv_package TYPE devclass. CLASS-METHODS delete_obj IMPORTING is_item TYPE ty_item RAISING lcx_exception. ENDCLASS. "lcl_object DEFINITION