*&---------------------------------------------------------------------* *& Include ZABAPGIT_OBJECT_CLAS *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_object_clas DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program. PUBLIC SECTION. INTERFACES lif_object. ALIASES mo_files FOR lif_object~mo_files. PRIVATE SECTION. TYPES: BEGIN OF ty_sotr, header TYPE sotr_head, entries TYPE sotr_text_tt, END OF ty_sotr. TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY. DATA mv_skip_testclass TYPE abap_bool. METHODS deserialize_abap IMPORTING io_xml TYPE REF TO lcl_xml_input iv_package TYPE devclass RAISING lcx_exception. METHODS deserialize_textpool IMPORTING io_xml TYPE REF TO lcl_xml_input RAISING lcx_exception. METHODS deserialize_docu 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 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. 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_intf DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_intf DEFINITION INHERITING FROM lcl_object_clas FINAL. * todo, CLAS + INTF to be refactored, see: * https://github.com/larshp/abapGit/issues/21 ENDCLASS. "lcl_object_intf DEFINITION *----------------------------------------------------------------------* * CLASS lcl_object_clas IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_object_clas IMPLEMENTATION. METHOD lif_object~has_changed_since. DATA: lv_clsname TYPE seoclsname, lv_program TYPE program, lt_incl TYPE seoincl_t. FIELD-SYMBOLS LIKE LINE OF lt_incl. lv_clsname = ms_item-obj_name. CASE ms_item-obj_type. WHEN 'CLAS'. TRY. CALL METHOD cl_oo_classname_service=>('GET_ALL_CLASS_INCLUDES') EXPORTING class_name = lv_clsname RECEIVING result = lt_incl. CATCH cx_sy_dyn_call_illegal_method. * method does not exist in 702, just report everything as changed rv_changed = abap_true. ENDTRY. LOOP AT lt_incl 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. WHEN 'INTF'. lv_program = cl_oo_classname_service=>get_interfacepool_name( lv_clsname ). rv_changed = check_prog_changed_since( iv_program = lv_program iv_timestamp = iv_timestamp iv_skip_gui = abap_true ). WHEN OTHERS. lcx_exception=>raise( 'class delete, unknown type' ). ENDCASE. 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. * todo, not sure this is correct, to be tested SELECT SINGLE changedby FROM seoclassdf INTO rv_user WHERE clsname = ms_item-obj_name AND version = '1'. "#EC CI_GENBUFF IF sy-subrc = 0 AND rv_user IS INITIAL. SELECT SINGLE author FROM seoclassdf INTO rv_user WHERE clsname = ms_item-obj_name AND version = '1'. "#EC CI_GENBUFF ENDIF. IF sy-subrc <> 0. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD lif_object~exists. DATA: ls_clskey TYPE seoclskey. ls_clskey-clsname = ms_item-obj_name. 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 ). 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 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 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(3) = '*"*' OR lv_line1 IS INITIAL. 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 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. 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' EXPORTING version = seoc_version_active force = seox_true. CALL FUNCTION 'SEO_BUFFER_REFRESH' EXPORTING version = seoc_version_inactive force = seox_true. TRY. lt_source = serialize_abap_new( ls_clskey ). CATCH cx_sy_dyn_call_error. lt_source = serialize_abap_old( ls_clskey ). ENDTRY. mo_files->add_abap( lt_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. 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. 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. 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. ENDIF. serialize_xml( io_xml ). ENDMETHOD. "serialize METHOD 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 = ms_item-obj_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. lcx_exception=>raise( 'error from SOTR_GET_CONCEPT' ). 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 serialize_xml. DATA: ls_vseoclass TYPE vseoclass, lv_cp TYPE program, lt_tpool TYPE textpool_table, lv_object TYPE dokhl-object, lv_state TYPE dokhl-dokstate, 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. CALL FUNCTION 'SEO_CLIF_GET' EXPORTING cifkey = ls_clskey version = seoc_version_active IMPORTING class = ls_vseoclass interface = ls_vseointerf 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. CLEAR: ls_vseoclass-uuid, ls_vseoclass-author, ls_vseoclass-createdon, ls_vseoclass-changedby, ls_vseoclass-changedon, ls_vseoclass-r3release, ls_vseoclass-chgdanyby, ls_vseoclass-chgdanyon. IF mv_skip_testclass = abap_true. CLEAR ls_vseoclass-with_unit_tests. ENDIF. CLEAR: ls_vseointerf-uuid, ls_vseointerf-author, ls_vseointerf-createdon, ls_vseointerf-changedby, ls_vseointerf-changedon, ls_vseointerf-r3release. CASE ms_item-obj_type. WHEN 'CLAS'. io_xml->add( iv_name = 'VSEOCLASS' ig_data = ls_vseoclass ). 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 = 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'. io_xml->add( iv_name = 'LINES' ig_data = lt_lines ). ENDIF. ENDMETHOD. "serialize_xml METHOD lif_object~deserialize. * function group SEOK * function group SEOQ * function group SEOP * class CL_OO_CLASSNAME_SERVICE * class CL_OO_SOURCE deserialize_abap( io_xml = io_xml iv_package = iv_package ). IF ms_item-obj_type = 'CLAS'. deserialize_textpool( io_xml ). deserialize_sotr( io_xml = io_xml iv_package = iv_package ). ENDIF. deserialize_docu( io_xml ). ENDMETHOD. "deserialize METHOD deserialize_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. io_xml->read( EXPORTING iv_name = 'SOTR' CHANGING cg_data = lt_sotr ). IF lines( lt_sotr ) = 0. RETURN. ENDIF. LOOP AT lt_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 deserialize_docu. DATA: lt_lines TYPE tlinetab, lv_object TYPE dokhl-object. io_xml->read( EXPORTING iv_name = 'LINES' CHANGING cg_data = lt_lines ). IF lt_lines[] IS INITIAL. RETURN. ENDIF. lv_object = ms_item-obj_name. CALL FUNCTION 'DOCU_UPD' EXPORTING id = 'CL' langu = mv_language object = lv_object TABLES line = lt_lines EXCEPTIONS ret_code = 1 OTHERS = 2. IF sy-subrc <> 0. lcx_exception=>raise( 'error from DOCU_UPD' ). ENDIF. ENDMETHOD. "deserialize_doku METHOD deserialize_textpool. DATA: lv_cp TYPE program, lv_clsname TYPE seoclsname, lt_tpool_ext TYPE ty_tpool_tt, lt_tpool TYPE textpool_table. io_xml->read( EXPORTING iv_name = 'TPOOL' CHANGING cg_data = lt_tpool_ext ). lt_tpool = read_tpool( lt_tpool_ext ). IF lt_tpool[] IS INITIAL. RETURN. ENDIF. lv_clsname = ms_item-obj_name. lv_cp = cl_oo_classname_service=>get_classpool_name( lv_clsname ). INSERT TEXTPOOL lv_cp FROM lt_tpool LANGUAGE mv_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. "deserialize_textpool METHOD deserialize_abap. DATA: ls_vseoclass TYPE vseoclass, ls_vseointerf TYPE vseointerf, lt_source TYPE seop_source_string, lt_locals_def TYPE seop_source_string, lt_locals_imp TYPE seop_source_string, lt_locals_mac TYPE seop_source_string, lt_testclasses TYPE seop_source_string, ls_clskey TYPE seoclskey. lt_source = mo_files->read_abap( ). lt_locals_def = mo_files->read_abap( iv_extra = 'locals_def' iv_error = abap_false ). "#EC NOTEXT lt_locals_imp = mo_files->read_abap( iv_extra = 'locals_imp' iv_error = abap_false ). "#EC NOTEXT lt_locals_mac = mo_files->read_abap( iv_extra = 'macros' iv_error = abap_false ). "#EC NOTEXT lt_testclasses = mo_files->read_abap( iv_extra = 'testclasses' iv_error = abap_false ). "#EC NOTEXT ls_clskey-clsname = ms_item-obj_name. CASE ms_item-obj_type. WHEN 'CLAS'. io_xml->read( EXPORTING iv_name = 'VSEOCLASS' CHANGING cg_data = ls_vseoclass ). CALL FUNCTION 'SEO_CLASS_CREATE_COMPLETE' EXPORTING devclass = iv_package overwrite = seox_true CHANGING class = ls_vseoclass 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. WHEN 'INTF'. io_xml->read( EXPORTING iv_name = 'VSEOINTERF' CHANGING cg_data = ls_vseointerf ). CALL FUNCTION 'SEO_INTERFACE_CREATE_COMPLETE' EXPORTING devclass = iv_package overwrite = seox_true CHANGING interface = ls_vseointerf 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. WHEN OTHERS. ASSERT 0 = 1. ENDCASE. IF ms_item-obj_type = 'CLAS'. CALL FUNCTION 'SEO_CLASS_GENERATE_LOCALS' EXPORTING clskey = ls_clskey force = seox_true locals_def = lt_locals_def locals_imp = lt_locals_imp locals_mac = lt_locals_mac locals_testclasses = lt_testclasses 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. ENDIF. TRY. deserialize_abap_source_new( is_clskey = ls_clskey it_source = lt_source ). CATCH cx_sy_dyn_call_error. deserialize_abap_source_old( is_clskey = ls_clskey it_source = lt_source ). ENDTRY. lcl_objects_activation=>add_item( ms_item ). ENDMETHOD. "deserialize 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. ENDCLASS. "lcl_object_CLAS IMPLEMENTATION