mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
lcl_xml to global class
This commit is contained in:
parent
f4a319a426
commit
7ecbc07e19
10
src/xml/package.devc.xml
Normal file
10
src/xml/package.devc.xml
Normal 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>
|
161
src/xml/zcl_abapgit_xml.clas.abap
Normal file
161
src/xml/zcl_abapgit_xml.clas.abap
Normal 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.
|
19
src/xml/zcl_abapgit_xml.clas.xml
Normal file
19
src/xml/zcl_abapgit_xml.clas.xml
Normal 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>
|
96
src/xml/zcl_abapgit_xml_input.clas.abap
Normal file
96
src/xml/zcl_abapgit_xml_input.clas.abap
Normal 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.
|
127
src/xml/zcl_abapgit_xml_input.clas.testclasses.abap
Normal file
127
src/xml/zcl_abapgit_xml_input.clas.testclasses.abap
Normal 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.
|
19
src/xml/zcl_abapgit_xml_input.clas.xml
Normal file
19
src/xml/zcl_abapgit_xml_input.clas.xml
Normal 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>
|
147
src/xml/zcl_abapgit_xml_output.clas.abap
Normal file
147
src/xml/zcl_abapgit_xml_output.clas.abap
Normal 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.
|
18
src/xml/zcl_abapgit_xml_output.clas.xml
Normal file
18
src/xml/zcl_abapgit_xml_output.clas.xml
Normal 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>
|
63
src/xml/zcl_abapgit_xml_pretty.clas.abap
Normal file
63
src/xml/zcl_abapgit_xml_pretty.clas.abap
Normal 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.
|
18
src/xml/zcl_abapgit_xml_pretty.clas.xml
Normal file
18
src/xml/zcl_abapgit_xml_pretty.clas.xml
Normal 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>
|
|
@ -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-]+"\?>'
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
*----------------------------------------------------------------------*
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
|
Loading…
Reference in New Issue
Block a user