DBA Data[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;