mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 20:03:20 +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
|
||||
|
||||
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)
|
||||
|
@ -1095,7 +1095,7 @@ CLASS lcl_xml DEFINITION FINAL CREATE PUBLIC.
|
|||
RAISING lcx_exception.
|
||||
|
||||
METHODS table_add
|
||||
IMPORTING it_table TYPE ANY TABLE
|
||||
IMPORTING it_table TYPE STANDARD TABLE
|
||||
iv_name TYPE string OPTIONAL
|
||||
ii_root TYPE REF TO if_ixml_element OPTIONAL
|
||||
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
|
||||
END OF ty_s_ecape_map,
|
||||
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.
|
||||
|
||||
|
@ -1144,7 +1144,7 @@ CLASS lcl_xml DEFINITION FINAL CREATE PUBLIC.
|
|||
DATA: mi_ixml TYPE REF TO if_ixml,
|
||||
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
|
||||
CHANGING cv_name TYPE string.
|
||||
|
@ -1299,7 +1299,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
|||
lv_kind = lo_data_descr->kind.
|
||||
|
||||
IF iv_name IS NOT INITIAL.
|
||||
lv_table_line_name = |{ iv_name }{ co_suffix_table_line_struc }|.
|
||||
lv_table_line_name = iv_name.
|
||||
ENDIF.
|
||||
|
||||
DO.
|
||||
|
@ -1312,6 +1312,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
|||
CHANGING cg_structure = <lg_line> ).
|
||||
WHEN cl_abap_typedescr=>kind_elem.
|
||||
element_read( EXPORTING ii_root = li_root
|
||||
iv_name = lv_table_line_name
|
||||
IMPORTING ev_success = lv_success
|
||||
CHANGING cg_element = <lg_line> ).
|
||||
WHEN OTHERS.
|
||||
|
@ -1319,11 +1320,27 @@ CLASS lcl_xml IMPLEMENTATION.
|
|||
ENDCASE.
|
||||
|
||||
IF lv_success = abap_false.
|
||||
lv_index = lines( ct_table ).
|
||||
DELETE ct_table INDEX lv_index.
|
||||
ASSERT sy-subrc = 0.
|
||||
EXIT. " current loop
|
||||
ENDIF.
|
||||
* 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 ).
|
||||
DELETE ct_table INDEX lv_index.
|
||||
ASSERT sy-subrc = 0.
|
||||
EXIT. " current loop
|
||||
ENDIF. "Fallback also not successful
|
||||
ENDIF." Fallback
|
||||
ENDDO.
|
||||
|
||||
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
|
||||
IF iv_name IS NOT INITIAL.
|
||||
lv_table_line_name = |{ iv_name }{ co_suffix_table_line_struc }|.
|
||||
lv_table_line_name = iv_name.
|
||||
ENDIF.
|
||||
|
||||
LOOP AT it_table ASSIGNING <lg_line>.
|
||||
|
@ -1442,6 +1459,7 @@ CLASS lcl_xml IMPLEMENTATION.
|
|||
ii_root = li_table ).
|
||||
WHEN cl_abap_typedescr=>kind_elem.
|
||||
element_add( ig_element = <lg_line>
|
||||
iv_name = lv_table_line_name
|
||||
ii_root = li_table ).
|
||||
WHEN OTHERS.
|
||||
_raise 'unknown kind'.
|
||||
|
@ -2639,6 +2657,9 @@ ENDCLASS. "lcl_objects_super DEFINITION
|
|||
CLASS lcl_objects_bridge DEFINITION INHERITING FROM lcl_objects_super FINAL.
|
||||
|
||||
PUBLIC SECTION.
|
||||
|
||||
CLASS-METHODS class_constructor.
|
||||
|
||||
METHODS constructor
|
||||
IMPORTING is_item TYPE ty_item
|
||||
RAISING cx_sy_create_object_error.
|
||||
|
@ -2650,31 +2671,38 @@ CLASS lcl_objects_bridge DEFINITION INHERITING FROM lcl_objects_super FINAL.
|
|||
PRIVATE SECTION.
|
||||
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.
|
||||
|
||||
CLASS lcl_objects_bridge IMPLEMENTATION.
|
||||
|
||||
METHOD constructor.
|
||||
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 ).
|
||||
|
||||
CONCATENATE 'ZCL_ABAPGIT_OBJECT_' is_item-obj_type INTO lv_name.
|
||||
|
||||
TRY.
|
||||
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
|
||||
iv_obj_type = is_item-obj_type
|
||||
iv_obj_name = is_item-obj_name.
|
||||
ENDTRY.
|
||||
* 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).
|
||||
|
||||
CALL METHOD mo_plugin->('SET_ITEM')
|
||||
EXPORTING
|
||||
iv_obj_type = is_item-obj_type
|
||||
iv_obj_name = is_item-obj_name.
|
||||
ELSE.
|
||||
RAISE EXCEPTION TYPE cx_sy_create_object_error
|
||||
EXPORTING
|
||||
classname = 'LCL_OBJECTS_BRIDGE'.
|
||||
ENDIF.
|
||||
ENDMETHOD.
|
||||
|
||||
METHOD set_files.
|
||||
|
@ -2713,25 +2741,6 @@ CLASS lcl_objects_bridge IMPLEMENTATION.
|
|||
|
||||
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.
|
||||
CALL METHOD mo_plugin->('ZIF_ABAPGIT_PLUGIN~DESERIALIZE')
|
||||
EXPORTING
|
||||
|
@ -2772,6 +2781,58 @@ CLASS lcl_objects_bridge IMPLEMENTATION.
|
|||
|
||||
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.
|
||||
|
||||
**********************************************************************
|
||||
|
|
Loading…
Reference in New Issue
Block a user