Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[AFF] deserialize INTF metadata as JSON #5704

Merged
merged 34 commits into from Aug 11, 2022
Merged
Show file tree
Hide file tree
Changes from 26 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b271628
add IF for experimental
albertmink Aug 2, 2022
c47192c
WIP: do the AFF serialization
albertmink Aug 2, 2022
7089410
WIP: start deserialize
albertmink Aug 2, 2022
e6366b0
f: do abapGit type
albertmink Aug 3, 2022
3bc2316
add convertion from aff type to abapGit type
albertmink Aug 3, 2022
1f41554
Prettier
albertmink Aug 3, 2022
d2abd68
explicity state that METH are for serialization
albertmink Aug 3, 2022
a35d974
get default path/value pairs
albertmink Aug 3, 2022
86b25bd
set defaults METH and params
albertmink Aug 3, 2022
44ebfda
rename UT class
albertmink Aug 3, 2022
375e9dd
test driven starts here
albertmink Aug 3, 2022
474a919
do language
albertmink Aug 3, 2022
7bb261b
abapLint findings
albertmink Aug 3, 2022
4bde352
wip: clas has been renamed
albertmink Aug 4, 2022
a93c8b5
downport, temporary workaround, if_adt_lock_handle (#5706)
larshp Aug 4, 2022
978b8f7
[AFF] More detailed error msg (#5709)
albertmink Aug 4, 2022
8e3a88b
add second UT
albertmink Aug 4, 2022
dc60a12
impl initial values -> JSON defaults
albertmink Aug 4, 2022
4b597b7
WIP: towards enums
albertmink Aug 4, 2022
7dfbcd4
WIP: abap langu
albertmink Aug 4, 2022
9a389d2
fix category entry when converting
albertmink Aug 4, 2022
56ee2e0
add data to UT
albertmink Aug 4, 2022
737055e
set clsname outside the aff metadata handler
albertmink Aug 5, 2022
d7a0969
default handling for ABAP langu version
albertmink Aug 5, 2022
177d3cd
wip: UT expected values
albertmink Aug 5, 2022
350f995
fix: IF statement
albertmink Aug 5, 2022
ddde1ba
Prettier
albertmink Aug 5, 2022
5f5f442
Improve aff to abapgit type conversion
albertmink Aug 6, 2022
876a7f3
Fixed linter bugs and deserialize bug
marcushoepfner Aug 9, 2022
6393cd7
fix linter
marcushoepfner Aug 9, 2022
6a1e92c
Merge branch 'main' into minka/deserialize-aff-metadata
marcushoepfner Aug 9, 2022
c7a22f2
removed comments
marcushoepfner Aug 9, 2022
33b16d8
renamed methods
marcushoepfner Aug 10, 2022
f003732
Merge branch 'main' into minka/deserialize-aff-metadata
marcushoepfner Aug 10, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion abaplint.json
Expand Up @@ -152,6 +152,7 @@
"^cl_srvd_wb_object_data$", "^cx_aff_", "^cl_aff_", "^if_aff_",
"^cl_wb_object_operator_factory$",
"^cl_aunit_assert$",
"^if_adt_lock_handle$",
"^cx_wb_object_operation_error$",
"^if_srvd_types$", "^xubname$",
"^if_wb_adt_plugin_resource_co$",
Expand Down Expand Up @@ -238,7 +239,7 @@
"colon_missing_space": true,
"commented_code": {
"allowIncludeInFugr": false,
"exclude": ["otgr"]
"exclude": ["otgr", "intf"]
},
"constructor_visibility_public": true,
"contains_tab": true,
Expand Down
125 changes: 124 additions & 1 deletion src/objects/aff/zcl_abapgit_json_handler.clas.abap
Expand Up @@ -41,9 +41,12 @@ CLASS zcl_abapgit_json_handler DEFINITION
"! the implementing class
"!
"! @parameter iv_content | xstring to be deserialized
"! @parameter iv_defaults | path-value pairs that apply if value is initial
"! @parameter ev_data | data of the xstring
METHODS deserialize
IMPORTING iv_content TYPE xstring
iv_defaults TYPE ty_skip_paths
iv_enum_mappings TYPE ty_enum_mappings
EXPORTING ev_data TYPE data
RAISING cx_static_check.

Expand All @@ -62,7 +65,24 @@ CLASS zcl_abapgit_json_handler DEFINITION
RAISING zcx_abapgit_ajson_error,
set_abap_language_version
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error.
RAISING zcx_abapgit_ajson_error,
"! Get the enum mapping from object handler, as other enums as well
set_abap_language_version_des
marcushoepfner marked this conversation as resolved.
Show resolved Hide resolved
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
"! For deserialization
set_original_language_deser
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
"! For deserialization
set_defaults
IMPORTING it_defaults TYPE ty_skip_paths
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
set_custom_enum_deserialize
IMPORTING it_enum_mappings TYPE ty_enum_mappings
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error.

ENDCLASS.

Expand All @@ -84,6 +104,14 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
lo_ajson = zcl_abapgit_ajson=>parse( iv_json = lv_json
ii_custom_mapping = lo_mapping ).


set_original_language_deser( CHANGING co_ajson = lo_ajson ).
set_defaults( EXPORTING it_defaults = iv_defaults
CHANGING co_ajson = lo_ajson ).
set_abap_language_version_des( CHANGING co_ajson = lo_ajson ).
set_custom_enum_deserialize( EXPORTING it_enum_mappings = iv_enum_mappings
CHANGING co_ajson = lo_ajson ).

lo_ajson->zif_abapgit_ajson~to_abap( IMPORTING ev_container = ev_data ).

ENDMETHOD.
Expand Down Expand Up @@ -174,6 +202,25 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
iv_val = lv_enum_json ).
ENDMETHOD.

METHOD set_abap_language_version_des.
DATA:
lv_enum_abap TYPE string,
lv_enum_json TYPE string.


lv_enum_json = co_ajson->get_string( '/header/abapLanguageVersion' ).
IF lv_enum_json = 'standard'.
lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version_src-standard.
ELSEIF lv_enum_json = 'cloudDevelopment'.
lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-cloud_development.
ELSEIF lv_enum_json = 'keyUser'.
lv_enum_abap = zif_abapgit_aff_types_v1=>co_abap_language_version-key_user.
ENDIF.

co_ajson->set_string( iv_path = '/header/abapLanguageVersion'
iv_val = lv_enum_abap ).
ENDMETHOD.

METHOD set_custom_enum.
DATA:
lv_enum_abap TYPE string,
Expand All @@ -191,4 +238,80 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
ENDLOOP.
ENDMETHOD.


METHOD set_custom_enum_deserialize.
DATA:
lv_enum_json TYPE string,
ls_enum_mapping TYPE ty_enum_mapping,
ls_mapping TYPE ty_json_abap_mapping.


LOOP AT it_enum_mappings INTO ls_enum_mapping.
lv_enum_json = co_ajson->get_string( ls_enum_mapping-path ).
READ TABLE ls_enum_mapping-mappings WITH KEY json = lv_enum_json INTO ls_mapping.
IF sy-subrc = 0.
co_ajson->set_string( iv_path = ls_enum_mapping-path
iv_val = ls_mapping-abap ).
ENDIF.
ENDLOOP.
ENDMETHOD.


METHOD set_defaults.
DATA:
lv_enum_json TYPE string,
ls_default TYPE ty_path_value_pair.


LOOP AT it_defaults INTO ls_default.
lv_enum_json = co_ajson->get_string( ls_default-path ).
IF lv_enum_json = ``.
co_ajson->set_string( iv_path = ls_default-path
iv_val = ls_default-value ).
ENDIF.
ENDLOOP.
ENDMETHOD.

METHOD set_original_language_deser.
DATA:
lv_iso_language TYPE i18_a_langiso2,
lv_original_language TYPE sy-langu.


lv_iso_language = co_ajson->get_string( '/header/originalLanguage' ).

cl_i18n_languages=>locale_to_sap1(
EXPORTING
iv_localename = lv_iso_language
iv_consider_inactive = abap_true
IMPORTING
ev_lang_sap1 = lv_original_language
EXCEPTIONS
no_assignment = 1
OTHERS = 2 ).
IF sy-subrc <> 0.
FIND REGEX `[A-Z]{2}` IN lv_iso_language.
IF sy-subrc = 0.
"Fallback try to convert from SAP language
cl_i18n_languages=>sap2_to_sap1(
EXPORTING
im_lang_sap2 = lv_iso_language
RECEIVING
re_lang_sap1 = lv_original_language
EXCEPTIONS
no_assignment = 1
no_representation = 2
OTHERS = 3 ).
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_abapgit_ajson_error.
ENDIF.
ELSE.
RAISE EXCEPTION TYPE zcx_abapgit_ajson_error.
ENDIF.
ENDIF.

co_ajson->set_string( iv_path = '/header/originalLanguage'
iv_val = lv_original_language ).
ENDMETHOD.

ENDCLASS.
48 changes: 31 additions & 17 deletions src/objects/aff/zcl_abapgit_object_common_aff.clas.abap
Expand Up @@ -80,14 +80,15 @@ CLASS ZCL_ABAPGIT_OBJECT_COMMON_AFF IMPLEMENTATION.

LOOP AT <ls_messages> ASSIGNING <ls_message>.
ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <ls_message> TO <ls_msg>.
CHECK <ls_msg>-msgty = 'E'.
zcx_abapgit_exception=>raise_t100(
iv_msgid = <ls_msg>-msgid
iv_msgno = <ls_msg>-msgno
iv_msgv1 = <ls_msg>-msgv1
iv_msgv2 = <ls_msg>-msgv2
iv_msgv3 = <ls_msg>-msgv3
iv_msgv4 = <ls_msg>-msgv4 ).
IF <ls_msg>-msgty = 'E'.
zcx_abapgit_exception=>raise_t100(
iv_msgid = <ls_msg>-msgid
iv_msgno = <ls_msg>-msgno
iv_msgv1 = <ls_msg>-msgv1
iv_msgv2 = <ls_msg>-msgv2
iv_msgv3 = <ls_msg>-msgv3
iv_msgv4 = <ls_msg>-msgv4 ).
ENDIF.
ENDLOOP.

CALL FUNCTION 'TR_TADIR_INTERFACE'
Expand Down Expand Up @@ -138,7 +139,8 @@ CLASS ZCL_ABAPGIT_OBJECT_COMMON_AFF IMPLEMENTATION.
<ls_messages> TYPE ANY TABLE,
<ls_message> TYPE any,
<ls_text> TYPE any,
<ls_type> TYPE any.
<ls_type> TYPE any,
<ls_msg> TYPE symsg.

lv_json_as_xstring = zif_abapgit_object~mo_files->read_raw( iv_ext = 'json' ).

Expand Down Expand Up @@ -218,12 +220,23 @@ CLASS ZCL_ABAPGIT_OBJECT_COMMON_AFF IMPLEMENTATION.
messages = <ls_messages>.

LOOP AT <ls_messages> ASSIGNING <ls_message>.
ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <ls_message> TO <ls_msg>.
ASSIGN COMPONENT 'TEXT' OF STRUCTURE <ls_message> TO <ls_text>.
ASSIGN COMPONENT 'TYPE' OF STRUCTURE <ls_message> TO <ls_type>.
ii_log->add(
iv_msg = <ls_text>
iv_type = <ls_type>
is_item = ms_item ).

IF <ls_msg>-msgty = 'E'.
zcx_abapgit_exception=>raise_t100(
iv_msgid = <ls_msg>-msgid
iv_msgno = <ls_msg>-msgno
iv_msgv1 = <ls_msg>-msgv1
iv_msgv2 = <ls_msg>-msgv2
iv_msgv3 = <ls_msg>-msgv3
iv_msgv4 = <ls_msg>-msgv4 ).
ENDIF.
ENDLOOP.

tadir_insert( ms_item-devclass ).
Expand Down Expand Up @@ -400,14 +413,15 @@ CLASS ZCL_ABAPGIT_OBJECT_COMMON_AFF IMPLEMENTATION.

LOOP AT <ls_messages> ASSIGNING <ls_message>.
ASSIGN COMPONENT 'MESSAGE' OF STRUCTURE <ls_message> TO <ls_msg>.
CHECK <ls_msg>-msgty = 'E'.
zcx_abapgit_exception=>raise_t100(
iv_msgid = <ls_msg>-msgid
iv_msgno = <ls_msg>-msgno
iv_msgv1 = <ls_msg>-msgv1
iv_msgv2 = <ls_msg>-msgv2
iv_msgv3 = <ls_msg>-msgv3
iv_msgv4 = <ls_msg>-msgv4 ).
IF <ls_msg>-msgty = 'E'.
zcx_abapgit_exception=>raise_t100(
iv_msgid = <ls_msg>-msgid
iv_msgno = <ls_msg>-msgno
iv_msgv1 = <ls_msg>-msgv1
iv_msgv2 = <ls_msg>-msgv2
iv_msgv3 = <ls_msg>-msgv3
iv_msgv4 = <ls_msg>-msgv4 ).
ENDIF.
ENDLOOP.

CALL METHOD lo_files_container->('IF_AFF_FILES_CONTAINER~GET_FILE')
Expand Down
8 changes: 8 additions & 0 deletions src/objects/aff/zif_abapgit_aff_type_mapping.intf.abap
@@ -1,6 +1,14 @@
INTERFACE zif_abapgit_aff_type_mapping
PUBLIC .
METHODS:
"! Convert from AFF to abapGit data
"!
"! @parameter iv_data | ABAP data as AFF type
"! @parameter es_data | ABAP data as abapGit type
to_abapgit
IMPORTING iv_data TYPE data
EXPORTING es_data TYPE data,

"! Converts to AFF specific meta data
"!
"! @parameter iv_data | (meta-)data of the object
Expand Down
12 changes: 10 additions & 2 deletions src/objects/zcl_abapgit_object_intf.clas.abap
Expand Up @@ -309,7 +309,7 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.

" HERE: switch with feature flag for XML or JSON file format
IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
lv_serialized_data = lcl_aff_serialize_metadata=>serialize( ls_intf ).
lv_serialized_data = lcl_aff_metadata_handler=>serialize( ls_intf ).
zif_abapgit_object~mo_files->add_raw( iv_ext = 'json'
iv_data = lv_serialized_data ).

Expand Down Expand Up @@ -386,10 +386,18 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.
METHOD zif_abapgit_object~deserialize.
DATA: lt_source TYPE rswsourcet,
ls_clskey TYPE seoclskey,
lv_json_data TYPE xstring,
ls_intf TYPE ty_intf.

IF iv_step = zif_abapgit_object=>gc_step_id-abap.
ls_intf = read_xml( io_xml ).
" HERE: switch with feature flag between XML and JSON file format
IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
lv_json_data = zif_abapgit_object~mo_files->read_raw( iv_ext = 'json' ).
ls_intf = lcl_aff_metadata_handler=>deserialize( lv_json_data ).
ls_intf-vseointerf-clsname = ms_item-obj_name.
ELSE.
ls_intf = read_xml( io_xml ).
ENDIF.

IF ls_intf-vseointerf-clsproxy = abap_true.
" Proxy interfaces are managed via SPRX
Expand Down