very basic data serialization, standalone (#4218)

* data, wip

* scaffolding, factory and injector

* update

* upd

* upd

* update

* rename fs

* update

* line break parameters

* use shorthand hash
This commit is contained in:
Lars Hvam 2020-12-28 13:29:21 +01:00 committed by GitHub
parent e7d7723bd5
commit 236ec45dcd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 567 additions and 0 deletions

10
src/data/package.devc.xml Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DEVC" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DEVC>
<CTEXT>abapGit - Data</CTEXT>
</DEVC>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,94 @@
CLASS zcl_abapgit_data_config DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_data_config .
METHODS constructor .
PROTECTED SECTION.
PRIVATE SECTION.
DATA mv_path TYPE string .
DATA mt_config TYPE zif_abapgit_data_config=>ty_config_tt .
ENDCLASS.
CLASS ZCL_ABAPGIT_DATA_CONFIG IMPLEMENTATION.
METHOD constructor.
mv_path = zif_abapgit_data_config=>c_default_path.
ENDMETHOD.
METHOD zif_abapgit_data_config~add_config.
ASSERT NOT is_config-type IS INITIAL.
ASSERT NOT is_config-name IS INITIAL.
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.
* todo
ASSERT 0 = 1.
ENDMETHOD.
METHOD zif_abapgit_data_config~get_configs.
rt_configs = mt_config.
ENDMETHOD.
METHOD zif_abapgit_data_config~get_path.
rv_path = mv_path.
ENDMETHOD.
METHOD zif_abapgit_data_config~remove_config.
* todo, give exception if it does not exist
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~set_path.
* todo, validate format
mv_path = iv_path.
ENDMETHOD.
METHOD zif_abapgit_data_config~to_json.
* todo
ASSERT 0 = 1.
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.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_DATA_CONFIG</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data Config</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,22 @@
CLASS zcl_abapgit_data_deserializer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_data_deserializer .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_ABAPGIT_DATA_DESERIALIZER IMPLEMENTATION.
METHOD zif_abapgit_data_deserializer~deserialize.
* todo
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_DATA_DESERIALIZER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data deserializer</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,46 @@
CLASS zcl_abapgit_data_factory DEFINITION
PUBLIC
CREATE PUBLIC
GLOBAL FRIENDS zcl_abapgit_data_injector .
PUBLIC SECTION.
METHODS get_serializer
RETURNING
VALUE(ri_serializer) TYPE REF TO zif_abapgit_data_serializer .
METHODS get_deserializer
RETURNING
VALUE(ri_deserializer) TYPE REF TO zif_abapgit_data_deserializer .
PROTECTED SECTION.
PRIVATE SECTION.
CLASS-DATA gi_serializer TYPE REF TO zif_abapgit_data_serializer .
CLASS-DATA gi_deserializer TYPE REF TO zif_abapgit_data_deserializer .
ENDCLASS.
CLASS ZCL_ABAPGIT_DATA_FACTORY IMPLEMENTATION.
METHOD get_deserializer.
IF gi_deserializer IS INITIAL.
CREATE OBJECT gi_deserializer TYPE zcl_abapgit_data_deserializer.
ENDIF.
ri_deserializer = gi_deserializer.
ENDMETHOD.
METHOD get_serializer.
IF gi_serializer IS INITIAL.
CREATE OBJECT gi_serializer TYPE zcl_abapgit_data_serializer.
ENDIF.
ri_serializer = gi_serializer.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_DATA_FACTORY</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data factory</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,30 @@
CLASS zcl_abapgit_data_injector DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
METHODS set_serializer
IMPORTING
!ii_serializer TYPE REF TO zif_abapgit_data_serializer .
METHODS set_deserializer
IMPORTING
!ii_deserializer TYPE REF TO zif_abapgit_data_deserializer .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_ABAPGIT_DATA_INJECTOR IMPLEMENTATION.
METHOD set_deserializer.
zcl_abapgit_data_factory=>gi_deserializer = ii_deserializer.
ENDMETHOD.
METHOD set_serializer.
zcl_abapgit_data_factory=>gi_serializer = ii_serializer.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_DATA_INJECTOR</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data injector</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,119 @@
CLASS zcl_abapgit_data_serializer DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES zif_abapgit_data_serializer .
PROTECTED SECTION.
METHODS dump_itab
IMPORTING
!ir_data TYPE REF TO data
RETURNING
VALUE(rv_data) TYPE xstring .
METHODS build_table_itab
IMPORTING
!iv_name TYPE tadir-obj_name
RETURNING
VALUE(rr_data) TYPE REF TO data .
METHODS read_database_table
IMPORTING
!iv_name TYPE tadir-obj_name
!it_where TYPE string_table
RETURNING
VALUE(rr_data) TYPE REF TO data .
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_ABAPGIT_DATA_SERIALIZER IMPLEMENTATION.
METHOD build_table_itab.
DATA lo_structure TYPE REF TO cl_abap_structdescr.
DATA lo_table TYPE REF TO cl_abap_tabledescr.
lo_structure ?= cl_abap_structdescr=>describe_by_name( iv_name ).
* todo, also add unique key corresponding to the db table, so duplicates cannot be returned
lo_table = cl_abap_tabledescr=>create( lo_structure ).
CREATE DATA rr_data TYPE HANDLE lo_table.
ENDMETHOD.
METHOD dump_itab.
* quick and dirty, will be json instead
DATA lt_data TYPE string_table.
DATA lv_str TYPE string.
FIELD-SYMBOLS <lg_tab> TYPE ANY TABLE.
FIELD-SYMBOLS <ls_row> TYPE any.
ASSIGN ir_data->* TO <lg_tab>.
LOOP AT <lg_tab> ASSIGNING <ls_row>.
cl_abap_container_utilities=>fill_container_c(
EXPORTING
im_value = <ls_row>
IMPORTING
ex_container = lv_str ).
APPEND lv_str TO lt_data.
ENDLOOP.
rv_data = zcl_abapgit_convert=>string_to_xstring_utf8( concat_lines_of( table = lt_data
sep = |\n| ) ).
ENDMETHOD.
METHOD read_database_table.
DATA lv_where LIKE LINE OF it_where.
FIELD-SYMBOLS: <lg_tab> TYPE ANY TABLE.
rr_data = build_table_itab( iv_name ).
ASSIGN rr_data->* TO <lg_tab>.
LOOP AT it_where INTO lv_where.
SELECT * FROM (iv_name) INTO TABLE <lg_tab> WHERE (lv_where).
ENDLOOP.
IF lines( it_where ) = 0.
SELECT * FROM (iv_name) INTO TABLE <lg_tab>.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_data_serializer~serialize.
DATA lt_configs TYPE zif_abapgit_data_config=>ty_config_tt.
DATA ls_config LIKE LINE OF lt_configs.
DATA ls_file LIKE LINE OF rt_files.
DATA lr_data TYPE REF TO data.
ls_file-path = ii_config->get_path( ).
lt_configs = ii_config->get_configs( ).
LOOP AT lt_configs INTO ls_config.
ASSERT ls_config-type = zif_abapgit_data_config=>c_data_type-tabu. " todo
ASSERT NOT ls_config-name IS INITIAL.
lr_data = read_database_table(
iv_name = ls_config-name
it_where = ls_config-where ).
ls_file-filename = to_lower( |{ ls_config-name }.{ ls_config-type }.todo| ).
ls_file-data = dump_itab( lr_data ).
ls_file-sha1 = zcl_abapgit_hash=>sha1_blob( ls_file-data ).
APPEND ls_file TO rt_files.
ENDLOOP.
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,40 @@
CLASS ltcl_test DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS FINAL.
PRIVATE SECTION.
DATA mi_cut TYPE REF TO zif_abapgit_data_serializer.
DATA mi_config TYPE REF TO zif_abapgit_data_config.
METHODS:
setup,
serialize FOR TESTING RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ltcl_test IMPLEMENTATION.
METHOD setup.
CREATE OBJECT mi_cut TYPE zcl_abapgit_data_serializer.
CREATE OBJECT mi_config TYPE zcl_abapgit_data_config.
ENDMETHOD.
METHOD serialize.
DATA ls_config TYPE zif_abapgit_data_config=>ty_config.
DATA lt_files TYPE zif_abapgit_definitions=>ty_files_tt.
ls_config-type = 'TABU'.
ls_config-name = 'T000'.
APPEND |MANDT = '{ sy-mandt }'| TO ls_config-where.
mi_config->add_config( ls_config ).
lt_files = mi_cut->serialize( mi_config ).
cl_abap_unit_assert=>assert_equals(
act = lines( lt_files )
exp = 1 ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_CLAS" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOCLASS>
<CLSNAME>ZCL_ABAPGIT_DATA_SERIALIZER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data Serializer</DESCRIPT>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
<WITH_UNIT_TESTS>X</WITH_UNIT_TESTS>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,59 @@
INTERFACE zif_abapgit_data_config
PUBLIC .
TYPES:
ty_data_type TYPE c LENGTH 4 .
TYPES:
BEGIN OF ty_config,
type TYPE ty_data_type,
name TYPE tadir-obj_name,
where TYPE string_table,
END OF ty_config .
TYPES:
ty_config_tt TYPE SORTED TABLE OF ty_config WITH UNIQUE KEY type name.
CONSTANTS c_default_path TYPE string VALUE '/data/' ##NO_TEXT.
CONSTANTS:
BEGIN OF c_data_type,
tabu TYPE ty_data_type VALUE 'TABU',
vdat TYPE ty_data_type VALUE 'VDAT',
cdat TYPE ty_data_type VALUE 'CDAT',
tdat TYPE ty_data_type VALUE 'TDAT',
END OF c_data_type .
METHODS get_path
RETURNING
VALUE(rv_path) TYPE string .
METHODS set_path
IMPORTING
!iv_path TYPE string
RAISING
zcx_abapgit_exception .
METHODS from_json
IMPORTING
!it_files TYPE zif_abapgit_definitions=>ty_files_tt
RAISING
zcx_abapgit_exception .
METHODS to_json
RETURNING
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt .
METHODS add_config
IMPORTING
!is_config TYPE ty_config
RAISING
zcx_abapgit_exception .
METHODS update_config
IMPORTING
!is_config TYPE ty_config
RAISING
zcx_abapgit_exception .
METHODS remove_config
IMPORTING
!is_config TYPE ty_config
RAISING
zcx_abapgit_exception .
METHODS get_configs
RETURNING
VALUE(rt_configs) TYPE ty_config_tt .
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_DATA_CONFIG</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data config</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,9 @@
INTERFACE zif_abapgit_data_deserializer
PUBLIC .
METHODS deserialize
IMPORTING
ii_config TYPE REF TO zif_abapgit_data_config
it_files TYPE zif_abapgit_definitions=>ty_files_tt.
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_DATA_DESERIALIZER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data deserializer</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,12 @@
INTERFACE zif_abapgit_data_serializer
PUBLIC .
METHODS serialize
IMPORTING
!ii_config TYPE REF TO zif_abapgit_data_config
RETURNING
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt
RAISING
zcx_abapgit_exception .
ENDINTERFACE.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_INTF" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<VSEOINTERF>
<CLSNAME>ZIF_ABAPGIT_DATA_SERIALIZER</CLSNAME>
<LANGU>E</LANGU>
<DESCRIPT>abapGit - Data serializer</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<UNICODE>X</UNICODE>
</VSEOINTERF>
</asx:values>
</asx:abap>
</abapGit>