[Home] [Help]
PACKAGE BODY: APPS.WF_EVENT_PING_PKG
Source
1 package body WF_EVENT_PING_PKG as
2 /* $Header: WFEVPNGB.pls 120.1.12010000.3 2009/04/22 00:02:47 alepe ship $ */
3 ------------------------------------------------------------------------------
4
5 -- Send PING and ACK to only WF addresses. For PINGing other addresses, this test
6 -- needs to be customized
7 CURSOR c_external_in_agents(p_agent in varchar2, p_system in varchar2) IS
8 SELECT wfa.name AGENT,
9 wfs.name SYSTEM
10 FROM wf_systems wfs,
11 wf_agents wfa
12 WHERE wfa.name not in ('WF_ERROR', 'WF_DEFERRED')
13 and wfa.name = nvl(p_agent, wfa.name)
14 and wfa.status = 'ENABLED'
15 and wfa.direction = 'IN'
16 and wfa.system_guid = wfs.guid
17 and upper(wfa.queue_handler) = 'WF_EVENT_QH'
18 and wfa.name like 'WF%'
19 and wfa.status = 'ENABLED'
20 and wfs.name = nvl(p_system, wfs.name);
21
22 /*
23 * Parameter pAgentName is expected in '<AGENT_NAME>@<SYSTEM>' format
24 */
25 procedure ValidateOutAgent(pAgentName in out nocopy varchar2) is
26 errorMsg varchar2(300);
27 queName varchar2(100);
28 l_atsign number;
29 l_agent_name wf_agents.name%type;
30 l_sys_name wf_systems.name%type;
31 begin
32
33 -- OUTAGENT should not be null, will default to WF_OUT if so
34 if (pAgentName is not null) then
35 l_atsign := instr(pAgentName, '@');
36 if (l_atsign is null) then
37 -- Agent name provided by user is in incorrect format
38 errorMsg := 'Out Agent name provided is in incorrect format. '||
39 'It should be in format AGENT_NAME@SYSTEM_NAME';
40 raise_application_error(-20000,errorMsg);
41 end if;
42 l_agent_name := substr(pAgentName, 1, l_atsign-1);
43 l_sys_name := substr(pAgentName, l_atsign+1);
44 else
45 l_agent_name := 'WF_OUT';
46 l_sys_name := wf_event.local_system_name;
47 end if;
48
49 -- agent should exist, be enabled, be an OUT agent, and its queue handler be
50 -- 'WF_EVENT_QH'
51 begin
52 SELECT a.name into queName
53 FROM wf_agents a,
54 wf_systems s
55 WHERE a.direction = 'OUT'
56 AND a.status = 'ENABLED'
57 AND a.queue_handler = 'WF_EVENT_QH'
58 AND a.system_guid = s.guid
59 AND s.name = l_sys_name
60 AND a.name = l_agent_name;
61
62 pAgentName := l_agent_name||'@'||l_sys_name;
63 exception
64 when NO_DATA_FOUND then
65 -- initialize error
66 errorMsg := 'Cannot progress workflow, because either: the agent '||
67 pAgentName ||' is disabled, '||
68 'it is not an OUT agent, or its queue handler is not WF_EVENT_QH '||
69 '(for WF_EVENT_T payload type).';
70
71 raise_application_error(-20000,errorMsg);
72 when others then
73 null;
74 end;
75
76 end;
77
78 /*
79 ** launch_processes - Loops through all external agents
80 */
81 procedure LAUNCH_PROCESSES (
82 ITEMTYPE in varchar2,
83 ITEMKEY in varchar2,
84 ACTID in number,
85 FUNCMODE in varchar2,
86 RESULTOUT out nocopy varchar2
87 ) is
88 ------------------------------------------------------------------------------
89
90 l_eventname varchar2(100);
91 l_eventkey varchar2(240);
92 l_itemkey varchar2(100);
93 l_event_t wf_event_t;
94 l_msg varchar2(32000);
95 l_clob clob;
96 l_outAgent varchar2(100);
97 l_toAgent varchar2(100);
98 l_atsign number;
99 l_to_agent_name wf_agents.name%type;
100 l_to_sys_name wf_systems.name%type;
101 errorMsg varchar2(300);
102 begin
103
104 if (funcmode = 'RUN') then
105
106 l_outAgent := wf_engine.GetItemAttrText(itemtype => itemtype,
107 itemkey => itemkey, aname => 'OUTAGENT');
108 -- If Out Agent is provided, validate it
109 ValidateOutAgent(l_outAgent);
110
111 l_toAgent := wf_engine.GetItemAttrText(itemtype => itemtype,
112 itemkey => itemkey, aname => 'TOAGENT');
113
114 -- If To Agent is provided, validate it
115 if (l_toAgent is not null) then
116 l_atsign := instr(l_toAgent, '@');
117 if (l_atsign is null) then
118 -- Agent name provided by user is in incorrect format
119 errorMsg := 'To Agent name provided is in incorrect format. '||
120 'It should be in format AGENT_NAME@SYSTEM_NAME';
121 raise_application_error(-20000,errorMsg);
122 end if;
123 l_to_agent_name := substr(l_toAgent, 1, l_atsign-1);
124 l_to_sys_name := substr(l_toAgent, l_atsign+1);
125 end if;
126
127 l_eventname := wf_engine.GetActivityAttrText(
128 itemtype => itemtype,
129 itemkey => itemkey,
130 actid => actid,
131 aname => 'EVNTNAME');
132
133 -- Get all To Agents to PING
134 for x in c_external_in_agents(l_to_agent_name, l_to_sys_name) loop
135 --
136 -- For every agent launch detail process
137 --
138 l_eventkey := x.agent||'@'||x.system||'@'||itemkey;
139 l_itemkey := l_eventkey;
140
141 wf_engine.CreateProcess(
142 itemtype => itemtype,
143 itemkey => l_itemkey,
144 process => 'WFDTLPNG');
145
146 wf_engine.SetItemAttrText(itemtype => itemtype,
147 itemkey => l_itemkey, aname => 'OUTAGENT'
148 , avalue => l_outAgent);
149
150 wf_engine.SetItemAttrText(
151 itemtype => itemtype,
152 itemkey => l_itemkey,
153 aname => 'EVNTNAME',
154 avalue => l_eventname);
155
156 wf_engine.SetItemAttrText(
157 itemtype => itemtype,
158 itemkey => l_itemkey,
159 aname => 'EVNTKEY',
160 avalue => l_eventkey);
161
162 wf_engine.SetItemAttrText(
163 itemtype => itemtype,
164 itemkey => l_itemkey,
165 aname => 'TOAGENT',
166 avalue => x.agent||'@'||x.system);
167
168 -- Initialise the wf_event_t
169 wf_event_t.initialize(l_event_t);
170 l_event_t.setcorrelationid(l_itemkey);
171 l_msg := '<PING>Test Ping</PING>';
172 dbms_lob.createtemporary(l_clob, FALSE, DBMS_LOB.CALL);
173 dbms_lob.write(l_clob, length(l_msg), 1 , l_msg);
174 l_event_t.SetEventData(l_clob);
175
176 wf_engine.SetItemAttrEvent(
177 itemtype => itemtype,
178 itemkey => l_itemkey,
179 name => 'EVNTMSG',
180 event => l_event_t);
181
182 wf_engine.SetItemParent(
183 itemtype => itemtype,
184 itemkey => l_itemkey,
185 parent_itemtype => itemtype,
186 parent_itemkey => itemkey,
187 parent_context => null);
188
189 wf_engine.StartProcess(
190 itemtype => itemtype,
191 itemkey => l_itemkey);
192
193 end loop;
194
195 resultout := wf_engine.eng_completed||':'||wf_engine.eng_null;
196
197 return;
198
199 elsif (funcmode = 'CANCEL') then
200
201 null;
202
203 end if;
204
205 exception
206 when others then
207 WF_CORE.CONTEXT('WF_EVENT_PING_PKG', 'LAUNCH_PROCESSES', ITEMTYPE, ITEMKEY, to_char(ACTID), FUNCMODE);
208 raise;
209 end LAUNCH_PROCESSES;
210 ------------------------------------------------------------------------------
211 function ACKNOWLEDGE (
212 P_SUBSCRIPTION_GUID in raw,
213 P_EVENT in out nocopy wf_event_t
214 ) return varchar2 is
215 ------------------------------------------------------------------------------
216 l_fromagent wf_agent_t;
217 l_result varchar2(100);
218 l_returnagent wf_agents.name%type;
219 l_returnsys wf_systems.name%type;
220 begin
221
222 if (wf_log_pkg.level_procedure >= fnd_log.g_current_runtime_level) then
223 wf_log_pkg.string(wf_log_pkg.level_procedure,
224 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.Begin',
225 ' Started');
226 end if;
227
228 l_returnsys := p_event.from_agent.system;
229
230 -- Setting FROM AGENT for ACK message. Default to WF_OUT agent to
231 -- send ACK message via
232 l_fromagent := wf_agent_t ('WF_OUT', wf_event.local_system_name);
233 p_event.SetFromAgent(l_fromagent);
234
235 -- Setting TO AGENT for ACK message. ACK message back to originating system,
236 -- we will pick first matching IN agent on the originating system, registered
237 -- here in this system
238
239 open c_external_in_agents(null, l_returnsys);
240 fetch c_external_in_agents into l_returnagent, l_returnsys;
241 close c_external_in_agents;
242
243 p_event.to_agent.name := l_returnagent;
244 p_event.to_agent.system := l_returnsys;
245
246 if (wf_log_pkg.level_statement >= fnd_log.g_current_runtime_level) then
247 wf_log_pkg.string(wf_log_pkg.level_statement,
248 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.ToAgent',
249 'To Agent:'||p_event.to_agent.name);
250 wf_log_pkg.string(wf_log_pkg.level_statement,
251 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.ToSystem',
252 'To System:'||p_event.to_agent.system);
253 wf_log_pkg.string(wf_log_pkg.level_statement,
254 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.FromAgent',
255 'From Agent:'||p_event.from_agent.name);
256 wf_log_pkg.string(wf_log_pkg.level_statement,
257 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.FromSystem',
258 'From System:'||p_event.from_agent.system);
259 end if;
260
261 p_event.SetEventName('oracle.apps.wf.event.test.ack');
262
263 if (wf_log_pkg.level_statement >= fnd_log.g_current_runtime_level) then
264 wf_log_pkg.string(wf_log_pkg.level_statement,
265 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.Send',
266 'Sending Event');
267 end if;
268
269 wf_event.send(
270 p_event => p_event);
271
272 if (wf_log_pkg.level_statement >= fnd_log.g_current_runtime_level) then
273 wf_log_pkg.string(wf_log_pkg.level_statement,
274 'wf.plsqlWF_EVENT_PING_PKG.ACKNOWLEDGE.Sent',
275 ' Sent');
276 end if;
277
278 l_result := wf_rule.default_rule(p_subscription_guid, p_event);
279
280 return(l_result);
281
282 exception
283 when others then
284 WF_CORE.CONTEXT('WF_EVENT_PING_PKG','ACKNOWLEDGE',p_event.event_name,p_event.event_key, p_event.correlation_id);
285 wf_event.setErrorInfo(p_event,'ERROR');
286 return('ERROR');
287 end;
288
289 end WF_EVENT_PING_PKG;