[Home] [Help]
PACKAGE BODY: APPS.XNP_XML_UTILS
Source
1 PACKAGE BODY XNP_XML_UTILS AS
2 /* $Header: XNPXMLPB.pls 120.3 2006/10/11 14:33:01 dputhiye ship $ */
3
4 /*11 OCT 2006 DPUTHIYE BUG #:5591258
5 Description: R12 Performance fix. Replacing all calls to fnd_global.local_chr in fn CONVERT()
6 These will be initialized in the package init block.
7 */
8 g_local_chr_38 VARCHAR2(10);
9 g_local_chr_127 VARCHAR2(10);
10
11 TYPE g_local_chr_table IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
12 g_local_chrs_0_to_31 g_local_chr_table; -- characters 0-31.
13
14 /***************************************************************************
15 ***** Procedure: DECODE()
16 ***** Purpose: Provides a simple tag-value lookup
17 ****************************************************************************/
18
19 PROCEDURE decode(
20 p_msg_text IN VARCHAR2
21 ,p_tag IN VARCHAR2
22 ,x_value OUT NOCOPY VARCHAR2
23 )
24 IS
25
26 tag_pos INTEGER := 0 ;
27 token VARCHAR2(1024) := '' ;
28 token_delimeter VARCHAR2(1024) := '' ;
29 tag_delimeter_pos INTEGER := 0 ;
30
31 BEGIN
32
33 token := '<' || p_tag || '>' ;
34 token_delimeter := '</' || p_tag || '>' ;
35 tag_pos := INSTR( p_msg_text, token, 1 ) ;
36
37 IF (tag_pos = 0)
38 THEN
39 x_value := NULL ;
40 RETURN ;
41 END IF ;
42
43 tag_delimeter_pos := INSTR( p_msg_text, token_delimeter, 1 ) ;
44
45 IF (tag_delimeter_pos = 0)
46 THEN
47 x_value := NULL ;
48 RETURN ;
49 END IF ;
50
51 x_value := SUBSTR(p_msg_text, tag_pos + LENGTH(token),
52 tag_delimeter_pos - (tag_pos + LENGTH(token))) ;
53
54 END decode;
55
56 /***************************************************************************
57 ***** Procedure: INITIALIZE_DOC()
58 ***** Purpose: Initializes the global XML document variable.
59 ****************************************************************************/
60
61 PROCEDURE initialize_doc (
62 p_msg_code IN VARCHAR2,
63 p_dtd_url IN VARCHAR2
64 )
65 IS
66 l_list_count NUMBER := 0;
67
68 BEGIN
69
70 xdp_utilities.g_message_list.DELETE;
71 xml_decl ;
72
73 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
74 xdp_utilities.g_message_list(l_list_count) := '<!DOCTYPE ' || p_msg_code || ' SYSTEM '|| '"' || p_dtd_url || '">';
75
76 END initialize_doc;
77
78 /***************************************************************************
79 ***** Procedure: INITIALIZE_DOC()
80 ***** Purpose: Initializes the global XML document variable.
81 ****************************************************************************/
82
83 PROCEDURE initialize_doc
84 IS
85 BEGIN
86
87 xdp_utilities.g_message_list.DELETE;
88
89 END initialize_doc;
90
91 /***************************************************************************
92 ***** Procedure: XML_DECL()
93 ***** Purpose: writes XML declaration to the document
94 ****************************************************************************/
95
96 PROCEDURE xml_decl
97 IS
98 l_list_count NUMBER := 0;
99
100 BEGIN
101
102 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
103 xdp_utilities.g_message_list(l_list_count) := '<?xml version="1.0"?>' ;
104
105 END xml_decl;
106
107 /***************************************************************************
108 ***** Procedure: GET_DOCUMENT()
109 ***** Purpose: Retrieves the constructed XML document.
110 ****************************************************************************/
111
112 PROCEDURE get_document(
113 p_xml_doc OUT NOCOPY VARCHAR2
114 )
115 IS
116 l_xml_doc VARCHAR2(32767) := null ;
117 l_msg_len NUMBER := 0;
118 l_doc_len NUMBER := 0;
119
120 BEGIN
121 FOR i in 1..xdp_utilities.g_message_list.COUNT
122 LOOP
123 l_msg_len := LENGTH(xdp_utilities.g_message_list(i));
124 l_doc_len := LENGTH(l_xml_doc);
125
126 IF (NVL(l_doc_len,0) + NVL(l_msg_len,0)) < 32767 THEN
127 l_xml_doc := l_xml_doc||xdp_utilities.g_message_list(i);
128 ELSE
129 l_xml_doc := l_xml_doc||substr(xdp_utilities.g_message_list(i),1,(32767 - l_doc_len));
130 END IF ;
131
132 END LOOP;
133
134 p_xml_doc := l_xml_doc ;
135
136 END get_document;
137
138 /***************************************************************************
139 ***** Procedure: WRITE_ELEMENT()
140 ***** Purpose: Writes a character element to an XML document.
141 ****************************************************************************/
142
143 PROCEDURE write_element(
144 p_tag IN VARCHAR2
145 ,x_value IN VARCHAR2
146 )
147 IS
148 l_list_count NUMBER := 0;
149 l_value VARCHAR2(32767);
150
151 BEGIN
152
153 IF ((x_value IS NULL) AND (g_remove_empty_nodes = 'Y'))THEN
154 null;
155 ELSE
156 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
157 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>'|| x_value|| '</' || p_tag || '>' ;
158 END IF ;
159
160 END write_element;
161
162 /***************************************************************************
163 ***** Procedure: WRITE_ELEMENT()
164 ***** Purpose: Writes a date element to an XML document.
165 ****************************************************************************/
166
167 PROCEDURE write_element(
168 P_TAG IN VARCHAR2
169 ,X_VALUE IN DATE
170 )
171 IS
172 l_list_count NUMBER := 0;
173
174 BEGIN
175
176 IF ((x_value IS NULL) AND (g_remove_empty_nodes = 'Y') ) THEN
177 null;
178 ELSE
179 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
180 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>'|| XNP_UTILS.DATE_TO_CANONICAL(x_value ) || '</' || p_tag || '>' ;
181 END IF ;
182
183 END write_element;
184
185 /***************************************************************************
186 ***** Procedure: WRITE_ELEMENT()
187 ***** Purpose: writes a numeric element tot an XML document.
188 ****************************************************************************/
189
190 PROCEDURE write_element(
191 p_tag IN VARCHAR2
192 ,x_value IN NUMBER
193 )
194 IS
195 l_list_count NUMBER := 0;
196
197 BEGIN
198
199 IF ((x_value IS NULL) AND (g_remove_empty_nodes = 'Y') ) THEN
200 null;
201 ELSE
202 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
203 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>'|| TO_CHAR ( x_value )|| '</' || p_tag || '>' ;
204 END IF ;
205
206 END write_element;
207
208
209 /***************************************************************************
210 ***** Procedure: WRITE_LEAF_ELEMENT()
211 ***** Purpose: Writes a character LEAF element to an XML document.
212 ****************************************************************************/
213
214 PROCEDURE write_leaf_element(
215 p_tag IN VARCHAR2
216 ,x_value IN VARCHAR2
217 )
218 IS
219 l_list_count NUMBER := 0;
220 l_value VARCHAR2(32767);
221
222 BEGIN
223
224 IF ((x_value IS NULL) AND (g_remove_empty_nodes = 'Y'))THEN
225 null;
226 ELSE
227 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
228 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>' || convert(x_value) || '</' || p_tag || '>' ;
229 END IF ;
230
231 END write_leaf_element;
232
233 /***************************************************************************
234 ***** Procedure: WRITE_LEAF_ELEMENT()
235 ***** Purpose: Writes a date element to an XML document.
236 ****************************************************************************/
237
238 PROCEDURE write_leaf_element(
239 P_TAG IN VARCHAR2
240 ,X_VALUE IN DATE
241 )
242 IS
243 l_list_count NUMBER := 0;
244
245 BEGIN
246
247 IF ((x_value IS NULL) AND (g_remove_empty_nodes = 'Y') ) THEN
248 null;
249 ELSE
250 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
251 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>'|| XNP_UTILS.DATE_TO_CANONICAL(x_value ) || '</' || p_tag || '>' ;
252 END IF ;
253
254 END write_leaf_element;
255
256 /***************************************************************************
257 ***** Procedure: WRITE_LEAF_ELEMENT()
258 ***** Purpose: writes a numeric element tot an XML document.
259 ****************************************************************************/
260
261 PROCEDURE write_leaf_element(
262 p_tag IN VARCHAR2
263 ,x_value IN NUMBER
264 )
265 IS
266 l_list_count NUMBER := 0;
267
268 BEGIN
269
270 IF ((x_value IS NULL) AND (g_remove_empty_nodes = 'Y') ) THEN
271 null;
272 ELSE
273 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
274 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>'|| TO_CHAR ( x_value )|| '</' || p_tag || '>' ;
275 END IF ;
276
277 END write_leaf_element;
278
279 /***************************************************************************
280 ***** Procedure: END_SEGMENT()
281 ***** Purpose: Adds an end tag to the element being specified.
282 ****************************************************************************/
283
284 PROCEDURE end_segment(
285 P_TAG IN VARCHAR2
286 )
287 IS
288 l_list_count NUMBER := 0;
289 l_tag VARCHAR2(4000);
290
291 BEGIN
292 l_tag := '<'||p_tag||'>' ;
293 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
294
295 IF xdp_utilities.g_message_list(l_list_count - 1 ) = l_tag THEN
296 xdp_utilities.g_message_list.DELETE(l_list_count - 1 ) ;
297 ELSE
298 xdp_utilities.g_message_list(l_list_count) := '</' || p_tag || '>' ;
299 END IF ;
300
301 END end_segment;
302
303 /***************************************************************************
304 ***** Procedure: BEGIN_SEGMENT()
305 ***** Purpose: Adds a start tag for the XML element being constructed.
306 ****************************************************************************/
307
308 PROCEDURE begin_segment(
309 P_TAG IN VARCHAR2
310 )
311 IS
312 l_list_count NUMBER := 0;
313
314 BEGIN
315 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
316 xdp_utilities.g_message_list(l_list_count) := '<' || p_tag || '>' ;
317
318 END begin_segment;
319
320 /***************************************************************************
321 ***** Procedure: APPEND()
322 ***** Purpose: Appends the doc to existing doc.
323 ****************************************************************************/
324
325 PROCEDURE append(
326 p_xml_doc IN VARCHAR2
327 )
328 IS
329 l_list_count NUMBER := 0;
330 l_xml_doc VARCHAR2(32767);
331
332 BEGIN
333
334 l_xml_doc := p_xml_doc ;
335 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
336 xdp_utilities.g_message_list(l_list_count) := l_xml_doc ;
337
338 END append ;
339
340 /***************************************************************************
341 ***** Procedure: APPEND()
342 ***** Purpose: Appends the doc to existing doc.
343 ****************************************************************************/
344
345 PROCEDURE append (
346 p_xml_doc IN NUMBER
347 )
348 IS
349 l_list_count NUMBER := 0;
350
351 BEGIN
352 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
353 xdp_utilities.g_message_list(l_list_count) := TO_CHAR(p_xml_doc);
354
355 END APPEND ;
356
357 /***************************************************************************
358 ***** Procedure: APPEND()
359 ***** Purpose: Appends the doc to existing doc.
360 ****************************************************************************/
361
362 PROCEDURE APPEND(
363 p_xml_doc IN DATE
364 )
365 IS
366 l_list_count NUMBER := 0;
367
368 BEGIN
369 l_list_count := (xdp_utilities.g_message_list.COUNT + 1);
370 xdp_utilities.g_message_list(l_list_count) := XNP_UTILS.DATE_TO_CANONICAL( p_xml_doc) ;
371
372 END append ;
373
374 /***************************************************************************
375 ***** Procedure: CONVERT()
376 ***** Purpose: Converts a character string to xml CDATA
377 ****************************************************************************/
378
379
380 FUNCTION CONVERT ( p_value IN VARCHAR2) RETURN VARCHAR2 IS
381
382 l_value VARCHAR2(32767);
383 l_int NUMBER := 0;
384
385 BEGIN
386 --11 OCT 2006 DPUTHIYE BUG #:5591258
387 --Description: R12 Performance fix. Replacing all calls to fnd_global.local_chr in this function
388 --by pre-initiated package constants. These constants are initialized in the package init block.
389
390 l_value := p_value;
391
392 --20 Jun 2005 DPUTHIYE R12 GSCC mandate: File.Sql.10 - Do not use CHR(), instead use fnd_global.local_chr()
393 /* l_value := replace(l_value,'&',chr(38)||'amp;');
394 l_value := replace(l_value,'<',chr(38)||'lt;');
395 l_value := replace(l_value,'>',chr(38)||'gt;');
396 l_value := replace(l_value,'''',chr(38)||'#39;');
397 l_value := replace(l_value,'"',chr(38)||'#34;');
398 --11 OCT 2006 DPUTHIYE BUG #:5591258
399 l_value := replace(l_value,'&',fnd_global.local_chr(38)||'amp;');
400 l_value := replace(l_value,'<',fnd_global.local_chr(38)||'lt;');
401 l_value := replace(l_value,'>',fnd_global.local_chr(38)||'gt;');
402 l_value := replace(l_value,'''',fnd_global.local_chr(38)||'#39;');
403 l_value := replace(l_value,'"',fnd_global.local_chr(38)||'#34;');
404 */
405
406 l_value := replace(l_value,'&', g_local_chr_38 ||'amp;');
407 l_value := replace(l_value,'<', g_local_chr_38 ||'lt;');
408 l_value := replace(l_value,'>', g_local_chr_38 ||'gt;');
409 l_value := replace(l_value,'''', g_local_chr_38 ||'#39;');
410 l_value := replace(l_value,'"', g_local_chr_38 ||'#34;');
411
412 WHILE(TRUE) LOOP
413 --20 Jun 2005 DPUTHIYE R12 GSCC mandate: File.Sql.10 - Do not use CHR(), instead use fnd_global.local_chr()
414 --l_value := replace(l_value,chr(l_int),''||l_int||';');
415 --11 OCT 2006 DPUTHIYE BUG #:5591258
416 --l_value := replace(l_value,fnd_global.local_chr(l_int),''||l_int||';');
417
418 l_value := replace(l_value, g_local_chrs_0_to_31(l_int),''||l_int||';');
419 l_int := l_int + 1;
420
421 IF l_int = 32 THEN
422 exit;
423 END IF;
424
425 END LOOP;
426
427 --20 Jun 2005 DPUTHIYE R12 GSCC mandate: File.Sql.10 - Do not use CHR(), instead use fnd_global.local_chr()
428 --l_value := replace(l_value,chr(127),''||127||';');
429 --11 OCT 2006 DPUTHIYE BUG #:5591258
430 --l_value := replace(l_value,fnd_global.local_chr(127),''||127||';');
431
432 l_value := replace(l_value, g_local_chr_127, ''||127||';');
433
434 RETURN l_value;
435 END CONVERT;
436
437 -------------------------------
438 -- Package initialization code
439 ------------------------------
440 --11 OCT 2006 DPUTHIYE BUG #:5591258
441 --Description: R12 Performance fix. Replacing all calls to fnd_global.local_chr in fn CONVERT
442 --by pre-initiated package constants. These constants are initialized in this block.
443 BEGIN
444
445 DECLARE
446 l_ack_reqd_flag VARCHAR2(2) := NULL;
447 l_remove_empty_nodes VARCHAR2(1) := NULL ;
448 l_int NUMBER := 0;
449 BEGIN
450
451 FND_PROFILE.GET(NAME=> 'XNP_REMOVE_EMPTY_NODES',
452 VAL => l_remove_empty_nodes );
453
454 IF l_remove_empty_nodes IS NOT NULL THEN
455 g_remove_empty_nodes := l_remove_empty_nodes ;
456 END IF;
457
458 --11 OCT 2006 DPUTHIYE BUG #:5591258
459 --Initiailize the local characters used in Convert()
460
461 g_local_chr_38 := fnd_global.local_chr(38);
462 g_local_chr_127 := fnd_global.local_chr(127);
463
464 FOR l_int IN 0..31 LOOP
465 g_local_chrs_0_to_31(l_int) := fnd_global.local_chr(l_int);
466 END LOOP;
467
468 END ;
469 END xnp_xml_utils;