abapGit/src/objects/zcl_abapgit_object_tobj.clas.abap
2018-06-18 14:18:58 +02:00

310 lines
9.0 KiB
ABAP

CLASS zcl_abapgit_object_tobj DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super FINAL.
PUBLIC SECTION.
INTERFACES zif_abapgit_object.
ALIASES mo_files FOR zif_abapgit_object~mo_files.
PRIVATE SECTION.
TYPES: BEGIN OF ty_tobj,
tddat TYPE tddat,
tvdir TYPE tvdir,
tvimf TYPE STANDARD TABLE OF tvimf WITH DEFAULT KEY,
END OF ty_tobj.
METHODS:
read_extra IMPORTING iv_tabname TYPE vim_name
RETURNING VALUE(rs_tobj) TYPE ty_tobj,
update_extra IMPORTING is_tobj TYPE ty_tobj,
delete_extra IMPORTING iv_tabname TYPE vim_name.
ENDCLASS.
CLASS zcl_abapgit_object_tobj IMPLEMENTATION.
METHOD read_extra.
SELECT SINGLE * FROM tddat INTO rs_tobj-tddat WHERE tabname = iv_tabname.
SELECT SINGLE * FROM tvdir INTO rs_tobj-tvdir WHERE tabname = iv_tabname.
CLEAR: rs_tobj-tvdir-gendate, rs_tobj-tvdir-gentime.
SELECT * FROM tvimf INTO TABLE rs_tobj-tvimf WHERE tabname = iv_tabname.
ENDMETHOD.
METHOD update_extra.
MODIFY tddat FROM is_tobj-tddat.
MODIFY tvdir FROM is_tobj-tvdir.
MODIFY tvimf FROM TABLE is_tobj-tvimf.
ENDMETHOD.
METHOD delete_extra.
DELETE FROM tddat WHERE tabname = iv_tabname.
DELETE FROM tvdir WHERE tabname = iv_tabname.
DELETE FROM tvimf WHERE tabname = iv_tabname.
ENDMETHOD.
METHOD zif_abapgit_object~has_changed_since.
rv_changed = abap_true.
ENDMETHOD. "zif_abapgit_object~has_changed_since
METHOD zif_abapgit_object~changed_by.
DATA: lv_type_pos TYPE i.
lv_type_pos = strlen( ms_item-obj_name ) - 1.
SELECT SINGLE luser FROM objh INTO rv_user
WHERE objectname = ms_item-obj_name(lv_type_pos)
AND objecttype = ms_item-obj_name+lv_type_pos. "#EC CI_GENBUFF
IF sy-subrc <> 0.
rv_user = c_user_unknown.
ENDIF.
ENDMETHOD.
METHOD zif_abapgit_object~get_metadata.
rs_metadata = get_metadata( ).
rs_metadata-late_deser = abap_true.
ENDMETHOD. "zif_abapgit_object~get_metadata
METHOD zif_abapgit_object~exists.
DATA: lv_objectname TYPE objh-objectname,
lv_type_pos TYPE i.
lv_type_pos = strlen( ms_item-obj_name ) - 1.
SELECT SINGLE objectname FROM objh INTO lv_objectname
WHERE objectname = ms_item-obj_name(lv_type_pos)
AND objecttype = ms_item-obj_name+lv_type_pos. "#EC CI_GENBUFF
rv_bool = boolc( sy-subrc = 0 ).
ENDMETHOD. "zif_abapgit_object~exists
METHOD zif_abapgit_object~serialize.
DATA: ls_objh TYPE objh,
ls_objt TYPE objt,
lt_objs TYPE tt_objs,
lt_objsl TYPE tt_objsl,
lt_objm TYPE tt_objm,
ls_tobj TYPE ty_tobj,
lv_type_pos TYPE i.
lv_type_pos = strlen( ms_item-obj_name ) - 1.
ls_objh-objectname = ms_item-obj_name(lv_type_pos).
ls_objh-objecttype = ms_item-obj_name+lv_type_pos.
CALL FUNCTION 'CTO_OBJECT_GET'
EXPORTING
iv_objectname = ls_objh-objectname
iv_objecttype = ls_objh-objecttype
iv_language = mv_language
iv_sel_objt = abap_true
iv_sel_objs = abap_true
iv_sel_objsl = abap_true
iv_sel_objm = abap_true
IMPORTING
es_objh = ls_objh
es_objt = ls_objt
TABLES
tt_objs = lt_objs
tt_objsl = lt_objsl
tt_objm = lt_objm
EXCEPTIONS
object_not_defined = 1
OTHERS = 2.
IF sy-subrc = 1.
RETURN.
ELSEIF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from CTO_OBJECT_GET' ).
ENDIF.
CLEAR: ls_objh-luser,
ls_objh-ldate.
io_xml->add( iv_name = 'OBJH'
ig_data = ls_objh ).
io_xml->add( iv_name = 'OBJT'
ig_data = ls_objt ).
io_xml->add( iv_name = 'OBJS'
ig_data = lt_objs ).
io_xml->add( iv_name = 'OBJSL'
ig_data = lt_objsl ).
io_xml->add( iv_name = 'OBJM'
ig_data = lt_objm ).
ls_tobj = read_extra( ls_objh-objectname ).
io_xml->add( iv_name = 'TOBJ'
ig_data = ls_tobj ).
ENDMETHOD. "serialize
METHOD zif_abapgit_object~deserialize.
DATA: ls_objh TYPE objh,
ls_objt TYPE objt,
lt_objs TYPE tt_objs,
lt_objsl TYPE tt_objsl,
lt_objm TYPE tt_objm,
ls_tobj TYPE ty_tobj.
io_xml->read( EXPORTING iv_name = 'OBJH'
CHANGING cg_data = ls_objh ).
io_xml->read( EXPORTING iv_name = 'OBJT'
CHANGING cg_data = ls_objt ).
io_xml->read( EXPORTING iv_name = 'OBJS'
CHANGING cg_data = lt_objs ).
io_xml->read( EXPORTING iv_name = 'OBJSL'
CHANGING cg_data = lt_objsl ).
io_xml->read( EXPORTING iv_name = 'OBJM'
CHANGING cg_data = lt_objm ).
CALL FUNCTION 'OBJ_GENERATE'
EXPORTING
iv_objectname = ls_objh-objectname
iv_objecttype = ls_objh-objecttype
iv_maint_mode = 'I'
iv_objecttext = ls_objt-ddtext
iv_objcateg = ls_objh-objcateg
iv_objtransp = ls_objh-objtransp
iv_devclass = iv_package
TABLES
tt_v_obj_s = lt_objs
tt_objm = lt_objm
EXCEPTIONS
illegal_call = 1
object_not_found = 2
generate_error = 3
transport_error = 4
object_enqueue_failed = 5
OTHERS = 6.
IF sy-subrc <> 0.
* TOBJ has to be saved/generated after the DDIC tables have been
* activated - fixed with late deserialization
zcx_abapgit_exception=>raise( 'error from OBJ_GENERATE' ).
ENDIF.
CALL FUNCTION 'OBJ_SET_IMPORTABLE'
EXPORTING
iv_objectname = ls_objh-objectname
iv_objecttype = ls_objh-objecttype
iv_importable = ls_objh-importable
EXCEPTIONS
object_not_defined = 1
invalid = 2
transport_error = 3
object_enqueue_failed = 4
OTHERS = 5.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from OBJ_SET_IMPORTABLE' ).
ENDIF.
* fm OBJ_GENERATE takes the defaults from the DDIC object
* set OBJTRANSP directly, should be okay looking at the code in OBJ_SET_IMPORTABLE
* locking has been done in OBJ_SET_IMPORTABLE plus recording of transport
UPDATE objh SET objtransp = ls_objh-objtransp
WHERE objectname = ls_objh-objectname
AND objecttype = ls_objh-objecttype.
io_xml->read( EXPORTING iv_name = 'TOBJ'
CHANGING cg_data = ls_tobj ).
ls_tobj-tvdir-gendate = sy-datum.
ls_tobj-tvdir-gentime = sy-uzeit.
update_extra( ls_tobj ).
ENDMETHOD.
METHOD zif_abapgit_object~delete.
DATA: ls_objh TYPE objh,
lv_type_pos TYPE i.
lv_type_pos = strlen( ms_item-obj_name ) - 1.
ls_objh-objectname = ms_item-obj_name(lv_type_pos).
ls_objh-objecttype = ms_item-obj_name+lv_type_pos.
CALL FUNCTION 'OBJ_GENERATE'
EXPORTING
iv_objectname = ls_objh-objectname
iv_objecttype = ls_objh-objecttype
iv_maint_mode = 'D'
EXCEPTIONS
illegal_call = 1
object_not_found = 2
generate_error = 3
transport_error = 4
object_enqueue_failed = 5
OTHERS = 6.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from OBJ_GENERATE' ).
ENDIF.
delete_extra( ls_objh-objectname ).
ENDMETHOD. "delete
METHOD zif_abapgit_object~jump.
DATA: ls_bcdata TYPE bdcdata,
lt_bcdata TYPE STANDARD TABLE OF bdcdata.
ls_bcdata-program = 'SAPMSVIM'.
ls_bcdata-dynpro = '0050'.
ls_bcdata-dynbegin = 'X'.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'VIMDYNFLDS-VIEWNAME'.
ls_bcdata-fval = substring( val = ms_item-obj_name
len = strlen( ms_item-obj_name ) - 1 ).
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'VIMDYNFLDS-ELEM_GEN'.
ls_bcdata-fval = abap_true.
APPEND ls_bcdata TO lt_bcdata.
CLEAR ls_bcdata.
ls_bcdata-fnam = 'BDC_OKCODE'.
ls_bcdata-fval = '=SHOW'.
APPEND ls_bcdata TO lt_bcdata.
CALL FUNCTION 'ABAP4_CALL_TRANSACTION'
STARTING NEW TASK 'GIT'
EXPORTING
tcode = 'SE54'
mode_val = 'E'
TABLES
using_tab = lt_bcdata
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
zcx_abapgit_exception=>raise( 'error from ABAP4_CALL_TRANSACTION, TOBJ' ).
ENDIF.
ENDMETHOD. "jump
METHOD zif_abapgit_object~compare_to_remote_version.
CREATE OBJECT ro_comparison_result TYPE zcl_abapgit_comparison_null.
ENDMETHOD.
METHOD zif_abapgit_object~is_locked.
rv_is_locked = abap_false.
ENDMETHOD.
ENDCLASS. "zcl_abapgit_object_tobj IMPLEMENTATION