CLASS zcl_abapgit_object_nspc DEFINITION PUBLIC INHERITING FROM zcl_abapgit_objects_super CREATE PUBLIC . PUBLIC SECTION. INTERFACES zif_abapgit_object . PROTECTED SECTION. PRIVATE SECTION. TYPES: BEGIN OF ty_nspc, namespace TYPE trnspacet-namespace, replicense TYPE trnspacet-replicense, sscrflag TYPE trnspacet-sscrflag, sapflag TYPE trnspacet-sapflag, gen_only TYPE trnspacet-gen_only, END OF ty_nspc . TYPES: BEGIN OF ty_nspc_text, spras TYPE trnspacett-spras, descriptn TYPE trnspacett-descriptn, owner TYPE trnspacett-owner, END OF ty_nspc_text . TYPES: ty_nspc_texts TYPE STANDARD TABLE OF ty_nspc_text . METHODS serialize_texts IMPORTING !ii_xml TYPE REF TO zif_abapgit_xml_output RAISING zcx_abapgit_exception . METHODS deserialize_texts IMPORTING !ii_xml TYPE REF TO zif_abapgit_xml_input !iv_namespace TYPE namespace RAISING zcx_abapgit_exception . METHODS add_to_transport IMPORTING !iv_package TYPE devclass RAISING zcx_abapgit_exception . ENDCLASS. CLASS zcl_abapgit_object_nspc IMPLEMENTATION. METHOD add_to_transport. DATA: li_sap_package TYPE REF TO zif_abapgit_sap_package. li_sap_package = zcl_abapgit_factory=>get_sap_package( iv_package ). IF li_sap_package->are_changes_recorded_in_tr_req( ) = abap_true. corr_insert( iv_package ). ENDIF. ENDMETHOD. METHOD deserialize_texts. DATA: ls_trnspacett TYPE trnspacett, lt_i18n_langs TYPE TABLE OF langu, lt_nspc_texts TYPE ty_nspc_texts. FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, LIKE LINE OF lt_nspc_texts. ii_xml->read( EXPORTING iv_name = 'I18N_LANGS' CHANGING cg_data = lt_i18n_langs ). ii_xml->read( EXPORTING iv_name = 'NSPC_TEXTS' CHANGING cg_data = lt_nspc_texts ). SORT lt_i18n_langs. SORT lt_nspc_texts BY spras. " Optimization LOOP AT lt_i18n_langs ASSIGNING . ls_trnspacett-namespace = iv_namespace. READ TABLE lt_nspc_texts ASSIGNING WITH KEY spras = . IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |NSPC_TEXTS cannot find lang { } in XML| ). ENDIF. MOVE-CORRESPONDING TO ls_trnspacett. MODIFY trnspacett FROM ls_trnspacett. IF sy-subrc <> 0. INSERT trnspacett FROM ls_trnspacett. ENDIF. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error upserting text for namespace| ). ENDIF. ENDLOOP. ENDMETHOD. METHOD serialize_texts. DATA: ls_trnspacett TYPE trnspacett, lt_nspc_texts TYPE ty_nspc_texts, lt_i18n_langs TYPE TABLE OF langu. FIELD-SYMBOLS: LIKE LINE OF lt_i18n_langs, LIKE LINE OF lt_nspc_texts. IF ii_xml->i18n_params( )-main_language_only = abap_true. RETURN. ENDIF. " Collect additional languages, skip main lang - it was serialized already SELECT DISTINCT spras AS langu FROM trnspacett INTO TABLE lt_i18n_langs WHERE namespace = ms_item-obj_name AND spras <> mv_language. "#EC CI_SUBRC LOOP AT lt_i18n_langs ASSIGNING . SELECT SINGLE * FROM trnspacett INTO ls_trnspacett WHERE namespace = ms_item-obj_name AND spras = . IF sy-subrc = 0. APPEND INITIAL LINE TO lt_nspc_texts ASSIGNING . MOVE-CORRESPONDING ls_trnspacett TO . ENDIF. ENDLOOP. SORT lt_i18n_langs ASCENDING. SORT lt_nspc_texts BY spras ASCENDING. IF lines( lt_i18n_langs ) > 0. ii_xml->add( iv_name = 'I18N_LANGS' ig_data = lt_i18n_langs ). ii_xml->add( iv_name = 'NSPC_TEXTS' ig_data = lt_nspc_texts ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~changed_by. SELECT SINGLE changeuser FROM trnspacet INTO rv_user WHERE namespace = ms_item-obj_name. IF sy-subrc <> 0. rv_user = c_user_unknown. ENDIF. ENDMETHOD. METHOD zif_abapgit_object~delete. RETURN. " not supported ENDMETHOD. METHOD zif_abapgit_object~deserialize. DATA: ls_nspc TYPE ty_nspc, ls_nspc_text TYPE ty_nspc_text, lv_modifiable TYPE abap_bool, ls_trnspacet TYPE trnspacet, ls_trnspacett TYPE trnspacett. io_xml->read( EXPORTING iv_name = 'NSPC' CHANGING cg_data = ls_nspc ). io_xml->read( EXPORTING iv_name = 'NSPC_TEXT' CHANGING cg_data = ls_nspc_text ). add_to_transport( iv_package ). SELECT SINGLE * FROM trnspacet INTO ls_trnspacet WHERE namespace = ls_nspc-namespace. IF sy-subrc = 0. " For existing namespace, check if it's modifiable (SE03) SELECT SINGLE editflag FROM trnspace INTO lv_modifiable WHERE namespace = ls_nspc-namespace. IF sy-subrc = 0 AND lv_modifiable = abap_false. zcx_abapgit_exception=>raise( |Namespace is not modifiable| ). ENDIF. " keep existing role ls_trnspacet-replicense = ls_nspc-replicense. ls_trnspacet-sscrflag = ls_nspc-sscrflag. ls_trnspacet-sapflag = ls_nspc-sapflag. ls_trnspacet-gen_only = ls_nspc-gen_only. ls_trnspacet-changeuser = sy-uname. ls_trnspacet-changedate = sy-datum. MODIFY trnspacet FROM ls_trnspacet. ELSE. MOVE-CORRESPONDING ls_nspc TO ls_trnspacet. ls_trnspacet-role = 'C'. " customer repair license ls_trnspacet-changeuser = sy-uname. ls_trnspacet-changedate = sy-datum. INSERT trnspacet FROM ls_trnspacet. ENDIF. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error upserting namespace| ). ENDIF. SELECT SINGLE * FROM trnspacett INTO ls_trnspacett WHERE namespace = ls_nspc-namespace AND spras = mv_language. IF sy-subrc = 0. ls_trnspacett-descriptn = ls_nspc_text-descriptn. ls_trnspacett-owner = ls_nspc_text-owner. MODIFY trnspacett FROM ls_trnspacett. ELSE. MOVE-CORRESPONDING ls_nspc_text TO ls_trnspacett. ls_trnspacett-namespace = ls_nspc-namespace. INSERT trnspacett FROM ls_trnspacett. ENDIF. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error upserting text for namespace| ). ENDIF. deserialize_texts( ii_xml = io_xml iv_namespace = ls_nspc-namespace ). " Fill trnspace and trnspacel tables CALL FUNCTION 'TR_ACTIVATE_NAMESPACE' EXPORTING iv_namespace = ls_nspc-namespace EXCEPTIONS deletion_not_allowed = 1 OTHERS = 2. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( |Error activating namespace| ). ENDIF. " Make namespace modifiable UPDATE trnspace SET editflag = abap_true WHERE namespace = ls_nspc-namespace. ENDMETHOD. METHOD zif_abapgit_object~exists. DATA lv_namespace TYPE trnspace-namespace. lv_namespace = ms_item-obj_name. CALL FUNCTION 'TR_CHECK_NAMESPACE' EXPORTING iv_namespace = lv_namespace EXCEPTIONS namespace_not_valid = 1 OTHERS = 2. rv_bool = boolc( sy-subrc = 0 ). 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 zif_abapgit_object~get_metadata. rs_metadata = get_metadata( ). ENDMETHOD. METHOD zif_abapgit_object~is_active. rv_active = zif_abapgit_object~exists( ). ENDMETHOD. METHOD zif_abapgit_object~is_locked. rv_is_locked = abap_false. ENDMETHOD. METHOD zif_abapgit_object~jump. " Launch general maintenance for namespaces CALL FUNCTION 'VIEW_MAINTENANCE_CALL' EXPORTING action = 'S' view_name = 'V_TRNSPACE' no_warning_for_clientindep = 'X' variant_for_selection = 'STANDARD' EXCEPTIONS client_reference = 1 foreign_lock = 2 invalid_action = 3 no_clientindependent_auth = 4 no_database_function = 5 no_editor_function = 6 no_show_auth = 7 no_tvdir_entry = 8 no_upd_auth = 9 only_show_allowed = 10 system_failure = 11 unknown_field_in_dba_sellist = 12 view_not_found = 13 OTHERS = 14. IF sy-subrc <> 0. zcx_abapgit_exception=>raise_t100( ). ENDIF. ENDMETHOD. METHOD zif_abapgit_object~serialize. DATA: ls_nspc TYPE ty_nspc, ls_nspc_text TYPE ty_nspc_text. SELECT SINGLE * FROM trnspacet INTO CORRESPONDING FIELDS OF ls_nspc WHERE namespace = ms_item-obj_name. SELECT SINGLE * FROM trnspacett INTO CORRESPONDING FIELDS OF ls_nspc_text WHERE namespace = ms_item-obj_name AND spras = mv_language. io_xml->add( iv_name = 'NSPC' ig_data = ls_nspc ). io_xml->add( iv_name = 'NSPC_TEXT' ig_data = ls_nspc_text ). serialize_texts( io_xml ). ENDMETHOD. ENDCLASS.