├── .abapgit.xml ├── .github └── FUNDING.YML ├── 9781484269626.jpg ├── Contributing.md ├── LICENSE.txt ├── README.md ├── errata.md └── src ├── package.devc.xml ├── z_adt_classic_outline.fugr.lz_adt_classic_outlinetop.abap ├── z_adt_classic_outline.fugr.lz_adt_classic_outlinetop.xml ├── z_adt_classic_outline.fugr.saplz_adt_classic_outline.abap ├── z_adt_classic_outline.fugr.saplz_adt_classic_outline.xml ├── z_adt_classic_outline.fugr.xml ├── z_adt_classic_outline.fugr.z_adtco_get_backend_comp_ver.abap ├── z_adt_classic_outline.fugr.z_adtco_get_inc_master_program.abap ├── z_adt_classic_outline.fugr.z_adtco_get_object_tree.abap ├── z_adt_classic_outline.fugr.z_adtco_get_uri_for_tree_node.abap ├── zcl_adtco_tree_creator.clas.abap ├── zcl_adtco_tree_creator.clas.xml ├── zcl_adtco_uri_mapper.clas.abap └── zcl_adtco_uri_mapper.clas.xml /.abapgit.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | E 6 | /src/ 7 | PREFIX 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/FUNDING.YML: -------------------------------------------------------------------------------- 1 | github: fidley 2 | patreon: # Replace with a single Patreon username 3 | open_collective: # Replace with a single Open Collective username 4 | ko_fi: # Replace with a single Ko-fi username 5 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 6 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 7 | liberapay: # Replace with a single Liberapay username 8 | issuehunt: # Replace with a single IssueHunt username 9 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 10 | polar: # Replace with a single Polar username 11 | buy_me_a_coffee: abapblog 12 | thanks_dev: # Replace with a single thanks.dev username 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /9781484269626.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fidley/ADT-Classic-Outline-Backend/5fe0c392340f847a48d435afaf8fe441a23d1148/9781484269626.jpg -------------------------------------------------------------------------------- /Contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing to Apress Source Code 2 | 3 | Copyright for Apress source code belongs to the author(s). However, under fair use you are encouraged to fork and contribute minor corrections and updates for the benefit of the author(s) and other readers. 4 | 5 | ## How to Contribute 6 | 7 | 1. Make sure you have a GitHub account. 8 | 2. Fork the repository for the relevant book. 9 | 3. Create a new branch on which to make your change, e.g. 10 | `git checkout -b my_code_contribution` 11 | 4. Commit your change. Include a commit message describing the correction. Please note that if your commit message is not clear, the correction will not be accepted. 12 | 5. Submit a pull request. 13 | 14 | Thank you for your contribution! -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Freeware License, some rights reserved 2 | 3 | Copyright (c) 2021 Łukasz Pęgiel 4 | 5 | Permission is hereby granted, free of charge, to anyone obtaining a copy 6 | of this software and associated documentation files (the "Software"), 7 | to work with the Software within the limits of freeware distribution and fair use. 8 | This includes the rights to use, copy, and modify the Software for personal use. 9 | Users are also allowed and encouraged to submit corrections and modifications 10 | to the Software for the benefit of other users. 11 | 12 | It is not allowed to reuse, modify, or redistribute the Software for 13 | commercial use in any way, or for a user’s educational materials such as books 14 | or blog articles without prior permission from the copyright holder. 15 | 16 | The above copyright notice and this permission notice need to be included 17 | in all copies or substantial portions of the software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 | AUTHORS OR COPYRIGHT HOLDERS OR APRESS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 25 | SOFTWARE. 26 | 27 | 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Apress Source Code 2 | 3 | This repository accompanies [*ABAP in Eclipse*](https://www.apress.com/9781484269626) by Łukasz Pęgiel (Apress, 2021). 4 | 5 | [comment]: #cover 6 | ![Cover image](9781484269626.jpg) 7 | 8 | 9 | # Installation 10 | 11 | 1. Use abapGit and clone the repository https://github.com/fidley/ADT-Classic-Outline-Backend/ to your system 12 | 2. Install ADT Classic Outline from http://abapblog.com/eclipse/plugin/ABAPFavorites/ by using install new software function in Eclipse 13 | (soon also on Eclipse Marketplace) 14 | -------------------------------------------------------------------------------- /errata.md: -------------------------------------------------------------------------------- 1 | # Errata for *ABAP in Eclipse* 2 | 3 | On **page xx** [Summary of error]: 4 | 5 | Details of error here. Highlight key pieces in **bold**. 6 | 7 | *** 8 | 9 | On **page xx** [Summary of error]: 10 | 11 | Details of error here. Highlight key pieces in **bold**. 12 | 13 | *** -------------------------------------------------------------------------------- /src/package.devc.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ADT Classic outline backend 7 | BC-ABA 8 | HLB0009083 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.lz_adt_classic_outlinetop.abap: -------------------------------------------------------------------------------- 1 | FUNCTION-POOL Z_ADT_CLASSIC_OUTLINE. "MESSAGE-ID .. 2 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.lz_adt_classic_outlinetop.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | LZ_ADT_CLASSIC_OUTLINETOP 7 | S 8 | D$ 9 | I 10 | S 11 | X 12 | D$S 13 | X 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.saplz_adt_classic_outline.abap: -------------------------------------------------------------------------------- 1 | ******************************************************************* 2 | * System-defined Include-files. * 3 | ******************************************************************* 4 | INCLUDE LZ_ADT_CLASSIC_OUTLINETOP. " Global Declarations 5 | INCLUDE LZ_ADT_CLASSIC_OUTLINEUXX. " Function Modules 6 | 7 | ******************************************************************* 8 | * User-defined Include-files (if necessary). * 9 | ******************************************************************* 10 | * INCLUDE LZ_ADTBOOK_CHAPTER07F... " Subroutines 11 | * INCLUDE LZ_ADTBOOK_CHAPTER07O... " PBO-Modules 12 | * INCLUDE LZ_ADTBOOK_CHAPTER07I... " PAI-Modules 13 | * INCLUDE LZ_ADTBOOK_CHAPTER07E... " Events 14 | * INCLUDE LZ_ADTBOOK_CHAPTER07P... " Local class implement. 15 | * INCLUDE LZ_ADTBOOK_CHAPTER07T99. " ABAP Unit tests 16 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.saplz_adt_classic_outline.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | SAPLZ_ADT_CLASSIC_OUTLINE 7 | S 8 | D$ 9 | F 10 | S 11 | E 12 | X 13 | D$S 14 | X 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ADT Classic Outline 6 | 7 | LZ_ADT_CLASSIC_OUTLINETOP 8 | SAPLZ_ADT_CLASSIC_OUTLINE 9 | 10 | 11 | 12 | Z_ADTCO_GET_BACKEND_COMP_VER 13 | R 14 | Get ADTCO Backend Version 15 | 16 | 17 | VERSION 18 | I 19 | 20 | 21 | 22 | 23 | VERSION 24 | P 25 | 26 | 27 | 28 | 29 | Z_ADTCO_GET_INC_MASTER_PROGRAM 30 | X 31 | Get Include Master Program 32 | X 33 | 34 | 35 | INCLUDE 36 | STRING 37 | 38 | 39 | 40 | 41 | MASTER 42 | STRING 43 | 44 | 45 | MASTER_TYPE 46 | STRING 47 | 48 | 49 | 50 | 51 | INCLUDE 52 | P 53 | 54 | 55 | MASTER 56 | P 57 | 58 | 59 | MASTER_TYPE 60 | P 61 | 62 | 63 | 64 | 65 | Z_ADTCO_GET_OBJECT_TREE 66 | X 67 | Gets Outline Tree for Object 68 | X 69 | 70 | 71 | OBJECT_NAME 72 | EU_LNAME 73 | 74 | 75 | OBJECT_TYPE 76 | SEU_OBJ 77 | 78 | 79 | PARAMETERS 80 | X 81 | TIHTTPNVP 82 | 83 | 84 | 85 | 86 | TREE 87 | SNODETAB 88 | 89 | 90 | 91 | 92 | OBJECT_NAME 93 | P 94 | 95 | 96 | OBJECT_TYPE 97 | P 98 | 99 | 100 | PARAMETERS 101 | P 102 | 103 | 104 | TREE 105 | P 106 | 107 | 108 | 109 | 110 | Z_ADTCO_GET_URI_FOR_TREE_NODE 111 | X 112 | Gets ADT URI for tree Node 113 | X 114 | 115 | 116 | NODE 117 | SNODETEXT 118 | 119 | 120 | OBJECT_NAME 121 | EU_LNAME 122 | 123 | 124 | OBJECT_TYPE 125 | SEU_OBJ 126 | 127 | 128 | 129 | 130 | URI 131 | STRING 132 | 133 | 134 | 135 | 136 | NODE 137 | P 138 | 139 | 140 | OBJECT_NAME 141 | P 142 | 143 | 144 | OBJECT_TYPE 145 | P 146 | 147 | 148 | URI 149 | P 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.z_adtco_get_backend_comp_ver.abap: -------------------------------------------------------------------------------- 1 | FUNCTION Z_ADTCO_GET_BACKEND_COMP_VER. 2 | *"---------------------------------------------------------------------- 3 | *"*"Local Interface: 4 | *" EXPORTING 5 | *" VALUE(VERSION) TYPE I 6 | *"---------------------------------------------------------------------- 7 | version = 1. 8 | 9 | 10 | 11 | ENDFUNCTION. 12 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.z_adtco_get_inc_master_program.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_adtco_get_inc_master_program. 2 | *"---------------------------------------------------------------------- 3 | *"*"Local Interface: 4 | *" IMPORTING 5 | *" VALUE(INCLUDE) TYPE STRING 6 | *" EXPORTING 7 | *" VALUE(MASTER) TYPE STRING 8 | *" VALUE(MASTER_TYPE) TYPE STRING 9 | *"---------------------------------------------------------------------- 10 | SELECT MASTER 11 | FROM D010INC WHERE INCLUDE EQ @INCLUDE 12 | ORDER BY PRIMARY KEY INTO @MASTER UP TO 1 ROWS . 13 | ENDSELECT. 14 | IF sy-subrc EQ 0. 15 | SELECT SINGLE subc FROM trdir 16 | INTO @DATA(type) 17 | WHERE name = @master. 18 | IF type EQ 'F'. 19 | master_type = 'FUGR/F'. 20 | IF master(1) EQ '/'. 21 | DATA(regex) = NEW cl_abap_regex( pattern = '(\/.*\/)SAPL(.*)' ). 22 | DATA(matcher) = regex->create_matcher( text = master ). 23 | IF matcher->match( ). 24 | master = |{ matcher->get_submatch( index = 1 ) }{ matcher->get_submatch( index = 2 ) }|. 25 | ENDIF. 26 | ELSE. 27 | SHIFT master BY 4 PLACES LEFT. 28 | ENDIF. 29 | ELSEIF type EQ 'K'. 30 | DATA offset TYPE i. 31 | FIND FIRST OCCURRENCE OF '=' IN master MATCH OFFSET offset. 32 | IF sy-subrc EQ 0. 33 | master = master(offset). 34 | ENDIF. 35 | master_type = 'CLAS/OC'. 36 | ELSE. 37 | master_type = 'PROG/P'. 38 | ENDIF. 39 | ENDIF. 40 | 41 | 42 | 43 | ENDFUNCTION. 44 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.z_adtco_get_object_tree.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_adtco_get_object_tree. 2 | *"---------------------------------------------------------------------- 3 | *"*"Local Interface: 4 | *" IMPORTING 5 | *" VALUE(OBJECT_NAME) TYPE EU_LNAME 6 | *" VALUE(OBJECT_TYPE) TYPE SEU_OBJ 7 | *" VALUE(PARAMETERS) TYPE TIHTTPNVP OPTIONAL 8 | *" EXPORTING 9 | *" VALUE(TREE) TYPE SNODETAB 10 | *"---------------------------------------------------------------------- 11 | tree = NEW zcl_adtco_tree_creator( )->create_tree( object_name = object_name 12 | object_type = object_type 13 | parameters = parameters ). 14 | 15 | 16 | 17 | 18 | 19 | ENDFUNCTION. 20 | -------------------------------------------------------------------------------- /src/z_adt_classic_outline.fugr.z_adtco_get_uri_for_tree_node.abap: -------------------------------------------------------------------------------- 1 | FUNCTION z_adtco_get_uri_for_tree_node. 2 | *"---------------------------------------------------------------------- 3 | *"*"Local Interface: 4 | *" IMPORTING 5 | *" VALUE(NODE) TYPE SNODETEXT 6 | *" VALUE(OBJECT_NAME) TYPE EU_LNAME 7 | *" VALUE(OBJECT_TYPE) TYPE SEU_OBJ 8 | *" EXPORTING 9 | *" VALUE(URI) TYPE STRING 10 | *"---------------------------------------------------------------------- 11 | uri = zcl_adtco_uri_mapper=>get_instance( )->get_uri_for_tree_node( EXPORTING node = node 12 | object_name = object_name 13 | object_type = object_type 14 | ). 15 | 16 | 17 | 18 | 19 | ENDFUNCTION. 20 | -------------------------------------------------------------------------------- /src/zcl_adtco_tree_creator.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_adtco_tree_creator DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PUBLIC . 5 | 6 | PUBLIC SECTION. 7 | TYPES: tt_tree TYPE STANDARD TABLE OF snodetext WITH DEFAULT KEY 8 | WITH NON-UNIQUE SORTED KEY type COMPONENTS type 9 | WITH NON-UNIQUE SORTED KEY method COMPONENTS text1 type. 10 | TYPES: BEGIN OF t_attribute, 11 | clsname TYPE seocompo-clsname, 12 | cmpname TYPE seocompo-cmpname, 13 | version TYPE seocompodf-version, 14 | attrdonly TYPE seocompodf-attrdonly, 15 | mtdabstrct TYPE seocompodf-mtdabstrct, 16 | mtdfinal TYPE seocompodf-mtdfinal, 17 | mtddecltyp TYPE seocompodf-mtddecltyp, 18 | attdecltyp TYPE seocompodf-attdecltyp, 19 | exposure TYPE seocompodf-exposure, 20 | typtype TYPE seocompodf-typtype, 21 | refcmpname TYPE seocompodf-refcmpname, 22 | cmptype TYPE seocompo-cmptype, 23 | mtdtype TYPE seocompo-mtdtype, 24 | END OF t_attribute. 25 | METHODS create_tree 26 | IMPORTING 27 | !object_name TYPE eu_lname 28 | !object_type TYPE seu_obj 29 | VALUE(parameters) TYPE tihttpnvp OPTIONAL 30 | RETURNING 31 | VALUE(tree) TYPE tt_tree . 32 | PROTECTED SECTION. 33 | PRIVATE SECTION. 34 | CONSTANTS class_type TYPE string VALUE 'CLAS/OC' ##NO_TEXT. 35 | CONSTANTS interface_type TYPE string VALUE 'INTF/OI' ##NO_TEXT. 36 | TYPES: BEGIN OF ty_parameters, 37 | load_redefinitions_of_method TYPE abap_bool, 38 | load_all_levels_of_subclasses TYPE abap_bool, 39 | load_all_levels_of_redef TYPE abap_bool, 40 | END OF ty_parameters. 41 | TYPES: 42 | ty_class_names TYPE RANGE OF seocompo-clsname. 43 | METHODS get_subclasses_description 44 | IMPORTING 45 | original_object_name TYPE eu_lname. 46 | METHODS build_class_range 47 | IMPORTING 48 | original_object_name TYPE eu_lname 49 | RETURNING 50 | VALUE(class_names) TYPE ty_class_names. 51 | DATA relations TYPE REF TO cl_oo_class_relations. 52 | DATA subclasses_descriptions TYPE HASHED TABLE OF seoclasstx WITH UNIQUE KEY clsname. 53 | DATA call_parameters TYPE ty_parameters. 54 | METHODS get_object_name 55 | IMPORTING 56 | original_object_name TYPE eu_lname 57 | original_object_type TYPE seu_obj 58 | RETURNING 59 | VALUE(object_name) TYPE eu_lname. 60 | METHODS get_object_type 61 | IMPORTING 62 | original_object_type TYPE seu_obj 63 | RETURNING 64 | VALUE(object_type) TYPE seu_obj. 65 | METHODS add_sublcasses 66 | IMPORTING original_object_name TYPE eu_lname 67 | original_object_type TYPE seu_obj 68 | CHANGING VALUE(tree) TYPE tt_tree. 69 | METHODS get_class_description 70 | IMPORTING 71 | class_name TYPE seorelkey-clsname 72 | RETURNING 73 | VALUE(description) TYPE char72. 74 | METHODS get_counter 75 | IMPORTING 76 | tree TYPE tt_tree 77 | RETURNING 78 | VALUE(counter) TYPE i. 79 | METHODS get_subclasses 80 | IMPORTING 81 | object_name TYPE eu_lname 82 | RETURNING 83 | VALUE(subclasses) TYPE seo_relkeys. 84 | METHODS actualize_program_tree 85 | IMPORTING 86 | object_type TYPE seu_obj 87 | object_name TYPE eu_lname 88 | tree_object_type TYPE seu_obj. 89 | METHODS add_superclasses 90 | IMPORTING 91 | original_object_name TYPE eu_lname 92 | original_object_type TYPE seu_obj 93 | CHANGING 94 | tree TYPE tt_tree. 95 | METHODS get_superclasses 96 | IMPORTING 97 | original_object_name TYPE eu_lname 98 | RETURNING 99 | VALUE(superclasses) TYPE seo_relkeys. 100 | METHODS add_class_additional_info 101 | IMPORTING 102 | object_name TYPE eu_lname 103 | object_type TYPE seu_obj 104 | CHANGING 105 | tree TYPE tt_tree. 106 | METHODS add_visibility 107 | IMPORTING 108 | original_object_name TYPE eu_lname 109 | original_object_type TYPE seu_obj 110 | CHANGING 111 | tree TYPE tt_tree. 112 | METHODS set_visibility 113 | CHANGING 114 | node TYPE snodetext. 115 | METHODS set_object_type 116 | CHANGING 117 | node TYPE snodetext. 118 | METHODS add_local_classes_attributes 119 | CHANGING 120 | tree TYPE tt_tree. 121 | METHODS add_redefinitions 122 | IMPORTING 123 | original_object_name TYPE eu_lname 124 | original_object_type TYPE seu_obj 125 | CHANGING 126 | tree TYPE tt_tree. 127 | METHODS parse_parameters 128 | IMPORTING 129 | parameters TYPE tihttpnvp. 130 | METHODS get_first_level_subclasses 131 | IMPORTING 132 | class_name TYPE eu_lname 133 | RETURNING 134 | VALUE(subclasses) TYPE seo_relkeys. 135 | METHODS get_first_lvl_of_redefinitions 136 | IMPORTING 137 | class_name TYPE eu_lname 138 | RETURNING 139 | VALUE(redefinitions) TYPE seor_redefinitions_r. 140 | METHODS adapt_attiributes 141 | IMPORTING 142 | att TYPE t_attribute 143 | original_object_name TYPE eu_lname 144 | node TYPE REF TO snodetext. 145 | METHODS build_interfaces_range 146 | IMPORTING 147 | tree TYPE zcl_adtco_tree_creator=>tt_tree 148 | RETURNING 149 | VALUE(interfaces_range) TYPE ty_class_names. 150 | ENDCLASS. 151 | 152 | 153 | 154 | CLASS zcl_adtco_tree_creator IMPLEMENTATION. 155 | 156 | 157 | METHOD add_sublcasses. 158 | CHECK relations IS NOT INITIAL. 159 | 160 | ASSIGN tree[ KEY type COMPONENTS type = 'COU' ] TO FIELD-SYMBOL(). 161 | IF sy-subrc EQ 0. 162 | DATA(counter) = get_counter( tree ). 163 | DATA(subclasses) = get_subclasses( original_object_name ). 164 | get_subclasses_description( original_object_name ). 165 | LOOP AT subclasses ASSIGNING FIELD-SYMBOL(). 166 | IF -child IS INITIAL. 167 | -child = counter. 168 | ENDIF. 169 | APPEND VALUE #( text1 = -clsname parent = -id id = counter type = 'OOC' text2 = get_class_description( -clsname ) ) TO tree. 170 | ADD 1 TO counter. 171 | ENDLOOP. 172 | ENDIF. 173 | ENDMETHOD. 174 | 175 | 176 | METHOD create_tree. 177 | parse_parameters( parameters ). 178 | DATA(tree_object_type) = get_object_type( object_type ). 179 | actualize_program_tree( object_type = object_type 180 | object_name = object_name 181 | tree_object_type = tree_object_type ). 182 | CALL FUNCTION 'WB_ANYTYPE_RETURN_OBJECT_LIST' 183 | EXPORTING 184 | p_object_type = tree_object_type 185 | p_object_name = CONV eu_lname( get_object_name( original_object_name = object_name 186 | original_object_type = object_type ) ) 187 | TABLES 188 | nodetab = tree 189 | EXCEPTIONS 190 | objectlist_not_found = 1 191 | OTHERS = 2. 192 | IF sy-subrc <> 0. 193 | IF object_type EQ 'REPS'. 194 | CALL FUNCTION 'WB_TREE_RETURN_OBJECT_LIST' 195 | EXPORTING 196 | treename = CONV eu_t_name( |PG_{ object_name }| ) 197 | refresh = 'X' 198 | TABLES 199 | nodetab = tree 200 | EXCEPTIONS 201 | not_existing = 1 202 | OTHERS = 2. 203 | IF sy-subrc <> 0. 204 | MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. 205 | ENDIF. 206 | ENDIF. 207 | ENDIF. 208 | add_class_additional_info( EXPORTING object_name = object_name 209 | object_type = object_type 210 | CHANGING tree = tree ). 211 | ENDMETHOD. 212 | 213 | METHOD add_class_additional_info. 214 | 215 | DATA: line LIKE LINE OF tree. 216 | MODIFY TABLE tree FROM line TRANSPORTING kind3 kind4 kind5 kind6 kind7 kind8 kind9. 217 | 218 | add_superclasses( EXPORTING original_object_name = object_name 219 | original_object_type = object_type 220 | CHANGING tree = tree ). 221 | 222 | add_sublcasses( EXPORTING original_object_name = object_name 223 | original_object_type = object_type 224 | CHANGING tree = tree ). 225 | 226 | add_visibility( EXPORTING original_object_name = object_name 227 | original_object_type = object_type 228 | CHANGING tree = tree ). 229 | 230 | add_redefinitions( EXPORTING original_object_name = object_name 231 | original_object_type = object_type 232 | CHANGING tree = tree ). 233 | add_local_classes_attributes( CHANGING tree = tree ). 234 | 235 | ENDMETHOD. 236 | 237 | 238 | 239 | 240 | METHOD actualize_program_tree. 241 | 242 | IF tree_object_type CP 'PROG*' 243 | OR tree_object_type CP 'REPS*' 244 | OR tree_object_type CP 'FUGR*'. 245 | CALL FUNCTION 'WB_TREE_ACTUALIZE' 246 | EXPORTING 247 | tree_name = CONV eu_lname( |PG_{ get_object_name( original_object_name = object_name 248 | original_object_type = object_type ) }| ) 249 | without_crossreference = abap_true 250 | with_tcode_index = abap_true. 251 | ELSEIF tree_object_type CP 'CLAS*' OR 252 | tree_object_type CP 'INTF*'. 253 | CALL FUNCTION 'WB_TREE_ACTUALIZE' 254 | EXPORTING 255 | tree_name = CONV eu_lname( |CP_{ object_name }| ) 256 | without_crossreference = abap_true 257 | with_tcode_index = abap_true. 258 | ENDIF. 259 | 260 | ENDMETHOD. 261 | 262 | 263 | METHOD get_class_description. 264 | ASSIGN subclasses_descriptions[ clsname = class_name ] TO FIELD-SYMBOL(). 265 | IF sy-subrc EQ 0. 266 | description = -descript. 267 | RETURN. 268 | ENDIF. 269 | SELECT SINGLE descript INTO @description 270 | FROM seoclasstx 271 | WHERE clsname EQ @class_name 272 | AND langu EQ @sy-langu. 273 | ENDMETHOD. 274 | 275 | METHOD get_subclasses_description. 276 | DATA(subclasses) = get_subclasses( original_object_name ). 277 | CHECK subclasses IS NOT INITIAL. 278 | SELECT clsname, descript INTO CORRESPONDING FIELDS OF TABLE @subclasses_descriptions 279 | FROM seoclasstx 280 | FOR ALL ENTRIES IN @subclasses 281 | WHERE clsname EQ @subclasses-clsname 282 | AND langu EQ @sy-langu. 283 | ENDMETHOD. 284 | 285 | 286 | METHOD get_counter. 287 | counter = tree[ lines( tree ) ]-id + 1. 288 | ENDMETHOD. 289 | 290 | 291 | METHOD get_object_name. 292 | CASE original_object_type. 293 | WHEN 'FUGR/FF'. 294 | SELECT SINGLE pname FROM tfdir 295 | INTO object_name 296 | WHERE funcname = original_object_name. 297 | REPLACE FIRST OCCURRENCE OF 'SAPL' IN object_name WITH ''. 298 | WHEN 'FUGR/I'. 299 | object_name = original_object_name. 300 | IF object_name(1) EQ '/'. 301 | DATA(regex) = NEW cl_abap_regex( pattern = '(\/.*\/)L(.*)' ). 302 | DATA(matcher) = regex->create_matcher( text = object_name ). 303 | IF matcher->match( ). 304 | object_name = |{ matcher->get_submatch( index = 1 ) }{ matcher->get_submatch( index = 2 ) }|. 305 | ENDIF. 306 | ELSE. 307 | SHIFT object_name BY 1 PLACES LEFT. 308 | ENDIF. 309 | DATA(lenght) = strlen( object_name ) - 3. 310 | object_name = object_name(lenght). 311 | WHEN 'REPS' OR 'PROG/I'. 312 | SELECT SINGLE master INTO @object_name 313 | FROM d010inc 314 | WHERE include EQ @original_object_name. 315 | object_name+40 = original_object_name. 316 | WHEN OTHERS. 317 | object_name = original_object_name. 318 | ENDCASE. 319 | ENDMETHOD. 320 | 321 | 322 | METHOD get_object_type. 323 | object_type = original_object_type(4). 324 | ENDMETHOD. 325 | 326 | 327 | METHOD get_subclasses. 328 | IF call_parameters-load_all_levels_of_subclasses EQ abap_false. 329 | subclasses = get_first_level_subclasses( object_name ). 330 | ELSE. 331 | subclasses = VALUE #( FOR IN relations->subclasses ( clsname = -clsname ) ). 332 | ENDIF. 333 | SORT subclasses BY clsname. 334 | DELETE ADJACENT DUPLICATES FROM subclasses COMPARING clsname. 335 | ENDMETHOD. 336 | 337 | METHOD add_superclasses. 338 | CHECK original_object_type EQ class_type. 339 | DATA(superclasses) = get_superclasses( CONV #( original_object_name ) ). 340 | ASSIGN tree[ KEY type COMPONENTS type = 'COS' ] TO FIELD-SYMBOL(). 341 | IF sy-subrc EQ 0. 342 | DATA(counter) = get_counter( tree ). 343 | LOOP AT superclasses ASSIGNING FIELD-SYMBOL(). 344 | ASSIGN tree[ KEY method COMPONENTS type = 'OOC' text1 = -clsname ] TO . 345 | IF sy-subrc EQ 0. 346 | IF -child IS INITIAL. 347 | -child = counter. 348 | ENDIF. 349 | APPEND VALUE #( text1 = -refclsname parent = -id id = counter type = 'OOC' text2 = get_class_description( -refclsname ) ) TO tree. 350 | ADD 1 TO counter. 351 | ENDIF. 352 | ENDLOOP. 353 | ENDIF. 354 | ENDMETHOD. 355 | 356 | 357 | METHOD get_superclasses. 358 | relations = NEW cl_oo_class_relations( 359 | clsname = CONV #( original_object_name ) 360 | w_superclasses = abap_true 361 | w_subclasses = COND #( WHEN call_parameters-load_all_levels_of_subclasses EQ abap_true 362 | OR call_parameters-load_all_levels_of_redef EQ abap_true THEN abap_true 363 | ELSE abap_false ) 364 | w_references = abap_false 365 | w_redefinitions = COND #( WHEN call_parameters-load_redefinitions_of_method EQ abap_true 366 | AND call_parameters-load_all_levels_of_redef EQ abap_true THEN abap_true 367 | ELSE abap_false ) 368 | w_eventhandler = abap_false 369 | w_implementings = abap_false ). 370 | LOOP AT relations->superclasses ASSIGNING FIELD-SYMBOL() 371 | WHERE clsname NE original_object_name. 372 | IF NOT line_exists( superclasses[ clsname = -clsname refclsname = -refclsname ] ). 373 | APPEND VALUE #( clsname = -clsname refclsname = -refclsname ) TO superclasses. 374 | ENDIF. 375 | ENDLOOP. 376 | ENDMETHOD. 377 | 378 | 379 | METHOD add_visibility. 380 | CHECK original_object_type EQ class_type OR 381 | original_object_type EQ interface_type. 382 | 383 | data: attributes type sorted table of t_attribute with NON-UNIQUE key clsname cmpname version. 384 | DATA(class_names) = build_class_range( original_object_name ). 385 | IF original_object_type EQ class_type. 386 | DATA(interfaces_mames) = build_interfaces_range( tree ). 387 | APPEND LINES OF interfaces_mames TO class_names. 388 | ENDIF. 389 | 390 | 391 | SELECT seocompo~clsname, seocompo~cmpname, version, attrdonly, mtdabstrct, mtdfinal, mtddecltyp, attdecltyp, exposure,typtype, refcmpname, 392 | cmptype, mtdtype 393 | INTO CORRESPONDING FIELDS OF TABLE @attributes 394 | FROM seocompodf 395 | INNER JOIN seocompo 396 | ON seocompo~clsname EQ seocompodf~clsname 397 | AND seocompo~cmpname EQ seocompodf~cmpname 398 | WHERE seocompo~clsname IN @class_names. 399 | 400 | DELETE ADJACENT DUPLICATES FROM attributes COMPARING clsname cmpname. 401 | 402 | LOOP AT attributes ASSIGNING FIELD-SYMBOL(). 403 | IF NOT -clsname IN interfaces_mames OR interfaces_mames IS INITIAL. 404 | LOOP AT tree ASSIGNING FIELD-SYMBOL() USING KEY method WHERE text1 = -cmpname 405 | AND type NP 'OOL*' 406 | AND text8 NP '*~*'. 407 | adapt_attiributes( 408 | EXPORTING 409 | att = 410 | original_object_name = original_object_name 411 | node = REF #( ) ). 412 | ENDLOOP. 413 | ELSE. 414 | DATA(name_pattern) = |{ -clsname }~{ -cmpname }|. 415 | LOOP AT tree ASSIGNING USING KEY method WHERE text1 = -cmpname 416 | AND type NP 'OOL*' 417 | AND text8 EQ name_pattern. 418 | adapt_attiributes( 419 | EXPORTING 420 | att = 421 | original_object_name = original_object_name 422 | node = REF #( ) ). 423 | ENDLOOP. 424 | ENDIF. 425 | ENDLOOP. 426 | 427 | 428 | ENDMETHOD. 429 | 430 | METHOD adapt_attiributes. 431 | 432 | IF att-cmptype EQ 3 AND att-clsname NE original_object_name AND node->text8 NP '*~*'. 433 | node->text8 = att-clsname. 434 | ENDIF. 435 | IF att-attrdonly EQ abap_true. 436 | node->kind7 = abap_true. 437 | ENDIF. 438 | IF att-mtdfinal EQ abap_true. 439 | node->kind8 = abap_true. 440 | ENDIF. 441 | node->kind9 = COND #( WHEN att-attdecltyp IS NOT INITIAL THEN att-attdecltyp 442 | WHEN att-mtddecltyp IS NOT INITIAL THEN att-mtddecltyp 443 | ELSE 0 ). 444 | 445 | IF att-mtdabstrct EQ abap_true. 446 | node->kind6 = abap_true. 447 | ENDIF. 448 | node->kind5 = att-exposure. 449 | node->kind4 = att-cmptype. 450 | IF node->kind4 EQ 2. 451 | CLEAR node->kind4. 452 | ENDIF. 453 | IF att-mtdtype EQ 1. 454 | node->kind4 = 2. 455 | ENDIF. 456 | 457 | ENDMETHOD. 458 | 459 | 460 | 461 | METHOD add_local_classes_attributes. 462 | 463 | FIELD-SYMBOLS TYPE snodetext. 464 | 465 | LOOP AT tree ASSIGNING WHERE type CP 'OOL*' 466 | OR type CP 'OON*' 467 | OR type EQ 'OOL' 468 | OR type EQ 'OPL'. 469 | 470 | set_object_type( CHANGING node = ). 471 | set_visibility( CHANGING node = ). 472 | 473 | IF -text6+7(1) EQ 'X'."read only 474 | -kind7 = abap_true. 475 | ENDIF. 476 | IF -text6(1) EQ 'X'. "final 477 | -kind8 = abap_true. 478 | ENDIF. 479 | IF -text6+6(1) EQ 'X'."static 480 | -kind9 = 1. 481 | ENDIF. 482 | IF -text6+1(1) EQ 'X'. "abstract 483 | -kind6 = abap_true. 484 | ENDIF. 485 | IF -text6+2(1) EQ 'X'. "for testing 486 | -kind3 = abap_true. 487 | ENDIF. 488 | IF -text2 EQ 'constant'. 489 | -kind9 = 2. 490 | -kind4 = 0. 491 | ELSEIF -text2 EQ 'event handler'. 492 | -kind4 = 2. 493 | ENDIF. 494 | ENDLOOP. 495 | 496 | ENDMETHOD. 497 | 498 | 499 | 500 | METHOD set_object_type. 501 | 502 | node-kind4 = SWITCH #( node-type WHEN 'OOLT' OR 'OONT' THEN 3 503 | WHEN 'OOLA' OR 'OONA' THEN 0 504 | WHEN 'OOLD' OR 'OOND' THEN 1 505 | WHEN 'OOLI' OR 'OONI' THEN 1 506 | WHEN 'OOLE' OR 'OONE' THEN 2 507 | ELSE space ). 508 | 509 | ENDMETHOD. 510 | 511 | 512 | 513 | METHOD set_visibility. 514 | 515 | node-kind5 = SWITCH #( node-name WHEN '@5B@' THEN 2 516 | WHEN '@5C@' THEN 0 517 | WHEN '@5D@' THEN 1 ). 518 | 519 | ENDMETHOD. 520 | 521 | 522 | 523 | METHOD build_class_range. 524 | IF relations IS NOT INITIAL. 525 | LOOP AT relations->superclasses ASSIGNING FIELD-SYMBOL(). 526 | IF sy-tabix EQ 1. 527 | APPEND VALUE #( sign = 'I' option = 'EQ' low = -clsname ) TO class_names. 528 | ENDIF. 529 | APPEND VALUE #( sign = 'I' option = 'EQ' low = -refclsname ) TO class_names. 530 | ENDLOOP. 531 | IF sy-subrc NE 0. 532 | APPEND VALUE #( sign = 'I' option = 'EQ' low = original_object_name ) TO class_names. 533 | ENDIF. 534 | ELSE. 535 | APPEND VALUE #( sign = 'I' option = 'EQ' low = original_object_name ) TO class_names. 536 | ENDIF. 537 | ENDMETHOD. 538 | 539 | 540 | 541 | 542 | METHOD add_redefinitions. 543 | DATA: redefinitions TYPE seor_redefinitions_r. 544 | CHECK relations IS NOT INITIAL AND 545 | call_parameters-load_redefinitions_of_method EQ abap_true. 546 | 547 | IF call_parameters-load_all_levels_of_redef EQ abap_false. 548 | redefinitions = get_first_lvl_of_redefinitions( original_object_name ). 549 | ELSE. 550 | redefinitions = relations->redefinitions. 551 | ENDIF. 552 | DATA(counter) = get_counter( tree ). 553 | LOOP AT redefinitions ASSIGNING FIELD-SYMBOL(). 554 | ASSIGN tree[ KEY method COMPONENTS text1 = -mtdname type = 'OOM' ] TO FIELD-SYMBOL(). 555 | IF sy-subrc EQ 0. 556 | IF -child IS INITIAL. 557 | -child = counter. 558 | ENDIF. 559 | APPEND VALUE #( text1 = -clsname parent = -id id = counter type = zcl_adtco_uri_mapper=>node_types-method_redefintion_class text2 = get_class_description( -clsname ) text8 = -mtdname ) TO tree. 560 | ADD 1 TO counter. 561 | ENDIF. 562 | ENDLOOP. 563 | ENDMETHOD. 564 | 565 | 566 | METHOD parse_parameters. 567 | CONSTANTS fetchredefinitionsformethods TYPE string VALUE 'FetchRedefinitionsForMethods' ##NO_TEXT. 568 | CONSTANTS loadalllevelsofsubclasses TYPE string VALUE 'LoadAllLevelsOfSubclasses' ##NO_TEXT. 569 | CONSTANTS loadalllevelsofredefinitions TYPE string VALUE 'LoadAllLevelsOfRedefinitions' ##NO_TEXT. 570 | LOOP AT parameters ASSIGNING FIELD-SYMBOL(). 571 | CASE -name. 572 | WHEN fetchredefinitionsformethods. 573 | call_parameters-load_redefinitions_of_method = -value. 574 | WHEN loadalllevelsofsubclasses. 575 | call_parameters-load_all_levels_of_subclasses = -value. 576 | WHEN loadalllevelsofredefinitions. 577 | call_parameters-load_all_levels_of_redef = -value. 578 | ENDCASE. 579 | ENDLOOP. 580 | ENDMETHOD. 581 | 582 | 583 | METHOD get_first_level_subclasses. 584 | SELECT clsname , refclsname FROM vseoextend 585 | INTO CORRESPONDING FIELDS OF TABLE @subclasses 586 | WHERE refclsname = @class_name 587 | AND ( version = '0' OR version = '1' ). 588 | ENDMETHOD. 589 | 590 | 591 | METHOD get_first_lvl_of_redefinitions. 592 | SELECT * FROM seoredef INTO CORRESPONDING FIELDS OF TABLE @redefinitions 593 | WHERE refclsname = @class_name. 594 | SORT redefinitions BY clsname mtdname. 595 | DELETE ADJACENT DUPLICATES FROM redefinitions COMPARING clsname mtdname. 596 | ENDMETHOD. 597 | 598 | 599 | METHOD build_interfaces_range. 600 | interfaces_range = VALUE #( FOR IN tree USING KEY type WHERE ( type EQ 'OOI' ) ( sign = 'I' option = 'EQ' low = -text1 ) ). 601 | ENDMETHOD. 602 | 603 | ENDCLASS. 604 | -------------------------------------------------------------------------------- /src/zcl_adtco_tree_creator.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_ADTCO_TREE_CREATOR 7 | E 8 | Class Outline Creator 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /src/zcl_adtco_uri_mapper.clas.abap: -------------------------------------------------------------------------------- 1 | CLASS zcl_adtco_uri_mapper DEFINITION 2 | PUBLIC 3 | FINAL 4 | CREATE PRIVATE . 5 | 6 | PUBLIC SECTION. 7 | CONSTANTS: BEGIN OF node_types, 8 | lcl_interface_type TYPE string VALUE 'OONT' ##NO_TEXT, 9 | lcl_interface_method_def TYPE string VALUE 'OOND' ##NO_TEXT, 10 | lcl_interface_attribute TYPE string VALUE 'OONA' ##NO_TEXT, 11 | lcl_interface_interface TYPE string VALUE 'OONN' ##NO_TEXT, 12 | lcl_method_definition TYPE string VALUE 'OOLD' ##NO_TEXT, 13 | lcl_method_implementation TYPE string VALUE 'OOLI' ##NO_TEXT, 14 | lcl_attribute TYPE string VALUE 'OOLA' ##NO_TEXT, 15 | lcl_type TYPE string VALUE 'OOLT' ##NO_TEXT, 16 | lcl_interface TYPE string VALUE 'OOLN' ##NO_TEXT, 17 | class TYPE string VALUE 'OOC' ##NO_TEXT, 18 | interface TYPE string VALUE 'OOI' ##NO_TEXT, 19 | method_redefintion_class TYPE string VALUE 'ROM' ##NO_TEXT, 20 | END OF node_types. 21 | CLASS-METHODS: get_instance RETURNING VALUE(uri_mapper) TYPE REF TO zcl_adtco_uri_mapper. 22 | METHODS: get_uri_for_tree_node IMPORTING VALUE(node) TYPE snodetext 23 | VALUE(object_name) TYPE eu_lname 24 | VALUE(object_type) TYPE seu_obj 25 | RETURNING VALUE(uri) TYPE string. 26 | PROTECTED SECTION. 27 | PRIVATE SECTION. 28 | CONSTANTS: BEGIN OF prefix, 29 | reps TYPE string VALUE 'REPS' ##NO_TEXT, 30 | type TYPE string VALUE 'TYPE' ##NO_TEXT, 31 | fugr_pattern TYPE string VALUE 'FUGR/*' ##NO_TEXT, 32 | class_pattern TYPE string VALUE 'CLAS*' ##NO_TEXT, 33 | adt_fg TYPE string VALUE `/sap/bc/adt/functions/groups/` ##NO_TEXT, 34 | adt_program TYPE string VALUE `/sap/bc/adt/programs/` ##NO_TEXT, 35 | END OF prefix, 36 | BEGIN OF object_types, 37 | fm TYPE string VALUE 'FUGR/FF', 38 | fg TYPE string VALUE 'FUGR/F', 39 | fg_include TYPE string VALUE 'FUGR/I', 40 | interface TYPE string VALUE 'INTF', 41 | report_include TYPE string VALUE 'REPS', 42 | program_include TYPE string VALUE 'PROG/I', 43 | END OF object_types, 44 | BEGIN OF context, 45 | fg TYPE string VALUE `/source/main` ##NO_TEXT, 46 | program_lcl_method TYPE string VALUE `/source/main#type=PROG%2FPLM;name=` ##NO_TEXT, 47 | fg_lcl_method TYPE string VALUE `#type=PROG%2FPLM;name=` ##NO_TEXT, 48 | includes TYPE string VALUE 'includes/' ##NO_TEXT, 49 | programs TYPE string VALUE 'programs/' ##NO_TEXT, 50 | program_lcl_interface_types TYPE string VALUE `/source/main#type=PROG%2FPNY;name=` ##NO_TEXT, 51 | program_lcl_attribute TYPE string VALUE `/source/main#type=PROG%2FPLA;name=` ##NO_TEXT, 52 | fg_lcl_attribute TYPE string VALUE `#type=PROG%2FPLA;name=` ##NO_TEXT, 53 | program_lcl_type TYPE string VALUE `/source/main#type=PROG%2FPLY;name=` ##NO_TEXT, 54 | program_lcl_interface TYPE string VALUE `/source/main#type=PROG%2FPN;name=` ##NO_TEXT, 55 | program_lcl_interface_method TYPE string VALUE `/source/main#type=PROG%2FPNM;name=` ##NO_TEXT, 56 | program_lcl_interface_attrib TYPE string VALUE `/source/main#type=PROG%2FPNA;name=` ##NO_TEXT, 57 | program_lcl_interface_interf TYPE string VALUE `/source/main#type=PROG%2FPNN;name=` ##NO_TEXT, 58 | END OF context. 59 | 60 | 61 | CLASS-DATA: uri_mapper TYPE REF TO zcl_adtco_uri_mapper. 62 | DATA do_escaping TYPE abap_bool. 63 | METHODS build_object_name 64 | IMPORTING 65 | node TYPE REF TO snodetext 66 | RETURNING 67 | VALUE(object_name) TYPE eu_lname. 68 | METHODS build_enclosed_object 69 | IMPORTING 70 | object_name TYPE eu_lname 71 | object_type TYPE seu_obj 72 | node TYPE REF TO snodetext 73 | RETURNING 74 | VALUE(enclosed_object) TYPE char70. 75 | METHODS update_original_class_name 76 | IMPORTING 77 | class_name TYPE eu_lname 78 | CHANGING 79 | uri TYPE string. 80 | METHODS get_origin_class_name 81 | IMPORTING 82 | node TYPE snodetext 83 | class_name TYPE eu_lname 84 | objtype TYPE seu_objtyp 85 | RETURNING VALUE(origin_class_name) TYPE eu_lname. 86 | METHODS build_node_type 87 | IMPORTING 88 | node TYPE snodetext 89 | RETURNING 90 | VALUE(node_type) TYPE seu_type . 91 | METHODS get_object_name 92 | IMPORTING 93 | original_object_name TYPE eu_lname 94 | original_object_type TYPE seu_obj 95 | RETURNING 96 | VALUE(object_name) TYPE eu_lname. 97 | METHODS get_uri_directly 98 | IMPORTING 99 | node TYPE snodetext 100 | VALUE(original_object_name) TYPE eu_lname 101 | original_object_type TYPE seu_obj 102 | RETURNING 103 | VALUE(uri) TYPE string. 104 | METHODS build_internal_name 105 | IMPORTING 106 | node TYPE snodetext 107 | RETURNING 108 | VALUE(internal_name) TYPE string . 109 | METHODS get_program_or_include 110 | IMPORTING 111 | node TYPE snodetext 112 | original_object_name TYPE eu_lname "#EC NEEDED 113 | RETURNING 114 | VALUE(type) TYPE string. 115 | METHODS get_fg_name_from_object 116 | IMPORTING 117 | original_object_name TYPE eu_lname 118 | original_object_type TYPE seu_obj 119 | RETURNING 120 | VALUE(object_name) TYPE eu_lname. 121 | METHODS update_object_name_for_fg 122 | IMPORTING 123 | original_object_type TYPE seu_obj 124 | original_object_name TYPE eu_lname 125 | RETURNING 126 | VALUE(object_name) TYPE eu_lname. 127 | METHODS add_uri_prefix 128 | IMPORTING 129 | current_uri TYPE string 130 | original_object_type TYPE seu_obj 131 | original_object_name TYPE eu_lname 132 | RETURNING 133 | VALUE(uri) TYPE string. 134 | METHODS get_context_for_node_type 135 | IMPORTING 136 | node_type TYPE snodetext-type 137 | RETURNING 138 | VALUE(node_context) TYPE string. 139 | METHODS build_program_uri 140 | IMPORTING 141 | node TYPE snodetext 142 | original_object_name TYPE eu_lname 143 | RETURNING 144 | VALUE(r_result) TYPE string. 145 | METHODS build_fg_uri 146 | IMPORTING 147 | node TYPE snodetext 148 | original_object_name TYPE eu_lname "#EC NEEDED 149 | RETURNING 150 | VALUE(r_result) TYPE string. 151 | METHODS get_context_for_fg_node_type 152 | IMPORTING 153 | node_type TYPE snodetext-type 154 | RETURNING 155 | VALUE(node_context) TYPE string. 156 | METHODS get_fg_main_program_name 157 | IMPORTING 158 | function_group TYPE eu_lname 159 | RETURNING 160 | VALUE(main_program) TYPE char70. 161 | METHODS adapt_uri_for_subclasses 162 | IMPORTING 163 | object_type TYPE seu_obj 164 | VALUE(object_name) TYPE eu_lname 165 | node TYPE snodetext 166 | objtype TYPE seu_objtyp 167 | CHANGING 168 | uri TYPE string. 169 | METHODS escape_string 170 | IMPORTING input TYPE any 171 | RETURNING VALUE(escaped_string) TYPE string. 172 | METHODS get_uri_for_semantic_object 173 | IMPORTING 174 | wb_request TYPE REF TO cl_wb_request 175 | object_type TYPE seu_obj "#EC NEEDED 176 | object_name TYPE eu_lname 177 | node TYPE snodetext 178 | RETURNING 179 | VALUE(uri) TYPE string 180 | RAISING 181 | cx_adt_uri_mapping. 182 | METHODS adapt_uri_for_includes 183 | IMPORTING 184 | object_name TYPE eu_lname 185 | adt_ref TYPE REF TO cl_adt_object_reference 186 | CHANGING 187 | uri TYPE string. 188 | METHODS get_uri_from_wb_request 189 | IMPORTING 190 | node TYPE snodetext 191 | object_name TYPE eu_lname 192 | object_type TYPE seu_obj 193 | VALUE(wb_request) TYPE REF TO cl_wb_request 194 | RETURNING 195 | VALUE(uri) TYPE string. 196 | METHODS update_node_for_750_classes 197 | IMPORTING 198 | node TYPE REF TO snodetext 199 | CHANGING 200 | enclosed_object TYPE char70. 201 | METHODS correct_object_type 202 | IMPORTING 203 | node TYPE snodetext 204 | CHANGING 205 | object_type TYPE seu_obj. 206 | METHODS get_workbench_request 207 | IMPORTING 208 | object_type TYPE seu_obj 209 | object_name TYPE eu_lname 210 | node TYPE snodetext 211 | RETURNING VALUE(wb_request) TYPE REF TO cl_wb_request. 212 | 213 | ENDCLASS. 214 | 215 | 216 | 217 | CLASS zcl_adtco_uri_mapper IMPLEMENTATION. 218 | METHOD get_instance. 219 | IF zcl_adtco_uri_mapper=>uri_mapper IS NOT BOUND. 220 | zcl_adtco_uri_mapper=>uri_mapper = NEW #( ). 221 | ENDIF. 222 | uri_mapper = zcl_adtco_uri_mapper=>uri_mapper. 223 | ENDMETHOD. 224 | 225 | METHOD build_node_type. 226 | node_type = node-type. 227 | IF node-type+1(3) EQ swbm_c_type_cls_type AND node-text8 CP '*~*'. 228 | node_type+1(3) = swbm_c_type_intf_type. 229 | ENDIF. 230 | IF node-type+1(3) EQ swbm_c_type_cls_attribute AND node-text8 IS NOT INITIAL. 231 | node_type+1(3) = swbm_c_type_intf_attribute. 232 | ENDIF. 233 | IF node-type+1(3) EQ swbm_c_type_cls_lintf_intf AND node-text8 IS NOT INITIAL. 234 | node_type+1(3) = swbm_c_type_prg_intf_def. 235 | ENDIF. 236 | IF node-type+1(3) EQ swbm_c_type_class AND node-text8 IS NOT INITIAL. 237 | node_type+1(3) = swbm_c_type_cls_mtd_impl. 238 | ENDIF. 239 | ENDMETHOD. 240 | 241 | METHOD get_uri_for_tree_node. 242 | CHECK node-type(1) NE 'C'. 243 | node-type = build_node_type( node ). 244 | correct_object_type( EXPORTING node = node 245 | CHANGING object_type = object_type ). 246 | cl_wb_request=>create_from_encl_name( 247 | EXPORTING 248 | p_r3tr_type = CONV #( object_type ) 249 | p_object_type = CONV #( node-type+1(3) ) 250 | p_object_name = build_object_name( REF #( node ) ) 251 | p_encl_object_name = build_enclosed_object( 252 | object_name = object_name 253 | object_type = object_type 254 | node = REF #( node ) ) 255 | p_operation = swbm_c_op_display 256 | RECEIVING 257 | p_wb_request = DATA(wb_request) 258 | EXCEPTIONS 259 | OTHERS = 0 ). 260 | uri = get_uri_from_wb_request( 261 | node = node 262 | object_name = object_name 263 | object_type = object_type 264 | wb_request = wb_request ). 265 | ENDMETHOD. 266 | 267 | METHOD correct_object_type. 268 | 269 | IF ( object_type EQ 'CLAS/OC' AND ( node-type CP 'OI*' OR node-type EQ 'OOI') ). 270 | object_type = 'INTF/OI'. 271 | ENDIF. 272 | 273 | ENDMETHOD. 274 | 275 | 276 | 277 | METHOD get_uri_from_wb_request. 278 | 279 | TRY. 280 | uri = get_uri_for_semantic_object( wb_request = wb_request 281 | object_type = object_type 282 | object_name = object_name 283 | node = node ). 284 | 285 | adapt_uri_for_subclasses( 286 | EXPORTING 287 | object_type = object_type 288 | object_name = object_name 289 | node = node 290 | objtype = wb_request->object_type 291 | CHANGING 292 | uri = uri ). 293 | if ( uri is INITIAL and node-type = node_types-class ). 294 | uri = |/sap/bc/adt/oo/classes/{ to_lower( node-text1 ) }/source/main|. 295 | endif. 296 | CATCH cx_root. 297 | TRY. 298 | wb_request = get_workbench_request( 299 | object_type = object_type 300 | object_name = object_name 301 | node = node ). 302 | DATA(adt_reference) = cl_adt_tools_core_factory=>get_instance( )->get_uri_mapper( )->map_wb_request_to_objref( wb_request ). 303 | uri = adt_reference->ref_data-uri. 304 | adapt_uri_for_subclasses( 305 | EXPORTING 306 | object_type = object_type 307 | object_name = object_name 308 | node = node 309 | objtype = wb_request->object_type 310 | CHANGING 311 | uri = uri ). 312 | CATCH cx_adt_uri_mapping. 313 | uri = get_uri_directly( node = node 314 | original_object_name = object_name 315 | original_object_type = object_type ). 316 | ENDTRY. 317 | 318 | ENDTRY. 319 | 320 | ENDMETHOD. 321 | 322 | METHOD get_workbench_request. 323 | 324 | DATA(wb) = cl_wb_object=>create_from_toolaccess_key( 325 | p_object_type = CONV #( node-type+1(3) ) 326 | p_object_name = build_object_name( REF #( node ) ) 327 | p_enclosing_object = build_enclosed_object( 328 | object_name = object_name 329 | object_type = object_type 330 | node = REF #( node ) ) 331 | ). 332 | cl_wb_request=>create_from_object_ref( 333 | EXPORTING 334 | p_wb_object = wb 335 | RECEIVING 336 | p_wb_request = wb_request 337 | EXCEPTIONS 338 | illegal_operation = 0 339 | cancelled = 0 340 | OTHERS = 0 "#EC SUBRC_OK 341 | ). 342 | 343 | ENDMETHOD. 344 | 345 | 346 | 347 | 348 | 349 | METHOD get_uri_for_semantic_object. 350 | 351 | DATA(adtcore) = cl_adt_tools_core_factory=>get_instance( ). 352 | DATA: semantic_builder TYPE REF TO object. 353 | DATA: adt_ref TYPE REF TO cl_adt_object_reference. 354 | CALL METHOD adtcore->('GET_SEMANTIC_URI_BUILDER') 355 | RECEIVING 356 | result = semantic_builder. 357 | 358 | CALL METHOD semantic_builder->('IF_ADT_SEMANTIC_URI_BUILDER~MAP_WB_REQUEST_TO_OBJREF') 359 | EXPORTING 360 | i_wb_request = wb_request 361 | i_include_w_pos = COND sy-repid( WHEN node-text9(4) EQ 'REPS' THEN node-text9+4 ) 362 | RECEIVING 363 | result = adt_ref. 364 | uri = adt_ref->ref_data-uri. 365 | adapt_uri_for_includes( EXPORTING object_name = object_name 366 | adt_ref = adt_ref 367 | CHANGING uri = uri ). 368 | do_escaping = abap_true. 369 | ENDMETHOD. 370 | 371 | METHOD adapt_uri_for_includes. 372 | 373 | IF adt_ref->ref_data-uri CP '*/programs/programs/*' AND 374 | adt_ref->ref_data-type CP 'PROG*' AND 375 | adt_ref->ref_data-name NE object_name. 376 | REPLACE '/programs/programs/' IN uri WITH '/programs/includes/'. 377 | ENDIF. 378 | 379 | ENDMETHOD. 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | METHOD adapt_uri_for_subclasses. 390 | CHECK NOT ( node-type = node_types-method_redefintion_class OR 391 | node-type = node_types-class ). 392 | IF object_type CP prefix-class_pattern . 393 | object_name = get_origin_class_name( node = node 394 | class_name = object_name 395 | objtype = objtype ). 396 | update_original_class_name( EXPORTING class_name = object_name 397 | CHANGING uri = uri ). 398 | ENDIF. 399 | 400 | ENDMETHOD. 401 | 402 | 403 | 404 | METHOD get_origin_class_name. 405 | origin_class_name = class_name. 406 | CASE objtype. 407 | WHEN swbm_c_type_cls_attribute OR swbm_c_type_cls_mtd_def OR swbm_c_type_cls_evt OR swbm_c_type_cls_type. 408 | DATA componentkey TYPE seocmpkey. 409 | CALL FUNCTION 'SEO_COMPONENT_BY_INHERITANCE' 410 | EXPORTING 411 | cpdkey = VALUE seocpdkey( clsname = class_name cpdname = build_object_name( REF #( node ) ) ) 412 | IMPORTING 413 | cmpkey = componentkey 414 | EXCEPTIONS 415 | not_existing = 1 416 | model_only = 2 417 | OTHERS = 3. 418 | IF ( sy-subrc = 0 ). 419 | origin_class_name = componentkey-clsname. 420 | ENDIF. 421 | WHEN swbm_c_type_cls_mtd_impl. 422 | DATA methodkey TYPE seocpdkey. 423 | methodkey = VALUE #( clsname = class_name cpdname = build_object_name( REF #( node ) ) ). 424 | TRANSLATE methodkey TO UPPER CASE. 425 | 426 | CALL FUNCTION 'SEO_METHOD_GET_YOUNGEST' 427 | EXPORTING 428 | cpdkey = methodkey 429 | IMPORTING 430 | youngest = methodkey 431 | EXCEPTIONS 432 | not_existing = 1 433 | OTHERS = 2. 434 | IF ( sy-subrc = 0 ). 435 | origin_class_name = methodkey-clsname. 436 | ENDIF. 437 | ENDCASE. 438 | 439 | ENDMETHOD. 440 | 441 | 442 | 443 | METHOD update_original_class_name. 444 | DATA(escaped_class_name) = escape_string( class_name ). 445 | REPLACE FIRST OCCURRENCE OF REGEX '/sap/bc/adt/oo/classes/(.*)/source/' 446 | IN uri WITH |/sap/bc/adt/oo/classes/{ to_lower( escaped_class_name ) }/source/|. 447 | 448 | ENDMETHOD. 449 | 450 | METHOD build_object_name. 451 | CASE node->type+1(3). 452 | WHEN swbm_c_type_cls_local_type OR 453 | swbm_c_type_cls_local_intf OR 454 | swbm_c_type_cls_lintf_attr OR 455 | swbm_c_type_cls_lintf_event OR 456 | swbm_c_type_cls_lintf_type OR 457 | swbm_c_type_cls_lintf_intf . 458 | IF strlen( node->text9 ) GE 4 AND node->text9(4) EQ object_types-report_include. 459 | object_name = node->text1. 460 | ELSE. 461 | object_name = |{ node->text9+4(36) } { node->text1 }|. 462 | ENDIF. 463 | WHEN swbm_c_type_cls_mtd_impl." OR swbm_c_type_intf_type. 464 | IF node->text8 IS NOT INITIAL. 465 | object_name = node->text8. 466 | ELSE. 467 | object_name = node->text1. 468 | ENDIF. 469 | WHEN swbm_c_type_intf_attribute OR swbm_c_type_intf_type. 470 | IF node->text8 IS NOT INITIAL. 471 | SPLIT node->text8 AT '~' INTO DATA(object) object_name. "#EC NEEDED 472 | IF object_name IS INITIAL. 473 | IF strlen( node->text9 ) GE 4 AND node->text9(4) EQ object_types-interface. 474 | object_name = node->text9. 475 | SHIFT object_name BY 4 PLACES LEFT. 476 | ENDIF. 477 | ENDIF. 478 | ELSE. 479 | object_name = node->text1. 480 | ENDIF. 481 | WHEN OTHERS. 482 | object_name = node->text1 . 483 | ENDCASE. 484 | IF node->type EQ node_types-method_redefintion_class. 485 | object_name = node->text8. 486 | ENDIF. 487 | ENDMETHOD. 488 | 489 | 490 | METHOD build_enclosed_object. 491 | 492 | CASE node->type+1(3). 493 | WHEN swbm_c_type_cls_loc_meth_def OR 494 | swbm_c_type_cls_loc_meth_impl OR 495 | swbm_c_type_cls_local_attr OR 496 | swbm_c_type_cls_local_event OR 497 | swbm_c_type_cls_local_type2 OR 498 | swbm_c_type_cls_local_intf2 OR 499 | swbm_c_type_cls_lintf_attr OR 500 | swbm_c_type_cls_lintf_event OR 501 | swbm_c_type_cls_lintf_type OR 502 | swbm_c_type_cls_lintf_intf OR 503 | swbm_c_type_cls_lintf_meth. 504 | enclosed_object = node->text8. 505 | IF object_type EQ object_types-fg. 506 | enclosed_object(40) = get_fg_main_program_name( object_name ). 507 | ENDIF. 508 | update_node_for_750_classes( EXPORTING node = node 509 | CHANGING enclosed_object = enclosed_object ). 510 | WHEN swbm_c_type_intf_type OR 511 | swbm_c_type_intf_attribute. 512 | IF node->text8 IS NOT INITIAL. 513 | SPLIT node->text8 AT '~' INTO enclosed_object DATA(tmp_object_name). "#EC NEEDED 514 | ELSE. 515 | enclosed_object = object_name. 516 | ENDIF. 517 | WHEN swbm_c_type_cls_type. 518 | IF node->text8 IS NOT INITIAL. 519 | enclosed_object = node->text8. 520 | ELSE. 521 | enclosed_object = get_object_name( 522 | original_object_name = object_name 523 | original_object_type = object_type ). 524 | ENDIF. 525 | WHEN OTHERS. 526 | enclosed_object = get_object_name( 527 | original_object_name = object_name 528 | original_object_type = object_type ). 529 | ENDCASE. 530 | 531 | IF node->type EQ node_types-method_redefintion_class. 532 | enclosed_object = node->text1. 533 | ENDIF. 534 | 535 | ENDMETHOD. 536 | 537 | METHOD update_node_for_750_classes. 538 | 539 | IF node->text9 CP '*=*'. 540 | DATA: component_version TYPE saprelease . 541 | CALL FUNCTION 'DELIVERY_GET_COMPONENT_RELEASE' 542 | EXPORTING 543 | iv_compname = 'SAP_BASIS' 544 | IMPORTING 545 | ev_compvers = component_version 546 | EXCEPTIONS 547 | comp_not_found = 1 548 | OTHERS = 2. 549 | IF sy-subrc EQ 0 AND component_version >= 750. 550 | FIND FIRST OCCURRENCE OF '=' IN node->text9 MATCH OFFSET DATA(offset). 551 | IF sy-subrc EQ 0. 552 | ** node->text9 = node->text9(offset). 553 | offset = offset - 4. 554 | enclosed_object(40) = node->text9+4(offset). 555 | node->text8(40) = node->text9+4(offset). 556 | IF ( node->text9 CP '*=CCIMP' ) AND node->type+1(3) EQ swbm_c_type_cls_loc_meth_def. 557 | node->text9+4 = node->text9+4(offset). 558 | ENDIF. 559 | ENDIF. 560 | ENDIF. 561 | 562 | ENDIF. 563 | 564 | ENDMETHOD. 565 | 566 | 567 | 568 | METHOD get_fg_main_program_name. 569 | 570 | IF function_group(1) EQ '/'. 571 | DATA(regex) = NEW cl_abap_regex( pattern = '\/.*\/(.*)' ). 572 | DATA(matcher) = regex->create_matcher( text = function_group ). 573 | IF matcher->match( ). 574 | DATA(offset) = matcher->get_offset( index = 1 ). 575 | main_program(40) = |{ function_group+0(offset) }SAPL{ matcher->get_submatch( index = 1 ) }|. 576 | ENDIF. 577 | ELSE. 578 | main_program(40) = |SAPL{ function_group }|. 579 | ENDIF. 580 | 581 | ENDMETHOD. 582 | 583 | 584 | 585 | METHOD get_object_name. 586 | CASE original_object_type. 587 | WHEN object_types-fm. 588 | SELECT SINGLE pname FROM tfdir 589 | INTO object_name 590 | WHERE funcname = original_object_name. 591 | WHEN object_types-fg. 592 | object_name = get_fg_main_program_name( original_object_name ). 593 | WHEN object_types-fg_include. 594 | DATA string_name TYPE string. 595 | CALL FUNCTION 'Z_ADTCO_GET_INC_MASTER_PROGRAM' 596 | EXPORTING 597 | include = CONV string( original_object_name ) 598 | IMPORTING 599 | master = string_name. 600 | object_name = get_fg_main_program_name( CONV #( string_name ) ). 601 | WHEN object_types-report_include OR object_types-program_include. 602 | CALL FUNCTION 'Z_ADTCO_GET_INC_MASTER_PROGRAM' 603 | EXPORTING 604 | include = CONV string( original_object_name ) 605 | IMPORTING 606 | master = string_name. 607 | object_name = COND #( WHEN string_name IS NOT INITIAL THEN string_name 608 | ELSE original_object_name ). 609 | WHEN OTHERS. 610 | object_name = original_object_name. 611 | ENDCASE. 612 | ENDMETHOD. 613 | 614 | METHOD get_fg_name_from_object. 615 | CASE original_object_type. 616 | WHEN object_types-fg_include. 617 | object_name = original_object_name. 618 | IF object_name(1) EQ '/'. 619 | REPLACE FIRST OCCURRENCE OF REGEX '\/L' IN object_name WITH '/'. 620 | ELSE. 621 | SHIFT object_name BY 1 PLACES LEFT. 622 | ENDIF. 623 | DATA(lenght) = strlen( object_name ) - 3. 624 | object_name = object_name(lenght). 625 | WHEN object_types-fm. 626 | SELECT SINGLE pname FROM tfdir 627 | INTO object_name 628 | WHERE funcname = original_object_name. 629 | REPLACE FIRST OCCURRENCE OF 'SAPL' IN object_name WITH ''. 630 | ENDCASE. 631 | ENDMETHOD. 632 | 633 | 634 | 635 | METHOD get_uri_directly. 636 | 637 | CHECK node-text9(4) EQ prefix-reps OR 638 | node-text9(4) EQ prefix-type. 639 | 640 | 641 | original_object_name = update_object_name_for_fg( original_object_type = original_object_type 642 | original_object_name = original_object_name ). 643 | 644 | 645 | uri = SWITCH #( node-type WHEN node_types-lcl_interface_type OR 646 | node_types-lcl_interface_method_def OR 647 | node_types-lcl_interface_attribute OR 648 | node_types-lcl_interface_interface OR 649 | node_types-lcl_type OR 650 | node_types-lcl_interface 651 | THEN build_program_uri( node = node original_object_name = original_object_name ) 652 | WHEN node_types-lcl_method_definition OR 653 | node_types-lcl_method_implementation OR 654 | node_types-lcl_attribute 655 | THEN COND #( WHEN original_object_type CP prefix-fugr_pattern 656 | THEN build_fg_uri( node = node original_object_name = original_object_name ) 657 | ELSE build_program_uri( node = node original_object_name = original_object_name ) ) 658 | WHEN 'OPG' THEN |source/main#type=FUGR/PG;name={ node-text1 }| 659 | 660 | ELSE space ). 661 | 662 | IF uri IS NOT INITIAL. 663 | uri = add_uri_prefix( 664 | current_uri = uri 665 | original_object_type = original_object_type 666 | original_object_name = original_object_name ). 667 | ENDIF. 668 | ENDMETHOD. 669 | 670 | METHOD build_fg_uri. 671 | r_result = |{ context-includes }{ 672 | escape_string( node-text8(40) ) }{ context-fg }{ 673 | "escape_string( original_object_name ) }{ 674 | get_context_for_fg_node_type( node-type ) }{ build_internal_name( node ) }|. 675 | ENDMETHOD. 676 | 677 | METHOD build_program_uri. 678 | r_result = |{ get_program_or_include( node = node original_object_name = original_object_name ) 679 | }{ escape_string( node-text8(40) ) }{ 680 | get_context_for_node_type( node-type ) }{ build_internal_name( node ) }|. 681 | ENDMETHOD. 682 | 683 | METHOD add_uri_prefix. 684 | 685 | IF original_object_type CP prefix-fugr_pattern. 686 | uri = |{ prefix-adt_fg }{ escape_string( original_object_name ) }/{ current_uri }|. 687 | ELSE. 688 | uri = |{ prefix-adt_program }{ current_uri }|. 689 | ENDIF. 690 | 691 | ENDMETHOD. 692 | 693 | 694 | 695 | METHOD update_object_name_for_fg. 696 | 697 | IF original_object_type CP prefix-fugr_pattern. 698 | DATA(fg_name) = get_fg_name_from_object( 699 | original_object_name = original_object_name 700 | original_object_type = original_object_type 701 | ). 702 | IF fg_name IS NOT INITIAL. 703 | object_name = fg_name. 704 | ELSE. 705 | object_name = original_object_name. 706 | ENDIF. 707 | ELSE. 708 | object_name = original_object_name. 709 | ENDIF. 710 | 711 | ENDMETHOD. 712 | 713 | 714 | 715 | METHOD build_internal_name. 716 | internal_name = escape( val = |{ node-text8+40(30) WIDTH = 30 }{ node-text1 }| format = cl_abap_format=>e_uri ). 717 | ENDMETHOD. 718 | 719 | 720 | METHOD get_program_or_include. 721 | DATA: program_name TYPE trdir-name, 722 | program_type TYPE trdir-subc. 723 | program_name = node-text8. 724 | SELECT SINGLE subc INTO @program_type FROM trdir WHERE name EQ @program_name. 725 | IF program_type EQ 'I'. 726 | type = context-includes. 727 | ELSE. 728 | type = context-programs. 729 | ENDIF. 730 | ENDMETHOD. 731 | 732 | 733 | METHOD get_context_for_node_type. 734 | node_context = SWITCH #( node_type WHEN node_types-lcl_interface_type THEN context-program_lcl_interface_types 735 | WHEN node_types-lcl_interface_method_def THEN context-program_lcl_interface_method 736 | WHEN node_types-lcl_interface_attribute THEN context-program_lcl_interface_attrib 737 | WHEN node_types-lcl_interface_interface THEN context-program_lcl_interface_interf 738 | WHEN node_types-lcl_type THEN context-program_lcl_type 739 | WHEN node_types-lcl_interface THEN context-program_lcl_interface 740 | WHEN node_types-lcl_attribute THEN context-program_lcl_attribute 741 | WHEN node_types-lcl_method_implementation THEN context-program_lcl_method ). 742 | ENDMETHOD. 743 | 744 | 745 | METHOD get_context_for_fg_node_type. 746 | node_context = SWITCH #( node_type WHEN node_types-lcl_attribute THEN context-fg_lcl_attribute 747 | WHEN node_types-lcl_method_implementation THEN context-fg_lcl_method 748 | WHEN node_types-lcl_method_definition THEN context-fg_lcl_method ). 749 | ENDMETHOD. 750 | 751 | METHOD escape_string. 752 | IF do_escaping EQ abap_false. 753 | escaped_string = input. 754 | ENDIF. 755 | escaped_string = cl_http_utility=>if_http_utility~escape_url( CONV #( input ) ). 756 | ENDMETHOD. 757 | 758 | ENDCLASS. 759 | 760 | -------------------------------------------------------------------------------- /src/zcl_adtco_uri_mapper.clas.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | ZCL_ADTCO_URI_MAPPER 7 | E 8 | URI Mapper for class elements 9 | 1 10 | X 11 | X 12 | X 13 | 14 | 15 | 16 | 17 | --------------------------------------------------------------------------------