Merge remote-tracking branch 'refs/remotes/larshp/master'

This commit is contained in:
EduardoCopat 2017-02-01 15:55:51 +01:00
commit 4c215a17d8
8 changed files with 1419 additions and 1238 deletions

File diff suppressed because it is too large Load Diff

View 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.

View 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>

View 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.

View 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>

View 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.

View 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>

View File

@ -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.