abapGit/src/xml/zcl_abapgit_xml_output.clas.abap
Lars Hvam d0a721b2cf
Move methods to private (#2416)
* ZCL_ABAPGIT_GUI_CHUNK_LIB move 2 methods private

* HTML_ACTION_UTILS move two methods private

* move calculate_skip_testclass to private

* move BUILD_ASX_NODE to private
2019-02-18 05:27:49 -08:00

149 lines
3.7 KiB
ABAP

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 render
IMPORTING
!iv_normalize TYPE abap_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 .
METHODS build_asx_node
RETURNING
VALUE(ri_element) 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_version=>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.
METHOD set_raw.
mi_raw = ii_raw.
ENDMETHOD.
ENDCLASS.