DBA Data[Home] [Help]

PACKAGE BODY: APPS.IES_META_DATA_PKG

Source


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;