class_abap_deserializing

This commit is contained in:
eduardocopat 2016-12-21 14:18:18 +01:00
parent e763228fc5
commit 9ade177c49
2 changed files with 334 additions and 101 deletions

View File

@ -114,6 +114,8 @@ TYPES: ty_results_tt TYPE STANDARD TABLE OF ty_result WITH DEFAULT KEY.
TYPES: ty_sval_tt TYPE STANDARD TABLE OF sval WITH DEFAULT KEY.
TYPES: ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY.
CONSTANTS: BEGIN OF gc_state, " https://git-scm.com/docs/git-status
unchanged TYPE char1 VALUE '',
added TYPE char1 VALUE 'A',

View File

@ -15,31 +15,150 @@ INTERFACE lif_object_oriented_object.
iv_overwrite TYPE seox_boolean DEFAULT seox_true
CHANGING
is_properties TYPE any
RAISING
lcx_exception,
generate_locals
IMPORTING
is_key TYPE seoclskey
iv_force TYPE seox_boolean DEFAULT seox_true
it_local_definitions TYPE seop_source_string OPTIONAL
it_local_implementations TYPE seop_source_string OPTIONAL
it_local_macros TYPE seop_source_string OPTIONAL
it_local_test_classes TYPE seop_source_string OPTIONAL
RAISING
lcx_exception,
deserialize_source
IMPORTING
is_key TYPE seoclskey
it_source TYPE ty_string_tt
RAISING
lcx_exception
cx_sy_dyn_call_error,
update_descriptions
IMPORTING
is_key TYPE seoclskey
it_descriptions TYPE ty_seocompotx_tt,
add_to_activation_list
IMPORTING
is_item TYPE ty_item
RAISING
lcx_exception.
* generate_locals
* 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.
ENDINTERFACE.
CLASS lcl_object_oriented_class DEFINITION.
CLASS lcl_object_oriented_base DEFINITION ABSTRACT.
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
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~create.
"Subclass responsibility
RETURN.
ENDMETHOD.
METHOD lif_object_oriented_object~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~generate_locals.
"Subclass responsibility
RETURN.
ENDMETHOD.
METHOD deserialize_abap_source_old.
"for backwards compatability down to 702
DATA: lo_source TYPE REF TO cl_oo_source.
CREATE OBJECT lo_source
EXPORTING
clskey = is_clskey
EXCEPTIONS
class_not_existing = 1
OTHERS = 2.
IF sy-subrc <> 0.
lcx_exception=>raise( 'error from CL_OO_SOURCE' ).
ENDIF.
TRY.
lo_source->access_permission( seok_access_modify ).
lo_source->set_source( it_source ).
lo_source->save( ).
lo_source->access_permission( seok_access_free ).
CATCH cx_oo_access_permission.
lcx_exception=>raise( 'permission error' ).
CATCH cx_oo_source_save_failure.
lcx_exception=>raise( 'save failure' ).
ENDTRY.
ENDMETHOD.
METHOD deserialize_abap_source_new.
DATA: lo_factory TYPE REF TO object,
lo_source TYPE REF TO object.
CALL METHOD ('CL_OO_FACTORY')=>('CREATE_INSTANCE')
RECEIVING
result = lo_factory.
CALL METHOD lo_factory->('CREATE_CLIF_SOURCE')
EXPORTING
clif_name = is_clskey-clsname
RECEIVING
result = lo_source.
TRY.
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~LOCK').
CATCH cx_oo_access_permission.
lcx_exception=>raise( 'source_new, access permission exception' ).
ENDTRY.
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SET_SOURCE')
EXPORTING
source = it_source.
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~SAVE').
CALL METHOD lo_source->('IF_OO_CLIF_SOURCE~UNLOCK').
ENDMETHOD.
METHOD lif_object_oriented_object~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.
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.
ENDCLASS.
CLASS lcl_object_oriented_class IMPLEMENTATION.
METHOD lif_object_oriented_object~create.
@ -61,11 +180,32 @@ CLASS lcl_object_oriented_class IMPLEMENTATION.
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.
ENDCLASS.
CLASS lcl_object_oriented_interface DEFINITION.
CLASS lcl_object_oriented_interface DEFINITION
INHERITING FROM lcl_object_oriented_base.
PUBLIC SECTION.
INTERFACES: lif_object_oriented_object.
METHODS:
lif_object_oriented_object~create REDEFINITION.
ENDCLASS.
CLASS lcl_object_oriented_interface IMPLEMENTATION.
@ -146,7 +286,7 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
TYPES: ty_sotr_tt TYPE STANDARD TABLE OF ty_sotr WITH DEFAULT KEY.
TYPES: ty_seocompotx_tt TYPE STANDARD TABLE OF seocompotx WITH DEFAULT KEY.
DATA mv_skip_testclass TYPE abap_bool.
@ -861,13 +1001,6 @@ CLASS lcl_object_clas IMPLEMENTATION.
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 ).
@ -879,7 +1012,6 @@ CLASS lcl_object_clas IMPLEMENTATION.
ENDIF.
deserialize_docu( io_xml ).
ENDMETHOD. "deserialize
METHOD deserialize_sotr.
@ -1076,42 +1208,30 @@ CLASS lcl_object_clas IMPLEMENTATION.
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.
lo_object_oriented_object->generate_locals(
is_key = ls_clskey
iv_force = seox_true
it_local_definitions = lt_locals_def
it_local_implementations = lt_locals_imp
it_local_macros = lt_locals_mac
it_local_test_classes = lt_testclasses
).
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.
lo_object_oriented_object->deserialize_source(
is_key = ls_clskey
it_source = lt_source
).
io_xml->read( EXPORTING iv_name = 'DESCRIPTIONS'
CHANGING cg_data = lt_descriptions ).
DELETE FROM seocompotx WHERE clsname = ls_clskey-clsname.
INSERT seocompotx FROM TABLE lt_descriptions.
lcl_objects_activation=>add_item( ms_item ).
lo_object_oriented_object->update_descriptions(
is_key = ls_clskey
it_descriptions = lt_descriptions
).
lo_object_oriented_object->add_to_activation_list( is_item = ms_item ).
ENDMETHOD. "deserialize
METHOD deserialize_abap_source_old.
@ -1187,17 +1307,53 @@ CLASS ltd_spy_oo_object DEFINITION FOR TESTING.
DATA:
mv_package TYPE devclass,
mv_overwrite TYPE seox_boolean,
mr_properties TYPE REF TO data.
ms_interface_properties TYPE vseointerf,
ms_class_properties TYPE vseoclass,
ms_locals_key TYPE seoclskey,
mt_local_definitions TYPE rswsourcet,
mt_local_implementations TYPE rswsourcet,
mt_local_macros TYPE rswsourcet,
mt_local_test_classes TYPE rswsourcet,
mv_force TYPE seoflag,
ms_deserialize_key TYPE seoclskey,
mt_source TYPE ty_string_tt,
ms_item_to_activate TYPE ty_item,
mt_descriptions TYPE ty_seocompotx_tt,
ms_description_key TYPE seoclskey.
ENDCLASS.
CLASS ltd_spy_oo_object IMPLEMENTATION.
METHOD lif_object_oriented_object~create.
FIELD-SYMBOLS: <fs_properties> TYPE any.
ASSIGN is_properties to <fs_properties>.
"<fs_properties> = is_properties.
GET reference of <fs_properties> into mr_properties.
IF cl_abap_typedescr=>describe_by_data( is_properties )->absolute_name = cl_abap_typedescr=>describe_by_data( ms_interface_properties )->absolute_name.
ms_interface_properties = is_properties.
ELSE.
ms_class_properties = is_properties.
ENDIF.
mv_package = iv_package.
mv_overwrite = iv_overwrite.
ENDMETHOD.
METHOD lif_object_oriented_object~generate_locals.
ms_locals_key = is_key.
mt_local_definitions = it_local_definitions.
mt_local_implementations = it_local_implementations.
mt_local_macros = it_local_macros.
mt_local_test_classes = it_local_test_classes.
mv_force = iv_force.
ENDMETHOD.
METHOD lif_object_oriented_object~deserialize_source.
ms_deserialize_key = is_key.
mt_source = it_source.
ENDMETHOD.
METHOD lif_object_oriented_object~add_to_activation_list.
ms_item_to_activate = is_item.
ENDMETHOD.
METHOD lif_object_oriented_object~update_descriptions.
ms_description_key = is_key.
mt_descriptions = it_descriptions.
ENDMETHOD.
ENDCLASS.
CLASS ltd_fake_object_files DEFINITION FOR TESTING
@ -1206,25 +1362,25 @@ CLASS ltd_fake_object_files DEFINITION FOR TESTING
METHODS constructor.
METHODS read_abap REDEFINITION.
DATA:
lt_sources TYPE seop_source_string,
lt_local_definitions TYPE seop_source_string,
lt_local_implementations TYPE seop_source_string,
lt_local_macros TYPE seop_source_string,
lt_test_classes TYPE seop_source_string.
mt_sources TYPE seop_source_string,
mt_local_definitions TYPE seop_source_string,
mt_local_implementations TYPE seop_source_string,
mt_local_macros TYPE seop_source_string,
mt_local_test_classes TYPE seop_source_string.
ENDCLASS.
CLASS ltd_fake_object_files IMPLEMENTATION.
METHOD read_abap.
CASE iv_extra.
WHEN 'locals_def'.
rt_abap = lt_local_definitions.
rt_abap = mt_local_definitions.
WHEN 'locals_imp'.
rt_abap = lt_local_implementations.
rt_abap = mt_local_implementations.
WHEN 'macros'.
rt_abap = lt_local_macros.
rt_abap = mt_local_macros.
WHEN 'testclasses'.
rt_abap = lt_test_classes.
rt_abap = mt_local_test_classes.
WHEN OTHERS.
rt_abap = lt_sources.
rt_abap = mt_sources.
RETURN.
ENDCASE.
@ -1233,11 +1389,11 @@ CLASS ltd_fake_object_files IMPLEMENTATION.
METHOD constructor.
DATA ls_empty_item TYPE ty_item.
super->constructor( ls_empty_item ).
APPEND 'source' TO me->lt_sources.
APPEND 'definition' TO me->lt_local_definitions.
APPEND 'implementation' TO me->lt_local_implementations.
APPEND 'macro' TO me->lt_local_macros.
APPEND 'test' TO me->lt_test_classes.
APPEND 'source' TO me->mt_sources.
APPEND 'definition' TO me->mt_local_definitions.
APPEND 'implementation' TO me->mt_local_implementations.
APPEND 'macro' TO me->mt_local_macros.
APPEND 'test' TO me->mt_local_test_classes.
ENDMETHOD.
ENDCLASS.
@ -1245,37 +1401,50 @@ ENDCLASS.
CLASS ltc_class_deserialization DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PRIVATE SECTION.
METHODS:
create FOR TESTING RAISING cx_static_check.
deserialize FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltc_class_deserialization IMPLEMENTATION.
METHOD create.
METHOD deserialize.
DATA spy_oo_object TYPE REF TO ltd_spy_oo_object.
DATA fake_object_files TYPE REF TO ltd_fake_object_files.
DATA xml_input TYPE REF TO lcl_xml_input.
DATA xml_out TYPE REF TO lcl_xml_output.
DATA: ls_class_properties TYPE vseoclass.
DATA lo_class TYPE REF TO lif_object.
DATA ls_description TYPE seocompotx.
DATA lt_descriptions TYPE TABLE OF seocompotx.
CREATE OBJECT fake_object_files.
CREATE OBJECT spy_oo_object.
lth_oo_factory_injector=>inject( spy_oo_object ).
DATA lo_class TYPE REF TO lif_object.
DATA(ls_item) = VALUE ty_item( devclass = 'package_name' obj_name = 'zcl_class' obj_type = 'CLAS' ).
CREATE OBJECT lo_class TYPE lcl_object_clas
EXPORTING
is_item = VALUE #( devclass = 'CLAS' obj_name = 'zclass' obj_type = 'CLAS' )
is_item = ls_item
iv_language = sy-langu.
lo_class->mo_files = fake_object_files.
DATA xml_input TYPE REF TO lcl_xml_input.
DATA xml_out TYPE REF TO lcl_xml_output.
DATA: ls_class_properties TYPE vseoclass.
ls_class_properties-clsname = 'class_name'.
ls_class_properties-clsname = 'zcl_class'.
CREATE OBJECT xml_out.
xml_out->add(
EXPORTING
iv_name = 'VSEOCLASS'
ig_data = ls_class_properties
).
ls_description-clsname = 'zcl_class'.
ls_description-cmpname = 'a_method'.
APPEND ls_description TO lt_descriptions.
xml_out->add(
iv_name = 'DESCRIPTIONS'
ig_data = lt_descriptions
).
CREATE OBJECT xml_input
EXPORTING
iv_xml = xml_out->render( ).
@ -1284,22 +1453,84 @@ CLASS ltc_class_deserialization IMPLEMENTATION.
io_xml = xml_input
).
lcl_objects_activation=>clear( ).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mr_properties
act = spy_oo_object->ms_class_properties
exp = ls_class_properties
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mv_overwrite
exp = abap_true
).
cl_abap_unit_assert=>assert_true( spy_oo_object->mv_overwrite ).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mv_package
exp = 'package_name'
).
"Local generation
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->ms_locals_key
exp = 'zcl_class'
).
cl_abap_unit_assert=>assert_true( spy_oo_object->mv_force ).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_local_definitions
exp = fake_object_files->mt_local_definitions
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_local_implementations
exp = fake_object_files->mt_local_implementations
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_local_macros
exp = fake_object_files->mt_local_macros
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_local_test_classes
exp = fake_object_files->mt_local_test_classes
).
"Deserialization source
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_source
exp = fake_object_files->mt_sources
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->ms_deserialize_key
exp = 'zcl_class'
).
"Update descriptions
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_descriptions
exp = lt_descriptions
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->ms_description_key
exp = 'zcl_class'
).
"Descriptions
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->mt_descriptions
exp = lt_descriptions
).
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->ms_description_key
exp = 'zcl_class'
).
"Activation
cl_abap_unit_assert=>assert_equals(
act = spy_oo_object->ms_item_to_activate
exp = ls_item
).
ENDMETHOD.
ENDCLASS.