1 karl 1.15 //%2003////////////////////////////////////////////////////////////////////////
|
2 chip 1.1 //
|
3 karl 1.15 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development
4 // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
6 // IBM Corp.; EMC Corporation, The Open Group.
|
7 chip 1.1 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to
10 // deal in the Software without restriction, including without limitation the
11 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12 // sell copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
|
14 chip 1.17 //
|
15 chip 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
16 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
17 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
18 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
19 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 //
24 //==============================================================================
25 //
26 // Author: Chip Vincent (cvincent@us.ibm.com)
27 //
28 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
29 // (carolann_graves@hp.com)
30 // Mike Day, IBM (mdday@us.ibm.com)
31 // Karl Schopmeyer(k.schopmeyer@opengroup.org) - Fix associators.
|
32 chip 1.9 // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
|
33 schuur 1.19 // Adrian Schuur, IBM (schuur@de.ibm.com)
|
34 chip 1.1 //
35 //%/////////////////////////////////////////////////////////////////////////////
36
37 #include "ProviderManagerService.h"
38
39 #include <Pegasus/Common/Config.h>
40 #include <Pegasus/Common/Constants.h>
41 #include <Pegasus/Common/CIMMessage.h>
42 #include <Pegasus/Common/Tracer.h>
43 #include <Pegasus/Common/Logger.h>
44 #include <Pegasus/Common/Destroyer.h>
|
45 schuur 1.29 #include <Pegasus/ProviderManager2/OperationResponseHandler.h>
|
46 chip 1.1
|
47 chip 1.6 #include <Pegasus/Config/ConfigManager.h>
48
|
49 chip 1.17 #include <Pegasus/ProviderManager2/ProviderManagerModule.h>
50 #include <Pegasus/ProviderManager2/ProviderManager.h>
51
|
52 chip 1.1 PEGASUS_NAMESPACE_BEGIN
53
|
54 chip 1.13 // BEGIN TEMP SECTION
|
55 chip 1.11 class ProviderManagerContainer
|
56 chip 1.5 {
|
57 chip 1.11 public:
|
58 chip 1.17 ProviderManagerContainer(void) : _manager(0)
59 {
60 }
61
62 ProviderManagerContainer(const ProviderManagerContainer & container) : _manager(0)
63 {
64 *this = container;
65 }
66
67 ProviderManagerContainer(const String & physicalName, const String & logicalName, const String & interfaceName) : _manager(0)
|
68 chip 1.11 {
|
69 schuur 1.25 _physicalName=ProviderManager::_resolvePhysicalName(physicalName);
|
70 chip 1.3
|
71 chip 1.11 _logicalName = logicalName;
72
73 _interfaceName = interfaceName;
|
74 chip 1.13
75 _module = ProviderManagerModule(_physicalName);
76
77 _module.load();
78
79 _manager = _module.getProviderManager(_logicalName);
|
80 chip 1.17
81 PEGASUS_ASSERT(_manager != 0);
|
82 chip 1.11 }
83
|
84 chip 1.13 ~ProviderManagerContainer(void)
85 {
86 _module.unload();
87 }
88
|
89 chip 1.17 ProviderManagerContainer & operator=(const ProviderManagerContainer & container)
90 {
91 if(this == &container)
92 {
93 return(*this);
94 }
95
96 _logicalName = container._logicalName;
97 _physicalName = container._physicalName;
98 _interfaceName = container._interfaceName;
99
100 _module = container._module;
101 _manager = container._manager;
102
103 return(*this);
104 }
105
|
106 schuur 1.19 ProviderManager *getProviderManager(void)
|
107 chip 1.13 {
|
108 schuur 1.19 return _manager;
|
109 chip 1.13 }
110
|
111 chip 1.17 const String & getPhysicalName(void) const
|
112 chip 1.3 {
|
113 chip 1.11 return(_physicalName);
|
114 chip 1.3 }
115
|
116 chip 1.17 const String & getLogicalName(void) const
|
117 chip 1.11 {
118 return(_logicalName);
119 }
|
120 chip 1.3
|
121 chip 1.17 const String & getInterfaceName(void) const
|
122 chip 1.11 {
123 return(_interfaceName);
|
124 chip 1.3 }
125
|
126 chip 1.11 private:
127 String _physicalName;
128 String _logicalName;
129 String _interfaceName;
|
130 chip 1.3
|
131 chip 1.13 ProviderManagerModule _module;
132 ProviderManager * _manager;
133
|
134 chip 1.11 };
|
135 chip 1.13
|
136 schuur 1.19 static Array<ProviderManagerContainer*> _providerManagers;
|
137 chip 1.11 // END TEMP SECTION
138
139 inline Boolean _isSupportedRequestType(const Message * message)
140 {
141 // ATTN: needs implementation
142
143 // for now, assume all requests are valid
144
145 return(true);
|
146 chip 1.3 }
147
148 inline Boolean _isSupportedResponseType(const Message * message)
149 {
|
150 chip 1.11 // ATTN: needs implementation
151
152 // for now, assume all responses are invalid
|
153 chip 1.3
|
154 chip 1.11 return(false);
|
155 chip 1.3 }
156
|
157 schuur 1.19 ProviderManagerService* ProviderManagerService::providerManagerService=NULL;
|
158 schuur 1.25 CIMRepository* ProviderManagerService::_repository=NULL;
|
159 schuur 1.19
|
160 chip 1.1 ProviderManagerService::ProviderManagerService(void)
161 : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
162 {
|
163 schuur 1.19 providerManagerService=this;
|
164 chip 1.1 }
165
|
166 schuur 1.25 ProviderManagerService::ProviderManagerService(
167 ProviderRegistrationManager * providerRegistrationManager,
168 CIMRepository * repository)
|
169 chip 1.1 : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
170 {
|
171 schuur 1.19 providerManagerService=this;
|
172 schuur 1.25 _repository=repository;
|
173 dj.gorey 1.31
|
174 chip 1.10 SetProviderRegistrationManager(providerRegistrationManager);
175
|
176 chip 1.11 // ATTN: this section is a temporary solution to populate the list of enabled
177 // provider managers for a given distribution. it includes another temporary
178 // solution for converting a generic file name into a file name useable by
179 // each platform.
180
181 // BEGIN TEMP SECTION
182 //#if defined(PEGASUS_OS_OS400)
|
183 chip 1.13 //_providerManagers.append(ProviderManagerContainer("QSYS/??????????", "INTERNAL", "INTERNAL"));
|
184 chip 1.11 //#else
|
185 chip 1.13 //_providerManager.append(ProviderManagerContainer("InternalProviderManager", "DEFAULT", "INTERNAL"));
|
186 chip 1.11 //#endif
|
187 chip 1.2
|
188 chip 1.11 #if defined(ENABLE_DEFAULT_PROVIDER_MANAGER)
189 #if defined(PEGASUS_OS_OS400)
|
190 schuur 1.19 _providerManagers.append(
191 new ProviderManagerContainer("QSYS/QYCMDFTPVM", "DEFAULT", "C++Default"));
|
192 chip 1.11 #else
|
193 schuur 1.19 _providerManagers.append(
194 new ProviderManagerContainer("DefaultProviderManager", "DEFAULT", "C++Default"));
|
195 chip 1.11 #endif
196 #endif
|
197 chip 1.2
|
198 chip 1.11 #if defined(ENABLE_CMPI_PROVIDER_MANAGER)
199 #if defined(PEGASUS_OS_OS400)
|
200 schuur 1.19 _providerManagers.append(
201 new ProviderManagerContainer("QSYS/QYCMCMPIPM", "CMPI", "CMPI"));
|
202 chip 1.11 #else
|
203 schuur 1.19 _providerManagers.append(
204 new ProviderManagerContainer("CMPIProviderManager", "CMPI", "CMPI"));
|
205 chip 1.11 #endif
206 #endif
207 // END TEMP SECTION
|
208 chip 1.1 }
209
210 ProviderManagerService::~ProviderManagerService(void)
211 {
|
212 schuur 1.19 providerManagerService=NULL;
|
213 chip 1.1 }
214
215 Boolean ProviderManagerService::messageOK(const Message * message)
216 {
217 PEGASUS_ASSERT(message != 0);
218
|
219 chip 1.3 if(_isSupportedRequestType(message))
|
220 chip 1.1 {
|
221 chip 1.3 return(MessageQueueService::messageOK(message));
|
222 chip 1.1 }
223
|
224 chip 1.3 return(false);
|
225 chip 1.1 }
226
227 void ProviderManagerService::handleEnqueue(void)
228 {
229 Message * message = dequeue();
230
231 handleEnqueue(message);
232 }
233
234 void ProviderManagerService::handleEnqueue(Message * message)
235 {
236 PEGASUS_ASSERT(message != 0);
237
238 AsyncLegacyOperationStart * asyncRequest;
239
240 if(message->_async != NULL)
241 {
242 asyncRequest = static_cast<AsyncLegacyOperationStart *>(message->_async);
243 }
244 else
245 {
246 chip 1.1 asyncRequest = new AsyncLegacyOperationStart(
247 get_next_xid(),
248 0,
249 this->getQueueId(),
250 message,
251 this->getQueueId());
252 }
253
254 _handle_async_request(asyncRequest);
255 }
256
257 void ProviderManagerService::_handle_async_request(AsyncRequest * request)
258 {
259 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
260 "ProviderManagerService::_handle_async_request");
261
262 PEGASUS_ASSERT((request != 0) && (request->op != 0));
263
264 if(request->getType() == async_messages::ASYNC_LEGACY_OP_START)
265 {
266 request->op->processing();
267 chip 1.1
268 _incomingQueue.enqueue(request->op);
269
|
270 schuur 1.32 while (!_thread_pool->allocate_and_awaken(
271 (void *)this, ProviderManagerService::handleCimOperation))
272 {
273 pegasus_yield();
274 }
|
275 chip 1.1 }
276 else
277 {
278 // pass all other operations to the default handler
279 MessageQueueService::_handle_async_request(request);
280 }
281
282 PEG_METHOD_EXIT();
283
284 return;
285 }
286
287
288 PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL ProviderManagerService::handleCimOperation(void * arg) throw()
289 {
290 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimOperation");
291
|
292 chip 1.8 if(arg == 0)
293 {
294 // thread started with invalid argument.
295 return(PEGASUS_THREAD_RETURN(1));
296 }
297
|
298 chip 1.1 // get the service from argument
299 ProviderManagerService * service = reinterpret_cast<ProviderManagerService *>(arg);
300
301 if(service->_incomingQueue.size() == 0)
302 {
303 PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
304 "ProviderManagerService::handleCimOperation() called with no op node in queue" );
305
306 PEG_METHOD_EXIT();
307
308 // thread started with no message in queue.
309 return(PEGASUS_THREAD_RETURN(1));
310 }
311
312 AsyncOpNode * op = service->_incomingQueue.dequeue();
313
|
314 chip 1.8 if((op == 0) || (op->_request.count() == 0))
|
315 chip 1.1 {
316 MessageQueue * queue = MessageQueue::lookup(op->_source_queue);
317
318 PEGASUS_ASSERT(queue != 0);
319
320 PEG_METHOD_EXIT();
321
322 // no request in op node
323 return(PEGASUS_THREAD_RETURN(1));
324 }
325
326 AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0));
327
|
328 chip 1.8 if((request == 0) || (request->getType() != async_messages::ASYNC_LEGACY_OP_START))
|
329 chip 1.1 {
330 // reply with NAK
331
332 PEG_METHOD_EXIT();
333
334 return(PEGASUS_THREAD_RETURN(0));
335 }
336
|
337 chip 1.8 try
|
338 chip 1.1 {
|
339 chip 1.8 Message * legacy = static_cast<AsyncLegacyOperationStart *>(request)->get_action();
|
340 chip 1.1
|
341 chip 1.8 if(_isSupportedRequestType(legacy))
|
342 chip 1.1 {
|
343 chip 1.8 Destroyer<Message> xmessage(legacy);
|
344 chip 1.1
|
345 chip 1.8 // Set the client's requested language into this service thread.
346 // This will allow functions in this service to return messages
347 // in the correct language.
348 CIMMessage * msg = dynamic_cast<CIMMessage *>(legacy);
349
350 if(msg != 0)
351 {
352 AcceptLanguages * langs = new AcceptLanguages(msg->acceptLanguages);
353
354 Thread::setLanguages(langs);
355 }
356 else
357 {
358 Thread::clearLanguages();
359 }
|
360 chip 1.1
361 service->handleCimRequest(op, legacy);
|
362 chip 1.3 }
|
363 chip 1.8 }
364 catch(...)
365 {
366 // ATTN: log error
|
367 chip 1.1 }
368
369 PEG_METHOD_EXIT();
370
371 return(PEGASUS_THREAD_RETURN(0));
372 }
373
|
374 chip 1.8 void ProviderManagerService::handleCimRequest(AsyncOpNode * op, const Message * message)
|
375 chip 1.1 {
376 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimRequest");
377
378 // ATTN: ensure message is a request???
379 CIMMessage * request = dynamic_cast<CIMMessage *>(const_cast<Message *>(message));
380
381 // get request from op node
382 AsyncRequest * async = static_cast<AsyncRequest *>(op->_request.next(0));
383
384 PEGASUS_ASSERT((request != 0) && (async != 0));
385
386 Message * response = 0;
|
387 schuur 1.22 String ifc;
|
388 schuur 1.23
|
389 schuur 1.19 // get the responsible provider Manager
|
390 schuur 1.22 ProviderManager * pm = locateProviderManager(message,ifc);
|
391 schuur 1.26 if (pm) {
|
392 dj.gorey 1.31 response = pm->processMessage(request);
|
393 schuur 1.19 }
|
394 dj.gorey 1.31
|
395 schuur 1.26 else for (Uint32 i = 0, n = _providerManagers.size(); i < n; i++) {
|
396 schuur 1.23 ProviderManagerContainer *pmc=_providerManagers[i];
|
397 schuur 1.26 switch (message->getType()) {
398 case CIM_ENABLE_MODULE_REQUEST_MESSAGE: {
399 CIMEnableModuleRequestMessage * request =
400 dynamic_cast<CIMEnableModuleRequestMessage*>(const_cast<Message*>(message));
401 if (request->providerModule.getProperty(request->providerModule.findProperty
402 ("InterfaceType")).getValue().toString()==pmc->getInterfaceName())
|
403 dj.gorey 1.31 response=pmc->getProviderManager()->processMessage(request);
|
404 schuur 1.23 }
|
405 schuur 1.26 break;
406 case CIM_DISABLE_MODULE_REQUEST_MESSAGE: {
407 CIMDisableModuleRequestMessage * request =
408 dynamic_cast<CIMDisableModuleRequestMessage*>(const_cast<Message*>(message));
409 if (request->providerModule.getProperty(request->providerModule.findProperty
410 ("InterfaceType")).getValue().toString()==pmc->getInterfaceName())
|
411 dj.gorey 1.31 response=pmc->getProviderManager()->processMessage(request);
|
412 schuur 1.23 }
|
413 schuur 1.26 break;
414 case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE: {
|
415 dj.gorey 1.31 Message *resp=pmc->getProviderManager()->processMessage(request);
416 if (resp) response=resp; }
|
417 schuur 1.26 break;
418 default:
|
419 schuur 1.23 CIMRequestMessage * req =
420 dynamic_cast<CIMRequestMessage *>(const_cast<Message *>(message));
421 CIMResponseMessage *resp=new CIMResponseMessage(0,req->messageId,CIMException(),
|
422 schuur 1.22 req->queueIds.copyAndPop());
|
423 schuur 1.23 response=resp;
424 resp->synch_response(req);
425 OperationResponseHandler handler(req, resp);
|
426 schuur 1.26 handler.setStatus(CIM_ERR_FAILED, "Unknown messagetype.");
|
427 schuur 1.23 }
428 }
|
429 chip 1.13
|
430 schuur 1.19 // preserve message key
431 response->setKey(request->getKey());
|
432 chip 1.13
|
433 schuur 1.19 // set HTTP method in response from request
434 response->setHttpMethod(request->getHttpMethod());
|
435 chip 1.13
|
436 schuur 1.19 AsyncLegacyOperationResult * async_result =
437 new AsyncLegacyOperationResult(
438 async->getKey(),
439 async->getRouting(),
440 op,
441 response);
|
442 chip 1.13
|
443 schuur 1.19 _complete_op_node(op, ASYNC_OPSTATE_COMPLETE, 0, 0);
|
444 chip 1.13
|
445 schuur 1.19 PEG_METHOD_EXIT();
446 }
|
447 chip 1.13
|
448 schuur 1.23 ProviderManager* ProviderManagerService::locateProviderManager(const Message *message,
|
449 schuur 1.22 String & it)
|
450 schuur 1.19 {
|
451 kumpf 1.24 CIMNamespaceName nameSpace;
452 CIMName className;
|
453 schuur 1.27 CIMName method;
|
454 chip 1.13
|
455 schuur 1.22 const CIMOperationRequestMessage * p =
456 dynamic_cast<const CIMOperationRequestMessage *>(message);
|
457 chip 1.13
|
458 schuur 1.22 if (p) {
459 nameSpace=p->nameSpace;
|
460 dj.gorey 1.31
|
461 schuur 1.22 if (p->providerType==ProviderType::ASSOCIATION)
462 className=((CIMAssociatorsRequestMessage*)p)->assocClass;
463 else className=p->className;
|
464 dj.gorey 1.31
|
465 schuur 1.27 if (p->providerType==ProviderType::METHOD)
466 method=((CIMInvokeMethodRequestMessage*)p)->methodName;
|
467 dj.gorey 1.31
468 ProviderName name(nameSpace,
|
469 schuur 1.28 className,
|
470 schuur 1.27 p->providerType,
471 method);
|
472 dj.gorey 1.31
|
473 schuur 1.22 // find provider manager
|
474 schuur 1.26 name = ProviderRegistrar().findProvider(name,false);
|
475 schuur 1.22 it=name.getInterfaceName();
476 }
477
478 else {
479 const CIMIndicationRequestMessage * p =
480 dynamic_cast<const CIMIndicationRequestMessage *>(message);
481 if (p) {
482 CIMIndicationRequestMessage *m=(CIMIndicationRequestMessage*)message;
483 it=m->providerModule.getProperty (m->providerModule.findProperty
484 ("InterfaceType")).getValue ().toString ();
|
485 schuur 1.19 }
|
486 dj.gorey 1.31
|
487 schuur 1.26 else switch (message->getType()) {
488 case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
489 case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
490 case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
|
491 dj.gorey 1.31 return NULL;
|
492 schuur 1.26 default:
493 it="C++Default";
|
494 schuur 1.19 }
|
495 chip 1.13 }
496
|
497 chip 1.11 // find provider manager for provider interface
|
498 chip 1.14 for(Uint32 i = 0, n = _providerManagers.size(); i < n; i++)
499 {
|
500 schuur 1.22 if (String::equalNoCase(it,_providerManagers[i]->getInterfaceName())) {
|
501 schuur 1.19 ProviderManagerContainer *pmc=_providerManagers[i];
|
502 dj.gorey 1.31 return pmc->getProviderManager();
|
503 chip 1.14 }
|
504 chip 1.1 }
|
505 schuur 1.22 ProviderManagerContainer *pmc=_providerManagers[0];
506 return pmc->getProviderManager();
|
507 chip 1.1 }
508
509 void ProviderManagerService::unload_idle_providers(void)
510 {
|
511 schuur 1.33 for(Uint32 i = 0, n = _providerManagers.size(); i < n; i++)
512 {
513 ProviderManagerContainer *pmc=_providerManagers[i];
514 pmc->getProviderManager()->unload_idle_providers();
515 }
|
516 chip 1.1 }
517
518 PEGASUS_NAMESPACE_END
|