abapGit/src/data/zcl_abapgit_data_config.clas.abap
Marc Bernard 1104c88e48
Data deserialize (#4654)
* Data deserialize

Continuing on #3441 

- Fixes issue with namespaced tables 
- Adds deserialize of table content during pull but does NOT persist changes to database

`zcl_abapgit_repo->deserialize` now contains the following call to deserialize "data":

```abap
    zcl_abapgit_data_factory=>get_deserializer( )->deserialize(
      ii_config  = get_data_config( )
      it_files   = get_files_remote( )
      iv_persist = abap_false ). "<<no persisting, just test for now
```

Closes #4650

* Fixes and max record check

* Get result preview

* Split deser/actualize

Co-authored-by: Lars Hvam <larshp@hotmail.com>
2021-03-23 06:40:09 +01:00

127 lines
3.3 KiB
ABAP

CLASS zcl_abapgit_data_config DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_data_config .
PROTECTED SECTION.
PRIVATE SECTION.
DATA mt_config TYPE zif_abapgit_data_config=>ty_config_tt .
METHODS dump
IMPORTING
!is_config TYPE zif_abapgit_data_config=>ty_config
RETURNING
VALUE(rv_json) TYPE string
RAISING
zcx_abapgit_exception .
ENDCLASS.
CLASS zcl_abapgit_data_config IMPLEMENTATION.
METHOD dump.
DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
TRY.
lo_ajson = zcl_abapgit_ajson=>create_empty( ).
lo_ajson->zif_abapgit_ajson_writer~set(
iv_path = '/'
iv_val = is_config ).
rv_json = zcl_abapgit_convert=>string_to_xstring_utf8( lo_ajson->stringify( 2 ) ).
CATCH zcx_abapgit_ajson_error INTO lx_ajson.
zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
ENDTRY.
ENDMETHOD.
METHOD zif_abapgit_data_config~add_config.
ASSERT is_config-type IS NOT INITIAL.
ASSERT is_config-name IS NOT INITIAL.
ASSERT is_config-name = to_upper( is_config-name ).
INSERT is_config INTO TABLE mt_config.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Already in table' ).
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_data_config~from_json.
DATA ls_file LIKE LINE OF it_files.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
DATA lo_ajson TYPE REF TO zcl_abapgit_ajson.
DATA lx_ajson TYPE REF TO zcx_abapgit_ajson_error.
CLEAR mt_config.
LOOP AT it_files INTO ls_file WHERE path = zif_abapgit_data_config=>c_default_path
AND filename CP |*.{ zif_abapgit_data_config=>c_config }.{ zif_abapgit_data_config=>c_default_format }|.
TRY.
lo_ajson = zcl_abapgit_ajson=>parse( zcl_abapgit_convert=>xstring_to_string_utf8( ls_file-data ) ).
lo_ajson->zif_abapgit_ajson_reader~to_abap( IMPORTING ev_container = ls_config ).
CATCH zcx_abapgit_ajson_error INTO lx_ajson.
zcx_abapgit_exception=>raise( lx_ajson->get_text( ) ).
ENDTRY.
zif_abapgit_data_config~add_config( ls_config ).
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_data_config~get_configs.
rt_configs = mt_config.
ENDMETHOD.
METHOD zif_abapgit_data_config~remove_config.
ASSERT is_config-type IS NOT INITIAL.
ASSERT is_config-name IS NOT INITIAL.
ASSERT is_config-name = to_upper( is_config-name ).
DELETE mt_config WHERE name = is_config-name AND type = is_config-type.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'Not found' ).
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_data_config~to_json.
DATA ls_config LIKE LINE OF mt_config.
DATA ls_file LIKE LINE OF rt_files.
ls_file-path = zif_abapgit_data_config=>c_default_path.
LOOP AT mt_config INTO ls_config.
ls_file-data = dump( ls_config ).
ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
ls_config-type = zif_abapgit_data_config=>c_config.
ls_file-filename = zcl_abapgit_data_utils=>build_filename( ls_config ).
APPEND ls_file TO rt_files.
ENDLOOP.
ENDMETHOD.
METHOD zif_abapgit_data_config~update_config.
zif_abapgit_data_config~remove_config( is_config ).
zif_abapgit_data_config~add_config( is_config ).
ENDMETHOD.
ENDCLASS.