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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2