diff --git a/src/zabapgit_object_clas.prog.abap b/src/zabapgit_object_clas.prog.abap index ea8794c50..7fea9ca43 100644 --- a/src/zabapgit_object_clas.prog.abap +++ b/src/zabapgit_object_clas.prog.abap @@ -7,7 +7,9 @@ *----------------------------------------------------------------------* * *----------------------------------------------------------------------* -INTERFACE lif_object_oriented_object. +"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, @@ -72,52 +74,134 @@ INTERFACE lif_object_oriented_object. IMPORTING iv_object_name TYPE sobj_name RETURNING - VALUE(rt_includes) TYPE ty_includes_tt. + 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. ENDINTERFACE. -CLASS lcl_object_oriented_base DEFINITION ABSTRACT. +CLASS lcl_oo_object_serializer DEFINITION. PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. - PRIVATE SECTION. - METHODS deserialize_abap_source_old - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt + + 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 deserialize_abap_source_new - IMPORTING is_clskey TYPE seoclskey - it_source TYPE ty_string_tt + 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_object_oriented_base IMPLEMENTATION. - - METHOD lif_object_oriented_object~create. - "Subclass responsibility - ASSERT 0 = 1. - ENDMETHOD. - - METHOD lif_object_oriented_object~deserialize_source. +CLASS lcl_oo_object_serializer IMPLEMENTATION. + METHOD serialize_abap_clif_source. TRY. - deserialize_abap_source_new( - is_clskey = is_key - it_source = it_source ). + rt_source = serialize_abap_new( is_class_key ). CATCH cx_sy_dyn_call_error. - deserialize_abap_source_old( - is_clskey = is_key - it_source = it_source ). + rt_source = serialize_abap_old( is_class_key ). ENDTRY. ENDMETHOD. - - METHOD lif_object_oriented_object~generate_locals. - "Subclass responsibility - ASSERT 0 = 1. - ENDMETHOD. - - METHOD deserialize_abap_source_old. - "for backwards compatability down to 702 - + METHOD serialize_abap_old. +* for old ABAP AS versions DATA: lo_source TYPE REF TO cl_oo_source. CREATE OBJECT lo_source @@ -130,548 +214,69 @@ CLASS lcl_object_oriented_base IMPLEMENTATION. 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. + lo_source->read( 'A' ). + rt_source = lo_source->get_old_source( ). + remove_signatures( CHANGING ct_source = rt_source ). - ENDMETHOD. + ENDMETHOD. "serialize_abap - METHOD deserialize_abap_source_new. - DATA: lo_factory TYPE REF TO object, - lo_source TYPE REF TO object. + 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_factory. + result = lo_instance. - CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') + CALL METHOD lo_instance->('CREATE_CLIF_SOURCE') EXPORTING clif_name = is_clskey-clsname + version = 'A' 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~add_to_activation_list. - lcl_objects_activation=>add_item( is_item ). - ENDMETHOD. - - METHOD lif_object_oriented_object~update_descriptions. - DELETE FROM seocompotx WHERE clsname = is_key-clsname. - INSERT seocompotx FROM TABLE it_descriptions. - ENDMETHOD. - METHOD lif_object_oriented_object~insert_text_pool. - "Subclass responsibility - ASSERT 0 = 1. - ENDMETHOD. - - METHOD lif_object_oriented_object~create_sotr. - "Subclass responsibility - ASSERT 0 = 1. - ENDMETHOD. - - METHOD lif_object_oriented_object~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~get_includes. - "Subclass responsibility - ASSERT 0 = 1. - ENDMETHOD. - -ENDCLASS. - - -CLASS lcl_object_oriented_class DEFINITION - INHERITING FROM lcl_object_oriented_base. - PUBLIC SECTION. - METHODS: - lif_object_oriented_object~create REDEFINITION, - lif_object_oriented_object~generate_locals REDEFINITION, - lif_object_oriented_object~insert_text_pool REDEFINITION, - lif_object_oriented_object~create_sotr REDEFINITION, - lif_object_oriented_object~get_includes REDEFINITION. - -ENDCLASS. -CLASS lcl_object_oriented_class IMPLEMENTATION. - METHOD lif_object_oriented_object~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~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~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~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~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. - -ENDCLASS. - -CLASS lcl_object_oriented_interface DEFINITION - INHERITING FROM lcl_object_oriented_base. - PUBLIC SECTION. - METHODS: - lif_object_oriented_object~create REDEFINITION, - lif_object_oriented_object~get_includes REDEFINITION. -ENDCLASS. - -CLASS lcl_object_oriented_interface IMPLEMENTATION. - METHOD lif_object_oriented_object~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~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. - -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. - PRIVATE SECTION. - CLASS-DATA: - go_object_oriented_object TYPE REF TO lif_object_oriented_object. -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. -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 + CALL METHOD lo_source->('GET_SOURCE') 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 TYPE REF TO lif_object_oriented_object. - 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_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 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 read_include - IMPORTING is_clskey TYPE seoclskey - iv_type TYPE seop_include_ext_app - RETURNING VALUE(rt_source) TYPE seop_source_string. - - 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. - - METHODS serialize_xml - IMPORTING io_xml TYPE REF TO lcl_xml_output - RAISING lcx_exception. - - METHODS read_sotr - RETURNING VALUE(rt_sotr) TYPE ty_sotr_tt - RAISING lcx_exception. - - METHODS remove_signatures - CHANGING ct_source TYPE ty_string_tt. - - METHODS reduce - CHANGING ct_source TYPE ty_string_tt. -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->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->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. + source = rt_source. ENDMETHOD. - METHOD lif_object~exists. + METHOD remove_signatures. - DATA: ls_clskey TYPE seoclskey. +* 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. - ls_clskey-clsname = ms_item-obj_name. + "@TODO: Put under test + CONCATENATE '* ------------------------------------' + '---------------------------------------------------+' + INTO lv_begin. - CALL FUNCTION 'SEO_CLASS_EXISTENCE_CHECK' - EXPORTING - clskey = ls_clskey - EXCEPTIONS - not_specified = 1 - not_existing = 2 - is_interface = 3 - no_text = 4 - inconsistent = 5 - OTHERS = 6. - rv_bool = boolc( sy-subrc <> 2 ). + CONCATENATE '* +------------------------------------------------' + '--------------------------------------' + INTO lv_end. - 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. - - CASE ms_item-obj_type. - WHEN 'CLAS'. - CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' - EXPORTING - clskey = ls_clskey - 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. - WHEN 'INTF'. - CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE' - EXPORTING - intkey = ls_clskey - 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. - WHEN OTHERS. - lcx_exception=>raise( 'class delete, unknown type' ). - ENDCASE. - - ENDMETHOD. "delete + 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, @@ -745,6 +350,7 @@ CLASS lcl_object_clas IMPLEMENTATION. * 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. @@ -776,12 +382,58 @@ CLASS lcl_object_clas IMPLEMENTATION. 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. + "Subclass responsibility + ASSERT 0 = 1. + 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. + "Subclass responsibility + ASSERT 0 = 1. + ENDMETHOD. + + METHOD deserialize_abap_source_old. + "for backwards compatability down to 702 - 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 @@ -792,131 +444,364 @@ CLASS lcl_object_clas IMPLEMENTATION. 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. + 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 remove_signatures. + METHOD deserialize_abap_source_new. + DATA: lo_factory TYPE REF TO object, + lo_source TYPE REF TO object. -* signatures messes up in CL_OO_SOURCE when deserializing and serializing -* within same session + CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE') + RECEIVING + result = lo_factory. - DATA: lv_begin TYPE string, - lv_end TYPE string, - lv_remove TYPE sap_bool, - lv_source LIKE LINE OF ct_source. - - - 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 lif_object~serialize. - - DATA: lt_source TYPE seop_source_string, - ls_clskey TYPE seoclskey. - - - ls_clskey-clsname = ms_item-obj_name. - - IF lif_object~exists( ) = abap_false. - RETURN. - ENDIF. - - CALL FUNCTION 'SEO_BUFFER_REFRESH' + CALL METHOD lo_factory->('CREATE_CLIF_SOURCE') EXPORTING - version = seoc_version_active - force = seox_true. - CALL FUNCTION 'SEO_BUFFER_REFRESH' - EXPORTING - version = seoc_version_inactive - force = seox_true. + clif_name = is_clskey-clsname + RECEIVING + result = lo_source. TRY. - lt_source = serialize_abap_new( ls_clskey ). - CATCH cx_sy_dyn_call_error. - lt_source = serialize_abap_old( ls_clskey ). + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK'). + CATCH cx_oo_access_permission. + lcx_exception=>raise( 'source_new, access permission exception' ). ENDTRY. - mo_files->add_abap( lt_source ). + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE') + EXPORTING + source = it_source. - IF ms_item-obj_type = 'CLAS'. - lt_source = serialize_locals_def( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'locals_def' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE'). - lt_source = serialize_locals_imp( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'locals_imp' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. + CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK'). - lt_source = serialize_testclasses( ls_clskey ). - 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. + ENDMETHOD. + METHOD lif_object_oriented_object_fnc~add_to_activation_list. + lcl_objects_activation=>add_item( is_item ). + ENDMETHOD. - lt_source = serialize_macros( ls_clskey ). - IF NOT lt_source[] IS INITIAL. - mo_files->add_abap( iv_extra = 'macros' - it_abap = lt_source ). "#EC NOTEXT - ENDIF. + 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. + "Subclass responsibility + ASSERT 0 = 1. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~create_sotr. + "Subclass responsibility + ASSERT 0 = 1. + 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. + "Subclass responsibility + ASSERT 0 = 1. + 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. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_interface_properties. + ASSERT 0 = 1. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_text_pool. + ASSERT 0 = 1. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_sotr. + ASSERT 0 = 1. + 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. + +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. +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. - serialize_xml( io_xml ). + lcl_objects_activation=>add( iv_type = 'REPT' + iv_name = lv_cp ). + ENDMETHOD. - ENDMETHOD. "serialize + 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. - METHOD read_sotr. + 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, @@ -929,7 +814,7 @@ CLASS lcl_object_clas IMPLEMENTATION. SELECT * FROM seocompodf INTO TABLE lt_seocompodf - WHERE clsname = ms_item-obj_name + WHERE clsname = iv_object_name AND version = '1' AND exposure = '2' AND attdecltyp = '2' @@ -973,32 +858,52 @@ CLASS lcl_object_clas IMPLEMENTATION. -entries = lt_entries. ENDLOOP. - ENDMETHOD. - METHOD serialize_xml. +ENDCLASS. - DATA: ls_vseoclass TYPE vseoclass, - lv_cp TYPE program, - 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. +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. +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. - ls_clskey-clsname = ms_item-obj_name. - + METHOD lif_object_oriented_object_fnc~get_interface_properties. CALL FUNCTION 'SEO_CLIF_GET' EXPORTING - cifkey = ls_clskey + cifkey = is_interface_key version = seoc_version_active IMPORTING - class = ls_vseoclass - interface = ls_vseointerf + interface = rs_interface_properties EXCEPTIONS not_existing = 1 deleted = 2 @@ -1009,6 +914,294 @@ CLASS lcl_object_clas IMPLEMENTATION. ELSEIF sy-subrc <> 0. lcx_exception=>raise( 'error from seo_clif_get' ). 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. + + CASE ms_item-obj_type. + WHEN 'CLAS'. + CALL FUNCTION 'SEO_CLASS_DELETE_COMPLETE' + EXPORTING + clskey = ls_clskey + 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. + WHEN 'INTF'. + CALL FUNCTION 'SEO_INTERFACE_DELETE_COMPLETE' + EXPORTING + intkey = ls_clskey + 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. + WHEN OTHERS. + lcx_exception=>raise( 'class delete, unknown type' ). + ENDCASE. + 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, @@ -1023,61 +1216,32 @@ CLASS lcl_object_clas IMPLEMENTATION. CLEAR ls_vseoclass-with_unit_tests. ENDIF. - CLEAR: ls_vseointerf-uuid, - ls_vseointerf-author, - ls_vseointerf-createdon, - ls_vseointerf-changedby, - ls_vseointerf-changedon, - ls_vseointerf-r3release. + io_xml->add( iv_name = 'VSEOCLASS' + ig_data = ls_vseoclass ). - CASE ms_item-obj_type. - WHEN 'CLAS'. - 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 ) ). - lv_cp = cl_oo_classname_service=>get_classpool_name( ls_clskey-clsname ). - READ TEXTPOOL lv_cp INTO lt_tpool LANGUAGE mv_language. "#EC CI_READ_REP - 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. - IF ls_vseoclass-category = seoc_category_exception. - lt_sotr = read_sotr( ). - IF lines( lt_sotr ) > 0. - io_xml->add( iv_name = 'SOTR' - ig_data = lt_sotr ). - ENDIF. - ENDIF. - WHEN 'INTF'. - io_xml->add( iv_name = 'VSEOINTERF' - ig_data = ls_vseointerf ). - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - - lv_object = ls_clskey-clsname. - CALL FUNCTION 'DOCU_GET' - EXPORTING - id = 'CL' - langu = mv_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'. + 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. - SELECT * FROM seocompotx INTO TABLE lt_descriptions - WHERE clsname = ls_clskey-clsname. - DELETE lt_descriptions WHERE descript IS INITIAL. + 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 ). @@ -1102,7 +1266,6 @@ CLASS lcl_object_clas IMPLEMENTATION. DATA: lt_sotr TYPE ty_sotr_tt, lt_objects TYPE sotr_objects. - io_xml->read( EXPORTING iv_name = 'SOTR' CHANGING cg_data = lt_sotr ). @@ -1110,7 +1273,7 @@ CLASS lcl_object_clas IMPLEMENTATION. RETURN. ENDIF. - mo_object_oriented_object->create_sotr( + mo_object_oriented_object_fct->create_sotr( iv_package = iv_package it_sotr = lt_sotr ). ENDMETHOD. @@ -1129,7 +1292,7 @@ CLASS lcl_object_clas IMPLEMENTATION. lv_object = ms_item-obj_name. - mo_object_oriented_object->create_documentation( + mo_object_oriented_object_fct->create_documentation( it_lines = lt_lines iv_object_name = lv_object iv_language = mv_language ). @@ -1152,7 +1315,7 @@ CLASS lcl_object_clas IMPLEMENTATION. lv_clsname = ms_item-obj_name. - mo_object_oriented_object->insert_text_pool( + mo_object_oriented_object_fct->insert_text_pool( iv_class_name = lv_clsname it_text_pool = lt_tpool iv_language = mv_language ). @@ -1190,12 +1353,12 @@ CLASS lcl_object_clas IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'VSEOCLASS' CHANGING cg_data = ls_vseoclass ). - mo_object_oriented_object->create( + mo_object_oriented_object_fct->create( EXPORTING iv_package = iv_package CHANGING is_properties = ls_vseoclass ). - mo_object_oriented_object->generate_locals( + mo_object_oriented_object_fct->generate_locals( is_key = ls_class_key iv_force = seox_true it_local_definitions = lt_local_definitions @@ -1203,18 +1366,18 @@ CLASS lcl_object_clas IMPLEMENTATION. it_local_macros = lt_local_macros it_local_test_classes = lt_test_classes ). - mo_object_oriented_object->deserialize_source( + 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->update_descriptions( + mo_object_oriented_object_fct->update_descriptions( is_key = ls_class_key it_descriptions = lt_descriptions ). - mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). + mo_object_oriented_object_fct->add_to_activation_list( is_item = ms_item ). ENDMETHOD. "deserialize METHOD lif_object~compare_to_remote_version. @@ -1225,7 +1388,7 @@ CLASS lcl_object_clas IMPLEMENTATION. super->constructor( is_item = is_item iv_language = iv_language ). - mo_object_oriented_object = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). + mo_object_oriented_object_fct = lcl_object_oriented_factory=>make( iv_object_type = ms_item-obj_type ). ENDMETHOD. ENDCLASS. "lcl_object_CLAS IMPLEMENTATION @@ -1236,15 +1399,20 @@ ENDCLASS. "lcl_object_CLAS IMPLEMENTATION * *----------------------------------------------------------------------* CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. -* todo, CLAS + INTF to be refactored, see: +* @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~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. @@ -1265,31 +1433,31 @@ CLASS lcl_object_intf IMPLEMENTATION. io_xml->read( EXPORTING iv_name = 'VSEOINTERF' CHANGING cg_data = ls_vseointerf ). - mo_object_oriented_object->create( + mo_object_oriented_object_fct->create( EXPORTING iv_package = iv_package CHANGING is_properties = ls_vseointerf ). - mo_object_oriented_object->deserialize_source( + 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->update_descriptions( + mo_object_oriented_object_fct->update_descriptions( is_key = ls_clskey it_descriptions = lt_descriptions ). - mo_object_oriented_object->add_to_activation_list( is_item = ms_item ). + 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->get_includes( ms_item-obj_name ). + 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( @@ -1298,4 +1466,72 @@ CLASS lcl_object_intf IMPLEMENTATION. 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_page_debug.prog.abap b/src/zabapgit_page_debug.prog.abap index d3897add1..263c22cdb 100644 --- a/src/zabapgit_page_debug.prog.abap +++ b/src/zabapgit_page_debug.prog.abap @@ -13,7 +13,8 @@ CLASS lcl_gui_page_debuginfo DEFINITION FINAL INHERITING FROM lcl_gui_page. PRIVATE SECTION. METHODS render_debug_info - RETURNING VALUE(ro_html) TYPE REF TO lcl_html. + RETURNING VALUE(ro_html) TYPE REF TO lcl_html + RAISING lcx_exception. METHODS render_supported_object_types RETURNING VALUE(rv_html) TYPE string. @@ -57,6 +58,8 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. ro_html->add( |

abapGit version: { gc_abap_version }

| ). ro_html->add( |

XML version: { gc_xml_version }

| ). ro_html->add( |

GUI version: { lv_gui_version }

| ). + ro_html->add( |

LCL_TIME: { lcl_time=>get( ) }

| ). + ro_html->add( |

SY time: { sy-datum } { sy-uzeit } { sy-tzone }

| ). ENDMETHOD. "render_debug_info @@ -93,7 +96,8 @@ CLASS lcl_gui_page_debuginfo IMPLEMENTATION. CREATE OBJECT ro_html. - ro_html->add( 'debugOutput("Browser: " + navigator.userAgent, "debug_info");' ). + ro_html->add( 'debugOutput("Browser: " + navigator.userAgent + ' && + '"
Frontend time: " + new Date(), "debug_info");' ). ENDMETHOD. "scripts diff --git a/src/zabapgit_persistence.prog.abap b/src/zabapgit_persistence.prog.abap index a72153586..499c3da02 100644 --- a/src/zabapgit_persistence.prog.abap +++ b/src/zabapgit_persistence.prog.abap @@ -1349,7 +1349,8 @@ CLASS lcl_persistence_migrate IMPLEMENTATION. METHOD table_create. - DATA: lv_obj_name TYPE tadir-obj_name, + DATA: lv_rc LIKE sy-subrc, + lv_obj_name TYPE tadir-obj_name, ls_dd02v TYPE dd02v, ls_dd09l TYPE dd09l, lt_dd03p TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY. @@ -1427,11 +1428,14 @@ CLASS lcl_persistence_migrate IMPLEMENTATION. CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = lcl_persistence_db=>c_tabname + auth_chk = abap_false + IMPORTING + rc = lv_rc EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. - IF sy-subrc <> 0. + IF sy-subrc <> 0 OR lv_rc <> 0. lcx_exception=>raise( 'migrate, error from DDIF_TABL_ACTIVATE' ). ENDIF. diff --git a/src/zabapgit_unit_test_clas_intf.prog.abap b/src/zabapgit_unit_test_clas_intf.prog.abap index a5f4c7b37..31f78d7cb 100644 --- a/src/zabapgit_unit_test_clas_intf.prog.abap +++ b/src/zabapgit_unit_test_clas_intf.prog.abap @@ -1,7 +1,7 @@ CLASS ltd_spy_oo_object DEFINITION FOR TESTING. PUBLIC SECTION. - INTERFACES: lif_object_oriented_object. + INTERFACES: lif_object_oriented_object_fnc. DATA: mv_package TYPE devclass, mv_overwrite TYPE seox_boolean, @@ -26,10 +26,17 @@ CLASS ltd_spy_oo_object DEFINITION FOR TESTING. mv_docu_object_name TYPE dokhl-object, mv_docu_language TYPE spras, mt_docu_lines TYPE tlinetab, - mv_get_includes_called TYPE abap_bool. + mv_get_includes_called TYPE abap_bool, + mv_exists TYPE abap_bool, + mv_exists_called TYPE abap_bool, + ms_serialize_key TYPE seoclskey, + mv_skip_test_classes TYPE abap_bool. + PRIVATE SECTION. + + ENDCLASS. CLASS ltd_spy_oo_object IMPLEMENTATION. - METHOD lif_object_oriented_object~create. + METHOD lif_object_oriented_object_fnc~create. DATA lv_properties_structure_name TYPE string. lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name. IF lv_properties_structure_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name. @@ -40,7 +47,7 @@ CLASS ltd_spy_oo_object IMPLEMENTATION. mv_package = iv_package. mv_overwrite = iv_overwrite. ENDMETHOD. - METHOD lif_object_oriented_object~generate_locals. + METHOD lif_object_oriented_object_fnc~generate_locals. ms_locals_key = is_key. mt_local_definitions = it_local_definitions. mt_local_implementations = it_local_implementations. @@ -49,51 +56,101 @@ CLASS ltd_spy_oo_object IMPLEMENTATION. mv_force = iv_force. ENDMETHOD. - METHOD lif_object_oriented_object~deserialize_source. + METHOD lif_object_oriented_object_fnc~deserialize_source. ms_deserialize_key = is_key. mt_source = it_source. ENDMETHOD. - METHOD lif_object_oriented_object~add_to_activation_list. + METHOD lif_object_oriented_object_fnc~add_to_activation_list. ms_item_to_activate = is_item. ENDMETHOD. - METHOD lif_object_oriented_object~update_descriptions. + METHOD lif_object_oriented_object_fnc~update_descriptions. ms_description_key = is_key. mt_descriptions = it_descriptions. ENDMETHOD. - METHOD lif_object_oriented_object~insert_text_pool. - mv_text_pool_inserted = abap_true. + METHOD lif_object_oriented_object_fnc~insert_text_pool. + mv_text_pool_inserted = abap_true. mv_text_pool_class_name = iv_class_name. - mt_text_pool = it_text_pool. + mt_text_pool = it_text_pool. cl_abap_unit_assert=>assert_equals( act = iv_language exp = sy-langu ). ENDMETHOD. - METHOD lif_object_oriented_object~create_sotr. + METHOD lif_object_oriented_object_fnc~create_sotr. mt_sotr = it_sotr. mt_sotr_package = iv_package. ENDMETHOD. - METHOD lif_object_oriented_object~create_documentation. + METHOD lif_object_oriented_object_fnc~create_documentation. mv_docu_object_name = iv_object_name. mv_docu_language = iv_language. mt_docu_lines = it_lines. ENDMETHOD. - METHOD lif_object_oriented_object~get_includes. + METHOD lif_object_oriented_object_fnc~get_includes. APPEND 'dummy' TO rt_includes. mv_get_includes_called = abap_true. ENDMETHOD. + METHOD lif_object_oriented_object_fnc~exists. + mv_exists_called = abap_true. + rv_exists = mv_exists. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~serialize_abap. + ms_serialize_key = is_class_key. + CASE iv_type. + WHEN seop_ext_class_locals_def. + rt_source = mt_local_definitions. + WHEN seop_ext_class_locals_imp. + rt_source = mt_local_implementations. + WHEN seop_ext_class_macros. + rt_source = mt_local_macros. + WHEN seop_ext_class_testclasses. + rt_source = mt_local_test_classes. + WHEN OTHERS. + rt_source = mt_source. + ENDCASE. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_class_properties. + rs_class_properties = ms_class_properties. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_interface_properties. + rs_interface_properties = ms_interface_properties. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_text_pool. + rt_text_pool = mt_text_pool. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_sotr. + rt_sotr = mt_sotr. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_documentation. + rt_lines = mt_docu_lines. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~read_descriptions. + rt_descriptions = mt_descriptions. + ENDMETHOD. + + METHOD lif_object_oriented_object_fnc~get_skip_test_classes. + rv_skip = mv_skip_test_classes. + ENDMETHOD. + ENDCLASS. CLASS ltd_fake_object_files DEFINITION FOR TESTING INHERITING FROM lcl_objects_files. PUBLIC SECTION. METHODS constructor. + METHODS add_abap REDEFINITION. METHODS read_abap REDEFINITION. DATA: mt_sources TYPE seop_source_string, @@ -130,18 +187,32 @@ CLASS ltd_fake_object_files IMPLEMENTATION. APPEND 'macro' TO me->mt_local_macros. APPEND 'test' TO me->mt_local_test_classes. ENDMETHOD. - + METHOD add_abap. + CASE iv_extra. + WHEN 'locals_def'. + mt_local_definitions = it_abap. + WHEN 'locals_imp'. + mt_local_implementations = it_abap. + WHEN 'macros'. + mt_local_macros = it_abap. + WHEN 'testclasses'. + mt_local_test_classes = it_abap. + WHEN OTHERS. + mt_sources = it_abap. + RETURN. + ENDCASE. + ENDMETHOD. ENDCLASS. CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. PROTECTED SECTION. DATA: - mo_spy_oo_object TYPE REF TO ltd_spy_oo_object, - mo_fake_object_files TYPE REF TO ltd_fake_object_files, - mo_xml_input TYPE REF TO lcl_xml_input, - mo_xml_out TYPE REF TO lcl_xml_output, - mo_oo_object TYPE REF TO lif_object, - ms_item TYPE ty_item. + mo_spy_oo_object_functions TYPE REF TO ltd_spy_oo_object, + mo_fake_object_files TYPE REF TO ltd_fake_object_files, + mo_xml_input TYPE REF TO lcl_xml_input, + mo_xml_out TYPE REF TO lcl_xml_output, + mo_oo_object TYPE REF TO lif_object, + ms_item TYPE ty_item. METHODS: when_deserializing RAISING lcx_exception, @@ -162,22 +233,31 @@ CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT. lcx_exception, then_docu_should_be_created IMPORTING - it_lines TYPE tlinetab. + it_lines TYPE tlinetab, + should_serialize_with_obj_key. ENDCLASS. CLASS ltc_oo_test IMPLEMENTATION. + METHOD should_serialize_with_obj_key. + + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->ms_serialize_key + exp = ms_item-obj_name ). + + ENDMETHOD. + METHOD then_docu_should_be_created. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_docu_lines + act = mo_spy_oo_object_functions->mt_docu_lines exp = it_lines ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_object_name + act = mo_spy_oo_object_functions->mv_docu_object_name exp = ms_item-obj_name ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_docu_language + act = mo_spy_oo_object_functions->mv_docu_language exp = sy-langu ). ENDMETHOD. @@ -189,17 +269,17 @@ CLASS ltc_oo_test IMPLEMENTATION. METHOD then_it_should_add_activation. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_item_to_activate + act = mo_spy_oo_object_functions->ms_item_to_activate exp = ms_item ). ENDMETHOD. METHOD then_shuld_update_descriptions. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_descriptions + act = mo_spy_oo_object_functions->mt_descriptions exp = it_descriptions ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_description_key + act = mo_spy_oo_object_functions->ms_description_key exp = ms_item-obj_name ). ENDMETHOD. @@ -211,11 +291,11 @@ CLASS ltc_oo_test IMPLEMENTATION. METHOD then_should_deserialize_source. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_source + act = mo_spy_oo_object_functions->mt_source exp = mo_fake_object_files->mt_sources ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_deserialize_key + act = mo_spy_oo_object_functions->ms_deserialize_key exp = ms_item-obj_name ). ENDMETHOD. @@ -255,9 +335,9 @@ ENDCLASS. CLASS ltcl_class_deserialization IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_spy_oo_object_functions. CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). ms_item-devclass = 'package_name'. ms_item-obj_name = 'zcl_class'. @@ -329,40 +409,40 @@ CLASS ltcl_class_deserialization IMPLEMENTATION. METHOD then_should_create_class. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_class_properties + act = mo_spy_oo_object_functions->ms_class_properties exp = ms_class_properties ). - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_overwrite exp = abap_true ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package + act = mo_spy_oo_object_functions->mv_package exp = 'package_name' ). ENDMETHOD. METHOD then_it_should_generate_locals. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_locals_key + act = mo_spy_oo_object_functions->ms_locals_key exp = ms_item-obj_name ). - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_force + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_force exp = abap_true ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_definitions + act = mo_spy_oo_object_functions->mt_local_definitions exp = mo_fake_object_files->mt_local_definitions ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_implementations + act = mo_spy_oo_object_functions->mt_local_implementations exp = mo_fake_object_files->mt_local_implementations ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_macros + act = mo_spy_oo_object_functions->mt_local_macros exp = mo_fake_object_files->mt_local_macros ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_local_test_classes + act = mo_spy_oo_object_functions->mt_local_test_classes exp = mo_fake_object_files->mt_local_test_classes ). ENDMETHOD. METHOD no_text_pool_no_insert. @@ -370,7 +450,7 @@ CLASS ltcl_class_deserialization IMPLEMENTATION. when_deserializing( ). - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_text_pool_inserted + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_text_pool_inserted exp = abap_false ). ENDMETHOD. @@ -390,11 +470,11 @@ CLASS ltcl_class_deserialization IMPLEMENTATION. when_deserializing( ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_text_pool + act = mo_spy_oo_object_functions->mt_text_pool exp = lt_pool_external ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_text_pool_class_name + act = mo_spy_oo_object_functions->mv_text_pool_class_name exp = 'zcl_class' ). ENDMETHOD. @@ -414,10 +494,10 @@ CLASS ltcl_class_deserialization IMPLEMENTATION. when_deserializing( ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr + act = mo_spy_oo_object_functions->mt_sotr exp = lt_sotr ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mt_sotr_package + act = mo_spy_oo_object_functions->mt_sotr_package exp = 'package_name' ). ENDMETHOD. @@ -457,9 +537,9 @@ ENDCLASS. CLASS ltcl_interface_deserialization IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_spy_oo_object_functions. CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). ms_item-devclass = 'package_name'. ms_item-obj_name = 'zif_interface'. @@ -522,14 +602,14 @@ CLASS ltcl_interface_deserialization IMPLEMENTATION. METHOD then_should_create_interface. cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->ms_interface_properties + act = mo_spy_oo_object_functions->ms_interface_properties exp = ms_interface_properties ). - cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object->mv_overwrite + cl_abap_unit_assert=>assert_equals( act = mo_spy_oo_object_functions->mv_overwrite exp = abap_true ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_package + act = mo_spy_oo_object_functions->mv_package exp = 'package_name' ). ENDMETHOD. @@ -561,9 +641,9 @@ ENDCLASS. CLASS ltcl_class_changed IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_spy_oo_object_functions. CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). ms_item-devclass = 'package_name'. ms_item-obj_name = 'zcl_class'. @@ -580,7 +660,7 @@ CLASS ltcl_class_changed IMPLEMENTATION. lv_username = mo_oo_object->changed_by( ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_get_includes_called + act = mo_spy_oo_object_functions->mv_get_includes_called exp = abap_true ). cl_abap_unit_assert=>assert_equals( @@ -593,7 +673,7 @@ CLASS ltcl_class_changed IMPLEMENTATION. mo_oo_object->has_changed_since( lv_timestamp ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_get_includes_called + act = mo_spy_oo_object_functions->mv_get_includes_called exp = abap_true ). ENDMETHOD. ENDCLASS. @@ -608,9 +688,9 @@ ENDCLASS. CLASS ltcl_interface_changed IMPLEMENTATION. METHOD setup. CREATE OBJECT mo_fake_object_files. - CREATE OBJECT mo_spy_oo_object. + CREATE OBJECT mo_spy_oo_object_functions. CREATE OBJECT mo_xml_out. - lth_oo_factory_injector=>inject( mo_spy_oo_object ). + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). ms_item-devclass = 'package_name'. ms_item-obj_name = 'zif_interface'. @@ -627,7 +707,7 @@ CLASS ltcl_interface_changed IMPLEMENTATION. lv_username = mo_oo_object->changed_by( ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_get_includes_called + act = mo_spy_oo_object_functions->mv_get_includes_called exp = abap_true ). cl_abap_unit_assert=>assert_equals( @@ -640,7 +720,536 @@ CLASS ltcl_interface_changed IMPLEMENTATION. mo_oo_object->has_changed_since( lv_timestamp ). cl_abap_unit_assert=>assert_equals( - act = mo_spy_oo_object->mv_get_includes_called + act = mo_spy_oo_object_functions->mv_get_includes_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_exists_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + class_exists FOR TESTING RAISING cx_static_check, + interface_exists FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_exists_test IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + ENDMETHOD. + + METHOD class_exists. + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + + cl_abap_unit_assert=>assert_equals( + act = mo_oo_object->exists( ) + exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. + + METHOD interface_exists. + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + + cl_abap_unit_assert=>assert_equals( + act = mo_oo_object->exists( ) + exp = abap_true ). + cl_abap_unit_assert=>assert_equals( + act = me->mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_serialize_class DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + teardown, + serialize_abap FOR TESTING RAISING cx_static_check, + no_existing_no_serialize FOR TESTING RAISING cx_static_check, + serialize_local_definitions FOR TESTING RAISING cx_static_check, + serialize_local_implementation FOR TESTING RAISING cx_static_check, + serialize_local_macros FOR TESTING RAISING cx_static_check, + serialize_test_classes FOR TESTING RAISING cx_static_check, + serialize_properties_to_xml FOR TESTING RAISING cx_static_check, + serialize_skipping_tests_xml FOR TESTING RAISING cx_static_check, + serialize_textpool FOR TESTING RAISING cx_static_check, + read_sotr_if_exception_class FOR TESTING RAISING cx_static_check, + do_not_read_sotr_regular_class FOR TESTING RAISING cx_static_check, + should_serialize_documentation FOR TESTING RAISING cx_static_check, + should_serialize_descriptions FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_serialize_class IMPLEMENTATION. + + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zcl_class'. + ms_item-obj_type = 'CLAS'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_clas + EXPORTING + is_item = ms_item + iv_language = sy-langu. + CREATE OBJECT mo_xml_out. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD serialize_abap. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_source_line' TO me->mo_spy_oo_object_functions->mt_source. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( ). + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_source ). + ENDMETHOD. + + METHOD serialize_local_definitions. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_local_definition' TO me->mo_spy_oo_object_functions->mt_local_definitions. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'locals_def' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_definitions ). + ENDMETHOD. + + METHOD serialize_local_implementation. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_local_implementation' TO me->mo_spy_oo_object_functions->mt_local_implementations. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'locals_imp' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_implementations ). + ENDMETHOD. + + METHOD serialize_local_macros. + DATA lt_abap_source TYPE ty_string_tt. + APPEND 'a_local_macro' TO me->mo_spy_oo_object_functions->mt_local_macros. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'macros' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_macros ). + ENDMETHOD. + + METHOD serialize_test_classes. + DATA lt_abap_source TYPE ty_string_tt. + APPEND 'a_local_test' TO me->mo_spy_oo_object_functions->mt_local_test_classes. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( iv_extra = 'testclasses' iv_error = abap_false ). + + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_local_test_classes ). + ENDMETHOD. + + METHOD no_existing_no_serialize. + me->mo_spy_oo_object_functions->mv_exists = abap_false. + mo_oo_object->serialize( mo_xml_out ). + ENDMETHOD. + + + METHOD serialize_properties_to_xml. + DATA: + ls_expected_properties LIKE me->mo_spy_oo_object_functions->ms_class_properties, + ls_actual_properties LIKE me->mo_spy_oo_object_functions->ms_class_properties. + + me->mo_spy_oo_object_functions->ms_class_properties-clsname = ms_item-obj_name. + me->mo_spy_oo_object_functions->ms_class_properties-uuid = '123'. + me->mo_spy_oo_object_functions->ms_class_properties-author = 'author'. + me->mo_spy_oo_object_functions->ms_class_properties-createdon = '2016'. + me->mo_spy_oo_object_functions->ms_class_properties-changedby = 'other'. + me->mo_spy_oo_object_functions->ms_class_properties-changedon = '2017'. + me->mo_spy_oo_object_functions->ms_class_properties-r3release = '1'. + me->mo_spy_oo_object_functions->ms_class_properties-chgdanyby = 'other'. + me->mo_spy_oo_object_functions->ms_class_properties-chgdanyon = '2017'. + + mo_oo_object->serialize( mo_xml_out ). + + ls_expected_properties = me->mo_spy_oo_object_functions->ms_class_properties. + CLEAR: + ls_expected_properties-uuid, + ls_expected_properties-author, + ls_expected_properties-createdon, + ls_expected_properties-changedby, + ls_expected_properties-changedon, + ls_expected_properties-r3release, + ls_expected_properties-chgdanyby, + ls_expected_properties-chgdanyon. + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'VSEOCLASS' + CHANGING + cg_data = ls_actual_properties ). + cl_abap_unit_assert=>assert_equals( + act = ls_actual_properties + exp = ls_expected_properties ). + ENDMETHOD. + + METHOD serialize_skipping_tests_xml. + DATA: + ls_actual_properties LIKE me->mo_spy_oo_object_functions->ms_class_properties. + APPEND 'a_local_test' TO me->mo_spy_oo_object_functions->mt_local_test_classes. + me->mo_spy_oo_object_functions->mv_skip_test_classes = abap_true. + + me->mo_spy_oo_object_functions->ms_class_properties-clsname = ms_item-obj_name. + me->mo_spy_oo_object_functions->ms_class_properties-with_unit_tests = abap_true. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'VSEOCLASS' + CHANGING + cg_data = ls_actual_properties ). + cl_abap_unit_assert=>assert_equals( + act = ls_actual_properties-with_unit_tests + exp = abap_false ). + ENDMETHOD. + + METHOD serialize_textpool. + DATA: + ls_textpool TYPE textpool, + lt_actual_text_pool TYPE textpool_table. + ls_textpool-id = '1'. + ls_textpool-key = '1'. + APPEND ls_textpool TO mo_spy_oo_object_functions->mt_text_pool. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'TPOOL' + CHANGING + cg_data = lt_actual_text_pool ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_text_pool + exp = mo_spy_oo_object_functions->mt_text_pool ). + ENDMETHOD. + + METHOD read_sotr_if_exception_class. + DATA: + lt_sotr TYPE ty_sotr_tt, + lt_actual_sotr TYPE ty_sotr_tt, + ls_sotr LIKE LINE OF lt_sotr. + + me->mo_spy_oo_object_functions->ms_class_properties-category = seoc_category_exception. + + ls_sotr-header-concept = 'HEADER'. + APPEND ls_sotr TO lt_sotr. + + me->mo_spy_oo_object_functions->mt_sotr = lt_sotr. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'SOTR' + CHANGING + cg_data = lt_actual_sotr ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_sotr + exp = mo_spy_oo_object_functions->mt_sotr ). + ENDMETHOD. + + METHOD do_not_read_sotr_regular_class. + DATA: + lt_actual_sotr TYPE ty_sotr_tt. + + CLEAR: me->mo_spy_oo_object_functions->ms_class_properties-category. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'SOTR' + CHANGING + cg_data = lt_actual_sotr ). + cl_abap_unit_assert=>assert_initial( lt_actual_sotr ). + ENDMETHOD. + + METHOD should_serialize_documentation. + DATA: + lt_lines TYPE tlinetab, + lt_actual_lines TYPE tlinetab, + ls_line LIKE LINE OF lt_lines. + + ls_line-tdline = 'a_line'. + APPEND ls_line TO lt_lines. + + me->mo_spy_oo_object_functions->mt_docu_lines = lt_lines. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'LINES' + CHANGING + cg_data = lt_actual_lines ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_lines + exp = me->mo_spy_oo_object_functions->mt_docu_lines ). + ENDMETHOD. + + METHOD should_serialize_descriptions. + DATA: + lt_descriptions TYPE ty_seocompotx_tt, + lt_actual_descriptions TYPE ty_seocompotx_tt, + ls_description TYPE LINE OF ty_seocompotx_tt. + + ls_description-clsname = 'class'. + APPEND ls_description TO lt_descriptions. + + + me->mo_spy_oo_object_functions->mt_descriptions = lt_descriptions. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'DESCRIPTIONS' + CHANGING + cg_data = lt_actual_descriptions ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_descriptions + exp = me->mo_spy_oo_object_functions->mt_descriptions ). + ENDMETHOD. + + METHOD teardown. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_exists_called + exp = abap_true ). + ENDMETHOD. +ENDCLASS. + +CLASS ltcl_serialize_interface DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT +INHERITING FROM ltc_oo_test. + PRIVATE SECTION. + METHODS: + setup, + teardown, + serialize_abap FOR TESTING RAISING cx_static_check, + no_existing_no_serialize FOR TESTING RAISING cx_static_check, + serialize_properties_to_xml FOR TESTING RAISING cx_static_check, + should_serialize_documentation FOR TESTING RAISING cx_static_check, + should_serialize_descriptions FOR TESTING RAISING cx_static_check. +ENDCLASS. + +CLASS ltcl_serialize_interface IMPLEMENTATION. + METHOD setup. + CREATE OBJECT mo_fake_object_files. + CREATE OBJECT mo_spy_oo_object_functions. + me->mo_spy_oo_object_functions->mv_exists = abap_true. + lth_oo_factory_injector=>inject( mo_spy_oo_object_functions ). + + ms_item-devclass = 'package_name'. + ms_item-obj_name = 'zif_interface'. + ms_item-obj_type = 'INTF'. + + CREATE OBJECT mo_oo_object TYPE lcl_object_intf + EXPORTING + is_item = ms_item + iv_language = sy-langu. + CREATE OBJECT mo_xml_out. + mo_oo_object->mo_files = mo_fake_object_files. + ENDMETHOD. + + METHOD serialize_abap. + DATA lt_abap_source TYPE ty_string_tt. + + APPEND 'a_source_line' TO me->mo_spy_oo_object_functions->mt_source. + + mo_oo_object->serialize( mo_xml_out ). + + should_serialize_with_obj_key( ). + + lt_abap_source = mo_fake_object_files->read_abap( ). + cl_abap_unit_assert=>assert_equals( + act = lt_abap_source + exp = me->mo_spy_oo_object_functions->mt_source ). + ENDMETHOD. + + METHOD no_existing_no_serialize. + me->mo_spy_oo_object_functions->mv_exists = abap_false. + mo_oo_object->serialize( mo_xml_out ). + ENDMETHOD. + + + METHOD serialize_properties_to_xml. + DATA: + ls_expected_properties LIKE me->mo_spy_oo_object_functions->ms_interface_properties, + ls_actual_properties LIKE me->mo_spy_oo_object_functions->ms_interface_properties. + + me->mo_spy_oo_object_functions->ms_interface_properties-clsname = ms_item-obj_name. + me->mo_spy_oo_object_functions->ms_interface_properties-uuid = '123'. + me->mo_spy_oo_object_functions->ms_interface_properties-author = 'author'. + me->mo_spy_oo_object_functions->ms_interface_properties-createdon = '2016'. + me->mo_spy_oo_object_functions->ms_interface_properties-changedby = 'other'. + me->mo_spy_oo_object_functions->ms_interface_properties-changedon = '2017'. + me->mo_spy_oo_object_functions->ms_interface_properties-r3release = '1'. + + mo_oo_object->serialize( mo_xml_out ). + + ls_expected_properties = me->mo_spy_oo_object_functions->ms_interface_properties. + CLEAR: + ls_expected_properties-uuid, + ls_expected_properties-author, + ls_expected_properties-createdon, + ls_expected_properties-changedby, + ls_expected_properties-changedon, + ls_expected_properties-r3release. + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'VSEOINTERF' + CHANGING + cg_data = ls_actual_properties ). + cl_abap_unit_assert=>assert_equals( + act = ls_actual_properties + exp = ls_expected_properties ). + ENDMETHOD. + METHOD should_serialize_documentation. + DATA: + lt_lines TYPE tlinetab, + lt_actual_lines TYPE tlinetab, + ls_line LIKE LINE OF lt_lines. + + ls_line-tdline = 'a_line'. + APPEND ls_line TO lt_lines. + + me->mo_spy_oo_object_functions->mt_docu_lines = lt_lines. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'LINES' + CHANGING + cg_data = lt_actual_lines ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_lines + exp = me->mo_spy_oo_object_functions->mt_docu_lines ). + ENDMETHOD. + + METHOD should_serialize_descriptions. + DATA: + lt_descriptions TYPE ty_seocompotx_tt, + lt_actual_descriptions TYPE ty_seocompotx_tt, + ls_description TYPE LINE OF ty_seocompotx_tt. + + ls_description-clsname = 'class'. + APPEND ls_description TO lt_descriptions. + + + me->mo_spy_oo_object_functions->mt_descriptions = lt_descriptions. + + mo_oo_object->serialize( mo_xml_out ). + + CREATE OBJECT mo_xml_input + EXPORTING + iv_xml = mo_xml_out->render( ). + + mo_xml_input->read( + EXPORTING + iv_name = 'DESCRIPTIONS' + CHANGING + cg_data = lt_actual_descriptions ). + cl_abap_unit_assert=>assert_equals( + act = lt_actual_descriptions + exp = me->mo_spy_oo_object_functions->mt_descriptions ). + ENDMETHOD. + METHOD teardown. + cl_abap_unit_assert=>assert_equals( + act = mo_spy_oo_object_functions->mv_exists_called exp = abap_true ). ENDMETHOD. ENDCLASS. diff --git a/src/zabapgit_view_tutorial.prog.abap b/src/zabapgit_view_tutorial.prog.abap index a438e2f0a..a73ca6806 100644 --- a/src/zabapgit_view_tutorial.prog.abap +++ b/src/zabapgit_view_tutorial.prog.abap @@ -66,12 +66,24 @@ CLASS lcl_gui_view_tutorial IMPLEMENTATION. _add '

abapGit related repositories

'. _add '

    '. _add '
  • '. - ro_html->add_a( iv_txt = 'install abapGit repo' iv_act = gc_action-abapgit_install ). - _add ' - To keep abapGit up-to-date (or also to contribute) you need to'. - _add 'install it as a repository.
  • '. + IF lcl_services_abapgit=>is_installed( ) = abap_true. + _add 'abapGit installed in package '. + _add lcl_services_abapgit=>c_package_abapgit. + ELSE. + ro_html->add_a( iv_txt = 'install abapGit repo' iv_act = gc_action-abapgit_install ). + _add ' - To keep abapGit up-to-date (or also to contribute) you need to'. + _add 'install it as a repository.'. + ENDIF. + _add ''. _add '
  • '. - ro_html->add_a( iv_txt = 'install abapGit plugins' iv_act = gc_action-abapgit_install_pi ). - _add ' - you can also install plugins to extend supported object types
  • '. + IF lcl_services_abapgit=>is_installed_pi( ) = abap_true. + _add 'abapGit plugins installed in package '. + _add lcl_services_abapgit=>c_package_plugins. + ELSE. + ro_html->add_a( iv_txt = 'install abapGit plugins' iv_act = gc_action-abapgit_install_pi ). + _add ' - you can also install plugins to extend supported object types'. + ENDIF. + _add ''. _add '

'. ENDMETHOD. " render_content.