Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 23 additions & 3 deletions embedded/abap/zcl_vsp_amdp_service.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ CLASS zcl_vsp_amdp_service DEFINITION

PUBLIC SECTION.
INTERFACES zif_vsp_service.
CLASS-METHODS class_constructor.

PRIVATE SECTION.
" Session state per WebSocket connection
Expand All @@ -21,6 +22,7 @@ CLASS zcl_vsp_amdp_service DEFINITION
END OF ty_session.

CLASS-DATA gt_sessions TYPE HASHED TABLE OF ty_session WITH UNIQUE KEY session_id.
CLASS-DATA gv_pcre_supported TYPE abap_bool.

METHODS handle_start
IMPORTING is_message TYPE zif_vsp_service=>ty_message
Expand Down Expand Up @@ -86,6 +88,17 @@ ENDCLASS.

CLASS zcl_vsp_amdp_service IMPLEMENTATION.

METHOD class_constructor.
" Probe for PCRE support: \d was introduced in ABAP 7.55 (POSIX ERE on older releases).
TRY.
DATA lv_pcre_probe TYPE string.
FIND REGEX '\d' IN '1' SUBMATCHES lv_pcre_probe.
gv_pcre_supported = xsdbool( sy-subrc = 0 AND lv_pcre_probe = '1' ).
CATCH cx_root.
gv_pcre_supported = abap_false.
ENDTRY.
ENDMETHOD.

METHOD zif_vsp_service~get_domain.
rv_domain = 'amdp'.
ENDMETHOD.
Expand Down Expand Up @@ -844,12 +857,19 @@ CLASS zcl_vsp_amdp_service IMPLEMENTATION.
" Extract parameter from JSON params string
" Simple regex-based extraction
DATA lv_pattern TYPE string.
lv_pattern = |"{ iv_name }"\\s*:\\s*"([^"]*)"|.

IF gv_pcre_supported = abap_true.
lv_pattern = |"{ iv_name }"\\s*:\\s*"([^"]*)"|.
ELSE.
lv_pattern = |"{ iv_name }"[[:space:]]*:[[:space:]]*"([^"]*)"|.
ENDIF.
FIND REGEX lv_pattern IN iv_params SUBMATCHES rv_value.
IF sy-subrc <> 0.
" Try numeric value
lv_pattern = |"{ iv_name }"\\s*:\\s*(\\d+)|.
IF gv_pcre_supported = abap_true.
lv_pattern = |"{ iv_name }"\\s*:\\s*(\\d+)|.
ELSE.
lv_pattern = |"{ iv_name }"[[:space:]]*:[[:space:]]*([[:digit:]]+)|.
ENDIF.
FIND REGEX lv_pattern IN iv_params SUBMATCHES rv_value.
ENDIF.
ENDMETHOD.
Expand Down
43 changes: 35 additions & 8 deletions embedded/abap/zcl_vsp_apc_handler.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ CLASS zcl_vsp_apc_handler DEFINITION
DATA mv_session_id TYPE string.

CLASS-DATA gt_services TYPE STANDARD TABLE OF REF TO zif_vsp_service WITH KEY table_line.
" abap_true on 7.55+; abap_false on older releases that only support POSIX ERE
CLASS-DATA gv_pcre_supported TYPE abap_bool.

METHODS parse_message
IMPORTING iv_text TYPE string
Expand Down Expand Up @@ -52,11 +54,25 @@ ENDCLASS.
CLASS zcl_vsp_apc_handler IMPLEMENTATION.

METHOD class_constructor.
" Probe for PCRE support: \d was introduced in ABAP 7.55 (POSIX ERE on older releases).
" A runtime probe is more reliable than comparing sy-saprl strings.
TRY.
DATA lv_pcre_probe TYPE string.
FIND REGEX '\d' IN '1' SUBMATCHES lv_pcre_probe.
gv_pcre_supported = xsdbool( sy-subrc = 0 AND lv_pcre_probe = '1' ).
CATCH cx_root.
gv_pcre_supported = abap_false.
ENDTRY.

APPEND NEW zcl_vsp_rfc_service( ) TO gt_services.
APPEND NEW zcl_vsp_debug_service( ) TO gt_services.
APPEND NEW zcl_vsp_amdp_service( ) TO gt_services.
APPEND NEW zcl_vsp_git_service( ) TO gt_services.
APPEND NEW zcl_vsp_report_service( ) TO gt_services.
* Skipped on classic ECC: debug/amdp/git/report services depend on
* types/classes (if_amdp_dbg_main, ZCL_ABAPGIT_*, S/4 RAP runtime) that
* are absent on this release. The RFC service is sufficient for vsp's
* enhancement-source bridge (RPY_PROGRAM_READ via the rfc domain).
* APPEND NEW zcl_vsp_debug_service( ) TO gt_services.
* APPEND NEW zcl_vsp_amdp_service( ) TO gt_services.
* APPEND NEW zcl_vsp_git_service( ) TO gt_services.
* APPEND NEW zcl_vsp_report_service( ) TO gt_services.
ENDMETHOD.

METHOD if_apc_wsp_extension~on_start.
Expand Down Expand Up @@ -114,9 +130,16 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.

METHOD parse_message.
TRY.
FIND PCRE '"id"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-id.
FIND PCRE '"domain"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-domain.
FIND PCRE '"action"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-action.
" PCRE (7.55+): \s / \d | POSIX ERE (pre-7.55): [[:space:]] / [[:digit:]]
IF gv_pcre_supported = abap_true.
FIND REGEX '"id"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-id.
FIND REGEX '"domain"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-domain.
FIND REGEX '"action"\s*:\s*"([^"]*)"' IN iv_text SUBMATCHES rs_message-action.
ELSE.
FIND REGEX '"id"[[:space:]]*:[[:space:]]*"([^"]*)"' IN iv_text SUBMATCHES rs_message-id.
FIND REGEX '"domain"[[:space:]]*:[[:space:]]*"([^"]*)"' IN iv_text SUBMATCHES rs_message-domain.
FIND REGEX '"action"[[:space:]]*:[[:space:]]*"([^"]*)"' IN iv_text SUBMATCHES rs_message-action.
ENDIF.

" Handle nested JSON in params by finding the balanced braces
DATA(lv_params_start) = find( val = iv_text sub = '"params"' ).
Expand Down Expand Up @@ -145,7 +168,11 @@ CLASS zcl_vsp_apc_handler IMPLEMENTATION.
ENDIF.

DATA lv_timeout TYPE string.
FIND PCRE '"timeout"\s*:\s*(\d+)' IN iv_text SUBMATCHES lv_timeout.
IF gv_pcre_supported = abap_true.
FIND REGEX '"timeout"\s*:\s*(\d+)' IN iv_text SUBMATCHES lv_timeout.
ELSE.
FIND REGEX '"timeout"[[:space:]]*:[[:space:]]*([[:digit:]]+)' IN iv_text SUBMATCHES lv_timeout.
ENDIF.
IF sy-subrc = 0.
rs_message-timeout = lv_timeout.
ELSE.
Expand Down
29 changes: 25 additions & 4 deletions embedded/abap/zcl_vsp_debug_service.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ CLASS zcl_vsp_debug_service DEFINITION

PUBLIC SECTION.
INTERFACES zif_vsp_service.
CLASS-METHODS class_constructor.

TYPES:
BEGIN OF ty_breakpoint_state,
Expand All @@ -23,6 +24,7 @@ CLASS zcl_vsp_debug_service DEFINITION
tt_breakpoints TYPE STANDARD TABLE OF ty_breakpoint_state WITH KEY id.

PRIVATE SECTION.
CLASS-DATA gv_pcre_supported TYPE abap_bool.
DATA mv_session_id TYPE string.
DATA mv_debug_user TYPE sy-uname.
DATA mt_breakpoints TYPE tt_breakpoints.
Expand Down Expand Up @@ -128,6 +130,17 @@ ENDCLASS.

CLASS zcl_vsp_debug_service IMPLEMENTATION.

METHOD class_constructor.
" Probe for PCRE support: \d was introduced in ABAP 7.55 (POSIX ERE on older releases).
TRY.
DATA lv_pcre_probe TYPE string.
FIND REGEX '\d' IN '1' SUBMATCHES lv_pcre_probe.
gv_pcre_supported = xsdbool( sy-subrc = 0 AND lv_pcre_probe = '1' ).
CATCH cx_root.
gv_pcre_supported = abap_false.
ENDTRY.
ENDMETHOD.

METHOD zif_vsp_service~get_domain.
rv_domain = 'debug'.
ENDMETHOD.
Expand Down Expand Up @@ -1002,15 +1015,23 @@ CLASS zcl_vsp_debug_service IMPLEMENTATION.

METHOD extract_param.
DATA lv_pattern TYPE string.
lv_pattern = |"{ iv_name }"\\s*:\\s*"([^"]*)"|.
FIND PCRE lv_pattern IN iv_params SUBMATCHES rv_value.
IF gv_pcre_supported = abap_true.
lv_pattern = |"{ iv_name }"\\s*:\\s*"([^"]*)"|.
ELSE.
lv_pattern = |"{ iv_name }"[[:space:]]*:[[:space:]]*"([^"]*)"|.
ENDIF.
FIND REGEX lv_pattern IN iv_params SUBMATCHES rv_value.
ENDMETHOD.

METHOD extract_param_int.
DATA lv_pattern TYPE string.
DATA lv_str TYPE string.
lv_pattern = |"{ iv_name }"\\s*:\\s*(\\d+)|.
FIND PCRE lv_pattern IN iv_params SUBMATCHES lv_str.
IF gv_pcre_supported = abap_true.
lv_pattern = |"{ iv_name }"\\s*:\\s*(\\d+)|.
ELSE.
lv_pattern = |"{ iv_name }"[[:space:]]*:[[:space:]]*([[:digit:]]+)|.
ENDIF.
FIND REGEX lv_pattern IN iv_params SUBMATCHES lv_str.
IF sy-subrc = 0.
rv_value = lv_str.
ENDIF.
Expand Down
40 changes: 35 additions & 5 deletions embedded/abap/zcl_vsp_git_service.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ CLASS zcl_vsp_git_service DEFINITION

PUBLIC SECTION.
INTERFACES zif_vsp_service.
CLASS-METHODS class_constructor.

PRIVATE SECTION.
TYPES:
Expand Down Expand Up @@ -70,11 +71,24 @@ CLASS zcl_vsp_git_service DEFINITION
iv_error TYPE string OPTIONAL
RETURNING VALUE(rs_response) TYPE zif_vsp_service=>ty_response.

CLASS-DATA gv_pcre_supported TYPE abap_bool.

ENDCLASS.


CLASS zcl_vsp_git_service IMPLEMENTATION.

METHOD class_constructor.
" Probe for PCRE support: \d was introduced in ABAP 7.55 (POSIX ERE on older releases).
TRY.
DATA lv_pcre_probe TYPE string.
FIND REGEX '\d' IN '1' SUBMATCHES lv_pcre_probe.
gv_pcre_supported = xsdbool( sy-subrc = 0 AND lv_pcre_probe = '1' ).
CATCH cx_root.
gv_pcre_supported = abap_false.
ENDTRY.
ENDMETHOD.

METHOD zif_vsp_service~get_domain.
rv_domain = 'git'.
ENDMETHOD.
Expand Down Expand Up @@ -152,12 +166,18 @@ CLASS zcl_vsp_git_service IMPLEMENTATION.
" Extract package names from JSON params
" Format: {"packages":["$PKG1","$PKG2"],"includeSubpackages":true}
DATA lv_pkg TYPE devclass.
DATA lv_pattern TYPE string.

" Check for packages array
FIND PCRE '"packages"\s*:\s*\[([^\]]*)\]' IN lv_params SUBMATCHES DATA(lv_pkgs_str).
IF gv_pcre_supported = abap_true.
lv_pattern = '"packages"\s*:\s*\[([^\]]*)\]'.
ELSE.
lv_pattern = '"packages"[[:space:]]*:[[:space:]]*\[([^\]]*)\]'.
ENDIF.
FIND REGEX lv_pattern IN lv_params SUBMATCHES DATA(lv_pkgs_str).
IF sy-subrc = 0.
" Parse comma-separated quoted package names
FIND ALL OCCURRENCES OF PCRE '"([^"]+)"' IN lv_pkgs_str
FIND ALL OCCURRENCES OF REGEX '"([^"]+)"' IN lv_pkgs_str
RESULTS DATA(lt_matches).

LOOP AT lt_matches INTO DATA(ls_match).
Expand All @@ -170,14 +190,24 @@ CLASS zcl_vsp_git_service IMPLEMENTATION.
ENDIF.

" Check for includeSubpackages flag
FIND PCRE '"includeSubpackages"\s*:\s*(true|false)' IN lv_params SUBMATCHES DATA(lv_sub_flag).
IF gv_pcre_supported = abap_true.
lv_pattern = '"includeSubpackages"\s*:\s*(true|false)'.
ELSE.
lv_pattern = '"includeSubpackages"[[:space:]]*:[[:space:]]*(true|false)'.
ENDIF.
FIND REGEX lv_pattern IN lv_params SUBMATCHES DATA(lv_sub_flag).
lv_include_sub = xsdbool( lv_sub_flag = 'true' OR lv_sub_flag IS INITIAL ).

" Check for objects array (alternative to packages)
FIND PCRE '"objects"\s*:\s*\[([^\]]*)\]' IN lv_params SUBMATCHES DATA(lv_objs_str).
IF gv_pcre_supported = abap_true.
lv_pattern = '"objects"\s*:\s*\[([^\]]*)\]'.
ELSE.
lv_pattern = '"objects"[[:space:]]*:[[:space:]]*\[([^\]]*)\]'.
ENDIF.
FIND REGEX lv_pattern IN lv_params SUBMATCHES DATA(lv_objs_str).
IF sy-subrc = 0 AND lt_packages IS INITIAL.
" Parse objects like: {"type":"CLAS","name":"ZCL_TEST"}
FIND ALL OCCURRENCES OF PCRE '\{"type":"([^"]+)","name":"([^"]+)"\}' IN lv_objs_str
FIND ALL OCCURRENCES OF REGEX '\{"type":"([^"]+)","name":"([^"]+)"\}' IN lv_objs_str
RESULTS DATA(lt_obj_matches).

LOOP AT lt_obj_matches INTO DATA(ls_obj_match).
Expand Down
37 changes: 33 additions & 4 deletions embedded/abap/zcl_vsp_report_service.clas.abap
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ CLASS zcl_vsp_report_service DEFINITION

PUBLIC SECTION.
INTERFACES zif_vsp_service.
CLASS-METHODS class_constructor.

PRIVATE SECTION.
CLASS-DATA gv_pcre_supported TYPE abap_bool.
METHODS handle_run_report
IMPORTING is_message TYPE zif_vsp_service=>ty_message
RETURNING VALUE(rs_response) TYPE zif_vsp_service=>ty_response.
Expand Down Expand Up @@ -48,6 +50,17 @@ ENDCLASS.

CLASS zcl_vsp_report_service IMPLEMENTATION.

METHOD class_constructor.
" Probe for PCRE support: \d was introduced in ABAP 7.55 (POSIX ERE on older releases).
TRY.
DATA lv_pcre_probe TYPE string.
FIND REGEX '\d' IN '1' SUBMATCHES lv_pcre_probe.
gv_pcre_supported = xsdbool( sy-subrc = 0 AND lv_pcre_probe = '1' ).
CATCH cx_root.
gv_pcre_supported = abap_false.
ENDTRY.
ENDMETHOD.

METHOD zif_vsp_service~get_domain.
rv_domain = 'report'.
ENDMETHOD.
Expand Down Expand Up @@ -115,7 +128,11 @@ CLASS zcl_vsp_report_service IMPLEMENTATION.
WHILE lv_work CS '"'.
DATA lv_pname TYPE string.
DATA lv_pval TYPE string.
FIND PCRE '"([^"]+)"\s*:\s*"([^"]*)"' IN lv_work SUBMATCHES lv_pname lv_pval.
IF gv_pcre_supported = abap_true.
FIND REGEX '"([^"]+)"\s*:\s*"([^"]*)"' IN lv_work SUBMATCHES lv_pname lv_pval.
ELSE.
FIND REGEX '"([^"]+)"[[:space:]]*:[[:space:]]*"([^"]*)"' IN lv_work SUBMATCHES lv_pname lv_pval.
ENDIF.
IF sy-subrc = 0.
TRANSLATE lv_pname TO UPPER CASE.
DATA lv_selname TYPE rsscr_name.
Expand Down Expand Up @@ -359,7 +376,11 @@ CLASS zcl_vsp_report_service IMPLEMENTATION.
WHILE lv_work CS '"'.
DATA lv_key TYPE string.
DATA lv_val TYPE string.
FIND PCRE '"([^"]+)"\s*:\s*"([^"]*)"' IN lv_work SUBMATCHES lv_key lv_val.
IF gv_pcre_supported = abap_true.
FIND REGEX '"([^"]+)"\s*:\s*"([^"]*)"' IN lv_work SUBMATCHES lv_key lv_val.
ELSE.
FIND REGEX '"([^"]+)"[[:space:]]*:[[:space:]]*"([^"]*)"' IN lv_work SUBMATCHES lv_key lv_val.
ENDIF.
IF sy-subrc = 0.
TRANSLATE lv_key TO UPPER CASE.
REPLACE ALL OCCURRENCES OF '\"' IN lv_val WITH '"'.
Expand Down Expand Up @@ -394,7 +415,11 @@ CLASS zcl_vsp_report_service IMPLEMENTATION.
lv_work = lv_sym_json.
WHILE lv_work CS '"'.
CLEAR: lv_key, lv_val.
FIND PCRE '"([^"]+)"\s*:\s*"([^"]*)"' IN lv_work SUBMATCHES lv_key lv_val.
IF gv_pcre_supported = abap_true.
FIND REGEX '"([^"]+)"\s*:\s*"([^"]*)"' IN lv_work SUBMATCHES lv_key lv_val.
ELSE.
FIND REGEX '"([^"]+)"[[:space:]]*:[[:space:]]*"([^"]*)"' IN lv_work SUBMATCHES lv_key lv_val.
ENDIF.
IF sy-subrc = 0.
REPLACE ALL OCCURRENCES OF '\"' IN lv_val WITH '"'.
REPLACE ALL OCCURRENCES OF '\\' IN lv_val WITH '\'.
Expand Down Expand Up @@ -481,7 +506,11 @@ CLASS zcl_vsp_report_service IMPLEMENTATION.
IF sy-subrc = 0.
DATA lv_rest TYPE string.
lv_rest = iv_params+lv_pos.
FIND PCRE ':\s*"([^"]*)"' IN lv_rest SUBMATCHES rv_value.
IF gv_pcre_supported = abap_true.
FIND REGEX ':\s*"([^"]*)"' IN lv_rest SUBMATCHES rv_value.
ELSE.
FIND REGEX ':[[:space:]]*"([^"]*)"' IN lv_rest SUBMATCHES rv_value.
ENDIF.
ENDIF.
ENDMETHOD.

Expand Down
Loading