DBA Data[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;