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 <larshp@hotmail.com>
This commit is contained in:
Jens Maier 2020-06-12 18:05:52 +02:00 committed by GitHub
parent 91f25304ce
commit ac701157f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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.
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.