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
|