diff --git a/docs/ref-supported.md b/docs/ref-supported.md index b9e06e6bd..70f44dd8d 100644 --- a/docs/ref-supported.md +++ b/docs/ref-supported.md @@ -82,7 +82,7 @@ SHLP | Search Help | Yes SHMA | Shared Objects: Defined Area Attributes | Yes SICF | ICF Service | Yes SMIM | Info Object from the MIME Repository | Yes -SOTS | All Concepts (OTR) of a Package - Long Texts | [#792](https://github.com/larshp/abapGit/issues/792) +SOTS | All Concepts (OTR) of a Package - Long Texts | Yes SPLO | Format Types | Yes SPRX | Proxy Object | [#87](https://github.com/larshp/abapGit/issues/87) SQSC | Database Procedure Proxy | Yes diff --git a/src/objects/zcl_abapgit_object_sots.clas.abap b/src/objects/zcl_abapgit_object_sots.clas.abap new file mode 100644 index 000000000..0534d2456 --- /dev/null +++ b/src/objects/zcl_abapgit_object_sots.clas.abap @@ -0,0 +1,367 @@ +CLASS zcl_abapgit_object_sots DEFINITION INHERITING FROM zcl_abapgit_objects_super + PUBLIC + FINAL + CREATE PUBLIC . + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_object. + + ALIASES: + mo_files FOR zif_abapgit_object~mo_files. + + PRIVATE SECTION. + TYPES: + BEGIN OF ty_sots, + header TYPE sotr_headu, + entries TYPE sotr_textl_tt, + END OF ty_sots, + tty_sots TYPE STANDARD TABLE OF ty_sots + WITH NON-UNIQUE DEFAULT KEY. + + METHODS: + read_sots + RETURNING + VALUE(rt_sots) TYPE tty_sots, + + create_sots + IMPORTING + is_sots TYPE ty_sots + iv_package TYPE devclass + iv_object TYPE trobjtype + RAISING + zcx_abapgit_exception, + + get_raw_text_filename + IMPORTING + is_entry TYPE sotr_textl + RETURNING + VALUE(rv_filename) TYPE string. + +ENDCLASS. + + + +CLASS zcl_abapgit_object_sots IMPLEMENTATION. + + + METHOD zif_abapgit_object~changed_by. + rv_user = c_user_unknown. + 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: lt_sots TYPE tty_sots. + + FIELD-SYMBOLS: TYPE ty_sots. + + lt_sots = read_sots( ). + + LOOP AT lt_sots ASSIGNING . + + CALL FUNCTION 'BTFR_DELETE_SINGLE_TEXT' + EXPORTING + concept = -header-concept + flag_string = abap_true + EXCEPTIONS + text_not_found = 1 + invalid_package = 2 + text_not_changeable = 3 + text_enqueued = 4 + no_correction = 5 + parameter_error = 6 + OTHERS = 7. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error in BTFR_DELETE_SINGLE_TEXT subrc={ sy-subrc }| ). + ENDIF. + + ENDLOOP. + + ENDMETHOD. + + + METHOD zif_abapgit_object~deserialize. + + DATA: lt_sots TYPE tty_sots, + lt_objects TYPE sotr_objects, + lv_object LIKE LINE OF lt_objects, + lx_error TYPE REF TO zcx_abapgit_exception. + + FIELD-SYMBOLS: TYPE ty_sots, + LIKE LINE OF -entries. + + io_xml->read( + EXPORTING + iv_name = 'SOTS' + CHANGING + cg_data = lt_sots ). + + tadir_insert( iv_package ). + + LOOP AT lt_sots ASSIGNING . + + CLEAR: lt_objects. + + CALL FUNCTION 'SOTR_OBJECT_GET_OBJECTS' + EXPORTING + object_vector = -header-objid_vec + IMPORTING + objects = lt_objects + EXCEPTIONS + object_not_found = 1 + OTHERS = 2. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( 'error from SOTR_OBJECT_GET_OBJECTS' ). + ENDIF. + + READ TABLE lt_objects INDEX 1 INTO lv_object. + ASSERT sy-subrc = 0. + + LOOP AT -entries ASSIGNING . + + TRY. + -text = mo_files->read_string( iv_extra = get_raw_text_filename( ) + iv_ext = 'txt' ). + + CATCH zcx_abapgit_exception INTO lx_error. + " Most probably file not found -> ignore + CONTINUE. + ENDTRY. + + ENDLOOP. + + create_sots( + is_sots = + iv_package = iv_package + iv_object = lv_object ). + + ENDLOOP. + + ENDMETHOD. + + + METHOD zif_abapgit_object~exists. + + DATA: lv_object_type TYPE trobjtype, + lv_object_name TYPE trobj_name. + + lv_object_type = ms_item-obj_type. + lv_object_name = ms_item-obj_name. + + CALL FUNCTION 'SOTR_WBO_OBJECTS_CHECK' + EXPORTING + pgmid = 'R3TR' + object = lv_object_type + obj_name = lv_object_name + IMPORTING + object_exist = rv_bool + EXCEPTIONS + unknown_object = 1 + OTHERS = 2. + + IF sy-subrc <> 0. + rv_bool = abap_false. + ENDIF. + + 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~is_active. + rv_active = is_active( ). + ENDMETHOD. + + + METHOD zif_abapgit_object~is_locked. + rv_is_locked = abap_false. + ENDMETHOD. + + + METHOD zif_abapgit_object~jump. + + CALL FUNCTION 'RS_TOOL_ACCESS_REMOTE' + DESTINATION 'NONE' + EXPORTING + operation = 'SHOW' + object_name = ms_item-obj_name + object_type = ms_item-obj_type + EXCEPTIONS + not_executed = 1 + invalid_object_type = 2 + OTHERS = 3. + + IF sy-subrc <> 0. + zcx_abapgit_exception=>raise( |Error from RS_TOOL_ACCESS Subrc={ sy-subrc }| ). + ENDIF. + + ENDMETHOD. + + + METHOD zif_abapgit_object~serialize. + + DATA: lt_sots TYPE tty_sots. + + FIELD-SYMBOLS: TYPE ty_sots, + TYPE sotr_textl. + + lt_sots = read_sots( ). + + LOOP AT lt_sots ASSIGNING . + + LOOP AT -entries ASSIGNING . + + mo_files->add_string( iv_extra = get_raw_text_filename( ) + iv_ext = 'txt' + iv_string = -text ). + + CLEAR: -text. + + ENDLOOP. + + ENDLOOP. + + io_xml->add( iv_name = 'SOTS' + ig_data = lt_sots ). + + ENDMETHOD. + + METHOD read_sots. + + DATA: lt_sotr_head TYPE STANDARD TABLE OF sotr_headu, + ls_sots LIKE LINE OF rt_sots. + + FIELD-SYMBOLS: TYPE sotr_head, + LIKE LINE OF ls_sots-entries. + + + SELECT * FROM sotr_headu + INTO TABLE lt_sotr_head + WHERE paket = ms_item-obj_name + ORDER BY PRIMARY KEY. + + LOOP AT lt_sotr_head ASSIGNING . + + CLEAR: ls_sots. + + CALL FUNCTION 'SOTR_STRING_GET_CONCEPT' + EXPORTING + concept = -concept + IMPORTING + header = ls_sots-header + entries = ls_sots-entries + EXCEPTIONS + no_entry_found = 1 + OTHERS = 2. + + IF sy-subrc <> 0. + CONTINUE. + ENDIF. + + CLEAR: + ls_sots-header-paket, + ls_sots-header-crea_name, + ls_sots-header-crea_tstut, + ls_sots-header-chan_name, + ls_sots-header-chan_tstut. + + LOOP AT ls_sots-entries ASSIGNING . + CLEAR: -version, + -crea_name, + -crea_tstut, + -chan_name, + -chan_tstut. + ENDLOOP. + + INSERT ls_sots INTO TABLE rt_sots. + + ENDLOOP. + + ENDMETHOD. + + + METHOD create_sots. + + " Reimplementation of SOTR_STRING_CREATE_CONCEPT because we can't supply + " concept and it would then be generated. + + DATA: lv_subrc TYPE sy-subrc, + lv_source_langu TYPE spras, + ls_header TYPE btfr_head, + lv_flag_is_string TYPE btfr_flag VALUE abap_true, + lv_text_tab TYPE sotr_text_tt, + lv_concept_default TYPE sotr_conc, + lt_entries TYPE sotr_textl_tt, + lv_concept LIKE is_sots-header-concept, + lv_flag_correction_entry TYPE abap_bool VALUE abap_true. + + lt_entries = is_sots-entries. + + ls_header-paket = iv_package. + ls_header-crea_lan = mv_language. + ls_header-alias_name = is_sots-header-alias_name. + lv_source_langu = mv_language. + lv_concept = is_sots-header-concept. + + PERFORM btfr_create + IN PROGRAM saplsotr_db_string + USING iv_object + lv_source_langu + lv_flag_correction_entry + lv_flag_is_string + CHANGING lv_text_tab + lt_entries + ls_header + lv_concept + lv_concept_default + lv_subrc. + + CASE lv_subrc. + WHEN 1. + zcx_abapgit_exception=>raise( |No entry found| ). + WHEN 2. + zcx_abapgit_exception=>raise( |OTR concept not found| ). + WHEN 3. + zcx_abapgit_exception=>raise( |Enter a permitted object type| ). + WHEN 4. + zcx_abapgit_exception=>raise( |The concept will be created in the non-original system| ). + WHEN 5. + zcx_abapgit_exception=>raise( |Invalid alias| ). + WHEN 6. + zcx_abapgit_exception=>raise( |No correction entry has been created| ). + WHEN 7. + zcx_abapgit_exception=>raise( |Error in database operation| ). + WHEN 9. + zcx_abapgit_exception=>raise( |Action canceled by user| ). + ENDCASE. + + ENDMETHOD. + + + METHOD get_raw_text_filename. + + rv_filename = + to_lower( |{ is_entry-concept }_| + && |{ is_entry-langu }_| + && |{ is_entry-object }_| + && |{ is_entry-lfd_num }| ). + + ENDMETHOD. + +ENDCLASS. diff --git a/src/objects/zcl_abapgit_object_sots.clas.xml b/src/objects/zcl_abapgit_object_sots.clas.xml new file mode 100644 index 000000000..10eb4d8ac --- /dev/null +++ b/src/objects/zcl_abapgit_object_sots.clas.xml @@ -0,0 +1,17 @@ + + + + + + ZCL_ABAPGIT_OBJECT_SOTS + 1 + E + abapGit SOTS + 1 + X + X + X + + + +