(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 kumpf    1.1  //
 35               //%/////////////////////////////////////////////////////////////////////////////
 36               
 37               #include "BasicProviderManagerRouter.h"
 38               
 39               #include <Pegasus/Common/Config.h>
 40 se.gupta 1.9  #include <Pegasus/Common/OperationContextInternal.h>
 41 kumpf    1.1  #include <Pegasus/Common/CIMMessage.h>
 42               #include <Pegasus/Common/Tracer.h>
 43 kumpf    1.12 #include <Pegasus/Common/FileSystem.h>
 44               #include <Pegasus/Config/ConfigManager.h>
 45 kumpf    1.1  #include <Pegasus/ProviderManager2/OperationResponseHandler.h>
 46               #include <Pegasus/ProviderManager2/ProviderManagerModule.h>
 47               #include <Pegasus/ProviderManager2/ProviderManager.h>
 48               
 49               // ProviderManager library names.  Should these be defined elsewhere?
 50               #if defined(PEGASUS_OS_OS400)
 51               # define LIBRARY_NAME_DEFAULTPM "QSYS/QYCMDFTPVM"
 52               # define LIBRARY_NAME_CMPIPM    "QSYS/QYCMCMPIPM"
 53               # define LIBRARY_NAME_JMPIPM    "QSYS/QYCMJMPIPM"
 54               #else
 55               # define LIBRARY_NAME_DEFAULTPM "DefaultProviderManager"
 56               # define LIBRARY_NAME_CMPIPM    "CMPIProviderManager"
 57               # define LIBRARY_NAME_JMPIPM    "JMPIProviderManager"
 58               #endif
 59               
 60               PEGASUS_NAMESPACE_BEGIN
 61               
 62               // BEGIN TEMP SECTION
 63               class ProviderManagerContainer
 64               {
 65               public:
 66 kumpf    1.1      ProviderManagerContainer()
 67                   : _manager(0)
 68                   {
 69                   }
 70               
 71                   ProviderManagerContainer(const ProviderManagerContainer & container)
 72                   : _manager(0)
 73                   {
 74                       *this = container;
 75                   }
 76               
 77                   ProviderManagerContainer(
 78                       const String& physicalName,
 79                       const String& logicalName,
 80                       const String& interfaceName,
 81                       PEGASUS_INDICATION_CALLBACK indicationCallback)
 82                   : _manager(0)
 83                   {
 84 kumpf    1.12         _physicalName = ConfigManager::getHomedPath(PEGASUS_DEST_LIB_DIR) +
 85 kumpf    1.13             String("/") + FileSystem::buildLibraryFileName(physicalName);
 86 kumpf    1.1  
 87                       _logicalName = logicalName;
 88                       _interfaceName = interfaceName;
 89               
 90                       _module = ProviderManagerModule(_physicalName);
 91                       _module.load();
 92               
 93                       _manager = _module.getProviderManager(_logicalName);
 94                       PEGASUS_ASSERT(_manager != 0);
 95               
 96                       _manager->setIndicationCallback(indicationCallback);
 97                   }
 98               
 99                   ~ProviderManagerContainer()
100                   {
101                       _module.unload();
102                   }
103               
104                   ProviderManagerContainer& operator=(
105                       const ProviderManagerContainer & container)
106                   {
107 kumpf    1.1          if (this == &container)
108                       {
109                           return *this;
110                       }
111               
112                       _logicalName = container._logicalName;
113                       _physicalName = container._physicalName;
114                       _interfaceName = container._interfaceName;
115               
116                       _module = container._module;
117                       _manager = container._manager;
118               
119                       return *this;
120                   }
121               
122                   ProviderManager* getProviderManager()
123                   {
124                       return _manager;
125                   }
126               
127                   const String& getPhysicalName() const
128 kumpf    1.1      {
129                       return _physicalName;
130                   }
131               
132                   const String& getLogicalName() const
133                   {
134                       return _logicalName;
135                   }
136               
137                   const String& getInterfaceName() const
138                   {
139                       return _interfaceName;
140                   }
141               
142               private:
143                   String _physicalName;
144                   String _logicalName;
145                   String _interfaceName;
146               
147                   ProviderManagerModule _module;
148                   ProviderManager* _manager;
149 kumpf    1.1  };
150               // END TEMP SECTION
151               
152               
153               PEGASUS_INDICATION_CALLBACK BasicProviderManagerRouter::_indicationCallback = 0;
154               
155               // Private, unimplemented constructor
156               BasicProviderManagerRouter::BasicProviderManagerRouter()
157               {
158               }
159               
160               BasicProviderManagerRouter::BasicProviderManagerRouter(
161                   PEGASUS_INDICATION_CALLBACK indicationCallback)
162               {
163                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
164                       "BasicProviderManagerRouter::BasicProviderManagerRouter");
165               
166                   _indicationCallback = indicationCallback;
167               
168                   PEG_METHOD_EXIT();
169               }
170 kumpf    1.1  
171               BasicProviderManagerRouter::~BasicProviderManagerRouter()
172               {
173                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
174                       "BasicProviderManagerRouter::~BasicProviderManagerRouter");
175                   PEG_METHOD_EXIT();
176               }
177               
178               Message* BasicProviderManagerRouter::processMessage(Message * message)
179               {
180                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
181                       "BasicProviderManagerRouter::processMessage");
182               
183                   CIMRequestMessage* request = dynamic_cast<CIMRequestMessage *>(message);
184                   PEGASUS_ASSERT(request != 0);
185               
186                   Message* response = 0;
187 schuur   1.7      Boolean remoteNameSpaceRequest=false;
188 kumpf    1.1  
189                   //
190                   // Retrieve the ProviderManager routing information
191                   //
192               
193                   CIMInstance providerModule;
194               
195                   if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) ||
196 kumpf    1.4          (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) ||
197               	(request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE))
198 kumpf    1.1      {
199                       // Provider information is in OperationContext
200                       ProviderIdContainer pidc = (ProviderIdContainer)
201                           request->operationContext.get(ProviderIdContainer::NAME);
202                       providerModule = pidc.getModule();
203 schuur   1.7  	remoteNameSpaceRequest=pidc.isRemoteNameSpace();
204 kumpf    1.1      }
205                   else if (dynamic_cast<CIMIndicationRequestMessage*>(request) != 0)
206                   {
207                       // Provider information is in CIMIndicationRequestMessage
208                       CIMIndicationRequestMessage* indReq =
209                           dynamic_cast<CIMIndicationRequestMessage*>(request);
210 se.gupta 1.9  		ProviderIdContainer pidc = indReq->operationContext.get(ProviderIdContainer::NAME); 
211                       providerModule = pidc.getModule(); 
212 kumpf    1.1      }
213                   else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE)
214                   {
215                       // Provider information is in CIMEnableModuleRequestMessage
216                       CIMEnableModuleRequestMessage* emReq =
217                           dynamic_cast<CIMEnableModuleRequestMessage*>(request);
218                       providerModule = emReq->providerModule;
219                   }
220                   else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE)
221                   {
222                       // Provider information is in CIMDisableModuleRequestMessage
223                       CIMDisableModuleRequestMessage* dmReq =
224                           dynamic_cast<CIMDisableModuleRequestMessage*>(request);
225                       providerModule = dmReq->providerModule;
226                   }
227 kumpf    1.6      else if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||
228               	     (request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE))
229 kumpf    1.1      {
230                       // This operation is not provider-specific
231                   }
232                   else
233                   {
234                       // Error: Unrecognized message type.
235                       PEGASUS_ASSERT(0);
236 kumpf    1.6          CIMResponseMessage* resp = request->buildResponse();
237 schuur   1.7          resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
238 kumpf    1.6              "Unknown message type.");
239 kumpf    1.1          response = resp;
240                   }
241               
242                   //
243                   // Forward the request to the appropriate ProviderManager(s)
244                   //
245               
246                   if (request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE)
247                   {
248                       // Send CIMStopAllProvidersRequestMessage to all ProviderManagers
249 kumpf    1.5          ReadLock tableLock(_providerManagerTableLock);
250 kumpf    1.1          for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
251                       {
252                           ProviderManagerContainer* pmc=_providerManagerTable[i];
253                           Message* resp = pmc->getProviderManager()->processMessage(request);
254                           if (resp)
255                           {
256 kumpf    1.3                  delete resp;
257 kumpf    1.1              }
258                       }
259 kumpf    1.3  
260 schuur   1.7          response = request->buildResponse();
261 kumpf    1.6      }
262                   else if(request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE)
263                   {
264 schuur   1.7          // Do not need to forward this request to in-process provider
265 kumpf    1.6          // managers
266 schuur   1.7          response = request->buildResponse();
267 kumpf    1.1      }
268                   else
269                   {
270                       // Retrieve the provider interface type
271                       String interfaceType;
272                       CIMValue itValue = providerModule.getProperty(
273                           providerModule.findProperty("InterfaceType")).getValue();
274                       itValue.get(interfaceType);
275               
276                       // Look up the appropriate ProviderManager by InterfaceType
277                       ProviderManager* pm = _lookupProviderManager(interfaceType);
278 schuur   1.7  	if (remoteNameSpaceRequest && !pm->supportsRemoteNameSpaces()) {
279                          CIMResponseMessage* resp = request->buildResponse();
280                          resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
281                              "Remote Namespace operations not supported for interface type "+interfaceType);
282                          response = resp;
283               	}
284                       else response = pm->processMessage(request);
285 kumpf    1.1      }
286               
287                   // preserve message key
288                   response->setKey(request->getKey());
289               
290                   // set HTTP method in response from request
291                   response->setHttpMethod(request->getHttpMethod());
292               
293                   PEG_METHOD_EXIT();
294                   return response;
295               }
296               
297               // ATTN: May need to add interfaceVersion parameter to further constrain lookup
298               ProviderManager* BasicProviderManagerRouter::_lookupProviderManager(
299                   const String& interfaceType)
300               {
301                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
302                       "BasicProviderManagerRouter::_lookupProviderManager");
303               
304                   //
305                   // Search for this InterfaceType in the table of loaded ProviderManagers
306 kumpf    1.1      //
307                   {
308                       ReadLock tableLock(_providerManagerTableLock);
309               
310                       // find provider manager for specified provider interface type
311                       for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
312                       {
313                           if (interfaceType == _providerManagerTable[i]->getInterfaceName())
314                           {
315                               ProviderManagerContainer* pmc=_providerManagerTable[i];
316                               PEG_METHOD_EXIT();
317                               return pmc->getProviderManager();
318                           }
319                       }
320                   }
321               
322                   //
323                   // Load the ProviderManager for this InterfaceType and add it to the table
324                   //
325                   {
326                       WriteLock tableLock(_providerManagerTableLock);
327 kumpf    1.1  
328                       // ATTN: this section is a temporary solution to populate the list of
329                       // enabled provider managers for a given distribution.  It includes
330                       // another temporary solution for converting a generic file name into
331                       // a file name useable by each platform.
332               
333 se.gupta 1.10 #if defined(PEGASUS_ENABLE_DEFAULT_PROVIDER_MANAGER)
334 kumpf    1.1          if (interfaceType == "C++Default")
335                       {
336                           ProviderManagerContainer* pmc = new ProviderManagerContainer(
337                               LIBRARY_NAME_DEFAULTPM, "DEFAULT", "C++Default",
338                               _indicationCallback);
339                           _providerManagerTable.append(pmc);
340                           return pmc->getProviderManager();
341                       }
342               #endif
343               
344 se.gupta 1.11 #if defined(PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER)
345 kumpf    1.1          if (interfaceType == "CMPI")
346                       {
347                           ProviderManagerContainer* pmc = new ProviderManagerContainer(
348                               LIBRARY_NAME_CMPIPM, "CMPI", "CMPI", _indicationCallback);
349                           _providerManagerTable.append(pmc);
350                           return pmc->getProviderManager();
351                       }
352               #endif
353               
354 se.gupta 1.11 #if defined(PEGASUS_ENABLE_JMPI_PROVIDER_MANAGER)
355 kumpf    1.1          if (interfaceType == "JMPI")
356                       {
357                           ProviderManagerContainer* pmc = new ProviderManagerContainer(
358                               LIBRARY_NAME_JMPIPM, "JMPI", "JMPI", _indicationCallback);
359                           _providerManagerTable.append(pmc);
360                           return pmc->getProviderManager();
361                       }
362               #endif
363                       // END TEMP SECTION
364                   }
365               
366                   // Error: ProviderManager not found for the specified interface type
367                   PEGASUS_ASSERT(0);
368                   PEG_METHOD_EXIT();
369                   return 0;
370               }
371               
372 kumpf    1.5  Boolean BasicProviderManagerRouter::hasActiveProviders()
373 kumpf    1.1  {
374                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
375 kumpf    1.5          "BasicProviderManagerRouter::hasActiveProviders");
376 kumpf    1.1  
377 kumpf    1.5      ReadLock tableLock(_providerManagerTableLock);
378 kumpf    1.1      for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
379                   {
380                       ProviderManagerContainer* pmc = _providerManagerTable[i];
381 kumpf    1.5          if (pmc->getProviderManager()->hasActiveProviders())
382                       {
383                           PEG_METHOD_EXIT();
384                           return true;
385                       }
386                   }
387               
388                   PEG_METHOD_EXIT();
389                   return false;
390               }
391               
392               void BasicProviderManagerRouter::unloadIdleProviders()
393               {
394                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
395                       "BasicProviderManagerRouter::unloadIdleProviders");
396               
397                   //
398                   // Save pointers to the ProviderManagerContainers so we don't hold the
399                   // _providerManagerTableLock while unloading idle providers
400                   //
401                   Array<ProviderManagerContainer*> pmcs;
402 kumpf    1.5      {
403                       ReadLock tableLock(_providerManagerTableLock);
404                       for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
405                       {
406                           pmcs.append(_providerManagerTable[i]);
407                       }
408                   }
409               
410                   //
411                   // Unload idle providers in each of the active ProviderManagers
412                   // _providerManagerTableLock while unloading idle providers
413                   //
414                   for (Uint32 i = 0; i < pmcs.size(); i++)
415                   {
416                       pmcs[i]->getProviderManager()->unloadIdleProviders();
417 kumpf    1.1      }
418               
419                   PEG_METHOD_EXIT();
420               }
421               
422               PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2