lcl_xml to global class

This commit is contained in:
larshp 2018-01-08 15:29:36 +00:00
parent f4a319a426
commit 7ecbc07e19
32 changed files with 741 additions and 643 deletions

10
src/xml/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>XML</CTEXT>
</DEVC>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,161 @@
CLASS zcl_abapgit_xml DEFINITION
PUBLIC
ABSTRACT
CREATE PUBLIC.
PUBLIC SECTION.
METHODS:
constructor.
PROTECTED SECTION.
DATA: mi_ixml TYPE REF TO if_ixml,
mi_xml_doc TYPE REF TO if_ixml_document,
ms_metadata TYPE zif_abapgit_definitions=>ty_metadata.
CONSTANTS: c_abapgit_tag TYPE string VALUE 'abapGit' ##NO_TEXT,
c_attr_version TYPE string VALUE 'version' ##NO_TEXT,
c_attr_serializer TYPE string VALUE 'serializer' ##NO_TEXT,
c_attr_serializer_version TYPE string VALUE 'serializer_version' ##NO_TEXT.
METHODS to_xml
IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true
RETURNING VALUE(rv_xml) TYPE string.
METHODS parse
IMPORTING iv_normalize TYPE abap_bool DEFAULT abap_true
iv_xml TYPE string
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
METHODS error
IMPORTING ii_parser TYPE REF TO if_ixml_parser
RAISING zcx_abapgit_exception.
METHODS display_xml_error
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ZCL_ABAPGIT_XML IMPLEMENTATION.
METHOD constructor.
mi_ixml = cl_ixml=>create( ).
mi_xml_doc = mi_ixml->create_document( ).
ENDMETHOD. "constructor
METHOD display_xml_error.
DATA: lv_version TYPE string.
lv_version = |abapGit version: { zif_abapgit_definitions=>gc_abap_version }|.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'abapGit XML version mismatch'
txt1 = 'abapGit XML version mismatch'
txt2 = 'See http://larshp.github.io/abapGit/other-xml-mismatch.html'
txt3 = lv_version. "#EC NOTEXT
zcx_abapgit_exception=>raise( 'XML error' ).
ENDMETHOD. "display_xml_error
METHOD error.
DATA: lv_error TYPE i,
lv_txt1 TYPE string,
lv_txt2 TYPE string,
lv_txt3 TYPE string,
lv_times TYPE i,
li_error TYPE REF TO if_ixml_parse_error.
IF ii_parser->num_errors( ) <> 0.
lv_times = ii_parser->num_errors( ).
DO lv_times TIMES.
lv_error = sy-index - 1.
li_error = ii_parser->get_error( lv_error ).
lv_txt1 = li_error->get_column( ).
CONCATENATE 'Column:' lv_txt1 INTO lv_txt1. "#EC NOTEXT
lv_txt2 = li_error->get_line( ).
CONCATENATE 'Line:' lv_txt2 INTO lv_txt2. "#EC NOTEXT
lv_txt3 = li_error->get_reason( ).
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Error from XML parser' "#EC NOTEXT
txt1 = lv_txt1
txt2 = lv_txt2
txt3 = lv_txt3.
ENDDO.
ENDIF.
zcx_abapgit_exception=>raise( 'Error while parsing XML' ).
ENDMETHOD. "error
METHOD parse.
DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory,
li_istream TYPE REF TO if_ixml_istream,
li_element TYPE REF TO if_ixml_element,
li_version TYPE REF TO if_ixml_node,
li_parser TYPE REF TO if_ixml_parser.
ASSERT NOT iv_xml IS INITIAL.
li_stream_factory = mi_ixml->create_stream_factory( ).
li_istream = li_stream_factory->create_istream_string( iv_xml ).
li_parser = mi_ixml->create_parser( stream_factory = li_stream_factory
istream = li_istream
document = mi_xml_doc ).
li_parser->set_normalizing( iv_normalize ).
IF li_parser->parse( ) <> 0.
error( li_parser ).
ENDIF.
li_istream->close( ).
li_element = mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ).
li_version = li_element->if_ixml_node~get_attributes(
)->get_named_item_ns( c_attr_version ) ##no_text.
IF li_version->get_value( ) <> zif_abapgit_definitions=>gc_xml_version.
display_xml_error( ).
ENDIF.
* buffer serializer metadata. Git node will be removed lateron
ms_metadata-class = li_element->get_attribute_ns( c_attr_serializer ).
ms_metadata-version = li_element->get_attribute_ns( c_attr_serializer_version ).
ENDMETHOD. "parse
METHOD to_xml.
* will render to codepage UTF-16
DATA: li_ostream TYPE REF TO if_ixml_ostream,
li_renderer TYPE REF TO if_ixml_renderer,
li_streamfactory TYPE REF TO if_ixml_stream_factory.
li_streamfactory = mi_ixml->create_stream_factory( ).
li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ).
li_renderer = mi_ixml->create_renderer( ostream = li_ostream
document = mi_xml_doc ).
li_renderer->set_normalizing( iv_normalize ).
li_renderer->render( ).
ENDMETHOD. "to_xml
ENDCLASS.

View File

@ -0,0 +1,19 @@
<?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_XML</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>XML</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSABSTRCT>X</CLSABSTRCT>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,96 @@
class ZCL_ABAPGIT_XML_INPUT definition
public
inheriting from ZCL_ABAPGIT_XML
create public .
public section.
methods CONSTRUCTOR
importing
!IV_XML type CLIKE
raising
ZCX_ABAPGIT_EXCEPTION .
methods READ
importing
!IV_NAME type CLIKE
changing
!CG_DATA type ANY
raising
ZCX_ABAPGIT_EXCEPTION .
methods GET_RAW
returning
value(RI_RAW) type ref to IF_IXML_DOCUMENT .
* todo, add read_xml to match add_xml in lcl_xml_output
methods GET_METADATA
returning
value(RS_METADATA) type ZIF_ABAPGIT_DEFINITIONS=>TY_METADATA .
PRIVATE SECTION.
METHODS: fix_xml.
ENDCLASS.
CLASS ZCL_ABAPGIT_XML_INPUT IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
parse( iv_xml ).
fix_xml( ).
ENDMETHOD. "constructor
METHOD fix_xml.
DATA: li_git TYPE REF TO if_ixml_element,
li_abap TYPE REF TO if_ixml_node.
li_git ?= mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ).
li_abap = li_git->get_first_child( ).
mi_xml_doc->get_root( )->remove_child( li_git ).
mi_xml_doc->get_root( )->append_child( li_abap ).
ENDMETHOD. "fix_xml
METHOD get_metadata.
rs_metadata = ms_metadata.
ENDMETHOD. "get_metadata
METHOD get_raw.
ri_raw = mi_xml_doc.
ENDMETHOD. "get_raw
METHOD read.
DATA: lx_error TYPE REF TO cx_transformation_error,
lt_rtab TYPE abap_trans_resbind_tab.
FIELD-SYMBOLS: <ls_rtab> LIKE LINE OF lt_rtab.
ASSERT NOT iv_name IS INITIAL.
CLEAR cg_data. "Initialize result to avoid problems with empty values
APPEND INITIAL LINE TO lt_rtab ASSIGNING <ls_rtab>.
<ls_rtab>-name = iv_name.
GET REFERENCE OF cg_data INTO <ls_rtab>-value.
TRY.
CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML mi_xml_doc
RESULT (lt_rtab) ##no_text.
CATCH cx_transformation_error INTO lx_error.
zcx_abapgit_exception=>raise( lx_error->if_message~get_text( ) ).
ENDTRY.
ENDMETHOD. "read
ENDCLASS.

View File

@ -0,0 +1,127 @@
CLASS ltcl_xml DEFINITION FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PUBLIC SECTION.
METHODS:
up FOR TESTING
RAISING zcx_abapgit_exception,
empty FOR TESTING
RAISING zcx_abapgit_exception,
down FOR TESTING
RAISING zcx_abapgit_exception.
TYPES: BEGIN OF st_old,
foo TYPE i,
bar TYPE c LENGTH 1,
END OF st_old.
TYPES: BEGIN OF st_new,
foo TYPE i,
bar TYPE c LENGTH 1,
moo TYPE f,
END OF st_new.
ENDCLASS. "ltcl_Xml
CLASS ltcl_xml IMPLEMENTATION.
METHOD empty.
DATA: ls_old TYPE st_old,
ls_new TYPE st_new,
lv_xml TYPE string,
lo_input TYPE REF TO zcl_abapgit_xml_input,
lo_output TYPE REF TO zcl_abapgit_xml_output.
CLEAR ls_old.
CREATE OBJECT lo_output.
lo_output->add( iv_name = 'DATA'
ig_data = ls_old ).
lv_xml = lo_output->render( ).
CREATE OBJECT lo_input
EXPORTING
iv_xml = lv_xml.
lo_input->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = ls_new ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-foo
exp = ls_old-foo ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-bar
exp = ls_old-bar ).
ENDMETHOD.
METHOD up.
DATA: ls_old TYPE st_old,
ls_new TYPE st_new,
lv_xml TYPE string,
lo_input TYPE REF TO zcl_abapgit_xml_input,
lo_output TYPE REF TO zcl_abapgit_xml_output.
ls_old-foo = 2.
ls_old-bar = 'A'.
CREATE OBJECT lo_output.
lo_output->add( iv_name = 'DATA'
ig_data = ls_old ).
lv_xml = lo_output->render( ).
CREATE OBJECT lo_input
EXPORTING
iv_xml = lv_xml.
lo_input->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = ls_new ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-foo
exp = ls_old-foo ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-bar
exp = ls_old-bar ).
ENDMETHOD.
METHOD down.
DATA: ls_old TYPE st_old,
ls_new TYPE st_new,
lv_xml TYPE string,
lo_input TYPE REF TO zcl_abapgit_xml_input,
lo_output TYPE REF TO zcl_abapgit_xml_output.
ls_new-foo = 2.
ls_new-bar = 'A'.
ls_new-moo = 5.
CREATE OBJECT lo_output.
lo_output->add( iv_name = 'DATA'
ig_data = ls_new ).
lv_xml = lo_output->render( ).
CREATE OBJECT lo_input
EXPORTING
iv_xml = lv_xml.
lo_input->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = ls_old ).
cl_abap_unit_assert=>assert_equals(
act = ls_old-foo
exp = ls_new-foo ).
cl_abap_unit_assert=>assert_equals(
act = ls_old-bar
exp = ls_new-bar ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,19 @@
<?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_XML_INPUT</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>XML Input</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<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,147 @@
CLASS zcl_abapgit_xml_output DEFINITION
PUBLIC
INHERITING FROM zcl_abapgit_xml
CREATE PUBLIC .
PUBLIC SECTION.
METHODS add
IMPORTING
!iv_name TYPE clike
!ig_data TYPE any
RAISING
zcx_abapgit_exception .
METHODS set_raw
IMPORTING
!ii_raw TYPE REF TO if_ixml_element .
METHODS add_xml
IMPORTING
!iv_name TYPE clike
!ii_xml TYPE REF TO if_ixml_element .
METHODS build_asx_node
RETURNING
VALUE(ri_element) TYPE REF TO if_ixml_element .
METHODS render
IMPORTING
!iv_normalize TYPE sap_bool DEFAULT abap_true
!is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
RETURNING
VALUE(rv_xml) TYPE string .
PROTECTED SECTION.
PRIVATE SECTION.
DATA: mi_raw TYPE REF TO if_ixml_element.
ENDCLASS.
CLASS ZCL_ABAPGIT_XML_OUTPUT IMPLEMENTATION.
METHOD add.
DATA: li_node TYPE REF TO if_ixml_node,
li_doc TYPE REF TO if_ixml_document,
lt_stab TYPE abap_trans_srcbind_tab.
FIELD-SYMBOLS: <ls_stab> LIKE LINE OF lt_stab.
ASSERT NOT iv_name IS INITIAL.
IF ig_data IS INITIAL.
RETURN.
ENDIF.
APPEND INITIAL LINE TO lt_stab ASSIGNING <ls_stab>.
<ls_stab>-name = iv_name.
GET REFERENCE OF ig_data INTO <ls_stab>-value.
li_doc = cl_ixml=>create( )->create_document( ).
CALL TRANSFORMATION id
OPTIONS initial_components = 'suppress'
SOURCE (lt_stab)
RESULT XML li_doc.
li_node = mi_xml_doc->get_root( )->get_first_child( ).
IF li_node IS BOUND.
mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child(
li_doc->get_root( )->get_first_child( )->get_first_child( )->get_first_child( ) ).
ELSE.
mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ).
ENDIF.
ENDMETHOD.
METHOD add_xml.
DATA: li_element TYPE REF TO if_ixml_element.
li_element = mi_xml_doc->create_element( iv_name ).
li_element->append_child( ii_xml ).
mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( li_element ).
ENDMETHOD.
METHOD build_asx_node.
DATA: li_attr TYPE REF TO if_ixml_attribute.
ri_element = mi_xml_doc->create_element_ns(
name = 'abap'
prefix = 'asx' ).
li_attr = mi_xml_doc->create_attribute_ns( 'version' ).
li_attr->if_ixml_node~set_value( '1.0' ).
ri_element->set_attribute_node_ns( li_attr ).
li_attr = mi_xml_doc->create_attribute_ns(
name = 'asx'
prefix = 'xmlns' ).
li_attr->if_ixml_node~set_value( 'http://www.sap.com/abapxml' ).
ri_element->set_attribute_node_ns( li_attr ).
ENDMETHOD.
METHOD render.
DATA: li_git TYPE REF TO if_ixml_element,
li_abap TYPE REF TO if_ixml_element.
IF mi_raw IS INITIAL.
li_abap ?= mi_xml_doc->get_root( )->get_first_child( ).
mi_xml_doc->get_root( )->remove_child( li_abap ).
IF li_abap IS INITIAL.
li_abap = build_asx_node( ).
ENDIF.
ELSE.
li_abap = mi_raw.
ENDIF.
li_git = mi_xml_doc->create_element( c_abapgit_tag ).
li_git->set_attribute( name = c_attr_version value = zif_abapgit_definitions=>gc_xml_version ).
IF NOT is_metadata IS INITIAL.
li_git->set_attribute( name = c_attr_serializer
value = is_metadata-class ).
li_git->set_attribute( name = c_attr_serializer_version
value = is_metadata-version ).
ENDIF.
li_git->append_child( li_abap ).
mi_xml_doc->get_root( )->append_child( li_git ).
rv_xml = to_xml( iv_normalize ).
ENDMETHOD. "render
METHOD set_raw.
mi_raw = ii_raw.
ENDMETHOD. "set_raw
ENDCLASS.

View File

@ -0,0 +1,18 @@
<?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_XML_OUTPUT</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>XML Output</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,63 @@
CLASS zcl_abapgit_xml_pretty DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
CLASS-METHODS: print
IMPORTING iv_xml TYPE string
iv_ignore_errors TYPE abap_bool DEFAULT abap_true
iv_unpretty TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_xml) TYPE string
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS ZCL_ABAPGIT_XML_PRETTY IMPLEMENTATION.
METHOD print.
DATA: li_ixml TYPE REF TO if_ixml,
li_xml_doc TYPE REF TO if_ixml_document,
li_stream_factory TYPE REF TO if_ixml_stream_factory,
li_istream TYPE REF TO if_ixml_istream,
li_parser TYPE REF TO if_ixml_parser,
li_ostream TYPE REF TO if_ixml_ostream,
li_renderer TYPE REF TO if_ixml_renderer.
ASSERT NOT iv_xml IS INITIAL.
li_ixml = cl_ixml=>create( ).
li_xml_doc = li_ixml->create_document( ).
li_stream_factory = li_ixml->create_stream_factory( ).
li_istream = li_stream_factory->create_istream_string( iv_xml ).
li_parser = li_ixml->create_parser( stream_factory = li_stream_factory
istream = li_istream
document = li_xml_doc ).
li_parser->set_normalizing( abap_true ).
IF li_parser->parse( ) <> 0.
IF iv_ignore_errors = abap_true.
rv_xml = iv_xml.
RETURN.
ELSE.
zcx_abapgit_exception=>raise( 'error parsing xml' ).
ENDIF.
ENDIF.
li_istream->close( ).
li_ostream = li_stream_factory->create_ostream_cstring( rv_xml ).
li_renderer = li_ixml->create_renderer( ostream = li_ostream
document = li_xml_doc ).
li_renderer->set_normalizing( boolc( iv_unpretty = abap_false ) ).
li_renderer->render( ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,18 @@
<?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_XML_PRETTY</CLSNAME>
<VERSION>1</VERSION>
<LANGU>E</LANGU>
<DESCRIPT>XML pretty printer</DESCRIPT>
<EXPOSURE>2</EXPOSURE>
<STATE>1</STATE>
<CLSCCINCL>X</CLSCCINCL>
<FIXPT>X</FIXPT>
<UNICODE>X</UNICODE>
</VSEOCLASS>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -146,7 +146,7 @@ CLASS lcl_dot_abapgit IMPLEMENTATION.
SOURCE data = is_data
RESULT XML rv_xml.
rv_xml = lcl_xml_pretty=>print( rv_xml ).
rv_xml = zcl_abapgit_xml_pretty=>print( rv_xml ).
REPLACE FIRST OCCURRENCE
OF REGEX '<\?xml version="1\.0" encoding="[\w-]+"\?>'

View File

@ -23,21 +23,21 @@ CLASS lcl_object_clas DEFINITION INHERITING FROM lcl_objects_program.
METHODS:
deserialize_abap
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception,
deserialize_docu
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception,
deserialize_tpool
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception,
deserialize_sotr
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception,
serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_object_dtel DEFINITION

View File

@ -33,10 +33,10 @@ CLASS lcl_object_doma DEFINITION INHERITING FROM lcl_objects_super FINAL.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
is_dd01v TYPE dd01v
it_dd07v TYPE dd07v_tab
RAISING zcx_abapgit_exception.

View File

@ -27,10 +27,10 @@ CLASS lcl_object_dtel DEFINITION INHERITING FROM lcl_objects_super FINAL.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
is_dd04v TYPE dd04v
RAISING zcx_abapgit_exception.

View File

@ -8,11 +8,11 @@ INTERFACE lif_object_enho.
METHODS:
deserialize
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception,
serialize
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
ii_enh_tool TYPE REF TO if_enh_tool
RAISING zcx_abapgit_exception.
@ -269,12 +269,12 @@ CLASS lcl_object_enho_clif DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
deserialize
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
io_clif TYPE REF TO cl_enh_tool_clif
RAISING zcx_abapgit_exception
cx_enh_root,
serialize
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
io_files TYPE REF TO lcl_objects_files
io_clif TYPE REF TO cl_enh_tool_clif
RAISING zcx_abapgit_exception.

View File

@ -8,13 +8,13 @@ INTERFACE lif_object_enhs.
METHODS:
deserialize
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
ii_enh_spot_tool TYPE REF TO if_enh_spot_tool
RAISING zcx_abapgit_exception,
serialize
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
ii_enh_spot_tool TYPE REF TO if_enh_spot_tool
RAISING zcx_abapgit_exception.

View File

@ -192,7 +192,7 @@ CLASS lcl_object_form IMPLEMENTATION.
DATA: ls_form_data TYPE tys_form_data.
DATA: lt_text_header TYPE tyt_text_header.
DATA: lt_lines TYPE tyt_lines.
DATA: lo_xml TYPE REF TO lcl_xml_output.
DATA: lo_xml TYPE REF TO zcl_abapgit_xml_output.
DATA: lv_form_found TYPE flag.
FIELD-SYMBOLS: <ls_text_header> LIKE LINE OF lt_text_header.
@ -315,7 +315,7 @@ CLASS lcl_object_form IMPLEMENTATION.
METHOD _extract_tdlines.
DATA lv_string TYPE string.
DATA lo_xml TYPE REF TO lcl_xml_input.
DATA lo_xml TYPE REF TO zcl_abapgit_xml_input.
lv_string = mo_files->read_string( iv_extra =
_build_extra_from_header( is_form_data-form_header )
@ -353,7 +353,7 @@ CLASS lcl_object_form IMPLEMENTATION.
METHOD _compress_lines.
DATA lv_string TYPE string.
DATA lo_xml TYPE REF TO lcl_xml_output.
DATA lo_xml TYPE REF TO zcl_abapgit_xml_output.
CREATE OBJECT lo_xml.
lo_xml->add( iv_name = c_objectname_tdlines

View File

@ -55,11 +55,11 @@ CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL.
RAISING zcx_abapgit_exception.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception.
METHODS deserialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception.
@ -67,7 +67,7 @@ CLASS lcl_object_fugr DEFINITION INHERITING FROM lcl_objects_program FINAL.
RAISING zcx_abapgit_exception.
METHODS deserialize_includes
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception.
@ -299,7 +299,7 @@ CLASS lcl_object_fugr IMPLEMENTATION.
METHOD deserialize_includes.
DATA: lo_xml TYPE REF TO lcl_xml_input,
DATA: lo_xml TYPE REF TO zcl_abapgit_xml_input,
ls_progdir TYPE ty_progdir,
lt_includes TYPE rso_t_objnm,
lt_tpool TYPE textpool_table,

View File

@ -17,19 +17,19 @@ CLASS lcl_object_intf DEFINITION FINAL INHERITING FROM lcl_objects_program.
iv_language TYPE spras.
PROTECTED SECTION.
METHODS deserialize_abap
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
iv_package TYPE devclass
RAISING zcx_abapgit_exception.
METHODS deserialize_docu
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
DATA mo_object_oriented_object_fct TYPE REF TO lif_oo_object_fnc.
METHODS serialize_xml
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_object_intf DEFINITION

View File

@ -23,10 +23,10 @@ CLASS lcl_object_msag DEFINITION INHERITING FROM lcl_objects_super FINAL.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception.

View File

@ -22,10 +22,10 @@ CLASS lcl_object_prog DEFINITION INHERITING FROM lcl_objects_program FINAL.
METHODS:
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_object_prog DEFINITION

View File

@ -457,8 +457,8 @@ CLASS lcl_object_tabl IMPLEMENTATION.
METHOD lif_object~compare_to_remote_version.
DATA: lo_table_validation TYPE REF TO lcl_object_tabl_valid,
lo_local_version_output TYPE REF TO lcl_xml_output,
lo_local_version_input TYPE REF TO lcl_xml_input,
lo_local_version_output TYPE REF TO zcl_abapgit_xml_output,
lo_local_version_input TYPE REF TO zcl_abapgit_xml_input,
lv_validation_text TYPE string.
CREATE OBJECT lo_local_version_output.

View File

@ -6,8 +6,8 @@ CLASS lcl_object_tabl_valid DEFINITION FINAL.
PUBLIC SECTION.
METHODS validate
IMPORTING
io_remote_version TYPE REF TO lcl_xml_input
io_local_version TYPE REF TO lcl_xml_input
io_remote_version TYPE REF TO zcl_abapgit_xml_input
io_local_version TYPE REF TO zcl_abapgit_xml_input
RETURNING
VALUE(rv_message) TYPE string
RAISING
@ -105,10 +105,10 @@ CLASS lct_table_validation DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION S
zcx_abapgit_exception.
DATA: mo_table_validator TYPE REF TO lcl_object_tabl_valid,
mo_previous_version_out_xml TYPE REF TO lcl_xml_output,
mo_previous_version_input_xml TYPE REF TO lcl_xml_input,
mo_current_version_out_xml TYPE REF TO lcl_xml_output,
mo_current_version_input_xml TYPE REF TO lcl_xml_input,
mo_previous_version_out_xml TYPE REF TO zcl_abapgit_xml_output,
mo_previous_version_input_xml TYPE REF TO zcl_abapgit_xml_input,
mo_current_version_out_xml TYPE REF TO zcl_abapgit_xml_output,
mo_current_version_input_xml TYPE REF TO zcl_abapgit_xml_input,
mt_previous_table_fields TYPE TABLE OF dd03p,
mt_current_table_fields TYPE TABLE OF dd03p,
mv_validation_message TYPE string.

View File

@ -40,11 +40,11 @@ CLASS lcl_object_tran DEFINITION INHERITING FROM lcl_objects_super FINAL.
CHANGING cg_value TYPE any,
serialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception,
deserialize_texts
IMPORTING io_xml TYPE REF TO lcl_xml_input
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_object_TRAN DEFINITION

View File

@ -181,7 +181,7 @@ CLASS lcl_objects_files DEFINITION.
RAISING zcx_abapgit_exception,
add_xml
IMPORTING iv_extra TYPE clike OPTIONAL
io_xml TYPE REF TO lcl_xml_output
io_xml TYPE REF TO zcl_abapgit_xml_output
iv_normalize TYPE sap_bool DEFAULT abap_true
is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
RAISING zcx_abapgit_exception,
@ -193,7 +193,7 @@ CLASS lcl_objects_files DEFINITION.
RAISING zcx_abapgit_exception ##called,
read_xml
IMPORTING iv_extra TYPE clike OPTIONAL
RETURNING VALUE(ro_xml) TYPE REF TO lcl_xml_input
RETURNING VALUE(ro_xml) TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception,
read_abap
IMPORTING iv_extra TYPE clike OPTIONAL
@ -276,11 +276,11 @@ INTERFACE lif_object.
METHODS:
serialize
IMPORTING io_xml TYPE REF TO lcl_xml_output
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output
RAISING zcx_abapgit_exception,
deserialize
IMPORTING iv_package TYPE devclass
io_xml TYPE REF TO lcl_xml_input
io_xml TYPE REF TO zcl_abapgit_xml_input
RAISING zcx_abapgit_exception,
delete
RAISING zcx_abapgit_exception,
@ -300,7 +300,7 @@ INTERFACE lif_object.
RAISING zcx_abapgit_exception.
METHODS:
compare_to_remote_version
IMPORTING io_remote_version_xml TYPE REF TO lcl_xml_input
IMPORTING io_remote_version_xml TYPE REF TO zcl_abapgit_xml_input
RETURNING VALUE(ro_comparison_result) TYPE REF TO lif_comparison_result
RAISING zcx_abapgit_exception.
@ -485,7 +485,7 @@ CLASS lcl_objects_files IMPLEMENTATION.
* xml-object in the plugin can only be typed to object.
* ABAP does not perform implicit type casts (also if compatible) in signatures,
* therefore this method's signature is typed ref to object
DATA lo_xml TYPE REF TO lcl_xml_output.
DATA lo_xml TYPE REF TO zcl_abapgit_xml_output.
lo_xml ?= io_xml.
@ -845,7 +845,7 @@ CLASS lcl_objects_program DEFINITION INHERITING FROM lcl_objects_super.
END OF ty_progdir.
METHODS serialize_program
IMPORTING io_xml TYPE REF TO lcl_xml_output OPTIONAL
IMPORTING io_xml TYPE REF TO zcl_abapgit_xml_output OPTIONAL
is_item TYPE zif_abapgit_definitions=>ty_item
io_files TYPE REF TO lcl_objects_files
iv_program TYPE programm OPTIONAL
@ -1003,7 +1003,7 @@ CLASS lcl_objects_program IMPLEMENTATION.
lt_source TYPE TABLE OF abaptxt255,
lt_tpool TYPE textpool_table,
ls_tpool LIKE LINE OF lt_tpool,
lo_xml TYPE REF TO lcl_xml_output.
lo_xml TYPE REF TO zcl_abapgit_xml_output.
IF iv_program IS INITIAL.
lv_program_name = is_item-obj_name.
@ -2275,7 +2275,7 @@ CLASS lcl_objects DEFINITION FINAL.
TYPES: BEGIN OF ty_deserialization,
obj TYPE REF TO lif_object,
xml TYPE REF TO lcl_xml_input,
xml TYPE REF TO zcl_abapgit_xml_input,
package TYPE devclass,
item TYPE zif_abapgit_definitions=>ty_item,
END OF ty_deserialization.

View File

@ -343,7 +343,7 @@ CLASS lcl_objects IMPLEMENTATION.
METHOD serialize.
DATA: li_obj TYPE REF TO lif_object,
lo_xml TYPE REF TO lcl_xml_output,
lo_xml TYPE REF TO zcl_abapgit_xml_output,
lo_files TYPE REF TO lcl_objects_files.
@ -430,7 +430,7 @@ CLASS lcl_objects IMPLEMENTATION.
lt_remote TYPE zif_abapgit_definitions=>ty_files_tt,
lv_package TYPE devclass,
lo_files TYPE REF TO lcl_objects_files,
lo_xml TYPE REF TO lcl_xml_input,
lo_xml TYPE REF TO zcl_abapgit_xml_input,
lt_results TYPE zif_abapgit_definitions=>ty_results_tt,
lt_ddic TYPE TABLE OF ty_deserialization,
lt_rest TYPE TABLE OF ty_deserialization,
@ -572,7 +572,7 @@ CLASS lcl_objects IMPLEMENTATION.
* only the main XML file is used for comparison
DATA: ls_remote_file TYPE zif_abapgit_definitions=>ty_file,
lo_remote_version TYPE REF TO lcl_xml_input,
lo_remote_version TYPE REF TO zcl_abapgit_xml_input,
lv_count TYPE i,
lo_comparison_result TYPE REF TO lif_comparison_result.

View File

@ -58,7 +58,7 @@ CLASS lcl_gui_page_db_dis IMPLEMENTATION.
ls_action-type = ms_key-type.
ls_action-value = ms_key-value.
lv_action = lcl_html_action_utils=>dbkey_encode( ls_action ).
lv_data = lo_highlighter->process_line( lcl_xml_pretty=>print( lv_data ) ).
lv_data = lo_highlighter->process_line( zcl_abapgit_xml_pretty=>print( lv_data ) ).
CREATE OBJECT ro_html.
CREATE OBJECT lo_toolbar.
@ -117,7 +117,7 @@ CLASS lcl_gui_page_db_edit IMPLEMENTATION.
iv_type = ms_key-type
iv_value = ms_key-value ).
lv_data = escape( val = lcl_xml_pretty=>print( lv_data )
lv_data = escape( val = zcl_abapgit_xml_pretty=>print( lv_data )
format = cl_abap_format=>e_html_attr ).
CREATE OBJECT ro_html.

View File

@ -1006,7 +1006,7 @@ CLASS lcl_persistence_db IMPLEMENTATION.
METHOD validate_and_unprettify_xml.
rv_xml = lcl_xml_pretty=>print(
rv_xml = zcl_abapgit_xml_pretty=>print(
iv_xml = iv_xml
iv_unpretty = abap_true
iv_ignore_errors = abap_false ).
@ -1836,7 +1836,7 @@ CLASS lcl_settings IMPLEMENTATION.
METHOD get_settings_xml.
DATA: lr_output TYPE REF TO lcl_xml_output.
DATA: lr_output TYPE REF TO zcl_abapgit_xml_output.
CREATE OBJECT lr_output.
@ -1849,7 +1849,7 @@ CLASS lcl_settings IMPLEMENTATION.
METHOD set_xml_settings.
DATA: lr_input TYPE REF TO lcl_xml_input.
DATA: lr_input TYPE REF TO zcl_abapgit_xml_input.
CREATE OBJECT lr_input EXPORTING iv_xml = iv_settings_xml.

View File

@ -376,133 +376,6 @@ CLASS ltcl_git_porcelain IMPLEMENTATION.
ENDCLASS.
CLASS ltcl_xml DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT FINAL.
PUBLIC SECTION.
METHODS:
up FOR TESTING
RAISING zcx_abapgit_exception,
empty FOR TESTING
RAISING zcx_abapgit_exception,
down FOR TESTING
RAISING zcx_abapgit_exception.
TYPES: BEGIN OF st_old,
foo TYPE i,
bar TYPE c LENGTH 1,
END OF st_old.
TYPES: BEGIN OF st_new,
foo TYPE i,
bar TYPE c LENGTH 1,
moo TYPE f,
END OF st_new.
ENDCLASS.
CLASS ltcl_xml IMPLEMENTATION.
METHOD empty.
DATA: ls_old TYPE st_old,
ls_new TYPE st_new,
lv_xml TYPE string,
lo_input TYPE REF TO lcl_xml_input,
lo_output TYPE REF TO lcl_xml_output.
CLEAR ls_old.
CREATE OBJECT lo_output.
lo_output->add( iv_name = 'DATA'
ig_data = ls_old ).
lv_xml = lo_output->render( ).
CREATE OBJECT lo_input
EXPORTING
iv_xml = lv_xml.
lo_input->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = ls_new ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-foo
exp = ls_old-foo ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-bar
exp = ls_old-bar ).
ENDMETHOD.
METHOD up.
DATA: ls_old TYPE st_old,
ls_new TYPE st_new,
lv_xml TYPE string,
lo_input TYPE REF TO lcl_xml_input,
lo_output TYPE REF TO lcl_xml_output.
ls_old-foo = 2.
ls_old-bar = 'A'.
CREATE OBJECT lo_output.
lo_output->add( iv_name = 'DATA'
ig_data = ls_old ).
lv_xml = lo_output->render( ).
CREATE OBJECT lo_input
EXPORTING
iv_xml = lv_xml.
lo_input->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = ls_new ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-foo
exp = ls_old-foo ).
cl_abap_unit_assert=>assert_equals(
act = ls_new-bar
exp = ls_old-bar ).
ENDMETHOD.
METHOD down.
DATA: ls_old TYPE st_old,
ls_new TYPE st_new,
lv_xml TYPE string,
lo_input TYPE REF TO lcl_xml_input,
lo_output TYPE REF TO lcl_xml_output.
ls_new-foo = 2.
ls_new-bar = 'A'.
ls_new-moo = 5.
CREATE OBJECT lo_output.
lo_output->add( iv_name = 'DATA'
ig_data = ls_new ).
lv_xml = lo_output->render( ).
CREATE OBJECT lo_input
EXPORTING
iv_xml = lv_xml.
lo_input->read( EXPORTING iv_name = 'DATA'
CHANGING cg_data = ls_old ).
cl_abap_unit_assert=>assert_equals(
act = ls_old-foo
exp = ls_new-foo ).
cl_abap_unit_assert=>assert_equals(
act = ls_old-bar
exp = ls_new-bar ).
ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------*
* CLASS ltcl_url DEFINITION
*----------------------------------------------------------------------*

View File

@ -219,10 +219,11 @@ CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
DATA:
mo_spy_oo_object_functions TYPE REF TO ltd_spy_oo_object,
mo_fake_object_files TYPE REF TO ltd_fake_object_files,
mo_xml_input TYPE REF TO lcl_xml_input,
mo_xml_out TYPE REF TO lcl_xml_output,
mo_xml_input TYPE REF TO zcl_abapgit_xml_input,
mo_xml_out TYPE REF TO zcl_abapgit_xml_output,
mo_oo_object TYPE REF TO lif_object,
ms_item TYPE zif_abapgit_definitions=>ty_item.
METHODS: when_deserializing
RAISING
zcx_abapgit_exception,
@ -247,6 +248,7 @@ CLASS ltc_oo_test DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
should_serialize_with_obj_key.
ENDCLASS.
CLASS ltc_oo_test IMPLEMENTATION.
METHOD should_serialize_with_obj_key.

View File

@ -2,459 +2,4 @@
*& Include ZABAPGIT_XML
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* CLASS lcl_xml DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xml DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS:
constructor.
PROTECTED SECTION.
DATA: mi_ixml TYPE REF TO if_ixml,
mi_xml_doc TYPE REF TO if_ixml_document,
ms_metadata TYPE zif_abapgit_definitions=>ty_metadata.
CONSTANTS: c_abapgit_tag TYPE string VALUE 'abapGit' ##NO_TEXT,
c_attr_version TYPE string VALUE 'version' ##NO_TEXT,
c_attr_serializer TYPE string VALUE 'serializer' ##NO_TEXT,
c_attr_serializer_version TYPE string VALUE 'serializer_version' ##NO_TEXT.
METHODS to_xml
IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true
RETURNING VALUE(rv_xml) TYPE string.
METHODS parse
IMPORTING iv_normalize TYPE abap_bool DEFAULT abap_true
iv_xml TYPE string
RAISING zcx_abapgit_exception.
PRIVATE SECTION.
METHODS error
IMPORTING ii_parser TYPE REF TO if_ixml_parser
RAISING zcx_abapgit_exception.
METHODS display_xml_error
RAISING zcx_abapgit_exception.
ENDCLASS. "lcl_xml DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_xml IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xml IMPLEMENTATION.
METHOD constructor.
mi_ixml = cl_ixml=>create( ).
mi_xml_doc = mi_ixml->create_document( ).
ENDMETHOD. "constructor
METHOD parse.
DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory,
li_istream TYPE REF TO if_ixml_istream,
li_element TYPE REF TO if_ixml_element,
li_version TYPE REF TO if_ixml_node,
li_parser TYPE REF TO if_ixml_parser.
ASSERT NOT iv_xml IS INITIAL.
li_stream_factory = mi_ixml->create_stream_factory( ).
li_istream = li_stream_factory->create_istream_string( iv_xml ).
li_parser = mi_ixml->create_parser( stream_factory = li_stream_factory
istream = li_istream
document = mi_xml_doc ).
li_parser->set_normalizing( iv_normalize ).
IF li_parser->parse( ) <> 0.
error( li_parser ).
ENDIF.
li_istream->close( ).
li_element = mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ).
li_version = li_element->if_ixml_node~get_attributes(
)->get_named_item_ns( c_attr_version ) ##no_text.
IF li_version->get_value( ) <> zif_abapgit_definitions=>gc_xml_version.
display_xml_error( ).
ENDIF.
* buffer serializer metadata. Git node will be removed lateron
ms_metadata-class = li_element->get_attribute_ns( c_attr_serializer ).
ms_metadata-version = li_element->get_attribute_ns( c_attr_serializer_version ).
ENDMETHOD. "parse
METHOD display_xml_error.
DATA: lv_version TYPE string.
lv_version = |abapGit version: { zif_abapgit_definitions=>gc_abap_version }|.
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'abapGit XML version mismatch'
txt1 = 'abapGit XML version mismatch'
txt2 = 'See http://larshp.github.io/abapGit/other-xml-mismatch.html'
txt3 = lv_version. "#EC NOTEXT
zcx_abapgit_exception=>raise( 'XML error' ).
ENDMETHOD. "display_xml_error
METHOD to_xml.
* will render to codepage UTF-16
DATA: li_ostream TYPE REF TO if_ixml_ostream,
li_renderer TYPE REF TO if_ixml_renderer,
li_streamfactory TYPE REF TO if_ixml_stream_factory.
li_streamfactory = mi_ixml->create_stream_factory( ).
li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ).
li_renderer = mi_ixml->create_renderer( ostream = li_ostream
document = mi_xml_doc ).
li_renderer->set_normalizing( iv_normalize ).
li_renderer->render( ).
ENDMETHOD. "to_xml
METHOD error.
DATA: lv_error TYPE i,
lv_txt1 TYPE string,
lv_txt2 TYPE string,
lv_txt3 TYPE string,
lv_times TYPE i,
li_error TYPE REF TO if_ixml_parse_error.
IF ii_parser->num_errors( ) <> 0.
lv_times = ii_parser->num_errors( ).
DO lv_times TIMES.
lv_error = sy-index - 1.
li_error = ii_parser->get_error( lv_error ).
lv_txt1 = li_error->get_column( ).
CONCATENATE 'Column:' lv_txt1 INTO lv_txt1. "#EC NOTEXT
lv_txt2 = li_error->get_line( ).
CONCATENATE 'Line:' lv_txt2 INTO lv_txt2. "#EC NOTEXT
lv_txt3 = li_error->get_reason( ).
CALL FUNCTION 'POPUP_TO_INFORM'
EXPORTING
titel = 'Error from XML parser' "#EC NOTEXT
txt1 = lv_txt1
txt2 = lv_txt2
txt3 = lv_txt3.
ENDDO.
ENDIF.
zcx_abapgit_exception=>raise( 'Error while parsing XML' ).
ENDMETHOD. "error
ENDCLASS. "lcl_xml IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_xml_output DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xml_output DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC.
PUBLIC SECTION.
METHODS:
add
IMPORTING iv_name TYPE clike
ig_data TYPE any
RAISING zcx_abapgit_exception,
set_raw
IMPORTING ii_raw TYPE REF TO if_ixml_element,
add_xml
IMPORTING iv_name TYPE clike
ii_xml TYPE REF TO if_ixml_element,
build_asx_node
RETURNING VALUE(ri_element) TYPE REF TO if_ixml_element,
render
IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true
is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
RETURNING VALUE(rv_xml) TYPE string.
PRIVATE SECTION.
DATA: mi_raw TYPE REF TO if_ixml_element.
ENDCLASS. "lcl_xml_output DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_xml_output IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xml_output IMPLEMENTATION.
METHOD set_raw.
mi_raw = ii_raw.
ENDMETHOD. "set_raw
METHOD add.
DATA: li_node TYPE REF TO if_ixml_node,
li_doc TYPE REF TO if_ixml_document,
lt_stab TYPE abap_trans_srcbind_tab.
FIELD-SYMBOLS: <ls_stab> LIKE LINE OF lt_stab.
ASSERT NOT iv_name IS INITIAL.
IF ig_data IS INITIAL.
RETURN.
ENDIF.
APPEND INITIAL LINE TO lt_stab ASSIGNING <ls_stab>.
<ls_stab>-name = iv_name.
GET REFERENCE OF ig_data INTO <ls_stab>-value.
li_doc = cl_ixml=>create( )->create_document( ).
CALL TRANSFORMATION id
OPTIONS initial_components = 'suppress'
SOURCE (lt_stab)
RESULT XML li_doc.
li_node = mi_xml_doc->get_root( )->get_first_child( ).
IF li_node IS BOUND.
mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child(
li_doc->get_root( )->get_first_child( )->get_first_child( )->get_first_child( ) ).
ELSE.
mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ).
ENDIF.
ENDMETHOD.
METHOD add_xml.
DATA: li_element TYPE REF TO if_ixml_element.
li_element = mi_xml_doc->create_element( iv_name ).
li_element->append_child( ii_xml ).
mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( li_element ).
ENDMETHOD.
METHOD render.
DATA: li_git TYPE REF TO if_ixml_element,
li_abap TYPE REF TO if_ixml_element.
IF mi_raw IS INITIAL.
li_abap ?= mi_xml_doc->get_root( )->get_first_child( ).
mi_xml_doc->get_root( )->remove_child( li_abap ).
IF li_abap IS INITIAL.
li_abap = build_asx_node( ).
ENDIF.
ELSE.
li_abap = mi_raw.
ENDIF.
li_git = mi_xml_doc->create_element( c_abapgit_tag ).
li_git->set_attribute( name = c_attr_version value = zif_abapgit_definitions=>gc_xml_version ).
IF NOT is_metadata IS INITIAL.
li_git->set_attribute( name = c_attr_serializer
value = is_metadata-class ).
li_git->set_attribute( name = c_attr_serializer_version
value = is_metadata-version ).
ENDIF.
li_git->append_child( li_abap ).
mi_xml_doc->get_root( )->append_child( li_git ).
rv_xml = to_xml( iv_normalize ).
ENDMETHOD. "render
METHOD build_asx_node.
DATA: li_attr TYPE REF TO if_ixml_attribute.
ri_element = mi_xml_doc->create_element_ns(
name = 'abap'
prefix = 'asx' ).
li_attr = mi_xml_doc->create_attribute_ns( 'version' ).
li_attr->if_ixml_node~set_value( '1.0' ).
ri_element->set_attribute_node_ns( li_attr ).
li_attr = mi_xml_doc->create_attribute_ns(
name = 'asx'
prefix = 'xmlns' ).
li_attr->if_ixml_node~set_value( 'http://www.sap.com/abapxml' ).
ri_element->set_attribute_node_ns( li_attr ).
ENDMETHOD.
ENDCLASS. "lcl_xml_output IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS lcl_xml_input DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xml_input DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING iv_xml TYPE clike
RAISING zcx_abapgit_exception,
read
IMPORTING iv_name TYPE clike
CHANGING cg_data TYPE any
RAISING zcx_abapgit_exception,
get_raw
RETURNING VALUE(ri_raw) TYPE REF TO if_ixml_document,
* todo, add read_xml to match add_xml in lcl_xml_output
get_metadata
RETURNING VALUE(rs_metadata) TYPE zif_abapgit_definitions=>ty_metadata.
PRIVATE SECTION.
METHODS: fix_xml.
ENDCLASS. "lcl_xml_input DEFINITION
*----------------------------------------------------------------------*
* CLASS lcl_xml_input IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_xml_input IMPLEMENTATION.
METHOD constructor.
super->constructor( ).
parse( iv_xml ).
fix_xml( ).
ENDMETHOD. "constructor
METHOD get_raw.
ri_raw = mi_xml_doc.
ENDMETHOD. "get_raw
METHOD fix_xml.
DATA: li_git TYPE REF TO if_ixml_element,
li_abap TYPE REF TO if_ixml_node.
li_git ?= mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ).
li_abap = li_git->get_first_child( ).
mi_xml_doc->get_root( )->remove_child( li_git ).
mi_xml_doc->get_root( )->append_child( li_abap ).
ENDMETHOD. "fix_xml
METHOD read.
DATA: lx_error TYPE REF TO cx_transformation_error,
lt_rtab TYPE abap_trans_resbind_tab.
FIELD-SYMBOLS: <ls_rtab> LIKE LINE OF lt_rtab.
ASSERT NOT iv_name IS INITIAL.
CLEAR cg_data. "Initialize result to avoid problems with empty values
APPEND INITIAL LINE TO lt_rtab ASSIGNING <ls_rtab>.
<ls_rtab>-name = iv_name.
GET REFERENCE OF cg_data INTO <ls_rtab>-value.
TRY.
CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML mi_xml_doc
RESULT (lt_rtab) ##no_text.
CATCH cx_transformation_error INTO lx_error.
zcx_abapgit_exception=>raise( lx_error->if_message~get_text( ) ).
ENDTRY.
ENDMETHOD. "read
METHOD get_metadata.
rs_metadata = ms_metadata.
ENDMETHOD. "get_metadata
ENDCLASS. "lcl_xml_input IMPLEMENTATION
CLASS lcl_xml_pretty DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS: print
IMPORTING iv_xml TYPE string
iv_ignore_errors TYPE abap_bool DEFAULT abap_true
iv_unpretty TYPE abap_bool DEFAULT abap_false
RETURNING VALUE(rv_xml) TYPE string
RAISING zcx_abapgit_exception.
ENDCLASS.
CLASS lcl_xml_pretty IMPLEMENTATION.
METHOD print.
DATA: li_ixml TYPE REF TO if_ixml,
li_xml_doc TYPE REF TO if_ixml_document,
li_stream_factory TYPE REF TO if_ixml_stream_factory,
li_istream TYPE REF TO if_ixml_istream,
li_parser TYPE REF TO if_ixml_parser,
li_ostream TYPE REF TO if_ixml_ostream,
li_renderer TYPE REF TO if_ixml_renderer.
ASSERT NOT iv_xml IS INITIAL.
li_ixml = cl_ixml=>create( ).
li_xml_doc = li_ixml->create_document( ).
li_stream_factory = li_ixml->create_stream_factory( ).
li_istream = li_stream_factory->create_istream_string( iv_xml ).
li_parser = li_ixml->create_parser( stream_factory = li_stream_factory
istream = li_istream
document = li_xml_doc ).
li_parser->set_normalizing( abap_true ).
IF li_parser->parse( ) <> 0.
IF iv_ignore_errors = abap_true.
rv_xml = iv_xml.
RETURN.
ELSE.
zcx_abapgit_exception=>raise( 'error parsing xml' ).
ENDIF.
ENDIF.
li_istream->close( ).
li_ostream = li_stream_factory->create_ostream_cstring( rv_xml ).
li_renderer = li_ixml->create_renderer( ostream = li_ostream
document = li_xml_doc ).
li_renderer->set_normalizing( boolc( iv_unpretty = abap_false ) ).
li_renderer->render( ).
ENDMETHOD.
ENDCLASS.
* todo, include will be deleted later

View File

@ -2,4 +2,4 @@
*& Include ZABAPGIT_ZLIB
*&---------------------------------------------------------------------*
* lets wait deleting the includes? and delete multiple at a time?
* todo, lets wait deleting the includes? and delete multiple at a time?