From 236ec45dcd0275bebf63095319247f18e5d17010 Mon Sep 17 00:00:00 2001 From: Lars Hvam Date: Mon, 28 Dec 2020 13:29:21 +0100 Subject: [PATCH] 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 --- src/data/package.devc.xml | 10 ++ src/data/zcl_abapgit_data_config.clas.abap | 94 ++++++++++++++ src/data/zcl_abapgit_data_config.clas.xml | 16 +++ .../zcl_abapgit_data_deserializer.clas.abap | 22 ++++ .../zcl_abapgit_data_deserializer.clas.xml | 16 +++ src/data/zcl_abapgit_data_factory.clas.abap | 46 +++++++ src/data/zcl_abapgit_data_factory.clas.xml | 16 +++ src/data/zcl_abapgit_data_injector.clas.abap | 30 +++++ src/data/zcl_abapgit_data_injector.clas.xml | 16 +++ .../zcl_abapgit_data_serializer.clas.abap | 119 ++++++++++++++++++ ...pgit_data_serializer.clas.testclasses.abap | 40 ++++++ src/data/zcl_abapgit_data_serializer.clas.xml | 17 +++ src/data/zif_abapgit_data_config.intf.abap | 59 +++++++++ src/data/zif_abapgit_data_config.intf.xml | 15 +++ .../zif_abapgit_data_deserializer.intf.abap | 9 ++ .../zif_abapgit_data_deserializer.intf.xml | 15 +++ .../zif_abapgit_data_serializer.intf.abap | 12 ++ src/data/zif_abapgit_data_serializer.intf.xml | 15 +++ 18 files changed, 567 insertions(+) create mode 100644 src/data/package.devc.xml create mode 100644 src/data/zcl_abapgit_data_config.clas.abap create mode 100644 src/data/zcl_abapgit_data_config.clas.xml create mode 100644 src/data/zcl_abapgit_data_deserializer.clas.abap create mode 100644 src/data/zcl_abapgit_data_deserializer.clas.xml create mode 100644 src/data/zcl_abapgit_data_factory.clas.abap create mode 100644 src/data/zcl_abapgit_data_factory.clas.xml create mode 100644 src/data/zcl_abapgit_data_injector.clas.abap create mode 100644 src/data/zcl_abapgit_data_injector.clas.xml create mode 100644 src/data/zcl_abapgit_data_serializer.clas.abap create mode 100644 src/data/zcl_abapgit_data_serializer.clas.testclasses.abap create mode 100644 src/data/zcl_abapgit_data_serializer.clas.xml create mode 100644 src/data/zif_abapgit_data_config.intf.abap create mode 100644 src/data/zif_abapgit_data_config.intf.xml create mode 100644 src/data/zif_abapgit_data_deserializer.intf.abap create mode 100644 src/data/zif_abapgit_data_deserializer.intf.xml create mode 100644 src/data/zif_abapgit_data_serializer.intf.abap create mode 100644 src/data/zif_abapgit_data_serializer.intf.xml diff --git a/src/data/package.devc.xml b/src/data/package.devc.xml new file mode 100644 index 000000000..535a7d346 --- /dev/null +++ b/src/data/package.devc.xml @@ -0,0 +1,10 @@ + + + + + + abapGit - Data + + + + diff --git a/src/data/zcl_abapgit_data_config.clas.abap b/src/data/zcl_abapgit_data_config.clas.abap new file mode 100644 index 000000000..fab721525 --- /dev/null +++ b/src/data/zcl_abapgit_data_config.clas.abap @@ -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. diff --git a/src/data/zcl_abapgit_data_config.clas.xml b/src/data/zcl_abapgit_data_config.clas.xml new file mode 100644 index 000000000..845ce09c4 --- /dev/null +++ b/src/data/zcl_abapgit_data_config.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_DATA_CONFIG + E + abapGit - Data Config + 1 + X + X + X + + + + diff --git a/src/data/zcl_abapgit_data_deserializer.clas.abap b/src/data/zcl_abapgit_data_deserializer.clas.abap new file mode 100644 index 000000000..54096542b --- /dev/null +++ b/src/data/zcl_abapgit_data_deserializer.clas.abap @@ -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. diff --git a/src/data/zcl_abapgit_data_deserializer.clas.xml b/src/data/zcl_abapgit_data_deserializer.clas.xml new file mode 100644 index 000000000..457196f85 --- /dev/null +++ b/src/data/zcl_abapgit_data_deserializer.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_DATA_DESERIALIZER + E + abapGit - Data deserializer + 1 + X + X + X + + + + diff --git a/src/data/zcl_abapgit_data_factory.clas.abap b/src/data/zcl_abapgit_data_factory.clas.abap new file mode 100644 index 000000000..4fb70ccf3 --- /dev/null +++ b/src/data/zcl_abapgit_data_factory.clas.abap @@ -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. diff --git a/src/data/zcl_abapgit_data_factory.clas.xml b/src/data/zcl_abapgit_data_factory.clas.xml new file mode 100644 index 000000000..44ef2ade2 --- /dev/null +++ b/src/data/zcl_abapgit_data_factory.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_DATA_FACTORY + E + abapGit - Data factory + 1 + X + X + X + + + + diff --git a/src/data/zcl_abapgit_data_injector.clas.abap b/src/data/zcl_abapgit_data_injector.clas.abap new file mode 100644 index 000000000..b8ea13980 --- /dev/null +++ b/src/data/zcl_abapgit_data_injector.clas.abap @@ -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. diff --git a/src/data/zcl_abapgit_data_injector.clas.xml b/src/data/zcl_abapgit_data_injector.clas.xml new file mode 100644 index 000000000..fb600490f --- /dev/null +++ b/src/data/zcl_abapgit_data_injector.clas.xml @@ -0,0 +1,16 @@ + + + + + + ZCL_ABAPGIT_DATA_INJECTOR + E + abapGit - Data injector + 1 + X + X + X + + + + diff --git a/src/data/zcl_abapgit_data_serializer.clas.abap b/src/data/zcl_abapgit_data_serializer.clas.abap new file mode 100644 index 000000000..0d68b1b82 --- /dev/null +++ b/src/data/zcl_abapgit_data_serializer.clas.abap @@ -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 TYPE ANY TABLE. + FIELD-SYMBOLS TYPE any. + + + ASSIGN ir_data->* TO . + LOOP AT ASSIGNING . + cl_abap_container_utilities=>fill_container_c( + EXPORTING + im_value = + 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: TYPE ANY TABLE. + + rr_data = build_table_itab( iv_name ). + ASSIGN rr_data->* TO . + + LOOP AT it_where INTO lv_where. + SELECT * FROM (iv_name) INTO TABLE WHERE (lv_where). + ENDLOOP. + IF lines( it_where ) = 0. + SELECT * FROM (iv_name) INTO TABLE . + 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. diff --git a/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap b/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap new file mode 100644 index 000000000..cd161d465 --- /dev/null +++ b/src/data/zcl_abapgit_data_serializer.clas.testclasses.abap @@ -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. diff --git a/src/data/zcl_abapgit_data_serializer.clas.xml b/src/data/zcl_abapgit_data_serializer.clas.xml new file mode 100644 index 000000000..bb3294a15 --- /dev/null +++ b/src/data/zcl_abapgit_data_serializer.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_DATA_SERIALIZER + E + abapGit - Data Serializer + 1 + X + X + X + X + + + + diff --git a/src/data/zif_abapgit_data_config.intf.abap b/src/data/zif_abapgit_data_config.intf.abap new file mode 100644 index 000000000..fbc6d9f4c --- /dev/null +++ b/src/data/zif_abapgit_data_config.intf.abap @@ -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. diff --git a/src/data/zif_abapgit_data_config.intf.xml b/src/data/zif_abapgit_data_config.intf.xml new file mode 100644 index 000000000..12fc45be9 --- /dev/null +++ b/src/data/zif_abapgit_data_config.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_DATA_CONFIG + E + abapGit - Data config + 2 + 1 + X + + + + diff --git a/src/data/zif_abapgit_data_deserializer.intf.abap b/src/data/zif_abapgit_data_deserializer.intf.abap new file mode 100644 index 000000000..8ca8a949c --- /dev/null +++ b/src/data/zif_abapgit_data_deserializer.intf.abap @@ -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. diff --git a/src/data/zif_abapgit_data_deserializer.intf.xml b/src/data/zif_abapgit_data_deserializer.intf.xml new file mode 100644 index 000000000..e91e71f1f --- /dev/null +++ b/src/data/zif_abapgit_data_deserializer.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_DATA_DESERIALIZER + E + abapGit - Data deserializer + 2 + 1 + X + + + + diff --git a/src/data/zif_abapgit_data_serializer.intf.abap b/src/data/zif_abapgit_data_serializer.intf.abap new file mode 100644 index 000000000..467da2bee --- /dev/null +++ b/src/data/zif_abapgit_data_serializer.intf.abap @@ -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. diff --git a/src/data/zif_abapgit_data_serializer.intf.xml b/src/data/zif_abapgit_data_serializer.intf.xml new file mode 100644 index 000000000..e29e518f6 --- /dev/null +++ b/src/data/zif_abapgit_data_serializer.intf.xml @@ -0,0 +1,15 @@ + + + + + + ZIF_ABAPGIT_DATA_SERIALIZER + E + abapGit - Data serializer + 2 + 1 + X + + + +