abapGit/src/objects/zcl_abapgit_objects_files.clas.abap
Christian Günter a821944e57 Fix filename constr.: Add ext. only if not initial
With this commit we fix the filename construction so that for
objects without file extension the correct filename is constructed.
Before this commit is applied these objects create file names with
an additional dot at the end.
2019-02-19 21:38:16 -08:00

350 lines
9.0 KiB
ABAP

CLASS zcl_abapgit_objects_files DEFINITION
PUBLIC
CREATE PUBLIC .
PUBLIC SECTION.
METHODS constructor
IMPORTING
!is_item TYPE zif_abapgit_definitions=>ty_item
!iv_path TYPE string OPTIONAL .
METHODS add_string
IMPORTING
!iv_extra TYPE clike OPTIONAL
!iv_ext TYPE string
!iv_string TYPE string
RAISING
zcx_abapgit_exception .
METHODS read_string
IMPORTING
!iv_extra TYPE clike OPTIONAL
!iv_ext TYPE string
RETURNING
VALUE(rv_string) TYPE string
RAISING
zcx_abapgit_exception .
METHODS add_xml
IMPORTING
!iv_extra TYPE clike OPTIONAL
!io_xml TYPE REF TO zcl_abapgit_xml_output
!iv_normalize TYPE abap_bool DEFAULT abap_true
!is_metadata TYPE zif_abapgit_definitions=>ty_metadata OPTIONAL
RAISING
zcx_abapgit_exception .
METHODS read_xml
IMPORTING
!iv_extra TYPE clike OPTIONAL
RETURNING
VALUE(ro_xml) TYPE REF TO zcl_abapgit_xml_input
RAISING
zcx_abapgit_exception .
METHODS read_abap
IMPORTING
!iv_extra TYPE clike OPTIONAL
!iv_error TYPE abap_bool DEFAULT abap_true
RETURNING
VALUE(rt_abap) TYPE abaptxt255_tab
RAISING
zcx_abapgit_exception .
METHODS add_abap
IMPORTING
!iv_extra TYPE clike OPTIONAL
!it_abap TYPE STANDARD TABLE
RAISING
zcx_abapgit_exception .
METHODS add
IMPORTING
!is_file TYPE zif_abapgit_definitions=>ty_file .
METHODS add_raw
IMPORTING
!iv_extra TYPE clike OPTIONAL
!iv_ext TYPE string
!iv_data TYPE xstring
RAISING
zcx_abapgit_exception .
METHODS read_raw
IMPORTING
!iv_extra TYPE clike OPTIONAL
!iv_ext TYPE string
RETURNING
VALUE(rv_data) TYPE xstring
RAISING
zcx_abapgit_exception .
METHODS get_files
RETURNING
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_files_tt .
METHODS set_files
IMPORTING
!it_files TYPE zif_abapgit_definitions=>ty_files_tt .
METHODS get_accessed_files
RETURNING
VALUE(rt_files) TYPE zif_abapgit_definitions=>ty_file_signatures_tt .
PROTECTED SECTION.
PRIVATE SECTION.
DATA: ms_item TYPE zif_abapgit_definitions=>ty_item,
mt_accessed_files TYPE zif_abapgit_definitions=>ty_file_signatures_tt,
mt_files TYPE zif_abapgit_definitions=>ty_files_tt,
mv_path TYPE string.
METHODS:
read_file
IMPORTING iv_filename TYPE string
iv_error TYPE abap_bool DEFAULT abap_true
EXPORTING ev_data TYPE xstring
RAISING zcx_abapgit_exception,
filename
IMPORTING iv_extra TYPE clike OPTIONAL
iv_ext TYPE string
RETURNING VALUE(rv_filename) TYPE string.
ENDCLASS.
CLASS ZCL_ABAPGIT_OBJECTS_FILES IMPLEMENTATION.
METHOD add.
APPEND is_file TO mt_files.
ENDMETHOD.
METHOD add_abap.
DATA: lv_source TYPE string,
ls_file TYPE zif_abapgit_definitions=>ty_file.
CONCATENATE LINES OF it_abap INTO lv_source SEPARATED BY zif_abapgit_definitions=>c_newline.
* when editing files via eg. GitHub web interface it adds a newline at end of file
lv_source = lv_source && zif_abapgit_definitions=>c_newline.
ls_file-path = '/'.
ls_file-filename = filename( iv_extra = iv_extra
iv_ext = 'abap' ). "#EC NOTEXT
ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_source ).
APPEND ls_file TO mt_files.
ENDMETHOD.
METHOD add_raw.
DATA: ls_file TYPE zif_abapgit_definitions=>ty_file.
ls_file-path = '/'.
ls_file-data = iv_data.
ls_file-filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ).
APPEND ls_file TO mt_files.
ENDMETHOD.
METHOD add_string.
DATA: ls_file TYPE zif_abapgit_definitions=>ty_file.
ls_file-path = '/'.
ls_file-filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ). "#EC NOTEXT
ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( iv_string ).
APPEND ls_file TO mt_files.
ENDMETHOD.
METHOD add_xml.
DATA: lv_xml TYPE string,
ls_file TYPE zif_abapgit_definitions=>ty_file.
lv_xml = io_xml->render( iv_normalize = iv_normalize
is_metadata = is_metadata ).
ls_file-path = '/'.
ls_file-filename = filename( iv_extra = iv_extra
iv_ext = 'xml' ). "#EC NOTEXT
REPLACE FIRST OCCURRENCE
OF REGEX '<\?xml version="1\.0" encoding="[\w-]+"\?>'
IN lv_xml
WITH '<?xml version="1.0" encoding="utf-8"?>'.
ASSERT sy-subrc = 0.
ls_file-data = zcl_abapgit_convert=>string_to_xstring_utf8( lv_xml ).
APPEND ls_file TO mt_files.
ENDMETHOD.
METHOD constructor.
ms_item = is_item.
mv_path = iv_path.
ENDMETHOD.
METHOD filename.
DATA: lv_obj_name TYPE string.
lv_obj_name = ms_item-obj_name.
IF ms_item-obj_type = 'DEVC'.
" Packages have a fixed filename so that the repository can be installed to a different
" package(-hierarchy) on the client and not show up as a different package in the repo.
lv_obj_name = 'package'.
ENDIF.
IF iv_extra IS INITIAL.
CONCATENATE lv_obj_name '.' ms_item-obj_type
INTO rv_filename. "#EC NOTEXT
ELSE.
CONCATENATE lv_obj_name '.' ms_item-obj_type '.' iv_extra
INTO rv_filename. "#EC NOTEXT
ENDIF.
IF iv_ext IS NOT INITIAL.
CONCATENATE rv_filename '.' iv_ext
INTO rv_filename.
ENDIF.
* handle namespaces
REPLACE ALL OCCURRENCES OF '/' IN rv_filename WITH '#'.
TRANSLATE rv_filename TO LOWER CASE.
ENDMETHOD.
METHOD get_accessed_files.
rt_files = mt_accessed_files.
ENDMETHOD.
METHOD get_files.
rt_files = mt_files.
ENDMETHOD.
METHOD read_abap.
DATA: lv_filename TYPE string,
lv_data TYPE xstring,
lv_abap TYPE string.
lv_filename = filename( iv_extra = iv_extra
iv_ext = 'abap' ). "#EC NOTEXT
read_file( EXPORTING iv_filename = lv_filename
iv_error = iv_error
IMPORTING ev_data = lv_data ).
IF lv_data IS INITIAL. " Post-handling of iv_error = false
RETURN.
ENDIF.
lv_abap = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
SPLIT lv_abap AT zif_abapgit_definitions=>c_newline INTO TABLE rt_abap.
ENDMETHOD.
METHOD read_file.
FIELD-SYMBOLS: <ls_file> LIKE LINE OF mt_files,
<ls_accessed> LIKE LINE OF mt_accessed_files.
CLEAR ev_data.
IF mv_path IS NOT INITIAL.
READ TABLE mt_files ASSIGNING <ls_file> WITH KEY path = mv_path
filename = iv_filename.
ELSE.
READ TABLE mt_files ASSIGNING <ls_file> WITH KEY filename = iv_filename.
ENDIF.
IF sy-subrc <> 0.
IF iv_error = abap_true.
zcx_abapgit_exception=>raise( |File not found: { iv_filename }| ).
ELSE.
RETURN.
ENDIF.
ENDIF.
" Update access table
READ TABLE mt_accessed_files TRANSPORTING NO FIELDS
WITH KEY path = <ls_file>-path filename = <ls_file>-filename.
IF sy-subrc > 0. " Not found ? -> Add
APPEND INITIAL LINE TO mt_accessed_files ASSIGNING <ls_accessed>.
MOVE-CORRESPONDING <ls_file> TO <ls_accessed>.
ENDIF.
ev_data = <ls_file>-data.
ENDMETHOD.
METHOD read_raw.
DATA: lv_filename TYPE string.
lv_filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ).
read_file( EXPORTING iv_filename = lv_filename
IMPORTING ev_data = rv_data ).
ENDMETHOD.
METHOD read_string.
DATA: lv_filename TYPE string,
lv_data TYPE xstring.
lv_filename = filename( iv_extra = iv_extra
iv_ext = iv_ext ). "#EC NOTEXT
read_file( EXPORTING iv_filename = lv_filename
IMPORTING ev_data = lv_data ).
rv_string = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
ENDMETHOD.
METHOD read_xml.
DATA: lv_filename TYPE string,
lv_data TYPE xstring,
lv_xml TYPE string.
lv_filename = filename( iv_extra = iv_extra
iv_ext = 'xml' ). "#EC NOTEXT
read_file( EXPORTING iv_filename = lv_filename
IMPORTING ev_data = lv_data ).
lv_xml = zcl_abapgit_convert=>xstring_to_string_utf8( lv_data ).
CREATE OBJECT ro_xml
EXPORTING
iv_xml = lv_xml.
ENDMETHOD.
METHOD set_files.
mt_files = it_files.
ENDMETHOD.
ENDCLASS.