CLASS zcl_abapgit_persist_migrate DEFINITION PUBLIC CREATE PUBLIC. PUBLIC SECTION. CLASS-METHODS: run RAISING zcx_abapgit_exception. PRIVATE SECTION. TYPES: BEGIN OF ty_settings_to_migrate, name TYPE string, value TYPE string, END OF ty_settings_to_migrate, tty_settings_to_migrate TYPE STANDARD TABLE OF ty_settings_to_migrate WITH NON-UNIQUE DEFAULT KEY. CONSTANTS c_text TYPE string VALUE 'Generated by abapGit' ##NO_TEXT. CLASS-METHODS table_create RAISING zcx_abapgit_exception . CLASS-METHODS table_exists RETURNING VALUE(rv_exists) TYPE abap_bool . CLASS-METHODS lock_create RAISING zcx_abapgit_exception . CLASS-METHODS lock_exists RETURNING VALUE(rv_exists) TYPE abap_bool . CLASS-METHODS migrate_settings RAISING zcx_abapgit_exception. CLASS-METHODS migrate_setting IMPORTING iv_name TYPE string CHANGING ct_settings_to_migrate TYPE tty_settings_to_migrate ci_document TYPE REF TO if_ixml_document. CLASS-METHODS distribute_settings_to_users IMPORTING it_settings_to_migrate TYPE tty_settings_to_migrate RAISING zcx_abapgit_exception. CLASS-METHODS update_global_settings IMPORTING ii_document TYPE REF TO if_ixml_document RAISING zcx_abapgit_exception. CLASS-METHODS read_global_settings_xml RETURNING VALUE(rv_global_settings_xml) TYPE string RAISING zcx_abapgit_not_found. CLASS-METHODS get_global_settings_document RETURNING VALUE(ri_global_settings_dom) TYPE REF TO if_ixml_document RAISING zcx_abapgit_not_found. ENDCLASS. CLASS zcl_abapgit_persist_migrate IMPLEMENTATION. METHOD distribute_settings_to_users. DATA: lt_abapgit_users TYPE STANDARD TABLE OF char12 WITH NON-UNIQUE DEFAULT KEY, ls_user_settings TYPE zcl_abapgit_settings=>ty_s_user_settings, lo_user_persistence TYPE REF TO zcl_abapgit_persistence_user. FIELD-SYMBOLS: LIKE LINE OF lt_abapgit_users, TYPE zcl_abapgit_persist_migrate=>ty_settings_to_migrate, TYPE data. " distribute settings to all abapGit users SELECT value FROM (zcl_abapgit_persistence_db=>c_tabname) INTO TABLE lt_abapgit_users WHERE type = zcl_abapgit_persistence_db=>c_type_user. LOOP AT lt_abapgit_users ASSIGNING . lo_user_persistence = zcl_abapgit_persistence_user=>get_instance( ). ls_user_settings = lo_user_persistence->get_settings( ). LOOP AT it_settings_to_migrate ASSIGNING . ASSIGN COMPONENT -name OF STRUCTURE ls_user_settings TO . ASSERT sy-subrc = 0. = -value. ENDLOOP. lo_user_persistence->set_settings( ls_user_settings ). ENDLOOP. ENDMETHOD. METHOD lock_create. DATA: lv_obj_name TYPE tadir-obj_name, ls_dd25v TYPE dd25v, lt_dd26e TYPE STANDARD TABLE OF dd26e WITH DEFAULT KEY, lt_dd27p TYPE STANDARD TABLE OF dd27p WITH DEFAULT KEY. FIELD-SYMBOLS: LIKE LINE OF lt_dd26e, LIKE LINE OF lt_dd27p. ls_dd25v-viewname = zcl_abapgit_persistence_db=>c_lock. ls_dd25v-aggtype = 'E'. ls_dd25v-roottab = zcl_abapgit_persistence_db=>c_tabname. ls_dd25v-ddlanguage = zif_abapgit_definitions=>gc_english. ls_dd25v-ddtext = c_text. APPEND INITIAL LINE TO lt_dd26e ASSIGNING . -viewname = zcl_abapgit_persistence_db=>c_lock. -tabname = zcl_abapgit_persistence_db=>c_tabname. -tabpos = '0001'. -fortabname = zcl_abapgit_persistence_db=>c_tabname. -enqmode = 'E'. APPEND INITIAL LINE TO lt_dd27p ASSIGNING . -viewname = zcl_abapgit_persistence_db=>c_lock. -objpos = '0001'. -viewfield = 'TYPE'. -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'TYPE'. -keyflag = abap_true. APPEND INITIAL LINE TO lt_dd27p ASSIGNING . -viewname = zcl_abapgit_persistence_db=>c_lock. -objpos = '0002'. -viewfield = 'VALUE'. -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'VALUE'. -keyflag = abap_true. CALL FUNCTION 'DDIF_ENQU_PUT' EXPORTING name = zcl_abapgit_persistence_db=>c_lock dd25v_wa = ls_dd25v TABLES dd26e_tab = lt_dd26e dd27p_tab = lt_dd27p EXCEPTIONS enqu_not_found = 1 name_inconsistent = 2 enqu_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from DDIF_ENQU_PUT' ). ENDIF. lv_obj_name = zcl_abapgit_persistence_db=>c_lock. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'ENQU' wi_tadir_obj_name = lv_obj_name wi_set_genflag = abap_true wi_test_modus = abap_false wi_tadir_devclass = '$TMP' EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from TR_TADIR_INTERFACE' ). ENDIF. CALL FUNCTION 'DDIF_ENQU_ACTIVATE' EXPORTING name = zcl_abapgit_persistence_db=>c_lock EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from DDIF_ENQU_ACTIVATE' ). ENDIF. ENDMETHOD. METHOD lock_exists. DATA: lv_viewname TYPE dd25l-viewname. SELECT SINGLE viewname FROM dd25l INTO lv_viewname WHERE viewname = zcl_abapgit_persistence_db=>c_lock. rv_exists = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD migrate_setting. DATA: lo_element TYPE REF TO if_ixml_element, ls_setting_to_migrate LIKE LINE OF ct_settings_to_migrate. lo_element = ci_document->find_from_name( iv_name ). IF lo_element IS BOUND. " The element is present in the global config. " Therefore we have to migrate it ls_setting_to_migrate-name = iv_name. ls_setting_to_migrate-value = lo_element->get_value( ). INSERT ls_setting_to_migrate INTO TABLE ct_settings_to_migrate. lo_element->remove_node( ). ENDIF. ENDMETHOD. METHOD migrate_settings. DATA: li_global_settings_document TYPE REF TO if_ixml_document, lt_settings_to_migrate TYPE tty_settings_to_migrate, lx_error TYPE REF TO zcx_abapgit_not_found. " migrate global settings to user specific settings TRY. li_global_settings_document = get_global_settings_document( ). CATCH zcx_abapgit_not_found INTO lx_error. " No global settings available, nothing todo. RETURN. ENDTRY. migrate_setting( EXPORTING iv_name = |MAX_LINES| CHANGING ct_settings_to_migrate = lt_settings_to_migrate ci_document = li_global_settings_document ). migrate_setting( EXPORTING iv_name = |ADT_JUMP_ENABLED| CHANGING ct_settings_to_migrate = lt_settings_to_migrate ci_document = li_global_settings_document ). IF lines( lt_settings_to_migrate ) > 0. distribute_settings_to_users( lt_settings_to_migrate ). update_global_settings( li_global_settings_document ). ENDIF. ENDMETHOD. METHOD run. IF table_exists( ) = abap_false. table_create( ). ENDIF. IF lock_exists( ) = abap_false. lock_create( ). ENDIF. migrate_settings( ). ENDMETHOD. METHOD table_create. DATA: lv_rc LIKE sy-subrc, lv_obj_name TYPE tadir-obj_name, ls_dd02v TYPE dd02v, ls_dd09l TYPE dd09l, lt_dd03p TYPE STANDARD TABLE OF dd03p WITH DEFAULT KEY. FIELD-SYMBOLS: LIKE LINE OF lt_dd03p. ls_dd02v-tabname = zcl_abapgit_persistence_db=>c_tabname. ls_dd02v-ddlanguage = zif_abapgit_definitions=>gc_english. ls_dd02v-tabclass = 'TRANSP'. ls_dd02v-ddtext = c_text. ls_dd02v-contflag = 'A'. ls_dd02v-exclass = '1'. ls_dd09l-tabname = zcl_abapgit_persistence_db=>c_tabname. ls_dd09l-as4local = 'A'. ls_dd09l-tabkat = '1'. ls_dd09l-tabart = 'APPL1'. ls_dd09l-bufallow = 'N'. APPEND INITIAL LINE TO lt_dd03p ASSIGNING . -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'TYPE'. -position = '0001'. -keyflag = 'X'. -datatype = 'CHAR'. -leng = '000012'. APPEND INITIAL LINE TO lt_dd03p ASSIGNING . -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'VALUE'. -position = '0002'. -keyflag = 'X'. -datatype = 'CHAR'. -leng = '000012'. APPEND INITIAL LINE TO lt_dd03p ASSIGNING . -tabname = zcl_abapgit_persistence_db=>c_tabname. -fieldname = 'DATA_STR'. -position = '0003'. -datatype = 'STRG'. CALL FUNCTION 'DDIF_TABL_PUT' EXPORTING name = zcl_abapgit_persistence_db=>c_tabname dd02v_wa = ls_dd02v dd09l_wa = ls_dd09l TABLES dd03p_tab = lt_dd03p EXCEPTIONS tabl_not_found = 1 name_inconsistent = 2 tabl_inconsistent = 3 put_failure = 4 put_refused = 5 OTHERS = 6. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from DDIF_TABL_PUT' ). ENDIF. lv_obj_name = zcl_abapgit_persistence_db=>c_tabname. CALL FUNCTION 'TR_TADIR_INTERFACE' EXPORTING wi_tadir_pgmid = 'R3TR' wi_tadir_object = 'TABL' wi_tadir_obj_name = lv_obj_name wi_set_genflag = abap_true wi_test_modus = abap_false wi_tadir_devclass = '$TMP' EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from TR_TADIR_INTERFACE' ). ENDIF. CALL FUNCTION 'DDIF_TABL_ACTIVATE' EXPORTING name = zcl_abapgit_persistence_db=>c_tabname auth_chk = abap_false IMPORTING rc = lv_rc EXCEPTIONS not_found = 1 put_failure = 2 OTHERS = 3. IF sy-subrc <> 0 OR lv_rc <> 0. zcx_abapgit_exception=>raise( 'migrate, error from DDIF_TABL_ACTIVATE' ). ENDIF. ENDMETHOD. METHOD table_exists. DATA: lv_tabname TYPE dd02l-tabname. SELECT SINGLE tabname FROM dd02l INTO lv_tabname WHERE tabname = zcl_abapgit_persistence_db=>c_tabname. rv_exists = boolc( sy-subrc = 0 ). ENDMETHOD. METHOD update_global_settings. DATA: lv_settings_xml TYPE string. " finally update global settings " migrated elements are already removed from document lv_settings_xml = cl_ixml_80_20=>render_to_string( ii_document ). zcl_abapgit_persistence_db=>get_instance( )->update( iv_type = zcl_abapgit_persistence_db=>c_type_settings iv_value = '' iv_data = lv_settings_xml ). ENDMETHOD. METHOD read_global_settings_xml. rv_global_settings_xml = zcl_abapgit_persistence_db=>get_instance( )->read( iv_type = zcl_abapgit_persistence_db=>c_type_settings iv_value = '' ). ENDMETHOD. METHOD get_global_settings_document. DATA: lv_global_settings_xml TYPE string. lv_global_settings_xml = read_global_settings_xml( ). ri_global_settings_dom = cl_ixml_80_20=>parse_to_document( stream_string = lv_global_settings_xml ). ENDMETHOD. ENDCLASS.