(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.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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2