mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-01 12:20:51 +08:00
Updated plugin-mechanism and changed lcl_xml
This commit is contained in:
parent
df74821602
commit
180242ce31
|
@ -3,7 +3,7 @@ REPORT zabapgit.
|
||||||
* See http://www.abapgit.org
|
* See http://www.abapgit.org
|
||||||
|
|
||||||
CONSTANTS: gc_xml_version TYPE string VALUE 'v0.2-alpha', "#EC NOTEXT
|
CONSTANTS: gc_xml_version TYPE string VALUE 'v0.2-alpha', "#EC NOTEXT
|
||||||
gc_abap_version TYPE string VALUE 'v0.110'. "#EC NOTEXT
|
gc_abap_version TYPE string VALUE 'v0.111'. "#EC NOTEXT
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* The MIT License (MIT)
|
* The MIT License (MIT)
|
||||||
|
@ -1095,7 +1095,7 @@ CLASS lcl_xml DEFINITION FINAL CREATE PUBLIC.
|
||||||
RAISING lcx_exception.
|
RAISING lcx_exception.
|
||||||
|
|
||||||
METHODS table_add
|
METHODS table_add
|
||||||
IMPORTING it_table TYPE ANY TABLE
|
IMPORTING it_table TYPE STANDARD TABLE
|
||||||
iv_name TYPE string OPTIONAL
|
iv_name TYPE string OPTIONAL
|
||||||
ii_root TYPE REF TO if_ixml_element OPTIONAL
|
ii_root TYPE REF TO if_ixml_element OPTIONAL
|
||||||
RAISING lcx_exception.
|
RAISING lcx_exception.
|
||||||
|
@ -1128,7 +1128,7 @@ CLASS lcl_xml DEFINITION FINAL CREATE PUBLIC.
|
||||||
escape_sequence TYPE string, "in order to allow longer (thus unique) escape sequences
|
escape_sequence TYPE string, "in order to allow longer (thus unique) escape sequences
|
||||||
END OF ty_s_ecape_map,
|
END OF ty_s_ecape_map,
|
||||||
ty_t_escape_map TYPE SORTED TABLE OF ty_s_ecape_map WITH UNIQUE KEY forbidden_char
|
ty_t_escape_map TYPE SORTED TABLE OF ty_s_ecape_map WITH UNIQUE KEY forbidden_char
|
||||||
WITH UNIQUE SORTED KEY escape_sequence COMPONENTS escape_sequence. "to prevent ambiguity
|
WITH UNIQUE SORTED KEY escape_sequence COMPONENTS escape_sequence. "to prevent ambiguity
|
||||||
|
|
||||||
DATA mt_escape_map TYPE ty_t_escape_map.
|
DATA mt_escape_map TYPE ty_t_escape_map.
|
||||||
|
|
||||||
|
@ -1144,7 +1144,7 @@ CLASS lcl_xml DEFINITION FINAL CREATE PUBLIC.
|
||||||
DATA: mi_ixml TYPE REF TO if_ixml,
|
DATA: mi_ixml TYPE REF TO if_ixml,
|
||||||
mi_root TYPE REF TO if_ixml_element.
|
mi_root TYPE REF TO if_ixml_element.
|
||||||
|
|
||||||
CONSTANTS co_suffix_table_line_struc TYPE string VALUE '_table_line_structure'. "_item'.
|
* CONSTANTS co_suffix_table_line_struc TYPE string VALUE '_item'.
|
||||||
|
|
||||||
METHODS special_names
|
METHODS special_names
|
||||||
CHANGING cv_name TYPE string.
|
CHANGING cv_name TYPE string.
|
||||||
|
@ -1299,7 +1299,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
||||||
lv_kind = lo_data_descr->kind.
|
lv_kind = lo_data_descr->kind.
|
||||||
|
|
||||||
IF iv_name IS NOT INITIAL.
|
IF iv_name IS NOT INITIAL.
|
||||||
lv_table_line_name = |{ iv_name }{ co_suffix_table_line_struc }|.
|
lv_table_line_name = iv_name.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
DO.
|
DO.
|
||||||
|
@ -1312,6 +1312,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
||||||
CHANGING cg_structure = <lg_line> ).
|
CHANGING cg_structure = <lg_line> ).
|
||||||
WHEN cl_abap_typedescr=>kind_elem.
|
WHEN cl_abap_typedescr=>kind_elem.
|
||||||
element_read( EXPORTING ii_root = li_root
|
element_read( EXPORTING ii_root = li_root
|
||||||
|
iv_name = lv_table_line_name
|
||||||
IMPORTING ev_success = lv_success
|
IMPORTING ev_success = lv_success
|
||||||
CHANGING cg_element = <lg_line> ).
|
CHANGING cg_element = <lg_line> ).
|
||||||
WHEN OTHERS.
|
WHEN OTHERS.
|
||||||
|
@ -1319,11 +1320,27 @@ CLASS lcl_xml IMPLEMENTATION.
|
||||||
ENDCASE.
|
ENDCASE.
|
||||||
|
|
||||||
IF lv_success = abap_false.
|
IF lv_success = abap_false.
|
||||||
|
* Fallback to the previous implementation: the table's name was not always propagated
|
||||||
|
* the reading of the line.
|
||||||
|
CASE lv_kind.
|
||||||
|
WHEN cl_abap_typedescr=>kind_struct.
|
||||||
|
structure_read( EXPORTING ii_root = li_root
|
||||||
|
IMPORTING ev_success = lv_success
|
||||||
|
CHANGING cg_structure = <lg_line> ).
|
||||||
|
WHEN cl_abap_typedescr=>kind_elem.
|
||||||
|
element_read( EXPORTING ii_root = li_root
|
||||||
|
IMPORTING ev_success = lv_success
|
||||||
|
CHANGING cg_element = <lg_line> ).
|
||||||
|
WHEN OTHERS.
|
||||||
|
_raise 'unknown kind'.
|
||||||
|
ENDCASE.
|
||||||
|
IF lv_success = abap_false.
|
||||||
lv_index = lines( ct_table ).
|
lv_index = lines( ct_table ).
|
||||||
DELETE ct_table INDEX lv_index.
|
DELETE ct_table INDEX lv_index.
|
||||||
ASSERT sy-subrc = 0.
|
ASSERT sy-subrc = 0.
|
||||||
EXIT. " current loop
|
EXIT. " current loop
|
||||||
ENDIF.
|
ENDIF. "Fallback also not successful
|
||||||
|
ENDIF." Fallback
|
||||||
ENDDO.
|
ENDDO.
|
||||||
|
|
||||||
ENDMETHOD. "table_read
|
ENDMETHOD. "table_read
|
||||||
|
@ -1431,7 +1448,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
||||||
|
|
||||||
* provide a stable name for the line structure if a table name was provided previously
|
* provide a stable name for the line structure if a table name was provided previously
|
||||||
IF iv_name IS NOT INITIAL.
|
IF iv_name IS NOT INITIAL.
|
||||||
lv_table_line_name = |{ iv_name }{ co_suffix_table_line_struc }|.
|
lv_table_line_name = iv_name.
|
||||||
ENDIF.
|
ENDIF.
|
||||||
|
|
||||||
LOOP AT it_table ASSIGNING <lg_line>.
|
LOOP AT it_table ASSIGNING <lg_line>.
|
||||||
|
@ -1442,6 +1459,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
||||||
ii_root = li_table ).
|
ii_root = li_table ).
|
||||||
WHEN cl_abap_typedescr=>kind_elem.
|
WHEN cl_abap_typedescr=>kind_elem.
|
||||||
element_add( ig_element = <lg_line>
|
element_add( ig_element = <lg_line>
|
||||||
|
iv_name = lv_table_line_name
|
||||||
ii_root = li_table ).
|
ii_root = li_table ).
|
||||||
WHEN OTHERS.
|
WHEN OTHERS.
|
||||||
_raise 'unknown kind'.
|
_raise 'unknown kind'.
|
||||||
|
@ -2639,6 +2657,9 @@ ENDCLASS. "lcl_objects_super DEFINITION
|
||||||
CLASS lcl_objects_bridge DEFINITION INHERITING FROM lcl_objects_super FINAL.
|
CLASS lcl_objects_bridge DEFINITION INHERITING FROM lcl_objects_super FINAL.
|
||||||
|
|
||||||
PUBLIC SECTION.
|
PUBLIC SECTION.
|
||||||
|
|
||||||
|
CLASS-METHODS class_constructor.
|
||||||
|
|
||||||
METHODS constructor
|
METHODS constructor
|
||||||
IMPORTING is_item TYPE ty_item
|
IMPORTING is_item TYPE ty_item
|
||||||
RAISING cx_sy_create_object_error.
|
RAISING cx_sy_create_object_error.
|
||||||
|
@ -2650,31 +2671,38 @@ CLASS lcl_objects_bridge DEFINITION INHERITING FROM lcl_objects_super FINAL.
|
||||||
PRIVATE SECTION.
|
PRIVATE SECTION.
|
||||||
DATA: mo_plugin TYPE REF TO object.
|
DATA: mo_plugin TYPE REF TO object.
|
||||||
|
|
||||||
|
TYPES: BEGIN OF ty_s_objtype_map,
|
||||||
|
obj_typ TYPE trobjtype,
|
||||||
|
plugin_class TYPE seoclsname,
|
||||||
|
END OF ty_s_objtype_map,
|
||||||
|
ty_t_objtype_map TYPE SORTED TABLE OF ty_s_objtype_map WITH UNIQUE KEY obj_typ.
|
||||||
|
|
||||||
|
CLASS-DATA gt_objtype_map TYPE ty_t_objtype_map.
|
||||||
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
CLASS lcl_objects_bridge IMPLEMENTATION.
|
CLASS lcl_objects_bridge IMPLEMENTATION.
|
||||||
|
|
||||||
METHOD constructor.
|
METHOD constructor.
|
||||||
DATA: lx_create_object_error TYPE REF TO cx_sy_create_object_error.
|
DATA: lx_create_object_error TYPE REF TO cx_sy_create_object_error.
|
||||||
DATA: lv_name TYPE string.
|
DATA ls_objtype_map LIKE LINE OF gt_objtype_map.
|
||||||
|
|
||||||
super->constructor( is_item ).
|
super->constructor( is_item ).
|
||||||
|
|
||||||
CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO lv_name.
|
* determine the responsible plugin
|
||||||
|
READ TABLE gt_objtype_map INTO ls_objtype_map WITH TABLE KEY obj_typ = is_item-obj_type.
|
||||||
|
IF sy-subrc = 0.
|
||||||
|
CREATE OBJECT mo_plugin TYPE (ls_objtype_map-plugin_class).
|
||||||
|
|
||||||
TRY.
|
CALL METHOD mo_plugin->('SET_ITEM')
|
||||||
CREATE OBJECT mo_plugin TYPE (lv_name)
|
|
||||||
EXPORTING
|
|
||||||
iv_object = is_item-obj_type
|
|
||||||
iv_obj_name = is_item-obj_name.
|
|
||||||
CATCH cx_sy_create_object_error INTO lx_create_object_error.
|
|
||||||
* Fallback: Try the generic plugin
|
|
||||||
CREATE OBJECT mo_plugin TYPE ('ZCL_ABAPGIT_OBJECT_BY_SOBJ')
|
|
||||||
EXPORTING
|
EXPORTING
|
||||||
iv_obj_type = is_item-obj_type
|
iv_obj_type = is_item-obj_type
|
||||||
iv_obj_name = is_item-obj_name.
|
iv_obj_name = is_item-obj_name.
|
||||||
ENDTRY.
|
ELSE.
|
||||||
|
RAISE EXCEPTION TYPE cx_sy_create_object_error
|
||||||
|
EXPORTING
|
||||||
|
classname = 'LCL_OBJECTS_BRIDGE'.
|
||||||
|
ENDIF.
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
METHOD set_files.
|
METHOD set_files.
|
||||||
|
@ -2713,25 +2741,6 @@ CLASS lcl_objects_bridge IMPLEMENTATION.
|
||||||
|
|
||||||
FIELD-SYMBOLS: <ls_file> LIKE LINE OF lt_files.
|
FIELD-SYMBOLS: <ls_file> LIKE LINE OF lt_files.
|
||||||
|
|
||||||
*
|
|
||||||
* CALL METHOD mo_plugin->('GET_FILES')
|
|
||||||
* RECEIVING
|
|
||||||
* ro_files_proxy = lo_files. "Returns a proxy wrapping a files-object
|
|
||||||
*
|
|
||||||
* CALL METHOD lo_files->('GET_WRAPPED_OBJECT')
|
|
||||||
* RECEIVING
|
|
||||||
* ro_objects_files = lo_wrapped_files.
|
|
||||||
|
|
||||||
* Why did Lars insert this?
|
|
||||||
*************** transfer files from mo_files to external - that has already been done in lcl_objects_bridge->set_files()
|
|
||||||
************** lt_files = mo_files->get_files( ).
|
|
||||||
************** LOOP AT lt_files ASSIGNING <ls_file>.
|
|
||||||
************** CALL METHOD lo_wrapped_files->('PUSH')
|
|
||||||
************** EXPORTING
|
|
||||||
************** iv_filename = <ls_file>-filename
|
|
||||||
************** iv_data = <ls_file>-data.
|
|
||||||
************** ENDLOOP.
|
|
||||||
|
|
||||||
TRY.
|
TRY.
|
||||||
CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~DESERIALIZE')
|
CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~DESERIALIZE')
|
||||||
EXPORTING
|
EXPORTING
|
||||||
|
@ -2772,6 +2781,58 @@ CLASS lcl_objects_bridge IMPLEMENTATION.
|
||||||
|
|
||||||
ENDMETHOD.
|
ENDMETHOD.
|
||||||
|
|
||||||
|
METHOD class_constructor.
|
||||||
|
DATA lt_plugin_class TYPE STANDARD TABLE OF seoclsname WITH DEFAULT KEY.
|
||||||
|
DATA lv_plugin_class LIKE LINE OF lt_plugin_class.
|
||||||
|
DATA lo_plugin TYPE REF TO object.
|
||||||
|
DATA lt_plugin_obj_type TYPE objtyptable.
|
||||||
|
DATA ls_objtype_map LIKE LINE OF gt_objtype_map.
|
||||||
|
|
||||||
|
SELECT ext~clsname FROM vseoextend AS ext
|
||||||
|
INTO TABLE lt_plugin_class
|
||||||
|
WHERE ext~refclsname LIKE 'ZCL_ABAPGIT_OBJECT%'
|
||||||
|
AND ext~version = '1'.
|
||||||
|
|
||||||
|
CLEAR gt_objtype_map.
|
||||||
|
LOOP AT lt_plugin_class INTO lv_plugin_class
|
||||||
|
WHERE table_line NE 'ZCL_ABAPGIT_OBJECT_BY_SOBJ'. "have the generic plugin only as fallback
|
||||||
|
TRY.
|
||||||
|
CREATE OBJECT lo_plugin TYPE (lv_plugin_class).
|
||||||
|
CATCH cx_sy_create_object_error.
|
||||||
|
CONTINUE. ">>>>>>>>>>>>>>
|
||||||
|
ENDTRY.
|
||||||
|
|
||||||
|
CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES')
|
||||||
|
IMPORTING
|
||||||
|
rt_obj_type = lt_plugin_obj_type.
|
||||||
|
|
||||||
|
ls_objtype_map-plugin_class = lv_plugin_class.
|
||||||
|
LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ.
|
||||||
|
INSERT ls_objtype_map INTO TABLE gt_objtype_map.
|
||||||
|
IF sy-subrc NE 0.
|
||||||
|
"No exception in class-contructor possible. Anyway, a shortdump is more appropriate in this case
|
||||||
|
ASSERT 'There must not be' = |multiple ABAPGit-Plugins for the same object type { ls_objtype_map-obj_typ }|.
|
||||||
|
ENDIF.
|
||||||
|
ENDLOOP.
|
||||||
|
ENDLOOP. "at plugins
|
||||||
|
|
||||||
|
* and the same for the generic plugin if exists
|
||||||
|
LOOP AT lt_plugin_class INTO lv_plugin_class
|
||||||
|
WHERE table_line EQ 'ZCL_ABAPGIT_OBJECT_BY_SOBJ'. "have the generic plugin only as fallback
|
||||||
|
CREATE OBJECT lo_plugin TYPE (lv_plugin_class).
|
||||||
|
|
||||||
|
CALL METHOD lo_plugin->('GET_SUPPORTED_OBJ_TYPES')
|
||||||
|
RECEIVING
|
||||||
|
rt_obj_type = lt_plugin_obj_type.
|
||||||
|
|
||||||
|
ls_objtype_map-plugin_class = lv_plugin_class.
|
||||||
|
LOOP AT lt_plugin_obj_type INTO ls_objtype_map-obj_typ.
|
||||||
|
INSERT ls_objtype_map INTO TABLE gt_objtype_map. "knowingly ignore the subrc
|
||||||
|
ENDLOOP.
|
||||||
|
ENDLOOP. "at plugins
|
||||||
|
|
||||||
|
ENDMETHOD.
|
||||||
|
|
||||||
ENDCLASS.
|
ENDCLASS.
|
||||||
|
|
||||||
**********************************************************************
|
**********************************************************************
|
||||||
|
|
Loading…
Reference in New Issue
Block a user