mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-04 05:47:17 +08:00

* mark inactive objects in repo list Inactive object are marked in the repo list The sort order for changed files is not changed unchanged inactive files come right after the changed files * move acitve check to object interface * add is_active for objects up to F * add is_active for objects up to P * add is_active for objects up to T * add is_active for objects up to X all core object implement (except SSFO) the standard active check via FM RS_INACTIVE_OBJECTS_WARNING now * add is_active to plugins bridge - always active * finish object interface implementation + objects * add is_active for offline with object interface * rename returning to RV_ * use returning for serialize * cleanup, PP, UT
654 lines
17 KiB
ABAP
654 lines
17 KiB
ABAP
CLASS zcl_abapgit_object_ecatt_super DEFINITION
|
|
PUBLIC
|
|
INHERITING FROM zcl_abapgit_objects_super
|
|
ABSTRACT
|
|
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 .
|
|
|
|
PROTECTED SECTION.
|
|
METHODS:
|
|
get_object_type ABSTRACT
|
|
RETURNING VALUE(rv_object_type) TYPE etobj_type,
|
|
|
|
get_upload ABSTRACT
|
|
RETURNING
|
|
VALUE(ro_upload) TYPE REF TO cl_apl_ecatt_upload,
|
|
|
|
get_download ABSTRACT
|
|
RETURNING
|
|
VALUE(ro_download) TYPE REF TO cl_apl_ecatt_download,
|
|
|
|
get_lock_object ABSTRACT
|
|
RETURNING
|
|
VALUE(rv_lock_object) TYPE eqeobj.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES:
|
|
BEGIN OF ty_last_changed,
|
|
luser TYPE xubname,
|
|
ldate TYPE datum,
|
|
ltime TYPE uzeit,
|
|
END OF ty_last_changed.
|
|
|
|
CONSTANTS:
|
|
BEGIN OF co_name,
|
|
version TYPE string VALUE 'VERSION' ##NO_TEXT,
|
|
versions TYPE string VALUE 'VERSIONS' ##NO_TEXT,
|
|
END OF co_name,
|
|
co_default_version TYPE etobj_ver VALUE '1' ##NO_TEXT.
|
|
|
|
CLASS-METHODS:
|
|
is_change_more_recent_than
|
|
IMPORTING
|
|
is_currently_changed TYPE ty_last_changed
|
|
is_last_changed TYPE ty_last_changed
|
|
RETURNING
|
|
VALUE(rv_is_change_more_recent) TYPE abap_bool.
|
|
|
|
DATA:
|
|
mv_object_name TYPE etobj_name.
|
|
|
|
METHODS:
|
|
get_changed_date
|
|
IMPORTING
|
|
ii_document TYPE REF TO if_ixml_document
|
|
RETURNING
|
|
VALUE(rv_changed_date) TYPE d,
|
|
|
|
get_changed_time
|
|
IMPORTING
|
|
ii_document TYPE REF TO if_ixml_document
|
|
RETURNING
|
|
VALUE(rv_changed_time) TYPE t,
|
|
|
|
get_changed_by_user
|
|
IMPORTING
|
|
ii_document TYPE REF TO if_ixml_document
|
|
RETURNING
|
|
VALUE(rv_changed_by_user) TYPE xubname,
|
|
|
|
get_change_information
|
|
IMPORTING
|
|
is_version_info TYPE etversinfo
|
|
RETURNING
|
|
VALUE(rs_change_information) TYPE ty_last_changed
|
|
RAISING
|
|
cx_ecatt_apl
|
|
zcx_abapgit_exception,
|
|
|
|
clear_attributes
|
|
CHANGING
|
|
ci_document TYPE REF TO if_ixml_document,
|
|
|
|
clear_elements
|
|
CHANGING
|
|
ci_document TYPE REF TO if_ixml_document,
|
|
|
|
get_version_from_node
|
|
IMPORTING
|
|
ii_node TYPE REF TO if_ixml_node
|
|
RETURNING
|
|
VALUE(rv_version) TYPE string,
|
|
|
|
deserialize_version
|
|
IMPORTING
|
|
ii_version_node TYPE REF TO if_ixml_node
|
|
iv_package TYPE devclass
|
|
RAISING
|
|
zcx_abapgit_exception,
|
|
|
|
serialize_version
|
|
IMPORTING
|
|
iv_version TYPE etversinfo-version
|
|
CHANGING
|
|
ci_node TYPE REF TO if_ixml_element
|
|
RAISING
|
|
cx_ecatt
|
|
zcx_abapgit_exception,
|
|
|
|
clear_element
|
|
IMPORTING
|
|
iv_name TYPE csequence
|
|
CHANGING
|
|
ci_document TYPE REF TO if_ixml_document,
|
|
|
|
serialize_versions
|
|
IMPORTING
|
|
it_version_info TYPE etversinfo_tabtype
|
|
CHANGING
|
|
ci_document TYPE REF TO if_ixml_document
|
|
RAISING
|
|
cx_ecatt
|
|
zcx_abapgit_exception.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
|
|
CLASS zcl_abapgit_object_ecatt_super IMPLEMENTATION.
|
|
|
|
|
|
METHOD clear_attributes.
|
|
|
|
DATA: lo_element TYPE REF TO if_ixml_element,
|
|
lv_object_type TYPE etobj_type.
|
|
|
|
lv_object_type = get_object_type( ).
|
|
|
|
lo_element = ci_document->find_from_name( |{ lv_object_type }| ).
|
|
lo_element->remove_attribute( |SAPRL| ).
|
|
lo_element->remove_attribute( |DOWNLOADDATE| ).
|
|
lo_element->remove_attribute( |DOWNLOADTIME| ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD clear_element.
|
|
|
|
DATA: lo_element TYPE REF TO if_ixml_element.
|
|
|
|
lo_element = ci_document->find_from_name( iv_name ).
|
|
|
|
IF lo_element IS BOUND.
|
|
lo_element->set_value( || ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD clear_elements.
|
|
|
|
clear_element( EXPORTING iv_name = |FUSER|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |FDATE|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |LUSER|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |LDATE|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |LTIME|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |TWB_RESP|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |DEVCLASS|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |TADIR_RESP|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
clear_element( EXPORTING iv_name = |VAR_EXT_PATH|
|
|
CHANGING ci_document = ci_document ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD constructor.
|
|
|
|
super->constructor( is_item = is_item
|
|
iv_language = iv_language ).
|
|
|
|
mv_object_name = ms_item-obj_name.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD deserialize_version.
|
|
|
|
DATA: ls_object TYPE etmobjects,
|
|
lo_upload TYPE REF TO cl_apl_ecatt_upload,
|
|
lv_xml TYPE xstring,
|
|
lv_text TYPE string,
|
|
li_document TYPE REF TO if_ixml_document,
|
|
lv_version TYPE string,
|
|
lx_error TYPE REF TO cx_ecatt.
|
|
|
|
lv_version = get_version_from_node( ii_version_node ).
|
|
|
|
IF lv_version IS INITIAL.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
lo_upload = get_upload( ).
|
|
|
|
li_document = cl_ixml=>create( )->create_document( ).
|
|
li_document->append_child( ii_version_node->get_first_child( ) ).
|
|
|
|
lv_xml = cl_ixml_80_20=>render_to_xstring( li_document ).
|
|
|
|
CALL METHOD lo_upload->('Z_SET_STREAM_FOR_UPLOAD')
|
|
EXPORTING
|
|
iv_xml = lv_xml.
|
|
|
|
ls_object-d_obj_name = mv_object_name.
|
|
ls_object-s_obj_type = get_object_type( ).
|
|
ls_object-d_devclass = iv_package.
|
|
ls_object-d_obj_ver = lv_version.
|
|
ls_object-d_overwrite = abap_true.
|
|
|
|
TRY.
|
|
lo_upload->upload(
|
|
CHANGING
|
|
ch_object = ls_object ).
|
|
|
|
CATCH cx_ecatt INTO lx_error.
|
|
lv_text = lx_error->get_text( ).
|
|
zcx_abapgit_exception=>raise( lv_text ).
|
|
ENDTRY.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_changed_by_user.
|
|
|
|
rv_changed_by_user = ii_document->find_from_name( 'LUSER' )->get_value( ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_changed_date.
|
|
|
|
DATA: lv_changed_date_external TYPE string.
|
|
|
|
lv_changed_date_external = ii_document->find_from_name( 'LDATE' )->get_value( ).
|
|
|
|
CALL FUNCTION 'CONVERSION_EXIT_RSDAT_INPUT'
|
|
EXPORTING
|
|
input = lv_changed_date_external
|
|
IMPORTING
|
|
output = rv_changed_date
|
|
EXCEPTIONS
|
|
invalid_date = 1
|
|
OTHERS = 2.
|
|
|
|
IF sy-subrc <> 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_changed_time.
|
|
|
|
DATA: lv_changed_time_external TYPE string.
|
|
|
|
lv_changed_time_external = ii_document->find_from_name( 'LTIME' )->get_value( ).
|
|
|
|
CALL FUNCTION 'CONVERSION_EXIT_TIMLO_INPUT'
|
|
EXPORTING
|
|
input = lv_changed_time_external
|
|
IMPORTING
|
|
output = rv_changed_time
|
|
EXCEPTIONS
|
|
wrong_input = 1
|
|
OTHERS = 2.
|
|
|
|
IF sy-subrc <> 0.
|
|
RETURN.
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_change_information.
|
|
|
|
DATA: li_document TYPE REF TO if_ixml_document,
|
|
lv_xml TYPE xstring,
|
|
lo_download TYPE REF TO cl_apl_ecatt_download,
|
|
lv_object_type TYPE etobj_type.
|
|
|
|
lo_download = get_download( ).
|
|
|
|
lv_object_type = get_object_type( ).
|
|
|
|
zcl_abapgit_ecatt_helper=>build_xml_of_object(
|
|
EXPORTING
|
|
im_object_name = mv_object_name
|
|
im_object_version = is_version_info-version
|
|
im_object_type = lv_object_type
|
|
io_download = lo_download
|
|
IMPORTING
|
|
ex_xml_stream = lv_xml ).
|
|
|
|
li_document = cl_ixml_80_20=>parse_to_document( stream_xstring = lv_xml ).
|
|
|
|
rs_change_information-ldate = get_changed_date( li_document ).
|
|
rs_change_information-ltime = get_changed_time( li_document ).
|
|
rs_change_information-luser = get_changed_by_user( li_document ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD get_version_from_node.
|
|
|
|
TRY.
|
|
rv_version = ii_node->get_first_child(
|
|
)->get_first_child(
|
|
)->get_first_child(
|
|
)->get_first_child(
|
|
)->get_value( ).
|
|
|
|
CATCH cx_sy_ref_is_initial.
|
|
RETURN.
|
|
ENDTRY.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD is_change_more_recent_than.
|
|
|
|
IF ( is_currently_changed-ldate > is_last_changed-ldate )
|
|
OR ( is_currently_changed-ldate = is_last_changed-ldate
|
|
AND is_currently_changed-ltime > is_last_changed-ltime ).
|
|
|
|
rv_is_change_more_recent = abap_true.
|
|
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD serialize_version.
|
|
|
|
DATA: li_document TYPE REF TO if_ixml_document,
|
|
lv_xml TYPE xstring,
|
|
lo_node TYPE REF TO if_ixml_element,
|
|
lo_download TYPE REF TO cl_apl_ecatt_download,
|
|
lv_object_type TYPE etobj_type.
|
|
|
|
lo_download = get_download( ).
|
|
|
|
lv_object_type = get_object_type( ).
|
|
|
|
zcl_abapgit_ecatt_helper=>build_xml_of_object(
|
|
EXPORTING
|
|
im_object_name = mv_object_name
|
|
im_object_version = iv_version
|
|
im_object_type = lv_object_type
|
|
io_download = lo_download
|
|
IMPORTING
|
|
ex_xml_stream = lv_xml ).
|
|
|
|
li_document = cl_ixml_80_20=>parse_to_document( stream_xstring = lv_xml ).
|
|
|
|
clear_attributes(
|
|
CHANGING
|
|
ci_document = li_document ).
|
|
|
|
clear_elements(
|
|
CHANGING
|
|
ci_document = li_document ).
|
|
|
|
lo_node = li_document->create_element( co_name-version ).
|
|
lo_node->append_child( li_document->get_root_element( ) ).
|
|
|
|
ci_node->append_child( lo_node ).
|
|
|
|
ENDMETHOD.
|
|
|
|
METHOD zif_abapgit_object~changed_by.
|
|
|
|
DATA: ls_last_changed TYPE ty_last_changed,
|
|
ls_currently_changed TYPE ty_last_changed,
|
|
lt_version_info TYPE etversinfo_tabtype,
|
|
lx_error TYPE REF TO cx_ecatt,
|
|
lv_text TYPE string,
|
|
lv_object_type TYPE etobj_type.
|
|
|
|
FIELD-SYMBOLS: <ls_version_info> LIKE LINE OF lt_version_info.
|
|
|
|
TRY.
|
|
lv_object_type = get_object_type( ).
|
|
|
|
cl_apl_ecatt_object=>get_version_info_object(
|
|
EXPORTING
|
|
im_name = mv_object_name
|
|
im_obj_type = lv_object_type
|
|
IMPORTING
|
|
ex_version_info = lt_version_info ).
|
|
|
|
LOOP AT lt_version_info ASSIGNING <ls_version_info>.
|
|
|
|
ls_currently_changed = get_change_information( <ls_version_info> ).
|
|
|
|
IF is_change_more_recent_than( is_currently_changed = ls_currently_changed
|
|
is_last_changed = ls_last_changed ) = abap_true.
|
|
|
|
ls_last_changed = ls_currently_changed.
|
|
|
|
ENDIF.
|
|
|
|
ENDLOOP.
|
|
|
|
CATCH cx_ecatt INTO lx_error.
|
|
lv_text = lx_error->get_text( ).
|
|
MESSAGE lv_text TYPE 'S' DISPLAY LIKE 'E'.
|
|
ENDTRY.
|
|
|
|
IF ls_last_changed-luser IS NOT INITIAL.
|
|
|
|
rv_user = ls_last_changed-luser.
|
|
|
|
ELSE.
|
|
|
|
rv_user = c_user_unknown.
|
|
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~compare_to_remote_version.
|
|
CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~delete.
|
|
|
|
DATA: lx_error TYPE REF TO cx_ecatt_apl,
|
|
lv_text TYPE string,
|
|
lv_object_type TYPE etobj_type.
|
|
|
|
lv_object_type = get_object_type( ).
|
|
|
|
TRY.
|
|
cl_apl_ecatt_object=>delete_object( im_obj_type = lv_object_type
|
|
im_name = mv_object_name
|
|
" we have to supply a version, so let's use the default version
|
|
" and delete them all
|
|
im_version = co_default_version
|
|
im_delete_all_versions = abap_true ).
|
|
|
|
CATCH cx_ecatt_apl INTO lx_error.
|
|
lv_text = lx_error->get_text( ).
|
|
zcx_abapgit_exception=>raise( lv_text ).
|
|
ENDTRY.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~deserialize.
|
|
|
|
DATA: li_document TYPE REF TO if_ixml_document,
|
|
li_versions TYPE REF TO if_ixml_node_collection,
|
|
li_version_iterator TYPE REF TO if_ixml_node_iterator,
|
|
lo_version_node TYPE REF TO if_ixml_node.
|
|
|
|
li_document = io_xml->get_raw( ).
|
|
|
|
li_versions = li_document->get_elements_by_tag_name( depth = 0
|
|
name = co_name-version ).
|
|
|
|
li_version_iterator = li_versions->create_iterator( ).
|
|
|
|
DO.
|
|
lo_version_node = li_version_iterator->get_next( ).
|
|
|
|
IF lo_version_node IS NOT BOUND.
|
|
EXIT.
|
|
ENDIF.
|
|
|
|
deserialize_version( ii_version_node = lo_version_node
|
|
iv_package = iv_package ).
|
|
|
|
ENDDO.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~exists.
|
|
|
|
DATA: lv_object_type TYPE etobj_type.
|
|
|
|
lv_object_type = get_object_type( ).
|
|
|
|
TRY.
|
|
rv_bool = cl_apl_ecatt_object=>existence_check_object( im_name = mv_object_name
|
|
im_version = co_default_version
|
|
im_obj_type = lv_object_type
|
|
im_exists_any_version = abap_true ).
|
|
|
|
CATCH cx_ecatt.
|
|
RETURN.
|
|
ENDTRY.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~get_metadata.
|
|
rs_metadata = get_metadata( ).
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~has_changed_since.
|
|
rv_changed = abap_true.
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~jump.
|
|
|
|
CALL FUNCTION 'RS_TOOL_ACCESS'
|
|
EXPORTING
|
|
operation = 'SHOW'
|
|
object_name = ms_item-obj_name
|
|
object_type = ms_item-obj_type
|
|
in_new_window = abap_true
|
|
EXCEPTIONS
|
|
not_executed = 1
|
|
invalid_object_type = 2
|
|
OTHERS = 3.
|
|
|
|
IF sy-subrc <> 0.
|
|
zcx_abapgit_exception=>raise( |Error { sy-subrc } from RS_TOOL_ACCESS | ).
|
|
ENDIF.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~serialize.
|
|
|
|
DATA:
|
|
lt_version_info TYPE etversinfo_tabtype,
|
|
li_document TYPE REF TO if_ixml_document,
|
|
lx_error TYPE REF TO cx_ecatt,
|
|
lv_text TYPE string,
|
|
lv_object_type TYPE etobj_type.
|
|
|
|
lv_object_type = get_object_type( ).
|
|
|
|
TRY.
|
|
cl_apl_ecatt_object=>get_version_info_object(
|
|
EXPORTING
|
|
im_name = mv_object_name
|
|
im_obj_type = lv_object_type
|
|
IMPORTING
|
|
ex_version_info = lt_version_info ).
|
|
|
|
li_document = cl_ixml=>create( )->create_document( ).
|
|
|
|
serialize_versions(
|
|
EXPORTING
|
|
it_version_info = lt_version_info
|
|
CHANGING
|
|
ci_document = li_document ).
|
|
|
|
io_xml->set_raw( li_document->get_root_element( ) ).
|
|
|
|
CATCH cx_ecatt INTO lx_error.
|
|
lv_text = lx_error->get_text( ).
|
|
MESSAGE lv_text TYPE 'S' DISPLAY LIKE 'E'.
|
|
ENDTRY.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD serialize_versions.
|
|
|
|
DATA: li_versions_node TYPE REF TO if_ixml_element.
|
|
FIELD-SYMBOLS: <ls_version_info> LIKE LINE OF it_version_info.
|
|
|
|
li_versions_node = ci_document->create_element( co_name-versions ).
|
|
|
|
IF lines( it_version_info ) > 0.
|
|
|
|
LOOP AT it_version_info ASSIGNING <ls_version_info>.
|
|
|
|
serialize_version(
|
|
EXPORTING
|
|
iv_version = <ls_version_info>-version
|
|
CHANGING
|
|
ci_node = li_versions_node ).
|
|
|
|
ENDLOOP.
|
|
|
|
ELSE.
|
|
|
|
serialize_version(
|
|
EXPORTING
|
|
iv_version = co_default_version
|
|
CHANGING
|
|
ci_node = li_versions_node ).
|
|
|
|
ENDIF.
|
|
|
|
ci_document->append_child( li_versions_node ).
|
|
|
|
ENDMETHOD.
|
|
|
|
METHOD zif_abapgit_object~is_locked.
|
|
|
|
DATA: lv_object TYPE seqg3-garg.
|
|
|
|
lv_object = ms_item-obj_name.
|
|
OVERLAY lv_object WITH ' '.
|
|
lv_object = lv_object && '*'.
|
|
|
|
rv_is_locked = exists_a_lock_entry_for( iv_lock_object = get_lock_object( )
|
|
iv_argument = lv_object ).
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD zif_abapgit_object~is_active.
|
|
rv_active = is_active( ).
|
|
ENDMETHOD.
|
|
ENDCLASS.
|
|
|