[Home] [Help]
PACKAGE BODY: APPS.IBC_CONTENT_CTX_PKG
Source
1 package body ibc_content_ctx_pkg as
2 /* $Header: ibcintxb.pls 120.4 2005/10/11 12:45:17 srrangar noship $ */
3 -- *********************************
4 -- Private Procedure Declarations
5 -- *********************************
6
7 PROCEDURE Synthesize_Content_Attachments
8 ( p_file_id IN NUMBER,
9 p_clob IN OUT NOCOPY CLOB);
10
11
12 PROCEDURE Synthesize_Attribute_Bundles
13 ( p_attribute_bundle_id IN NUMBER,
14 p_clob IN OUT NOCOPY CLOB);
15
16
17 PROCEDURE Synthesize_Content_Renditions
18 ( p_citem_version_id IN NUMBER,
19 p_clob IN OUT NOCOPY CLOB);
20
21
22 PROCEDURE Synthesize_Content_Keywords
23 ( p_citem_version_id IN NUMBER,
24 p_clob IN OUT NOCOPY CLOB);
25
26
27 -- PROCEDURE Synthesize_Content_metadata
28 -- ( p_solution_id IN NUMBER,
29 -- p_clob IN OUT NOCOPY CLOB);
30
31 l_newline CONSTANT VARCHAR2(4) := fnd_global.newline;
32
33 FUNCTION isValidForFilter(p_file_content_type IN VARCHAR2)
34 RETURN BOOLEAN IS
35 BEGIN
36
37 IF instr(UPPER(p_file_content_type),'IMAGE')=1 THEN
38 RETURN FALSE;
39 ELSIF instr(UPPER(p_file_content_type),'VIDEO')=1 THEN
40 RETURN FALSE;
41
42 ELSE
43 RETURN TRUE;
44 END IF;
45
46 END isValidForFilter;
47
48 -- ********************************
49 -- Public Procedure Implementations
50 -- ********************************
51
52
53
54
55 Procedure Build_Content_Document
56 (p_rowid IN ROWID, p_clob IN OUT NOCOPY CLOB)
57 is
58
59 l_citem_version_id NUMBER;
60 l_language VARCHAR2(30);
61 l_content_item_name VARCHAR2(240);
62 l_description VARCHAR2(240);
63 l_attachment_file_name VARCHAR2(240);
64 l_attachment_file_id NUMBER;
65 l_attribute_bundle_id NUMBER;
66 l_data VARCHAR2(32000);
67 l_amt INTEGER;
68 CURSOR cur_name_desc(p_rowid ROWID) IS
69 SELECT
70 ctl.citem_version_id,
71 language,
72 content_item_name,
73 description,
74 attachment_file_name,
75 attachment_file_id,
76 attribute_file_id
77 FROM IBC_CITEM_VERSIONS_TL ctl
78 where ctl.ROWID=p_rowid;
79
80 BEGIN
81
82 -- Clear out the output CLOB buffer
83 dbms_lob.trim(p_clob, 0);
84
85 Open cur_name_desc(p_rowid);
86 Fetch cur_name_desc Into l_citem_version_id,
87 l_language,
88 l_content_item_name,
89 l_description,
90 l_attachment_file_name,
91 l_attachment_file_id,
92 l_attribute_bundle_id;
93 Close cur_name_desc;
94
95 -- Add sections
96 -- 1. Add NAME
97 l_data := '<CONTENT_NAME>'||l_newline|| l_content_item_name||l_newline||'</CONTENT_NAME>';
98
99 -- 2. Add LANG
100 l_data := l_data||l_newline||'<LANG>a'||l_language||'a</LANG>';
101
102 -- 3. Add DESCRIPTION
103 l_data := l_data||l_newline||'<CONTENT_DESCRIPTION>'||l_description||'</CONTENT_DESCRIPTION>';
104
105 -- 3. Add Attachment filename
106 l_data := l_data||l_newline||'<ATTACHMENT_FILENAME>'||l_attachment_file_name||'</ATTACHMENT_FILENAME>';
107
108 l_amt := length(l_data);
109
110 dbms_lob.writeappend(p_clob, l_amt, l_data);
111
112 Synthesize_Content_Attachments(l_attachment_file_id, p_clob);
113 Synthesize_Attribute_Bundles(l_attribute_bundle_id,p_clob);
114 Synthesize_Content_Keywords(l_citem_version_id,p_clob);
115 Synthesize_Content_Renditions(l_citem_version_id,p_clob);
116
117 END Build_Content_Document;
118
119 -- *********************************
120 -- Private Procedure Implementations
121 -- *********************************
122
123 PROCEDURE Synthesize_Content_Attachments
124 ( p_file_id IN NUMBER,
125 p_clob IN OUT NOCOPY CLOB) IS
126
127 CURSOR cur_attachment_file_data(p_file_id IN NUMBER) IS
128 SELECT
129 file_data attachment_file_data,
130 file_content_type
131 FROM
132 fnd_lobs flob
133 WHERE
134 flob.file_id = p_file_id;
135
136 restab CTX_DOC.highlight_tab;
137 l_file_data BLOB;
138 l_data VARCHAR2(32000);
139 l_amt INTEGER;
140 l_document CLOB;
141 l_file_content_type VARCHAR2(256);
142 BEGIN
143
144
145 Open cur_attachment_file_data(p_file_id);
146 Fetch cur_attachment_file_data Into l_file_data,l_file_content_type;
147 Close cur_attachment_file_data;
148
149 IF (l_file_data is NOT NULL) AND (isValidForFilter(l_file_content_type)) THEN
150
151 l_data := l_data || l_newline||'<CONTENT_ATTACHMENT>';
152 l_amt := LENGTH(l_data);
153 dbms_lob.writeappend(p_clob, l_amt, l_data);
154
155 -- Binary files get filtered as text file
156 -- msword,pdf etc is converted to text format
157 ctx_doc.policy_filter(policy_name =>'IBC_Binary2Text_Filter'
158 ,document =>l_file_data -- Binary in from FND_LOBS
159 ,restab =>l_document -- Text out from Filter
160 ,plaintext =>TRUE);
161
162 p_clob := p_clob || l_document;
163
164 l_data := '</CONTENT_ATTACHMENT>';
165 l_amt := LENGTH(l_data);
166 dbms_lob.writeappend(p_clob, l_amt, l_data);
167
168 END IF;
169
170 END Synthesize_Content_Attachments;
171
172
173 PROCEDURE Synthesize_Attribute_Bundles
174 ( p_attribute_bundle_id IN NUMBER,
175 p_clob IN OUT NOCOPY CLOB) IS
176
177 CURSOR cur_attribute_bundle(p_attribute_bundle_id IN NUMBER) IS
178 SELECT
179 attribute_bundle_data
180 FROM
181 IBC_ATTRIBUTE_BUNDLES att
182 WHERE
183 att.attribute_bundle_id = p_attribute_bundle_id;
184
185 l_attribute_data CLOB;
186 l_data VARCHAR2(32000);
187 l_amt INTEGER;
188 l_clean_xml_doc CLOB;
189 l_clean_html_doc CLOB;
190
191 BEGIN
192
193 Open cur_attribute_bundle(p_attribute_bundle_id);
194 Fetch cur_attribute_bundle Into l_attribute_data;
195 Close cur_attribute_bundle;
196
197 IF l_attribute_data is NOT NULL THEN
198
199 l_data := l_data || l_newline||'<CONTENT_ATTRIBUTE_BUNDLE>';
200 l_amt := LENGTH(l_data);
201 dbms_lob.writeappend(p_clob, l_amt, l_data);
202
203 ctx_doc.policy_filter(policy_name =>'IBC_XML_Policy'
204 ,document =>l_attribute_data --l_file_data varvhar2,clob,blob
205 ,restab =>l_clean_xml_doc
206 ,plaintext =>TRUE);
207
208 l_clean_xml_doc := '<html>' || l_clean_xml_doc;
209
210 ctx_doc.policy_filter(policy_name =>'IBC_HTML_Policy'
211 ,document =>l_clean_xml_doc --l_file_data varvhar2,clob,blob
212 ,restab =>l_clean_html_doc
213 ,plaintext =>TRUE);
214
215 p_clob := p_clob || l_clean_html_doc;
216
217 l_data := l_newline|| '</CONTENT_ATTRIBUTE_BUNDLE>';
218 l_amt := LENGTH(l_data);
219 dbms_lob.writeappend(p_clob, l_amt, l_data);
220
221 END IF;
222
223 END Synthesize_Attribute_Bundles;
224
225 PROCEDURE Synthesize_Content_Keywords
226 ( p_citem_version_id IN NUMBER,
227 p_clob IN OUT NOCOPY CLOB) IS
228
229 CURSOR cur_content_keywords(p_citem_version_id IN NUMBER) IS
230 SELECT
231 keyword
232 FROM
233 IBC_CITEM_VERSIONS_B cb,
234 IBC_CITEM_KEYWORDS k
235 WHERE
236 cb.citem_version_id = p_citem_version_id
237 AND k.content_item_id = cb.content_item_id;
238
239 l_data VARCHAR2(32000);
240 l_amt INTEGER;
241
242 BEGIN
243
244 FOR cur_content_keywords_rec IN cur_content_keywords(p_citem_version_id)
245 LOOP
246 l_data := l_data || l_newline || cur_content_keywords_rec.keyword;
247 l_amt := LENGTH(l_data);
248 IF l_amt >= 31000 THEN
249 -- flush l_data to the p_clob
250 dbms_lob.writeappend(p_clob, l_amt, l_data);
251 l_data := l_newline;
252 END IF;
253 END LOOP;
254
255 IF l_data is NOT NULL THEN
256 l_data := l_newline||'<CONTENT_KEYWORDS>'|| l_data || '</CONTENT_KEYWORDS>';
257 dbms_lob.writeappend(p_clob, LENGTH(l_data), l_data);
258 END IF;
259
260 END Synthesize_Content_Keywords;
261
262 PROCEDURE Synthesize_Content_Renditions
263 ( p_citem_version_id IN NUMBER,
264 p_clob IN OUT NOCOPY CLOB) IS
265
266 CURSOR cur_rend_data(p_citem_version_id IN NUMBER) IS
267 SELECT
268 ren.citem_version_id,
269 flob.file_data rendition_file_data,
270 flob.file_name rendition_file_name,
271 flob.file_content_type file_content_type
272 FROM
273 IBC_RENDiTIONS ren,
274 fnd_lobs flob
275 WHERE
276 ren.citem_version_id = p_citem_version_id
277 AND ren.file_id = flob.file_id
278 AND ren.LANGUAGE = USERENV('LANG');
279
280 l_data VARCHAR2(32000);
281 l_amt INTEGER;
282 l_rendition_file_name VARCHAR2(32000);
283 l_document CLOB;
284
285 BEGIN
286
287 l_rendition_file_name := NULL;
288
289 l_data := l_data || l_newline||'<CONTENT_RENDITION>';
290 l_amt := LENGTH(l_data);
291 dbms_lob.writeappend(p_clob, l_amt, l_data);
292
293 FOR cur_rend_data_rec IN cur_rend_data(p_citem_version_id)
294 LOOP
295
296 IF (cur_rend_data_rec.rendition_file_data is NOT NULL) AND (isValidForFilter(cur_rend_data_rec.file_content_type)) THEN
297
298 -- Binary files get filtered as text file
299 -- msword,pdf etc is converted to text format
300 ctx_doc.policy_filter(policy_name =>'IBC_Binary2Text_Filter'
301 ,document =>cur_rend_data_rec.rendition_file_data -- Binary in from FND_LOBS
302 ,restab =>l_document -- Text out from Filter
303 ,plaintext =>TRUE);
304
305 p_clob := p_clob || l_document;
306
307 END IF;
308
309 l_rendition_file_name := l_rendition_file_name || l_newline || cur_rend_data_rec.rendition_file_name;
310 l_amt := LENGTH(l_rendition_file_name);
311 IF l_amt >= 31000 THEN
312 -- flush l_rendition_file_name to the p_clob
313 dbms_lob.writeappend(p_clob, l_amt, l_rendition_file_name);
314 l_rendition_file_name := l_newline;
315 END IF;
316 END LOOP;
317
318 IF p_clob IS NOT NULL THEN
319 l_data := '</CONTENT_RENDITION>' || l_newline;
320 l_amt := LENGTH(l_data);
321 dbms_lob.writeappend(p_clob, l_amt, l_data);
322 END IF;
323
324 If l_rendition_file_name IS NOT NULL THEN
325 l_rendition_file_name := '<RENDITION_FILE_NAME>' || l_newline||l_rendition_file_name ||'</RENDITION_FILE_NAME>';
326 dbms_lob.writeappend(p_clob, LENGTH(l_rendition_file_name), l_rendition_file_name);
327 END IF;
328
329 END Synthesize_Content_Renditions;
330
331 end ibc_content_ctx_pkg;