From d6b5dbaf271851975ebf0f8cc9b62ec9a13e8326 Mon Sep 17 00:00:00 2001 From: larshp Date: Sat, 2 Jul 2016 10:24:22 +0000 Subject: [PATCH] split into includes, #210 --- src/zabapgit.prog.abap | 2197 ++--------------------------- src/zabapgit_exceptions.prog.abap | 55 + src/zabapgit_exceptions.prog.xml | 48 + src/zabapgit_util.prog.abap | 854 +++++++++++ src/zabapgit_util.prog.xml | 48 + src/zabapgit_xml.prog.abap | 409 ++++++ src/zabapgit_xml.prog.xml | 48 + src/zabapgit_zlib.prog.abap | 710 ++++++++++ src/zabapgit_zlib.prog.xml | 48 + 9 files changed, 2317 insertions(+), 2100 deletions(-) create mode 100644 src/zabapgit_exceptions.prog.abap create mode 100644 src/zabapgit_exceptions.prog.xml create mode 100644 src/zabapgit_util.prog.abap create mode 100644 src/zabapgit_util.prog.xml create mode 100644 src/zabapgit_xml.prog.abap create mode 100644 src/zabapgit_xml.prog.xml create mode 100644 src/zabapgit_zlib.prog.abap create mode 100644 src/zabapgit_zlib.prog.xml diff --git a/src/zabapgit.prog.abap b/src/zabapgit.prog.abap index 76434b34b..0d432450c 100644 --- a/src/zabapgit.prog.abap +++ b/src/zabapgit.prog.abap @@ -139,63 +139,16 @@ SELECTION-SCREEN BEGIN OF SCREEN 1001. SELECTION-SCREEN END OF SCREEN 1001. ****************** - -START-OF-SELECTION. - PERFORM run. - -*----------------------------------------------------------------------* -* CLASS LCX_EXCEPTION DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check FINAL. - - PUBLIC SECTION. - DATA mv_text TYPE string. - - METHODS constructor - IMPORTING iv_text TYPE string - ix_previous TYPE REF TO cx_root OPTIONAL. - - PRIVATE SECTION. - DATA mx_previous TYPE REF TO cx_root. - -ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION - -*----------------------------------------------------------------------* -* CLASS LCX_EXCEPTION IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcx_exception IMPLEMENTATION. - - METHOD constructor. - super->constructor( ). - mv_text = iv_text. - mx_previous = previous. - ENDMETHOD. "CONSTRUCTOR - -ENDCLASS. "lcx_exception IMPLEMENTATION +INCLUDE zabapgit_exceptions. +INCLUDE zabapgit_zlib. +INCLUDE zabapgit_util. +INCLUDE zabapgit_xml. CLASS lcl_app DEFINITION DEFERRED. -*----------------------------------------------------------------------* -* CLASS LCX_NOT_FOUND DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcx_not_found DEFINITION INHERITING FROM cx_static_check FINAL. -ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION - -*----------------------------------------------------------------------* -* CLASS LCX_NOT_FOUND IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcx_not_found IMPLEMENTATION. - -ENDCLASS. "lcx_not_found IMPLEMENTATION +START-OF-SELECTION. + PERFORM run. CLASS lcl_progress DEFINITION FINAL. @@ -566,793 +519,6 @@ CLASS lcl_html_toolbar IMPLEMENTATION. ENDCLASS. "lcl_html_toolbar IMPLEMENTATION -CLASS lcl_log DEFINITION FINAL. - - PUBLIC SECTION. - METHODS: - add - IMPORTING - iv_msgv1 TYPE csequence - iv_msgv2 TYPE csequence OPTIONAL - iv_msgv3 TYPE csequence OPTIONAL - iv_msgv4 TYPE csequence OPTIONAL, - count - RETURNING VALUE(rv_count) TYPE i, - to_html - RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, - show. - - PRIVATE SECTION. - DATA: mt_log TYPE rs_t_msg. - -ENDCLASS. - -CLASS lcl_log IMPLEMENTATION. - - METHOD to_html. - - DATA: lv_string TYPE string. - - FIELD-SYMBOLS: LIKE LINE OF mt_log. - - CREATE OBJECT ro_html. - - IF count( ) = 0. - RETURN. - ENDIF. - - ro_html->add( '
' ). - LOOP AT mt_log ASSIGNING . - CONCATENATE -msgv1 - -msgv2 - -msgv3 - -msgv4 INTO lv_string SEPARATED BY space. - ro_html->add( lv_string ). - ro_html->add( '
' ). - ENDLOOP. - ro_html->add( '
' ). - - ENDMETHOD. - - METHOD add. - - FIELD-SYMBOLS: LIKE LINE OF mt_log. - - APPEND INITIAL LINE TO mt_log ASSIGNING . - -msgty = 'W'. - -msgid = '00'. - -msgno = '001'. - -msgv1 = iv_msgv1. - -msgv2 = iv_msgv2. - -msgv3 = iv_msgv3. - -msgv4 = iv_msgv4. - - ENDMETHOD. - - METHOD show. - CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP' - EXPORTING - i_t_msg = mt_log - i_txt = 'Warning' - i_with_s_on_empty = abap_false - i_one_msg_direct = abap_false - i_one_msg_type_s = abap_false - ##no_text. - ENDMETHOD. - - METHOD count. - rv_count = lines( mt_log ). - ENDMETHOD. - -ENDCLASS. - -*----------------------------------------------------------------------* -* CLASS lcl_zlib_huffman DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib_huffman DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: ty_lengths TYPE STANDARD TABLE OF i WITH DEFAULT KEY. - - CONSTANTS: c_maxbits TYPE i VALUE 15. - - METHODS: - constructor - IMPORTING it_lengths TYPE ty_lengths, - get_count - IMPORTING iv_index TYPE i - RETURNING VALUE(rv_value) TYPE i, - get_symbol - IMPORTING iv_index TYPE i - RETURNING VALUE(rv_value) TYPE i. - - PRIVATE SECTION. - - DATA: mt_count TYPE STANDARD TABLE OF i WITH DEFAULT KEY, - mt_symbol TYPE STANDARD TABLE OF i WITH DEFAULT KEY. - -ENDCLASS. "lcl_zlib_huffman DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib_huffman DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib_huffman IMPLEMENTATION. - - METHOD get_count. - READ TABLE mt_count INDEX iv_index INTO rv_value. "#EC CI_SUBRC - ENDMETHOD. "count - - METHOD get_symbol. - READ TABLE mt_symbol INDEX iv_index INTO rv_value. "#EC CI_SUBRC - ENDMETHOD. "symbol - - METHOD constructor. - - DATA: lv_index TYPE i, - lt_offset TYPE TABLE OF i, - lv_length LIKE LINE OF it_lengths, - lv_prev TYPE i, - lv_count LIKE LINE OF mt_count. - - FIELD-SYMBOLS: LIKE LINE OF lt_offset, - LIKE LINE OF mt_symbol, - LIKE LINE OF it_lengths. - - - DO c_maxbits TIMES. - APPEND 0 TO mt_count. - ENDDO. - LOOP AT it_lengths INTO lv_index. - IF lv_index = 0. - CONTINUE. - ENDIF. - READ TABLE mt_count INDEX lv_index ASSIGNING . - ASSERT sy-subrc = 0. - = + 1. - ENDLOOP. - -************ - - APPEND 0 TO lt_offset. - DO c_maxbits - 1 TIMES. - READ TABLE mt_count INDEX sy-index INTO lv_count. - ASSERT sy-subrc = 0. - lv_prev = lv_prev + lv_count. - APPEND lv_prev TO lt_offset. - ENDDO. - - DO lines( it_lengths ) TIMES. - APPEND 0 TO mt_symbol. - ENDDO. - DO lines( it_lengths ) TIMES. - lv_index = sy-index. - READ TABLE it_lengths INDEX lv_index INTO lv_length. - ASSERT sy-subrc = 0. - IF lv_length = 0. - CONTINUE. - ENDIF. - READ TABLE lt_offset INDEX lv_length ASSIGNING . - ASSERT sy-subrc = 0. - READ TABLE mt_symbol INDEX + 1 ASSIGNING . - ASSERT sy-subrc = 0. - = lv_index - 1. - = + 1. - ENDDO. - - ENDMETHOD. "constructor - -ENDCLASS. "lcl_zlib_huffman DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib_convert DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib_convert DEFINITION FINAL. - - PUBLIC SECTION. - CLASS-METHODS: - hex_to_bits - IMPORTING iv_hex TYPE xsequence - RETURNING VALUE(rv_bits) TYPE string, - bits_to_int - IMPORTING iv_bits TYPE clike - RETURNING VALUE(rv_int) TYPE i, - int_to_hex - IMPORTING iv_int TYPE i - RETURNING VALUE(rv_hex) TYPE xstring. - -ENDCLASS. "lcl_zlib_convert DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib_convert IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib_convert IMPLEMENTATION. - - METHOD hex_to_bits. - - DATA: lv_x TYPE x LENGTH 1, - lv_c TYPE c LENGTH 1, - lv_bit TYPE i, - lv_hex TYPE xstring. - - - lv_hex = iv_hex. - WHILE NOT lv_hex IS INITIAL. - lv_x = lv_hex. - DO 8 TIMES. - lv_bit = sy-index. - GET BIT lv_bit OF lv_x INTO lv_c. - CONCATENATE rv_bits lv_c INTO rv_bits. - ENDDO. - lv_hex = lv_hex+1. - ENDWHILE. - - ENDMETHOD. "hex_to_bits - - METHOD bits_to_int. - - DATA: lv_c TYPE c LENGTH 1, - lv_bits TYPE string. - - lv_bits = iv_bits. - - WHILE NOT lv_bits IS INITIAL. - lv_c = lv_bits. - rv_int = rv_int * 2. - rv_int = rv_int + lv_c. - lv_bits = lv_bits+1. - ENDWHILE. - - ENDMETHOD. "bits_to_int - - METHOD int_to_hex. - - DATA: lv_x TYPE x. - - - lv_x = iv_int. - rv_hex = lv_x. - - ENDMETHOD. "int_to_hex - -ENDCLASS. "lcl_zlib_convert IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib_stream DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib_stream DEFINITION FINAL. - - PUBLIC SECTION. - METHODS: - constructor - IMPORTING iv_data TYPE xstring, - take_bits - IMPORTING iv_length TYPE i - RETURNING VALUE(rv_bits) TYPE string, - take_int - IMPORTING iv_length TYPE i - RETURNING VALUE(rv_int) TYPE i, - remaining - RETURNING VALUE(rv_length) TYPE i. - - PRIVATE SECTION. - DATA: mv_compressed TYPE xstring, - mv_bits TYPE string. - -ENDCLASS. "lcl_zlib_stream DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib_stream IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib_stream IMPLEMENTATION. - - METHOD constructor. - - mv_compressed = iv_data. - - ENDMETHOD. "constructor - - METHOD remaining. - - rv_length = xstrlen( mv_compressed ) + 1. - - ENDMETHOD. "remaining - - METHOD take_int. - - rv_int = lcl_zlib_convert=>bits_to_int( take_bits( iv_length ) ). - - ENDMETHOD. "take_int - - METHOD take_bits. - - DATA: lv_left TYPE i, - lv_index TYPE i, - lv_x TYPE x LENGTH 1. - - - WHILE strlen( rv_bits ) < iv_length. - IF mv_bits IS INITIAL. - lv_x = mv_compressed(1). - mv_bits = lcl_zlib_convert=>hex_to_bits( lv_x ). - mv_compressed = mv_compressed+1. - ENDIF. - lv_left = iv_length - strlen( rv_bits ). - IF lv_left >= strlen( mv_bits ). - CONCATENATE mv_bits rv_bits INTO rv_bits. - CLEAR mv_bits. - ELSE. - lv_index = strlen( mv_bits ) - lv_left. - CONCATENATE mv_bits+lv_index(lv_left) rv_bits INTO rv_bits. - mv_bits = mv_bits(lv_index). - ENDIF. - - ENDWHILE. - - ENDMETHOD. "take_bits - -ENDCLASS. "lcl_zlib_stream IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: BEGIN OF ty_decompress, - raw TYPE xstring, - compressed_len TYPE i, - END OF ty_decompress. - - CLASS-METHODS: - decompress - IMPORTING iv_compressed TYPE xsequence - RETURNING VALUE(rs_data) TYPE ty_decompress. - - PRIVATE SECTION. - CONSTANTS: c_maxdcodes TYPE i VALUE 30. - - CLASS-DATA: gv_out TYPE xstring, - go_lencode TYPE REF TO lcl_zlib_huffman, - go_distcode TYPE REF TO lcl_zlib_huffman, - go_stream TYPE REF TO lcl_zlib_stream. - - TYPES: BEGIN OF ty_pair, - length TYPE i, - distance TYPE i, - END OF ty_pair. - - CLASS-METHODS: - decode - IMPORTING io_huffman TYPE REF TO lcl_zlib_huffman - RETURNING VALUE(rv_symbol) TYPE i, - map_length - IMPORTING iv_code TYPE i - RETURNING VALUE(rv_length) TYPE i, - map_distance - IMPORTING iv_code TYPE i - RETURNING VALUE(rv_distance) TYPE i, - dynamic, - fixed, - read_pair - IMPORTING iv_length TYPE i - RETURNING VALUE(rs_pair) TYPE ty_pair, - copy_out - IMPORTING is_pair TYPE ty_pair. - -ENDCLASS. "lcl_zlib DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_zlib IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_zlib IMPLEMENTATION. - - METHOD decode. - - DATA: lv_bit TYPE c LENGTH 1, - lv_len TYPE i, - lv_count TYPE i, - lv_code TYPE i, - lv_index TYPE i, - lv_first TYPE i, - lv_bits TYPE string. - - - DO lcl_zlib_huffman=>c_maxbits TIMES. - lv_len = sy-index. - - lv_bit = go_stream->take_bits( 1 ). - CONCATENATE lv_bits lv_bit INTO lv_bits. - lv_code = lcl_zlib_convert=>bits_to_int( lv_bits ). - lv_count = io_huffman->get_count( lv_len ). - - IF lv_code - lv_count < lv_first. - rv_symbol = io_huffman->get_symbol( lv_index + lv_code - lv_first + 1 ). - RETURN. - ENDIF. - lv_index = lv_index + lv_count. - lv_first = lv_first + lv_count. - lv_first = lv_first * 2. - ENDDO. - - ENDMETHOD. "decode - - METHOD fixed. - - DATA: lt_lengths TYPE lcl_zlib_huffman=>ty_lengths. - - - DO 144 TIMES. - APPEND 8 TO lt_lengths. - ENDDO. - DO 112 TIMES. - APPEND 9 TO lt_lengths. - ENDDO. - DO 24 TIMES. - APPEND 7 TO lt_lengths. - ENDDO. - DO 8 TIMES. - APPEND 8 TO lt_lengths. - ENDDO. - - CREATE OBJECT go_lencode - EXPORTING - it_lengths = lt_lengths. - - CLEAR lt_lengths. - DO c_maxdcodes TIMES. - APPEND 5 TO lt_lengths. - ENDDO. - - CREATE OBJECT go_distcode - EXPORTING - it_lengths = lt_lengths. - - ENDMETHOD. "fixed - - METHOD copy_out. - -* copy one byte at a time, it is not possible to copy using -* string offsets, as it might copy data that does not exist -* in mv_out yet - - DATA: lv_distance TYPE i, - lv_index TYPE i, - lv_x TYPE x LENGTH 1. - - - lv_distance = xstrlen( gv_out ) - is_pair-distance. - DO is_pair-length TIMES. - lv_index = sy-index - 1 + lv_distance. - lv_x = gv_out+lv_index(1). - CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE. - ENDDO. - - ENDMETHOD. "copy_out - - METHOD dynamic. - - DATA: lv_nlen TYPE i, - lv_ndist TYPE i, - lv_ncode TYPE i, - lv_index TYPE i, - lv_length TYPE i, - lv_symbol TYPE i, - lt_order TYPE TABLE OF i, - lt_lengths TYPE lcl_zlib_huffman=>ty_lengths, - lt_dists TYPE lcl_zlib_huffman=>ty_lengths. - - FIELD-SYMBOLS: LIKE LINE OF lt_lengths. - - - APPEND 16 TO lt_order. - APPEND 17 TO lt_order. - APPEND 18 TO lt_order. - APPEND 0 TO lt_order. - APPEND 8 TO lt_order. - APPEND 7 TO lt_order. - APPEND 9 TO lt_order. - APPEND 6 TO lt_order. - APPEND 10 TO lt_order. - APPEND 5 TO lt_order. - APPEND 11 TO lt_order. - APPEND 4 TO lt_order. - APPEND 12 TO lt_order. - APPEND 3 TO lt_order. - APPEND 13 TO lt_order. - APPEND 2 TO lt_order. - APPEND 14 TO lt_order. - APPEND 1 TO lt_order. - APPEND 15 TO lt_order. - - lv_nlen = go_stream->take_int( 5 ) + 257. - lv_ndist = go_stream->take_int( 5 ) + 1. - lv_ncode = go_stream->take_int( 4 ) + 4. - - DO 19 TIMES. - APPEND 0 TO lt_lengths. - ENDDO. - - DO lv_ncode TIMES. - READ TABLE lt_order INDEX sy-index INTO lv_index. - ASSERT sy-subrc = 0. - lv_index = lv_index + 1. - READ TABLE lt_lengths INDEX lv_index ASSIGNING . - ASSERT sy-subrc = 0. - = go_stream->take_int( 3 ). - ENDDO. - - CREATE OBJECT go_lencode - EXPORTING - it_lengths = lt_lengths. - - CLEAR lt_lengths. - WHILE lines( lt_lengths ) < lv_nlen + lv_ndist. - lv_symbol = decode( go_lencode ). - - IF lv_symbol < 16. - APPEND lv_symbol TO lt_lengths. - ELSE. - lv_length = 0. - IF lv_symbol = 16. - READ TABLE lt_lengths INDEX lines( lt_lengths ) INTO lv_length. - ASSERT sy-subrc = 0. - lv_symbol = go_stream->take_int( 2 ) + 3. - ELSEIF lv_symbol = 17. - lv_symbol = go_stream->take_int( 3 ) + 3. - ELSE. - lv_symbol = go_stream->take_int( 7 ) + 11. - ENDIF. - DO lv_symbol TIMES. - APPEND lv_length TO lt_lengths. - ENDDO. - ENDIF. - ENDWHILE. - - lt_dists = lt_lengths. - DELETE lt_lengths FROM lv_nlen + 1. - DELETE lt_dists TO lv_nlen. - - CREATE OBJECT go_lencode - EXPORTING - it_lengths = lt_lengths. - - CREATE OBJECT go_distcode - EXPORTING - it_lengths = lt_dists. - - ENDMETHOD. "dynamic - - METHOD read_pair. - - DATA: lv_symbol TYPE i. - - - rs_pair-length = map_length( iv_length ). - - lv_symbol = decode( go_distcode ). - rs_pair-distance = map_distance( lv_symbol ). - - ENDMETHOD. "read_pair - - METHOD map_distance. - - DEFINE _distance. - rv_distance = go_stream->take_int( &1 ). - rv_distance = rv_distance + &2. - END-OF-DEFINITION. - - CASE iv_code. - WHEN 0. - _distance 0 1. - WHEN 1. - _distance 0 2. - WHEN 2. - _distance 0 3. - WHEN 3. - _distance 0 4. - WHEN 4. - _distance 1 5. - WHEN 5. - _distance 1 7. - WHEN 6. - _distance 2 9. - WHEN 7. - _distance 2 13. - WHEN 8. - _distance 3 17. - WHEN 9. - _distance 3 25. - WHEN 10. - _distance 4 33. - WHEN 11. - _distance 4 49. - WHEN 12. - _distance 5 65. - WHEN 13. - _distance 5 97. - WHEN 14. - _distance 6 129. - WHEN 15. - _distance 6 193. - WHEN 16. - _distance 7 257. - WHEN 17. - _distance 7 385. - WHEN 18. - _distance 8 513. - WHEN 19. - _distance 8 769. - WHEN 20. - _distance 9 1025. - WHEN 21. - _distance 9 1537. - WHEN 22. - _distance 10 2049. - WHEN 23. - _distance 10 3073. - WHEN 24. - _distance 11 4097. - WHEN 25. - _distance 11 6145. - WHEN 26. - _distance 12 8193. - WHEN 27. - _distance 12 12289. - WHEN 28. - _distance 13 16385. - WHEN 29. - _distance 13 24577. - WHEN OTHERS. - ASSERT 1 = 0. - ENDCASE. - - ENDMETHOD. "map_distance - - METHOD map_length. - - DEFINE _length. - rv_length = go_stream->take_int( &1 ). - rv_length = rv_length + &2. - END-OF-DEFINITION. - - CASE iv_code. - WHEN 257. - _length 0 3. - WHEN 258. - _length 0 4. - WHEN 259. - _length 0 5. - WHEN 260. - _length 0 6. - WHEN 261. - _length 0 7. - WHEN 262. - _length 0 8. - WHEN 263. - _length 0 9. - WHEN 264. - _length 0 10. - WHEN 265. - _length 1 11. - WHEN 266. - _length 1 13. - WHEN 267. - _length 1 15. - WHEN 268. - _length 1 17. - WHEN 269. - _length 2 19. - WHEN 270. - _length 2 23. - WHEN 271. - _length 2 27. - WHEN 272. - _length 2 31. - WHEN 273. - _length 3 35. - WHEN 274. - _length 3 43. - WHEN 275. - _length 3 51. - WHEN 276. - _length 3 59. - WHEN 277. - _length 4 67. - WHEN 278. - _length 4 83. - WHEN 279. - _length 4 99. - WHEN 280. - _length 4 115. - WHEN 281. - _length 5 131. - WHEN 282. - _length 5 163. - WHEN 283. - _length 5 195. - WHEN 284. - _length 5 227. - WHEN 285. - _length 0 258. - WHEN OTHERS. - ASSERT 1 = 0. - ENDCASE. - - ENDMETHOD. "map_length - - METHOD decompress. - - DATA: lv_x TYPE x LENGTH 1, - lv_symbol TYPE i, - lv_bfinal TYPE c LENGTH 1, - lv_btype TYPE c LENGTH 2. - - - IF iv_compressed IS INITIAL. - RETURN. - ENDIF. - - CLEAR gv_out. - CREATE OBJECT go_stream - EXPORTING - iv_data = iv_compressed. - - DO. - lv_bfinal = go_stream->take_bits( 1 ). - - lv_btype = go_stream->take_bits( 2 ). - CASE lv_btype. - WHEN '01'. - fixed( ). - WHEN '10'. - dynamic( ). - WHEN OTHERS. - ASSERT 1 = 0. - ENDCASE. - - DO. - lv_symbol = decode( go_lencode ). - - IF lv_symbol < 256. - lv_x = lcl_zlib_convert=>int_to_hex( lv_symbol ). - CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE. - ELSEIF lv_symbol = 256. - EXIT. - ELSE. - copy_out( read_pair( lv_symbol ) ). - ENDIF. - - ENDDO. - - IF lv_bfinal = '1'. - EXIT. - ENDIF. - - ENDDO. - - rs_data-raw = gv_out. - rs_data-compressed_len = xstrlen( iv_compressed ) - go_stream->remaining( ). - - ENDMETHOD. "decompress - -ENDCLASS. "lcl_zlib IMPLEMENTATION - *----------------------------------------------------------------------* * CLASS lcl_tadir DEFINITION *----------------------------------------------------------------------* @@ -1621,660 +787,6 @@ CLASS lcl_user IMPLEMENTATION. ENDCLASS. "lcl_user IMPLEMENTATION -*----------------------------------------------------------------------* -* CLASS lcl_xml DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_xml DEFINITION ABSTRACT. - - PUBLIC SECTION. - METHODS: - constructor. - - PROTECTED SECTION. - DATA: mi_ixml TYPE REF TO if_ixml, - mi_xml_doc TYPE REF TO if_ixml_document, - ms_metadata TYPE ty_metadata. - - CONSTANTS: c_abapgit_tag TYPE string VALUE 'abapGit' ##NO_TEXT, - c_attr_version TYPE string VALUE 'version' ##NO_TEXT, - c_attr_serializer TYPE string VALUE 'serializer' ##NO_TEXT, - c_attr_serializer_version TYPE string VALUE 'serializer_version' ##NO_TEXT. - - METHODS to_xml - IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true - RETURNING VALUE(rv_xml) TYPE string. - - METHODS parse - IMPORTING iv_normalize TYPE abap_bool DEFAULT abap_true - iv_xml TYPE string - RAISING lcx_exception. - - PRIVATE SECTION. - METHODS error - IMPORTING ii_parser TYPE REF TO if_ixml_parser - RAISING lcx_exception. - - METHODS display_xml_error - RAISING lcx_exception. - -ENDCLASS. "lcl_xml DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_xml IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_xml IMPLEMENTATION. - - METHOD constructor. - mi_ixml = cl_ixml=>create( ). - mi_xml_doc = mi_ixml->create_document( ). - ENDMETHOD. "constructor - - METHOD parse. - - DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory, - li_istream TYPE REF TO if_ixml_istream, - li_element TYPE REF TO if_ixml_element, - li_version TYPE REF TO if_ixml_node, - li_parser TYPE REF TO if_ixml_parser. - - - ASSERT NOT iv_xml IS INITIAL. - - li_stream_factory = mi_ixml->create_stream_factory( ). - li_istream = li_stream_factory->create_istream_string( iv_xml ). - li_parser = mi_ixml->create_parser( stream_factory = li_stream_factory - istream = li_istream - document = mi_xml_doc ). - li_parser->set_normalizing( iv_normalize ). - IF li_parser->parse( ) <> 0. - error( li_parser ). - ENDIF. - - li_istream->close( ). - - - li_element = mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ). - li_version = li_element->if_ixml_node~get_attributes( - )->get_named_item_ns( c_attr_version ) ##no_text. - IF li_version->get_value( ) <> gc_xml_version. - display_xml_error( ). - ENDIF. - -* buffer serializer metadata. Git node will be removed lateron - ms_metadata-class = li_element->get_attribute_ns( c_attr_serializer ). - ms_metadata-version = li_element->get_attribute_ns( c_attr_serializer_version ). - - ENDMETHOD. "parse - - METHOD display_xml_error. - - DATA: lv_version TYPE string. - - - lv_version = |abapGit version: { gc_abap_version }|. - - CALL FUNCTION 'POPUP_TO_INFORM' - EXPORTING - titel = 'abapGit XML version mismatch' - txt1 = 'abapGit XML version mismatch' - txt2 = 'See https://github.com/larshp/abapGit/wiki/XML-Mismatch' - txt3 = lv_version. "#EC NOTEXT - - _raise 'XML error'. - - ENDMETHOD. "display_xml_error - - METHOD to_xml. -* will render to codepage UTF-16 - - DATA: li_ostream TYPE REF TO if_ixml_ostream, - li_renderer TYPE REF TO if_ixml_renderer, - li_streamfactory TYPE REF TO if_ixml_stream_factory. - - - li_streamfactory = mi_ixml->create_stream_factory( ). - - li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ). - - li_renderer = mi_ixml->create_renderer( ostream = li_ostream - document = mi_xml_doc ). - li_renderer->set_normalizing( iv_normalize ). - - li_renderer->render( ). - - ENDMETHOD. "to_xml - - METHOD error. - - DATA: lv_error TYPE i, - lv_txt1 TYPE string, - lv_txt2 TYPE string, - lv_txt3 TYPE string, - lv_times TYPE i, - li_error TYPE REF TO if_ixml_parse_error. - - - IF ii_parser->num_errors( ) <> 0. - lv_times = ii_parser->num_errors( ). - DO lv_times TIMES. - lv_error = sy-index - 1. - li_error = ii_parser->get_error( lv_error ). - - lv_txt1 = li_error->get_column( ). - CONCATENATE 'Column:' lv_txt1 INTO lv_txt1. "#EC NOTEXT - lv_txt2 = li_error->get_line( ). - CONCATENATE 'Line:' lv_txt2 INTO lv_txt2. "#EC NOTEXT - lv_txt3 = li_error->get_reason( ). - - CALL FUNCTION 'POPUP_TO_INFORM' - EXPORTING - titel = 'Error from XML parser' "#EC NOTEXT - txt1 = lv_txt1 - txt2 = lv_txt2 - txt3 = lv_txt3. - ENDDO. - ENDIF. - - _raise 'Error while parsing XML'. - ENDMETHOD. "error - -ENDCLASS. "lcl_xml IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_xml_output DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_xml_output DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC. - - PUBLIC SECTION. - METHODS: - add - IMPORTING iv_name TYPE clike - ig_data TYPE any - RAISING lcx_exception, - set_raw - IMPORTING ii_raw TYPE REF TO if_ixml_element, - render - IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true - is_metadata TYPE ty_metadata OPTIONAL - RETURNING VALUE(rv_xml) TYPE string. - - PRIVATE SECTION. - DATA: mi_raw TYPE REF TO if_ixml_element. - -ENDCLASS. "lcl_xml_output DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_xml_output IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_xml_output IMPLEMENTATION. - - METHOD set_raw. - mi_raw = ii_raw. - ENDMETHOD. "set_raw - - METHOD add. - - DATA: li_node TYPE REF TO if_ixml_node, - li_doc TYPE REF TO if_ixml_document, - lt_stab TYPE abap_trans_srcbind_tab. - - FIELD-SYMBOLS: LIKE LINE OF lt_stab. - - - ASSERT NOT iv_name IS INITIAL. - - APPEND INITIAL LINE TO lt_stab ASSIGNING . - -name = iv_name. - GET REFERENCE OF ig_data INTO -value. - - li_doc = cl_ixml=>create( )->create_document( ). - - CALL TRANSFORMATION id - SOURCE (lt_stab) - RESULT XML li_doc. - - li_node = mi_xml_doc->get_root( )->get_first_child( ). - IF li_node IS BOUND. - mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( - li_doc->get_root( )->get_first_child( )->get_first_child( )->get_first_child( ) ). - ELSE. - mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ). - ENDIF. - - ENDMETHOD. "add - - METHOD render. - - DATA: li_git TYPE REF TO if_ixml_element, - li_abap TYPE REF TO if_ixml_element. - - - IF mi_raw IS INITIAL. - li_abap ?= mi_xml_doc->get_root( )->get_first_child( ). - mi_xml_doc->get_root( )->remove_child( li_abap ). - ELSE. - li_abap = mi_raw. - ENDIF. - - li_git = mi_xml_doc->create_element( c_abapgit_tag ). - li_git->set_attribute( name = c_attr_version value = gc_xml_version ). "#EC NOTEXT - IF NOT is_metadata IS INITIAL. - li_git->set_attribute( name = c_attr_serializer - value = is_metadata-class ). "#EC NOTEXT - li_git->set_attribute( name = c_attr_serializer_version - value = is_metadata-version ). "#EC NOTEXT - ENDIF. - li_git->append_child( li_abap ). - mi_xml_doc->get_root( )->append_child( li_git ). - - rv_xml = to_xml( iv_normalize ). - - ENDMETHOD. "render - -ENDCLASS. "lcl_xml_output IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_xml_input DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_xml_input DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC. - - PUBLIC SECTION. - METHODS: - constructor - IMPORTING iv_xml TYPE clike - RAISING lcx_exception, - read - IMPORTING iv_name TYPE clike - CHANGING cg_data TYPE any - RAISING lcx_exception, - get_raw - RETURNING VALUE(ri_raw) TYPE REF TO if_ixml_node, - get_metadata - RETURNING VALUE(rs_metadata) TYPE ty_metadata. - - PRIVATE SECTION. - METHODS: fix_xml. - -ENDCLASS. "lcl_xml_input DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_xml_input IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_xml_input IMPLEMENTATION. - - METHOD constructor. - - super->constructor( ). - parse( iv_xml ). - fix_xml( ). - - ENDMETHOD. "constructor - - METHOD get_raw. - ri_raw = mi_xml_doc->get_root_element( ). - ENDMETHOD. "get_raw - - METHOD fix_xml. - - DATA: li_git TYPE REF TO if_ixml_element, - li_abap TYPE REF TO if_ixml_node. - - - li_git ?= mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ). - li_abap = li_git->get_first_child( ). - - mi_xml_doc->get_root( )->remove_child( li_git ). - mi_xml_doc->get_root( )->append_child( li_abap ). - - ENDMETHOD. "fix_xml - - METHOD read. - - DATA: lv_text TYPE string, - lx_error TYPE REF TO cx_transformation_error, - lt_rtab TYPE abap_trans_resbind_tab. - - FIELD-SYMBOLS: LIKE LINE OF lt_rtab. - - - ASSERT NOT iv_name IS INITIAL. - - APPEND INITIAL LINE TO lt_rtab ASSIGNING . - -name = iv_name. - GET REFERENCE OF cg_data INTO -value. - - TRY. - CALL TRANSFORMATION id - OPTIONS value_handling = 'accept_data_loss' - SOURCE XML mi_xml_doc - RESULT (lt_rtab) ##no_text. - CATCH cx_transformation_error INTO lx_error. - lv_text = lx_error->if_message~get_text( ). - _raise lv_text. - ENDTRY. - - ENDMETHOD. "read - - METHOD get_metadata. - rs_metadata = ms_metadata. - ENDMETHOD. "get_metadata - -ENDCLASS. "lcl_xml_input IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_time DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_time DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: ty_unixtime TYPE c LENGTH 16. - - CLASS-METHODS get - RETURNING VALUE(rv_time) TYPE ty_unixtime - RAISING lcx_exception. - - PRIVATE SECTION. - CONSTANTS: c_epoch TYPE datum VALUE '19700101'. - -ENDCLASS. "lcl_time DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_time IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_time IMPLEMENTATION. - - METHOD get. - - DATA: lv_i TYPE i, - lv_tz TYPE tznzone, - lv_utcdiff TYPE tznutcdiff, - lv_utcsign TYPE tznutcsign. - - - lv_i = sy-datum - c_epoch. - lv_i = lv_i * 86400. - lv_i = lv_i + sy-uzeit. - - CALL FUNCTION 'TZON_GET_OS_TIMEZONE' - IMPORTING - ef_timezone = lv_tz. - - CALL FUNCTION 'TZON_GET_OFFSET' - EXPORTING - if_timezone = lv_tz - if_local_date = sy-datum - if_local_time = sy-uzeit - IMPORTING - ef_utcdiff = lv_utcdiff - ef_utcsign = lv_utcsign - EXCEPTIONS - conversion_error = 1 - OTHERS = 2. - IF sy-subrc <> 0. - _raise 'Timezone error'. - ENDIF. - - CASE lv_utcsign. - WHEN '+'. - lv_i = lv_i - lv_utcdiff. - WHEN '-'. - lv_i = lv_i + lv_utcdiff. - ENDCASE. - - rv_time = lv_i. - CONDENSE rv_time. - rv_time+11 = lv_utcsign. - rv_time+12 = lv_utcdiff. - - ENDMETHOD. "get - -ENDCLASS. "lcl_time IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_repo DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_url DEFINITION FINAL. - - PUBLIC SECTION. - CLASS-METHODS host - IMPORTING iv_repo TYPE string - RETURNING VALUE(rv_host) TYPE string - RAISING lcx_exception. - - CLASS-METHODS name - IMPORTING iv_repo TYPE string - RETURNING VALUE(rv_name) TYPE string - RAISING lcx_exception. - - CLASS-METHODS path_name - IMPORTING iv_repo TYPE string - RETURNING VALUE(rv_path_name) TYPE string - RAISING lcx_exception. - - PRIVATE SECTION. - CLASS-METHODS regex - IMPORTING iv_repo TYPE string - EXPORTING ev_host TYPE string - ev_path TYPE string - ev_name TYPE string - RAISING lcx_exception. - -ENDCLASS. "lcl_repo DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_repo IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_url IMPLEMENTATION. - - METHOD host. - regex( EXPORTING iv_repo = iv_repo - IMPORTING ev_host = rv_host ). - ENDMETHOD. "host - - METHOD name. - regex( EXPORTING iv_repo = iv_repo - IMPORTING ev_name = rv_name ). - ENDMETHOD. "short_name - - METHOD path_name. - - DATA: lv_path TYPE string, - lv_name TYPE string. - - regex( EXPORTING iv_repo = iv_repo - IMPORTING ev_path = lv_path - ev_name = lv_name ). - - CONCATENATE lv_path lv_name INTO rv_path_name. - - ENDMETHOD. "path_name - - METHOD regex. - - FIND REGEX '(.*://[^/]*)(.*/)(.*).git' IN iv_repo - SUBMATCHES ev_host ev_path ev_name. - IF sy-subrc <> 0. - _raise 'Malformed URL'. - ENDIF. - - ENDMETHOD. "url - -ENDCLASS. "lcl_repo IMPLEMENTATION - -*----------------------------------------------------------------------* -* CLASS lcl_convert DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_convert DEFINITION FINAL. - - PUBLIC SECTION. - CLASS-METHODS bitbyte_to_int - IMPORTING iv_bits TYPE clike - RETURNING VALUE(rv_int) TYPE i. - - CLASS-METHODS x_to_bitbyte - IMPORTING iv_x TYPE x - RETURNING VALUE(rv_bitbyte) TYPE ty_bitbyte. - - CLASS-METHODS string_to_xstring_utf8 - IMPORTING iv_string TYPE string - RETURNING VALUE(rv_xstring) TYPE xstring. - - CLASS-METHODS xstring_to_string_utf8 - IMPORTING iv_data TYPE xstring - RETURNING VALUE(rv_string) TYPE string. - - CLASS-METHODS xstring_to_int - IMPORTING iv_xstring TYPE xstring - RETURNING VALUE(rv_i) TYPE i - RAISING lcx_exception. - - CLASS-METHODS int_to_xstring - IMPORTING iv_i TYPE i - iv_length TYPE i - RETURNING VALUE(rv_xstring) TYPE xstring. - -ENDCLASS. "lcl_convert DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_convert IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_convert IMPLEMENTATION. - - METHOD int_to_xstring. - - DATA: lv_x TYPE x LENGTH 4. - - - ASSERT iv_length = 4. " other cases not implemented - - lv_x = iv_i. - rv_xstring = lv_x. - - ENDMETHOD. "int_to_xstring - - METHOD xstring_to_int. - - DATA: lv_xstring TYPE xstring, - lv_x TYPE x. - - - lv_xstring = iv_xstring. - WHILE xstrlen( lv_xstring ) > 0. - lv_x = lv_xstring(1). - rv_i = rv_i * 256 + lv_x. - lv_xstring = lv_xstring+1. - ENDWHILE. - - ENDMETHOD. "xstring_to_int - - METHOD xstring_to_string_utf8. - - DATA: lv_len TYPE i, - lo_obj TYPE REF TO cl_abap_conv_in_ce. - - - TRY. - lo_obj = cl_abap_conv_in_ce=>create( - input = iv_data - encoding = 'UTF-8' ). - lv_len = xstrlen( iv_data ). - - lo_obj->read( EXPORTING n = lv_len - IMPORTING data = rv_string ). - - CATCH cx_parameter_invalid_range - cx_sy_codepage_converter_init - cx_sy_conversion_codepage - cx_parameter_invalid_type. "#EC NO_HANDLER - ENDTRY. - - ENDMETHOD. "xstring_to_string_utf8 - - METHOD string_to_xstring_utf8. - - DATA: lo_obj TYPE REF TO cl_abap_conv_out_ce. - - - TRY. - lo_obj = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ). - - lo_obj->convert( EXPORTING data = iv_string - IMPORTING buffer = rv_xstring ). - - CATCH cx_parameter_invalid_range - cx_sy_codepage_converter_init - cx_sy_conversion_codepage - cx_parameter_invalid_type. "#EC NO_HANDLER - ENDTRY. - - ENDMETHOD. "string_to_xstring_utf8 - - METHOD bitbyte_to_int. - - DATA: lv_bits TYPE string. - - - lv_bits = iv_bits. - - rv_int = 0. - WHILE strlen( lv_bits ) > 0. - rv_int = rv_int * 2. - IF lv_bits(1) = '1'. - rv_int = rv_int + 1. - ENDIF. - lv_bits = lv_bits+1. - ENDWHILE. - - ENDMETHOD. "bitbyte_to_int - - METHOD x_to_bitbyte. - - DATA: lv_b TYPE n. - - CLEAR rv_bitbyte. - - DO 8 TIMES. - GET BIT sy-index OF iv_x INTO lv_b. - CONCATENATE rv_bitbyte lv_b INTO rv_bitbyte. - ENDDO. - - ENDMETHOD. "x_to_bitbyte - -ENDCLASS. "lcl_convert IMPLEMENTATION - -CLASS lcl_xml_pretty DEFINITION FINAL. - - PUBLIC SECTION. - CLASS-METHODS: print - IMPORTING iv_xml TYPE string - RETURNING VALUE(rv_xml) TYPE string. - -ENDCLASS. - CLASS ltcl_dot_abapgit DEFINITION DEFERRED. CLASS lcl_dot_abapgit DEFINITION CREATE PRIVATE FINAL FRIENDS ltcl_dot_abapgit. @@ -2480,331 +992,6 @@ CLASS lcl_dot_abapgit IMPLEMENTATION. ENDCLASS. -*----------------------------------------------------------------------* -* CLASS lcl_diff DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_diff DEFINITION FINAL. - - PUBLIC SECTION. - CONSTANTS: BEGIN OF c_diff, - insert TYPE c LENGTH 1 VALUE 'I', - delete TYPE c LENGTH 1 VALUE 'D', - update TYPE c LENGTH 1 VALUE 'U', - END OF c_diff. - - TYPES: BEGIN OF ty_diff, - local_line TYPE c LENGTH 6, - local TYPE string, - result TYPE c LENGTH 1, - remote_line TYPE c LENGTH 6, - remote TYPE string, - short TYPE abap_bool, - beacon TYPE i, - END OF ty_diff. - TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY. - - TYPES: BEGIN OF ty_count, - insert TYPE i, - delete TYPE i, - update TYPE i, - END OF ty_count. - - DATA mt_beacons TYPE ty_string_tt READ-ONLY. - -* assumes data is UTF8 based with newlines -* only works with lines up to 255 characters - METHODS constructor - IMPORTING iv_local TYPE xstring - iv_remote TYPE xstring. - - METHODS get - RETURNING VALUE(rt_diff) TYPE ty_diffs_tt. - - METHODS stats - RETURNING VALUE(rs_count) TYPE ty_count. - - PRIVATE SECTION. - DATA mt_diff TYPE ty_diffs_tt. - DATA ms_stats TYPE ty_count. - - CLASS-METHODS: - unpack - IMPORTING iv_local TYPE xstring - iv_remote TYPE xstring - EXPORTING et_local TYPE abaptxt255_tab - et_remote TYPE abaptxt255_tab, - render - IMPORTING it_local TYPE abaptxt255_tab - it_remote TYPE abaptxt255_tab - it_delta TYPE vxabapt255_tab - RETURNING VALUE(rt_diff) TYPE ty_diffs_tt, - compute - IMPORTING it_local TYPE abaptxt255_tab - it_remote TYPE abaptxt255_tab - RETURNING VALUE(rt_delta) TYPE vxabapt255_tab. - - METHODS: - calculate_line_num_and_stats, - map_beacons, - shortlist. - -ENDCLASS. "lcl_diff DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_diff IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_diff IMPLEMENTATION. - - METHOD get. - rt_diff = mt_diff. - ENDMETHOD. "get - - METHOD stats. - rs_count = ms_stats. - ENDMETHOD. "count - - METHOD unpack. - - DATA: lv_local TYPE string, - lv_remote TYPE string. - - - lv_local = lcl_convert=>xstring_to_string_utf8( iv_local ). - lv_remote = lcl_convert=>xstring_to_string_utf8( iv_remote ). - - SPLIT lv_local AT gc_newline INTO TABLE et_local. - SPLIT lv_remote AT gc_newline INTO TABLE et_remote. - - ENDMETHOD. "unpack - - METHOD compute. - - DATA: lt_trdirtab_old TYPE TABLE OF trdir, - lt_trdirtab_new TYPE TABLE OF trdir, - lt_trdir_delta TYPE TABLE OF xtrdir. - - - CALL FUNCTION 'SVRS_COMPUTE_DELTA_REPS' - TABLES - texttab_old = it_remote - texttab_new = it_local - trdirtab_old = lt_trdirtab_old - trdirtab_new = lt_trdirtab_new - trdir_delta = lt_trdir_delta - text_delta = rt_delta. - - ENDMETHOD. "compute - - METHOD shortlist. - - DATA: lv_index TYPE i. - - FIELD-SYMBOLS: LIKE LINE OF mt_diff. - - IF lines( mt_diff ) < 500. - LOOP AT mt_diff ASSIGNING . - -short = abap_true. - ENDLOOP. - ELSE. - LOOP AT mt_diff TRANSPORTING NO FIELDS - WHERE NOT result IS INITIAL AND short = abap_false. - lv_index = sy-tabix. - - DO 20 TIMES. " Backward - READ TABLE mt_diff INDEX ( lv_index - sy-index ) ASSIGNING . - IF sy-subrc <> 0 OR -short = abap_true. " tab bound or prev marker - EXIT. - ENDIF. - -short = abap_true. - ENDDO. - - DO 20 TIMES. " Forward - READ TABLE mt_diff INDEX ( lv_index + sy-index - 1 ) ASSIGNING . - IF sy-subrc <> 0. " tab bound reached - EXIT. - ENDIF. - CHECK -short = abap_false. " skip marked - -short = abap_true. - ENDDO. - - ENDLOOP. - ENDIF. - - ENDMETHOD. " shortlist - - METHOD calculate_line_num_and_stats. - - DATA: lv_local TYPE i VALUE 1, - lv_remote TYPE i VALUE 1. - - FIELD-SYMBOLS: LIKE LINE OF mt_diff. - - - LOOP AT mt_diff ASSIGNING . - -local_line = lv_local. - -remote_line = lv_remote. - - CASE -result. " Line nums - WHEN c_diff-delete. - lv_remote = lv_remote + 1. - CLEAR -local_line. - WHEN c_diff-insert. - lv_local = lv_local + 1. - CLEAR -remote_line. - WHEN OTHERS. - lv_local = lv_local + 1. - lv_remote = lv_remote + 1. - ENDCASE. - - CASE -result. " Stats - WHEN c_diff-insert. - ms_stats-insert = ms_stats-insert + 1. - WHEN c_diff-delete. - ms_stats-delete = ms_stats-delete + 1. - WHEN c_diff-update. - ms_stats-update = ms_stats-update + 1. - ENDCASE. - - ENDLOOP. - - ENDMETHOD. " calculate_line_num_and_stats - - METHOD map_beacons. - - DEFINE _add_regex. - CREATE OBJECT lo_regex - EXPORTING pattern = &1 - ignore_case = abap_true ##NO_TEXT. - APPEND lo_regex TO lt_regex_set. - END-OF-DEFINITION. - - DATA: lv_beacon TYPE i, - lv_offs TYPE i, - lv_code_line TYPE string, - lo_regex TYPE REF TO cl_abap_regex, - lt_regex_set TYPE TABLE OF REF TO cl_abap_regex. - - FIELD-SYMBOLS: LIKE LINE OF mt_diff. - - - _add_regex '^\s*(CLASS|FORM|MODULE|REPORT)\s'. - _add_regex '^\s*START-OF-'. - _add_regex '^\s*INITIALIZATION(\s|\.)'. - - LOOP AT mt_diff ASSIGNING . - -beacon = lv_beacon. - LOOP AT lt_regex_set INTO lo_regex. - FIND FIRST OCCURRENCE OF REGEX lo_regex IN -local. - IF sy-subrc = 0. " Match - lv_code_line = -local. - - " Get rid of comments - FIND FIRST OCCURRENCE OF '.' IN lv_code_line MATCH OFFSET lv_offs. - IF sy-subrc = 0. - lv_code_line = lv_code_line(lv_offs). - ENDIF. - - APPEND lv_code_line TO mt_beacons. - lv_beacon = sy-tabix. - -beacon = lv_beacon. - EXIT. "Loop - ENDIF. - ENDLOOP. - ENDLOOP. - - ENDMETHOD. " map_beacons - - METHOD constructor. - - DATA: lt_delta TYPE vxabapt255_tab, - lt_local TYPE abaptxt255_tab, - lt_remote TYPE abaptxt255_tab. - - - unpack( EXPORTING iv_local = iv_local - iv_remote = iv_remote - IMPORTING et_local = lt_local - et_remote = lt_remote ). - - lt_delta = compute( it_local = lt_local - it_remote = lt_remote ). - - mt_diff = render( it_local = lt_local - it_remote = lt_remote - it_delta = lt_delta ). - - calculate_line_num_and_stats( ). - map_beacons( ). - shortlist( ). - - ENDMETHOD. "diff - - METHOD render. - - DEFINE _append. - CLEAR ls_diff. - ls_diff-local = &1. - ls_diff-result = &2. - ls_diff-remote = &3. - APPEND ls_diff TO rt_diff. - END-OF-DEFINITION. - - DATA: lv_rindex TYPE i VALUE 1, - lv_lindex TYPE i VALUE 1, - ls_local LIKE LINE OF it_local, - ls_remote LIKE LINE OF it_remote, - ls_diff LIKE LINE OF rt_diff, - lt_delta LIKE it_delta, - ls_delta LIKE LINE OF it_delta. - - - lt_delta = it_delta. - - DO. - READ TABLE lt_delta INTO ls_delta WITH KEY number = lv_rindex. - IF sy-subrc = 0. - DELETE lt_delta INDEX sy-tabix. - - CASE ls_delta-vrsflag. - WHEN c_diff-delete. - _append '' c_diff-delete ls_delta-line. - lv_rindex = lv_rindex + 1. - WHEN c_diff-insert. - _append ls_delta-line c_diff-insert ''. - lv_lindex = lv_lindex + 1. - WHEN c_diff-update. - CLEAR ls_local. - READ TABLE it_local INTO ls_local INDEX lv_lindex. - ASSERT sy-subrc = 0. - _append ls_local c_diff-update ls_delta-line. - lv_lindex = lv_lindex + 1. - lv_rindex = lv_rindex + 1. - WHEN OTHERS. - ASSERT 0 = 1. - ENDCASE. - ELSE. - CLEAR ls_local. - READ TABLE it_local INTO ls_local INDEX lv_lindex. "#EC CI_SUBRC - lv_lindex = lv_lindex + 1. - CLEAR ls_remote. - READ TABLE it_remote INTO ls_remote INDEX lv_rindex. "#EC CI_SUBRC - lv_rindex = lv_rindex + 1. - _append ls_local '' ls_remote. - ENDIF. - - IF lv_lindex > lines( it_local ) AND lv_rindex > lines( it_remote ). - EXIT. " current loop - ENDIF. - ENDDO. - - ENDMETHOD. " render - -ENDCLASS. "lcl_diff IMPLEMENTATION - CLASS ltcl_git_pack DEFINITION DEFERRED. *----------------------------------------------------------------------* @@ -14097,6 +12284,86 @@ CLASS lcl_html_action_utils IMPLEMENTATION. ENDCLASS. "lcl_html_action_utils IMPLEMENTATION +CLASS lcl_log DEFINITION FINAL. + + PUBLIC SECTION. + METHODS: + add + IMPORTING + iv_msgv1 TYPE csequence + iv_msgv2 TYPE csequence OPTIONAL + iv_msgv3 TYPE csequence OPTIONAL + iv_msgv4 TYPE csequence OPTIONAL, + count + RETURNING VALUE(rv_count) TYPE i, + to_html + RETURNING VALUE(ro_html) TYPE REF TO lcl_html_helper, + show. + + PRIVATE SECTION. + DATA: mt_log TYPE rs_t_msg. + +ENDCLASS. + +CLASS lcl_log IMPLEMENTATION. + + METHOD to_html. + + DATA: lv_string TYPE string. + + FIELD-SYMBOLS: LIKE LINE OF mt_log. + + CREATE OBJECT ro_html. + + IF count( ) = 0. + RETURN. + ENDIF. + + ro_html->add( '
' ). + LOOP AT mt_log ASSIGNING . + CONCATENATE -msgv1 + -msgv2 + -msgv3 + -msgv4 INTO lv_string SEPARATED BY space. + ro_html->add( lv_string ). + ro_html->add( '
' ). + ENDLOOP. + ro_html->add( '
' ). + + ENDMETHOD. + + METHOD add. + + FIELD-SYMBOLS: LIKE LINE OF mt_log. + + APPEND INITIAL LINE TO mt_log ASSIGNING . + -msgty = 'W'. + -msgid = '00'. + -msgno = '001'. + -msgv1 = iv_msgv1. + -msgv2 = iv_msgv2. + -msgv3 = iv_msgv3. + -msgv4 = iv_msgv4. + + ENDMETHOD. + + METHOD show. + CALL FUNCTION 'RSDC_SHOW_MESSAGES_POPUP' + EXPORTING + i_t_msg = mt_log + i_txt = 'Warning' + i_with_s_on_empty = abap_false + i_one_msg_direct = abap_false + i_one_msg_type_s = abap_false + ##no_text. + ENDMETHOD. + + METHOD count. + rv_count = lines( mt_log ). + ENDMETHOD. + +ENDCLASS. + *----------------------------------------------------------------------* * CLASS lcl_repo DEFINITION *----------------------------------------------------------------------* @@ -15504,123 +13771,6 @@ CLASS lcl_objects IMPLEMENTATION. ENDCLASS. "lcl_object IMPLEMENTATION -*----------------------------------------------------------------------* -* CLASS lcl_hash DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_hash DEFINITION FINAL. - - PUBLIC SECTION. - TYPES: ty_adler32 TYPE x LENGTH 4. - - CLASS-METHODS adler32 - IMPORTING iv_xstring TYPE xstring - RETURNING VALUE(rv_checksum) TYPE ty_adler32. - - CLASS-METHODS sha1 - IMPORTING iv_type TYPE ty_type - iv_data TYPE xstring - RETURNING VALUE(rv_sha1) TYPE ty_sha1 - RAISING lcx_exception. - - CLASS-METHODS sha1_raw - IMPORTING iv_data TYPE xstring - RETURNING VALUE(rv_sha1) TYPE ty_sha1 - RAISING lcx_exception. - -ENDCLASS. "lcl_hash DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_hash IMPLEMENTATION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_hash IMPLEMENTATION. - - METHOD adler32. - - CONSTANTS: lc_adler TYPE i VALUE 65521. - - DATA: lv_index TYPE i, - lv_a TYPE i VALUE 1, - lv_b TYPE i VALUE 0, - lv_x TYPE x LENGTH 2, - lv_ca TYPE c LENGTH 4, - lv_cb TYPE c LENGTH 4, - lv_char8 TYPE c LENGTH 8. - - - DO xstrlen( iv_xstring ) TIMES. - lv_index = sy-index - 1. - - lv_a = ( lv_a + iv_xstring+lv_index(1) ) MOD lc_adler. - lv_b = ( lv_b + lv_a ) MOD lc_adler. - ENDDO. - - lv_x = lv_a. - lv_ca = lv_x. - - lv_x = lv_b. - lv_cb = lv_x. - - CONCATENATE lv_cb lv_ca INTO lv_char8. - - rv_checksum = lv_char8. - - ENDMETHOD. "adler32 - - METHOD sha1_raw. - - DATA: lv_hash TYPE hash160. - - - CALL FUNCTION 'CALCULATE_HASH_FOR_RAW' - EXPORTING - data = iv_data - IMPORTING - hash = lv_hash - EXCEPTIONS - unknown_alg = 1 - param_error = 2 - internal_error = 3 - OTHERS = 4. - IF sy-subrc <> 0. - _raise 'Error while calculating SHA1'. - ENDIF. - - rv_sha1 = lv_hash. - - TRANSLATE rv_sha1 TO LOWER CASE. - - ENDMETHOD. "sha1_raw - - METHOD sha1. - - DATA: lv_len TYPE i, - lv_char10 TYPE c LENGTH 10, - lv_string TYPE string, - lv_xstring TYPE xstring. - - - lv_len = xstrlen( iv_data ). - lv_char10 = lv_len. - CONDENSE lv_char10. - CONCATENATE iv_type lv_char10 INTO lv_string SEPARATED BY space. - lv_xstring = lcl_convert=>string_to_xstring_utf8( lv_string ). - - lv_string = lv_xstring. - CONCATENATE lv_string '00' INTO lv_string. - lv_xstring = lv_string. - - CONCATENATE lv_xstring iv_data INTO lv_xstring IN BYTE MODE. - - rv_sha1 = sha1_raw( lv_xstring ). - - ENDMETHOD. "sha1 - -ENDCLASS. "lcl_hash IMPLEMENTATION - *----------------------------------------------------------------------* * CLASS lcl_pack IMPLEMENTATION *----------------------------------------------------------------------* @@ -18144,122 +16294,6 @@ CLASS lcl_repo_srv IMPLEMENTATION. ENDCLASS. "lcl_repo_srv IMPLEMENTATION -CLASS lcl_login_manager DEFINITION FINAL. - - PUBLIC SECTION. - CLASS-METHODS: - load - IMPORTING iv_uri TYPE string - ii_client TYPE REF TO if_http_client OPTIONAL - RETURNING VALUE(rv_authorization) TYPE string - RAISING lcx_exception, - save - IMPORTING iv_uri TYPE string - ii_client TYPE REF TO if_http_client - RAISING lcx_exception, - clear, - set - IMPORTING iv_uri TYPE string - iv_username TYPE string - iv_password TYPE string - RETURNING VALUE(rv_auth) TYPE string - RAISING lcx_exception. - - PRIVATE SECTION. - TYPES: BEGIN OF ty_auth, - uri TYPE string, - authorization TYPE string, - END OF ty_auth. - - CLASS-DATA: gt_auth TYPE TABLE OF ty_auth WITH DEFAULT KEY. - - CLASS-METHODS: - append - IMPORTING iv_uri TYPE string - iv_auth TYPE string - RAISING lcx_exception. - -ENDCLASS. - -CLASS lcl_login_manager IMPLEMENTATION. - - METHOD clear. - CLEAR gt_auth. - ENDMETHOD. - - METHOD set. - - DATA: lv_concat TYPE string. - - - ASSERT NOT iv_uri IS INITIAL. - - IF iv_username IS INITIAL OR iv_password IS INITIAL. - RETURN. - ENDIF. - - CONCATENATE iv_username ':' iv_password INTO lv_concat. - - rv_auth = cl_http_utility=>if_http_utility~encode_base64( lv_concat ). - - CONCATENATE 'Basic' rv_auth INTO rv_auth - SEPARATED BY space ##NO_TEXT. - - append( iv_uri = iv_uri - iv_auth = rv_auth ). - - ENDMETHOD. - - METHOD load. - - DATA: ls_auth LIKE LINE OF gt_auth. - - - READ TABLE gt_auth INTO ls_auth WITH KEY uri = lcl_url=>host( iv_uri ). - IF sy-subrc = 0. - rv_authorization = ls_auth-authorization. - - IF NOT ii_client IS INITIAL. - ii_client->request->set_header_field( - name = 'authorization' - value = ls_auth-authorization ). "#EC NOTEXT - ii_client->propertytype_logon_popup = ii_client->co_disabled. - ENDIF. - ENDIF. - - ENDMETHOD. - - METHOD save. - - DATA: lv_auth TYPE string. - - - lv_auth = ii_client->request->get_header_field( 'authorization' ). "#EC NOTEXT - - IF NOT lv_auth IS INITIAL. - append( iv_uri = iv_uri - iv_auth = lv_auth ). - ENDIF. - - ENDMETHOD. - - METHOD append. - - FIELD-SYMBOLS: LIKE LINE OF gt_auth. - - - READ TABLE gt_auth WITH KEY uri = lcl_url=>host( iv_uri ) - TRANSPORTING NO FIELDS. - IF sy-subrc <> 0. - APPEND INITIAL LINE TO gt_auth ASSIGNING . - -uri = lcl_url=>host( iv_uri ). - -authorization = iv_auth. - ENDIF. - - ENDMETHOD. - -ENDCLASS. - *----------------------------------------------------------------------* * CLASS lcl_transport DEFINITION *----------------------------------------------------------------------* @@ -23146,51 +21180,6 @@ CLASS lcl_persistence_migrate IMPLEMENTATION. ENDCLASS. -CLASS lcl_xml_pretty IMPLEMENTATION. - - METHOD print. - - DATA: li_ixml TYPE REF TO if_ixml, - li_xml_doc TYPE REF TO if_ixml_document, - li_stream_factory TYPE REF TO if_ixml_stream_factory, - li_istream TYPE REF TO if_ixml_istream, - li_parser TYPE REF TO if_ixml_parser, - li_ostream TYPE REF TO if_ixml_ostream, - li_renderer TYPE REF TO if_ixml_renderer. - - - ASSERT NOT iv_xml IS INITIAL. - - li_ixml = cl_ixml=>create( ). - li_xml_doc = li_ixml->create_document( ). - - li_stream_factory = li_ixml->create_stream_factory( ). - li_istream = li_stream_factory->create_istream_string( iv_xml ). - li_parser = li_ixml->create_parser( stream_factory = li_stream_factory - istream = li_istream - document = li_xml_doc ). - li_parser->set_normalizing( abap_true ). - IF li_parser->parse( ) <> 0. -* ignore errors - rv_xml = iv_xml. - RETURN. - ENDIF. - li_istream->close( ). - - - li_ostream = li_stream_factory->create_ostream_cstring( rv_xml ). - - li_renderer = li_ixml->create_renderer( ostream = li_ostream - document = li_xml_doc ). - - li_renderer->set_normalizing( abap_true ). - - li_renderer->render( ). - - ENDMETHOD. - -ENDCLASS. - CLASS lcl_gui_page_db_display DEFINITION FINAL INHERITING FROM lcl_gui_page_super. PUBLIC SECTION. @@ -24439,6 +22428,13 @@ INCLUDE zabapgit_unit_test. * Hide Execute button from screen AT SELECTION-SCREEN OUTPUT. + PERFORM output. + +* SAP back command re-direction +AT SELECTION-SCREEN ON EXIT-COMMAND. + PERFORM exit. + +FORM output. DATA: lt_ucomm TYPE TABLE OF sy-ucomm. PERFORM set_pf_status IN PROGRAM rsdbrunt IF FOUND. @@ -24449,12 +22445,13 @@ AT SELECTION-SCREEN OUTPUT. p_status = sy-pfkey TABLES p_exclude = lt_ucomm. +ENDFORM. -* SAP back command re-direction -AT SELECTION-SCREEN ON EXIT-COMMAND. +FORM exit RAISING lcx_exception. CASE sy-ucomm. WHEN 'CBAC'. "Back IF lcl_app=>gui( )->back( ) IS INITIAL. LEAVE TO SCREEN 1001. ENDIF. - ENDCASE. \ No newline at end of file + ENDCASE. +ENDFORM. \ No newline at end of file diff --git a/src/zabapgit_exceptions.prog.abap b/src/zabapgit_exceptions.prog.abap new file mode 100644 index 000000000..a668bdfd8 --- /dev/null +++ b/src/zabapgit_exceptions.prog.abap @@ -0,0 +1,55 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_EXCEPTIONS +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS LCX_EXCEPTION DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcx_exception DEFINITION INHERITING FROM cx_static_check FINAL. + + PUBLIC SECTION. + DATA mv_text TYPE string. + + METHODS constructor + IMPORTING iv_text TYPE string + ix_previous TYPE REF TO cx_root OPTIONAL. + + PRIVATE SECTION. + DATA mx_previous TYPE REF TO cx_root. + +ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION + +*----------------------------------------------------------------------* +* CLASS LCX_EXCEPTION IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcx_exception IMPLEMENTATION. + + METHOD constructor. + super->constructor( ). + mv_text = iv_text. + mx_previous = previous. + ENDMETHOD. "CONSTRUCTOR + +ENDCLASS. "lcx_exception IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS LCX_NOT_FOUND DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcx_not_found DEFINITION INHERITING FROM cx_static_check FINAL. + +ENDCLASS. "CX_LOCAL_EXCEPTION DEFINITION + +*----------------------------------------------------------------------* +* CLASS LCX_NOT_FOUND IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcx_not_found IMPLEMENTATION. + +ENDCLASS. "lcx_not_found IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_exceptions.prog.xml b/src/zabapgit_exceptions.prog.xml new file mode 100644 index 000000000..86be0fe8d --- /dev/null +++ b/src/zabapgit_exceptions.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_EXCEPTIONS + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_EXCEPTIONS + 27 + + + + + + diff --git a/src/zabapgit_util.prog.abap b/src/zabapgit_util.prog.abap new file mode 100644 index 000000000..1f225c569 --- /dev/null +++ b/src/zabapgit_util.prog.abap @@ -0,0 +1,854 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_UTIL +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_time DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_time DEFINITION FINAL. + + PUBLIC SECTION. + TYPES: ty_unixtime TYPE c LENGTH 16. + + CLASS-METHODS get + RETURNING VALUE(rv_time) TYPE ty_unixtime + RAISING lcx_exception. + + PRIVATE SECTION. + CONSTANTS: c_epoch TYPE datum VALUE '19700101'. + +ENDCLASS. "lcl_time DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_time IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_time IMPLEMENTATION. + + METHOD get. + + DATA: lv_i TYPE i, + lv_tz TYPE tznzone, + lv_utcdiff TYPE tznutcdiff, + lv_utcsign TYPE tznutcsign. + + + lv_i = sy-datum - c_epoch. + lv_i = lv_i * 86400. + lv_i = lv_i + sy-uzeit. + + CALL FUNCTION 'TZON_GET_OS_TIMEZONE' + IMPORTING + ef_timezone = lv_tz. + + CALL FUNCTION 'TZON_GET_OFFSET' + EXPORTING + if_timezone = lv_tz + if_local_date = sy-datum + if_local_time = sy-uzeit + IMPORTING + ef_utcdiff = lv_utcdiff + ef_utcsign = lv_utcsign + EXCEPTIONS + conversion_error = 1 + OTHERS = 2. + IF sy-subrc <> 0. + _raise 'Timezone error'. + ENDIF. + + CASE lv_utcsign. + WHEN '+'. + lv_i = lv_i - lv_utcdiff. + WHEN '-'. + lv_i = lv_i + lv_utcdiff. + ENDCASE. + + rv_time = lv_i. + CONDENSE rv_time. + rv_time+11 = lv_utcsign. + rv_time+12 = lv_utcdiff. + + ENDMETHOD. "get + +ENDCLASS. "lcl_time IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_convert DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_convert DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS bitbyte_to_int + IMPORTING iv_bits TYPE clike + RETURNING VALUE(rv_int) TYPE i. + + CLASS-METHODS x_to_bitbyte + IMPORTING iv_x TYPE x + RETURNING VALUE(rv_bitbyte) TYPE ty_bitbyte. + + CLASS-METHODS string_to_xstring_utf8 + IMPORTING iv_string TYPE string + RETURNING VALUE(rv_xstring) TYPE xstring. + + CLASS-METHODS xstring_to_string_utf8 + IMPORTING iv_data TYPE xstring + RETURNING VALUE(rv_string) TYPE string. + + CLASS-METHODS xstring_to_int + IMPORTING iv_xstring TYPE xstring + RETURNING VALUE(rv_i) TYPE i + RAISING lcx_exception. + + CLASS-METHODS int_to_xstring + IMPORTING iv_i TYPE i + iv_length TYPE i + RETURNING VALUE(rv_xstring) TYPE xstring. + +ENDCLASS. "lcl_convert DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_convert IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_convert IMPLEMENTATION. + + METHOD int_to_xstring. + + DATA: lv_x TYPE x LENGTH 4. + + + ASSERT iv_length = 4. " other cases not implemented + + lv_x = iv_i. + rv_xstring = lv_x. + + ENDMETHOD. "int_to_xstring + + METHOD xstring_to_int. + + DATA: lv_xstring TYPE xstring, + lv_x TYPE x. + + + lv_xstring = iv_xstring. + WHILE xstrlen( lv_xstring ) > 0. + lv_x = lv_xstring(1). + rv_i = rv_i * 256 + lv_x. + lv_xstring = lv_xstring+1. + ENDWHILE. + + ENDMETHOD. "xstring_to_int + + METHOD xstring_to_string_utf8. + + DATA: lv_len TYPE i, + lo_obj TYPE REF TO cl_abap_conv_in_ce. + + + TRY. + lo_obj = cl_abap_conv_in_ce=>create( + input = iv_data + encoding = 'UTF-8' ). + lv_len = xstrlen( iv_data ). + + lo_obj->read( EXPORTING n = lv_len + IMPORTING data = rv_string ). + + CATCH cx_parameter_invalid_range + cx_sy_codepage_converter_init + cx_sy_conversion_codepage + cx_parameter_invalid_type. "#EC NO_HANDLER + ENDTRY. + + ENDMETHOD. "xstring_to_string_utf8 + + METHOD string_to_xstring_utf8. + + DATA: lo_obj TYPE REF TO cl_abap_conv_out_ce. + + + TRY. + lo_obj = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ). + + lo_obj->convert( EXPORTING data = iv_string + IMPORTING buffer = rv_xstring ). + + CATCH cx_parameter_invalid_range + cx_sy_codepage_converter_init + cx_sy_conversion_codepage + cx_parameter_invalid_type. "#EC NO_HANDLER + ENDTRY. + + ENDMETHOD. "string_to_xstring_utf8 + + METHOD bitbyte_to_int. + + DATA: lv_bits TYPE string. + + + lv_bits = iv_bits. + + rv_int = 0. + WHILE strlen( lv_bits ) > 0. + rv_int = rv_int * 2. + IF lv_bits(1) = '1'. + rv_int = rv_int + 1. + ENDIF. + lv_bits = lv_bits+1. + ENDWHILE. + + ENDMETHOD. "bitbyte_to_int + + METHOD x_to_bitbyte. + + DATA: lv_b TYPE n. + + CLEAR rv_bitbyte. + + DO 8 TIMES. + GET BIT sy-index OF iv_x INTO lv_b. + CONCATENATE rv_bitbyte lv_b INTO rv_bitbyte. + ENDDO. + + ENDMETHOD. "x_to_bitbyte + +ENDCLASS. "lcl_convert IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_hash DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_hash DEFINITION FINAL. + + PUBLIC SECTION. + TYPES: ty_adler32 TYPE x LENGTH 4. + + CLASS-METHODS adler32 + IMPORTING iv_xstring TYPE xstring + RETURNING VALUE(rv_checksum) TYPE ty_adler32. + + CLASS-METHODS sha1 + IMPORTING iv_type TYPE ty_type + iv_data TYPE xstring + RETURNING VALUE(rv_sha1) TYPE ty_sha1 + RAISING lcx_exception. + + CLASS-METHODS sha1_raw + IMPORTING iv_data TYPE xstring + RETURNING VALUE(rv_sha1) TYPE ty_sha1 + RAISING lcx_exception. + +ENDCLASS. "lcl_hash DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_hash IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_hash IMPLEMENTATION. + + METHOD adler32. + + CONSTANTS: lc_adler TYPE i VALUE 65521. + + DATA: lv_index TYPE i, + lv_a TYPE i VALUE 1, + lv_b TYPE i VALUE 0, + lv_x TYPE x LENGTH 2, + lv_ca TYPE c LENGTH 4, + lv_cb TYPE c LENGTH 4, + lv_char8 TYPE c LENGTH 8. + + + DO xstrlen( iv_xstring ) TIMES. + lv_index = sy-index - 1. + + lv_a = ( lv_a + iv_xstring+lv_index(1) ) MOD lc_adler. + lv_b = ( lv_b + lv_a ) MOD lc_adler. + ENDDO. + + lv_x = lv_a. + lv_ca = lv_x. + + lv_x = lv_b. + lv_cb = lv_x. + + CONCATENATE lv_cb lv_ca INTO lv_char8. + + rv_checksum = lv_char8. + + ENDMETHOD. "adler32 + + METHOD sha1_raw. + + DATA: lv_hash TYPE hash160. + + + CALL FUNCTION 'CALCULATE_HASH_FOR_RAW' + EXPORTING + data = iv_data + IMPORTING + hash = lv_hash + EXCEPTIONS + unknown_alg = 1 + param_error = 2 + internal_error = 3 + OTHERS = 4. + IF sy-subrc <> 0. + _raise 'Error while calculating SHA1'. + ENDIF. + + rv_sha1 = lv_hash. + + TRANSLATE rv_sha1 TO LOWER CASE. + + ENDMETHOD. "sha1_raw + + METHOD sha1. + + DATA: lv_len TYPE i, + lv_char10 TYPE c LENGTH 10, + lv_string TYPE string, + lv_xstring TYPE xstring. + + + lv_len = xstrlen( iv_data ). + lv_char10 = lv_len. + CONDENSE lv_char10. + CONCATENATE iv_type lv_char10 INTO lv_string SEPARATED BY space. + lv_xstring = lcl_convert=>string_to_xstring_utf8( lv_string ). + + lv_string = lv_xstring. + CONCATENATE lv_string '00' INTO lv_string. + lv_xstring = lv_string. + + CONCATENATE lv_xstring iv_data INTO lv_xstring IN BYTE MODE. + + rv_sha1 = sha1_raw( lv_xstring ). + + ENDMETHOD. "sha1 + +ENDCLASS. "lcl_hash IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_url DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_url DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS host + IMPORTING iv_repo TYPE string + RETURNING VALUE(rv_host) TYPE string + RAISING lcx_exception. + + CLASS-METHODS name + IMPORTING iv_repo TYPE string + RETURNING VALUE(rv_name) TYPE string + RAISING lcx_exception. + + CLASS-METHODS path_name + IMPORTING iv_repo TYPE string + RETURNING VALUE(rv_path_name) TYPE string + RAISING lcx_exception. + + PRIVATE SECTION. + CLASS-METHODS regex + IMPORTING iv_repo TYPE string + EXPORTING ev_host TYPE string + ev_path TYPE string + ev_name TYPE string + RAISING lcx_exception. + +ENDCLASS. "lcl_repo DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_url IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_url IMPLEMENTATION. + + METHOD host. + regex( EXPORTING iv_repo = iv_repo + IMPORTING ev_host = rv_host ). + ENDMETHOD. "host + + METHOD name. + regex( EXPORTING iv_repo = iv_repo + IMPORTING ev_name = rv_name ). + ENDMETHOD. "short_name + + METHOD path_name. + + DATA: lv_path TYPE string, + lv_name TYPE string. + + regex( EXPORTING iv_repo = iv_repo + IMPORTING ev_path = lv_path + ev_name = lv_name ). + + CONCATENATE lv_path lv_name INTO rv_path_name. + + ENDMETHOD. "path_name + + METHOD regex. + + FIND REGEX '(.*://[^/]*)(.*/)(.*).git' IN iv_repo + SUBMATCHES ev_host ev_path ev_name. + IF sy-subrc <> 0. + _raise 'Malformed URL'. + ENDIF. + + ENDMETHOD. "url + +ENDCLASS. "lcl_repo IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_diff DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_diff DEFINITION FINAL. + + PUBLIC SECTION. + CONSTANTS: BEGIN OF c_diff, + insert TYPE c LENGTH 1 VALUE 'I', + delete TYPE c LENGTH 1 VALUE 'D', + update TYPE c LENGTH 1 VALUE 'U', + END OF c_diff. + + TYPES: BEGIN OF ty_diff, + local_line TYPE c LENGTH 6, + local TYPE string, + result TYPE c LENGTH 1, + remote_line TYPE c LENGTH 6, + remote TYPE string, + short TYPE abap_bool, + beacon TYPE i, + END OF ty_diff. + TYPES: ty_diffs_tt TYPE STANDARD TABLE OF ty_diff WITH DEFAULT KEY. + + TYPES: BEGIN OF ty_count, + insert TYPE i, + delete TYPE i, + update TYPE i, + END OF ty_count. + + DATA mt_beacons TYPE ty_string_tt READ-ONLY. + +* assumes data is UTF8 based with newlines +* only works with lines up to 255 characters + METHODS constructor + IMPORTING iv_local TYPE xstring + iv_remote TYPE xstring. + + METHODS get + RETURNING VALUE(rt_diff) TYPE ty_diffs_tt. + + METHODS stats + RETURNING VALUE(rs_count) TYPE ty_count. + + PRIVATE SECTION. + DATA mt_diff TYPE ty_diffs_tt. + DATA ms_stats TYPE ty_count. + + CLASS-METHODS: + unpack + IMPORTING iv_local TYPE xstring + iv_remote TYPE xstring + EXPORTING et_local TYPE abaptxt255_tab + et_remote TYPE abaptxt255_tab, + render + IMPORTING it_local TYPE abaptxt255_tab + it_remote TYPE abaptxt255_tab + it_delta TYPE vxabapt255_tab + RETURNING VALUE(rt_diff) TYPE ty_diffs_tt, + compute + IMPORTING it_local TYPE abaptxt255_tab + it_remote TYPE abaptxt255_tab + RETURNING VALUE(rt_delta) TYPE vxabapt255_tab. + + METHODS: + calculate_line_num_and_stats, + map_beacons, + shortlist. + +ENDCLASS. "lcl_diff DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_diff IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_diff IMPLEMENTATION. + + METHOD get. + rt_diff = mt_diff. + ENDMETHOD. "get + + METHOD stats. + rs_count = ms_stats. + ENDMETHOD. "count + + METHOD unpack. + + DATA: lv_local TYPE string, + lv_remote TYPE string. + + + lv_local = lcl_convert=>xstring_to_string_utf8( iv_local ). + lv_remote = lcl_convert=>xstring_to_string_utf8( iv_remote ). + + SPLIT lv_local AT gc_newline INTO TABLE et_local. + SPLIT lv_remote AT gc_newline INTO TABLE et_remote. + + ENDMETHOD. "unpack + + METHOD compute. + + DATA: lt_trdirtab_old TYPE TABLE OF trdir, + lt_trdirtab_new TYPE TABLE OF trdir, + lt_trdir_delta TYPE TABLE OF xtrdir. + + + CALL FUNCTION 'SVRS_COMPUTE_DELTA_REPS' + TABLES + texttab_old = it_remote + texttab_new = it_local + trdirtab_old = lt_trdirtab_old + trdirtab_new = lt_trdirtab_new + trdir_delta = lt_trdir_delta + text_delta = rt_delta. + + ENDMETHOD. "compute + + METHOD shortlist. + + DATA: lv_index TYPE i. + + FIELD-SYMBOLS: LIKE LINE OF mt_diff. + + IF lines( mt_diff ) < 500. + LOOP AT mt_diff ASSIGNING . + -short = abap_true. + ENDLOOP. + ELSE. + LOOP AT mt_diff TRANSPORTING NO FIELDS + WHERE NOT result IS INITIAL AND short = abap_false. + lv_index = sy-tabix. + + DO 20 TIMES. " Backward + READ TABLE mt_diff INDEX ( lv_index - sy-index ) ASSIGNING . + IF sy-subrc <> 0 OR -short = abap_true. " tab bound or prev marker + EXIT. + ENDIF. + -short = abap_true. + ENDDO. + + DO 20 TIMES. " Forward + READ TABLE mt_diff INDEX ( lv_index + sy-index - 1 ) ASSIGNING . + IF sy-subrc <> 0. " tab bound reached + EXIT. + ENDIF. + CHECK -short = abap_false. " skip marked + -short = abap_true. + ENDDO. + + ENDLOOP. + ENDIF. + + ENDMETHOD. " shortlist + + METHOD calculate_line_num_and_stats. + + DATA: lv_local TYPE i VALUE 1, + lv_remote TYPE i VALUE 1. + + FIELD-SYMBOLS: LIKE LINE OF mt_diff. + + + LOOP AT mt_diff ASSIGNING . + -local_line = lv_local. + -remote_line = lv_remote. + + CASE -result. " Line nums + WHEN c_diff-delete. + lv_remote = lv_remote + 1. + CLEAR -local_line. + WHEN c_diff-insert. + lv_local = lv_local + 1. + CLEAR -remote_line. + WHEN OTHERS. + lv_local = lv_local + 1. + lv_remote = lv_remote + 1. + ENDCASE. + + CASE -result. " Stats + WHEN c_diff-insert. + ms_stats-insert = ms_stats-insert + 1. + WHEN c_diff-delete. + ms_stats-delete = ms_stats-delete + 1. + WHEN c_diff-update. + ms_stats-update = ms_stats-update + 1. + ENDCASE. + + ENDLOOP. + + ENDMETHOD. " calculate_line_num_and_stats + + METHOD map_beacons. + + DEFINE _add_regex. + CREATE OBJECT lo_regex + EXPORTING pattern = &1 + ignore_case = abap_true ##NO_TEXT. + APPEND lo_regex TO lt_regex_set. + END-OF-DEFINITION. + + DATA: lv_beacon TYPE i, + lv_offs TYPE i, + lv_code_line TYPE string, + lo_regex TYPE REF TO cl_abap_regex, + lt_regex_set TYPE TABLE OF REF TO cl_abap_regex. + + FIELD-SYMBOLS: LIKE LINE OF mt_diff. + + + _add_regex '^\s*(CLASS|FORM|MODULE|REPORT)\s'. + _add_regex '^\s*START-OF-'. + _add_regex '^\s*INITIALIZATION(\s|\.)'. + + LOOP AT mt_diff ASSIGNING . + -beacon = lv_beacon. + LOOP AT lt_regex_set INTO lo_regex. + FIND FIRST OCCURRENCE OF REGEX lo_regex IN -local. + IF sy-subrc = 0. " Match + lv_code_line = -local. + + " Get rid of comments + FIND FIRST OCCURRENCE OF '.' IN lv_code_line MATCH OFFSET lv_offs. + IF sy-subrc = 0. + lv_code_line = lv_code_line(lv_offs). + ENDIF. + + APPEND lv_code_line TO mt_beacons. + lv_beacon = sy-tabix. + -beacon = lv_beacon. + EXIT. "Loop + ENDIF. + ENDLOOP. + ENDLOOP. + + ENDMETHOD. " map_beacons + + METHOD constructor. + + DATA: lt_delta TYPE vxabapt255_tab, + lt_local TYPE abaptxt255_tab, + lt_remote TYPE abaptxt255_tab. + + + unpack( EXPORTING iv_local = iv_local + iv_remote = iv_remote + IMPORTING et_local = lt_local + et_remote = lt_remote ). + + lt_delta = compute( it_local = lt_local + it_remote = lt_remote ). + + mt_diff = render( it_local = lt_local + it_remote = lt_remote + it_delta = lt_delta ). + + calculate_line_num_and_stats( ). + map_beacons( ). + shortlist( ). + + ENDMETHOD. "diff + + METHOD render. + + DEFINE _append. + CLEAR ls_diff. + ls_diff-local = &1. + ls_diff-result = &2. + ls_diff-remote = &3. + APPEND ls_diff TO rt_diff. + END-OF-DEFINITION. + + DATA: lv_rindex TYPE i VALUE 1, + lv_lindex TYPE i VALUE 1, + ls_local LIKE LINE OF it_local, + ls_remote LIKE LINE OF it_remote, + ls_diff LIKE LINE OF rt_diff, + lt_delta LIKE it_delta, + ls_delta LIKE LINE OF it_delta. + + + lt_delta = it_delta. + + DO. + READ TABLE lt_delta INTO ls_delta WITH KEY number = lv_rindex. + IF sy-subrc = 0. + DELETE lt_delta INDEX sy-tabix. + + CASE ls_delta-vrsflag. + WHEN c_diff-delete. + _append '' c_diff-delete ls_delta-line. + lv_rindex = lv_rindex + 1. + WHEN c_diff-insert. + _append ls_delta-line c_diff-insert ''. + lv_lindex = lv_lindex + 1. + WHEN c_diff-update. + CLEAR ls_local. + READ TABLE it_local INTO ls_local INDEX lv_lindex. + ASSERT sy-subrc = 0. + _append ls_local c_diff-update ls_delta-line. + lv_lindex = lv_lindex + 1. + lv_rindex = lv_rindex + 1. + WHEN OTHERS. + ASSERT 0 = 1. + ENDCASE. + ELSE. + CLEAR ls_local. + READ TABLE it_local INTO ls_local INDEX lv_lindex. "#EC CI_SUBRC + lv_lindex = lv_lindex + 1. + CLEAR ls_remote. + READ TABLE it_remote INTO ls_remote INDEX lv_rindex. "#EC CI_SUBRC + lv_rindex = lv_rindex + 1. + _append ls_local '' ls_remote. + ENDIF. + + IF lv_lindex > lines( it_local ) AND lv_rindex > lines( it_remote ). + EXIT. " current loop + ENDIF. + ENDDO. + + ENDMETHOD. " render + +ENDCLASS. "lcl_diff IMPLEMENTATION + +CLASS lcl_login_manager DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS: + load + IMPORTING iv_uri TYPE string + ii_client TYPE REF TO if_http_client OPTIONAL + RETURNING VALUE(rv_authorization) TYPE string + RAISING lcx_exception, + save + IMPORTING iv_uri TYPE string + ii_client TYPE REF TO if_http_client + RAISING lcx_exception, + clear, + set + IMPORTING iv_uri TYPE string + iv_username TYPE string + iv_password TYPE string + RETURNING VALUE(rv_auth) TYPE string + RAISING lcx_exception. + + PRIVATE SECTION. + TYPES: BEGIN OF ty_auth, + uri TYPE string, + authorization TYPE string, + END OF ty_auth. + + CLASS-DATA: gt_auth TYPE TABLE OF ty_auth WITH DEFAULT KEY. + + CLASS-METHODS: + append + IMPORTING iv_uri TYPE string + iv_auth TYPE string + RAISING lcx_exception. + +ENDCLASS. + +CLASS lcl_login_manager IMPLEMENTATION. + + METHOD clear. + CLEAR gt_auth. + ENDMETHOD. + + METHOD set. + + DATA: lv_concat TYPE string. + + + ASSERT NOT iv_uri IS INITIAL. + + IF iv_username IS INITIAL OR iv_password IS INITIAL. + RETURN. + ENDIF. + + CONCATENATE iv_username ':' iv_password INTO lv_concat. + + rv_auth = cl_http_utility=>if_http_utility~encode_base64( lv_concat ). + + CONCATENATE 'Basic' rv_auth INTO rv_auth + SEPARATED BY space ##NO_TEXT. + + append( iv_uri = iv_uri + iv_auth = rv_auth ). + + ENDMETHOD. + + METHOD load. + + DATA: ls_auth LIKE LINE OF gt_auth. + + + READ TABLE gt_auth INTO ls_auth WITH KEY uri = lcl_url=>host( iv_uri ). + IF sy-subrc = 0. + rv_authorization = ls_auth-authorization. + + IF NOT ii_client IS INITIAL. + ii_client->request->set_header_field( + name = 'authorization' + value = ls_auth-authorization ). "#EC NOTEXT + ii_client->propertytype_logon_popup = ii_client->co_disabled. + ENDIF. + ENDIF. + + ENDMETHOD. + + METHOD save. + + DATA: lv_auth TYPE string. + + + lv_auth = ii_client->request->get_header_field( 'authorization' ). "#EC NOTEXT + + IF NOT lv_auth IS INITIAL. + append( iv_uri = iv_uri + iv_auth = lv_auth ). + ENDIF. + + ENDMETHOD. + + METHOD append. + + FIELD-SYMBOLS: LIKE LINE OF gt_auth. + + + READ TABLE gt_auth WITH KEY uri = lcl_url=>host( iv_uri ) + TRANSPORTING NO FIELDS. + IF sy-subrc <> 0. + APPEND INITIAL LINE TO gt_auth ASSIGNING . + -uri = lcl_url=>host( iv_uri ). + -authorization = iv_auth. + ENDIF. + + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_util.prog.xml b/src/zabapgit_util.prog.xml new file mode 100644 index 000000000..8fc89ca26 --- /dev/null +++ b/src/zabapgit_util.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_UTIL + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_UTIL + 21 + + + + + + diff --git a/src/zabapgit_xml.prog.abap b/src/zabapgit_xml.prog.abap new file mode 100644 index 000000000..81f9a3b38 --- /dev/null +++ b/src/zabapgit_xml.prog.abap @@ -0,0 +1,409 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_XML +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_xml DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_xml DEFINITION ABSTRACT. + + PUBLIC SECTION. + METHODS: + constructor. + + PROTECTED SECTION. + DATA: mi_ixml TYPE REF TO if_ixml, + mi_xml_doc TYPE REF TO if_ixml_document, + ms_metadata TYPE ty_metadata. + + CONSTANTS: c_abapgit_tag TYPE string VALUE 'abapGit' ##NO_TEXT, + c_attr_version TYPE string VALUE 'version' ##NO_TEXT, + c_attr_serializer TYPE string VALUE 'serializer' ##NO_TEXT, + c_attr_serializer_version TYPE string VALUE 'serializer_version' ##NO_TEXT. + + METHODS to_xml + IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true + RETURNING VALUE(rv_xml) TYPE string. + + METHODS parse + IMPORTING iv_normalize TYPE abap_bool DEFAULT abap_true + iv_xml TYPE string + RAISING lcx_exception. + + PRIVATE SECTION. + METHODS error + IMPORTING ii_parser TYPE REF TO if_ixml_parser + RAISING lcx_exception. + + METHODS display_xml_error + RAISING lcx_exception. + +ENDCLASS. "lcl_xml DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_xml IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_xml IMPLEMENTATION. + + METHOD constructor. + mi_ixml = cl_ixml=>create( ). + mi_xml_doc = mi_ixml->create_document( ). + ENDMETHOD. "constructor + + METHOD parse. + + DATA: li_stream_factory TYPE REF TO if_ixml_stream_factory, + li_istream TYPE REF TO if_ixml_istream, + li_element TYPE REF TO if_ixml_element, + li_version TYPE REF TO if_ixml_node, + li_parser TYPE REF TO if_ixml_parser. + + + ASSERT NOT iv_xml IS INITIAL. + + li_stream_factory = mi_ixml->create_stream_factory( ). + li_istream = li_stream_factory->create_istream_string( iv_xml ). + li_parser = mi_ixml->create_parser( stream_factory = li_stream_factory + istream = li_istream + document = mi_xml_doc ). + li_parser->set_normalizing( iv_normalize ). + IF li_parser->parse( ) <> 0. + error( li_parser ). + ENDIF. + + li_istream->close( ). + + + li_element = mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ). + li_version = li_element->if_ixml_node~get_attributes( + )->get_named_item_ns( c_attr_version ) ##no_text. + IF li_version->get_value( ) <> gc_xml_version. + display_xml_error( ). + ENDIF. + +* buffer serializer metadata. Git node will be removed lateron + ms_metadata-class = li_element->get_attribute_ns( c_attr_serializer ). + ms_metadata-version = li_element->get_attribute_ns( c_attr_serializer_version ). + + ENDMETHOD. "parse + + METHOD display_xml_error. + + DATA: lv_version TYPE string. + + + lv_version = |abapGit version: { gc_abap_version }|. + + CALL FUNCTION 'POPUP_TO_INFORM' + EXPORTING + titel = 'abapGit XML version mismatch' + txt1 = 'abapGit XML version mismatch' + txt2 = 'See https://github.com/larshp/abapGit/wiki/XML-Mismatch' + txt3 = lv_version. "#EC NOTEXT + + _raise 'XML error'. + + ENDMETHOD. "display_xml_error + + METHOD to_xml. +* will render to codepage UTF-16 + + DATA: li_ostream TYPE REF TO if_ixml_ostream, + li_renderer TYPE REF TO if_ixml_renderer, + li_streamfactory TYPE REF TO if_ixml_stream_factory. + + + li_streamfactory = mi_ixml->create_stream_factory( ). + + li_ostream = li_streamfactory->create_ostream_cstring( rv_xml ). + + li_renderer = mi_ixml->create_renderer( ostream = li_ostream + document = mi_xml_doc ). + li_renderer->set_normalizing( iv_normalize ). + + li_renderer->render( ). + + ENDMETHOD. "to_xml + + METHOD error. + + DATA: lv_error TYPE i, + lv_txt1 TYPE string, + lv_txt2 TYPE string, + lv_txt3 TYPE string, + lv_times TYPE i, + li_error TYPE REF TO if_ixml_parse_error. + + + IF ii_parser->num_errors( ) <> 0. + lv_times = ii_parser->num_errors( ). + DO lv_times TIMES. + lv_error = sy-index - 1. + li_error = ii_parser->get_error( lv_error ). + + lv_txt1 = li_error->get_column( ). + CONCATENATE 'Column:' lv_txt1 INTO lv_txt1. "#EC NOTEXT + lv_txt2 = li_error->get_line( ). + CONCATENATE 'Line:' lv_txt2 INTO lv_txt2. "#EC NOTEXT + lv_txt3 = li_error->get_reason( ). + + CALL FUNCTION 'POPUP_TO_INFORM' + EXPORTING + titel = 'Error from XML parser' "#EC NOTEXT + txt1 = lv_txt1 + txt2 = lv_txt2 + txt3 = lv_txt3. + ENDDO. + ENDIF. + + _raise 'Error while parsing XML'. + ENDMETHOD. "error + +ENDCLASS. "lcl_xml IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_xml_output DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_xml_output DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC. + + PUBLIC SECTION. + METHODS: + add + IMPORTING iv_name TYPE clike + ig_data TYPE any + RAISING lcx_exception, + set_raw + IMPORTING ii_raw TYPE REF TO if_ixml_element, + render + IMPORTING iv_normalize TYPE sap_bool DEFAULT abap_true + is_metadata TYPE ty_metadata OPTIONAL + RETURNING VALUE(rv_xml) TYPE string. + + PRIVATE SECTION. + DATA: mi_raw TYPE REF TO if_ixml_element. + +ENDCLASS. "lcl_xml_output DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_xml_output IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_xml_output IMPLEMENTATION. + + METHOD set_raw. + mi_raw = ii_raw. + ENDMETHOD. "set_raw + + METHOD add. + + DATA: li_node TYPE REF TO if_ixml_node, + li_doc TYPE REF TO if_ixml_document, + lt_stab TYPE abap_trans_srcbind_tab. + + FIELD-SYMBOLS: LIKE LINE OF lt_stab. + + + ASSERT NOT iv_name IS INITIAL. + + APPEND INITIAL LINE TO lt_stab ASSIGNING . + -name = iv_name. + GET REFERENCE OF ig_data INTO -value. + + li_doc = cl_ixml=>create( )->create_document( ). + + CALL TRANSFORMATION id + SOURCE (lt_stab) + RESULT XML li_doc. + + li_node = mi_xml_doc->get_root( )->get_first_child( ). + IF li_node IS BOUND. + mi_xml_doc->get_root( )->get_first_child( )->get_first_child( )->append_child( + li_doc->get_root( )->get_first_child( )->get_first_child( )->get_first_child( ) ). + ELSE. + mi_xml_doc->get_root( )->append_child( li_doc->get_root( )->get_first_child( ) ). + ENDIF. + + ENDMETHOD. "add + + METHOD render. + + DATA: li_git TYPE REF TO if_ixml_element, + li_abap TYPE REF TO if_ixml_element. + + + IF mi_raw IS INITIAL. + li_abap ?= mi_xml_doc->get_root( )->get_first_child( ). + mi_xml_doc->get_root( )->remove_child( li_abap ). + ELSE. + li_abap = mi_raw. + ENDIF. + + li_git = mi_xml_doc->create_element( c_abapgit_tag ). + li_git->set_attribute( name = c_attr_version value = gc_xml_version ). "#EC NOTEXT + IF NOT is_metadata IS INITIAL. + li_git->set_attribute( name = c_attr_serializer + value = is_metadata-class ). "#EC NOTEXT + li_git->set_attribute( name = c_attr_serializer_version + value = is_metadata-version ). "#EC NOTEXT + ENDIF. + li_git->append_child( li_abap ). + mi_xml_doc->get_root( )->append_child( li_git ). + + rv_xml = to_xml( iv_normalize ). + + ENDMETHOD. "render + +ENDCLASS. "lcl_xml_output IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_xml_input DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_xml_input DEFINITION FINAL INHERITING FROM lcl_xml CREATE PUBLIC. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING iv_xml TYPE clike + RAISING lcx_exception, + read + IMPORTING iv_name TYPE clike + CHANGING cg_data TYPE any + RAISING lcx_exception, + get_raw + RETURNING VALUE(ri_raw) TYPE REF TO if_ixml_node, + get_metadata + RETURNING VALUE(rs_metadata) TYPE ty_metadata. + + PRIVATE SECTION. + METHODS: fix_xml. + +ENDCLASS. "lcl_xml_input DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_xml_input IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_xml_input IMPLEMENTATION. + + METHOD constructor. + + super->constructor( ). + parse( iv_xml ). + fix_xml( ). + + ENDMETHOD. "constructor + + METHOD get_raw. + ri_raw = mi_xml_doc->get_root_element( ). + ENDMETHOD. "get_raw + + METHOD fix_xml. + + DATA: li_git TYPE REF TO if_ixml_element, + li_abap TYPE REF TO if_ixml_node. + + + li_git ?= mi_xml_doc->find_from_name_ns( depth = 0 name = c_abapgit_tag ). + li_abap = li_git->get_first_child( ). + + mi_xml_doc->get_root( )->remove_child( li_git ). + mi_xml_doc->get_root( )->append_child( li_abap ). + + ENDMETHOD. "fix_xml + + METHOD read. + + DATA: lv_text TYPE string, + lx_error TYPE REF TO cx_transformation_error, + lt_rtab TYPE abap_trans_resbind_tab. + + FIELD-SYMBOLS: LIKE LINE OF lt_rtab. + + + ASSERT NOT iv_name IS INITIAL. + + APPEND INITIAL LINE TO lt_rtab ASSIGNING . + -name = iv_name. + GET REFERENCE OF cg_data INTO -value. + + TRY. + CALL TRANSFORMATION id + OPTIONS value_handling = 'accept_data_loss' + SOURCE XML mi_xml_doc + RESULT (lt_rtab) ##no_text. + CATCH cx_transformation_error INTO lx_error. + lv_text = lx_error->if_message~get_text( ). + _raise lv_text. + ENDTRY. + + ENDMETHOD. "read + + METHOD get_metadata. + rs_metadata = ms_metadata. + ENDMETHOD. "get_metadata + +ENDCLASS. "lcl_xml_input IMPLEMENTATION + +CLASS lcl_xml_pretty DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS: print + IMPORTING iv_xml TYPE string + RETURNING VALUE(rv_xml) TYPE string. + +ENDCLASS. + +CLASS lcl_xml_pretty IMPLEMENTATION. + + METHOD print. + + DATA: li_ixml TYPE REF TO if_ixml, + li_xml_doc TYPE REF TO if_ixml_document, + li_stream_factory TYPE REF TO if_ixml_stream_factory, + li_istream TYPE REF TO if_ixml_istream, + li_parser TYPE REF TO if_ixml_parser, + li_ostream TYPE REF TO if_ixml_ostream, + li_renderer TYPE REF TO if_ixml_renderer. + + + ASSERT NOT iv_xml IS INITIAL. + + li_ixml = cl_ixml=>create( ). + li_xml_doc = li_ixml->create_document( ). + + li_stream_factory = li_ixml->create_stream_factory( ). + li_istream = li_stream_factory->create_istream_string( iv_xml ). + li_parser = li_ixml->create_parser( stream_factory = li_stream_factory + istream = li_istream + document = li_xml_doc ). + li_parser->set_normalizing( abap_true ). + IF li_parser->parse( ) <> 0. +* ignore errors + rv_xml = iv_xml. + RETURN. + ENDIF. + li_istream->close( ). + + + li_ostream = li_stream_factory->create_ostream_cstring( rv_xml ). + + li_renderer = li_ixml->create_renderer( ostream = li_ostream + document = li_xml_doc ). + + li_renderer->set_normalizing( abap_true ). + + li_renderer->render( ). + + ENDMETHOD. + +ENDCLASS. \ No newline at end of file diff --git a/src/zabapgit_xml.prog.xml b/src/zabapgit_xml.prog.xml new file mode 100644 index 000000000..3a2acf6a0 --- /dev/null +++ b/src/zabapgit_xml.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_XML + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_XML + 20 + + + + + + diff --git a/src/zabapgit_zlib.prog.abap b/src/zabapgit_zlib.prog.abap new file mode 100644 index 000000000..c22d67822 --- /dev/null +++ b/src/zabapgit_zlib.prog.abap @@ -0,0 +1,710 @@ +*&---------------------------------------------------------------------* +*& Include ZABAPGIT_ZLIB +*&---------------------------------------------------------------------* + +*----------------------------------------------------------------------* +* CLASS lcl_zlib_convert DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib_convert DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS: + hex_to_bits + IMPORTING iv_hex TYPE xsequence + RETURNING VALUE(rv_bits) TYPE string, + bits_to_int + IMPORTING iv_bits TYPE clike + RETURNING VALUE(rv_int) TYPE i, + int_to_hex + IMPORTING iv_int TYPE i + RETURNING VALUE(rv_hex) TYPE xstring. + +ENDCLASS. "lcl_zlib_convert DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib_convert IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib_convert IMPLEMENTATION. + + METHOD hex_to_bits. + + DATA: lv_x TYPE x LENGTH 1, + lv_c TYPE c LENGTH 1, + lv_bit TYPE i, + lv_hex TYPE xstring. + + + lv_hex = iv_hex. + WHILE NOT lv_hex IS INITIAL. + lv_x = lv_hex. + DO 8 TIMES. + lv_bit = sy-index. + GET BIT lv_bit OF lv_x INTO lv_c. + CONCATENATE rv_bits lv_c INTO rv_bits. + ENDDO. + lv_hex = lv_hex+1. + ENDWHILE. + + ENDMETHOD. "hex_to_bits + + METHOD bits_to_int. + + DATA: lv_c TYPE c LENGTH 1, + lv_bits TYPE string. + + lv_bits = iv_bits. + + WHILE NOT lv_bits IS INITIAL. + lv_c = lv_bits. + rv_int = rv_int * 2. + rv_int = rv_int + lv_c. + lv_bits = lv_bits+1. + ENDWHILE. + + ENDMETHOD. "bits_to_int + + METHOD int_to_hex. + + DATA: lv_x TYPE x. + + + lv_x = iv_int. + rv_hex = lv_x. + + ENDMETHOD. "int_to_hex + +ENDCLASS. "lcl_zlib_convert IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib_stream DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib_stream DEFINITION FINAL. + + PUBLIC SECTION. + METHODS: + constructor + IMPORTING iv_data TYPE xstring, + take_bits + IMPORTING iv_length TYPE i + RETURNING VALUE(rv_bits) TYPE string, + take_int + IMPORTING iv_length TYPE i + RETURNING VALUE(rv_int) TYPE i, + remaining + RETURNING VALUE(rv_length) TYPE i. + + PRIVATE SECTION. + DATA: mv_compressed TYPE xstring, + mv_bits TYPE string. + +ENDCLASS. "lcl_zlib_stream DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib_stream IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib_stream IMPLEMENTATION. + + METHOD constructor. + + mv_compressed = iv_data. + + ENDMETHOD. "constructor + + METHOD remaining. + + rv_length = xstrlen( mv_compressed ) + 1. + + ENDMETHOD. "remaining + + METHOD take_int. + + rv_int = lcl_zlib_convert=>bits_to_int( take_bits( iv_length ) ). + + ENDMETHOD. "take_int + + METHOD take_bits. + + DATA: lv_left TYPE i, + lv_index TYPE i, + lv_x TYPE x LENGTH 1. + + + WHILE strlen( rv_bits ) < iv_length. + IF mv_bits IS INITIAL. + lv_x = mv_compressed(1). + mv_bits = lcl_zlib_convert=>hex_to_bits( lv_x ). + mv_compressed = mv_compressed+1. + ENDIF. + lv_left = iv_length - strlen( rv_bits ). + IF lv_left >= strlen( mv_bits ). + CONCATENATE mv_bits rv_bits INTO rv_bits. + CLEAR mv_bits. + ELSE. + lv_index = strlen( mv_bits ) - lv_left. + CONCATENATE mv_bits+lv_index(lv_left) rv_bits INTO rv_bits. + mv_bits = mv_bits(lv_index). + ENDIF. + + ENDWHILE. + + ENDMETHOD. "take_bits + +ENDCLASS. "lcl_zlib_stream IMPLEMENTATION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib_huffman DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib_huffman DEFINITION FINAL. + + PUBLIC SECTION. + TYPES: ty_lengths TYPE STANDARD TABLE OF i WITH DEFAULT KEY. + + CONSTANTS: c_maxbits TYPE i VALUE 15. + + METHODS: + constructor + IMPORTING it_lengths TYPE ty_lengths, + get_count + IMPORTING iv_index TYPE i + RETURNING VALUE(rv_value) TYPE i, + get_symbol + IMPORTING iv_index TYPE i + RETURNING VALUE(rv_value) TYPE i. + + PRIVATE SECTION. + + DATA: mt_count TYPE STANDARD TABLE OF i WITH DEFAULT KEY, + mt_symbol TYPE STANDARD TABLE OF i WITH DEFAULT KEY. + +ENDCLASS. "lcl_zlib_huffman DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib_huffman DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib_huffman IMPLEMENTATION. + + METHOD get_count. + READ TABLE mt_count INDEX iv_index INTO rv_value. "#EC CI_SUBRC + ENDMETHOD. "count + + METHOD get_symbol. + READ TABLE mt_symbol INDEX iv_index INTO rv_value. "#EC CI_SUBRC + ENDMETHOD. "symbol + + METHOD constructor. + + DATA: lv_index TYPE i, + lt_offset TYPE TABLE OF i, + lv_length LIKE LINE OF it_lengths, + lv_prev TYPE i, + lv_count LIKE LINE OF mt_count. + + FIELD-SYMBOLS: LIKE LINE OF lt_offset, + LIKE LINE OF mt_symbol, + LIKE LINE OF it_lengths. + + + DO c_maxbits TIMES. + APPEND 0 TO mt_count. + ENDDO. + LOOP AT it_lengths INTO lv_index. + IF lv_index = 0. + CONTINUE. + ENDIF. + READ TABLE mt_count INDEX lv_index ASSIGNING . + ASSERT sy-subrc = 0. + = + 1. + ENDLOOP. + +************ + + APPEND 0 TO lt_offset. + DO c_maxbits - 1 TIMES. + READ TABLE mt_count INDEX sy-index INTO lv_count. + ASSERT sy-subrc = 0. + lv_prev = lv_prev + lv_count. + APPEND lv_prev TO lt_offset. + ENDDO. + + DO lines( it_lengths ) TIMES. + APPEND 0 TO mt_symbol. + ENDDO. + DO lines( it_lengths ) TIMES. + lv_index = sy-index. + READ TABLE it_lengths INDEX lv_index INTO lv_length. + ASSERT sy-subrc = 0. + IF lv_length = 0. + CONTINUE. + ENDIF. + READ TABLE lt_offset INDEX lv_length ASSIGNING . + ASSERT sy-subrc = 0. + READ TABLE mt_symbol INDEX + 1 ASSIGNING . + ASSERT sy-subrc = 0. + = lv_index - 1. + = + 1. + ENDDO. + + ENDMETHOD. "constructor + +ENDCLASS. "lcl_zlib_huffman DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib DEFINITION FINAL. + + PUBLIC SECTION. + TYPES: BEGIN OF ty_decompress, + raw TYPE xstring, + compressed_len TYPE i, + END OF ty_decompress. + + CLASS-METHODS: + decompress + IMPORTING iv_compressed TYPE xsequence + RETURNING VALUE(rs_data) TYPE ty_decompress. + + PRIVATE SECTION. + CONSTANTS: c_maxdcodes TYPE i VALUE 30. + + CLASS-DATA: gv_out TYPE xstring, + go_lencode TYPE REF TO lcl_zlib_huffman, + go_distcode TYPE REF TO lcl_zlib_huffman, + go_stream TYPE REF TO lcl_zlib_stream. + + TYPES: BEGIN OF ty_pair, + length TYPE i, + distance TYPE i, + END OF ty_pair. + + CLASS-METHODS: + decode + IMPORTING io_huffman TYPE REF TO lcl_zlib_huffman + RETURNING VALUE(rv_symbol) TYPE i, + map_length + IMPORTING iv_code TYPE i + RETURNING VALUE(rv_length) TYPE i, + map_distance + IMPORTING iv_code TYPE i + RETURNING VALUE(rv_distance) TYPE i, + dynamic, + fixed, + read_pair + IMPORTING iv_length TYPE i + RETURNING VALUE(rs_pair) TYPE ty_pair, + copy_out + IMPORTING is_pair TYPE ty_pair. + +ENDCLASS. "lcl_zlib DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_zlib IMPLEMENTATION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_zlib IMPLEMENTATION. + + METHOD decode. + + DATA: lv_bit TYPE c LENGTH 1, + lv_len TYPE i, + lv_count TYPE i, + lv_code TYPE i, + lv_index TYPE i, + lv_first TYPE i, + lv_bits TYPE string. + + + DO lcl_zlib_huffman=>c_maxbits TIMES. + lv_len = sy-index. + + lv_bit = go_stream->take_bits( 1 ). + CONCATENATE lv_bits lv_bit INTO lv_bits. + lv_code = lcl_zlib_convert=>bits_to_int( lv_bits ). + lv_count = io_huffman->get_count( lv_len ). + + IF lv_code - lv_count < lv_first. + rv_symbol = io_huffman->get_symbol( lv_index + lv_code - lv_first + 1 ). + RETURN. + ENDIF. + lv_index = lv_index + lv_count. + lv_first = lv_first + lv_count. + lv_first = lv_first * 2. + ENDDO. + + ENDMETHOD. "decode + + METHOD fixed. + + DATA: lt_lengths TYPE lcl_zlib_huffman=>ty_lengths. + + + DO 144 TIMES. + APPEND 8 TO lt_lengths. + ENDDO. + DO 112 TIMES. + APPEND 9 TO lt_lengths. + ENDDO. + DO 24 TIMES. + APPEND 7 TO lt_lengths. + ENDDO. + DO 8 TIMES. + APPEND 8 TO lt_lengths. + ENDDO. + + CREATE OBJECT go_lencode + EXPORTING + it_lengths = lt_lengths. + + CLEAR lt_lengths. + DO c_maxdcodes TIMES. + APPEND 5 TO lt_lengths. + ENDDO. + + CREATE OBJECT go_distcode + EXPORTING + it_lengths = lt_lengths. + + ENDMETHOD. "fixed + + METHOD copy_out. + +* copy one byte at a time, it is not possible to copy using +* string offsets, as it might copy data that does not exist +* in mv_out yet + + DATA: lv_distance TYPE i, + lv_index TYPE i, + lv_x TYPE x LENGTH 1. + + + lv_distance = xstrlen( gv_out ) - is_pair-distance. + DO is_pair-length TIMES. + lv_index = sy-index - 1 + lv_distance. + lv_x = gv_out+lv_index(1). + CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE. + ENDDO. + + ENDMETHOD. "copy_out + + METHOD dynamic. + + DATA: lv_nlen TYPE i, + lv_ndist TYPE i, + lv_ncode TYPE i, + lv_index TYPE i, + lv_length TYPE i, + lv_symbol TYPE i, + lt_order TYPE TABLE OF i, + lt_lengths TYPE lcl_zlib_huffman=>ty_lengths, + lt_dists TYPE lcl_zlib_huffman=>ty_lengths. + + FIELD-SYMBOLS: LIKE LINE OF lt_lengths. + + + APPEND 16 TO lt_order. + APPEND 17 TO lt_order. + APPEND 18 TO lt_order. + APPEND 0 TO lt_order. + APPEND 8 TO lt_order. + APPEND 7 TO lt_order. + APPEND 9 TO lt_order. + APPEND 6 TO lt_order. + APPEND 10 TO lt_order. + APPEND 5 TO lt_order. + APPEND 11 TO lt_order. + APPEND 4 TO lt_order. + APPEND 12 TO lt_order. + APPEND 3 TO lt_order. + APPEND 13 TO lt_order. + APPEND 2 TO lt_order. + APPEND 14 TO lt_order. + APPEND 1 TO lt_order. + APPEND 15 TO lt_order. + + lv_nlen = go_stream->take_int( 5 ) + 257. + lv_ndist = go_stream->take_int( 5 ) + 1. + lv_ncode = go_stream->take_int( 4 ) + 4. + + DO 19 TIMES. + APPEND 0 TO lt_lengths. + ENDDO. + + DO lv_ncode TIMES. + READ TABLE lt_order INDEX sy-index INTO lv_index. + ASSERT sy-subrc = 0. + lv_index = lv_index + 1. + READ TABLE lt_lengths INDEX lv_index ASSIGNING . + ASSERT sy-subrc = 0. + = go_stream->take_int( 3 ). + ENDDO. + + CREATE OBJECT go_lencode + EXPORTING + it_lengths = lt_lengths. + + CLEAR lt_lengths. + WHILE lines( lt_lengths ) < lv_nlen + lv_ndist. + lv_symbol = decode( go_lencode ). + + IF lv_symbol < 16. + APPEND lv_symbol TO lt_lengths. + ELSE. + lv_length = 0. + IF lv_symbol = 16. + READ TABLE lt_lengths INDEX lines( lt_lengths ) INTO lv_length. + ASSERT sy-subrc = 0. + lv_symbol = go_stream->take_int( 2 ) + 3. + ELSEIF lv_symbol = 17. + lv_symbol = go_stream->take_int( 3 ) + 3. + ELSE. + lv_symbol = go_stream->take_int( 7 ) + 11. + ENDIF. + DO lv_symbol TIMES. + APPEND lv_length TO lt_lengths. + ENDDO. + ENDIF. + ENDWHILE. + + lt_dists = lt_lengths. + DELETE lt_lengths FROM lv_nlen + 1. + DELETE lt_dists TO lv_nlen. + + CREATE OBJECT go_lencode + EXPORTING + it_lengths = lt_lengths. + + CREATE OBJECT go_distcode + EXPORTING + it_lengths = lt_dists. + + ENDMETHOD. "dynamic + + METHOD read_pair. + + DATA: lv_symbol TYPE i. + + + rs_pair-length = map_length( iv_length ). + + lv_symbol = decode( go_distcode ). + rs_pair-distance = map_distance( lv_symbol ). + + ENDMETHOD. "read_pair + + METHOD map_distance. + + DEFINE _distance. + rv_distance = go_stream->take_int( &1 ). + rv_distance = rv_distance + &2. + END-OF-DEFINITION. + + CASE iv_code. + WHEN 0. + _distance 0 1. + WHEN 1. + _distance 0 2. + WHEN 2. + _distance 0 3. + WHEN 3. + _distance 0 4. + WHEN 4. + _distance 1 5. + WHEN 5. + _distance 1 7. + WHEN 6. + _distance 2 9. + WHEN 7. + _distance 2 13. + WHEN 8. + _distance 3 17. + WHEN 9. + _distance 3 25. + WHEN 10. + _distance 4 33. + WHEN 11. + _distance 4 49. + WHEN 12. + _distance 5 65. + WHEN 13. + _distance 5 97. + WHEN 14. + _distance 6 129. + WHEN 15. + _distance 6 193. + WHEN 16. + _distance 7 257. + WHEN 17. + _distance 7 385. + WHEN 18. + _distance 8 513. + WHEN 19. + _distance 8 769. + WHEN 20. + _distance 9 1025. + WHEN 21. + _distance 9 1537. + WHEN 22. + _distance 10 2049. + WHEN 23. + _distance 10 3073. + WHEN 24. + _distance 11 4097. + WHEN 25. + _distance 11 6145. + WHEN 26. + _distance 12 8193. + WHEN 27. + _distance 12 12289. + WHEN 28. + _distance 13 16385. + WHEN 29. + _distance 13 24577. + WHEN OTHERS. + ASSERT 1 = 0. + ENDCASE. + + ENDMETHOD. "map_distance + + METHOD map_length. + + DEFINE _length. + rv_length = go_stream->take_int( &1 ). + rv_length = rv_length + &2. + END-OF-DEFINITION. + + CASE iv_code. + WHEN 257. + _length 0 3. + WHEN 258. + _length 0 4. + WHEN 259. + _length 0 5. + WHEN 260. + _length 0 6. + WHEN 261. + _length 0 7. + WHEN 262. + _length 0 8. + WHEN 263. + _length 0 9. + WHEN 264. + _length 0 10. + WHEN 265. + _length 1 11. + WHEN 266. + _length 1 13. + WHEN 267. + _length 1 15. + WHEN 268. + _length 1 17. + WHEN 269. + _length 2 19. + WHEN 270. + _length 2 23. + WHEN 271. + _length 2 27. + WHEN 272. + _length 2 31. + WHEN 273. + _length 3 35. + WHEN 274. + _length 3 43. + WHEN 275. + _length 3 51. + WHEN 276. + _length 3 59. + WHEN 277. + _length 4 67. + WHEN 278. + _length 4 83. + WHEN 279. + _length 4 99. + WHEN 280. + _length 4 115. + WHEN 281. + _length 5 131. + WHEN 282. + _length 5 163. + WHEN 283. + _length 5 195. + WHEN 284. + _length 5 227. + WHEN 285. + _length 0 258. + WHEN OTHERS. + ASSERT 1 = 0. + ENDCASE. + + ENDMETHOD. "map_length + + METHOD decompress. + + DATA: lv_x TYPE x LENGTH 1, + lv_symbol TYPE i, + lv_bfinal TYPE c LENGTH 1, + lv_btype TYPE c LENGTH 2. + + + IF iv_compressed IS INITIAL. + RETURN. + ENDIF. + + CLEAR gv_out. + CREATE OBJECT go_stream + EXPORTING + iv_data = iv_compressed. + + DO. + lv_bfinal = go_stream->take_bits( 1 ). + + lv_btype = go_stream->take_bits( 2 ). + CASE lv_btype. + WHEN '01'. + fixed( ). + WHEN '10'. + dynamic( ). + WHEN OTHERS. + ASSERT 1 = 0. + ENDCASE. + + DO. + lv_symbol = decode( go_lencode ). + + IF lv_symbol < 256. + lv_x = lcl_zlib_convert=>int_to_hex( lv_symbol ). + CONCATENATE gv_out lv_x INTO gv_out IN BYTE MODE. + ELSEIF lv_symbol = 256. + EXIT. + ELSE. + copy_out( read_pair( lv_symbol ) ). + ENDIF. + + ENDDO. + + IF lv_bfinal = '1'. + EXIT. + ENDIF. + + ENDDO. + + rs_data-raw = gv_out. + rs_data-compressed_len = xstrlen( iv_compressed ) - go_stream->remaining( ). + + ENDMETHOD. "decompress + +ENDCLASS. "lcl_zlib IMPLEMENTATION \ No newline at end of file diff --git a/src/zabapgit_zlib.prog.xml b/src/zabapgit_zlib.prog.xml new file mode 100644 index 000000000..a5e41f38d --- /dev/null +++ b/src/zabapgit_zlib.prog.xml @@ -0,0 +1,48 @@ + + + + + + ZABAPGIT_ZLIB + A + + + X + + + + + + I + + + + 0000-00-00 + + 0000-00-00 + + + + + E + + + 0000-00-00 + + 0000-00-00 + + + X + + + + R + + Include ZABAPGIT_ZLIB + 21 + + + + + +