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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2