[Home] [Help]
PACKAGE BODY: APPS.XDP_ADAPTER_CORE
Source
1 PACKAGE BODY XDP_ADAPTER_CORE AS
2 /* $Header: XDPACORB.pls 120.1 2005/06/08 23:34:53 appldev $ */
3
4
5 Function IsOperationValid(p_Operation in varchar2,
6 p_CurrentAdapterStatus in varchar2) return boolean;
7
8 Procedure TalkToAdapter(p_ChannelName in varchar2,
9 p_Command in varchar2,
10 p_Timeout OUT NOCOPY number);
11
12 Procedure ReceiveAck(p_ChannelName in varchar2,
13 p_Status OUT NOCOPY varchar2,
14 p_ErrorMessage OUT NOCOPY varchar2,
15 p_Timeout OUT NOCOPY number);
16
17 Procedure SendSync( p_ChannelName in varchar2,
18 p_CleanupPipe in varchar2 default 'Y')
19 is
20
21 begin
22 if p_CleanupPipe = 'Y' then
23 XDP_ADAPTER_CORE_PIPE.CleanupPipe(p_ChannelName => SendSync.p_ChannelName,
24 p_Cleanreturn => 'Y');
25 end if;
26
27 SendControlCommand(p_ChannelName => SendSync.p_ChannelName,
28 p_Operation => 'SYNC');
29
30 end SendSync;
31
32 Procedure SendResponse(p_ChannelName in varchar2,
33 p_Status in varchar2,
34 p_Message in varchar2)
35
36 is
37 RespXML varchar2(4000);
38 begin
39
40 RespXML := XDP_ADAPTER_CORE_XML.ConstructRespXML(p_Status => SendResponse.p_Status,
41 p_RespData => SendResponse.p_Message);
42
43 SendMessage(p_ChannelName => SendResponse.p_ChannelName, p_Command => RespXML);
44
45 end SendResponse;
46
47
48 Procedure SendAck(p_ChannelName in varchar2)
49
50 is
51 AckXML varchar2(4000);
52 begin
53 AckXML := XDP_ADAPTER_CORE_XML.ConstructRespXML(p_Status => 'ACK',
54 p_RespData => NULL);
55
56 SendMessage(p_ChannelName => SendAck.p_ChannelName, p_Command => AckXML);
57
58 end SendAck;
59
60
61
62 Procedure SendControlCommand( p_ChannelName in varchar2,
63 p_Operation in varchar2,
64 p_OpData in varchar2 default null)
65 is
66 ControlCommandXML varchar2(4000);
67 begin
68
69 ControlCommandXML :=
70 XDP_ADAPTER_CORE_XML.ConstructControlXML
71 (p_Operation => SendControlCommand.p_Operation,
72 p_OpData => SendControlCommand.p_OpData);
73
74 TalkToAdapter ( p_ChannelName => SendControlCommand.p_ChannelName,
75 p_Command => ControlCommandXML);
76
77 end SendControlCommand;
78
79
80 Procedure SendControlCommand( p_ChannelName in varchar2,
81 p_Operation in varchar2,
82 p_OpData in varchar2 default null,
83 p_Timeout OUT NOCOPY number)
84 is
85 ControlCommandXML varchar2(4000);
86
87 begin
88
89 ControlCommandXML :=
90 XDP_ADAPTER_CORE_XML.ConstructControlXML
91 (p_Operation => SendControlCommand.p_Operation,
92 p_OpData => SendControlCommand.p_OpData);
93
94 TalkToAdapter( p_ChannelName => SendControlCommand.p_ChannelName,
95 p_Command => ControlCommandXML,
96 p_Timeout => SendControlCommand.p_Timeout);
97
98 end SendControlCommand;
99
100 Procedure ProcessControlCommand(p_ChannelName in varchar2,
101 p_Operation in varchar2,
102 p_OpData in varchar2 default null,
103 p_Status OUT NOCOPY varchar2,
104 p_ErrorMessage OUT NOCOPY varchar2)
105 is
106 l_Timeout number;
107 l_ReturnChannel varchar2(40);
108 l_RespXML varchar2(4000);
109 begin
110
111 XDP_ADAPTER_CORE_PIPE.CleanupPipe(p_ChannelName => p_ChannelName);
112
113 -- dbms_output.put_line('In ProcessControlCommand');
114 -- dbms_output.put_line('Before SendControlCommand, p_ChannelName:' || p_ChannelName);
115
116 SendControlCommand(p_ChannelName => ProcessControlCommand.p_ChannelName,
117 p_Operation => ProcessControlCommand.p_Operation,
118 p_OpData => ProcessControlCommand.p_OpData,
119 p_Timeout => l_Timeout);
120
121 l_ReturnChannel := XDP_ADAPTER_CORE_PIPE.GetReturnChannelName
122 (p_ChannelName => ProcessControlCommand.p_ChannelName);
123
124 -- dbms_output.put_line('After SendControlCommand, l_ReturnChannel:' || l_ReturnChannel);
125 -- dbms_output.put_line('After SendControlCommand, Message timeout: ' || l_Timeout);
126 -- dbms_output.put_line('Before WaitForMessage');
127
128 WaitForMessage(p_ChannelName => l_ReturnChannel,
129 p_Timeout => l_Timeout,
130 p_ResponseMessage => l_RespXML);
131
132 -- dbms_output.put_line('After WaitForMessage, p_ResponseMessage:'||l_RespXML);
133 -- dbms_output.put_line('Before SendAck');
134
135 SendAck(p_ChannelName => ProcessControlCommand.p_ChannelName);
136
137 p_Status := XDP_ADAPTER_CORE_XML.DecodeMessage(p_WhattoDecode => 'STATUS',
138 p_XMLMessage => l_RespXML);
139
140 p_ErrorMessage := XDP_ADAPTER_CORE_XML.DecodeMessage(p_WhattoDecode => 'DATA',
141 p_XMLMessage => l_RespXML);
142
143 if (p_Operation <> XDP_ADAPTER.pv_opStop) and
144 (p_Status <> pv_AdapterResponseFailure) then
145 SendSync(p_ChannelName => ProcessControlCommand.p_ChannelName,
146 p_CleanupPipe => 'N');
147 end if;
148 exception
149 when e_ReceiveTimedOut then
150 p_Status := pv_ProcessCommandTimedout;
151 p_ErrorMessage := 'Waiting for response, timed out';
152
153 when others then
154 p_Status := pv_ProcessCommandError;
155 p_ErrorMessage := 'Waiting for response, errored out';
156
157 end ProcessControlCommand;
158
159 Procedure TalkToAdapter(p_ChannelName in varchar2,
160 p_Command in varchar2)
161 is
162 l_dummynum number;
163 begin
164 TalkToAdapter(p_ChannelName => TalkToAdapter.p_ChannelName,
165 p_Command => TalkToAdapter.p_Command,
166 p_Timeout => l_dummynum);
167
168 end TalkToAdapter;
169
170
171 Procedure TalkToAdapter(p_ChannelName in varchar2,
172 p_Command in varchar2,
173 p_Timeout OUT NOCOPY number)
174 is
175
176 ReturnChannelName varchar2(40);
177 Status varchar2(40);
178 ErrorMessage varchar2(2000);
179
180 begin
181 SendMessage(p_ChannelName => TalkToAdapter.p_ChannelName,
182 p_Command => TalkToAdapter.p_Command);
183
184 ReturnChannelName := XDP_ADAPTER_CORE_PIPE.GetReturnChannelName
185 (p_ChannelName => TalkToAdapter.p_ChannelName);
186
187 ReceiveAck(p_ChannelName => ReturnChannelName,
188 p_Status => Status,
189 p_ErrorMessage => ErrorMessage,
190 p_Timeout=> p_Timeout);
191
192 -- if Status = 'WARNING' then
193 -- raise e_AdapterWarningException;
194 -- elsif Status = 'ERROR' then
195 -- raise e_AdapterErrorException;
196 -- end if;
197
198 end TalkToAdapter;
199
200
201 Procedure SendApplicationMessage(p_ChannelName in varchar2,
202 p_Command in varchar2,
203 p_Response in varchar2)
204 is
205 ApplXML varchar2(4000);
206 begin
207 ApplXML := XDP_ADAPTER_CORE_XML.ConstructSendXML(
208 p_Command => SendApplicationMessage.p_Command,
209 p_Response => SendApplicationMessage.p_Response);
210
211 TalkToAdapter(p_ChannelName => SendApplicationMessage.p_ChannelName,
212 p_Command => ApplXML);
213
214 end SendApplicationMessage;
215
216
217 Procedure SendMessage( p_ChannelName in varchar2,
218 p_Command in varchar2)
219 is
220 begin
221
222 XDP_ADAPTER_CORE_PIPE.SendPipedMessage(p_ChannelName => SendMessage.p_ChannelName,
223 p_Message => SendMessage.p_Command);
224
225 end SendMessage;
226
227
228 Procedure ReceiveAck(p_ChannelName in varchar2,
229 p_Status OUT NOCOPY varchar2,
230 p_ErrorMessage OUT NOCOPY varchar2)
231 is
232 l_dummynum number;
233 begin
234 ReceiveAck(p_ChannelName => ReceiveAck.p_ChannelName,
235 p_Status => ReceiveAck.p_Status,
236 p_ErrorMessage => ReceiveAck.p_ErrorMessage,
237 p_Timeout=> l_dummynum);
238
239 end ReceiveAck;
240
241 Procedure ReceiveAck(p_ChannelName in varchar2,
242 p_Status OUT NOCOPY varchar2,
243 p_ErrorMessage OUT NOCOPY varchar2,
244 p_Timeout OUT NOCOPY number)
245 is
246 ReturnCode number := 0;
247
248 PipedMessage varchar2(4000);
249 l_Timeout varchar2(20);
250 begin
251
252 XDP_ADAPTER_CORE_PIPE.ReceivePipedMessage(p_ChannelName => ReceiveAck.p_ChannelName,
253 p_Timeout => NULL,
254 p_ErrorCode => ReturnCode,
255 p_Message => PipedMessage);
256
257 if ReturnCode = 0 then
258 if PipedMessage is not null then
259
260 p_Status := XDP_ADAPTER_CORE_XML.DecodeMessage
261 (p_WhattoDecode => 'STATUS',
262 p_XMLMessage => PipedMessage);
263
264 p_ErrorMessage := XDP_ADAPTER_CORE_XML.DecodeMessage
265 (p_WhattoDecode => 'DATA',
266 p_XMLMessage => PipedMessage);
267
268 l_Timeout := XDP_ADAPTER_CORE_XML.DecodeMessage
269 (p_WhattoDecode => 'TIMEOUT',
270 p_XMLMessage => PipedMessage);
271
272 if l_Timeout is not null then
273 p_Timeout := to_number(l_Timeout);
274 else
275 p_Timeout := pv_DefTimeout;
276 end if;
277
278 else
279 raise e_ReceiveOtherError;
280 -- p_Status := 'WARNING';
281 -- p_ErrorMessage := 'Nuthin to Unpack';
282 end if;
283 elsif ReturnCode = pv_DBMSPipeTimeoutError then
284 raise e_ReceiveTimedOut;
285 else
286 raise e_ReceiveOtherError;
287 end if;
288
289 end ReceiveAck;
290
291
292 Procedure WaitForMessage(p_ChannelName in varchar2,
293 p_Timeout in number,
294 p_ResponseMessage OUT NOCOPY varchar2)
295 is
296 ReturnCode number := 0;
297 begin
298
299 XDP_ADAPTER_CORE_PIPE.ReceivePipedMessage
300 (p_ChannelName => WaitForMessage.p_ChannelName,
301 p_Timeout => WaitForMessage.p_Timeout,
302 p_ErrorCode => ReturnCode,
303 p_Message => p_ResponseMessage);
304
305 if ReturnCode <> 0 then
306 if ReturnCode = pv_DBMSPipeTimeoutError then
307 raise e_ReceiveTimedOut;
308 else
309 raise e_ReceiveOtherError;
310 end if;
311 end if;
312 end WaitForMessage;
313
314
315 Function VerifyAdapterOperation(p_ChannelName in varchar2,
316 p_Operation in varchar2,
317 p_CurrentStatus OUT NOCOPY varchar2) return boolean
318 is
319 l_isValid boolean := false;
320 begin
321 p_CurrentStatus := XDP_ADAPTER_CORE_DB.GetCurrentAdapterStatus
322 (VerifyAdapterOperation.p_ChannelName);
323
324 if (IsOperationValid(VerifyAdapterOperation.p_Operation, p_CurrentStatus) ) then
325 l_isValid := true;
326 end if;
327
328 return (l_isValid);
329
330 end VerifyAdapterOperation;
331
332
333 Function IsOperationValid(p_Operation in varchar2,
334 p_CurrentAdapterStatus in varchar2) return boolean
335 is
336 l_isValid boolean := false;
337 begin
338 if p_Operation = XDP_ADAPTER.pv_opStartup then
339 -- if p_CurrentAdapterStatus = XDP_ADAPTER.pv_statusStopped then
340
341 if p_CurrentAdapterStatus in (XDP_ADAPTER.pv_statusStopped,
342 XDP_ADAPTER.pv_statusStoppedError,
343 XDP_ADAPTER.pv_statusTerminated,
344 XDP_ADAPTER.pv_statusDeactivated,
345 XDP_ADAPTER.pv_statusDeactivatedSystem) then
346 l_isValid := true;
347 else
348 l_isValid := false;
349 end if;
350
351 elsif p_Operation = XDP_ADAPTER.pv_opStop then
352 if p_CurrentAdapterStatus not in (XDP_ADAPTER.pv_statusStopped,
353 XDP_ADAPTER.pv_StatusStoppedError,
354 XDP_ADAPTER.pv_StatusTerminated,
355 XDP_ADAPTER.pv_statusNotAvailable,
356 XDP_ADAPTER.pv_statusDeactivated,
357 XDP_ADAPTER.pv_statusDeactivatedSystem) then
358 l_isValid := true;
359 else
360 l_isValid := false;
361 end if;
362
363 elsif p_Operation = XDP_ADAPTER.pv_opConnect then
364 if p_CurrentAdapterStatus in (XDP_ADAPTER.pv_statusDisconnected,
365 XDP_ADAPTER.pv_statusSessionLost) then
366 l_isValid := true;
367 else
368 l_isValid := false;
369 end if;
370
371 elsif p_Operation = XDP_ADAPTER.pv_opDisconnect then
372 if p_CurrentAdapterStatus in (XDP_ADAPTER.pv_statusRunning,
373 XDP_ADAPTER.pv_statusSuspended) then
374 l_isValid := true;
375 else
376 l_isValid := false;
377 end if;
378
379 elsif p_Operation = XDP_ADAPTER.pv_opSuspend then
380 if p_CurrentAdapterStatus = XDP_ADAPTER.pv_statusRunning then
381 l_isValid := true;
382 else
383 l_isValid := false;
384 end if;
385
386 elsif p_Operation = XDP_ADAPTER.pv_opResume then
387 if p_CurrentAdapterStatus = XDP_ADAPTER.pv_statusSuspended then
388 l_isValid := true;
389 else
390 l_isValid := false;
391 end if;
392
393 elsif p_Operation = XDP_ADAPTER.pv_opVerify then
394 if p_CurrentAdapterStatus not in (XDP_ADAPTER.pv_statusStopped,
395 XDP_ADAPTER.pv_StatusStoppedError,
396 XDP_ADAPTER.pv_StatusTerminated,
397 XDP_ADAPTER.pv_statusNotAvailable,
398 XDP_ADAPTER.pv_statusDeactivated,
399 XDP_ADAPTER.pv_statusDeactivatedSystem) then
400 l_isValid := true;
401 else
402 l_isValid := false;
403 end if;
404
405 elsif p_Operation = XDP_ADAPTER.pv_opUpdate then
406 if p_CurrentAdapterStatus in (XDP_ADAPTER.pv_statusStopped,
407 XDP_ADAPTER.pv_StatusStoppedError,
408 XDP_ADAPTER.pv_StatusTerminated,
409 XDP_ADAPTER.pv_statusNotAvailable,
410 XDP_ADAPTER.pv_statusDeactivated,
411 XDP_ADAPTER.pv_statusDeactivatedSystem) then
412 l_isValid := true;
413 else
414 l_isValid := false;
415 end if;
416
417 elsif p_Operation = XDP_ADAPTER.pv_opDelete then
418 if p_CurrentAdapterStatus in (XDP_ADAPTER.pv_statusStopped,
419 XDP_ADAPTER.pv_StatusStoppedError,
420 XDP_ADAPTER.pv_StatusTerminated,
421 XDP_ADAPTER.pv_statusNotAvailable,
422 XDP_ADAPTER.pv_statusDeactivated,
423 XDP_ADAPTER.pv_statusDeactivatedSystem) then
424 l_isValid := true;
425 else
426 l_isValid := false;
427 end if;
428
429 elsif p_Operation = XDP_ADAPTER.pv_opGeneric then
430 -- Generic operation
431 if p_CurrentAdapterStatus = XDP_ADAPTER.pv_statusRunning then
432 l_isValid := true;
433 else
434 l_isValid := false;
435 end if;
436
437 else
438 l_isValid := false;
439
440 end if;
441
442 return (l_isValid);
443
444 end IsOperationValid;
445
446
447 Function ShouldAdapterConnect(p_ChannelName in varchar2) return varchar2
448 is
449
450 begin
451
452 if ( XDP_ADAPTER_CORE_DB.IsChannelCOD(p_ChannelName) = 'N') then
453 return('Y');
454 elsif (XDP_ADAPTER_CORE_DB.PeekIntoFeWaitQueue(p_ChannelName) = 'Y') then
455 return('Y');
456 else
457 return( 'N');
458 end if;
459
460 end ShouldAdapterConnect;
461
462
463 Procedure NotifyAdapterTerminateFailure (p_AdapterName in VARCHAR2,
464 p_NotifRecipient IN VARCHAR2 DEFAULT NULL)
465 is
466 l_NotifID number;
467 l_NotifRecipient varchar2(80);
468 begin
469
470 if ( p_notifRecipient is NULL ) then
471 l_NotifRecipient := xdp_utilities.GetSystemErrNotifRecipient;
472 else
473 l_NotifRecipient := p_NotifRecipient;
474 end if;
475
476 l_NotifID := wf_notification.Send(role => l_NotifRecipient,
477 msg_type => xdp_utilities.pv_ErrorNotifItemType,
478 msg_name => XDP_ADAPTER_CORE.pv_AdapterTermFailure,
479 due_date =>sysdate);
480
481 wf_notification.SetAttrText( nid => l_NotifID,
482 aname => 'ADAPTER_NAME',
483 avalue => p_AdapterName );
484
485 end NotifyAdapterTerminateFailure;
486
487 Procedure NotifyAdapterSysDeactivation (p_AdapterName in VARCHAR2,
488 p_NotifRecipient IN VARCHAR2 DEFAULT NULL)
489 is
490 l_NotifID number;
491 l_NotifRecipient varchar2(80);
492 begin
493
494 if ( p_notifRecipient is NULL ) then
495 l_NotifRecipient := xdp_utilities.GetSystemErrNotifRecipient;
496 else
497 l_NotifRecipient := p_NotifRecipient;
498 end if;
499
500 l_NotifID := wf_notification.Send(role => l_NotifRecipient,
501 msg_type => xdp_utilities.pv_ErrorNotifItemType,
502 msg_name => XDP_ADAPTER_CORE.pv_AdapterSysDeactivated,
503 due_date =>sysdate);
504
505 wf_notification.SetAttrText( nid => l_NotifID,
506 aname => 'ADAPTER_NAME',
507 avalue => p_AdapterName );
508
509 end NotifyAdapterSysDeactivation;
510
511 end XDP_ADAPTER_CORE;