PEP 55 Update license on source files to current license text and date
[tpot/pegasus/.git] / src / Pegasus / ProviderManager / ProviderAdapter.cpp
1 //%2003////////////////////////////////////////////////////////////////////////
2 //
3 // 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 // IBM Corp.; EMC Corporation, The Open Group.
7 //
8 // Permission is hereby granted, free of charge, to any person obtaining a copy
9 // of this software and associated documentation files (the "Software"), to
10 // deal in the Software without restriction, including without limitation the
11 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12 // sell copies of the Software, and to permit persons to whom the Software is
13 // furnished to do so, subject to the following conditions:
14 // 
15 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
16 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
17 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
18 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
19 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 //
24 //==============================================================================
25 //
26 // Author: Markus Mueller (sedgewick_de@yahoo.de)
27 //
28 // Modified By: Adrian Schuur - schuur@de.ibm.com
29 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #include <Pegasus/Common/Config.h>
33 #include <Pegasus/Common/String.h>
34 #include <Pegasus/Common/System.h>
35 #include <Pegasus/Common/Destroyer.h>
36 #include <Pegasus/Common/Sharable.h>
37 #include <Pegasus/Common/IPC.h>
38
39 #include <Pegasus/Provider/CIMProvider.h>
40 #include <Pegasus/Provider/CIMOMHandle.h>
41 #include "ProviderAdapter.h"
42 #include <Pegasus/Config/ConfigManager.h>
43 #include <Pegasus/Common/MessageLoader.h> //l10n
44
45 #define PROVIDERADAPTER_DEBUG(X) X
46
47 PEGASUS_USING_STD;
48
49 PEGASUS_NAMESPACE_BEGIN
50
51 // HACK
52 static ProviderAdapterManager * pamgr;
53
54 //
55 //
56 //
57
58 ProviderAdapter::ProviderAdapter(const String & adapterName,
59                                  const String & providerLocation,
60                                  const String & providerName) :
61     _adapterName(adapterName), _providerLocation(providerLocation),
62     _providerName(providerName)
63 {
64 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapter::ProviderAdapter "<<
65      _adapterName<<" "<<_providerLocation<<"\n"; )
66 }
67
68 ProviderAdapter::~ProviderAdapter()
69 {
70 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapter::~ProviderAdapter\n"; )
71     ProviderAdapterManager::get_pamgr()->deleteAdapter(_adapterName);
72 }
73
74 const String & ProviderAdapter::getAdapterName() const {return _adapterName;}
75 const String & ProviderAdapter::getProviderName() const {return _providerLocation;}
76 CIMProvider * ProviderAdapter::getProvider(void) const {return _adapter;}
77
78 //
79 //
80 //
81
82 ProviderAdapterManager::ProviderAdapterManager(void)
83 {
84 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::ProviderAdapterManager\n"; )
85 }
86
87 ProviderAdapterManager::~ProviderAdapterManager(void)
88 {
89 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::~ProviderAdapterManager\n"; )
90     // unload all adapter modules
91     _listMutex.lock(pegasus_thread_self());
92
93     for(Uint32 i=0,n=_listOfAdapterLibs.size();i<n;i++)
94         System::unloadDynamicLibrary(_listOfAdapterLibs[i]);
95
96     _listOfAdapterNames.clear();
97     _listOfAdapterCounts.clear();
98     _listOfAdapterLibs.clear();
99     _listMutex.unlock();
100 }
101
102 ProviderAdapterManager * ProviderAdapterManager::get_pamgr()
103 {
104 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::get_pamgr()\n"; )
105      // HACK
106      if (pamgr == 0) pamgr = new ProviderAdapterManager();
107      return pamgr;
108 }
109
110 ProviderAdapter * ProviderAdapterManager::addAdapter(
111                                  const String & adapterName,
112                                  const String & adapterFileName,
113                                  const String & providerLocation,
114                                  const String & providerName)
115 {
116 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::addAdapter(): "
117        <<adapterName<<" "<<providerLocation<<" "<<providerName<<"\n"; )
118
119    _listMutex.lock(pegasus_thread_self());
120    ProviderAdapter *pad=NULL;
121    DynamicLibraryHandle adapter;
122
123    // lookup adapterName
124    Uint32 n = _listOfAdapterNames.size();
125
126    if (n == 0) {
127        PROVIDERADAPTER_DEBUG (
128           cerr<<"ProviderAdapterManager::addAdapter(): No entries -> load adapter\n";)
129        try {
130            adapter=loadAdapter(adapterName, adapterFileName);
131            pad=loadProvider(adapter,adapterName,providerLocation,providerName);
132            _listOfAdapterLibs.append(adapter);
133            _listOfAdapterNames.append(adapterName);
134            _listOfAdapterCounts.append(1);
135        }
136        catch (Exception & e) {
137             PROVIDERADAPTER_DEBUG (cerr << e.getMessage();)
138        }
139        _listMutex.unlock();
140        return pad;
141    }
142
143    for(Uint32 i=0,n=_listOfAdapterNames.size();i<n;i++)
144    {
145        if (String::equal(_listOfAdapterNames[i],adapterName))
146        {
147            PROVIDERADAPTER_DEBUG(
148              cerr<<"ProviderAdapterManager::addAdapter(): Found adapter entry\n";)
149            _listOfAdapterCounts[i]++;
150
151            adapter=_listOfAdapterLibs[i];
152            try {
153                pad=loadProvider(adapter,adapterName,providerLocation,providerName);
154            }
155            catch (Exception & e) {
156                PROVIDERADAPTER_DEBUG (cerr << e.getMessage();)
157            }
158            break;
159        }
160
161        // not found, so we have to load the adapter
162        if (i==n-1)
163        {
164            PROVIDERADAPTER_DEBUG (
165               cerr<<"ProviderAdapterManager::addAdapter(): New entry -> load adapter\n";)
166            try {
167                adapter=loadAdapter(adapterName, adapterFileName);
168                pad=loadProvider(adapter,adapterName,providerLocation,providerName);
169               _listOfAdapterLibs.append(adapter);
170               _listOfAdapterNames.append(adapterName);
171               _listOfAdapterCounts.append(1);
172            }
173            catch (Exception & e) {
174                PROVIDERADAPTER_DEBUG (cerr << e.getMessage();)
175            }
176        } // endif of not found 
177    } 
178    _listMutex.unlock();
179    return pad;
180 }
181
182 void  ProviderAdapterManager::deleteAdapter(const String & adapterName)
183 {
184 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::deleteAdapter()\n"; )
185     _listMutex.lock(pegasus_thread_self());
186
187     // lookup adapterName
188     for(Uint32 i=0,n=_listOfAdapterNames.size();i<n;i++)
189     {
190         if (String::equal(_listOfAdapterNames[i],adapterName))
191         {
192             if (--_listOfAdapterCounts[i] == 0)
193             {
194                 // call the terminate method of the adapter
195                System::unloadDynamicLibrary(_listOfAdapterLibs[i]);
196             }
197             break;
198         }
199     }
200     _listMutex.unlock();
201 }
202
203 void  ProviderAdapterManager::deleteAdapter(
204               const DynamicLibraryHandle & adapterlib)
205 {
206 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::deleteAdapter()\n"; )
207     _listMutex.lock(pegasus_thread_self());
208
209     // lookup adapterName
210     for(Uint32 i=0,n=_listOfAdapterLibs.size();i<n;i++)
211     {
212         if (_listOfAdapterLibs[i] == adapterlib)
213         {
214             --_listOfAdapterCounts[i];
215             if (_listOfAdapterCounts[i] == 0)
216             {
217                 // call the terminate method of the adapter
218                System::unloadDynamicLibrary(_listOfAdapterLibs[i]);
219             }
220             break;
221         }
222     }
223     _listMutex.unlock();
224 }
225
226 DynamicLibraryHandle ProviderAdapterManager::loadAdapter(
227                                  const String & adapterName,
228                                  const String & adapterFileName)
229 {
230 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::loadAdapter(): "<<
231                             adapterFileName<<"\n"; )
232     // dynamically load the provider library
233     DynamicLibraryHandle library =
234             System::loadDynamicLibrary(adapterFileName.getCString());
235
236     if (library == 0)
237     {
238         //l10n
239         
240         //String errorString =
241              //"Cannot load providerAdapter, error: " + System::dynamicLoadError();
242         //throw Exception("AdapterLoadFailure (" +
243               //adapterName + "):" + errorString);
244
245         throw Exception(MessageLoaderParms("ProviderManager.ProviderAdapter.CANNOT_LOAD_PROVIDER_ADAPTER",
246                                                                            "AdapterLoadFailure ($0):Cannot load providerAdapter, error: $1",
247                                                                            adapterName, 
248                                                                            System::dynamicLoadError()));
249     }
250     return library;
251 }
252
253 ProviderAdapter * ProviderAdapterManager::loadProvider(
254                                  const DynamicLibraryHandle & library,
255                                  const String & adapterName,
256                                  const String & providerLocation,
257                                  const String & providerName)
258 {
259 PROVIDERADAPTER_DEBUG( cerr << "ProviderAdapterManager::loadProvider(): "<<
260              providerLocation<<"\n"; )
261
262     // Calling entry point of Provider Adapter
263     ProviderAdapter*(*create_pa)(const String &,const String &) = 0;
264
265     create_pa=(ProviderAdapter*(*)(const String &,const String &))
266     System::loadDynamicSymbol(library,"PegasusCreateProviderAdapter");
267
268     if (create_pa!=0) {
269         ProviderAdapter *pa=create_pa(providerLocation,providerName);
270         if (pa==0)
271         {
272             System::unloadDynamicLibrary(library);
273             //l10n
274             //String errorString = "entry point returned null\n";
275             //throw Exception("AdapterLoadFailure (" +
276                    //adapterName + "):" + errorString);
277             throw Exception(MessageLoaderParms("ProviderManager.ProviderAdapter.ENTRY_POINT_RETURNED_NULL",
278                                                                            "AdapterLoadFailure ($0):entry point returned null\n",
279                                                                            adapterName));
280         }
281
282         // test primary interface
283         if (dynamic_cast<ProviderAdapter*>(pa) == 0)
284         {
285             System::unloadDynamicLibrary(library);
286             //l10n
287             //String errorString = "adapter is not a ProviderAdapter\n";
288             //throw Exception("AdapterLoadFailure (" +
289                    //adapterName + "):" + errorString);
290             throw Exception(MessageLoaderParms("ProviderManager.ProviderAdapter.ADAPTER_NOT_PA",
291                                                                            "AdapterLoadFailure ($0):adapter is not a ProviderAdapter\n",
292                                                                            adapterName));
293         }
294
295         // test secondary interface
296         if (dynamic_cast<CIMProvider*>(pa) == 0)
297         {
298             System::unloadDynamicLibrary(library);
299             //l10n
300             //String errorString = "adapter is not a CIMProvider\n";
301             //throw Exception("AdapterLoadFailure (" +
302                    //adapterName + "):" + errorString);
303
304             throw Exception(MessageLoaderParms("ProviderManager.ProviderAdapter.ADAPTER_NOT_CP",
305                                                                            "AdapterLoadFailure ($0):adapter is not a CIMProvider\n",
306                                                                            adapterName));
307         }
308
309         // save library address to unload
310         return pa;
311     }
312     else
313     {
314         //l10n
315         //String errorString = "CreateProviderAdapter missing.";
316        // throw Exception("AdapterLoadFailure (" +
317                //adapterName + "):" + errorString);
318
319        throw Exception(MessageLoaderParms("ProviderManager.ProviderAdapter.MISSING",
320                                                                           "AdapterLoadFailure ($0):CreateProviderAdapter missing.",
321                                                                           adapterName));
322     }
323
324
325 void ProviderAdapterManager::list(void)
326 {
327     _listMutex.lock(pegasus_thread_self());
328     for(Uint32 i=0,n=_listOfAdapterNames.size(); i<n; i++)
329     {
330         PEGASUS_STD(cout) << "Entry " << i << "  " << _listOfAdapterNames[i] <<
331         PEGASUS_STD(endl);
332     }
333     _listMutex.unlock();
334 }
335
336 PEGASUS_NAMESPACE_END