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.