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
|