(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.22 #include <Pegasus/ProviderManager/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                     #if defined(PEGASUS_OS_TYPE_WINDOWS)
 70                     _physicalName = physicalName + String(".dll");
 71                     #elif defined(PEGASUS_OS_HPUX) && defined(PEGASUS_PLATFORM_HPUX_PARISC_ACC)
 72                     _physicalName = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir"));
 73 kv.le  1.16         _physicalName.append(String("/lib") + physicalName + String(".sl"));
 74 chip   1.11         #elif defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_HPUX_PARISC_ACC)
 75                     _physicalName = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir"));
 76 kv.le  1.16         _physicalName.append(String("/lib") + physicalName + String(".so"));
 77 chip   1.11         #elif defined(PEGASUS_OS_OS400)
 78                     _physicalName = physicalName;
 79                     #else
 80                     _physicalName = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir"));
 81 kv.le  1.16         _physicalName.append(String("/lib") + physicalName + String(".so"));
 82 chip   1.11         #endif
 83 chip   1.3  
 84 chip   1.11         _logicalName = logicalName;
 85             
 86                     _interfaceName = interfaceName;
 87 chip   1.13 
 88                     _module = ProviderManagerModule(_physicalName);
 89             
 90                     _module.load();
 91             
 92                     _manager = _module.getProviderManager(_logicalName);
 93 chip   1.17 
 94                     PEGASUS_ASSERT(_manager != 0);
 95 chip   1.11     }
 96             
 97 chip   1.13     ~ProviderManagerContainer(void)
 98                 {
 99                     _module.unload();
100                 }
101             
102 chip   1.17     ProviderManagerContainer & operator=(const ProviderManagerContainer & container)
103                 {
104                     if(this == &container)
105                     {
106                         return(*this);
107                     }
108             
109                     _logicalName = container._logicalName;
110                     _physicalName = container._physicalName;
111                     _interfaceName = container._interfaceName;
112             
113                     _module = container._module;
114                     _manager = container._manager;
115             
116                     return(*this);
117                 }
118             
119 schuur 1.19     ProviderManager *getProviderManager(void)
120 chip   1.13     {
121 schuur 1.19         return _manager;
122 chip   1.13     }
123             
124 chip   1.17     const String & getPhysicalName(void) const
125 chip   1.3      {
126 chip   1.11         return(_physicalName);
127 chip   1.3      }
128             
129 chip   1.17     const String & getLogicalName(void) const
130 chip   1.11     {
131                     return(_logicalName);
132                 }
133 chip   1.3  
134 chip   1.17     const String & getInterfaceName(void) const
135 chip   1.11     {
136                     return(_interfaceName);
137 chip   1.3      }
138             
139 chip   1.11 private:
140                 String _physicalName;
141                 String _logicalName;
142                 String _interfaceName;
143 chip   1.3  
144 chip   1.13     ProviderManagerModule _module;
145                 ProviderManager * _manager;
146             
147 chip   1.11 };
148 chip   1.13 
149 schuur 1.19 static Array<ProviderManagerContainer*> _providerManagers;
150 chip   1.11 // END TEMP SECTION
151             
152             inline Boolean _isSupportedRequestType(const Message * message)
153             {
154                 // ATTN: needs implementation
155             
156                 // for now, assume all requests are valid
157             
158                 return(true);
159 chip   1.3  }
160             
161             inline Boolean _isSupportedResponseType(const Message * message)
162             {
163 chip   1.11     // ATTN: needs implementation
164             
165                 // for now, assume all responses are invalid
166 chip   1.3  
167 chip   1.11     return(false);
168 chip   1.3  }
169             
170 schuur 1.19 ProviderManagerService* ProviderManagerService::providerManagerService=NULL;
171             
172 chip   1.1  ProviderManagerService::ProviderManagerService(void)
173                 : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
174             {
175 schuur 1.19     providerManagerService=this;
176 chip   1.1  }
177             
178             ProviderManagerService::ProviderManagerService(ProviderRegistrationManager * providerRegistrationManager)
179                 : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
180             {
181 schuur 1.19     providerManagerService=this;
182 chip   1.10     SetProviderRegistrationManager(providerRegistrationManager);
183             
184 chip   1.11     // ATTN: this section is a temporary solution to populate the list of enabled
185                 // provider managers for a given distribution. it includes another temporary
186                 // solution for converting a generic file name into a file name useable by
187                 // each platform.
188             
189                 // BEGIN TEMP SECTION
190                 //#if defined(PEGASUS_OS_OS400)
191 chip   1.13     //_providerManagers.append(ProviderManagerContainer("QSYS/??????????", "INTERNAL", "INTERNAL"));
192 chip   1.11     //#else
193 chip   1.13     //_providerManager.append(ProviderManagerContainer("InternalProviderManager", "DEFAULT", "INTERNAL"));
194 chip   1.11     //#endif
195 chip   1.2  
196 chip   1.11     #if defined(ENABLE_DEFAULT_PROVIDER_MANAGER)
197                 #if defined(PEGASUS_OS_OS400)
198 schuur 1.19     _providerManagers.append(
199                    new ProviderManagerContainer("QSYS/QYCMDFTPVM", "DEFAULT", "C++Default"));
200 chip   1.11     #else
201 schuur 1.19     _providerManagers.append(
202                    new ProviderManagerContainer("DefaultProviderManager", "DEFAULT", "C++Default"));
203 chip   1.11     #endif
204                 #endif
205 chip   1.2  
206 chip   1.11     #if defined(ENABLE_CMPI_PROVIDER_MANAGER)
207                 #if defined(PEGASUS_OS_OS400)
208 schuur 1.19     _providerManagers.append(
209                    new ProviderManagerContainer("QSYS/QYCMCMPIPM", "CMPI", "CMPI"));
210 chip   1.11     #else
211 schuur 1.19     _providerManagers.append(
212                    new ProviderManagerContainer("CMPIProviderManager", "CMPI", "CMPI"));
213 chip   1.11     #endif
214                 #endif
215                 // END TEMP SECTION
216 chip   1.1  }
217             
218             ProviderManagerService::~ProviderManagerService(void)
219             {
220 schuur 1.19     providerManagerService=NULL;
221 chip   1.1  }
222             
223             Boolean ProviderManagerService::messageOK(const Message * message)
224             {
225                 PEGASUS_ASSERT(message != 0);
226             
227 chip   1.3      if(_isSupportedRequestType(message))
228 chip   1.1      {
229 chip   1.3          return(MessageQueueService::messageOK(message));
230 chip   1.1      }
231             
232 chip   1.3      return(false);
233 chip   1.1  }
234             
235             void ProviderManagerService::handleEnqueue(void)
236             {
237                 Message * message = dequeue();
238             
239                 handleEnqueue(message);
240             }
241             
242             void ProviderManagerService::handleEnqueue(Message * message)
243             {
244                 PEGASUS_ASSERT(message != 0);
245             
246                 AsyncLegacyOperationStart * asyncRequest;
247             
248                 if(message->_async != NULL)
249                 {
250                     asyncRequest = static_cast<AsyncLegacyOperationStart *>(message->_async);
251                 }
252                 else
253                 {
254 chip   1.1          asyncRequest = new AsyncLegacyOperationStart(
255                         get_next_xid(),
256                         0,
257                         this->getQueueId(),
258                         message,
259                         this->getQueueId());
260                 }
261             
262                 _handle_async_request(asyncRequest);
263             }
264             
265             void ProviderManagerService::_handle_async_request(AsyncRequest * request)
266             {
267                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
268                     "ProviderManagerService::_handle_async_request");
269             
270                 PEGASUS_ASSERT((request != 0) && (request->op != 0));
271             
272                 if(request->getType() == async_messages::ASYNC_LEGACY_OP_START)
273                 {
274                     request->op->processing();
275 chip   1.1  
276                     _incomingQueue.enqueue(request->op);
277             
278                     _thread_pool->allocate_and_awaken((void *)this, ProviderManagerService::handleCimOperation);
279                 }
280                 else
281                 {
282                     // pass all other operations to the default handler
283                     MessageQueueService::_handle_async_request(request);
284                 }
285             
286                 PEG_METHOD_EXIT();
287             
288                 return;
289             }
290             
291             
292             PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL ProviderManagerService::handleCimOperation(void * arg) throw()
293             {
294                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimOperation");
295             
296 chip   1.8      if(arg == 0)
297                 {
298                     // thread started with invalid argument.
299                     return(PEGASUS_THREAD_RETURN(1));
300                 }
301             
302 chip   1.1      // get the service from argument
303                 ProviderManagerService * service = reinterpret_cast<ProviderManagerService *>(arg);
304             
305                 if(service->_incomingQueue.size() == 0)
306                 {
307                     PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
308                         "ProviderManagerService::handleCimOperation() called with no op node in queue" );
309             
310                     PEG_METHOD_EXIT();
311             
312                     // thread started with no message in queue.
313                     return(PEGASUS_THREAD_RETURN(1));
314                 }
315             
316                 AsyncOpNode * op = service->_incomingQueue.dequeue();
317             
318 chip   1.8      if((op == 0) || (op->_request.count() == 0))
319 chip   1.1      {
320                     MessageQueue * queue = MessageQueue::lookup(op->_source_queue);
321             
322                     PEGASUS_ASSERT(queue != 0);
323             
324                     PEG_METHOD_EXIT();
325             
326                     // no request in op node
327                     return(PEGASUS_THREAD_RETURN(1));
328                 }
329             
330                 AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0));
331             
332 chip   1.8      if((request == 0) || (request->getType() != async_messages::ASYNC_LEGACY_OP_START))
333 chip   1.1      {
334                     // reply with NAK
335             
336                     PEG_METHOD_EXIT();
337             
338                     return(PEGASUS_THREAD_RETURN(0));
339                 }
340             
341 chip   1.8      try
342 chip   1.1      {
343 chip   1.8          Message * legacy = static_cast<AsyncLegacyOperationStart *>(request)->get_action();
344 chip   1.1  
345 chip   1.8          if(_isSupportedRequestType(legacy))
346 chip   1.1          {
347 chip   1.8              Destroyer<Message> xmessage(legacy);
348 chip   1.1  
349 chip   1.8              // Set the client's requested language into this service thread.
350                         // This will allow functions in this service to return messages
351                         // in the correct language.
352                         CIMMessage * msg = dynamic_cast<CIMMessage *>(legacy);
353             
354                         if(msg != 0)
355                         {
356                             AcceptLanguages * langs = new AcceptLanguages(msg->acceptLanguages);
357             
358                             Thread::setLanguages(langs);
359                         }
360                         else
361                         {
362                             Thread::clearLanguages();
363                         }
364 chip   1.1  
365                         service->handleCimRequest(op, legacy);
366 chip   1.3          }
367 chip   1.8      }
368                 catch(...)
369                 {
370                     // ATTN: log error
371 chip   1.1      }
372             
373                 PEG_METHOD_EXIT();
374             
375                 return(PEGASUS_THREAD_RETURN(0));
376             }
377             
378 chip   1.8  void ProviderManagerService::handleCimRequest(AsyncOpNode * op, const Message * message)
379 chip   1.1  {
380                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimRequest");
381             
382                 // ATTN: ensure message is a request???
383                 CIMMessage * request = dynamic_cast<CIMMessage *>(const_cast<Message *>(message));
384             
385                 // get request from op node
386                 AsyncRequest * async = static_cast<AsyncRequest *>(op->_request.next(0));
387             
388                 PEGASUS_ASSERT((request != 0) && (async != 0));
389             
390                 Message * response = 0;
391 schuur 1.22     String ifc;
392 schuur 1.23 
393 schuur 1.19     // get the responsible provider Manager
394 schuur 1.22     ProviderManager * pm = locateProviderManager(message,ifc);
395 schuur 1.24.6.1     if (pm) {
396 chip   1.21             response = pm->processMessage(request);
397 schuur 1.19         }
398 schuur 1.24.6.1     
399                     else for (Uint32 i = 0, n = _providerManagers.size(); i < n; i++) {
400                        ProviderManagerContainer *pmc=_providerManagers[i];
401                        switch (message->getType()) {
402                        case CIM_ENABLE_MODULE_REQUEST_MESSAGE: {
403                              CIMEnableModuleRequestMessage * request =
404                                 dynamic_cast<CIMEnableModuleRequestMessage*>(const_cast<Message*>(message));
405                              if (request->providerModule.getProperty(request->providerModule.findProperty
406                                  ("InterfaceType")).getValue().toString()==pmc->getInterfaceName())
407                              response=pmc->getProviderManager()->processMessage(request); 
408                           }
409                           break;
410                        case CIM_DISABLE_MODULE_REQUEST_MESSAGE: {
411                              CIMDisableModuleRequestMessage * request =
412                                 dynamic_cast<CIMDisableModuleRequestMessage*>(const_cast<Message*>(message));
413                              if (request->providerModule.getProperty(request->providerModule.findProperty
414                                  ("InterfaceType")).getValue().toString()==pmc->getInterfaceName())
415                              response=pmc->getProviderManager()->processMessage(request); 
416                 	  }   
417                           break;
418                        case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE: {
419 schuur 1.24.6.1           Message  *resp=pmc->getProviderManager()->processMessage(request); 
420                 	  if (resp) response=resp; }
421                           break;
422                        default:
423 schuur 1.23               CIMRequestMessage * req =
424                               dynamic_cast<CIMRequestMessage *>(const_cast<Message *>(message));
425                           CIMResponseMessage  *resp=new CIMResponseMessage(0,req->messageId,CIMException(),
426 schuur 1.22                  req->queueIds.copyAndPop());
427 schuur 1.23               response=resp;
428                           resp->synch_response(req);
429                           OperationResponseHandler handler(req, resp);
430 schuur 1.24.6.1           handler.setStatus(CIM_ERR_FAILED, "Unknown messagetype.");
431 schuur 1.23            }
432                     }
433 chip   1.13     
434 schuur 1.19         // preserve message key
435                     response->setKey(request->getKey());
436 chip   1.13     
437 schuur 1.19         // set HTTP method in response from request
438                     response->setHttpMethod(request->getHttpMethod());
439 chip   1.13     
440 schuur 1.19         AsyncLegacyOperationResult * async_result =
441                         new AsyncLegacyOperationResult(
442                         async->getKey(),
443                         async->getRouting(),
444                         op,
445                         response);
446 chip   1.13     
447 schuur 1.19         _complete_op_node(op, ASYNC_OPSTATE_COMPLETE, 0, 0);
448 chip   1.13     
449 schuur 1.19         PEG_METHOD_EXIT();
450                 }
451 chip   1.13     
452 schuur 1.23     ProviderManager* ProviderManagerService::locateProviderManager(const Message *message,
453 schuur 1.22                  String & it)
454 schuur 1.19     {
455 kumpf  1.24         CIMNamespaceName nameSpace;
456                     CIMName className;
457 chip   1.13     
458 schuur 1.22         const CIMOperationRequestMessage * p =
459                        dynamic_cast<const CIMOperationRequestMessage *>(message);
460 chip   1.13     
461 schuur 1.22         if (p) {
462                        nameSpace=p->nameSpace;
463                        if (p->providerType==ProviderType::ASSOCIATION)
464                           className=((CIMAssociatorsRequestMessage*)p)->assocClass;
465                        else className=p->className;
466 schuur 1.23     
467 schuur 1.22            ProviderName name(
468                            CIMObjectPath(String::EMPTY, nameSpace, className).toString(),
469                            String::EMPTY,
470                            String::EMPTY,
471                            String::EMPTY,
472                            p->providerType);
473                        // 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                 }
512                 
513                 PEGASUS_NAMESPACE_END
514 chip   1.9      

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2