mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
Merge pull request #597 from EduardoCopat/clas-intf-separation
Clas intf separation
This commit is contained in:
commit
42ce84257a
File diff suppressed because it is too large
Load Diff
318
src/zabapgit_object_intf.prog.abap
Normal file
318
src/zabapgit_object_intf.prog.abap
Normal file
|
@ -0,0 +1,318 @@
|
|||
*&---------------------------------------------------------------------*
|
||||
*& Include ZABAPGIT_OBJECT_INTF
|
||||
*&---------------------------------------------------------------------*
|
||||
|
||||
*----------------------------------------------------------------------*
|
||||
* CLASS lcl_object_intf DEFINITION
|
||||
*----------------------------------------------------------------------*
|
||||
*
|
||||
*----------------------------------------------------------------------*
|
||||
CLASS lcl_object_intf DEFINITION FINAL INHERITING FROM lcl_objects_program.
|
||||
PUBLIC SECTION.
|
||||
INTERFACES lif_object.
|
||||
ALIASES mo_files FOR lif_object~mo_files.
|
||||
METHODS constructor
|
||||
IMPORTING
|
||||
is_item TYPE ty_item
|
||||
iv_language TYPE spras.
|
||||
PROTECTED SECTION.
|
||||
METHODS deserialize_abap
|
||||
IMPORTING io_xml TYPE REF TO lcl_xml_input
|
||||
iv_package TYPE devclass
|
||||
RAISING lcx_exception.
|
||||
|
||||
METHODS deserialize_docu
|
||||
IMPORTING io_xml TYPE REF TO lcl_xml_input
|
||||
RAISING lcx_exception.
|
||||
|
||||
PRIVATE SECTION.
|
||||
DATA mo_object_oriented_object_fct TYPE REF TO lif_object_oriented_object_fnc.
|
||||
|
||||
METHODS serialize_xml
|
||||
IMPORTING io_xml TYPE REF TO lcl_xml_output
|
||||
RAISING lcx_exception.
|
||||
ENDCLASS. "lcl_object_intf DEFINITION
|
||||
CLASS lcl_object_intf IMPLEMENTATION.
|
||||
METHOD constructor.
|
||||
super->constructor(
|
||||
is_item = is_item
|
||||
iv_language = iv_language ).
|
||||
mo_object_oriented_object_fct = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ).
|
||||
ENDMETHOD.
|
||||
METHOD lif_object~deserialize.
|
||||
deserialize_abap( io_xml = io_xml
|
||||
iv_package = iv_package ).
|
||||
|
||||
deserialize_docu( io_xml ).
|
||||
ENDMETHOD.
|
||||
METHOD deserialize_abap.
|
||||
DATA: ls_vseointerf TYPE vseointerf,
|
||||
lt_source TYPE seop_source_string,
|
||||
lt_descriptions TYPE ty_seocompotx_tt,
|
||||
ls_clskey TYPE seoclskey.
|
||||
ls_clskey-clsname = ms_item-obj_name.
|
||||
|
||||
lt_source = mo_files->read_abap( ).
|
||||
|
||||
io_xml->read( EXPORTING iv_name = 'VSEOINTERF'
|
||||
CHANGING cg_data = ls_vseointerf ).
|
||||
|
||||
mo_object_oriented_object_fct->create(
|
||||
EXPORTING
|
||||
iv_package = iv_package
|
||||
CHANGING
|
||||
is_properties = ls_vseointerf ).
|
||||
|
||||
mo_object_oriented_object_fct->deserialize_source(
|
||||
is_key = ls_clskey
|
||||
it_source = lt_source ).
|
||||
|
||||
io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
|
||||
CHANGING cg_data = lt_descriptions ).
|
||||
|
||||
mo_object_oriented_object_fct->update_descriptions(
|
||||
is_key = ls_clskey
|
||||
it_descriptions = lt_descriptions ).
|
||||
|
||||
mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ).
|
||||
ENDMETHOD.
|
||||
METHOD deserialize_docu.
|
||||
|
||||
DATA: lt_lines TYPE tlinetab,
|
||||
lv_object TYPE dokhl-object.
|
||||
|
||||
io_xml->read( EXPORTING iv_name = 'LINES'
|
||||
CHANGING cg_data = lt_lines ).
|
||||
|
||||
IF lt_lines[] IS INITIAL.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
lv_object = ms_item-obj_name.
|
||||
|
||||
mo_object_oriented_object_fct->create_documentation(
|
||||
it_lines = lt_lines
|
||||
iv_object_name = lv_object
|
||||
iv_language = mv_language ).
|
||||
ENDMETHOD.
|
||||
METHOD lif_object~has_changed_since.
|
||||
DATA:
|
||||
lv_program TYPE program,
|
||||
lt_includes TYPE seoincl_t.
|
||||
|
||||
lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ).
|
||||
READ TABLE lt_includes INDEX 1 INTO lv_program.
|
||||
"lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ).
|
||||
rv_changed = check_prog_changed_since(
|
||||
iv_program = lv_program
|
||||
iv_timestamp = iv_timestamp
|
||||
iv_skip_gui = abap_true ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~serialize.
|
||||
|
||||
DATA: lt_source TYPE seop_source_string,
|
||||
ls_interface_key TYPE seoclskey.
|
||||
|
||||
ls_interface_key-clsname = ms_item-obj_name.
|
||||
|
||||
IF lif_object~exists( ) = abap_false.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
|
||||
CALL FUNCTION 'SEO_BUFFER_REFRESH'
|
||||
EXPORTING
|
||||
version = seoc_version_active
|
||||
force = seox_true.
|
||||
CALL FUNCTION 'SEO_BUFFER_REFRESH'
|
||||
EXPORTING
|
||||
version = seoc_version_inactive
|
||||
force = seox_true.
|
||||
|
||||
lt_source = mo_object_oriented_object_fct->serialize_abap( ls_interface_key ).
|
||||
|
||||
mo_files->add_abap( lt_source ).
|
||||
|
||||
serialize_xml( io_xml ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD serialize_xml.
|
||||
DATA:
|
||||
lt_tpool TYPE textpool_table,
|
||||
lv_object TYPE dokhl-object,
|
||||
lv_state TYPE dokhl-dokstate,
|
||||
lt_descriptions TYPE ty_seocompotx_tt,
|
||||
ls_vseointerf TYPE vseointerf,
|
||||
ls_clskey TYPE seoclskey,
|
||||
lt_sotr TYPE ty_sotr_tt,
|
||||
lt_lines TYPE tlinetab.
|
||||
|
||||
|
||||
ls_clskey-clsname = ms_item-obj_name.
|
||||
|
||||
ls_vseointerf = mo_object_oriented_object_fct->get_interface_properties( is_interface_key = ls_clskey ).
|
||||
|
||||
CLEAR: ls_vseointerf-uuid,
|
||||
ls_vseointerf-author,
|
||||
ls_vseointerf-createdon,
|
||||
ls_vseointerf-changedby,
|
||||
ls_vseointerf-changedon,
|
||||
ls_vseointerf-r3release.
|
||||
|
||||
io_xml->add( iv_name = 'VSEOINTERF'
|
||||
ig_data = ls_vseointerf ).
|
||||
|
||||
lt_lines = mo_object_oriented_object_fct->read_documentation(
|
||||
iv_class_name = ls_clskey-clsname
|
||||
iv_language = mv_language ).
|
||||
IF lines( lt_lines ) > 0.
|
||||
io_xml->add( iv_name = 'LINES'
|
||||
ig_data = lt_lines ).
|
||||
ENDIF.
|
||||
|
||||
lt_descriptions = mo_object_oriented_object_fct->read_descriptions( ls_clskey-clsname ).
|
||||
IF lines( lt_descriptions ) > 0.
|
||||
io_xml->add( iv_name = 'DESCRIPTIONS'
|
||||
ig_data = lt_descriptions ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~changed_by.
|
||||
TYPES: BEGIN OF ty_includes,
|
||||
programm TYPE programm,
|
||||
END OF ty_includes.
|
||||
|
||||
TYPES: BEGIN OF ty_reposrc,
|
||||
unam TYPE reposrc-unam,
|
||||
udat TYPE reposrc-udat,
|
||||
utime TYPE reposrc-utime,
|
||||
END OF ty_reposrc.
|
||||
|
||||
DATA: lt_reposrc TYPE STANDARD TABLE OF ty_reposrc,
|
||||
ls_reposrc LIKE LINE OF lt_reposrc,
|
||||
lt_includes TYPE STANDARD TABLE OF ty_includes.
|
||||
|
||||
lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ).
|
||||
ASSERT lines( lt_includes ) > 0.
|
||||
|
||||
SELECT unam udat utime FROM reposrc
|
||||
INTO TABLE lt_reposrc
|
||||
FOR ALL ENTRIES IN lt_includes
|
||||
WHERE progname = lt_includes-programm
|
||||
AND r3state = 'A'.
|
||||
IF sy-subrc <> 0.
|
||||
rv_user = c_user_unknown.
|
||||
ELSE.
|
||||
SORT lt_reposrc BY udat DESCENDING utime DESCENDING.
|
||||
READ TABLE lt_reposrc INDEX 1 INTO ls_reposrc.
|
||||
ASSERT sy-subrc = 0.
|
||||
rv_user = ls_reposrc-unam.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~compare_to_remote_version.
|
||||
CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~delete.
|
||||
DATA: ls_clskey TYPE seoclskey.
|
||||
ls_clskey-clsname = ms_item-obj_name.
|
||||
|
||||
mo_object_oriented_object_fct->delete( ls_clskey ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~exists.
|
||||
DATA: ls_class_key TYPE seoclskey.
|
||||
ls_class_key-clsname = ms_item-obj_name.
|
||||
|
||||
rv_bool = mo_object_oriented_object_fct->exists( iv_object_name = ls_class_key ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~get_metadata.
|
||||
rs_metadata = get_metadata( ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object~jump.
|
||||
CALL FUNCTION 'RS_TOOL_ACCESS'
|
||||
EXPORTING
|
||||
operation = 'SHOW'
|
||||
object_name = ms_item-obj_name
|
||||
object_type = 'INTF'
|
||||
in_new_window = abap_true.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
|
||||
|
||||
CLASS lcl_object_oriented_interface DEFINITION
|
||||
INHERITING FROM lcl_object_oriented_base.
|
||||
PUBLIC SECTION.
|
||||
METHODS:
|
||||
lif_object_oriented_object_fnc~create REDEFINITION,
|
||||
lif_object_oriented_object_fnc~get_includes REDEFINITION,
|
||||
lif_object_oriented_object_fnc~get_interface_properties REDEFINITION,
|
||||
lif_object_oriented_object_fnc~delete REDEFINITION.
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_object_oriented_interface IMPLEMENTATION.
|
||||
METHOD lif_object_oriented_object_fnc~create.
|
||||
CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE'
|
||||
EXPORTING
|
||||
devclass = iv_package
|
||||
overwrite = iv_overwrite
|
||||
CHANGING
|
||||
interface = is_properties
|
||||
EXCEPTIONS
|
||||
existing = 1
|
||||
is_class = 2
|
||||
db_error = 3
|
||||
component_error = 4
|
||||
no_access = 5
|
||||
other = 6
|
||||
OTHERS = 7.
|
||||
IF sy-subrc <> 0.
|
||||
lcx_exception=>raise( 'Error from SEO_INTERFACE_CREATE_COMPLETE' ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
METHOD lif_object_oriented_object_fnc~get_includes.
|
||||
DATA lv_interface_name TYPE seoclsname.
|
||||
lv_interface_name = iv_object_name.
|
||||
APPEND cl_oo_classname_service=>get_interfacepool_name( lv_interface_name ) TO rt_includes.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~get_interface_properties.
|
||||
CALL FUNCTION 'SEO_CLIF_GET'
|
||||
EXPORTING
|
||||
cifkey = is_interface_key
|
||||
version = seoc_version_active
|
||||
IMPORTING
|
||||
interface = rs_interface_properties
|
||||
EXCEPTIONS
|
||||
not_existing = 1
|
||||
deleted = 2
|
||||
model_only = 3
|
||||
OTHERS = 4.
|
||||
IF sy-subrc = 1.
|
||||
RETURN. " in case only inactive version exists
|
||||
ELSEIF sy-subrc <> 0.
|
||||
lcx_exception=>raise( 'error from seo_clif_get' ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~delete.
|
||||
CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE'
|
||||
EXPORTING
|
||||
intkey = is_deletion_key
|
||||
EXCEPTIONS
|
||||
not_existing = 1
|
||||
is_class = 2
|
||||
db_error = 3
|
||||
no_access = 4
|
||||
other = 5
|
||||
OTHERS = 6.
|
||||
IF sy-subrc <> 0.
|
||||
lcx_exception=>raise( 'Error from SEO_INTERFACE_DELETE_COMPLETE' ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
22
src/zabapgit_object_intf.prog.xml
Normal file
22
src/zabapgit_object_intf.prog.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_OBJECT_INTF</NAME>
|
||||
<STATE>A</STATE>
|
||||
<VARCL>X</VARCL>
|
||||
<SUBC>I</SUBC>
|
||||
<RLOAD>E</RLOAD>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<ENTRY>Include ZABAPGIT_OBJECT_INTF</ENTRY>
|
||||
<LENGTH>28</LENGTH>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
29
src/zabapgit_object_oo_factory.prog.abap
Normal file
29
src/zabapgit_object_oo_factory.prog.abap
Normal file
|
@ -0,0 +1,29 @@
|
|||
*&---------------------------------------------------------------------*
|
||||
*& Include zabapgit_object_oo_factory
|
||||
*&---------------------------------------------------------------------*
|
||||
CLASS lcl_object_oriented_factory IMPLEMENTATION.
|
||||
METHOD make.
|
||||
IF go_object_oriented_object IS BOUND.
|
||||
ro_object_oriented_object = go_object_oriented_object.
|
||||
RETURN.
|
||||
ENDIF.
|
||||
IF iv_object_type = 'CLAS'.
|
||||
CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_class.
|
||||
ELSEIF iv_object_type = 'INTF'.
|
||||
CREATE OBJECT ro_object_oriented_object TYPE lcl_object_oriented_interface.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lth_oo_factory_injector DEFINITION FOR TESTING.
|
||||
PUBLIC SECTION.
|
||||
CLASS-METHODS:
|
||||
inject
|
||||
IMPORTING
|
||||
io_object_oriented_object TYPE REF TO lif_object_oriented_object_fnc.
|
||||
ENDCLASS.
|
||||
CLASS lth_oo_factory_injector IMPLEMENTATION.
|
||||
METHOD inject.
|
||||
lcl_object_oriented_factory=>go_object_oriented_object = io_object_oriented_object.
|
||||
ENDMETHOD.
|
||||
ENDCLASS.
|
25
src/zabapgit_object_oo_factory.prog.xml
Normal file
25
src/zabapgit_object_oo_factory.prog.xml
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_OBJECT_OO_FACTORY</NAME>
|
||||
<STATE>A</STATE>
|
||||
<VARCL>X</VARCL>
|
||||
<DBAPL>S</DBAPL>
|
||||
<DBNA>D$</DBNA>
|
||||
<SUBC>I</SUBC>
|
||||
<FIXPT>X</FIXPT>
|
||||
<LDBNAME>D$S</LDBNAME>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<ENTRY>Include ZABAPGIT_OBJECT_OO_FACTORY</ENTRY>
|
||||
<LENGTH>34</LENGTH>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
630
src/zabapgit_object_oo_functions.prog.abap
Normal file
630
src/zabapgit_object_oo_functions.prog.abap
Normal file
|
@ -0,0 +1,630 @@
|
|||
"This interface contains SAP object oriented functions that can't be put under test
|
||||
"(i.e. creating a Class in the system)
|
||||
INTERFACE lif_object_oriented_object_fnc.
|
||||
TYPES: BEGIN OF ty_includes,
|
||||
programm TYPE programm,
|
||||
END OF ty_includes,
|
||||
ty_includes_tt TYPE STANDARD TABLE OF ty_includes WITH DEFAULT KEY.
|
||||
|
||||
METHODS:
|
||||
create
|
||||
IMPORTING
|
||||
iv_package TYPE devclass
|
||||
iv_overwrite TYPE seox_boolean DEFAULT seox_true
|
||||
CHANGING
|
||||
is_properties TYPE any
|
||||
RAISING
|
||||
lcx_exception,
|
||||
generate_locals
|
||||
IMPORTING
|
||||
is_key TYPE seoclskey
|
||||
iv_force TYPE seox_boolean DEFAULT seox_true
|
||||
it_local_definitions TYPE seop_source_string OPTIONAL
|
||||
it_local_implementations TYPE seop_source_string OPTIONAL
|
||||
it_local_macros TYPE seop_source_string OPTIONAL
|
||||
it_local_test_classes TYPE seop_source_string OPTIONAL
|
||||
RAISING
|
||||
lcx_exception,
|
||||
deserialize_source
|
||||
IMPORTING
|
||||
is_key TYPE seoclskey
|
||||
it_source TYPE ty_string_tt
|
||||
RAISING
|
||||
lcx_exception
|
||||
cx_sy_dyn_call_error,
|
||||
insert_text_pool
|
||||
IMPORTING
|
||||
iv_class_name TYPE seoclsname
|
||||
it_text_pool TYPE textpool_table
|
||||
iv_language TYPE spras
|
||||
RAISING
|
||||
lcx_exception,
|
||||
update_descriptions
|
||||
IMPORTING
|
||||
is_key TYPE seoclskey
|
||||
it_descriptions TYPE ty_seocompotx_tt,
|
||||
add_to_activation_list
|
||||
IMPORTING
|
||||
is_item TYPE ty_item
|
||||
RAISING
|
||||
lcx_exception,
|
||||
create_sotr
|
||||
IMPORTING
|
||||
iv_package TYPE devclass
|
||||
it_sotr TYPE ty_sotr_tt
|
||||
RAISING
|
||||
lcx_exception,
|
||||
create_documentation
|
||||
IMPORTING
|
||||
it_lines TYPE tlinetab
|
||||
iv_object_name TYPE dokhl-object
|
||||
iv_language TYPE spras
|
||||
RAISING
|
||||
lcx_exception,
|
||||
get_includes
|
||||
IMPORTING
|
||||
iv_object_name TYPE sobj_name
|
||||
RETURNING
|
||||
VALUE(rt_includes) TYPE ty_includes_tt,
|
||||
exists
|
||||
IMPORTING
|
||||
iv_object_name TYPE seoclskey
|
||||
RETURNING
|
||||
VALUE(rv_exists) TYPE abap_bool,
|
||||
serialize_abap
|
||||
IMPORTING
|
||||
is_class_key TYPE seoclskey
|
||||
iv_type TYPE seop_include_ext_app OPTIONAL
|
||||
RETURNING
|
||||
VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING
|
||||
lcx_exception
|
||||
cx_sy_dyn_call_error,
|
||||
get_skip_test_classes
|
||||
RETURNING
|
||||
VALUE(rv_skip) TYPE abap_bool,
|
||||
get_class_properties
|
||||
IMPORTING
|
||||
is_class_key TYPE seoclskey
|
||||
RETURNING
|
||||
VALUE(rs_class_properties) TYPE vseoclass
|
||||
RAISING
|
||||
lcx_exception,
|
||||
get_interface_properties
|
||||
IMPORTING
|
||||
is_interface_key TYPE seoclskey
|
||||
RETURNING
|
||||
VALUE(rs_interface_properties) TYPE vseointerf
|
||||
RAISING
|
||||
lcx_exception,
|
||||
read_text_pool
|
||||
IMPORTING
|
||||
iv_class_name TYPE seoclsname
|
||||
iv_language TYPE spras
|
||||
RETURNING
|
||||
VALUE(rt_text_pool) TYPE textpool_table,
|
||||
read_documentation
|
||||
IMPORTING
|
||||
iv_class_name TYPE seoclsname
|
||||
iv_language TYPE spras
|
||||
RETURNING
|
||||
VALUE(rt_lines) TYPE tlinetab,
|
||||
read_sotr
|
||||
IMPORTING
|
||||
iv_object_name TYPE sobj_name
|
||||
RETURNING
|
||||
VALUE(rt_sotr) TYPE ty_sotr_tt
|
||||
RAISING
|
||||
lcx_exception,
|
||||
read_descriptions
|
||||
IMPORTING
|
||||
iv_obejct_name TYPE seoclsname
|
||||
RETURNING
|
||||
VALUE(rt_descriptions) TYPE ty_seocompotx_tt,
|
||||
delete
|
||||
IMPORTING
|
||||
is_deletion_key TYPE seoclskey
|
||||
RAISING
|
||||
lcx_exception.
|
||||
ENDINTERFACE.
|
||||
|
||||
CLASS lcl_oo_object_serializer DEFINITION.
|
||||
PUBLIC SECTION.
|
||||
|
||||
METHODS:
|
||||
serialize_abap_clif_source
|
||||
IMPORTING
|
||||
is_class_key TYPE seoclskey
|
||||
iv_type TYPE seop_include_ext_app OPTIONAL
|
||||
RETURNING
|
||||
VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING
|
||||
lcx_exception
|
||||
cx_sy_dyn_call_error,
|
||||
are_test_classes_skipped
|
||||
RETURNING
|
||||
VALUE(rv_return) TYPE abap_bool.
|
||||
METHODS serialize_locals_imp
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
RETURNING VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING lcx_exception.
|
||||
|
||||
METHODS serialize_locals_def
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
RETURNING VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING lcx_exception.
|
||||
METHODS serialize_testclasses
|
||||
IMPORTING
|
||||
is_clskey TYPE seoclskey
|
||||
RETURNING VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING lcx_exception.
|
||||
|
||||
METHODS serialize_macros
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
RETURNING VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING lcx_exception.
|
||||
PRIVATE SECTION.
|
||||
DATA mv_skip_testclass TYPE abap_bool.
|
||||
METHODS serialize_abap_old
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
RETURNING VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING lcx_exception.
|
||||
|
||||
METHODS serialize_abap_new
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
RETURNING VALUE(rt_source) TYPE ty_string_tt
|
||||
RAISING lcx_exception
|
||||
cx_sy_dyn_call_error.
|
||||
METHODS remove_signatures
|
||||
CHANGING ct_source TYPE ty_string_tt.
|
||||
|
||||
METHODS read_include
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
iv_type TYPE seop_include_ext_app
|
||||
RETURNING VALUE(rt_source) TYPE seop_source_string.
|
||||
|
||||
|
||||
METHODS reduce
|
||||
CHANGING ct_source TYPE ty_string_tt.
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_oo_object_serializer IMPLEMENTATION.
|
||||
METHOD serialize_abap_clif_source.
|
||||
TRY.
|
||||
rt_source = serialize_abap_new( is_class_key ).
|
||||
CATCH cx_sy_dyn_call_error.
|
||||
rt_source = serialize_abap_old( is_class_key ).
|
||||
ENDTRY.
|
||||
ENDMETHOD.
|
||||
METHOD serialize_abap_old.
|
||||
* for old ABAP AS versions
|
||||
DATA: lo_source TYPE REF TO cl_oo_source.
|
||||
|
||||
CREATE OBJECT lo_source
|
||||
EXPORTING
|
||||
clskey = is_clskey
|
||||
EXCEPTIONS
|
||||
class_not_existing = 1
|
||||
OTHERS = 2.
|
||||
IF sy-subrc <> 0.
|
||||
lcx_exception=>raise( 'error from CL_OO_SOURCE' ).
|
||||
ENDIF.
|
||||
|
||||
lo_source->read( 'A' ).
|
||||
rt_source = lo_source->get_old_source( ).
|
||||
remove_signatures( CHANGING ct_source = rt_source ).
|
||||
|
||||
ENDMETHOD. "serialize_abap
|
||||
|
||||
METHOD serialize_abap_new.
|
||||
|
||||
DATA: lo_source TYPE REF TO object,
|
||||
lo_instance TYPE REF TO object.
|
||||
|
||||
* do not call the class/methods statically, as it will
|
||||
* give syntax errors on old versions
|
||||
CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE')
|
||||
RECEIVING
|
||||
result = lo_instance.
|
||||
|
||||
CALL METHOD lo_instance->('CREATE_CLIF_SOURCE')
|
||||
EXPORTING
|
||||
clif_name = is_clskey-clsname
|
||||
version = 'A'
|
||||
RECEIVING
|
||||
result = lo_source.
|
||||
|
||||
CALL METHOD lo_source->('GET_SOURCE')
|
||||
IMPORTING
|
||||
source = rt_source.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD remove_signatures.
|
||||
|
||||
* signatures messes up in CL_OO_SOURCE when deserializing and serializing
|
||||
* within same session
|
||||
|
||||
DATA: lv_begin TYPE string,
|
||||
lv_end TYPE string,
|
||||
lv_remove TYPE sap_bool,
|
||||
lv_source LIKE LINE OF ct_source.
|
||||
|
||||
"@TODO: Put under test
|
||||
CONCATENATE '* <SIGNATURE>------------------------------------'
|
||||
'---------------------------------------------------+'
|
||||
INTO lv_begin.
|
||||
|
||||
CONCATENATE '* +------------------------------------------------'
|
||||
'--------------------------------------</SIGNATURE>'
|
||||
INTO lv_end.
|
||||
|
||||
lv_remove = abap_false.
|
||||
LOOP AT ct_source INTO lv_source.
|
||||
IF lv_source = lv_begin.
|
||||
lv_remove = abap_true.
|
||||
ENDIF.
|
||||
IF lv_remove = abap_true.
|
||||
DELETE ct_source INDEX sy-tabix.
|
||||
ENDIF.
|
||||
IF lv_source = lv_end.
|
||||
lv_remove = abap_false.
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
|
||||
ENDMETHOD. "remove_signatures
|
||||
METHOD reduce.
|
||||
|
||||
DATA: lv_source LIKE LINE OF ct_source,
|
||||
lv_found TYPE sap_bool.
|
||||
|
||||
|
||||
* skip files that only contain the standard comments
|
||||
lv_found = abap_false.
|
||||
LOOP AT ct_source INTO lv_source.
|
||||
IF strlen( lv_source ) >= 3 AND lv_source(3) <> '*"*'.
|
||||
lv_found = abap_true.
|
||||
ENDIF.
|
||||
ENDLOOP.
|
||||
IF lv_found = abap_false.
|
||||
CLEAR ct_source[].
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD. "reduce
|
||||
|
||||
METHOD serialize_locals_imp.
|
||||
|
||||
rt_source = read_include( is_clskey = is_clskey
|
||||
iv_type = seop_ext_class_locals_imp ).
|
||||
|
||||
reduce( CHANGING ct_source = rt_source ).
|
||||
|
||||
ENDMETHOD. "serialize_local
|
||||
|
||||
METHOD serialize_locals_def.
|
||||
|
||||
rt_source = read_include( is_clskey = is_clskey
|
||||
iv_type = seop_ext_class_locals_def ).
|
||||
|
||||
reduce( CHANGING ct_source = rt_source ).
|
||||
|
||||
ENDMETHOD. "serialize_locals_def
|
||||
|
||||
METHOD read_include.
|
||||
|
||||
DATA: ls_include TYPE progstruc.
|
||||
|
||||
|
||||
ASSERT iv_type = seop_ext_class_locals_def
|
||||
OR iv_type = seop_ext_class_locals_imp
|
||||
OR iv_type = seop_ext_class_macros
|
||||
OR iv_type = seop_ext_class_testclasses.
|
||||
|
||||
ls_include-rootname = is_clskey-clsname.
|
||||
TRANSLATE ls_include-rootname USING ' ='.
|
||||
ls_include-categorya = iv_type(1).
|
||||
ls_include-codea = iv_type+1(4).
|
||||
|
||||
* it looks like there is an issue in function module SEO_CLASS_GET_INCLUDE_SOURCE
|
||||
* on 750 kernels, where the READ REPORT without STATE addition does not
|
||||
* return the active version, this method is a workaround for this issue
|
||||
READ REPORT ls_include INTO rt_source STATE 'A'.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD serialize_testclasses.
|
||||
|
||||
DATA: lv_line1 LIKE LINE OF rt_source,
|
||||
lv_line2 LIKE LINE OF rt_source.
|
||||
|
||||
|
||||
rt_source = read_include( is_clskey = is_clskey
|
||||
iv_type = seop_ext_class_testclasses ).
|
||||
|
||||
* when creating classes in Eclipse it automatically generates the
|
||||
* testclass include, but it is not needed, so skip to avoid
|
||||
* creating an extra file in the repository.
|
||||
* Also remove it if the content is manually removed, but
|
||||
* the class still thinks it contains tests
|
||||
"@TODO: Put under test
|
||||
mv_skip_testclass = abap_false.
|
||||
IF lines( rt_source ) = 2.
|
||||
READ TABLE rt_source INDEX 1 INTO lv_line1.
|
||||
ASSERT sy-subrc = 0.
|
||||
READ TABLE rt_source INDEX 2 INTO lv_line2.
|
||||
ASSERT sy-subrc = 0.
|
||||
IF lv_line1(3) = '*"*' AND lv_line2 IS INITIAL.
|
||||
mv_skip_testclass = abap_true.
|
||||
ENDIF.
|
||||
ELSEIF lines( rt_source ) = 1.
|
||||
READ TABLE rt_source INDEX 1 INTO lv_line1.
|
||||
ASSERT sy-subrc = 0.
|
||||
IF lv_line1 IS INITIAL
|
||||
OR ( strlen( lv_line1 ) >= 3 AND lv_line1(3) = '*"*' )
|
||||
OR ( strlen( lv_line1 ) = 1 AND lv_line1(1) = '*' ).
|
||||
mv_skip_testclass = abap_true.
|
||||
ENDIF.
|
||||
ELSEIF lines( rt_source ) = 0.
|
||||
mv_skip_testclass = abap_true.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD. "serialize_test
|
||||
|
||||
METHOD serialize_macros.
|
||||
|
||||
rt_source = read_include( is_clskey = is_clskey
|
||||
iv_type = seop_ext_class_macros ).
|
||||
|
||||
reduce( CHANGING ct_source = rt_source ).
|
||||
|
||||
ENDMETHOD. "serialize_macro
|
||||
METHOD are_test_classes_skipped.
|
||||
rv_return = mv_skip_testclass.
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_object_oriented_base DEFINITION ABSTRACT.
|
||||
PUBLIC SECTION.
|
||||
INTERFACES: lif_object_oriented_object_fnc.
|
||||
PRIVATE SECTION.
|
||||
DATA mv_skip_test_classes TYPE abap_bool.
|
||||
METHODS deserialize_abap_source_old
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
it_source TYPE ty_string_tt
|
||||
RAISING lcx_exception.
|
||||
|
||||
METHODS deserialize_abap_source_new
|
||||
IMPORTING is_clskey TYPE seoclskey
|
||||
it_source TYPE ty_string_tt
|
||||
RAISING lcx_exception
|
||||
cx_sy_dyn_call_error.
|
||||
ENDCLASS.
|
||||
|
||||
CLASS lcl_object_oriented_base IMPLEMENTATION.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~create.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~deserialize_source.
|
||||
TRY.
|
||||
deserialize_abap_source_new(
|
||||
is_clskey = is_key
|
||||
it_source = it_source ).
|
||||
CATCH cx_sy_dyn_call_error.
|
||||
deserialize_abap_source_old(
|
||||
is_clskey = is_key
|
||||
it_source = it_source ).
|
||||
ENDTRY.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~generate_locals.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD deserialize_abap_source_old.
|
||||
"for backwards compatability down to 702
|
||||
|
||||
DATA: lo_source TYPE REF TO cl_oo_source.
|
||||
|
||||
CREATE OBJECT lo_source
|
||||
EXPORTING
|
||||
clskey = is_clskey
|
||||
EXCEPTIONS
|
||||
class_not_existing = 1
|
||||
OTHERS = 2.
|
||||
IF sy-subrc <> 0.
|
||||
lcx_exception=>raise( 'error from CL_OO_SOURCE' ).
|
||||
ENDIF.
|
||||
|
||||
TRY.
|
||||
lo_source->access_permission( seok_access_modify ).
|
||||
lo_source->set_source( it_source ).
|
||||
lo_source->save( ).
|
||||
lo_source->access_permission( seok_access_free ).
|
||||
CATCH cx_oo_access_permission.
|
||||
lcx_exception=>raise( 'permission error' ).
|
||||
CATCH cx_oo_source_save_failure.
|
||||
lcx_exception=>raise( 'save failure' ).
|
||||
ENDTRY.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD deserialize_abap_source_new.
|
||||
DATA: lo_factory TYPE REF TO object,
|
||||
lo_source TYPE REF TO object.
|
||||
|
||||
CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE')
|
||||
RECEIVING
|
||||
result = lo_factory.
|
||||
|
||||
CALL METHOD lo_factory->('CREATE_CLIF_SOURCE')
|
||||
EXPORTING
|
||||
clif_name = is_clskey-clsname
|
||||
RECEIVING
|
||||
result = lo_source.
|
||||
|
||||
TRY.
|
||||
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK').
|
||||
CATCH cx_oo_access_permission.
|
||||
lcx_exception=>raise( 'source_new, access permission exception' ).
|
||||
ENDTRY.
|
||||
|
||||
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE')
|
||||
EXPORTING
|
||||
source = it_source.
|
||||
|
||||
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE').
|
||||
|
||||
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK').
|
||||
|
||||
ENDMETHOD.
|
||||
METHOD lif_object_oriented_object_fnc~add_to_activation_list.
|
||||
lcl_objects_activation=>add_item( is_item ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~update_descriptions.
|
||||
DELETE FROM seocompotx WHERE clsname = is_key-clsname.
|
||||
INSERT seocompotx FROM TABLE it_descriptions.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~insert_text_pool.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~create_sotr.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~create_documentation.
|
||||
CALL FUNCTION 'DOCU_UPD'
|
||||
EXPORTING
|
||||
id = 'CL'
|
||||
langu = iv_language
|
||||
object = iv_object_name
|
||||
TABLES
|
||||
line = it_lines
|
||||
EXCEPTIONS
|
||||
ret_code = 1
|
||||
OTHERS = 2.
|
||||
IF sy-subrc <> 0.
|
||||
lcx_exception=>raise( 'error from DOCU_UPD' ).
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~get_includes.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~exists.
|
||||
CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK'
|
||||
EXPORTING
|
||||
clskey = iv_object_name
|
||||
EXCEPTIONS
|
||||
not_specified = 1
|
||||
not_existing = 2
|
||||
is_interface = 3
|
||||
no_text = 4
|
||||
inconsistent = 5
|
||||
OTHERS = 6.
|
||||
rv_exists = boolc( sy-subrc <> 2 ).
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~serialize_abap.
|
||||
DATA lo_oo_serializer TYPE REF TO lcl_oo_object_serializer.
|
||||
CREATE OBJECT lo_oo_serializer.
|
||||
CASE iv_type.
|
||||
WHEN seop_ext_class_locals_def.
|
||||
rt_source = lo_oo_serializer->serialize_locals_def( is_class_key ).
|
||||
WHEN seop_ext_class_locals_imp.
|
||||
rt_source = lo_oo_serializer->serialize_locals_imp( is_class_key ).
|
||||
WHEN seop_ext_class_macros.
|
||||
rt_source = lo_oo_serializer->serialize_macros( is_class_key ).
|
||||
WHEN seop_ext_class_testclasses.
|
||||
rt_source = lo_oo_serializer->serialize_testclasses( is_class_key ).
|
||||
mv_skip_test_classes = lo_oo_serializer->are_test_classes_skipped( ).
|
||||
WHEN OTHERS.
|
||||
rt_source = lo_oo_serializer->serialize_abap_clif_source( is_class_key ).
|
||||
ENDCASE.
|
||||
ENDMETHOD.
|
||||
METHOD lif_object_oriented_object_fnc~get_skip_test_classes.
|
||||
rv_skip = mv_skip_test_classes.
|
||||
ENDMETHOD.
|
||||
METHOD lif_object_oriented_object_fnc~get_class_properties.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~get_interface_properties.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~read_text_pool.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~read_sotr.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~read_documentation.
|
||||
DATA:
|
||||
lv_state TYPE dokstate,
|
||||
lv_object TYPE dokhl-object,
|
||||
lt_lines TYPE tlinetab.
|
||||
|
||||
lv_object = iv_class_name.
|
||||
|
||||
CALL FUNCTION 'DOCU_GET'
|
||||
EXPORTING
|
||||
id = 'CL'
|
||||
langu = iv_language
|
||||
object = lv_object
|
||||
IMPORTING
|
||||
dokstate = lv_state
|
||||
TABLES
|
||||
line = lt_lines
|
||||
EXCEPTIONS
|
||||
no_docu_on_screen = 1
|
||||
no_docu_self_def = 2
|
||||
no_docu_temp = 3
|
||||
ret_code = 4
|
||||
OTHERS = 5.
|
||||
IF sy-subrc = 0 AND lv_state = 'R'.
|
||||
rt_lines = lt_lines.
|
||||
ELSE.
|
||||
CLEAR rt_lines.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~read_descriptions.
|
||||
SELECT * FROM seocompotx INTO TABLE rt_descriptions
|
||||
WHERE clsname = iv_obejct_name.
|
||||
DELETE rt_descriptions WHERE descript IS INITIAL.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD lif_object_oriented_object_fnc~delete.
|
||||
ASSERT 0 = 1. "Subclass responsibility
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
||||
|
||||
"Backdoor injection for test purposes
|
||||
CLASS lth_oo_factory_injector DEFINITION DEFERRED.
|
||||
|
||||
CLASS lcl_object_oriented_factory DEFINITION
|
||||
FRIENDS lth_oo_factory_injector.
|
||||
PUBLIC SECTION.
|
||||
CLASS-METHODS:
|
||||
make
|
||||
IMPORTING
|
||||
iv_object_type TYPE tadir-object
|
||||
RETURNING
|
||||
VALUE(ro_object_oriented_object) TYPE REF TO lif_object_oriented_object_fnc.
|
||||
PRIVATE SECTION.
|
||||
CLASS-DATA:
|
||||
go_object_oriented_object TYPE REF TO lif_object_oriented_object_fnc.
|
||||
ENDCLASS.
|
||||
"lcl_object_oriented_factory implementation is in include ZABAPGIT_OBJECT_OO_FACTORY.
|
||||
"Reason: In this way, clas and intf specific OO functions implementations can be done
|
||||
"at the own includes.
|
25
src/zabapgit_object_oo_functions.prog.xml
Normal file
25
src/zabapgit_object_oo_functions.prog.xml
Normal file
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_OBJECT_OO_FUNCTIONS</NAME>
|
||||
<STATE>A</STATE>
|
||||
<VARCL>X</VARCL>
|
||||
<DBAPL>S</DBAPL>
|
||||
<DBNA>D$</DBNA>
|
||||
<SUBC>I</SUBC>
|
||||
<FIXPT>X</FIXPT>
|
||||
<LDBNAME>D$S</LDBNAME>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<ENTRY>Include ZABAPGIT_OBJECT_OO_FUNCTIONS</ENTRY>
|
||||
<LENGTH>36</LENGTH>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
INCLUDE zabapgit_object_acid.
|
||||
INCLUDE zabapgit_object_auth.
|
||||
INCLUDE zabapgit_object_oo_functions.
|
||||
INCLUDE zabapgit_object_clas.
|
||||
INCLUDE zabapgit_object_doct.
|
||||
INCLUDE zabapgit_object_docv.
|
||||
|
@ -19,6 +20,7 @@ INCLUDE zabapgit_object_fugr.
|
|||
INCLUDE zabapgit_object_iarp.
|
||||
INCLUDE zabapgit_object_iasp.
|
||||
INCLUDE zabapgit_object_iatu.
|
||||
INCLUDE zabapgit_object_intf.
|
||||
INCLUDE zabapgit_object_msag.
|
||||
INCLUDE zabapgit_object_nrob.
|
||||
INCLUDE zabapgit_object_para.
|
||||
|
@ -49,3 +51,4 @@ INCLUDE zabapgit_object_wdya.
|
|||
INCLUDE zabapgit_object_wdyn.
|
||||
INCLUDE zabapgit_object_webi.
|
||||
INCLUDE zabapgit_object_xslt.
|
||||
INCLUDE zabapgit_object_oo_factory.
|
||||
|
|
Loading…
Reference in New Issue
Block a user