├── .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 | 
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 |
--------------------------------------------------------------------------------