(file) Return to ProviderManagerService.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2

  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.24.6.3 #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.24.6.2         _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.24.6.2 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.24.6.2 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.24.6.2     _repository=repository;
173                     
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.24.6.5          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.24.6.1     if (pm) {
392 chip   1.21             response = pm->processMessage(request);
393 schuur 1.19         }
394 schuur 1.24.6.1     
395                     else for (Uint32 i = 0, n = _providerManagers.size(); i < n; i++) {
396                        ProviderManagerContainer *pmc=_providerManagers[i];
397                        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                              response=pmc->getProviderManager()->processMessage(request); 
404                           }
405                           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                              response=pmc->getProviderManager()->processMessage(request); 
412                 	  }   
413                           break;
414                        case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE: {
415 schuur 1.24.6.1           Message  *resp=pmc->getProviderManager()->processMessage(request); 
416                 	  if (resp) response=resp; }
417                           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.24.6.1           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.24.6.2     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 schuur 1.24.6.2        
461 schuur 1.22            if (p->providerType==ProviderType::ASSOCIATION)
462                           className=((CIMAssociatorsRequestMessage*)p)->assocClass;
463                        else className=p->className;
464 schuur 1.23     
465 schuur 1.24.6.2        if (p->providerType==ProviderType::METHOD)
466                           method=((CIMInvokeMethodRequestMessage*)p)->methodName;
467                        
468                        ProviderName name(nameSpace, 
469                            className,
470                            p->providerType,
471                            method);
472                            
473 schuur 1.22            // find provider manager
474 schuur 1.24.6.1        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 schuur 1.24.6.1        
487                        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                           return NULL;
492                        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                 	   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.24.6.4     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
519 chip   1.9      

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2