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. CLASS zcl_abapgit_object_dsys DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL.
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES zif_abapgit_object. INTERFACES zif_abapgit_object.
ALIASES mo_files FOR zif_abapgit_object~mo_files.
METHODS constructor METHODS constructor
IMPORTING IMPORTING
@ -10,13 +10,13 @@ CLASS zcl_abapgit_object_dsys DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
iv_language TYPE spras. iv_language TYPE spras.
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
CONSTANTS: c_typ TYPE dokhl-typ VALUE 'E', CONSTANTS: c_typ TYPE dokhl-typ VALUE 'E',
c_version TYPE dokhl-dokversion VALUE '0001', c_id TYPE dokhl-id VALUE 'HY'.
c_id TYPE dokhl-id VALUE 'HY',
c_dokclas TYPE doku_class VALUE 'SIMG'. DATA: mv_doc_object TYPE sobj_name.
DATA: mv_object TYPE dokhl-object,
mv_dokname TYPE doku_obj.
TYPES: BEGIN OF ty_data, TYPES: BEGIN OF ty_data,
doctitle TYPE dsyst-doktitle, doctitle TYPE dsyst-doktitle,
@ -24,87 +24,81 @@ CLASS zcl_abapgit_object_dsys DEFINITION PUBLIC INHERITING FROM zcl_abapgit_obje
lines TYPE tline_tab, lines TYPE tline_tab,
END OF ty_data. END OF ty_data.
METHODS: read METHODS deserialize_dsys
RETURNING VALUE(rs_data) TYPE ty_data. 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. ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION. CLASS zcl_abapgit_object_dsys IMPLEMENTATION.
METHOD constructor. METHOD constructor.
DATA: lv_prefix TYPE namespace,
lv_bare_name TYPE progname.
super->constructor( is_item = is_item super->constructor( is_item = is_item
iv_language = iv_language ). iv_language = iv_language ).
mv_object = ms_item-obj_name. CALL FUNCTION 'RS_NAME_SPLIT_NAMESPACE'
mv_dokname = mv_object+4(*).
ENDMETHOD.
METHOD read.
CALL FUNCTION 'DOCU_READ'
EXPORTING EXPORTING
id = c_id name_with_namespace = ms_item-obj_name
langu = mv_language
object = mv_object
typ = c_typ
version = c_version
IMPORTING IMPORTING
doktitle = rs_data-doctitle namespace = lv_prefix
head = rs_data-head name_without_namespace = lv_bare_name.
TABLES
line = rs_data-lines. mv_doc_object = |{ lv_bare_name+0(4) }{ lv_prefix }{ lv_bare_name+4(*) }|.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_object~changed_by. METHOD zif_abapgit_object~changed_by.
rv_user = read( )-head-tdluser.
IF rv_user IS INITIAL. rv_user = zcl_abapgit_factory=>get_longtexts( )->changed_by(
rv_user = c_user_unknown. iv_object_name = mv_doc_object
ENDIF. iv_longtext_id = c_id ).
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_object~delete. METHOD zif_abapgit_object~delete.
CALL FUNCTION 'DOCU_DEL' zcl_abapgit_factory=>get_longtexts( )->delete(
EXPORTING iv_object_name = mv_doc_object
id = c_id iv_longtext_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.
ENDMETHOD. ENDMETHOD.
METHOD zif_abapgit_object~deserialize. 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' ls_metadata = io_xml->get_metadata( ).
CHANGING cg_data = ls_data ).
CALL FUNCTION 'DOCU_UPDATE' CASE ls_metadata-version.
EXPORTING
head = ls_data-head WHEN 'v1.0.0'.
state = 'A' deserialize_dsys( io_xml ).
typ = c_typ
version = c_version WHEN 'v2.0.0'.
TABLES zcl_abapgit_factory=>get_longtexts( )->deserialize(
line = ls_data-lines. io_xml = io_xml
iv_master_language = mv_language ).
WHEN OTHERS.
zcx_abapgit_exception=>raise( 'unsupported DSYS version' ).
ENDCASE.
tadir_insert( iv_package ). tadir_insert( iv_package ).
@ -113,11 +107,13 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION.
METHOD zif_abapgit_object~exists. METHOD zif_abapgit_object~exists.
SELECT SINGLE object FROM dokil INTO mv_object DATA: lv_count TYPE i.
WHERE id = c_id
AND object = mv_object. "#EC CI_GENBUFF
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. ENDMETHOD.
@ -135,6 +131,7 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION.
METHOD zif_abapgit_object~get_metadata. METHOD zif_abapgit_object~get_metadata.
rs_metadata = get_metadata( ). rs_metadata = get_metadata( ).
rs_metadata-delete_tadir = abap_true. rs_metadata-delete_tadir = abap_true.
rs_metadata-version = 'v2.0.0'.
ENDMETHOD. ENDMETHOD.
@ -150,10 +147,11 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION.
METHOD zif_abapgit_object~jump. METHOD zif_abapgit_object~jump.
CALL FUNCTION 'DSYS_SHOW' CALL FUNCTION 'DSYS_EDIT'
EXPORTING EXPORTING
dokclass = c_dokclas dokclass = mv_doc_object+0(4)
dokname = mv_dokname dokname = mv_doc_object+4(*)
doklangu = get_master_lang( )
EXCEPTIONS EXCEPTIONS
class_unknown = 1 class_unknown = 1
object_not_found = 2 object_not_found = 2
@ -168,21 +166,61 @@ CLASS ZCL_ABAPGIT_OBJECT_DSYS IMPLEMENTATION.
METHOD zif_abapgit_object~serialize. METHOD zif_abapgit_object~serialize.
DATA: ls_data TYPE ty_data. io_xml->i18n_params( abap_false ).
ls_data = read( ). zcl_abapgit_factory=>get_longtexts( )->serialize(
iv_object_name = mv_doc_object
CLEAR: ls_data-head-tdfuser, iv_longtext_id = c_id
ls_data-head-tdfreles, io_xml = io_xml ).
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 ).
ENDMETHOD. 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. ENDCLASS.