mirror of
https://github.com/abapGit/abapGit.git
synced 2025-04-30 20:03:20 +08:00
split into includes, #210
This commit is contained in:
parent
64373a47ce
commit
d6b5dbaf27
File diff suppressed because it is too large
Load Diff
55
src/zabapgit_exceptions.prog.abap
Normal file
55
src/zabapgit_exceptions.prog.abap
Normal file
|
@ -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
|
48
src/zabapgit_exceptions.prog.xml
Normal file
48
src/zabapgit_exceptions.prog.xml
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_EXCEPTIONS</NAME>
|
||||
<STATE>A</STATE>
|
||||
<SQLX/>
|
||||
<EDTX/>
|
||||
<VARCL>X</VARCL>
|
||||
<DBAPL/>
|
||||
<DBNA/>
|
||||
<CLAS/>
|
||||
<TYPE/>
|
||||
<OCCURS/>
|
||||
<SUBC>I</SUBC>
|
||||
<APPL/>
|
||||
<SECU/>
|
||||
<CNAM/>
|
||||
<CDAT>0000-00-00</CDAT>
|
||||
<UNAM/>
|
||||
<UDAT>0000-00-00</UDAT>
|
||||
<VERN/>
|
||||
<LEVL/>
|
||||
<RSTAT/>
|
||||
<RMAND/>
|
||||
<RLOAD>E</RLOAD>
|
||||
<FIXPT/>
|
||||
<SSET/>
|
||||
<SDATE>0000-00-00</SDATE>
|
||||
<STIME/>
|
||||
<IDATE>0000-00-00</IDATE>
|
||||
<ITIME/>
|
||||
<LDBNAME/>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<KEY/>
|
||||
<ENTRY>Include ZABAPGIT_EXCEPTIONS</ENTRY>
|
||||
<LENGTH>27</LENGTH>
|
||||
<SPLIT/>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
854
src/zabapgit_util.prog.abap
Normal file
854
src/zabapgit_util.prog.abap
Normal file
|
@ -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: <ls_diff> LIKE LINE OF mt_diff.
|
||||
|
||||
IF lines( mt_diff ) < 500.
|
||||
LOOP AT mt_diff ASSIGNING <ls_diff>.
|
||||
<ls_diff>-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 <ls_diff>.
|
||||
IF sy-subrc <> 0 OR <ls_diff>-short = abap_true. " tab bound or prev marker
|
||||
EXIT.
|
||||
ENDIF.
|
||||
<ls_diff>-short = abap_true.
|
||||
ENDDO.
|
||||
|
||||
DO 20 TIMES. " Forward
|
||||
READ TABLE mt_diff INDEX ( lv_index + sy-index - 1 ) ASSIGNING <ls_diff>.
|
||||
IF sy-subrc <> 0. " tab bound reached
|
||||
EXIT.
|
||||
ENDIF.
|
||||
CHECK <ls_diff>-short = abap_false. " skip marked
|
||||
<ls_diff>-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: <ls_diff> LIKE LINE OF mt_diff.
|
||||
|
||||
|
||||
LOOP AT mt_diff ASSIGNING <ls_diff>.
|
||||
<ls_diff>-local_line = lv_local.
|
||||
<ls_diff>-remote_line = lv_remote.
|
||||
|
||||
CASE <ls_diff>-result. " Line nums
|
||||
WHEN c_diff-delete.
|
||||
lv_remote = lv_remote + 1.
|
||||
CLEAR <ls_diff>-local_line.
|
||||
WHEN c_diff-insert.
|
||||
lv_local = lv_local + 1.
|
||||
CLEAR <ls_diff>-remote_line.
|
||||
WHEN OTHERS.
|
||||
lv_local = lv_local + 1.
|
||||
lv_remote = lv_remote + 1.
|
||||
ENDCASE.
|
||||
|
||||
CASE <ls_diff>-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: <ls_diff> 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 <ls_diff>.
|
||||
<ls_diff>-beacon = lv_beacon.
|
||||
LOOP AT lt_regex_set INTO lo_regex.
|
||||
FIND FIRST OCCURRENCE OF REGEX lo_regex IN <ls_diff>-local.
|
||||
IF sy-subrc = 0. " Match
|
||||
lv_code_line = <ls_diff>-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.
|
||||
<ls_diff>-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: <ls_auth> 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 <ls_auth>.
|
||||
<ls_auth>-uri = lcl_url=>host( iv_uri ).
|
||||
<ls_auth>-authorization = iv_auth.
|
||||
ENDIF.
|
||||
|
||||
ENDMETHOD.
|
||||
|
||||
ENDCLASS.
|
48
src/zabapgit_util.prog.xml
Normal file
48
src/zabapgit_util.prog.xml
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_UTIL</NAME>
|
||||
<STATE>A</STATE>
|
||||
<SQLX/>
|
||||
<EDTX/>
|
||||
<VARCL>X</VARCL>
|
||||
<DBAPL/>
|
||||
<DBNA/>
|
||||
<CLAS/>
|
||||
<TYPE/>
|
||||
<OCCURS/>
|
||||
<SUBC>I</SUBC>
|
||||
<APPL/>
|
||||
<SECU/>
|
||||
<CNAM/>
|
||||
<CDAT>0000-00-00</CDAT>
|
||||
<UNAM/>
|
||||
<UDAT>0000-00-00</UDAT>
|
||||
<VERN/>
|
||||
<LEVL/>
|
||||
<RSTAT/>
|
||||
<RMAND/>
|
||||
<RLOAD>E</RLOAD>
|
||||
<FIXPT/>
|
||||
<SSET/>
|
||||
<SDATE>0000-00-00</SDATE>
|
||||
<STIME/>
|
||||
<IDATE>0000-00-00</IDATE>
|
||||
<ITIME/>
|
||||
<LDBNAME/>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<KEY/>
|
||||
<ENTRY>Include ZABAPGIT_UTIL</ENTRY>
|
||||
<LENGTH>21</LENGTH>
|
||||
<SPLIT/>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
409
src/zabapgit_xml.prog.abap
Normal file
409
src/zabapgit_xml.prog.abap
Normal file
|
@ -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: <ls_stab> LIKE LINE OF lt_stab.
|
||||
|
||||
|
||||
ASSERT NOT iv_name IS INITIAL.
|
||||
|
||||
APPEND INITIAL LINE TO lt_stab ASSIGNING <ls_stab>.
|
||||
<ls_stab>-name = iv_name.
|
||||
GET REFERENCE OF ig_data INTO <ls_stab>-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: <ls_rtab> LIKE LINE OF lt_rtab.
|
||||
|
||||
|
||||
ASSERT NOT iv_name IS INITIAL.
|
||||
|
||||
APPEND INITIAL LINE TO lt_rtab ASSIGNING <ls_rtab>.
|
||||
<ls_rtab>-name = iv_name.
|
||||
GET REFERENCE OF cg_data INTO <ls_rtab>-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.
|
48
src/zabapgit_xml.prog.xml
Normal file
48
src/zabapgit_xml.prog.xml
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_XML</NAME>
|
||||
<STATE>A</STATE>
|
||||
<SQLX/>
|
||||
<EDTX/>
|
||||
<VARCL>X</VARCL>
|
||||
<DBAPL/>
|
||||
<DBNA/>
|
||||
<CLAS/>
|
||||
<TYPE/>
|
||||
<OCCURS/>
|
||||
<SUBC>I</SUBC>
|
||||
<APPL/>
|
||||
<SECU/>
|
||||
<CNAM/>
|
||||
<CDAT>0000-00-00</CDAT>
|
||||
<UNAM/>
|
||||
<UDAT>0000-00-00</UDAT>
|
||||
<VERN/>
|
||||
<LEVL/>
|
||||
<RSTAT/>
|
||||
<RMAND/>
|
||||
<RLOAD>E</RLOAD>
|
||||
<FIXPT/>
|
||||
<SSET/>
|
||||
<SDATE>0000-00-00</SDATE>
|
||||
<STIME/>
|
||||
<IDATE>0000-00-00</IDATE>
|
||||
<ITIME/>
|
||||
<LDBNAME/>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<KEY/>
|
||||
<ENTRY>Include ZABAPGIT_XML</ENTRY>
|
||||
<LENGTH>20</LENGTH>
|
||||
<SPLIT/>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
710
src/zabapgit_zlib.prog.abap
Normal file
710
src/zabapgit_zlib.prog.abap
Normal file
|
@ -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: <lv_offset> LIKE LINE OF lt_offset,
|
||||
<lv_symbol> LIKE LINE OF mt_symbol,
|
||||
<lv_i> 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 <lv_i>.
|
||||
ASSERT sy-subrc = 0.
|
||||
<lv_i> = <lv_i> + 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 <lv_offset>.
|
||||
ASSERT sy-subrc = 0.
|
||||
READ TABLE mt_symbol INDEX <lv_offset> + 1 ASSIGNING <lv_symbol>.
|
||||
ASSERT sy-subrc = 0.
|
||||
<lv_symbol> = lv_index - 1.
|
||||
<lv_offset> = <lv_offset> + 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: <lv_length> 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 <lv_length>.
|
||||
ASSERT sy-subrc = 0.
|
||||
<lv_length> = 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
|
48
src/zabapgit_zlib.prog.xml
Normal file
48
src/zabapgit_zlib.prog.xml
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<abapGit version="v1.0.0" serializer="LCL_OBJECT_PROG" serializer_version="v1.0.0">
|
||||
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
||||
<asx:values>
|
||||
<PROGDIR>
|
||||
<NAME>ZABAPGIT_ZLIB</NAME>
|
||||
<STATE>A</STATE>
|
||||
<SQLX/>
|
||||
<EDTX/>
|
||||
<VARCL>X</VARCL>
|
||||
<DBAPL/>
|
||||
<DBNA/>
|
||||
<CLAS/>
|
||||
<TYPE/>
|
||||
<OCCURS/>
|
||||
<SUBC>I</SUBC>
|
||||
<APPL/>
|
||||
<SECU/>
|
||||
<CNAM/>
|
||||
<CDAT>0000-00-00</CDAT>
|
||||
<UNAM/>
|
||||
<UDAT>0000-00-00</UDAT>
|
||||
<VERN/>
|
||||
<LEVL/>
|
||||
<RSTAT/>
|
||||
<RMAND/>
|
||||
<RLOAD>E</RLOAD>
|
||||
<FIXPT/>
|
||||
<SSET/>
|
||||
<SDATE>0000-00-00</SDATE>
|
||||
<STIME/>
|
||||
<IDATE>0000-00-00</IDATE>
|
||||
<ITIME/>
|
||||
<LDBNAME/>
|
||||
<UCCHECK>X</UCCHECK>
|
||||
</PROGDIR>
|
||||
<TPOOL>
|
||||
<item>
|
||||
<ID>R</ID>
|
||||
<KEY/>
|
||||
<ENTRY>Include ZABAPGIT_ZLIB</ENTRY>
|
||||
<LENGTH>21</LENGTH>
|
||||
<SPLIT/>
|
||||
</item>
|
||||
</TPOOL>
|
||||
</asx:values>
|
||||
</asx:abap>
|
||||
</abapGit>
|
Loading…
Reference in New Issue
Block a user