diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index 72b13ea88..547bdabf4 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -7,998 +7,6 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -"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. - - - -CLASS lcl_object_oriented_class DEFINITION - INHERITING FROM lcl_object_oriented_base. - PUBLIC SECTION. - METHODS: - lif_object_oriented_object_fnc~create REDEFINITION, - lif_object_oriented_object_fnc~generate_locals REDEFINITION, - lif_object_oriented_object_fnc~insert_text_pool REDEFINITION, - lif_object_oriented_object_fnc~create_sotr REDEFINITION, - lif_object_oriented_object_fnc~get_includes REDEFINITION, - lif_object_oriented_object_fnc~get_class_properties REDEFINITION, - lif_object_oriented_object_fnc~read_text_pool REDEFINITION, - lif_object_oriented_object_fnc~read_sotr REDEFINITION, - lif_object_oriented_object_fnc~delete REDEFINITION. - -ENDCLASS. -CLASS lcl_object_oriented_class IMPLEMENTATION. - METHOD lif_object_oriented_object_fnc~create. - CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' - EXPORTING - devclass = iv_package - overwrite = iv_overwrite - CHANGING - class = is_properties - EXCEPTIONS - existing = 1 - is_interface = 2 - db_error = 3 - component_error = 4 - no_access = 5 - other = 6 - OTHERS = 7. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). - ENDIF. - ENDMETHOD. - METHOD lif_object_oriented_object_fnc~generate_locals. - CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' - EXPORTING - clskey = is_key - force = iv_force - locals_def = it_local_definitions - locals_imp = it_local_implementations - locals_mac = it_local_macros - locals_testclasses = it_local_test_classes - EXCEPTIONS - not_existing = 1 - model_only = 2 - locals_not_generated = 3 - locals_not_initialised = 4 - OTHERS = 5. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from generate_locals' ). - ENDIF. - ENDMETHOD. - METHOD lif_object_oriented_object_fnc~insert_text_pool. - DATA: lv_cp TYPE program. - - lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). - - INSERT TEXTPOOL lv_cp - FROM it_text_pool - LANGUAGE iv_language - STATE 'I'. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). - ENDIF. - - lcl_objects_activation=>add( iv_type = 'REPT' - iv_name = lv_cp ). - ENDMETHOD. - - METHOD lif_object_oriented_object_fnc~create_sotr. - DATA: lt_sotr TYPE ty_sotr_tt, - lt_objects TYPE sotr_objects, - ls_paket TYPE sotr_pack, - lv_object LIKE LINE OF lt_objects. - - FIELD-SYMBOLS: LIKE LINE OF lt_sotr. - - LOOP AT it_sotr ASSIGNING . - CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' - EXPORTING - object_vector = -header-objid_vec - IMPORTING - objects = lt_objects - EXCEPTIONS - object_not_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). - ENDIF. - - READ TABLE lt_objects INDEX 1 INTO lv_object. - ASSERT sy-subrc = 0. - - ls_paket-paket = iv_package. - - CALL FUNCTION 'SOTR_CREATE_CONCEPT' - EXPORTING - paket = ls_paket - crea_lan = -header-crea_lan - alias_name = -header-alias_name - object = lv_object - entries = -entries - concept_default = -header-concept - EXCEPTIONS - package_missing = 1 - crea_lan_missing = 2 - object_missing = 3 - paket_does_not_exist = 4 - alias_already_exist = 5 - object_type_not_found = 6 - langu_missing = 7 - identical_context_not_allowed = 8 - text_too_long = 9 - error_in_update = 10 - no_master_langu = 11 - error_in_concept_id = 12 - alias_not_allowed = 13 - tadir_entry_creation_failed = 14 - internal_error = 15 - error_in_correction = 16 - user_cancelled = 17 - no_entry_found = 18 - OTHERS = 19. - IF sy-subrc <> 0. - lcx_exception=>raise( 'error from SOTR_CREATE_CONCEPT' ). - ENDIF. - ENDLOOP. - ENDMETHOD. - - METHOD lif_object_oriented_object_fnc~get_includes. -* note: includes returned might not exist -* method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702 - - DATA: lv_class_name TYPE seoclsname, - lt_methods TYPE seop_methods_w_include. - - FIELD-SYMBOLS: LIKE LINE OF lt_methods. - - lv_class_name = iv_object_name. - - APPEND cl_oo_classname_service=>get_ccdef_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccmac_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccimp_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_cl_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ccau_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_pubsec_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_prosec_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_prisec_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_classpool_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_ct_name( lv_class_name ) TO rt_includes. - APPEND cl_oo_classname_service=>get_cs_name( lv_class_name ) TO rt_includes. - - lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_class_name ). - LOOP AT lt_methods ASSIGNING . - APPEND -incname TO rt_includes. - ENDLOOP. - - ENDMETHOD. - - METHOD lif_object_oriented_object_fnc~get_class_properties. - CALL FUNCTION 'SEO_CLIF_GET' - EXPORTING - cifkey = is_class_key - version = seoc_version_active - IMPORTING - class = rs_class_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~read_text_pool. - DATA: - lv_cp TYPE program. - - lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). - READ TEXTPOOL lv_cp INTO rt_text_pool LANGUAGE iv_language. "#EC CI_READ_REP - ENDMETHOD. - - METHOD lif_object_oriented_object_fnc~read_sotr. - DATA: lv_concept TYPE sotr_head-concept, - lt_seocompodf TYPE STANDARD TABLE OF seocompodf WITH DEFAULT KEY, - ls_header TYPE sotr_head, - lt_entries TYPE sotr_text_tt. - - FIELD-SYMBOLS: LIKE LINE OF rt_sotr, - LIKE LINE OF lt_seocompodf, - LIKE LINE OF lt_entries. - - - SELECT * FROM seocompodf - INTO TABLE lt_seocompodf - WHERE clsname = iv_object_name - AND version = '1' - AND exposure = '2' - AND attdecltyp = '2' - AND type = 'SOTR_CONC' - ORDER BY PRIMARY KEY. - - LOOP AT lt_seocompodf ASSIGNING . - - lv_concept = translate( val = -attvalue from = '''' to = '' ). - - CALL FUNCTION 'SOTR_GET_CONCEPT' - EXPORTING - concept = lv_concept - IMPORTING - header = ls_header - TABLES - entries = lt_entries - EXCEPTIONS - no_entry_found = 1 - OTHERS = 2. - IF sy-subrc <> 0. - CONTINUE. - ENDIF. - - CLEAR: ls_header-paket, - ls_header-crea_name, - ls_header-crea_tstut, - ls_header-chan_name, - ls_header-chan_tstut. - - LOOP AT lt_entries ASSIGNING . - CLEAR: -version, - -crea_name, - -crea_tstut, - -chan_name, - -chan_tstut. - ENDLOOP. - - APPEND INITIAL LINE TO rt_sotr ASSIGNING . - -header = ls_header. - -entries = lt_entries. - - ENDLOOP. - ENDMETHOD. - - METHOD lif_object_oriented_object_fnc~delete. - CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' - EXPORTING - clskey = is_deletion_key - EXCEPTIONS - not_existing = 1 - is_interface = 2 - db_error = 3 - no_access = 4 - other = 5 - OTHERS = 6. - IF sy-subrc <> 0. - lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). - ENDIF. - 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. diff --git a/src/zabapgit_object_oo_fct.prog.abap b/src/zabapgit_object_oo_fct.prog.abap new file mode 100644 index 000000000..746c89711 --- /dev/null +++ b/src/zabapgit_object_oo_fct.prog.abap @@ -0,0 +1,991 @@ +"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. + + + +CLASS lcl_object_oriented_class DEFINITION + INHERITING FROM lcl_object_oriented_base. + PUBLIC SECTION. + METHODS: + lif_object_oriented_object_fnc~create REDEFINITION, + lif_object_oriented_object_fnc~generate_locals REDEFINITION, + lif_object_oriented_object_fnc~insert_text_pool REDEFINITION, + lif_object_oriented_object_fnc~create_sotr REDEFINITION, + lif_object_oriented_object_fnc~get_includes REDEFINITION, + lif_object_oriented_object_fnc~get_class_properties REDEFINITION, + lif_object_oriented_object_fnc~read_text_pool REDEFINITION, + lif_object_oriented_object_fnc~read_sotr REDEFINITION, + lif_object_oriented_object_fnc~delete REDEFINITION. + +ENDCLASS. +CLASS lcl_object_oriented_class IMPLEMENTATION. + METHOD lif_object_oriented_object_fnc~create. + CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' + EXPORTING + devclass = iv_package + overwrite = iv_overwrite + CHANGING + class = is_properties + EXCEPTIONS + existing = 1 + is_interface = 2 + db_error = 3 + component_error = 4 + no_access = 5 + other = 6 + OTHERS = 7. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SEO_CLASS_CREATE_COMPLETE' ). + ENDIF. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~generate_locals. + CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' + EXPORTING + clskey = is_key + force = iv_force + locals_def = it_local_definitions + locals_imp = it_local_implementations + locals_mac = it_local_macros + locals_testclasses = it_local_test_classes + EXCEPTIONS + not_existing = 1 + model_only = 2 + locals_not_generated = 3 + locals_not_initialised = 4 + OTHERS = 5. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from generate_locals' ). + ENDIF. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~insert_text_pool. + DATA: lv_cp TYPE program. + + lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). + + INSERT TEXTPOOL lv_cp + FROM it_text_pool + LANGUAGE iv_language + STATE 'I'. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from INSERT TEXTPOOL' ). + ENDIF. + + lcl_objects_activation=>add( iv_type = 'REPT' + iv_name = lv_cp ). + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~create_sotr. + DATA: lt_sotr TYPE ty_sotr_tt, + lt_objects TYPE sotr_objects, + ls_paket TYPE sotr_pack, + lv_object LIKE LINE OF lt_objects. + + FIELD-SYMBOLS: LIKE LINE OF lt_sotr. + + LOOP AT it_sotr ASSIGNING . + CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' + EXPORTING + object_vector = -header-objid_vec + IMPORTING + objects = lt_objects + EXCEPTIONS + object_not_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). + ENDIF. + + READ TABLE lt_objects INDEX 1 INTO lv_object. + ASSERT sy-subrc = 0. + + ls_paket-paket = iv_package. + + CALL FUNCTION 'SOTR_CREATE_CONCEPT' + EXPORTING + paket = ls_paket + crea_lan = -header-crea_lan + alias_name = -header-alias_name + object = lv_object + entries = -entries + concept_default = -header-concept + EXCEPTIONS + package_missing = 1 + crea_lan_missing = 2 + object_missing = 3 + paket_does_not_exist = 4 + alias_already_exist = 5 + object_type_not_found = 6 + langu_missing = 7 + identical_context_not_allowed = 8 + text_too_long = 9 + error_in_update = 10 + no_master_langu = 11 + error_in_concept_id = 12 + alias_not_allowed = 13 + tadir_entry_creation_failed = 14 + internal_error = 15 + error_in_correction = 16 + user_cancelled = 17 + no_entry_found = 18 + OTHERS = 19. + IF sy-subrc <> 0. + lcx_exception=>raise( 'error from SOTR_CREATE_CONCEPT' ). + ENDIF. + ENDLOOP. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_includes. +* note: includes returned might not exist +* method cl_oo_classname_service=>GET_ALL_CLASS_INCLUDES does not exist in 702 + + DATA: lv_class_name TYPE seoclsname, + lt_methods TYPE seop_methods_w_include. + + FIELD-SYMBOLS: LIKE LINE OF lt_methods. + + lv_class_name = iv_object_name. + + APPEND cl_oo_classname_service=>get_ccdef_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccmac_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccimp_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_cl_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ccau_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_pubsec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_prosec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_prisec_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_classpool_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_ct_name( lv_class_name ) TO rt_includes. + APPEND cl_oo_classname_service=>get_cs_name( lv_class_name ) TO rt_includes. + + lt_methods = cl_oo_classname_service=>get_all_method_includes( lv_class_name ). + LOOP AT lt_methods ASSIGNING . + APPEND -incname TO rt_includes. + ENDLOOP. + + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_class_properties. + CALL FUNCTION 'SEO_CLIF_GET' + EXPORTING + cifkey = is_class_key + version = seoc_version_active + IMPORTING + class = rs_class_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~read_text_pool. + DATA: + lv_cp TYPE program. + + lv_cp = cl_oo_classname_service=>get_classpool_name( iv_class_name ). + READ TEXTPOOL lv_cp INTO rt_text_pool LANGUAGE iv_language. "#EC CI_READ_REP + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_sotr. + DATA: lv_concept TYPE sotr_head-concept, + lt_seocompodf TYPE STANDARD TABLE OF seocompodf WITH DEFAULT KEY, + ls_header TYPE sotr_head, + lt_entries TYPE sotr_text_tt. + + FIELD-SYMBOLS: LIKE LINE OF rt_sotr, + LIKE LINE OF lt_seocompodf, + LIKE LINE OF lt_entries. + + + SELECT * FROM seocompodf + INTO TABLE lt_seocompodf + WHERE clsname = iv_object_name + AND version = '1' + AND exposure = '2' + AND attdecltyp = '2' + AND type = 'SOTR_CONC' + ORDER BY PRIMARY KEY. + + LOOP AT lt_seocompodf ASSIGNING . + + lv_concept = translate( val = -attvalue from = '''' to = '' ). + + CALL FUNCTION 'SOTR_GET_CONCEPT' + EXPORTING + concept = lv_concept + IMPORTING + header = ls_header + TABLES + entries = lt_entries + EXCEPTIONS + no_entry_found = 1 + OTHERS = 2. + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + + CLEAR: ls_header-paket, + ls_header-crea_name, + ls_header-crea_tstut, + ls_header-chan_name, + ls_header-chan_tstut. + + LOOP AT lt_entries ASSIGNING . + CLEAR: -version, + -crea_name, + -crea_tstut, + -chan_name, + -chan_tstut. + ENDLOOP. + + APPEND INITIAL LINE TO rt_sotr ASSIGNING . + -header = ls_header. + -entries = lt_entries. + + ENDLOOP. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~delete. + CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' + EXPORTING + clskey = is_deletion_key + EXCEPTIONS + not_existing = 1 + is_interface = 2 + db_error = 3 + no_access = 4 + other = 5 + OTHERS = 6. + IF sy-subrc <> 0. + lcx_exception=>raise( 'Error from SEO_CLASS_DELETE_COMPLETE' ). + ENDIF. + 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. diff --git a/src/zabapgit_object_oo_fct.prog.xml b/src/zabapgit_object_oo_fct.prog.xml new file mode 100644 index 000000000..fb7fa6f56 --- /dev/null +++ b/src/zabapgit_object_oo_fct.prog.xml @@ -0,0 +1,25 @@ + + + + + + ZABAPGIT_OBJECT_OO_FCT + A + X + S + D$ + I + X + D$S + X + + + + R + OO functions + 12 + + + + + diff --git a/src/zabapgit_object_serializing.prog.abap b/src/zabapgit_object_serializing.prog.abap index 1acc6fa52..e2a5497e0 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_fct. INCLUDE zabapgit_object_clas. INCLUDE zabapgit_object_doct. INCLUDE zabapgit_object_docv.