diff --git a/src/objects/aff/zcl_abapgit_aff_registry.clas.abap b/src/objects/aff/zcl_abapgit_aff_registry.clas.abap
index a0ca81ef4..589441013 100644
--- a/src/objects/aff/zcl_abapgit_aff_registry.clas.abap
+++ b/src/objects/aff/zcl_abapgit_aff_registry.clas.abap
@@ -46,6 +46,7 @@ CLASS ZCL_ABAPGIT_AFF_REGISTRY IMPLEMENTATION.
METHOD initialize_registry_table.
+ register( 'APLO' ).
register( 'BGQC' ).
register( 'CDBO' ).
register( 'CHKC' ).
@@ -61,6 +62,8 @@ CLASS ZCL_ABAPGIT_AFF_REGISTRY IMPLEMENTATION.
register( 'GSMP' ).
register( iv_obj_type = 'INTF'
iv_experimental = abap_true ).
+ register( 'SAJT' ).
+ register( 'SAJC' ).
register( 'SMBC' ).
register( 'SWCR' ).
register( 'NONT' ).
diff --git a/src/objects/aff/zcl_abapgit_object_aplo.clas.abap b/src/objects/aff/zcl_abapgit_object_aplo.clas.abap
new file mode 100644
index 000000000..70673c92d
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_object_aplo.clas.abap
@@ -0,0 +1,24 @@
+CLASS zcl_abapgit_object_aplo DEFINITION
+ PUBLIC
+ INHERITING FROM zcl_abapgit_object_common_aff
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ METHODS zif_abapgit_object~changed_by
+ REDEFINITION .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_OBJECT_APLO IMPLEMENTATION.
+
+
+ METHOD zif_abapgit_object~changed_by.
+ CLEAR rv_user.
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/objects/aff/zcl_abapgit_object_aplo.clas.xml b/src/objects/aff/zcl_abapgit_object_aplo.clas.xml
new file mode 100644
index 000000000..cfec6c94b
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_object_aplo.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_OBJECT_APLO
+ E
+ abapGit - APLO - Application Log Object
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap b/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap
index 9ab7c2101..e7e6f7a3b 100644
--- a/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap
+++ b/src/objects/aff/zcl_abapgit_object_common_aff.clas.abap
@@ -55,7 +55,9 @@ CLASS zcl_abapgit_object_common_aff DEFINITION
METHODS create_aff_setting_deserialize FINAL
RETURNING
- VALUE(ro_settings_deserialize) TYPE REF TO object.
+ VALUE(ro_settings_deserialize) TYPE REF TO object
+ RAISING
+ zcx_abapgit_exception.
PRIVATE SECTION.
METHODS is_file_empty
@@ -110,6 +112,29 @@ CLASS zcl_abapgit_object_common_aff IMPLEMENTATION.
ENDMETHOD.
+ METHOD create_aff_setting_deserialize.
+ IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version AND
+ ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_no_abap_language_version.
+ TRY.
+ CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE')
+ EXPORTING
+ version = 'A'
+ language = mv_language
+ user = sy-uname
+ abap_language_version = ms_item-abap_language_version.
+ CATCH cx_root.
+ zcx_abapgit_exception=>raise( |System does not supported ABAP language version for AFF| ).
+ ENDTRY.
+ ELSE.
+ CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE')
+ EXPORTING
+ version = 'A'
+ language = mv_language
+ user = sy-uname.
+ ENDIF.
+ ENDMETHOD.
+
+
METHOD get_additional_extensions.
RETURN.
ENDMETHOD.
@@ -412,25 +437,6 @@ CLASS zcl_abapgit_object_common_aff IMPLEMENTATION.
ENDMETHOD.
- METHOD create_aff_setting_deserialize.
- IF ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_any_abap_language_version AND
- ms_item-abap_language_version <> zcl_abapgit_abap_language_vers=>c_no_abap_language_version.
- CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE')
- EXPORTING
- version = 'A'
- language = mv_language
- user = sy-uname
- abap_language_version = ms_item-abap_language_version.
- ELSE.
- CREATE OBJECT ro_settings_deserialize TYPE ('CL_AFF_SETTINGS_DESERIALIZE')
- EXPORTING
- version = 'A'
- language = mv_language
- user = sy-uname.
- ENDIF.
- ENDMETHOD.
-
-
METHOD zif_abapgit_object~exists.
DATA: lr_intf_aff_obj TYPE REF TO data,
lo_object_handler TYPE REF TO object,
diff --git a/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap b/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap
index 488c13ea8..0d46738a8 100644
--- a/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap
+++ b/src/objects/aff/zcl_abapgit_object_common_aff.clas.testclasses.abap
@@ -226,7 +226,13 @@ CLASS ltcl_aff_settings_deserialize IMPLEMENTATION.
is_item = ls_item
iv_language = 'E'.
- lo_settings_deserialize = lo_cut->create_aff_setting_deserialize( ).
+ TRY.
+ lo_settings_deserialize = lo_cut->create_aff_setting_deserialize( ).
+ CATCH cx_root.
+ " System doesn't support AFF with ABAP language version
+ RETURN.
+ ENDTRY.
+
CALL METHOD lo_settings_deserialize->('IF_AFF_SETTINGS_DESERIALIZE~GET_ABAP_LANGUAGE_VERSION')
RECEIVING
result = lv_act_setting_abap_lv.
diff --git a/src/objects/aff/zcl_abapgit_object_sajc.clas.abap b/src/objects/aff/zcl_abapgit_object_sajc.clas.abap
new file mode 100644
index 000000000..31f00d70d
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_object_sajc.clas.abap
@@ -0,0 +1,38 @@
+CLASS zcl_abapgit_object_sajc DEFINITION
+ PUBLIC
+ INHERITING FROM zcl_abapgit_object_common_aff
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ METHODS zif_abapgit_object~changed_by
+ REDEFINITION .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_OBJECT_SAJC IMPLEMENTATION.
+
+
+ METHOD zif_abapgit_object~changed_by.
+
+ CONSTANTS lc_table_name TYPE tabname VALUE 'APJ_W_JCE_ROOT'.
+
+ SELECT SINGLE lst_ch_user_acct
+ FROM (lc_table_name)
+ INTO rv_user
+ WHERE job_catalog_entry_name = ms_item-obj_name
+ AND job_catalog_entry_version = 'I'.
+
+ IF rv_user IS INITIAL.
+ SELECT SINGLE lst_ch_user_acct
+ FROM (lc_table_name)
+ INTO rv_user
+ WHERE job_catalog_entry_name = ms_item-obj_name
+ AND job_catalog_entry_version = 'A'.
+ ENDIF.
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/objects/aff/zcl_abapgit_object_sajc.clas.xml b/src/objects/aff/zcl_abapgit_object_sajc.clas.xml
new file mode 100644
index 000000000..6c5841001
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_object_sajc.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_OBJECT_SAJC
+ E
+ abapGit - SAJC - Application Job Catalog Entry
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/objects/aff/zcl_abapgit_object_sajt.clas.abap b/src/objects/aff/zcl_abapgit_object_sajt.clas.abap
new file mode 100644
index 000000000..86b19688e
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_object_sajt.clas.abap
@@ -0,0 +1,39 @@
+CLASS zcl_abapgit_object_sajt DEFINITION
+ PUBLIC
+ INHERITING FROM zcl_abapgit_object_common_aff
+ FINAL
+ CREATE PUBLIC .
+
+ PUBLIC SECTION.
+
+ METHODS zif_abapgit_object~changed_by
+ REDEFINITION .
+ PROTECTED SECTION.
+ PRIVATE SECTION.
+ENDCLASS.
+
+
+
+CLASS ZCL_ABAPGIT_OBJECT_SAJT IMPLEMENTATION.
+
+
+ METHOD zif_abapgit_object~changed_by.
+
+ CONSTANTS lc_table_name TYPE tabname VALUE 'APJ_W_JT_ROOT'.
+
+ SELECT SINGLE lst_ch_user_acct
+ FROM (lc_table_name)
+ INTO rv_user
+ WHERE job_template_name = ms_item-obj_name
+ AND job_template_version = 'I'.
+
+ IF rv_user IS INITIAL.
+ SELECT SINGLE lst_ch_user_acct
+ FROM (lc_table_name)
+ INTO rv_user
+ WHERE job_template_name = ms_item-obj_name
+ AND job_template_version = 'A'.
+ ENDIF.
+
+ ENDMETHOD.
+ENDCLASS.
diff --git a/src/objects/aff/zcl_abapgit_object_sajt.clas.xml b/src/objects/aff/zcl_abapgit_object_sajt.clas.xml
new file mode 100644
index 000000000..7c093d89d
--- /dev/null
+++ b/src/objects/aff/zcl_abapgit_object_sajt.clas.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ ZCL_ABAPGIT_OBJECT_SAJT
+ E
+ abapGit - SAJT - Application Job Template
+ 1
+ X
+ X
+ X
+
+
+
+
diff --git a/src/objects/zcl_abapgit_object_shi8.clas.abap b/src/objects/zcl_abapgit_object_shi8.clas.abap
index b0ddb12e7..3f287bfaa 100644
--- a/src/objects/zcl_abapgit_object_shi8.clas.abap
+++ b/src/objects/zcl_abapgit_object_shi8.clas.abap
@@ -76,6 +76,8 @@ CLASS zcl_abapgit_object_shi8 IMPLEMENTATION.
ls_node_data-tree_id = ls_assignment_data-tree_id.
ls_node_data-node_id = ls_assignment_data-node_id.
+ tadir_insert( iv_package ).
+
CALL FUNCTION 'STREE_SFW_ASSIGNMENT_SAVE'
EXPORTING
assignment_id = ls_assignment_data-sfw_ass_id
diff --git a/src/objects/zcl_abapgit_object_wdyn.clas.abap b/src/objects/zcl_abapgit_object_wdyn.clas.abap
index 129543cad..a0ffd2f4c 100644
--- a/src/objects/zcl_abapgit_object_wdyn.clas.abap
+++ b/src/objects/zcl_abapgit_object_wdyn.clas.abap
@@ -59,6 +59,12 @@ CLASS zcl_abapgit_object_wdyn DEFINITION
IMPORTING is_view TYPE wdy_md_view_meta_data
RETURNING VALUE(rs_delta) TYPE svrs2_xversionable_object
RAISING zcx_abapgit_exception,
+ deserialize_sources
+ IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_input
+ RAISING zcx_abapgit_exception,
+ serialize_sources
+ IMPORTING ii_xml TYPE REF TO zif_abapgit_xml_output
+ RAISING zcx_abapgit_exception,
add_fm_param_exporting
IMPORTING iv_name TYPE string
ig_value TYPE any
@@ -79,7 +85,7 @@ ENDCLASS.
-CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION.
+CLASS zcl_abapgit_object_wdyn IMPLEMENTATION.
METHOD add_fm_exception.
@@ -382,6 +388,61 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION.
ENDMETHOD.
+ METHOD deserialize_sources.
+
+ DATA:
+ lv_extra TYPE string,
+ lt_extra TYPE string_table,
+ ls_abap TYPE abaptxt255,
+ lt_abap TYPE abaptxt255_tab,
+ lv_line TYPE wdy_ctlr_compo_source_vrs-line_number,
+ lv_cmpname TYPE wdy_ctlr_compo_source_vrs-cmpname,
+ ls_sources LIKE LINE OF mt_sources.
+
+ " Old format
+ ii_xml->read( EXPORTING iv_name = 'SOURCES'
+ CHANGING cg_data = mt_sources ).
+
+ IF mt_sources IS NOT INITIAL.
+ RETURN.
+ ENDIF.
+
+ " New format
+ ii_xml->read( EXPORTING iv_name = 'FILES'
+ CHANGING cg_data = lt_extra ).
+
+ LOOP AT lt_extra INTO lv_extra.
+ lv_line = 0.
+ lt_abap = mo_files->read_abap( iv_extra = lv_extra ).
+ LOOP AT lt_abap INTO ls_abap.
+ " Start of method
+ FIND REGEX '\s*method\s+(.*)\s*\.' IN ls_abap-line IGNORING CASE SUBMATCHES lv_cmpname.
+ IF sy-subrc = 0.
+ lv_line = 1.
+ ENDIF.
+
+ IF lv_cmpname IS NOT INITIAL AND lv_line > 0.
+ CLEAR ls_sources.
+ ls_sources-component_name = ms_item-obj_name.
+ ls_sources-controller_name = to_upper( lv_extra ).
+ ls_sources-cmpname = to_upper( lv_cmpname ).
+ ls_sources-line_number = lv_line.
+ ls_sources-source_line = ls_abap-line.
+ INSERT ls_sources INTO TABLE mt_sources.
+ lv_line = lv_line + 1.
+ ENDIF.
+
+ " End of method
+ FIND REGEX '\s*endmethod\s*\.' IN ls_abap-line IGNORING CASE.
+ IF sy-subrc = 0.
+ lv_line = 0.
+ ENDIF.
+ ENDLOOP.
+ ENDLOOP.
+
+ ENDMETHOD.
+
+
METHOD get_limu_objects.
DATA: lv_name TYPE wdy_component_name.
@@ -786,6 +847,47 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION.
ENDMETHOD.
+ METHOD serialize_sources.
+
+ DATA:
+ lv_extra TYPE string,
+ lt_extra TYPE string_table,
+ ls_abap TYPE abaptxt255,
+ lt_abap TYPE abaptxt255_tab.
+
+ FIELD-SYMBOLS LIKE LINE OF mt_sources.
+
+ " Store code as separate ABAP files instead of XML (assumes sorted data, see "read")
+ LOOP AT mt_sources ASSIGNING .
+ AT NEW controller_name.
+ CLEAR lt_abap.
+ lv_extra = to_lower( -controller_name ).
+ ENDAT.
+
+ ls_abap-line = -source_line.
+ INSERT ls_abap INTO TABLE lt_abap.
+
+ AT END OF cmpname.
+ CLEAR ls_abap.
+ INSERT ls_abap INTO TABLE lt_abap.
+ ENDAT.
+ AT END OF controller_name.
+ IF lt_abap IS NOT INITIAL.
+ mo_files->add_abap(
+ iv_extra = lv_extra
+ it_abap = lt_abap ).
+ INSERT lv_extra INTO TABLE lt_extra.
+ ENDIF.
+ ENDAT.
+ ENDLOOP.
+
+ ii_xml->add(
+ iv_name = 'FILES'
+ ig_data = lt_extra ).
+
+ ENDMETHOD.
+
+
METHOD zif_abapgit_object~changed_by.
SELECT SINGLE changedby FROM wdy_component INTO rv_user
WHERE component_name = ms_item-obj_name AND version = 'A'.
@@ -831,8 +933,8 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION.
CHANGING cg_data = ls_component ).
io_xml->read( EXPORTING iv_name = 'COMPONENTS'
CHANGING cg_data = mt_components ).
- io_xml->read( EXPORTING iv_name = 'SOURCES'
- CHANGING cg_data = mt_sources ).
+
+ deserialize_sources( io_xml ).
ls_component-comp_metadata-definition-author = sy-uname.
ls_component-comp_metadata-definition-createdon = sy-datum.
@@ -944,8 +1046,8 @@ CLASS ZCL_ABAPGIT_OBJECT_WDYN IMPLEMENTATION.
ig_data = ls_component ).
io_xml->add( ig_data = mt_components
iv_name = 'COMPONENTS' ).
- io_xml->add( ig_data = mt_sources
- iv_name = 'SOURCES' ).
+
+ serialize_sources( io_xml ).
READ TABLE ls_component-comp_metadata-descriptions INTO ls_description INDEX 1.
IF sy-subrc = 0.
diff --git a/src/objects/zcl_abapgit_objects_program.clas.abap b/src/objects/zcl_abapgit_objects_program.clas.abap
index 093c1fa19..fc75e7f71 100644
--- a/src/objects/zcl_abapgit_objects_program.clas.abap
+++ b/src/objects/zcl_abapgit_objects_program.clas.abap
@@ -131,6 +131,8 @@ CLASS zcl_abapgit_objects_program DEFINITION
inactive TYPE r3state VALUE 'I',
END OF c_state.
+ CONSTANTS c_native_dynpro TYPE c LENGTH 2 VALUE 'IN'.
+
METHODS:
uncondense_flow
IMPORTING it_flow TYPE swydyflow
@@ -359,6 +361,9 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION.
it_flow = ls_dynpro-flow_logic
it_spaces = ls_dynpro-spaces ).
+ IF ls_dynpro-flow_logic IS INITIAL.
+ ls_dynpro-flow_logic = mo_files->read_abap( iv_extra = 'screen_' && ls_dynpro-header-screen ).
+ ENDIF.
LOOP AT ls_dynpro-fields ASSIGNING .
* if the DDIC element has a PARAMETER_ID and the flag "from_dict" is active
@@ -390,7 +395,7 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION.
ENDLOOP.
- IF ls_dynpro-header-type = 'N' AND ls_dynpro-nat_header IS NOT INITIAL.
+ IF ls_dynpro-header-type CA c_native_dynpro AND ls_dynpro-nat_header IS NOT INITIAL.
DELETE FROM d021t WHERE prog = ls_dynpro-header-program AND dynr = ls_dynpro-header-screen ##SUBRC_OK.
INSERT d021t FROM TABLE ls_dynpro-nat_texts ##SUBRC_OK.
@@ -913,11 +918,15 @@ CLASS zcl_abapgit_objects_program IMPLEMENTATION.
ENDLOOP.
APPEND INITIAL LINE TO rt_dynpro ASSIGNING .
- -header = ls_header.
- -flow_logic = lt_flow_logic.
+ -header = ls_header.
+
+ " Store flow logic as separate ABAP files instead of XML
+ mo_files->add_abap(
+ iv_extra = 'screen_' && ls_header-screen
+ it_abap = lt_flow_logic ).
READ TABLE lt_fieldlist_int TRANSPORTING NO FIELDS WITH KEY fill = 'X'.
- IF ls_header-type = 'N' AND sy-subrc = 0.
+ IF ls_header-type CA c_native_dynpro AND sy-subrc = 0.
" In particular for dynpros with splitter
-nat_header = .
CLEAR: -nat_header-dgen, -nat_header-tgen.