1 PACKAGE BODY IES_META_DATA_PKG AS
2 /* $Header: iesmdpkb.pls 120.2 2006/05/30 22:08:43 prkotha noship $ */
3
4 -- Private methods
5
6 -- **********************************************************************
7 -- API name : metaRelationshipExists
8 -- Type : Private
9 -- Function : This function returns True if the relationship
10 -- exists for a given primary_obj_id, secondary_obj_id
11 -- and type_id
12 -- **********************************************************************
13
14 FUNCTION metaRelationshipExists(primObjId IN NUMBER,
15 secObjId IN NUMBER,
16 typeId IN NUMBER)
17 RETURN Boolean IS
18 TYPE rel_type IS REF CURSOR;
19 rel rel_type;
20
21 object_Id NUMBER := -1;
22 BEGIN
23 OPEN rel FOR
24 'SELECT a.primary_obj_id
25 FROM ies_meta_obj_relationships a
26 WHERE a.primary_obj_id = :primObjId
27 AND a.secondary_obj_id = :secObjId
28 AND a.type_id = :typeId' using primObjId, secObjId, typeId;
29
30 FETCH rel INTO object_id;
31 CLOSE rel;
32
33 return (object_id <> -1);
34 END metaRelationshipExists;
35
36
37 -- **********************************************************************
38 -- API name : existsObject
39 -- Type : Private
40 -- Function : This function returns true if the object exists with the
41 -- UID passed in as argument
42 -- **********************************************************************
43
44 FUNCTION existsObject(uid VARCHAR2) RETURN BOOLEAN IS
45 type objs_type IS REF CURSOR;
46 obj objs_type;
47
48 objId number := -1;
49 BEGIN
50 OPEN obj FOR
51 'SELECT object_id
52 FROM ies_meta_objects
53 WHERE object_uid = :x_uid' using uid;
54
55 FETCH obj INTO objId;
56 CLOSE obj;
57
58 return (objId <> -1);
59 END existsObject;
60
61 -- **********************************************************************
62 -- API name : objectExistsInLibrary
63 -- Type : Private
64 -- Function : This function returns true if the object exists in
65 -- the IES_META_LIBRARY table
66 -- **********************************************************************
67
68 FUNCTION objectExistsInLibrary(objectId NUMBER) RETURN BOOLEAN IS
69 type objs_type IS REF CURSOR;
70 obj objs_type;
71
72 objId number := -1;
73 BEGIN
74 OPEN obj FOR
75 'SELECT 1
76 FROM ies_meta_library
77 WHERE object_id = :x_id' using objectId;
78
79 FETCH obj INTO objId;
80 CLOSE obj;
81
82 return (objId <> -1);
83 END objectExistsInLibrary;
84
85 -- **********************************************************************
86 -- API name : writeLibraryRecord
87 -- Type : Private
88 -- Function : This procedure inserts a record in IES_META_LIBRARY
89 -- table
90 -- **********************************************************************
91
92 PROCEDURE writeLibraryRecord(objectId NUMBER) IS
93 insertStmt varchar2(2000);
94 seqval number;
95 BEGIN
96 if NOT (objectExistsInLibrary(objectId)) then /* If object does not exist in library */
97 execute immediate 'SELECT ies_meta_library_s.nextval from dual' into seqval;
98 insertStmt := 'INSERT INTO ies_meta_library(libobj_id,
99 object_id,
100 created_by)
101 VALUES (:seq,
102 :x_objId,
103 1)';
104 EXECUTE IMMEDIATE insertStmt using seqval, objectId;
105 end if;
106 END writeLibraryRecord;
107
108
109 -- **********************************************************************
110 -- API name : getChildEntities
111 -- Type : Private
112 -- Function : This function navigates the XML Tree and gets all the
113 -- children for a given element
114 -- **********************************************************************
115
116 FUNCTION getChildEntities(e IN xmldom.DOMElement) return childEntities_table IS
117 childEntities_tab childEntities_table; /* childEntities_table is table of xmldom.DOMNode */
118 nl xmldom.DOMNodeList;
119 len number;
120 n xmldom.DOMNode;
121 counter number := 0; /* represents index in table */
122 dummyNode xmldom.DOMNode;
123 dummyElem xmldom.DOMElement;
124 s varchar2(256);
125 BEGIN
126 if NOT (xmldom.isnull(e)) then /* Navigate tree only if element IS NOT NULL */
127 nl := xmldom.getChildNodes(xmldom.makeNode(e));
128 len := xmldom.getLength(nl);
129
130 for i in 0..len-1 loop /* For all child nodes of root element */
131 n := xmldom.item(nl, i);
132
133 dummyElem := xmldom.makeElement(n);
134
135 if (xmldom.getTagName(dummyElem) = 'Properties') then /* Still in root's properties */
136 childEntities_tab := getChildEntities(dummyElem);
137 end if;
138
139 if (xmldom.getTagName(dummyElem) = 'CCTPropertyList') then /* Child named CCTPropertyList */
140 childEntities_tab(counter) := xmldom.getFirstChild(n); /* Node starting with <Property .. */
141 counter := counter + 1;
142 elsif (xmldom.getTagName(dummyElem) = 'CCTPropertyMapList') then /* Child named CCTPropertyMapList */
143 childEntities_tab(counter) := xmldom.getFirstChild(n); /* Node starting with <Property .. */
144 counter := counter + 1;
145 elsif (xmldom.getTagName(dummyElem) = 'ChildObject') then /* ChildObject */
146 childEntities_tab(counter) := n; /* Node starting with <ChildObject NAME=... */
147 counter := counter + 1;
148 end if;
149 end loop;
150 end if;
151 return childEntities_tab;
152 END getChildEntities;
153
154 -- **********************************************************************
155 -- API name : saveChildObjectsToDB
156 -- Type : Private
157 -- Function : This procedure saves children objects by calling
158 -- saveObjectTobDB recursively in the tree
159 -- **********************************************************************
160
161 PROCEDURE saveChildObjectsToDB(element IN xmldom.DOMElement, rootObjId IN NUMBER) IS
162 namedMap xmldom.DOMNamedNodeMap;
163 childEntities_tab childEntities_table;
164 child xmldom.DOMElement;
165 objId number;
166 objOrder number;
167 BEGIN
168 childEntities_tab := getChildEntities(element); /* Get all child elements */
169
170 for i in 0..childEntities_tab.count-1 loop
171 child := xmldom.makeElement(childEntities_tab(i));
172 objOrder := xmldom.getAttribute(child, 'OBJECT_ORDER'); /* Elements like CCTPropertyList and CCTPropertyMapList have this attribute */
173 objId := saveObjectToDB(child, rootObjId, objOrder); /* rootObjId is the parents object id */
174 end loop;
175 END saveChildObjectsToDB;
176
177 -- **********************************************************************
178 -- API name : writeDataIntoMetaRelationships
179 -- Type : Private
180 -- Function : This procedure inserts/updates record in
181 -- ies_meta_obj_relationships table
182 -- **********************************************************************
183
184 PROCEDURE writeDataIntoMetaRelationships(primObjId IN NUMBER, secObjId IN NUMBER, typeId IN NUMBER, objOrder IN NUMBER) IS
185 sqlStmt varchar2(2000);
186 seqval number;
187 BEGIN
188 if NOT (metaRelationshipExists(primObjId, secObjId, typeId)) then
189 execute immediate 'select ies_meta_obj_relationships_s.nextval from dual' into seqval;
190 sqlStmt := 'INSERT INTO ies_meta_obj_relationships (
191 objrel_id,
192 obj_Order,
193 primary_obj_id,
194 secondary_obj_id,
195 type_id,
196 created_by)
197 VALUES (:seq,
198 :objectOrder,
199 :primObjId,
200 :secObjId,
201 :typeId,
202 1)';
203 EXECUTE IMMEDIATE sqlStmt using seqval, objOrder, primObjId, secObjId, typeId;
204 else
205 sqlStmt := 'UPDATE ies_meta_obj_relationships SET obj_order = :objectOrder
206 WHERE primary_obj_id = :primObjId
207 AND secondary_obj_id = :secObjId
208 AND type_id = :typeId';
209 EXECUTE IMMEDIATE sqlStmt using objOrder, primObjId, secObjId, typeId;
210 end if;
211
212
213 EXCEPTION
214 WHEN OTHERS THEN
215 RAISE_APPLICATION_ERROR(-20101, sqlerrm||' Error in writing data to MetaRelationships');
216 END writeDataIntoMetaRelationships;
217
218 -- **********************************************************************
219 -- API name : saveMetaRelationships
220 -- Type : Private
221 -- Function : This procedure saves record in ies_meta_obj_relationships
222 -- table, first inserts self relationship record
223 -- **********************************************************************
224
225 PROCEDURE saveMetaRelationships(rootObjId IN NUMBER, objId IN NUMBER, typeName IN VARCHAR2, objOrder IN NUMBER) IS
226 rootId NUMBER;
227 BEGIN
228 writeDataIntoMetaRelationships(objId, objId, IES_META_DATA_UTIL.getRelationshipTypeId('self'), null);
229 if (rootObjId <> -1) then /* Self relationship */
230 writeDataIntoMetaRelationships(rootObjId, objId, IES_META_DATA_UTIL.getRelationshipTypeId(typeName), objOrder);
231 end if;
232 END saveMetaRelationships;
233
234 /******************* PUBLIC METHODS ************************************/
235
236 -- **********************************************************************
237 -- API name : saveObjectToDB
238 -- Type : Public
239 -- Function : This function navigates the DOM Tree and saves the
240 -- object and its children in IES_META_OBJECTS table.
241 -- Also the properties and relationships are saved into the
242 -- appropriate tables
243 -- **********************************************************************
244
245
246 FUNCTION saveObjectToDB(element IN xmldom.DOMElement, rootObjId IN NUMBER, objOrder IN NUMBER) return NUMBER IS
247 objId NUMBER := -1; /* for the parent, rootObjId is -1 */
248 name VARCHAR2(256);
249 objUID VARCHAR2(256);
250
251 relationship VARCHAR2(256);
252 e xmldom.DOMElement;
253 n xmldom.DOMNode;
254 BEGIN
255 relationship := xmldom.getAttribute(element, 'NAME'); /* It does not exist for parent */
256
257 /* The first if check is for child elements which are CCTPropertyList/CCTPropertyMapList OR
258 ChildObject, the next line starts with <JavaBean .. > which is parsed */
259
260 if (xmldom.getTagName(element) = 'Property' OR xmldom.getTagName(element) = 'ChildObject') then
261 n := xmldom.makeNode(element);
262 e := xmldom.makeElement(xmldom.getFirstChild(n));
263 else
264 e := element;
265 end if;
266
267 if NOT (xmldom.isNull(e)) then
268 name := IES_META_DATA_UTIL.getProperty(e, 'name');
269 objUID := IES_META_DATA_UTIL.getProperty(e, 'UID');
270
271 if NOT (existsObject(objUID)) then
272 objId := IES_META_DATA_INSERTER.insertMetaObject(e); /* If object does not exist, insert record */
273 else
274 objId := IES_META_DATA_UPDATER.updateMetaObject(e); /* Otherwise update existing record */
275 end if;
276
277 saveMetaRelationships(rootObjId, objId, relationship, objOrder); /* Save object relationships */
278 saveChildObjectsToDB(e, objId); /* Save Child objects */
279 end if;
280 return objId;
281 END saveObjectToDB;
282
283 -- **********************************************************************
284 -- API name : getTemporaryCLOB
285 -- Type : Public
286 -- Function : This function called from Author and is used to return
287 -- a CLOB type. CLOB used to pass XML Document from Author.
288 -- **********************************************************************
289
290 FUNCTION getTemporaryCLOB return CLOB IS
291 xml_clob CLOB;
292 BEGIN
293 DBMS_LOB.CreateTemporary(xml_clob, TRUE, DBMS_LOB.CALL);
294 return xml_clob;
295 END getTemporaryCLOB;
296
297 -- **********************************************************************
298 -- API name : writeMetaDataObject
299 -- Type : Public
300 -- Function : This procedure called from Author to save the object and
301 -- children meta objects. CLOB contains the xml document.
302 -- **********************************************************************
303
304 PROCEDURE writeMetaDataObject(obj IN Clob) IS
305 objId NUMBER := -1;
306 parser xmlparser.parser;
307 doc xmldom.DOMDocument;
308 element xmlDom.DOMElement;
309 BEGIN
310 parser := xmlparser.newParser;
311
312 xmlparser.setValidationMode(parser, FALSE);
313 xmlparser.showWarnings(parser, TRUE);
314 xmlparser.parseClob(parser, obj);
315
316 doc := xmlparser.getDocument(parser);
317 element := xmldom.getDocumentElement(doc);
318
319 objId := saveObjectToDB(element, -1, null);
320 writeLibraryRecord(objId);
321 END writeMetaDataObject;
322
323 -- **********************************************************************
324 -- API name : writeMetaDataObjectDebug
325 -- Type : Public
326 -- Function : Debug procedure similar to above, used for debugging in
327 -- pl/sql where VARCHAR xml doc can be passed as an argument
328 -- **********************************************************************
329
330 PROCEDURE writeMetaDataObjectDebug(obj IN VARCHAR2) IS
331 objId NUMBER := -1;
332 parser xmlparser.parser;
333 doc xmldom.DOMDocument;
334 element xmlDom.DOMElement;
335 BEGIN
336 parser := xmlparser.newParser;
337
338 xmlparser.setValidationMode(parser, FALSE);
339 xmlparser.showWarnings(parser, TRUE);
340 xmlparser.parseBuffer(parser, obj);
341
342 doc := xmlparser.getDocument(parser);
343 element := xmldom.getDocumentElement(doc);
344
345 objId := saveObjectToDB(element, -1, null);
346 writeLibraryRecord(objId);
347 END writeMetaDataObjectDebug;
348
349 -- **********************************************************************
350 -- API name : getMetaDataObject
351 -- Type : Public
352 -- Function : Function returning object as XMLDocument for a given
353 -- objectId
354 -- **********************************************************************
355
356 FUNCTION getMetaDataObject(objectId IN NUMBER) return CLOB IS
357 BEGIN
358 RETURN IES_META_DATA_SOURCE.getObjectAsXML(objectId);
359 END getMetaDataObject;
360 END IES_META_DATA_PKG;