diff --git a/src/objects/zif_abapgit_object.intf.abap b/src/objects/zif_abapgit_object.intf.abap index 66ab7406e..1117888f2 100644 --- a/src/objects/zif_abapgit_object.intf.abap +++ b/src/objects/zif_abapgit_object.intf.abap @@ -1,9 +1,22 @@ INTERFACE zif_abapgit_object PUBLIC . + TYPES: + ty_deserialization_step TYPE string. + TYPES: + ty_deserialization_step_tt TYPE STANDARD TABLE OF ty_deserialization_step + WITH DEFAULT KEY . DATA mo_files TYPE REF TO zcl_abapgit_objects_files . + CONSTANTS: + BEGIN OF gc_step_id, + abap TYPE zif_abapgit_object=>ty_deserialization_step VALUE `ABAP`, + ddic TYPE zif_abapgit_object=>ty_deserialization_step VALUE `DDIC`, + late TYPE zif_abapgit_object=>ty_deserialization_step VALUE `LATE`, + END OF gc_step_id. + + METHODS serialize IMPORTING !io_xml TYPE REF TO zcl_abapgit_xml_output @@ -13,6 +26,7 @@ INTERFACE zif_abapgit_object IMPORTING !iv_package TYPE devclass !io_xml TYPE REF TO zcl_abapgit_xml_input + !iv_step TYPE ty_deserialization_step RAISING zcx_abapgit_exception . METHODS delete @@ -49,4 +63,7 @@ INTERFACE zif_abapgit_object VALUE(ri_comparator) TYPE REF TO zif_abapgit_comparator RAISING zcx_abapgit_exception . + METHODS get_deserialize_steps + RETURNING + VALUE(rt_steps) TYPE ty_deserialization_step_tt . ENDINTERFACE. diff --git a/src/zcl_abapgit_objects.clas.abap b/src/zcl_abapgit_objects.clas.abap index e1f843ad7..d18917e4d 100644 --- a/src/zcl_abapgit_objects.clas.abap +++ b/src/zcl_abapgit_objects.clas.abap @@ -21,6 +21,19 @@ CLASS zcl_abapgit_objects DEFINITION item TYPE zif_abapgit_definitions=>ty_item, END OF ty_serialization . + TYPES: + BEGIN OF ty_step_data, + step_id TYPE zif_abapgit_object=>ty_deserialization_step, + order TYPE i, + descr TYPE string, + is_ddic TYPE abap_bool, + syntax_check TYPE abap_bool, + objects TYPE ty_deserialization_tt, + END OF ty_step_data. + TYPES: + ty_step_data_tt TYPE STANDARD TABLE OF ty_step_data + WITH DEFAULT KEY. + CLASS-METHODS serialize IMPORTING !is_item TYPE zif_abapgit_definitions=>ty_item @@ -173,11 +186,9 @@ CLASS zcl_abapgit_objects DEFINITION zcx_abapgit_exception . CLASS-METHODS deserialize_objects IMPORTING - it_objects TYPE ty_deserialization_tt - iv_ddic TYPE abap_bool DEFAULT abap_false - iv_descr TYPE string + is_step TYPE ty_step_data CHANGING - ct_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt + ct_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt RAISING zcx_abapgit_exception . CLASS-METHODS check_objects_locked @@ -216,6 +227,9 @@ CLASS zcl_abapgit_objects DEFINITION it_results TYPE zif_abapgit_definitions=>ty_results_tt RETURNING VALUE(rt_results) TYPE zif_abapgit_definitions=>ty_results_tt. + CLASS-METHODS get_deserialize_steps + RETURNING + VALUE(rt_steps) TYPE ty_step_data_tt. ENDCLASS. @@ -513,17 +527,19 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. lo_files TYPE REF TO zcl_abapgit_objects_files, lo_xml TYPE REF TO zcl_abapgit_xml_input, lt_results TYPE zif_abapgit_definitions=>ty_results_tt, - lt_ddic TYPE TABLE OF ty_deserialization, - lt_rest TYPE TABLE OF ty_deserialization, - lt_late TYPE TABLE OF ty_deserialization, li_progress TYPE REF TO zif_abapgit_progress, lv_path TYPE string, - lt_items TYPE zif_abapgit_definitions=>ty_items_tt. + lt_items TYPE zif_abapgit_definitions=>ty_items_tt, + lt_steps_id TYPE zif_abapgit_object=>ty_deserialization_step_tt, + lt_steps TYPE ty_step_data_tt. DATA: lo_folder_logic TYPE REF TO zcl_abapgit_folder_logic. - FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result, - LIKE LINE OF lt_late. + FIELD-SYMBOLS: TYPE zif_abapgit_definitions=>ty_result, + TYPE LINE OF zif_abapgit_object=>ty_deserialization_step_tt, + TYPE LINE OF ty_step_data_tt, + TYPE LINE OF ty_deserialization_tt. + lt_steps = get_deserialize_steps( ). lv_package = io_repo->get_package( ). @@ -591,33 +607,50 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. li_obj->mo_files = lo_files. - IF li_obj->get_metadata( )-late_deser = abap_true. - APPEND INITIAL LINE TO lt_late ASSIGNING . - ELSEIF li_obj->get_metadata( )-ddic = abap_true. - APPEND INITIAL LINE TO lt_ddic ASSIGNING . - ELSE. - APPEND INITIAL LINE TO lt_rest ASSIGNING . - ENDIF. - -item = ls_item. - -obj = li_obj. - -xml = lo_xml. - -package = lv_package. + TRY. +* Get required steps for deserialize the object + lt_steps_id = li_obj->get_deserialize_steps( ). - CLEAR: lv_path, lv_package. + LOOP AT lt_steps_id ASSIGNING . + READ TABLE lt_steps WITH KEY step_id = ASSIGNING . + ASSERT sy-subrc = 0. + IF -is_ddic = abap_true AND li_obj->get_metadata( )-ddic = abap_false. + " DDIC only for DDIC objects + zcx_abapgit_exception=>raise( |Step { } is only for DDIC objects| ). + ENDIF. + APPEND INITIAL LINE TO -objects ASSIGNING . + -item = ls_item. + -obj = li_obj. + -xml = lo_xml. + -package = lv_package. + ENDLOOP. + + CATCH cx_sy_dyn_call_illegal_method. + " Fallback (can be removed if all objects implement the new IF method get_deserialize_steps) + IF li_obj->get_metadata( )-late_deser = abap_true. + READ TABLE lt_steps WITH KEY step_id = zif_abapgit_object=>gc_step_id-late ASSIGNING . + ASSERT sy-subrc = 0. + ELSEIF li_obj->get_metadata( )-ddic = abap_true. + READ TABLE lt_steps WITH KEY step_id = zif_abapgit_object=>gc_step_id-ddic ASSIGNING . + ASSERT sy-subrc = 0. + ELSE. + READ TABLE lt_steps WITH KEY step_id = zif_abapgit_object=>gc_step_id-abap ASSIGNING . + ASSERT sy-subrc = 0. + ENDIF. + APPEND INITIAL LINE TO -objects ASSIGNING . + -item = ls_item. + -obj = li_obj. + -xml = lo_xml. + -package = lv_package. + ENDTRY. ENDLOOP. - deserialize_objects( EXPORTING it_objects = lt_ddic - iv_ddic = abap_true - iv_descr = 'DDIC' - CHANGING ct_files = rt_accessed_files ). - - deserialize_objects( EXPORTING it_objects = lt_rest - iv_descr = 'Objects' - CHANGING ct_files = rt_accessed_files ). - - deserialize_objects( EXPORTING it_objects = lt_late - iv_descr = 'Late' - CHANGING ct_files = rt_accessed_files ). +* run deserialize for all step and it's objets + SORT lt_steps BY order. + LOOP AT lt_steps ASSIGNING . + deserialize_objects( EXPORTING is_step = + CHANGING ct_files = rt_accessed_files ). + ENDLOOP. update_package_tree( io_repo->get_package( ) ). @@ -658,24 +691,25 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. DATA: li_progress TYPE REF TO zif_abapgit_progress. - FIELD-SYMBOLS: LIKE LINE OF it_objects. + FIELD-SYMBOLS: LIKE LINE OF is_step-objects. zcl_abapgit_objects_activation=>clear( ). - li_progress = zcl_abapgit_progress=>get_instance( lines( it_objects ) ). + li_progress = zcl_abapgit_progress=>get_instance( lines( is_step-objects ) ). - LOOP AT it_objects ASSIGNING . + LOOP AT is_step-objects ASSIGNING . li_progress->show( iv_current = sy-tabix - iv_text = |Deserialize { iv_descr } - { -item-obj_name }| ) ##NO_TEXT. + iv_text = |Deserialize { is_step-descr } - { -item-obj_name }| ) ##NO_TEXT. -obj->deserialize( iv_package = -package - io_xml = -xml ). + io_xml = -xml + iv_step = is_step-step_id ). APPEND LINES OF -obj->mo_files->get_accessed_files( ) TO ct_files. ENDLOOP. - zcl_abapgit_objects_activation=>activate( iv_ddic ). + zcl_abapgit_objects_activation=>activate( iv_ddic = is_step-is_ddic ). ENDMETHOD. @@ -724,6 +758,32 @@ CLASS ZCL_ABAPGIT_OBJECTS IMPLEMENTATION. ENDMETHOD. + METHOD get_deserialize_steps. + FIELD-SYMBOLS: TYPE LINE OF ty_step_data_tt. + + APPEND INITIAL LINE TO rt_steps ASSIGNING . + -step_id = zif_abapgit_object=>gc_step_id-ddic. + -descr = 'Import DDIC objects'. + -is_ddic = abap_true. + -syntax_check = abap_false. + -order = 1. + + APPEND INITIAL LINE TO rt_steps ASSIGNING . + -step_id = zif_abapgit_object=>gc_step_id-abap. + -descr = 'Import objects main'. + -is_ddic = abap_false. + -syntax_check = abap_false. + -order = 2. + + APPEND INITIAL LINE TO rt_steps ASSIGNING . + -step_id = zif_abapgit_object=>gc_step_id-late. + -descr = 'Import late objects'. + -is_ddic = abap_false. + -syntax_check = abap_true. + -order = 3. + ENDMETHOD. + + METHOD is_active. DATA: li_object TYPE REF TO zif_abapgit_object. diff --git a/src/zif_abapgit_definitions.intf.abap b/src/zif_abapgit_definitions.intf.abap index 2d7a49cce..64d821759 100644 --- a/src/zif_abapgit_definitions.intf.abap +++ b/src/zif_abapgit_definitions.intf.abap @@ -137,7 +137,7 @@ INTERFACE zif_abapgit_definitions BEGIN OF ty_metadata, class TYPE string, version TYPE string, - late_deser TYPE abap_bool, + late_deser TYPE abap_bool, " refactor: can be removed later. replaced by steps delete_tadir TYPE abap_bool, ddic TYPE abap_bool, END OF ty_metadata .