1 package body WF_EVENT_XML as
2 /* $Header: wfevxmlb.pls 120.1 2005/07/02 03:48:18 appldev ship $ */
3 -----------------------------------------------------------------------------
4 function findTable(x_message in varchar2, p_tablename in varchar2)
5 return xmldom.DOMNodeList is
6 l_parser xmlparser.parser;
7 l_doc xmldom.DOMDocument;
8 l_node_name varchar2(255);
9 l_node_list xmldom.DOMNodeList;
10 l_doc_node xmldom.DOMNode;
11 l_length integer;
12 begin
13
14 l_parser := xmlparser.newParser;
15
16 -- CTILLEY bug 2708622
17 xmlparser.setPreserveWhitespace(l_parser, false);
18
19 -- Parse the message and the document
20 xmlparser.ParseBuffer(l_parser, x_message);
21 l_doc := xmlparser.getDocument(l_parser);
22
23 /*
24 ** Find The master node
25 */
26 l_node_list := xmldom.getElementsByTagName(l_doc,
27 wf_event_xml.masterTagName);
28 l_length := xmldom.getLength(l_node_list);
29 if l_length = 0 then
30 Wf_Core.Token('REASON', 'Could not find XML base node ' ||
31 wf_event_xml.masterTagName);
32 Wf_Core.Raise('WFSQL_INTERNAL');
33 end if;
34
35 -- There should never be more than one on the list, so we want the first.
36 l_doc_node := xmldom.item(l_node_list, 0);
37 l_node_name := xmldom.getNodeName(l_doc_node);
38 if l_node_name <> wf_event_xml.masterTagName then
39 Wf_Core.Token('REASON', 'Could not find XML base node in list' ||
40 wf_event_xml.masterTagName);
41 Wf_Core.Raise('WFSQL_INTERNAL');
42 end if;
43
44 /*
45 ** Find the table node
46 */
47 l_node_list := xmldom.getElementsByTagName(xmldom.makeElement(l_doc_node),
48 p_tablename);
49 l_length := xmldom.getLength(l_node_list);
50 if l_length = 0 then
51 Wf_Core.Token('REASON', 'Could not find XML table node ' ||
52 p_tablename);
53 Wf_Core.Raise('WFSQL_INTERNAL');
54 end if;
55
56 -- There should never be more than one on the list, so we want the first.
57 l_doc_node := xmldom.item(l_node_list, 0);
58 l_node_name := xmldom.getNodeName(l_doc_node);
59 if l_node_name <> p_tablename then
60 Wf_Core.Token('REASON', 'Could not find XML table node in list' ||
61 p_tablename);
62 Wf_Core.Raise('WFSQL_INTERNAL');
63 end if;
64
65 l_node_list := xmldom.getChildNodes(l_doc_node);
66
67 return l_node_list;
68 exception
69 when others then
70 wf_core.context('Wf_Event_XML', 'findTable', x_message);
71 raise;
72
73 end findTable;
74
75 function newTag (p_doc in xmldom.DOMDocument,
76 p_node in xmldom.DOMNode,
77 p_tag in varchar2,
78 p_data in varchar2 default NULL) return xmldom.DOMNode is
79 l_element xmldom.DOMElement;
80 l_node xmldom.DOMNode;
81 l_text xmldom.DOMText;
82 l_text_node xmldom.DOMNode;
83
84 begin
85
86 -- Create an instance of the node
87 l_element := xmldom.createElement(p_doc, p_tag);
88 l_node := xmldom.makeNode(l_element);
89
90 if p_data is not null then
91 -- Append the data to the node
92 l_text := xmldom.createTextNode(p_doc, p_data);
93 l_text_node := xmldom.makeNode(l_text);
94 l_text_node := xmldom.appendChild(l_node, l_text_node);
95 end if;
96
97 -- Append the new TAG node to the parent.
98 l_node := xmldom.appendChild(p_node, l_node);
99
100 return l_node;
101
102 exception
103 when xmldom.INDEX_SIZE_ERR then
104 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
105 raise;
106
107 when xmldom.DOMSTRING_SIZE_ERR then
108 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
109 raise;
110
111 when xmldom.HIERARCHY_REQUEST_ERR then
112 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
113 raise;
114
115 when xmldom.WRONG_DOCUMENT_ERR then
116 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
117 raise;
118
119 when xmldom.INVALID_CHARACTER_ERR then
120 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
121 raise;
122
123 when xmldom.NO_DATA_ALLOWED_ERR then
124 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
125 raise;
126
127 when xmldom.NO_MODIFICATION_ALLOWED_ERR then
128 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
129 raise;
130
131 when xmldom.NOT_FOUND_ERR then
132 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
133 raise;
134
135 when xmldom.NOT_SUPPORTED_ERR then
136 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
137 raise;
138
139 when xmldom.INUSE_ATTRIBUTE_ERR then
140 wf_core.context('WF_EVENT_XML', 'NewTag', p_tag);
141 raise;
142
143 end newTag;
144
145 -- For debugging only.
146 procedure printElements(doc xmldom.DOMDocument) is
147 nl xmldom.DOMNodeList;
148 len number;
149 n xmldom.DOMNode;
150 begin
151 -- get all elements
152 nl := xmldom.getElementsByTagName(doc, '*');
153 len := xmldom.getLength(nl);
154
155 -- loop through elements
156 -- ### uncomment this for debug purpose
157 -- dbms_output.put('[');
158 -- for i in 0..len-1 loop
159 -- n := xmldom.item(nl, i);
160 -- dbms_output.put(xmldom.getNodeName(n) || ', ');
161 -- end loop;
162 -- dbms_output.put_line(']');
163 end printElements;
164
165 /*get XML Parser version*/
166
167 Function XMLVersion
168 return varchar2
169 is language java name 'oracle.xml.parser.v2.XMLParser.getReleaseVersion() returns java.lang.String';
170
171
172 end WF_EVENT_XML;