diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap
index 1294dd36d..6aef8f77c 100644
--- a/src/zabapgit_object_clas.prog.abap
+++ b/src/zabapgit_object_clas.prog.abap
@@ -7,617 +7,402 @@
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
-"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.
+CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
- 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
+ INTERFACES lif_object.
+ ALIASES mo_files FOR lif_object~mo_files.
+ METHODS constructor
IMPORTING
- is_clskey TYPE seoclskey
- RETURNING VALUE(rt_source) TYPE ty_string_tt
+ 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 serialize_macros
- IMPORTING is_clskey TYPE seoclskey
- RETURNING VALUE(rt_source) TYPE ty_string_tt
+ METHODS deserialize_docu
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
RAISING lcx_exception.
+ DATA mo_object_oriented_object_fct TYPE REF TO lif_object_oriented_object_fnc.
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
+
+ METHODS deserialize_tpool
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
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 '* ------------------------------------'
- '---------------------------------------------------+'
- INTO lv_begin.
-
- CONCATENATE '* +------------------------------------------------'
- '--------------------------------------'
- 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
+ METHODS deserialize_sotr
+ IMPORTING io_xml TYPE REF TO lcl_xml_input
+ iv_package TYPE devclass
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.
+ METHODS serialize_xml
+ IMPORTING io_xml TYPE REF TO lcl_xml_output
+ RAISING lcx_exception.
- 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.
+ENDCLASS. "lcl_object_dtel DEFINITION
- METHOD lif_object_oriented_object_fnc~generate_locals.
- ASSERT 0 = 1. "Subclass responsibility
- ENDMETHOD.
+*----------------------------------------------------------------------*
+* CLASS lcl_object_clas IMPLEMENTATION
+*----------------------------------------------------------------------*
+*
+*----------------------------------------------------------------------*
+CLASS lcl_object_clas IMPLEMENTATION.
- 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.
+ METHOD lif_object~has_changed_since.
DATA:
- lv_state TYPE dokstate,
- lv_object TYPE dokhl-object,
- lt_lines TYPE tlinetab.
+ lt_includes TYPE seoincl_t.
- lv_object = iv_class_name.
+ FIELD-SYMBOLS LIKE LINE OF lt_includes.
- 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.
+ lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ).
+ LOOP AT lt_includes ASSIGNING .
+ rv_changed = check_prog_changed_since(
+ iv_program =
+ iv_timestamp = iv_timestamp
+ iv_skip_gui = abap_true ).
+ IF rv_changed = abap_true.
+ RETURN.
+ ENDIF.
+ ENDLOOP.
+ ENDMETHOD. "lif_object~has_changed_since
+
+ METHOD lif_object~get_metadata.
+ rs_metadata = get_metadata( ).
+ ENDMETHOD. "lif_object~get_metadata
+
+ 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.
- CLEAR rt_lines.
+ 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_oriented_object_fnc~read_descriptions.
- SELECT * FROM seocompotx INTO TABLE rt_descriptions
- WHERE clsname = iv_obejct_name.
- DELETE rt_descriptions WHERE descript IS INITIAL.
+ 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. "lif_object~exists
+
+ METHOD lif_object~jump.
+ CALL FUNCTION 'RS_TOOL_ACCESS'
+ EXPORTING
+ operation = 'SHOW'
+ object_name = ms_item-obj_name
+ object_type = 'CLAS'
+ in_new_window = abap_true.
+ ENDMETHOD. "jump
+
+ 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. "delete
+
+ METHOD lif_object~serialize.
+
+ DATA: lt_source TYPE seop_source_string,
+ ls_class_key TYPE seoclskey.
+
+ ls_class_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_class_key ).
+
+ mo_files->add_abap( lt_source ).
+
+ lt_source = mo_object_oriented_object_fct->serialize_abap(
+ is_class_key = ls_class_key
+ iv_type = seop_ext_class_locals_def ).
+ IF NOT lt_source[] IS INITIAL.
+ mo_files->add_abap( iv_extra = 'locals_def'
+ it_abap = lt_source ). "#EC NOTEXT
+ ENDIF.
+
+ lt_source = mo_object_oriented_object_fct->serialize_abap(
+ is_class_key = ls_class_key
+ iv_type = seop_ext_class_locals_imp ).
+ IF NOT lt_source[] IS INITIAL.
+ mo_files->add_abap( iv_extra = 'locals_imp'
+ it_abap = lt_source ). "#EC NOTEXT
+ ENDIF.
+
+ lt_source = mo_object_oriented_object_fct->serialize_abap(
+ is_class_key = ls_class_key
+ iv_type = seop_ext_class_testclasses ).
+
+ mv_skip_testclass = mo_object_oriented_object_fct->get_skip_test_classes( ).
+ IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false.
+ mo_files->add_abap( iv_extra = 'testclasses'
+ it_abap = lt_source ). "#EC NOTEXT
+ ENDIF.
+
+ lt_source = mo_object_oriented_object_fct->serialize_abap(
+ is_class_key = ls_class_key
+ iv_type = seop_ext_class_macros ).
+ IF NOT lt_source[] IS INITIAL.
+ mo_files->add_abap( iv_extra = 'macros'
+ it_abap = lt_source ). "#EC NOTEXT
+ ENDIF.
+
+ serialize_xml( io_xml ).
+
+ ENDMETHOD. "serialize
+
+
+
+ METHOD serialize_xml.
+
+ DATA: ls_vseoclass TYPE vseoclass,
+ lt_tpool TYPE textpool_table,
+ lv_object TYPE dokhl-object,
+ lv_state TYPE dokhl-dokstate,
+ lt_descriptions TYPE ty_seocompotx_tt,
+ ls_clskey TYPE seoclskey,
+ lt_sotr TYPE ty_sotr_tt,
+ lt_lines TYPE tlinetab.
+
+
+ ls_clskey-clsname = ms_item-obj_name.
+
+ ls_vseoclass = mo_object_oriented_object_fct->get_class_properties( is_class_key = ls_clskey ).
+
+ CLEAR: ls_vseoclass-uuid,
+ ls_vseoclass-author,
+ ls_vseoclass-createdon,
+ ls_vseoclass-changedby,
+ ls_vseoclass-changedon,
+ ls_vseoclass-r3release,
+ ls_vseoclass-chgdanyby,
+ ls_vseoclass-chgdanyon.
+
+ IF mv_skip_testclass = abap_true.
+ CLEAR ls_vseoclass-with_unit_tests.
+ ENDIF.
+
+ io_xml->add( iv_name = 'VSEOCLASS'
+ ig_data = ls_vseoclass ).
+
+ lt_tpool = mo_object_oriented_object_fct->read_text_pool(
+ iv_class_name = ls_clskey-clsname
+ iv_language = mv_language ).
+ io_xml->add( iv_name = 'TPOOL'
+ ig_data = add_tpool( lt_tpool ) ).
+
+ IF ls_vseoclass-category = seoc_category_exception.
+ lt_sotr = mo_object_oriented_object_fct->read_sotr( ms_item-obj_name ).
+ IF lines( lt_sotr ) > 0.
+ io_xml->add( iv_name = 'SOTR'
+ ig_data = lt_sotr ).
+ ENDIF.
+ ENDIF.
+
+ 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. "serialize_xml
+
+ METHOD lif_object~deserialize.
+ deserialize_abap( io_xml = io_xml
+ iv_package = iv_package ).
+
+ deserialize_tpool( io_xml ).
+
+ deserialize_sotr( io_xml = io_xml
+ iv_package = iv_package ).
+
+ deserialize_docu( io_xml ).
+ ENDMETHOD. "deserialize
+
+ METHOD deserialize_sotr.
+ "OTR stands for Online Text Repository
+ DATA: lt_sotr TYPE ty_sotr_tt,
+ lt_objects TYPE sotr_objects.
+
+ io_xml->read( EXPORTING iv_name = 'SOTR'
+ CHANGING cg_data = lt_sotr ).
+
+ IF lines( lt_sotr ) = 0.
+ RETURN.
+ ENDIF.
+
+ mo_object_oriented_object_fct->create_sotr(
+ iv_package = iv_package
+ it_sotr = lt_sotr ).
ENDMETHOD.
- METHOD lif_object_oriented_object_fnc~delete.
- ASSERT 0 = 1. "Subclass responsibility
+ 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.
-ENDCLASS.
+ METHOD deserialize_tpool.
+ DATA: lv_clsname TYPE seoclsname,
+ lt_tpool_ext TYPE ty_tpool_tt,
+ lt_tpool TYPE textpool_table.
+
+
+ io_xml->read( EXPORTING iv_name = 'TPOOL'
+ CHANGING cg_data = lt_tpool_ext ).
+ lt_tpool = read_tpool( lt_tpool_ext ).
+
+ IF lt_tpool[] IS INITIAL.
+ RETURN.
+ ENDIF.
+
+ lv_clsname = ms_item-obj_name.
+
+ mo_object_oriented_object_fct->insert_text_pool(
+ iv_class_name = lv_clsname
+ it_text_pool = lt_tpool
+ iv_language = mv_language ).
+
+ ENDMETHOD. "deserialize_textpool
+
+ METHOD deserialize_abap.
+
+ DATA: ls_vseoclass TYPE vseoclass,
+ lt_source TYPE seop_source_string,
+ lt_local_definitions TYPE seop_source_string,
+ lt_local_implementations TYPE seop_source_string,
+ lt_local_macros TYPE seop_source_string,
+ lt_test_classes TYPE seop_source_string,
+ lt_descriptions TYPE ty_seocompotx_tt,
+ ls_class_key TYPE seoclskey.
+
+
+ lt_source = mo_files->read_abap( ).
+
+ lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ lt_local_macros = mo_files->read_abap( iv_extra = 'macros'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses'
+ iv_error = abap_false ). "#EC NOTEXT
+
+ ls_class_key-clsname = ms_item-obj_name.
+
+ io_xml->read( EXPORTING iv_name = 'VSEOCLASS'
+ CHANGING cg_data = ls_vseoclass ).
+
+ mo_object_oriented_object_fct->create(
+ EXPORTING
+ iv_package = iv_package
+ CHANGING
+ is_properties = ls_vseoclass ).
+ mo_object_oriented_object_fct->generate_locals(
+ is_key = ls_class_key
+ iv_force = seox_true
+ it_local_definitions = lt_local_definitions
+ it_local_implementations = lt_local_implementations
+ it_local_macros = lt_local_macros
+ it_local_test_classes = lt_test_classes ).
+
+ mo_object_oriented_object_fct->deserialize_source(
+ is_key = ls_class_key
+ 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_class_key
+ it_descriptions = lt_descriptions ).
+
+ mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ).
+ ENDMETHOD. "deserialize
+
+ METHOD lif_object~compare_to_remote_version.
+ CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
+ ENDMETHOD.
+
+ 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.
+
+ENDCLASS. "lcl_object_CLAS IMPLEMENTATION
CLASS lcl_object_oriented_class DEFINITION
@@ -884,659 +669,3 @@ CLASS lcl_object_oriented_class IMPLEMENTATION.
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.
-
-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.
-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.
-
-CLASS lcl_object_clas DEFINITION 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.
- DATA mo_object_oriented_object_fct TYPE REF TO lif_object_oriented_object_fnc.
- PRIVATE SECTION.
- DATA mv_skip_testclass TYPE abap_bool.
-
- METHODS deserialize_tpool
- IMPORTING io_xml TYPE REF TO lcl_xml_input
- RAISING lcx_exception.
-
- METHODS deserialize_sotr
- IMPORTING io_xml TYPE REF TO lcl_xml_input
- iv_package TYPE devclass
- RAISING lcx_exception.
-
-
- METHODS serialize_xml
- IMPORTING io_xml TYPE REF TO lcl_xml_output
- RAISING lcx_exception.
-
-
-ENDCLASS. "lcl_object_dtel DEFINITION
-
-*----------------------------------------------------------------------*
-* CLASS lcl_object_clas IMPLEMENTATION
-*----------------------------------------------------------------------*
-*
-*----------------------------------------------------------------------*
-CLASS lcl_object_clas IMPLEMENTATION.
-
- METHOD lif_object~has_changed_since.
- DATA:
- lt_includes TYPE seoincl_t.
-
- FIELD-SYMBOLS LIKE LINE OF lt_includes.
-
- lt_includes = mo_object_oriented_object_fct->get_includes( ms_item-obj_name ).
- LOOP AT lt_includes ASSIGNING .
- rv_changed = check_prog_changed_since(
- iv_program =
- iv_timestamp = iv_timestamp
- iv_skip_gui = abap_true ).
- IF rv_changed = abap_true.
- RETURN.
- ENDIF.
- ENDLOOP.
- ENDMETHOD. "lif_object~has_changed_since
-
- METHOD lif_object~get_metadata.
- rs_metadata = get_metadata( ).
- ENDMETHOD. "lif_object~get_metadata
-
- 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~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. "lif_object~exists
-
- METHOD lif_object~jump.
-
- CALL FUNCTION 'RS_TOOL_ACCESS'
- EXPORTING
- operation = 'SHOW'
- object_name = ms_item-obj_name
- object_type = 'CLAS'
- in_new_window = abap_true.
-
- ENDMETHOD. "jump
-
- 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. "delete
-
- METHOD lif_object~serialize.
-
- DATA: lt_source TYPE seop_source_string,
- ls_class_key TYPE seoclskey.
-
- ls_class_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_class_key ).
-
- mo_files->add_abap( lt_source ).
-
- lt_source = mo_object_oriented_object_fct->serialize_abap(
- is_class_key = ls_class_key
- iv_type = seop_ext_class_locals_def ).
- IF NOT lt_source[] IS INITIAL.
- mo_files->add_abap( iv_extra = 'locals_def'
- it_abap = lt_source ). "#EC NOTEXT
- ENDIF.
-
- lt_source = mo_object_oriented_object_fct->serialize_abap(
- is_class_key = ls_class_key
- iv_type = seop_ext_class_locals_imp ).
- IF NOT lt_source[] IS INITIAL.
- mo_files->add_abap( iv_extra = 'locals_imp'
- it_abap = lt_source ). "#EC NOTEXT
- ENDIF.
-
- lt_source = mo_object_oriented_object_fct->serialize_abap(
- is_class_key = ls_class_key
- iv_type = seop_ext_class_testclasses ).
-
- mv_skip_testclass = mo_object_oriented_object_fct->get_skip_test_classes( ).
- IF NOT lt_source[] IS INITIAL AND mv_skip_testclass = abap_false.
- mo_files->add_abap( iv_extra = 'testclasses'
- it_abap = lt_source ). "#EC NOTEXT
- ENDIF.
-
- lt_source = mo_object_oriented_object_fct->serialize_abap(
- is_class_key = ls_class_key
- iv_type = seop_ext_class_macros ).
- IF NOT lt_source[] IS INITIAL.
- mo_files->add_abap( iv_extra = 'macros'
- it_abap = lt_source ). "#EC NOTEXT
- ENDIF.
-
- serialize_xml( io_xml ).
-
- ENDMETHOD. "serialize
-
-
-
- METHOD serialize_xml.
-
- DATA: ls_vseoclass TYPE vseoclass,
- lt_tpool TYPE textpool_table,
- lv_object TYPE dokhl-object,
- lv_state TYPE dokhl-dokstate,
- lt_descriptions TYPE ty_seocompotx_tt,
- ls_clskey TYPE seoclskey,
- lt_sotr TYPE ty_sotr_tt,
- lt_lines TYPE tlinetab.
-
-
- ls_clskey-clsname = ms_item-obj_name.
-
- ls_vseoclass = mo_object_oriented_object_fct->get_class_properties( is_class_key = ls_clskey ).
-
- CLEAR: ls_vseoclass-uuid,
- ls_vseoclass-author,
- ls_vseoclass-createdon,
- ls_vseoclass-changedby,
- ls_vseoclass-changedon,
- ls_vseoclass-r3release,
- ls_vseoclass-chgdanyby,
- ls_vseoclass-chgdanyon.
-
- IF mv_skip_testclass = abap_true.
- CLEAR ls_vseoclass-with_unit_tests.
- ENDIF.
-
- io_xml->add( iv_name = 'VSEOCLASS'
- ig_data = ls_vseoclass ).
-
- lt_tpool = mo_object_oriented_object_fct->read_text_pool(
- iv_class_name = ls_clskey-clsname
- iv_language = mv_language ).
- io_xml->add( iv_name = 'TPOOL'
- ig_data = add_tpool( lt_tpool ) ).
-
- IF ls_vseoclass-category = seoc_category_exception.
- lt_sotr = mo_object_oriented_object_fct->read_sotr( ms_item-obj_name ).
- IF lines( lt_sotr ) > 0.
- io_xml->add( iv_name = 'SOTR'
- ig_data = lt_sotr ).
- ENDIF.
- ENDIF.
-
- 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. "serialize_xml
-
- METHOD lif_object~deserialize.
- deserialize_abap( io_xml = io_xml
- iv_package = iv_package ).
-
- deserialize_tpool( io_xml ).
-
- deserialize_sotr( io_xml = io_xml
- iv_package = iv_package ).
-
- deserialize_docu( io_xml ).
- ENDMETHOD. "deserialize
-
- METHOD deserialize_sotr.
- "OTR stands for Online Text Repository
- DATA: lt_sotr TYPE ty_sotr_tt,
- lt_objects TYPE sotr_objects.
-
- io_xml->read( EXPORTING iv_name = 'SOTR'
- CHANGING cg_data = lt_sotr ).
-
- IF lines( lt_sotr ) = 0.
- RETURN.
- ENDIF.
-
- mo_object_oriented_object_fct->create_sotr(
- iv_package = iv_package
- it_sotr = lt_sotr ).
- 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. "deserialize_doku
-
- METHOD deserialize_tpool.
-
- DATA: lv_clsname TYPE seoclsname,
- lt_tpool_ext TYPE ty_tpool_tt,
- lt_tpool TYPE textpool_table.
-
-
- io_xml->read( EXPORTING iv_name = 'TPOOL'
- CHANGING cg_data = lt_tpool_ext ).
- lt_tpool = read_tpool( lt_tpool_ext ).
-
- IF lt_tpool[] IS INITIAL.
- RETURN.
- ENDIF.
-
- lv_clsname = ms_item-obj_name.
-
- mo_object_oriented_object_fct->insert_text_pool(
- iv_class_name = lv_clsname
- it_text_pool = lt_tpool
- iv_language = mv_language ).
-
- ENDMETHOD. "deserialize_textpool
-
- METHOD deserialize_abap.
-
- DATA: ls_vseoclass TYPE vseoclass,
- lt_source TYPE seop_source_string,
- lt_local_definitions TYPE seop_source_string,
- lt_local_implementations TYPE seop_source_string,
- lt_local_macros TYPE seop_source_string,
- lt_test_classes TYPE seop_source_string,
- lt_descriptions TYPE ty_seocompotx_tt,
- ls_class_key TYPE seoclskey.
-
-
- lt_source = mo_files->read_abap( ).
-
- lt_local_definitions = mo_files->read_abap( iv_extra = 'locals_def'
- iv_error = abap_false ). "#EC NOTEXT
-
- lt_local_implementations = mo_files->read_abap( iv_extra = 'locals_imp'
- iv_error = abap_false ). "#EC NOTEXT
-
- lt_local_macros = mo_files->read_abap( iv_extra = 'macros'
- iv_error = abap_false ). "#EC NOTEXT
-
- lt_test_classes = mo_files->read_abap( iv_extra = 'testclasses'
- iv_error = abap_false ). "#EC NOTEXT
-
- ls_class_key-clsname = ms_item-obj_name.
-
- io_xml->read( EXPORTING iv_name = 'VSEOCLASS'
- CHANGING cg_data = ls_vseoclass ).
-
- mo_object_oriented_object_fct->create(
- EXPORTING
- iv_package = iv_package
- CHANGING
- is_properties = ls_vseoclass ).
- mo_object_oriented_object_fct->generate_locals(
- is_key = ls_class_key
- iv_force = seox_true
- it_local_definitions = lt_local_definitions
- it_local_implementations = lt_local_implementations
- it_local_macros = lt_local_macros
- it_local_test_classes = lt_test_classes ).
-
- mo_object_oriented_object_fct->deserialize_source(
- is_key = ls_class_key
- 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_class_key
- it_descriptions = lt_descriptions ).
-
- mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ).
- ENDMETHOD. "deserialize
-
- METHOD lif_object~compare_to_remote_version.
- CREATE OBJECT ro_comparison_result TYPE lcl_null_comparison_result.
- ENDMETHOD.
-
- 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.
-
-ENDCLASS. "lcl_object_CLAS IMPLEMENTATION
-
-*----------------------------------------------------------------------*
-* CLASS lcl_object_intf DEFINITION
-*----------------------------------------------------------------------*
-*
-*----------------------------------------------------------------------*
-CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL.
-* @TODO, CLAS + INTF to be refactored, see:
-* https://github.com/larshp/abapGit/issues/21
- PUBLIC SECTION.
- METHODS:
- lif_object~deserialize REDEFINITION,
- lif_object~has_changed_since REDEFINITION,
- lif_object~serialize REDEFINITION.
- PROTECTED SECTION.
- METHODS:
- deserialize_abap REDEFINITION.
- PRIVATE SECTION.
- 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 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 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.
-
-ENDCLASS.
diff --git a/src/zabapgit_object_intf.prog.abap b/src/zabapgit_object_intf.prog.abap
new file mode 100644
index 000000000..968d3606d
--- /dev/null
+++ b/src/zabapgit_object_intf.prog.abap
@@ -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.
diff --git a/src/zabapgit_object_intf.prog.xml b/src/zabapgit_object_intf.prog.xml
new file mode 100644
index 000000000..8ddf78af4
--- /dev/null
+++ b/src/zabapgit_object_intf.prog.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_INTF
+ A
+ X
+ I
+ E
+ X
+
+
+ -
+ R
+ Include ZABAPGIT_OBJECT_INTF
+ 28
+
+
+
+
+
diff --git a/src/zabapgit_object_oo_factory.prog.abap b/src/zabapgit_object_oo_factory.prog.abap
new file mode 100644
index 000000000..9668924b1
--- /dev/null
+++ b/src/zabapgit_object_oo_factory.prog.abap
@@ -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.
diff --git a/src/zabapgit_object_oo_factory.prog.xml b/src/zabapgit_object_oo_factory.prog.xml
new file mode 100644
index 000000000..a31593880
--- /dev/null
+++ b/src/zabapgit_object_oo_factory.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_OO_FACTORY
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ Include ZABAPGIT_OBJECT_OO_FACTORY
+ 34
+
+
+
+
+
diff --git a/src/zabapgit_object_oo_functions.prog.abap b/src/zabapgit_object_oo_functions.prog.abap
new file mode 100644
index 000000000..f6fe9be8f
--- /dev/null
+++ b/src/zabapgit_object_oo_functions.prog.abap
@@ -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 '* ------------------------------------'
+ '---------------------------------------------------+'
+ INTO lv_begin.
+
+ CONCATENATE '* +------------------------------------------------'
+ '--------------------------------------'
+ 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.
diff --git a/src/zabapgit_object_oo_functions.prog.xml b/src/zabapgit_object_oo_functions.prog.xml
new file mode 100644
index 000000000..7c6960137
--- /dev/null
+++ b/src/zabapgit_object_oo_functions.prog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ZABAPGIT_OBJECT_OO_FUNCTIONS
+ A
+ X
+ S
+ D$
+ I
+ X
+ D$S
+ X
+
+
+ -
+ R
+ Include ZABAPGIT_OBJECT_OO_FUNCTIONS
+ 36
+
+
+
+
+
diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap
index 1acc6fa52..a15b14df5 100644
--- a/src/zabapgit_object_serializing.prog.abap
+++ b/src/zabapgit_object_serializing.prog.abap
@@ -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.