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

  1 karl  1.15 //%2005////////////////////////////////////////////////////////////////////////
  2 kumpf 1.1  //
  3 karl  1.14 // 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 kumpf 1.1  // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.14 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl  1.15 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 kumpf 1.1  //
 12            // Permission is hereby granted, free of charge, to any person obtaining a copy
 13            // of this software and associated documentation files (the "Software"), to
 14            // deal in the Software without restriction, including without limitation the
 15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16            // sell copies of the Software, and to permit persons to whom the Software is
 17            // furnished to do so, subject to the following conditions:
 18 karl  1.14 // 
 19 kumpf 1.1  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27            //
 28            //==============================================================================
 29            //
 30            // Author: Chip Vincent (cvincent@us.ibm.com)
 31            //         Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
 32            //
 33 se.gupta 1.9  // Modified By: Seema Gupta(gseema@in.ibm.com) for PEP135
 34 gs.keenan 1.16 //              Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)
 35 carolann.graves 1.17 //              Carol Ann Krug Graves, Hewlett-Packard Company
 36                      //                  (carolann_graves@hp.com)
 37 joyce.j         1.22 //              Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) for Bug#2619, #2685
 38 kumpf           1.1  //
 39                      //%/////////////////////////////////////////////////////////////////////////////
 40                      
 41                      #include "BasicProviderManagerRouter.h"
 42                      
 43                      #include <Pegasus/Common/Config.h>
 44 se.gupta        1.9  #include <Pegasus/Common/OperationContextInternal.h>
 45 kumpf           1.1  #include <Pegasus/Common/CIMMessage.h>
 46                      #include <Pegasus/Common/Tracer.h>
 47 kumpf           1.12 #include <Pegasus/Common/FileSystem.h>
 48                      #include <Pegasus/Config/ConfigManager.h>
 49 kumpf           1.1  #include <Pegasus/ProviderManager2/OperationResponseHandler.h>
 50                      #include <Pegasus/ProviderManager2/ProviderManagerModule.h>
 51                      #include <Pegasus/ProviderManager2/ProviderManager.h>
 52                      
 53                      // ProviderManager library names.  Should these be defined elsewhere?
 54                      #if defined(PEGASUS_OS_OS400)
 55 humberto        1.19 # define LIBRARY_NAME_DEFAULTPM "QSYS/QYCMPMDE00"
 56 kumpf           1.1  # define LIBRARY_NAME_CMPIPM    "QSYS/QYCMCMPIPM"
 57                      # define LIBRARY_NAME_JMPIPM    "QSYS/QYCMJMPIPM"
 58                      #else
 59                      # define LIBRARY_NAME_DEFAULTPM "DefaultProviderManager"
 60                      # define LIBRARY_NAME_CMPIPM    "CMPIProviderManager"
 61                      # define LIBRARY_NAME_JMPIPM    "JMPIProviderManager"
 62                      #endif
 63                      
 64                      PEGASUS_NAMESPACE_BEGIN
 65                      
 66                      // BEGIN TEMP SECTION
 67                      class ProviderManagerContainer
 68                      {
 69                      public:
 70                          ProviderManagerContainer()
 71                          : _manager(0)
 72                          {
 73                          }
 74                      
 75                          ProviderManagerContainer(const ProviderManagerContainer & container)
 76                          : _manager(0)
 77 kumpf           1.1      {
 78                              *this = container;
 79                          }
 80                      
 81                          ProviderManagerContainer(
 82                              const String& physicalName,
 83                              const String& logicalName,
 84                              const String& interfaceName,
 85 carolann.graves 1.17         PEGASUS_INDICATION_CALLBACK indicationCallback,
 86                              Boolean subscriptionInitComplete)
 87 kumpf           1.1      : _manager(0)
 88                          {
 89 gs.keenan       1.16 #if defined (PEGASUS_OS_VMS)
 90                              _physicalName = FileSystem::buildLibraryFileName(physicalName);
 91 humberto        1.19 #elif defined (PEGASUS_OS_OS400)
 92 chuck           1.20         _physicalName = physicalName;
 93 gs.keenan       1.16 #else
 94 kumpf           1.12         _physicalName = ConfigManager::getHomedPath(PEGASUS_DEST_LIB_DIR) +
 95 kumpf           1.13             String("/") + FileSystem::buildLibraryFileName(physicalName);
 96 gs.keenan       1.16 #endif
 97 kumpf           1.1  
 98                              _logicalName = logicalName;
 99                              _interfaceName = interfaceName;
100                      
101                              _module = ProviderManagerModule(_physicalName);
102                              _module.load();
103                      
104                              _manager = _module.getProviderManager(_logicalName);
105                              PEGASUS_ASSERT(_manager != 0);
106                      
107                              _manager->setIndicationCallback(indicationCallback);
108 carolann.graves 1.17 
109                              _manager->setSubscriptionInitComplete (subscriptionInitComplete);
110 kumpf           1.1      }
111                      
112                          ~ProviderManagerContainer()
113                          {
114                              _module.unload();
115 joyce.j         1.22         delete _manager;
116 kumpf           1.1      }
117                      
118                          ProviderManagerContainer& operator=(
119                              const ProviderManagerContainer & container)
120                          {
121                              if (this == &container)
122                              {
123                                  return *this;
124                              }
125                      
126                              _logicalName = container._logicalName;
127                              _physicalName = container._physicalName;
128                              _interfaceName = container._interfaceName;
129                      
130                              _module = container._module;
131                              _manager = container._manager;
132                      
133                              return *this;
134                          }
135                      
136                          ProviderManager* getProviderManager()
137 kumpf           1.1      {
138                              return _manager;
139                          }
140                      
141                          const String& getPhysicalName() const
142                          {
143                              return _physicalName;
144                          }
145                      
146                          const String& getLogicalName() const
147                          {
148                              return _logicalName;
149                          }
150                      
151                          const String& getInterfaceName() const
152                          {
153                              return _interfaceName;
154                          }
155                      
156                      private:
157                          String _physicalName;
158 kumpf           1.1      String _logicalName;
159                          String _interfaceName;
160                      
161                          ProviderManagerModule _module;
162                          ProviderManager* _manager;
163                      };
164                      // END TEMP SECTION
165                      
166                      
167                      PEGASUS_INDICATION_CALLBACK BasicProviderManagerRouter::_indicationCallback = 0;
168                      
169                      // Private, unimplemented constructor
170                      BasicProviderManagerRouter::BasicProviderManagerRouter()
171                      {
172                      }
173                      
174                      BasicProviderManagerRouter::BasicProviderManagerRouter(
175                          PEGASUS_INDICATION_CALLBACK indicationCallback)
176                      {
177                          PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
178                              "BasicProviderManagerRouter::BasicProviderManagerRouter");
179 kumpf           1.1  
180                          _indicationCallback = indicationCallback;
181 carolann.graves 1.17     _subscriptionInitComplete = false;
182 kumpf           1.1  
183                          PEG_METHOD_EXIT();
184                      }
185                      
186                      BasicProviderManagerRouter::~BasicProviderManagerRouter()
187                      {
188                          PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
189                              "BasicProviderManagerRouter::~BasicProviderManagerRouter");
190 joyce.j         1.21     /* Clean up the provider managers */
191                          for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
192                          {
193                               ProviderManagerContainer* pmc=_providerManagerTable[i];
194                               delete pmc;
195                          }
196 kumpf           1.1      PEG_METHOD_EXIT();
197                      }
198                      
199                      Message* BasicProviderManagerRouter::processMessage(Message * message)
200                      {
201                          PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
202                              "BasicProviderManagerRouter::processMessage");
203                      
204                          CIMRequestMessage* request = dynamic_cast<CIMRequestMessage *>(message);
205                          PEGASUS_ASSERT(request != 0);
206                      
207                          Message* response = 0;
208 schuur          1.7      Boolean remoteNameSpaceRequest=false;
209 kumpf           1.1  
210                          //
211                          // Retrieve the ProviderManager routing information
212                          //
213                      
214                          CIMInstance providerModule;
215                      
216                          if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) ||
217 kumpf           1.4          (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) ||
218                      	(request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE))
219 kumpf           1.1      {
220                              // Provider information is in OperationContext
221                              ProviderIdContainer pidc = (ProviderIdContainer)
222                                  request->operationContext.get(ProviderIdContainer::NAME);
223                              providerModule = pidc.getModule();
224 schuur          1.7  	remoteNameSpaceRequest=pidc.isRemoteNameSpace();
225 kumpf           1.1      }
226                          else if (dynamic_cast<CIMIndicationRequestMessage*>(request) != 0)
227                          {
228                              // Provider information is in CIMIndicationRequestMessage
229                              CIMIndicationRequestMessage* indReq =
230                                  dynamic_cast<CIMIndicationRequestMessage*>(request);
231 se.gupta        1.9  		ProviderIdContainer pidc = indReq->operationContext.get(ProviderIdContainer::NAME); 
232                              providerModule = pidc.getModule(); 
233 kumpf           1.1      }
234                          else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE)
235                          {
236                              // Provider information is in CIMEnableModuleRequestMessage
237                              CIMEnableModuleRequestMessage* emReq =
238                                  dynamic_cast<CIMEnableModuleRequestMessage*>(request);
239                              providerModule = emReq->providerModule;
240                          }
241                          else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE)
242                          {
243                              // Provider information is in CIMDisableModuleRequestMessage
244                              CIMDisableModuleRequestMessage* dmReq =
245                                  dynamic_cast<CIMDisableModuleRequestMessage*>(request);
246                              providerModule = dmReq->providerModule;
247                          }
248 kumpf           1.6      else if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||
249 carolann.graves 1.17              (request->getType() == 
250                                    CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE) ||
251 kumpf           1.6  	     (request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE))
252 kumpf           1.1      {
253                              // This operation is not provider-specific
254                          }
255                          else
256                          {
257                              // Error: Unrecognized message type.
258                              PEGASUS_ASSERT(0);
259 kumpf           1.6          CIMResponseMessage* resp = request->buildResponse();
260 schuur          1.7          resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
261 kumpf           1.6              "Unknown message type.");
262 kumpf           1.1          response = resp;
263                          }
264                      
265                          //
266                          // Forward the request to the appropriate ProviderManager(s)
267                          //
268                      
269 carolann.graves 1.17     if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||
270                              (request->getType() == 
271                               CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE))
272 kumpf           1.1      {
273 carolann.graves 1.17         _subscriptionInitComplete = true;
274                      
275                              // Send CIMStopAllProvidersRequestMessage or 
276                              // CIMSubscriptionInitCompleteRequestMessage to all ProviderManagers
277 kumpf           1.5          ReadLock tableLock(_providerManagerTableLock);
278 kumpf           1.1          for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
279                              {
280                                  ProviderManagerContainer* pmc=_providerManagerTable[i];
281                                  Message* resp = pmc->getProviderManager()->processMessage(request);
282                                  if (resp)
283                                  {
284 kumpf           1.3                  delete resp;
285 kumpf           1.1              }
286                              }
287 kumpf           1.3  
288 schuur          1.7          response = request->buildResponse();
289 kumpf           1.6      }
290                          else if(request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE)
291                          {
292 schuur          1.7          // Do not need to forward this request to in-process provider
293 kumpf           1.6          // managers
294 schuur          1.7          response = request->buildResponse();
295 kumpf           1.1      }
296                          else
297                          {
298                              // Retrieve the provider interface type
299                              String interfaceType;
300                              CIMValue itValue = providerModule.getProperty(
301                                  providerModule.findProperty("InterfaceType")).getValue();
302                              itValue.get(interfaceType);
303                      
304                              // Look up the appropriate ProviderManager by InterfaceType
305                              ProviderManager* pm = _lookupProviderManager(interfaceType);
306 schuur          1.7  	if (remoteNameSpaceRequest && !pm->supportsRemoteNameSpaces()) {
307                                 CIMResponseMessage* resp = request->buildResponse();
308                                 resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
309                                     "Remote Namespace operations not supported for interface type "+interfaceType);
310                                 response = resp;
311                      	}
312                              else response = pm->processMessage(request);
313 kumpf           1.1      }
314                      
315                          // preserve message key
316                          response->setKey(request->getKey());
317                      
318                          // set HTTP method in response from request
319                          response->setHttpMethod(request->getHttpMethod());
320                      
321                          PEG_METHOD_EXIT();
322                          return response;
323                      }
324                      
325                      // ATTN: May need to add interfaceVersion parameter to further constrain lookup
326                      ProviderManager* BasicProviderManagerRouter::_lookupProviderManager(
327                          const String& interfaceType)
328                      {
329                          PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
330                              "BasicProviderManagerRouter::_lookupProviderManager");
331                      
332                          //
333                          // Search for this InterfaceType in the table of loaded ProviderManagers
334 kumpf           1.1      //
335                          {
336                              ReadLock tableLock(_providerManagerTableLock);
337                      
338                              // find provider manager for specified provider interface type
339                              for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
340                              {
341                                  if (interfaceType == _providerManagerTable[i]->getInterfaceName())
342                                  {
343                                      ProviderManagerContainer* pmc=_providerManagerTable[i];
344                                      PEG_METHOD_EXIT();
345                                      return pmc->getProviderManager();
346                                  }
347                              }
348                          }
349                      
350                          //
351                          // Load the ProviderManager for this InterfaceType and add it to the table
352                          //
353                          {
354                              WriteLock tableLock(_providerManagerTableLock);
355 kumpf           1.1  
356                              // ATTN: this section is a temporary solution to populate the list of
357                              // enabled provider managers for a given distribution.  It includes
358                              // another temporary solution for converting a generic file name into
359                              // a file name useable by each platform.
360                      
361 se.gupta        1.10 #if defined(PEGASUS_ENABLE_DEFAULT_PROVIDER_MANAGER)
362 kumpf           1.1          if (interfaceType == "C++Default")
363                              {
364                                  ProviderManagerContainer* pmc = new ProviderManagerContainer(
365                                      LIBRARY_NAME_DEFAULTPM, "DEFAULT", "C++Default",
366 carolann.graves 1.17                 _indicationCallback, _subscriptionInitComplete);
367 kumpf           1.1              _providerManagerTable.append(pmc);
368                                  return pmc->getProviderManager();
369                              }
370                      #endif
371                      
372 se.gupta        1.11 #if defined(PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER)
373 kumpf           1.1          if (interfaceType == "CMPI")
374                              {
375                                  ProviderManagerContainer* pmc = new ProviderManagerContainer(
376 kumpf           1.18                 LIBRARY_NAME_CMPIPM, "CMPI", "CMPI", _indicationCallback,
377                                      _subscriptionInitComplete);
378 kumpf           1.1              _providerManagerTable.append(pmc);
379                                  return pmc->getProviderManager();
380                              }
381                      #endif
382                      
383 se.gupta        1.11 #if defined(PEGASUS_ENABLE_JMPI_PROVIDER_MANAGER)
384 kumpf           1.1          if (interfaceType == "JMPI")
385                              {
386                                  ProviderManagerContainer* pmc = new ProviderManagerContainer(
387 kumpf           1.18                 LIBRARY_NAME_JMPIPM, "JMPI", "JMPI", _indicationCallback,
388                                      _subscriptionInitComplete);
389 kumpf           1.1              _providerManagerTable.append(pmc);
390                                  return pmc->getProviderManager();
391                              }
392                      #endif
393                              // END TEMP SECTION
394                          }
395                      
396                          // Error: ProviderManager not found for the specified interface type
397                          PEGASUS_ASSERT(0);
398                          PEG_METHOD_EXIT();
399                          return 0;
400                      }
401                      
402 kumpf           1.5  Boolean BasicProviderManagerRouter::hasActiveProviders()
403 kumpf           1.1  {
404                          PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
405 kumpf           1.5          "BasicProviderManagerRouter::hasActiveProviders");
406 kumpf           1.1  
407 kumpf           1.5      ReadLock tableLock(_providerManagerTableLock);
408 kumpf           1.1      for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
409                          {
410                              ProviderManagerContainer* pmc = _providerManagerTable[i];
411 kumpf           1.5          if (pmc->getProviderManager()->hasActiveProviders())
412                              {
413                                  PEG_METHOD_EXIT();
414                                  return true;
415                              }
416                          }
417                      
418                          PEG_METHOD_EXIT();
419                          return false;
420                      }
421                      
422                      void BasicProviderManagerRouter::unloadIdleProviders()
423                      {
424                          PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
425                              "BasicProviderManagerRouter::unloadIdleProviders");
426                      
427                          //
428                          // Save pointers to the ProviderManagerContainers so we don't hold the
429                          // _providerManagerTableLock while unloading idle providers
430                          //
431                          Array<ProviderManagerContainer*> pmcs;
432 kumpf           1.5      {
433                              ReadLock tableLock(_providerManagerTableLock);
434                              for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
435                              {
436                                  pmcs.append(_providerManagerTable[i]);
437                              }
438                          }
439                      
440                          //
441                          // Unload idle providers in each of the active ProviderManagers
442                          // _providerManagerTableLock while unloading idle providers
443                          //
444                          for (Uint32 i = 0; i < pmcs.size(); i++)
445                          {
446                              pmcs[i]->getProviderManager()->unloadIdleProviders();
447 kumpf           1.1      }
448                      
449                          PEG_METHOD_EXIT();
450                      }
451                      
452                      PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2