From 38f13793df0e4795ebcf667b52e61da04a392fce Mon Sep 17 00:00:00 2001 From: larshp Date: Mon, 16 May 2016 13:21:13 +0000 Subject: [PATCH] more consistent error handling use lcl_log class move lcl_html_helper to top of program add to_html in lcl_log class --- zabapgit.prog.abap | 377 ++++++++++++++++++++++++--------------------- 1 file changed, 203 insertions(+), 174 deletions(-) diff --git a/zabapgit.prog.abap b/zabapgit.prog.abap index ca5c5a063..830d8ef66 100644 --- a/zabapgit.prog.abap +++ b/zabapgit.prog.abap @@ -3,7 +3,7 @@ REPORT zabapgit. * See http://www.abapgit.org CONSTANTS: gc_xml_version TYPE string VALUE 'v1.0.0', "#EC NOTEXT - gc_abap_version TYPE string VALUE 'v1.8.1'. "#EC NOTEXT + gc_abap_version TYPE string VALUE 'v1.8.2'. "#EC NOTEXT ******************************************************************************** * The MIT License (MIT) @@ -259,6 +259,117 @@ CLASS lcl_progress IMPLEMENTATION. ENDCLASS. +*----------------------------------------------------------------------* +* CLASS lcl_html_helper DEFINITION +*----------------------------------------------------------------------* +CLASS lcl_html_helper DEFINITION FINAL. + PUBLIC SECTION. + CONSTANTS c_indent_size TYPE i VALUE 2. + + DATA mv_html TYPE string READ-ONLY. + DATA mv_indent TYPE i READ-ONLY. + + METHODS add IMPORTING iv_chunk TYPE any. + METHODS reset. + + PRIVATE SECTION. + METHODS _add_str IMPORTING iv_str TYPE csequence. + METHODS _add_htm IMPORTING io_html TYPE REF TO lcl_html_helper. + +ENDCLASS. "lcl_html_helper DEFINITION + +*----------------------------------------------------------------------* +* CLASS lcl_html_helper IMPLEMENTATION +*----------------------------------------------------------------------* +CLASS lcl_html_helper IMPLEMENTATION. + METHOD add. + DATA lo_type TYPE REF TO cl_abap_typedescr. + DATA lo_html TYPE REF TO lcl_html_helper. + + lo_type = cl_abap_typedescr=>describe_by_data( iv_chunk ). + + CASE lo_type->type_kind. + WHEN cl_abap_typedescr=>typekind_char + OR cl_abap_typedescr=>typekind_string. + IF strlen( iv_chunk ) = 0. + RETURN. + ENDIF. + _add_str( iv_chunk ). + WHEN cl_abap_typedescr=>typekind_oref. + ASSERT iv_chunk IS BOUND. " Dev mistake + TRY. + lo_html ?= iv_chunk. + CATCH cx_sy_move_cast_error. + ASSERT 1 = 0. " Dev mistake + ENDTRY. + _add_htm( lo_html ). + WHEN OTHERS. + ASSERT 1 = 0. " Dev mistake + ENDCASE. + + ENDMETHOD. " add + + METHOD reset. + CLEAR: me->mv_html, me->mv_indent. + ENDMETHOD. "reset + + METHOD _add_str. + CONSTANTS lc_single_tags_re TYPE string " HTML5 singleton tags + VALUE '<(area|base|br|col|command|embed|hr|img|input|link|meta|param|source)'. + + DATA lv_tags TYPE i. + DATA lv_tags_open TYPE i. + DATA lv_tags_close TYPE i. + DATA lv_tags_single TYPE i. + DATA lv_close_offs TYPE i. + DATA lv_shift_back TYPE i. + + FIND FIRST OCCURRENCE OF ' 0. " Found close tag @beginning + lv_shift_back = 1. + ENDIF. + + mv_html = mv_html + && repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * c_indent_size ) + && iv_str + && gc_newline. + + FIND ALL OCCURRENCES OF '<' IN iv_str MATCH COUNT lv_tags. + FIND ALL OCCURRENCES OF '' + IF lv_tags_open > lv_tags_close. + mv_indent = mv_indent + 1. + ELSEIF lv_tags_open < lv_tags_close AND mv_indent > 0. + mv_indent = mv_indent - 1. + ENDIF. + + ENDMETHOD. "_add_str + + METHOD _add_htm. + DATA lv_indent_str TYPE string. + DATA lv_temp_str TYPE string. + + lv_indent_str = repeat( val = ` ` occ = mv_indent * c_indent_size ). + lv_temp_str = io_html->mv_html. + + IF me->mv_indent > 0. + REPLACE ALL OCCURRENCES OF gc_newline IN lv_temp_str + WITH gc_newline && lv_indent_str. + SHIFT lv_temp_str RIGHT DELETING TRAILING space. + SHIFT lv_temp_str LEFT DELETING LEADING space. + ENDIF. + + mv_html = mv_html && lv_indent_str && lv_temp_str. + mv_indent = mv_indent + io_html->mv_indent. + + ENDMETHOD. "_add_htm + +ENDCLASS. "lcl_html_helper IMPLEMENTATION + CLASS lcl_log DEFINITION. PUBLIC SECTION. @@ -266,11 +377,13 @@ CLASS lcl_log DEFINITION. add IMPORTING iv_msgv1 TYPE csequence - iv_msgv2 TYPE csequence - iv_msgv3 TYPE csequence - iv_msgv4 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. @@ -280,6 +393,31 @@ 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. @@ -12677,8 +12815,7 @@ CLASS lcl_file_status DEFINITION FINAL. CLASS-METHODS status IMPORTING io_repo TYPE REF TO lcl_repo -* it_files TYPE ty_files_tt -* iv_package TYPE devclass + io_log TYPE REF TO lcl_log OPTIONAL RETURNING VALUE(rt_results) TYPE ty_results_tt RAISING lcx_exception. @@ -12899,6 +13036,37 @@ CLASS lcl_tadir IMPLEMENTATION. ENDCLASS. "lcl_tadir IMPLEMENTATION +*----------------------------------------------------------------------* +* CLASS lcl_package DEFINITION +*----------------------------------------------------------------------* +* +*----------------------------------------------------------------------* +CLASS lcl_sap_package DEFINITION FINAL. + + PUBLIC SECTION. + CLASS-METHODS: + check + IMPORTING io_log TYPE REF TO lcl_log + it_results TYPE lcl_file_status=>ty_results_tt + iv_top TYPE devclass, + create_local + IMPORTING iv_package TYPE devclass + RAISING lcx_exception, + create + IMPORTING is_package TYPE scompkdtln + RAISING lcx_exception. + + PRIVATE SECTION. + CLASS-METHODS: + class_to_path + IMPORTING + iv_top TYPE devclass + iv_package TYPE devclass + RETURNING + VALUE(rv_path) TYPE string. + +ENDCLASS. "lcl_package DEFINITION + *----------------------------------------------------------------------* * CLASS lcl_file_status IMPLEMENTATION *----------------------------------------------------------------------* @@ -12942,7 +13110,7 @@ CLASS lcl_file_status IMPLEMENTATION. lt_remote = io_repo->get_files_remote( ). - lt_local = io_repo->get_files_local( ). + lt_local = io_repo->get_files_local( io_log ). LOOP AT lt_remote ASSIGNING . lcl_progress=>show( iv_key = 'Status' @@ -13009,6 +13177,12 @@ CLASS lcl_file_status IMPLEMENTATION. obj_name = -obj_name TRANSPORTING NO FIELDS. IF sy-subrc <> 0. + ls_item-obj_type = -object. + ls_item-obj_name = -obj_name. + IF lcl_objects=>is_supported( ls_item ) = abap_false. + CONTINUE. + ENDIF. + CLEAR ls_result. ls_result-match = abap_true. ls_result-obj_type = -object. @@ -13039,40 +13213,15 @@ CLASS lcl_file_status IMPLEMENTATION. DELETE ADJACENT DUPLICATES FROM rt_results COMPARING obj_type obj_name filename. + lcl_sap_package=>check( + io_log = io_log + it_results = rt_results + iv_top = io_repo->get_package( ) ). + ENDMETHOD. "status ENDCLASS. "lcl_file_status IMPLEMENTATION -*----------------------------------------------------------------------* -* CLASS lcl_package DEFINITION -*----------------------------------------------------------------------* -* -*----------------------------------------------------------------------* -CLASS lcl_sap_package DEFINITION FINAL. - - PUBLIC SECTION. - CLASS-METHODS: - check - IMPORTING it_results TYPE lcl_file_status=>ty_results_tt - iv_top TYPE devclass - RETURNING VALUE(rv_errors) TYPE string, - create_local - IMPORTING iv_package TYPE devclass - RAISING lcx_exception, - create - IMPORTING is_package TYPE scompkdtln - RAISING lcx_exception. - - PRIVATE SECTION. - CLASS-METHODS: - class_to_path - IMPORTING - iv_top TYPE devclass - iv_package TYPE devclass - RETURNING - VALUE(rv_path) TYPE string. - -ENDCLASS. "lcl_package DEFINITION *----------------------------------------------------------------------* * CLASS lcl_package IMPLEMENTATION @@ -13132,10 +13281,10 @@ CLASS lcl_sap_package IMPLEMENTATION. WHERE obj_type = -obj_type AND obj_name = -obj_name AND path <> -path. - CONCATENATE rv_errors 'Files for object' - -obj_type -obj_name - 'are not placed in the same folder
' - INTO rv_errors SEPARATED BY space. "#EC NOTEXT + io_log->add( iv_msgv1 = 'Files for object' + iv_msgv2 = -obj_type + iv_msgv3 = -obj_name + iv_msgv4 = 'are not placed in the same folder' ) ##no_text. EXIT. ENDLOOP. ENDLOOP. @@ -13146,9 +13295,9 @@ CLASS lcl_sap_package IMPLEMENTATION. lv_path = class_to_path( iv_top = iv_top iv_package = -package ). IF lv_path <> -path. - CONCATENATE rv_errors 'Package and path does not match for object,' - -obj_type -obj_name '
' - INTO rv_errors SEPARATED BY space. "#EC NOTEXT + io_log->add( iv_msgv1 = 'Package and path does not match for object,' + iv_msgv2 = -obj_type + iv_msgv3 = -obj_name ) ##no_text. ENDIF. ENDLOOP. @@ -13158,17 +13307,12 @@ CLASS lcl_sap_package IMPLEMENTATION. LOOP AT it_results ASSIGNING WHERE filename = -filename AND path <> -path. - CONCATENATE rv_errors 'Multiple files with same filename,' - -filename '
' - INTO rv_errors SEPARATED BY space. "#EC NOTEXT + io_log->add( iv_msgv1 = 'Multiple files with same filename,' + iv_msgv2 = -filename ) ##no_text. EXIT. ENDLOOP. ENDLOOP. - IF NOT rv_errors IS INITIAL. - CONCATENATE '
' rv_errors INTO rv_errors. - ENDIF. - ENDMETHOD. "check METHOD create. @@ -14960,6 +15104,7 @@ CLASS lcl_repo_online DEFINITION INHERITING FROM lcl_repo FINAL. RAISING lcx_exception, deserialize REDEFINITION, status + IMPORTING io_log TYPE REF TO lcl_log OPTIONAL RETURNING VALUE(rt_results) TYPE lcl_file_status=>ty_results_tt RAISING lcx_exception, push @@ -15141,117 +15286,6 @@ CLASS lcl_git_porcelain DEFINITION FINAL FRIENDS ltcl_git_porcelain. ENDCLASS. "lcl_porcelain DEFINITION -*----------------------------------------------------------------------* -* CLASS lcl_html_helper DEFINITION -*----------------------------------------------------------------------* -CLASS lcl_html_helper DEFINITION FINAL. - PUBLIC SECTION. - CONSTANTS c_indent_size TYPE i VALUE 2. - - DATA mv_html TYPE string READ-ONLY. - DATA mv_indent TYPE i READ-ONLY. - - METHODS add IMPORTING iv_chunk TYPE any. - METHODS reset. - - PRIVATE SECTION. - METHODS _add_str IMPORTING iv_str TYPE csequence. - METHODS _add_htm IMPORTING io_html TYPE REF TO lcl_html_helper. - -ENDCLASS. "lcl_html_helper DEFINITION - -*----------------------------------------------------------------------* -* CLASS lcl_html_helper IMPLEMENTATION -*----------------------------------------------------------------------* -CLASS lcl_html_helper IMPLEMENTATION. - METHOD add. - DATA lo_type TYPE REF TO cl_abap_typedescr. - DATA lo_html TYPE REF TO lcl_html_helper. - - lo_type = cl_abap_typedescr=>describe_by_data( iv_chunk ). - - CASE lo_type->type_kind. - WHEN cl_abap_typedescr=>typekind_char - OR cl_abap_typedescr=>typekind_string. - IF strlen( iv_chunk ) = 0. - RETURN. - ENDIF. - _add_str( iv_chunk ). - WHEN cl_abap_typedescr=>typekind_oref. - ASSERT iv_chunk IS BOUND. " Dev mistake - TRY. - lo_html ?= iv_chunk. - CATCH cx_sy_move_cast_error. - ASSERT 1 = 0. " Dev mistake - ENDTRY. - _add_htm( lo_html ). - WHEN OTHERS. - ASSERT 1 = 0. " Dev mistake - ENDCASE. - - ENDMETHOD. " add - - METHOD reset. - CLEAR: me->mv_html, me->mv_indent. - ENDMETHOD. "reset - - METHOD _add_str. - CONSTANTS lc_single_tags_re TYPE string " HTML5 singleton tags - VALUE '<(area|base|br|col|command|embed|hr|img|input|link|meta|param|source)'. - - DATA lv_tags TYPE i. - DATA lv_tags_open TYPE i. - DATA lv_tags_close TYPE i. - DATA lv_tags_single TYPE i. - DATA lv_close_offs TYPE i. - DATA lv_shift_back TYPE i. - - FIND FIRST OCCURRENCE OF ' 0. " Found close tag @beginning - lv_shift_back = 1. - ENDIF. - - mv_html = mv_html - && repeat( val = ` ` occ = ( mv_indent - lv_shift_back ) * c_indent_size ) - && iv_str - && gc_newline. - - FIND ALL OCCURRENCES OF '<' IN iv_str MATCH COUNT lv_tags. - FIND ALL OCCURRENCES OF '' - IF lv_tags_open > lv_tags_close. - mv_indent = mv_indent + 1. - ELSEIF lv_tags_open < lv_tags_close AND mv_indent > 0. - mv_indent = mv_indent - 1. - ENDIF. - - ENDMETHOD. "_add_str - - METHOD _add_htm. - DATA lv_indent_str TYPE string. - DATA lv_temp_str TYPE string. - - lv_indent_str = repeat( val = ` ` occ = mv_indent * c_indent_size ). - lv_temp_str = io_html->mv_html. - - IF me->mv_indent > 0. - REPLACE ALL OCCURRENCES OF gc_newline IN lv_temp_str - WITH gc_newline && lv_indent_str. - SHIFT lv_temp_str RIGHT DELETING TRAILING space. - SHIFT lv_temp_str LEFT DELETING LEADING space. - ENDIF. - - mv_html = mv_html && lv_indent_str && lv_temp_str. - mv_indent = mv_indent + io_html->mv_indent. - - ENDMETHOD. "_add_htm - -ENDCLASS. "lcl_html_helper IMPLEMENTATION - *----------------------------------------------------------------------* * INTERFACE lif_gui_page DEFINITION *----------------------------------------------------------------------* @@ -15426,7 +15460,8 @@ CLASS lcl_repo_online IMPLEMENTATION. initialize( ). - rt_results = lcl_file_status=>status( me ). + rt_results = lcl_file_status=>status( io_repo = me + io_log = io_log ). ENDMETHOD. "status @@ -19188,6 +19223,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. lx_error TYPE REF TO lcx_exception, lv_span TYPE i, lv_trclass TYPE string, + lo_log TYPE REF TO lcl_log, lt_results TYPE lcl_file_status=>ty_results_tt, ls_next LIKE LINE OF lt_results, ls_item TYPE ty_item, @@ -19205,7 +19241,8 @@ CLASS lcl_gui_page_main IMPLEMENTATION. IF go_user->is_hidden( io_repo->get_key( ) ) = abap_false. TRY. - lt_results = io_repo->status( ). + CREATE OBJECT lo_log. + lt_results = io_repo->status( lo_log ). ro_html->add( '' ). ro_html->add( '' ). @@ -19217,13 +19254,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. CLEAR lv_link. IF -filename IS INITIAL. - MOVE-CORRESPONDING TO ls_item. - lv_supported = lcl_objects=>is_supported( ls_item ). - IF lv_supported = abap_true. - lv_link = 'new'. - ELSE. - lv_link = |Object type { ls_item-obj_type } not supported|. - ENDIF. + lv_link = 'new'. ELSEIF -match = abap_false. lv_link = 'diff'. ENDIF. @@ -19283,9 +19314,7 @@ CLASS lcl_gui_page_main IMPLEMENTATION. '">stage' ). ENDIF. - ro_html->add( lcl_sap_package=>check( - it_results = lt_results - iv_top = io_repo->get_package( ) ) ). + ro_html->add( lo_log->to_html( ) ). CATCH lcx_exception INTO lx_error. ro_html->add( render_error( lx_error ) ).