From ac701157f0d422f5ab822564952ed4623ecd0fbd Mon Sep 17 00:00:00 2001 From: Jens Maier Date: Fri, 12 Jun 2020 18:05:52 +0200 Subject: [PATCH] DSYS serializer overhaul (#3445) * DSYS serializer rewritten * Fixes issue #3374 when object names include a namespace. * Uses longtexts facility to serialize texts: * Supports i18n texts. * Supports text versions other than 0001. * Fix linter compliance Co-authored-by: Lars Hvam --- src/objects/zcl_abapgit_object_dsys.clas.abap | 192 +++++++++++------- 1 file changed, 115 insertions(+), 77 deletions(-) diff --git a/src/objects/zcl_abapgit_object_dsys.clas.abap b/src/objects/zcl_abapgit_object_dsys.clas.abap index a0cceae23..557fae928 100644 --- a/src/objects/zcl_abapgit_object_dsys.clas.abap +++ b/src/objects/zcl_abapgit_object_dsys.clas.abap @@ -1,8 +1,8 @@ CLASS zcl_abapgit_object_dsys DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL. PUBLIC SECTION. + INTERFACES zif_abapgit_object. - ALIASES mo_files FOR zif_abapgit_object~mo_files. METHODS constructor IMPORTING @@ -10,13 +10,13 @@ CLASS zcl_abapgit_object_dsys DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje iv_language TYPE spras. PROTECTED SECTION. + PRIVATE SECTION. - CONSTANTS: c_typ TYPE dokhl-typ VALUE 'E', - c_version TYPE dokhl-dokversion VALUE '0001', - c_id TYPE dokhl-id VALUE 'HY', - c_dokclas TYPE doku_class VALUE 'SIMG'. - DATA: mv_object TYPE dokhl-object, - mv_dokname TYPE doku_obj. + + CONSTANTS: c_typ TYPE dokhl-typ VALUE 'E', + c_id TYPE dokhl-id VALUE 'HY'. + + DATA: mv_doc_object TYPE sobj_name. TYPES: BEGIN OF ty_data, doctitle TYPE dsyst-doktitle, @@ -24,87 +24,81 @@ CLASS zcl_abapgit_object_dsys DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje lines TYPE tline_tab, END OF ty_data. - METHODS: read - RETURNING VALUE(rs_data) TYPE ty_data. + METHODS deserialize_dsys + IMPORTING + io_xml TYPE REF TO zcl_abapgit_xml_input + RAISING + zcx_abapgit_exception. + + METHODS get_master_lang + RETURNING + VALUE(rv_language) TYPE spras. ENDCLASS. -CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION. +CLASS zcl_abapgit_object_dsys IMPLEMENTATION. METHOD constructor. + DATA: lv_prefix TYPE namespace, + lv_bare_name TYPE progname. + super->constructor( is_item = is_item iv_language = iv_language ). - mv_object = ms_item-obj_name. - mv_dokname = mv_object+4(*). - - ENDMETHOD. - - - METHOD read. - - CALL FUNCTION 'DOCU_READ' + CALL FUNCTION 'RS_NAME_SPLIT_NAMESPACE' EXPORTING - id = c_id - langu = mv_language - object = mv_object - typ = c_typ - version = c_version + name_with_namespace = ms_item-obj_name IMPORTING - doktitle = rs_data-doctitle - head = rs_data-head - TABLES - line = rs_data-lines. + namespace = lv_prefix + name_without_namespace = lv_bare_name. + + mv_doc_object = |{ lv_bare_name+0(4) }{ lv_prefix }{ lv_bare_name+4(*) }|. ENDMETHOD. METHOD zif_abapgit_object~changed_by. - rv_user = read( )-head-tdluser. - IF rv_user IS INITIAL. - rv_user = c_user_unknown. - ENDIF. + + rv_user = zcl_abapgit_factory=>get_longtexts( )->changed_by( + iv_object_name = mv_doc_object + iv_longtext_id = c_id ). + ENDMETHOD. METHOD zif_abapgit_object~delete. - CALL FUNCTION 'DOCU_DEL' - EXPORTING - id = c_id - langu = mv_language - object = mv_object - typ = c_typ - EXCEPTIONS - ret_code = 1 - OTHERS = 2. - - IF sy-subrc <> 0. - zcx_abapgit_exception=>raise( 'error from DOCU_DEL' ). - ENDIF. + zcl_abapgit_factory=>get_longtexts( )->delete( + iv_object_name = mv_doc_object + iv_longtext_id = c_id ). ENDMETHOD. METHOD zif_abapgit_object~deserialize. - DATA: ls_data TYPE ty_data. + DATA: ls_metadata TYPE zif_abapgit_definitions=>ty_metadata. - io_xml->read( EXPORTING iv_name = 'DSYS' - CHANGING cg_data = ls_data ). + ls_metadata = io_xml->get_metadata( ). - CALL FUNCTION 'DOCU_UPDATE' - EXPORTING - head = ls_data-head - state = 'A' - typ = c_typ - version = c_version - TABLES - line = ls_data-lines. + CASE ls_metadata-version. + + WHEN 'v1.0.0'. + deserialize_dsys( io_xml ). + + WHEN 'v2.0.0'. + zcl_abapgit_factory=>get_longtexts( )->deserialize( + io_xml = io_xml + iv_master_language = mv_language ). + + WHEN OTHERS. + zcx_abapgit_exception=>raise( 'unsupported DSYS version' ). + + ENDCASE. tadir_insert( iv_package ). @@ -113,11 +107,13 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION. METHOD zif_abapgit_object~exists. - SELECT SINGLE object FROM dokil INTO mv_object - WHERE id = c_id - AND object = mv_object. "#EC CI_GENBUFF + DATA: lv_count TYPE i. - rv_bool = boolc( sy-subrc = 0 ). + SELECT SINGLE COUNT( * ) FROM dokil INTO lv_count + WHERE id = c_id + AND object = mv_doc_object. "#EC CI_GENBUFF + + rv_bool = boolc( lv_count > 0 ). ENDMETHOD. @@ -135,6 +131,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION. METHOD zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). rs_metadata-delete_tadir = abap_true. + rs_metadata-version = 'v2.0.0'. ENDMETHOD. @@ -150,10 +147,11 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION. METHOD zif_abapgit_object~jump. - CALL FUNCTION 'DSYS_SHOW' + CALL FUNCTION 'DSYS_EDIT' EXPORTING - dokclass = c_dokclas - dokname = mv_dokname + dokclass = mv_doc_object+0(4) + dokname = mv_doc_object+4(*) + doklangu = get_master_lang( ) EXCEPTIONS class_unknown = 1 object_not_found = 2 @@ -168,21 +166,61 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION. METHOD zif_abapgit_object~serialize. - DATA: ls_data TYPE ty_data. + io_xml->i18n_params( abap_false ). - ls_data = read( ). - - CLEAR: ls_data-head-tdfuser, - ls_data-head-tdfreles, - ls_data-head-tdfdate, - ls_data-head-tdftime, - ls_data-head-tdluser, - ls_data-head-tdlreles, - ls_data-head-tdldate, - ls_data-head-tdltime. - - io_xml->add( iv_name = 'DSYS' - ig_data = ls_data ). + zcl_abapgit_factory=>get_longtexts( )->serialize( + iv_object_name = mv_doc_object + iv_longtext_id = c_id + io_xml = io_xml ). ENDMETHOD. + + + METHOD deserialize_dsys. + + DATA: ls_data TYPE ty_data, + ls_docu_info TYPE dokil, + lv_version TYPE dokvers. + + io_xml->read( EXPORTING iv_name = 'DSYS' + CHANGING cg_data = ls_data ). + + CALL FUNCTION 'DOCU_INIT' + EXPORTING + id = c_id + langu = mv_language + object = mv_doc_object + typ = c_typ + IMPORTING + xdokil = ls_docu_info. + + lv_version = ls_docu_info-version. + + CALL FUNCTION 'DOCU_UPDATE' + EXPORTING + head = ls_data-head + state = 'A' + typ = c_typ + version = lv_version + TABLES + line = ls_data-lines. + + ENDMETHOD. + + + METHOD get_master_lang. + + DATA: lv_language TYPE spras. + + SELECT SINGLE langu FROM dokil INTO rv_language + WHERE id = c_id + AND object = mv_doc_object + AND masterlang = abap_true. + + IF sy-subrc <> 0. + rv_language = mv_language. + ENDIF. + + ENDMETHOD. + ENDCLASS.