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 all 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
149 changes: 136 additions & 13 deletions src/objects/aff/zcl_abapgit_json_handler.clas.abap
Expand Up @@ -41,10 +41,13 @@ 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
EXPORTING ev_data TYPE data
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 @@ -53,16 +56,33 @@ CLASS zcl_abapgit_json_handler DEFINITION
PRIVATE SECTION.

METHODS:
set_original_language
map2json_original_language
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
set_custom_enum
map2json_custom_enum
IMPORTING it_enum_mappings TYPE ty_enum_mappings
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
set_abap_language_version
map2json_abap_language_version
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
"! Get the enum mapping from object handler, as other enums as well
map2abap_abap_language_version
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error,
"! For deserialization
map2abap_original_language
CHANGING co_ajson TYPE REF TO zcl_abapgit_ajson
RAISING zcx_abapgit_ajson_error.
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,
map2abap_custom_enum
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 ).


map2abap_original_language( CHANGING co_ajson = lo_ajson ).
set_defaults( EXPORTING it_defaults = iv_defaults
CHANGING co_ajson = lo_ajson ).
map2abap_abap_language_version( CHANGING co_ajson = lo_ajson ).
map2abap_custom_enum( 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 @@ -112,10 +140,10 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
iv_path = '/'
iv_val = iv_data ).

set_original_language( CHANGING co_ajson = lo_ajson ).
set_abap_language_version( CHANGING co_ajson = lo_ajson ).
set_custom_enum( EXPORTING it_enum_mappings = iv_enum_mappings
CHANGING co_ajson = lo_ajson ).
map2json_original_language( CHANGING co_ajson = lo_ajson ).
map2json_abap_language_version( CHANGING co_ajson = lo_ajson ).
map2json_custom_enum( EXPORTING it_enum_mappings = iv_enum_mappings
CHANGING co_ajson = lo_ajson ).

CREATE OBJECT lo_filter EXPORTING iv_skip_paths = iv_skip_paths.
lo_ajson_filtered = zcl_abapgit_ajson=>create_from(
Expand All @@ -132,7 +160,7 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
rv_result = zcl_abapgit_convert=>string_to_xstring_utf8( lv_json ).
ENDMETHOD.

METHOD set_original_language.
METHOD map2json_original_language.
DATA:
lv_iso_language TYPE i18_a_langiso2,
lv_original_language TYPE sy-langu.
Expand All @@ -154,7 +182,7 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
ENDIF.
ENDMETHOD.

METHOD set_abap_language_version.
METHOD map2json_abap_language_version.
DATA:
lv_enum_abap TYPE string,
lv_enum_json TYPE string.
Expand All @@ -174,7 +202,26 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
iv_val = lv_enum_json ).
ENDMETHOD.

METHOD set_custom_enum.
METHOD map2abap_abap_language_version.
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 map2json_custom_enum.
DATA:
lv_enum_abap TYPE string,
ls_enum_mapping TYPE ty_enum_mapping,
Expand All @@ -191,4 +238,80 @@ CLASS zcl_abapgit_json_handler IMPLEMENTATION.
ENDLOOP.
ENDMETHOD.


METHOD map2abap_custom_enum.
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 map2abap_original_language.
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.
10 changes: 10 additions & 0 deletions src/objects/aff/zif_abapgit_aff_type_mapping.intf.abap
@@ -1,6 +1,16 @@
INTERFACE zif_abapgit_aff_type_mapping
PUBLIC .
METHODS:
"! Convert from AFF to abapGit data
"!
"! @parameter iv_data | ABAP data as AFF type
"! @parameter iv_object_name | Name of object
"! @parameter es_data | ABAP data as abapGit type
to_abapgit
IMPORTING iv_data TYPE data
iv_object_name TYPE sobj_name
EXPORTING es_data TYPE data,

"! Converts to AFF specific meta data
"!
"! @parameter iv_data | (meta-)data of the object
Expand Down
52 changes: 40 additions & 12 deletions src/objects/zcl_abapgit_object_intf.clas.abap
Expand Up @@ -71,6 +71,10 @@ CLASS zcl_abapgit_object_intf DEFINITION PUBLIC FINAL INHERITING FROM zcl_abapgi
RETURNING VALUE(rs_intf) TYPE ty_intf
RAISING
zcx_abapgit_exception.
METHODS read_json
RETURNING VALUE(rs_intf) TYPE ty_intf
RAISING
zcx_abapgit_exception.
ENDCLASS.


Expand Down Expand Up @@ -141,19 +145,20 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.

METHOD deserialize_pre_ddic.

DATA: ls_vseointerf TYPE vseointerf,
ls_clskey TYPE seoclskey.

ls_clskey-clsname = ms_item-obj_name.
DATA: ls_intf TYPE ty_intf.

ii_xml->read( EXPORTING iv_name = 'VSEOINTERF'
CHANGING cg_data = ls_vseointerf ).
IF zcl_abapgit_persist_factory=>get_settings( )->read( )->get_experimental_features( ) = abap_true.
ls_intf = read_json( ).
ELSE.
ii_xml->read( EXPORTING iv_name = 'VSEOINTERF'
CHANGING cg_data = ls_intf-vseointerf ).
ENDIF.

mi_object_oriented_object_fct->create(
EXPORTING
iv_package = iv_package
CHANGING
cg_properties = ls_vseointerf ).
cg_properties = ls_intf-vseointerf ).

ENDMETHOD.

Expand Down Expand Up @@ -309,7 +314,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 @@ -384,12 +389,20 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.


METHOD zif_abapgit_object~deserialize.
DATA: lt_source TYPE rswsourcet,
ls_clskey TYPE seoclskey,
ls_intf TYPE ty_intf.
DATA: lt_source TYPE rswsourcet,
ls_clskey TYPE seoclskey,
lv_json_data TYPE xstring,
ls_intf_aff TYPE zif_abapgit_aff_intf_v1=>ty_main,
lo_aff_mapper TYPE REF TO zif_abapgit_aff_type_mapping,
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.
ls_intf = read_json( ).
ELSE.
ls_intf = read_xml( io_xml ).
ENDIF.

IF ls_intf-vseointerf-clsproxy = abap_true.
" Proxy interfaces are managed via SPRX
Expand Down Expand Up @@ -430,6 +443,21 @@ CLASS zcl_abapgit_object_intf IMPLEMENTATION.
ENDMETHOD.


METHOD read_json.
DATA lv_json_data TYPE xstring.
DATA ls_intf_aff TYPE zif_abapgit_aff_intf_v1=>ty_main.
DATA lo_aff_mapper TYPE REF TO zif_abapgit_aff_type_mapping.

lv_json_data = zif_abapgit_object~mo_files->read_raw( iv_ext = 'json' ).
ls_intf_aff = lcl_aff_metadata_handler=>deserialize( lv_json_data ).

CREATE OBJECT lo_aff_mapper TYPE lcl_aff_type_mapping.
lo_aff_mapper->to_abapgit( EXPORTING iv_data = ls_intf_aff
iv_object_name = ms_item-obj_name
IMPORTING es_data = rs_intf ).
ENDMETHOD.


METHOD zif_abapgit_object~exists.

DATA: ls_class_key TYPE seoclskey,
Expand Down