mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-03 13:26:12 +08:00

* Update unit tests to use CI * Make test repo configurable * Remove local tests and use CI * Lint fixes * Replace local tests with CI * Add Type Group constants to abaplint * Update constants and replace assert_true * Revert constants Co-authored-by: Lars Hvam <larshp@hotmail.com>
319 lines
8.5 KiB
ABAP
319 lines
8.5 KiB
ABAP
CLASS zcl_abapgit_object_pdts DEFINITION
|
|
PUBLIC
|
|
INHERITING FROM zcl_abapgit_objects_super
|
|
FINAL
|
|
CREATE PUBLIC.
|
|
|
|
PUBLIC SECTION.
|
|
INTERFACES zif_abapgit_object.
|
|
ALIASES mo_files FOR zif_abapgit_object~mo_files.
|
|
|
|
METHODS constructor IMPORTING is_item TYPE zif_abapgit_definitions=>ty_item
|
|
iv_language TYPE spras
|
|
RAISING zcx_abapgit_exception.
|
|
|
|
PRIVATE SECTION.
|
|
|
|
DATA ms_objkey TYPE hrsobject.
|
|
DATA mv_objid TYPE hrobjid.
|
|
|
|
METHODS check_subrc_for IMPORTING iv_call TYPE clike OPTIONAL
|
|
RAISING zcx_abapgit_exception.
|
|
|
|
METHODS is_experimental RETURNING VALUE(rv_result) TYPE abap_bool.
|
|
METHODS get_container_xml
|
|
IMPORTING
|
|
ii_task TYPE REF TO lif_task_definition
|
|
RETURNING
|
|
VALUE(ri_first_element) TYPE REF TO if_ixml_element
|
|
RAISING
|
|
zcx_abapgit_exception.
|
|
|
|
METHODS extract_container IMPORTING io_xml TYPE REF TO zif_abapgit_xml_input
|
|
RETURNING VALUE(rv_result) TYPE xstring.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS zcl_abapgit_object_pdts IMPLEMENTATION.
|
|
|
|
METHOD constructor.
|
|
|
|
super->constructor( is_item = is_item
|
|
iv_language = iv_language ).
|
|
|
|
IF is_experimental( ) = abap_false.
|
|
"Alpha version, known issues:
|
|
"- Container texts not de/serialized properly (functionally OK)
|
|
"- Container handling still a bad hack, needs refactoring with lots of debugging time
|
|
"- Probably has a few more bugs, more testing needed
|
|
zcx_abapgit_exception=>raise( 'PDTS not fully implemented, enable experimental features to test it' ).
|
|
ENDIF.
|
|
|
|
ms_objkey-otype = 'TS'.
|
|
ms_objkey-objid = ms_item-obj_name.
|
|
|
|
mv_objid = ms_item-obj_name. "Todo: Obsolete
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~serialize.
|
|
|
|
DATA li_task TYPE REF TO lif_task_definition.
|
|
|
|
li_task = lcl_task_definition=>load( mv_objid ).
|
|
li_task->clear_origin_data( ).
|
|
io_xml->add( iv_name = 'PDTS'
|
|
ig_data = li_task->get_definition( ) ).
|
|
|
|
io_xml->add_xml( iv_name = 'CONTAINER'
|
|
ii_xml = get_container_xml( li_task ) ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_container_xml.
|
|
|
|
DATA li_xml_dom TYPE REF TO if_ixml_document.
|
|
DATA li_elements TYPE REF TO if_ixml_node_collection.
|
|
DATA li_iterator TYPE REF TO if_ixml_node_iterator.
|
|
DATA li_element TYPE REF TO if_ixml_node.
|
|
DATA li_children TYPE REF TO if_ixml_node_list.
|
|
DATA li_child_iterator TYPE REF TO if_ixml_node_iterator.
|
|
DATA li_attributes TYPE REF TO if_ixml_named_node_map.
|
|
DATA lv_name TYPE string.
|
|
DATA li_container TYPE REF TO if_swf_cnt_container.
|
|
|
|
"Todo: get_user_container strips out system elements, but to_xml adds them back in (hardcoded internally)
|
|
" Dirty hack further down to remove them from XML until we get this to work properly
|
|
li_container = ii_task->get_user_container( ).
|
|
li_container->to_xml(
|
|
EXPORTING
|
|
include_null_values = abap_true
|
|
include_initial_values = abap_true
|
|
include_typenames = abap_true
|
|
include_change_data = abap_true
|
|
include_texts = abap_false "Todo: Get texts to work properly
|
|
include_extension_elements = abap_true
|
|
save_delta_handling_info = abap_true
|
|
use_xslt = abap_false
|
|
IMPORTING
|
|
xml_dom = li_xml_dom
|
|
EXCEPTIONS
|
|
conversion_error = 1
|
|
OTHERS = 2 ). "#EC SUBRC_OK
|
|
|
|
check_subrc_for( `TO_XML` ).
|
|
|
|
ri_first_element ?= li_xml_dom->get_first_child( ).
|
|
li_elements = ri_first_element->get_elements_by_tag_name( name = 'ELEMENTS' ).
|
|
li_iterator = li_elements->create_iterator( ).
|
|
|
|
DO.
|
|
li_element = li_iterator->get_next( ).
|
|
|
|
IF li_element IS NOT BOUND.
|
|
EXIT.
|
|
ENDIF.
|
|
|
|
li_children = li_element->get_children( ).
|
|
li_child_iterator = li_children->create_iterator( ).
|
|
|
|
DO.
|
|
|
|
li_element = li_child_iterator->get_next( ).
|
|
IF li_element IS NOT BOUND.
|
|
EXIT.
|
|
ENDIF.
|
|
|
|
"Remove system container elements - causing too much trouble
|
|
"Todo: This is a bad hack, but obsolete if we can fix todo above
|
|
li_attributes = li_element->get_attributes( ).
|
|
lv_name = li_attributes->get_named_item( name = 'NAME' )->get_value( ).
|
|
IF lv_name(1) = '_'.
|
|
li_element->remove_node( ).
|
|
li_child_iterator->reset( ).
|
|
CONTINUE.
|
|
ENDIF.
|
|
|
|
li_attributes->remove_named_item( name = 'CHGDTA' ).
|
|
|
|
ENDDO.
|
|
|
|
ENDDO.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~deserialize.
|
|
|
|
DATA: ls_task TYPE lif_task_definition=>ty_task_data,
|
|
lv_xml_string TYPE xstring,
|
|
li_task TYPE REF TO lif_task_definition.
|
|
|
|
io_xml->read( EXPORTING iv_name = 'PDTS'
|
|
CHANGING cg_data = ls_task ).
|
|
|
|
li_task = lcl_task_definition=>create(
|
|
iv_objid = mv_objid
|
|
is_task_data = ls_task ).
|
|
|
|
li_task->create_task( ).
|
|
li_task->change_wi_text( ).
|
|
li_task->change_method( ).
|
|
|
|
lv_xml_string = extract_container( io_xml ).
|
|
li_task->import_container( lv_xml_string ).
|
|
|
|
li_task->change_start_events( ).
|
|
li_task->change_terminating_events( ).
|
|
li_task->change_text( ).
|
|
|
|
li_task->save( iv_package ).
|
|
|
|
tadir_insert( iv_package ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD extract_container.
|
|
|
|
DATA li_stream TYPE REF TO if_ixml_ostream.
|
|
DATA li_container_element TYPE REF TO if_ixml_element.
|
|
DATA li_document TYPE REF TO if_ixml_document.
|
|
|
|
li_document = io_xml->get_raw( ).
|
|
|
|
li_container_element = li_document->find_from_name_ns( 'CONTAINER' ).
|
|
|
|
IF li_container_element IS BOUND.
|
|
|
|
li_document = cl_ixml=>create( )->create_document( ).
|
|
|
|
li_stream = cl_ixml=>create( )->create_stream_factory( )->create_ostream_xstring( rv_result ).
|
|
|
|
li_document->append_child( li_container_element ).
|
|
|
|
cl_ixml=>create( )->create_renderer(
|
|
document = li_document
|
|
ostream = li_stream
|
|
)->render( ).
|
|
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~delete.
|
|
|
|
CALL FUNCTION 'RH_HRSOBJECT_DELETE'
|
|
EXPORTING
|
|
act_otype = 'TS'
|
|
act_objid = mv_objid
|
|
no_confirmation_msg = abap_true
|
|
EXCEPTIONS
|
|
enqueue_failed = 1
|
|
object_not_deleted = 2
|
|
object_not_found = 3
|
|
OTHERS = 4. "#EC SUBRC_OK
|
|
|
|
check_subrc_for( `RH_HRSOBJECT_DELETE` ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~exists.
|
|
|
|
CALL FUNCTION 'RH_READ_OBJECT'
|
|
EXPORTING
|
|
plvar = '01'
|
|
otype = 'TS'
|
|
objid = mv_objid
|
|
istat = '1'
|
|
begda = sy-datum
|
|
endda = '99991231'
|
|
ointerval = 'X'
|
|
read_db = 'X'
|
|
EXCEPTIONS
|
|
not_found = 1
|
|
OTHERS = 2.
|
|
|
|
rv_bool = boolc( sy-subrc = 0 ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~is_locked.
|
|
rv_is_locked = exists_a_lock_entry_for( iv_lock_object = 'HRSOBJECT'
|
|
iv_argument = 'TS' && mv_objid ).
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~is_active.
|
|
rv_active = abap_true.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~changed_by.
|
|
|
|
SELECT SINGLE uname
|
|
INTO rv_user
|
|
FROM hrs1201
|
|
WHERE otype = 'TS' AND
|
|
objid = ms_item-obj_name.
|
|
|
|
IF sy-subrc <> 0.
|
|
rv_user = c_user_unknown.
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~jump.
|
|
CALL FUNCTION 'RS_TOOL_ACCESS_REMOTE'
|
|
STARTING NEW TASK 'GIT'
|
|
EXPORTING
|
|
operation = 'SHOW'
|
|
object_name = ms_item-obj_name
|
|
object_type = ms_item-obj_type
|
|
EXCEPTIONS
|
|
OTHERS = 0.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~get_metadata.
|
|
rs_metadata = get_metadata( ).
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~get_comparator.
|
|
RETURN.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~get_deserialize_steps.
|
|
APPEND zif_abapgit_object=>gc_step_id-abap TO rt_steps.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD check_subrc_for.
|
|
IF sy-subrc <> 0.
|
|
zcx_abapgit_exception=>raise( iv_call && ' returned ' && sy-subrc ).
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD is_experimental.
|
|
|
|
DATA lo_settings TYPE REF TO zcl_abapgit_settings.
|
|
DATA lo_settings_persistence TYPE REF TO zcl_abapgit_persist_settings.
|
|
|
|
lo_settings_persistence = zcl_abapgit_persist_settings=>get_instance( ).
|
|
lo_settings = lo_settings_persistence->read( ).
|
|
rv_result = lo_settings->get_experimental_features( ).
|
|
|
|
ENDMETHOD.
|
|
|
|
ENDCLASS.
|