abapGit/src/zabapgit_object_fugr.prog.abap

655 lines
20 KiB
ABAP

*&---------------------------------------------------------------------*
*& Include ZABAPGIT_OBJECT_FUGR
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_object_fugr DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL.
PUBLIC SECTION.
INTERFACES lif_object.
ALIASES mo_files FOR lif_object~mo_files.
PRIVATE SECTION.
TYPES: ty_rs38l_incl_tt TYPE STANDARD TABLE OF rs38l_incl WITH DEFAULT KEY.
TYPES: BEGIN OF ty_function,
funcname TYPE rs38l_fnam,
include TYPE progname,
global_flag TYPE rs38l-global,
remote_call TYPE rs38l-remote,
update_task TYPE rs38l-utask,
short_text TYPE tftit-stext,
remote_basxml TYPE rs38l-basxml_enabled,
import TYPE STANDARD TABLE OF rsimp WITH DEFAULT KEY,
changing TYPE STANDARD TABLE OF rscha WITH DEFAULT KEY,
export TYPE STANDARD TABLE OF rsexp WITH DEFAULT KEY,
tables TYPE STANDARD TABLE OF rstbl WITH DEFAULT KEY,
exception TYPE STANDARD TABLE OF rsexc WITH DEFAULT KEY,
documentation TYPE STANDARD TABLE OF rsfdo WITH DEFAULT KEY,
END OF ty_function.
TYPES: ty_function_tt TYPE STANDARD TABLE OF ty_function WITH DEFAULT KEY.
METHODS main_name
RETURNING VALUE(rv_program) TYPE program
RAISING lcx_exception.
METHODS functions
RETURNING VALUE(rt_functab) TYPE ty_rs38l_incl_tt
RAISING lcx_exception.
METHODS includes
RETURNING VALUE(rt_includes) TYPE rso_t_objnm
RAISING lcx_exception.
METHODS serialize_functions
RETURNING VALUE(rt_functions) TYPE ty_function_tt
RAISING lcx_exception.
METHODS deserialize_functions
IMPORTING it_functions TYPE ty_function_tt
RAISING lcx_exception.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
RAISING lcx_exception.
METHODS deserialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
METHODS serialize_includes
RAISING lcx_exception.
METHODS deserialize_includes
IMPORTING io_xml TYPE REF TO lcl_xml_input
iv_package TYPE devclass
RAISING lcx_exception.
ENDCLASS. "lcl_object_fugr DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_object_dtel IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_object_fugr IMPLEMENTATION.
* function group SEUF
* function group SIFP
* function group SUNI
METHOD lif_object~has_changed_since.
DATA: lt_functab TYPE ty_rs38l_incl_tt,
lt_includes TYPE rso_t_objnm.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF lt_functab,
<include_name> LIKE LINE OF lt_includes.
lt_includes = includes( ). " Main prog also included here
LOOP AT lt_includes ASSIGNING <include_name>.
rv_changed = check_prog_changed_since(
iv_program = <include_name>
iv_timestamp = iv_timestamp ).
IF rv_changed = abap_true.
RETURN.
ENDIF.
ENDLOOP.
lt_functab = functions( ).
LOOP AT lt_functab ASSIGNING <ls_func>.
rv_changed = check_prog_changed_since(
iv_program = <ls_func>-include
iv_timestamp = iv_timestamp ).
IF rv_changed = abap_true.
RETURN.
ENDIF.
ENDLOOP.
ENDMETHOD. "lif_object~has_changed_since
METHOD lif_object~changed_by.
rv_user = c_user_unknown. " todo
ENDMETHOD.
METHOD lif_object~get_metadata.
rs_metadata = get_metadata( ).
ENDMETHOD. "lif_object~get_metadata
METHOD lif_object~exists.
DATA: lv_pool TYPE tlibg-area.
lv_pool = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_EXISTS'
EXPORTING
function_pool = lv_pool
EXCEPTIONS
pool_not_exists = 1.
rv_bool = boolc( sy-subrc <> 1 ).
ENDMETHOD. "lif_object~exists
METHOD deserialize_functions.
DATA: lv_include TYPE rs38l-include,
lv_area TYPE rs38l-area,
lt_source TYPE TABLE OF abaptxt255.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF it_functions.
LOOP AT it_functions ASSIGNING <ls_func>.
lt_source = mo_files->read_abap( iv_extra = <ls_func>-funcname ).
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = <ls_func>-funcname
IMPORTING
include = lv_include
EXCEPTIONS
function_not_exist = 1.
IF sy-subrc = 0.
* delete the function module to make sure the parameters are updated
* havent found a nice way to update the paramters
CALL FUNCTION 'FUNCTION_DELETE'
EXPORTING
funcname = <ls_func>-funcname
suppress_success_message = abap_true
EXCEPTIONS
error_message = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_DELETE' ).
ENDIF.
ENDIF.
CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT'
EXPORTING
funcname = <ls_func>-funcname
function_pool = lv_area
interface_global = <ls_func>-global_flag
remote_call = <ls_func>-remote_call
short_text = <ls_func>-short_text
update_task = <ls_func>-update_task
* NAMESPACE = ' ' todo
remote_basxml_supported = <ls_func>-remote_basxml
IMPORTING
function_include = lv_include
TABLES
import_parameter = <ls_func>-import
export_parameter = <ls_func>-export
tables_parameter = <ls_func>-tables
changing_parameter = <ls_func>-changing
exception_list = <ls_func>-exception
parameter_docu = <ls_func>-documentation
EXCEPTIONS
double_task = 1
error_message = 2
function_already_exists = 3
invalid_function_pool = 4
invalid_name = 5
too_many_functions = 6
no_modify_permission = 7
no_show_permission = 8
enqueue_system_failure = 9
canceled_in_corr = 10
OTHERS = 11.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_FUNCTIONMODULE_INSERT' ).
ENDIF.
INSERT REPORT lv_include FROM lt_source.
* lcl_objects_activation=>add( iv_type = 'FUNC'
* iv_name = <ls_func>-funcname ).
ENDLOOP.
ENDMETHOD. "deserialize_functions
METHOD deserialize_includes.
DATA: lo_xml TYPE REF TO lcl_xml_input,
ls_progdir TYPE ty_progdir,
lt_includes TYPE rso_t_objnm,
lt_tpool TYPE textpool_table,
lt_tpool_ext TYPE ty_tpool_tt,
lt_source TYPE TABLE OF abaptxt255.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF lt_includes.
io_xml->read( EXPORTING iv_name = 'INCLUDES'
CHANGING cg_data = lt_includes ).
LOOP AT lt_includes ASSIGNING <lv_include>.
lt_source = mo_files->read_abap( iv_extra = <lv_include> ).
lo_xml = mo_files->read_xml( <lv_include> ).
lo_xml->read( EXPORTING iv_name = 'PROGDIR'
CHANGING cg_data = ls_progdir ).
lo_xml->read( EXPORTING iv_name = 'TPOOL'
CHANGING cg_data = lt_tpool_ext ).
lt_tpool = read_tpool( lt_tpool_ext ).
deserialize_program( is_progdir = ls_progdir
it_source = lt_source
it_tpool = lt_tpool
iv_package = iv_package ).
ENDLOOP.
ENDMETHOD. "deserialize_includes
METHOD deserialize_xml.
DATA: lv_complete TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lv_areat TYPE tlibt-areat,
lv_stext TYPE tftit-stext,
lv_group TYPE rs38l-area.
lv_complete = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_complete
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
include_not_exists = 1
group_not_exists = 2
no_selections = 3
no_function_include = 4
no_function_pool = 5
delimiter_wrong_position = 6
no_customer_function_group = 7
no_customer_function_include = 8
reserved_name_customer = 9
namespace_too_long = 10
area_length_error = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
io_xml->read( EXPORTING iv_name = 'AREAT'
CHANGING cg_data = lv_areat ).
lv_stext = lv_areat.
CALL FUNCTION 'RS_FUNCTION_POOL_INSERT'
EXPORTING
function_pool = lv_group
short_text = lv_stext
namespace = lv_namespace
devclass = iv_package
EXCEPTIONS
name_already_exists = 1
name_not_correct = 2
function_already_exists = 3
invalid_function_pool = 4
invalid_name = 5
too_many_functions = 6
no_modify_permission = 7
no_show_permission = 8
enqueue_system_failure = 9
canceled_in_corr = 10
undefined_error = 11
OTHERS = 12.
IF sy-subrc <> 0 AND sy-subrc <> 1 AND sy-subrc <> 3.
* todo, change description
lcx_exception=>raise( 'error from RS_FUNCTION_POOL_INSERT' ).
ENDIF.
ENDMETHOD. "deserialize_xml
METHOD serialize_xml.
DATA: lt_functab TYPE ty_rs38l_incl_tt,
lt_includes TYPE rso_t_objnm,
lv_areat TYPE tlibt-areat.
SELECT SINGLE areat INTO lv_areat
FROM tlibt
WHERE spras = mv_language
AND area = ms_item-obj_name. "#EC CI_GENBUFF
IF sy-subrc <> 0.
lcx_exception=>raise( 'not found in TLIBT' ).
ENDIF.
lt_functab = functions( ).
lt_includes = includes( ).
io_xml->add( iv_name = 'AREAT'
ig_data = lv_areat ).
io_xml->add( iv_name = 'INCLUDES'
ig_data = lt_includes ).
ENDMETHOD. "serialize_xml
METHOD includes.
DATA: lv_program TYPE program,
lv_cnam TYPE reposrc-cnam,
lv_tabix LIKE sy-tabix,
lt_functab TYPE ty_rs38l_incl_tt.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF rt_includes,
<ls_func> LIKE LINE OF lt_functab.
lv_program = main_name( ).
lt_functab = functions( ).
CALL FUNCTION 'RS_GET_ALL_INCLUDES'
EXPORTING
program = lv_program
* WITH_RESERVED_INCLUDES =
* WITH_CLASS_INCLUDES = ' ' hmm, todo
TABLES
includetab = rt_includes
EXCEPTIONS
not_existent = 1
no_program = 2
OTHERS = 3.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_GET_ALL_INCLUDES' ).
ENDIF.
LOOP AT lt_functab ASSIGNING <ls_func>.
DELETE TABLE rt_includes FROM <ls_func>-include.
ENDLOOP.
LOOP AT rt_includes ASSIGNING <lv_include>.
lv_tabix = sy-tabix.
* skip SAP standard includes
SELECT SINGLE cnam FROM reposrc INTO lv_cnam
WHERE progname = <lv_include>
AND r3state = 'A'
AND cnam = 'SAP'.
IF sy-subrc = 0.
DELETE rt_includes INDEX lv_tabix.
CONTINUE.
ENDIF.
* also make sure the include exists
SELECT SINGLE cnam FROM reposrc INTO lv_cnam
WHERE progname = <lv_include>
AND r3state = 'A'.
IF sy-subrc <> 0.
DELETE rt_includes INDEX lv_tabix.
ENDIF.
ENDLOOP.
APPEND lv_program TO rt_includes.
ENDMETHOD. "includes
METHOD functions.
DATA: lv_area TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_CONTENTS'
EXPORTING
function_pool = lv_area
TABLES
functab = rt_functab
EXCEPTIONS
function_pool_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RS_FUNCTION_POOL_CONTENTS' ).
ENDIF.
ENDMETHOD. "functions
METHOD main_name.
DATA: lv_area TYPE rs38l-area,
lv_namespace TYPE rs38l-namespace,
lv_group TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
complete_area = lv_area
IMPORTING
namespace = lv_namespace
group = lv_group
EXCEPTIONS
include_not_exists = 1
group_not_exists = 2
no_selections = 3
no_function_include = 4
no_function_pool = 5
delimiter_wrong_position = 6
no_customer_function_group = 7
no_customer_function_include = 8
reserved_name_customer = 9
namespace_too_long = 10
area_length_error = 11
OTHERS = 12.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from FUNCTION_INCLUDE_SPLIT' ).
ENDIF.
CONCATENATE lv_namespace 'SAPL' lv_group INTO rv_program.
ENDMETHOD. "main_name
METHOD serialize_functions.
DATA:
lt_source TYPE TABLE OF rssource,
lt_functab TYPE ty_rs38l_incl_tt,
lt_new_source TYPE rsfb_source.
FIELD-SYMBOLS: <ls_func> LIKE LINE OF lt_functab,
<ls_ret> LIKE LINE OF rt_functions.
lt_functab = functions( ).
LOOP AT lt_functab ASSIGNING <ls_func>.
* fm RPY_FUNCTIONMODULE_READ does not support source code
* lines longer than 72 characters
APPEND INITIAL LINE TO rt_functions ASSIGNING <ls_ret>.
MOVE-CORRESPONDING <ls_func> TO <ls_ret>.
CALL FUNCTION 'RPY_FUNCTIONMODULE_READ_NEW'
EXPORTING
functionname = <ls_func>-funcname
IMPORTING
global_flag = <ls_ret>-global_flag
remote_call = <ls_ret>-remote_call
update_task = <ls_ret>-update_task
short_text = <ls_ret>-short_text
remote_basxml_supported = <ls_ret>-remote_basxml
TABLES
import_parameter = <ls_ret>-import
changing_parameter = <ls_ret>-changing
export_parameter = <ls_ret>-export
tables_parameter = <ls_ret>-tables
exception_list = <ls_ret>-exception
documentation = <ls_ret>-documentation
source = lt_source
CHANGING
new_source = lt_new_source
EXCEPTIONS
error_message = 1
function_not_found = 2
invalid_name = 3
OTHERS = 4.
IF sy-subrc <> 0.
lcx_exception=>raise( 'Error from RPY_FUNCTIONMODULE_READ_NEW' ).
ENDIF.
IF NOT lt_new_source IS INITIAL.
mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_new_source ).
ELSE.
mo_files->add_abap( iv_extra = <ls_func>-funcname
it_abap = lt_source ).
ENDIF.
ENDLOOP.
ENDMETHOD. "serialize_functions
METHOD serialize_includes.
DATA: lt_includes TYPE rso_t_objnm.
FIELD-SYMBOLS: <lv_include> LIKE LINE OF lt_includes.
lt_includes = includes( ).
LOOP AT lt_includes ASSIGNING <lv_include>.
* todo, filename is not correct, a include can be used in several programs
serialize_program( is_item = ms_item
io_files = mo_files
iv_program = <lv_include>
iv_extra = <lv_include> ).
ENDLOOP.
ENDMETHOD. "serialize_includes
METHOD lif_object~serialize.
DATA: lt_functions TYPE ty_function_tt,
ls_progdir TYPE ty_progdir,
lv_program_name TYPE programm,
lt_dynpros TYPE ty_dynpro_tt,
ls_cua TYPE ty_cua.
IF lif_object~exists( ) = abap_false.
RETURN.
ENDIF.
serialize_xml( io_xml ).
lt_functions = serialize_functions( ).
io_xml->add( iv_name = 'FUNCTIONS'
ig_data = lt_functions ).
serialize_includes( ).
lv_program_name = main_name( ).
ls_progdir = read_progdir( lv_program_name ).
IF ls_progdir-subc = 'F'.
lt_dynpros = serialize_dynpros( lv_program_name ).
io_xml->add( iv_name = 'DYNPROS'
ig_data = lt_dynpros ).
ls_cua = serialize_cua( lv_program_name ).
io_xml->add( iv_name = 'CUA'
ig_data = ls_cua ).
ENDIF.
ENDMETHOD. "serialize
METHOD lif_object~deserialize.
DATA: lv_program_name TYPE programm,
lt_functions TYPE ty_function_tt,
lt_dynpros TYPE ty_dynpro_tt,
ls_cua TYPE ty_cua.
deserialize_xml(
io_xml = io_xml
iv_package = iv_package ).
io_xml->read( EXPORTING iv_name = 'FUNCTIONS'
CHANGING cg_data = lt_functions ).
deserialize_functions( lt_functions ).
deserialize_includes(
io_xml = io_xml
iv_package = iv_package ).
lv_program_name = main_name( ).
io_xml->read( EXPORTING iv_name = 'DYNPROS'
CHANGING cg_data = lt_dynpros ).
deserialize_dynpros( it_dynpros = lt_dynpros ).
io_xml->read( EXPORTING iv_name = 'CUA'
CHANGING cg_data = ls_cua ).
deserialize_cua( iv_program_name = lv_program_name
is_cua = ls_cua ).
ENDMETHOD. "deserialize
METHOD lif_object~delete.
DATA: lv_area TYPE rs38l-area.
lv_area = ms_item-obj_name.
CALL FUNCTION 'RS_FUNCTION_POOL_DELETE'
EXPORTING
area = lv_area
suppress_popups = abap_true
skip_progress_ind = abap_true
EXCEPTIONS
canceled_in_corr = 1
enqueue_system_failure = 2
function_exist = 3
not_executed = 4
no_modify_permission = 5
no_show_permission = 6
permission_failure = 7
pool_not_exist = 8
cancelled = 9
OTHERS = 10.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from RS_FUNCTION_POOL_DELETE' ).
ENDIF.
ENDMETHOD. "delete
METHOD lif_object~jump.
CALL FUNCTION 'RS_TOOL_ACCESS'
EXPORTING
operation = 'SHOW'
object_name = ms_item-obj_name
object_type = 'FUGR'
in_new_window = abap_true.
ENDMETHOD. "jump
ENDCLASS. "lcl_object_fugr IMPLEMENTATION