00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00036 #include "OW_config.h"
00037 #include "OWBI1_ProviderIFC.hpp"
00038 #include "OW_SharedLibraryException.hpp"
00039 #include "OW_SharedLibraryLoader.hpp"
00040 #include "OW_Format.hpp"
00041 #include "OW_SignalScope.hpp"
00042 #include "OW_ConfigOpts.hpp"
00043 #include "OW_FileSystem.hpp"
00044 #include "OWBI1_ProxyProvider.hpp"
00045 #include "OW_NoSuchProviderException.hpp"
00046 #include "OW_Assertion.hpp"
00047 #include "OW_IntrusiveCountableBase.hpp"
00048 #include "OW_NonRecursiveMutex.hpp"
00049 #include "OW_NonRecursiveMutexLock.hpp"
00050 #include "OW_Condition.hpp"
00051 #include "OW_ExceptionIds.hpp"
00052 #include "OWBI1_ProviderEnvironmentIFC.hpp"
00053 #include "OWBI1_OperationContext.hpp"
00054 #include "OW_OperationContext.hpp"
00055 #include "OWBI1_InstanceProviderInfo.hpp"
00056 #include "OWBI1_SecondaryInstanceProviderInfo.hpp"
00057 #include "OWBI1_AssociatorProviderInfo.hpp"
00058 #include "OWBI1_MethodProviderInfo.hpp"
00059 #include "OWBI1_IndicationProviderInfo.hpp"
00060 #include "OWBI1_CIMOMHandleIFC.hpp"
00061 #include "OWBI1_Logger.hpp"
00062 #include "OWBI1_SessionLanguage.hpp"
00063 
00064 namespace OWBI1
00065 {
00066 
00067 
00068 
00069 OW_DECLARE_EXCEPTION(BI1ProviderIFC);
00070 OW_DEFINE_EXCEPTION_WITH_ID(BI1ProviderIFC);
00071 
00072 typedef BI1ProviderBaseIFC* (*ProviderCreationFunc)();
00073 typedef const char* (*versionFunc_t)();
00074 namespace
00075 {
00076    const OpenWBEM::String COMPONENT_NAME("ow.provider.cpp.ifc");
00077 
00078    class OperationContextWrapper : public OperationContext
00079    {
00080    public:
00081       OperationContextWrapper(OpenWBEM::OperationContext& oc)
00082          : m_oc(oc)
00083       {
00084       }
00090       virtual void removeData(const String& key)
00091       {
00092          m_oc.removeData(key.c_str());
00093       }
00094 
00100       virtual bool keyHasData(const String& key) const
00101       {
00102          return m_oc.keyHasData(key.c_str());
00103       }
00104 
00109       virtual void setStringData(const String& key, const String& str)
00110       {
00111          m_oc.setStringData(key.c_str(), str.c_str());
00112       }
00113 
00117       virtual String getStringData(const String& key) const
00118       {
00119          return m_oc.getStringData(key.c_str()).c_str();
00120       }
00121 
00125       virtual String getStringDataWithDefault(const String& key, const String& def = String() ) const
00126       {
00127          return m_oc.getStringDataWithDefault(key.c_str(), def.c_str()).c_str();
00128       }
00129 
00130    private:
00131       OpenWBEM::OperationContext& m_oc;
00132    };
00133 
00134    
00135    
00136    class ProvEnvWrapper : public OWBI1::ProviderEnvironmentIFC
00137    {
00138    public:
00139       ProvEnvWrapper(const OpenWBEM::ProviderEnvironmentIFCRef& env)
00140          : m_env(env)
00141          , m_context(new OperationContextWrapper(m_env->getOperationContext()))
00142       {
00143       }
00144 
00145       virtual CIMOMHandleIFCRef getCIMOMHandle() const
00146       {
00147          return CIMOMHandleIFCRef();
00148       }
00149       virtual LoggerRef getLogger(const String& componentName) const
00150       {
00151          return LoggerRef();
00152       }
00153       virtual String getConfigItem(const String &name, const String& defRetVal="") const
00154       {
00155          return m_env->getConfigItem(name.c_str(), defRetVal.c_str()).c_str();
00156       }
00157       virtual String getUserName() const
00158       {
00159          return "";
00160       }
00161       virtual OperationContext& getOperationContext()
00162       {
00163          return *m_context;
00164       }
00165       virtual SessionLanguageRef getSessionLanguage() const
00166       {
00167          return SessionLanguageRef();
00168       }
00169 
00170    private:
00171       OpenWBEM::ProviderEnvironmentIFCRef m_env;
00172       IntrusiveReference<OperationContext> m_context;
00173    };
00174 
00175    OWBI1::ProviderEnvironmentIFCRef wrapProvEnv(const OpenWBEM::ProviderEnvironmentIFCRef& env)
00176    {
00177       return OWBI1::ProviderEnvironmentIFCRef(new ProvEnvWrapper(env));
00178    }
00179 
00180    OpenWBEM::InstanceProviderInfo convertInstanceProviderInfo(const OWBI1::InstanceProviderInfo& in)
00181    {
00182       
00183       return OpenWBEM::InstanceProviderInfo();
00184    }
00185    OpenWBEM::SecondaryInstanceProviderInfo convertSecondaryInstanceProviderInfo(const OWBI1::SecondaryInstanceProviderInfo& in)
00186    {
00187       
00188       return OpenWBEM::SecondaryInstanceProviderInfo();
00189    }
00190 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00191    OpenWBEM::AssociatorProviderInfo convertAssociatorProviderInfo(const OWBI1::AssociatorProviderInfo& in)
00192    {
00193       
00194       return OpenWBEM::AssociatorProviderInfo();
00195    }
00196 #endif
00197    OpenWBEM::MethodProviderInfo convertMethodProviderInfo(const OWBI1::MethodProviderInfo& in)
00198    {
00199       
00200       return OpenWBEM::MethodProviderInfo();
00201    }
00202    OpenWBEM::IndicationProviderInfo convertIndicationProviderInfo(const OWBI1::IndicationProviderInfo& in)
00203    {
00204       
00205       return OpenWBEM::IndicationProviderInfo();
00206    }
00207 
00208 }
00209 const char* const BI1ProviderIFC::CREATIONFUNC = "createProvider";
00210 
00212 class BI1ProviderIFC::BI1ProviderInitializationHelper : public IntrusiveCountableBase
00213 {
00214 public:
00215 
00216    explicit BI1ProviderInitializationHelper(const BI1ProviderBaseIFCRef& provider)
00217       : m_initialized(false)
00218       , m_initializeFailed(false)
00219       , m_provider(provider)
00220    {
00221 
00222    }
00223 
00224    
00225    bool waitUntilInitialized() const
00226    {
00227       NonRecursiveMutexLock l(m_initializedGuard);
00228       while (!m_initialized && !m_initializeFailed)
00229       {
00230          m_initializedCond.wait(l);
00231       }
00232       return !m_initializeFailed;
00233    }
00234    
00235    void initialize(const ProviderEnvironmentIFCRef& env)
00236    {
00237       try
00238       {
00239          m_provider->initialize(env);
00240       }
00241       catch (...)
00242       {
00243          OpenWBEM::NonRecursiveMutexLock l(m_initializedGuard);
00244          m_initializeFailed = true;
00245          m_initializedCond.notifyAll();
00246          throw;
00247       }
00248 
00249       OpenWBEM::NonRecursiveMutexLock l(m_initializedGuard);
00250       m_initialized = true;
00251       m_initializedCond.notifyAll();
00252    }
00253 
00254    BI1ProviderBaseIFCRef getProvider() const
00255    {
00256       return m_provider;
00257    }
00258 private:
00259    bool m_initialized;
00260    bool m_initializeFailed;
00261    mutable OpenWBEM::NonRecursiveMutex m_initializedGuard;
00262    mutable OpenWBEM::Condition m_initializedCond;
00263    BI1ProviderBaseIFCRef m_provider;
00264 };
00265 
00267 BI1ProviderIFC::BI1ProviderIFC()
00268    : m_loadDone(false)
00269 {
00270 }
00272 BI1ProviderIFC::~BI1ProviderIFC()
00273 {
00274    try
00275    {
00276       ProviderMap::iterator it = m_provs.begin();
00277       while (it != m_provs.end())
00278       {
00279          it->second = 0;
00280          it++;
00281       }
00282    
00283       m_provs.clear();
00284       m_indicationExportProviders.clear();
00285       m_polledProviders.clear();
00286    }
00287    catch (...)
00288    {
00289       
00290    }
00291 }
00293 void
00294 BI1ProviderIFC::doInit(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00295    OpenWBEM::InstanceProviderInfoArray& i,
00296    OpenWBEM::SecondaryInstanceProviderInfoArray& si,
00297 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00298    OpenWBEM::AssociatorProviderInfoArray& a,
00299 #endif
00300    OpenWBEM::MethodProviderInfoArray& m,
00301    OpenWBEM::IndicationProviderInfoArray& ind)
00302 {
00303    loadProviders(env, i,
00304       si,
00305 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00306       a,
00307 #endif
00308       m,
00309       ind);
00310 }
00312 OpenWBEM::InstanceProviderIFCRef
00313 BI1ProviderIFC::doGetInstanceProvider(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00314    const char* provIdString)
00315 {
00316    BI1ProviderBaseIFCRef pProv = getProvider(env, provIdString);
00317    if (pProv)
00318    {
00319       BI1InstanceProviderIFC* pIP = pProv->getInstanceProvider();
00320       if (pIP)
00321       {
00322          OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00323             Format("OWBI1ProviderIFC found instance provider %1", provIdString));
00324          BI1InstanceProviderIFCRef ipRef(pProv.getLibRef(), pIP);
00325          return OpenWBEM::InstanceProviderIFCRef(new BI1InstanceProviderProxy(ipRef));
00326       }
00327       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), Format("Provider %1 is not an instance provider",
00328          provIdString));
00329    }
00330    OW_THROW(NoSuchProviderException, provIdString);
00331 }
00333 OpenWBEM::SecondaryInstanceProviderIFCRef
00334 BI1ProviderIFC::doGetSecondaryInstanceProvider(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00335    const char* provIdString)
00336 {
00337    BI1ProviderBaseIFCRef pProv = getProvider(env, provIdString);
00338    if (pProv)
00339    {
00340       BI1SecondaryInstanceProviderIFC* pIP = pProv->getSecondaryInstanceProvider();
00341       if (pIP)
00342       {
00343          OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00344             Format("OWBI1ProviderIFC found secondary instance provider %1", provIdString));
00345          BI1SecondaryInstanceProviderIFCRef ipRef(pProv.getLibRef(), pIP);
00346          return OpenWBEM::SecondaryInstanceProviderIFCRef(new BI1SecondaryInstanceProviderProxy(ipRef));
00347       }
00348       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), Format("Provider %1 is not a secondary instance provider",
00349          provIdString));
00350    }
00351    OW_THROW(NoSuchProviderException, provIdString);
00352 }
00354 OpenWBEM::IndicationExportProviderIFCRefArray
00355 BI1ProviderIFC::doGetIndicationExportProviders(const OpenWBEM::ProviderEnvironmentIFCRef&)
00356 {
00357    return m_indicationExportProviders;
00358    
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 }
00375 OpenWBEM::PolledProviderIFCRefArray
00376 BI1ProviderIFC::doGetPolledProviders(const OpenWBEM::ProviderEnvironmentIFCRef&)
00377 {
00378    return m_polledProviders;
00379    
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 }
00395 OpenWBEM::MethodProviderIFCRef
00396 BI1ProviderIFC::doGetMethodProvider(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00397    const char* provIdString)
00398 {
00399    BI1ProviderBaseIFCRef pProv = getProvider(env, provIdString);
00400    if (pProv)
00401    {
00402       BI1MethodProviderIFC* pMP = pProv->getMethodProvider();
00403       if (pMP)
00404       {
00405          OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), Format("OWBI1ProviderIFC found method provider %1",
00406             provIdString));
00407          BI1MethodProviderIFCRef mpRef(pProv.getLibRef(), pMP);
00408          return OpenWBEM::MethodProviderIFCRef(new BI1MethodProviderProxy(mpRef));
00409       }
00410       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), Format("Provider %1 is not a method provider",
00411          provIdString));
00412    }
00413    OW_THROW(NoSuchProviderException, provIdString);
00414 }
00415 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00416 
00417 OpenWBEM::AssociatorProviderIFCRef
00418 BI1ProviderIFC::doGetAssociatorProvider(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00419    const char* provIdString)
00420 {
00421    BI1ProviderBaseIFCRef pProv = getProvider(env, provIdString);
00422    if (pProv)
00423    {
00424       BI1AssociatorProviderIFC* pAP = pProv->getAssociatorProvider();
00425       if (pAP)
00426       {
00427          OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), Format("OWBI1ProviderIFC found associator provider %1",
00428             provIdString));
00429          BI1AssociatorProviderIFCRef apRef(pProv.getLibRef(), pAP);
00430          return OpenWBEM::AssociatorProviderIFCRef(new BI1AssociatorProviderProxy(apRef));
00431       }
00432       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), Format("Provider %1 is not an associator provider",
00433          provIdString));
00434    }
00435    OW_THROW(NoSuchProviderException, provIdString);
00436 }
00437 #endif
00438 
00439 OpenWBEM::IndicationProviderIFCRef
00440 BI1ProviderIFC::doGetIndicationProvider(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00441    const char* provIdString)
00442 {
00443    BI1ProviderBaseIFCRef pProv = getProvider(env, provIdString);
00444    if (pProv)
00445    {
00446       BI1IndicationProviderIFC* pAP = pProv->getIndicationProvider();
00447       if (pAP)
00448       {
00449          OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), Format("OWBI1ProviderIFC found indication provider %1",
00450             provIdString));
00451 
00452          IndicationProviderMap::const_iterator ci = m_indicationProviders.find(provIdString);
00453          if (ci != m_indicationProviders.end())
00454          {
00455             return ci->second;
00456          }
00457 
00458          BI1IndicationProviderIFCRef apRef(pProv.getLibRef(), pAP);
00459          OpenWBEM::IndicationProviderIFCRef rv(new BI1IndicationProviderProxy(apRef));
00460          
00461          m_indicationProviders.insert(IndicationProviderMap::value_type(provIdString, rv));
00462 
00463          return rv;
00464       }
00465       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), Format("Provider %1 is not an indication provider",
00466          provIdString));
00467    }
00468    OW_THROW(NoSuchProviderException, provIdString);
00469 }
00471 void
00472 BI1ProviderIFC::loadProviders(const OpenWBEM::ProviderEnvironmentIFCRef& env,
00473    OpenWBEM::InstanceProviderInfoArray& instanceProviderInfo,
00474    OpenWBEM::SecondaryInstanceProviderInfoArray& secondaryInstanceProviderInfo,
00475 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00476    OpenWBEM::AssociatorProviderInfoArray& associatorProviderInfo,
00477 #endif
00478    OpenWBEM::MethodProviderInfoArray& methodProviderInfo,
00479    OpenWBEM::IndicationProviderInfoArray& indicationProviderInfo)
00480 {
00481    MutexLock ml(m_guard);
00482    if (m_loadDone)
00483    {
00484       return;
00485    }
00486    m_loadDone = true;
00487 
00488    
00489 
00490    SharedLibraryLoaderRef ldr =
00491       SharedLibraryLoader::createSharedLibraryLoader();
00492    if (!ldr)
00493    {
00494       const char* msg = "OWBI1 provider ifc failed to get shared lib loader";
00495       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), msg);
00496       OW_THROW(BI1ProviderIFCException, msg);
00497    }
00498 
00499    OpenWBEM::StringArray paths = env->getMultiConfigItem(
00500       ConfigOpts::OWBI1IFC_PROV_LOCATION_opt, 
00501       String(OW_DEFAULT_OWBI1IFC_PROV_LOCATION).tokenize(OW_PATHNAME_SEPARATOR),
00502       OW_PATHNAME_SEPARATOR);
00503 
00504    for (OpenWBEM::StringArray::size_type i1 = 0; i1 < paths.size(); i1++)
00505    {
00506       OpenWBEM::StringArray dirEntries;
00507       if (!FileSystem::getDirectoryContents(paths[i1], dirEntries))
00508       {
00509          OpenWBEM::String msg(Format("OWBI1 provider ifc failed getting contents of directory: %1", paths[i1]));
00510          OW_LOG_INFO(env->getLogger(COMPONENT_NAME), msg);
00511       }
00512       for (size_t i = 0; i < dirEntries.size(); i++)
00513       {
00514          if (!dirEntries[i].endsWith(OW_SHAREDLIB_EXTENSION))
00515          {
00516             continue;
00517          }
00518          OpenWBEM::String libName = paths[i1];
00519          libName += OW_FILENAME_SEPARATOR;
00520          libName += dirEntries[i];
00521 
00522 #ifdef OW_DARWIN
00523          if (!FileSystem::isLink(libName))
00524          {
00525             continue;
00526          }
00527 #endif // OW_DARWIN
00528    
00529          
00530 
00531          SharedLibraryRef theLib = ldr->loadSharedLibrary(libName,
00532             env->getLogger(COMPONENT_NAME));
00533          if (!theLib)
00534          {
00535             OpenWBEM::String msg(Format("OWBI1 provider ifc failed to load library: %1", libName));
00536             OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), "****************************************");
00537             OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), msg);
00538             OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), "****************************************");
00539             OW_THROW(BI1ProviderIFCException, msg.c_str());
00540          }
00541 
00542          
00543          OpenWBEM::String providerid = dirEntries[i].substring(3, providerid.length() - (strlen(OW_SHAREDLIB_EXTENSION) + 3));
00544 
00545          BI1ProviderBaseIFCRef p = getProvider(env, providerid.c_str(),
00546             dontStoreProvider, dontInitializeProvider);
00547 
00548          if (!p)
00549          {
00550             OpenWBEM::String msg(Format("OWBI1 provider ifc: Libary %1 does not load", libName));
00551             OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "****************************************");
00552             OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), msg);
00553             OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), "****************************************");
00554             OW_THROW(BI1ProviderIFCException, msg.c_str());
00555          }
00556 
00557          BI1ProviderInitializationHelperRef p2;
00558          
00559          
00560          
00561          BI1PolledProviderIFC* p_polledProv = p->getPolledProvider();
00562          if (p_polledProv)
00563          {
00564             OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00565                Format("OWBI1 provider ifc loaded polled provider from lib: %1 - initializing", libName));
00566 
00567             if (!p2)
00568             {
00569                p2 = BI1ProviderInitializationHelperRef(new BI1ProviderInitializationHelper(p));
00570                p2->initialize(wrapProvEnv(env));
00571                m_provs.insert(std::make_pair(providerid, p2));
00572             }
00573             BI1PolledProviderIFCRef ipRef(theLib, p_polledProv);
00574             m_polledProviders.push_back(OpenWBEM::PolledProviderIFCRef(new BI1PolledProviderProxy(ipRef)));
00575          }
00576 
00577          BI1IndicationExportProviderIFC* p_indExpProv =
00578             p->getIndicationExportProvider();
00579          if (p_indExpProv)
00580          {
00581             OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00582                Format("OWBI1 provider ifc loaded indication export provider from lib: %1 - initializing", libName));
00583 
00584             if (!p2)
00585             {
00586                BI1ProviderInitializationHelperRef p2(new BI1ProviderInitializationHelper(p));
00587                p2->initialize(wrapProvEnv(env));
00588                m_provs.insert(std::make_pair(providerid, p2));
00589             }
00590             BI1IndicationExportProviderIFCRef iepRef(theLib, p_indExpProv);
00591             m_indicationExportProviders.push_back(OpenWBEM::IndicationExportProviderIFCRef(new BI1IndicationExportProviderProxy(iepRef)));
00592          }
00593 
00594          BI1InstanceProviderIFC* p_ip = p->getInstanceProvider();
00595          if (p_ip)
00596          {
00597             OWBI1::InstanceProviderInfo info;
00598             info.setProviderName(providerid.c_str());
00599             p_ip->getInstanceProviderInfo(info);
00600             instanceProviderInfo.push_back(convertInstanceProviderInfo(info));
00601          }
00602 
00603          BI1SecondaryInstanceProviderIFC* p_sip =
00604             p->getSecondaryInstanceProvider();
00605 
00606          if (p_sip)
00607          {
00608             OWBI1::SecondaryInstanceProviderInfo info;
00609             info.setProviderName(providerid.c_str());
00610             p_sip->getSecondaryInstanceProviderInfo(info);
00611             secondaryInstanceProviderInfo.push_back(convertSecondaryInstanceProviderInfo(info));
00612          }
00613 
00614 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00615          BI1AssociatorProviderIFC* p_ap = p->getAssociatorProvider();
00616          if (p_ap)
00617          {
00618             OWBI1::AssociatorProviderInfo info;
00619             info.setProviderName(providerid.c_str());
00620             p_ap->getAssociatorProviderInfo(info);
00621             associatorProviderInfo.push_back(convertAssociatorProviderInfo(info));
00622          }
00623 #endif
00624 
00625          BI1MethodProviderIFC* p_mp = p->getMethodProvider();
00626          if (p_mp)
00627          {
00628             OWBI1::MethodProviderInfo info;
00629             info.setProviderName(providerid.c_str());
00630             p_mp->getMethodProviderInfo(info);
00631             methodProviderInfo.push_back(convertMethodProviderInfo(info));
00632          }
00633          BI1IndicationProviderIFC* p_indp = p->getIndicationProvider();
00634          if (p_indp)
00635          {
00636             OWBI1::IndicationProviderInfo info;
00637             info.setProviderName(providerid.c_str());
00638             p_indp->getIndicationProviderInfo(info);
00639             indicationProviderInfo.push_back(convertIndicationProviderInfo(info));
00640          }
00641       }
00642    }
00643 }
00644 
00646 
00647 BI1ProviderBaseIFCRef
00648 BI1ProviderIFC::loadProvider(const OpenWBEM::String& libName, OpenWBEM::LoggerRef logger)
00649 {
00650    OpenWBEM::String provId = libName.substring(libName.lastIndexOf(OW_FILENAME_SEPARATOR)+1);
00651    
00652    provId = provId.substring(3, provId.length() - (strlen(OW_SHAREDLIB_EXTENSION) + 3));
00653 
00654    SharedLibraryLoaderRef ldr = SharedLibraryLoader::createSharedLibraryLoader();
00655    if (!ldr)
00656    {
00657       OW_LOG_ERROR(logger, "OWBI1 provider ifc FAILED to get shared lib loader");
00658       return BI1ProviderBaseIFCRef();
00659    }
00660 
00661    OW_LOG_DEBUG(logger, Format("BI1ProviderIFC::loadProvider loading library: %1", libName));
00662 
00663    SharedLibraryRef theLib = ldr->loadSharedLibrary(libName, logger);
00664 
00665    versionFunc_t versFunc;
00666    if (!theLib->getFunctionPointer("getOWVersion", versFunc))
00667    {
00668       OW_LOG_ERROR(logger, Format("OWBI1 provider ifc failed getting function pointer to \"getOWVersion\" from library %1.", libName));
00669       return BI1ProviderBaseIFCRef();
00670    }
00671    const char* strVer = (*versFunc)();
00672    if (strcmp(strVer, OW_VERSION))
00673    {
00674       OW_LOG_ERROR(logger, "OWBI1 provider ifc got invalid version from provider");
00675       OW_LOG_ERROR(logger, Format("OWBI1 provider ifc version: %1  provider version: %2  library: %3",
00676                OW_VERSION, strVer, libName));
00677       return BI1ProviderBaseIFCRef();
00678    }
00679 
00680    ProviderCreationFunc createProvider;
00681    OpenWBEM::String creationFuncName = OpenWBEM::String(CREATIONFUNC) + provId;
00682    if (!theLib->getFunctionPointer(creationFuncName, createProvider))
00683    {
00684       OW_LOG_ERROR(logger, Format("OWBI1 provider ifc: Libary %1 does not contain %2 function.",
00685          libName, creationFuncName));
00686       return BI1ProviderBaseIFCRef();
00687    }
00688 
00689    BI1ProviderBaseIFC* pProv = (*createProvider)();
00690 
00691    if (!pProv)
00692    {
00693       OW_LOG_ERROR(logger, Format("OWBI1 provider ifc: Libary %1 -"
00694          " %2 returned null provider. Not loaded.", libName, creationFuncName));
00695       return BI1ProviderBaseIFCRef();
00696    }
00697 
00698    BI1ProviderBaseIFCRef rval(theLib, pProv);
00699 
00700    OW_LOG_DEBUG(logger, Format("OWBI1 provider ifc successfully loaded library %1 for provider %2", libName, provId));
00701 
00702    return rval;
00703 }
00704 
00706 BI1ProviderBaseIFCRef
00707 BI1ProviderIFC::getProvider(
00708    const OpenWBEM::ProviderEnvironmentIFCRef& env, const char* provIdString,
00709    StoreProviderFlag storeP, InitializeProviderFlag initP)
00710 {
00711    OW_ASSERT((initP == initializeProvider && storeP == storeProvider) || (initP == dontInitializeProvider && storeP == dontStoreProvider));
00712 
00713    MutexLock ml(m_guard);
00714 
00715    OpenWBEM::String provId(provIdString);
00716    ProviderMap::iterator it = m_provs.find(provId);
00717    if (it != m_provs.end())
00718    {
00719       
00720       BI1ProviderInitializationHelperRef prov(it->second);
00721       
00722       ml.release();
00723 
00724       
00725       if (prov->waitUntilInitialized())
00726       {
00727          return prov->getProvider();
00728       }
00729       else
00730       {
00731          
00732          return BI1ProviderBaseIFCRef();
00733       }
00734    }
00735 
00736    OpenWBEM::String libName;
00737    BI1ProviderBaseIFCRef rval;
00738 
00739    OpenWBEM::StringArray paths = env->getMultiConfigItem(
00740       ConfigOpts::OWBI1IFC_PROV_LOCATION_opt, 
00741       String(OW_DEFAULT_OWBI1IFC_PROV_LOCATION).tokenize(OW_PATHNAME_SEPARATOR),
00742       OW_PATHNAME_SEPARATOR);
00743 
00744    for (OpenWBEM::StringArray::size_type i = 0; i < paths.size(); i++)
00745    {
00746       libName = paths[i];
00747       libName += OW_FILENAME_SEPARATOR;
00748       libName += "lib";
00749       libName += provId;
00750       libName += OW_SHAREDLIB_EXTENSION;
00751 
00752       if (!FileSystem::exists(libName))
00753       {
00754          continue;
00755       }
00756 
00757       rval = loadProvider(libName, env->getLogger(COMPONENT_NAME));
00758 
00759       if (rval)
00760       {
00761          break;
00762       }
00763 
00764    }
00765 
00766    if (!rval)
00767    {
00768       OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), 
00769          Format("OWBI1 provider ifc failed to load library: %1 for provider id %2. Skipping.", libName, provId));
00770       return rval;
00771    }
00772 
00773    if (initP == initializeProvider && storeP == storeProvider)
00774    {
00775       BI1ProviderInitializationHelperRef provInitHelper(new BI1ProviderInitializationHelper(rval));
00776 
00777       m_provs[provId] = provInitHelper;
00778       
00779       
00780       ml.release();
00781 
00782       OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00783          Format("OWBI1 provider ifc calling initialize for provider %1", provId));
00784 
00785       try
00786       {
00787          provInitHelper->initialize(wrapProvEnv(env)); 
00788       }
00789       catch (...)
00790       {
00791          
00792          MutexLock lock(m_guard);
00793          m_provs.erase(provId);
00794          throw;
00795       }
00796 
00797       OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00798          Format("OWBI1 provider ifc: provider %1 loaded and initialized", provId));
00799 
00800    }
00801    else
00802    {
00803       OW_LOG_DEBUG(env->getLogger(COMPONENT_NAME), 
00804          Format("OWBI1 provider ifc: provider %1 loaded but not initialized", provId));
00805    }
00806 
00807    return rval;
00808 }
00810 void
00811 BI1ProviderIFC::doUnloadProviders(const OpenWBEM::ProviderEnvironmentIFCRef& env)
00812 {
00813    OpenWBEM::String timeWindow = env->getConfigItem(ConfigOpts::OWBI1IFC_PROV_TTL_opt, OW_DEFAULT_OWBI1IFC_PROV_TTL);
00814    Int32 iTimeWindow;
00815    try
00816    {
00817       iTimeWindow = timeWindow.toInt32();
00818    }
00819    catch (const StringConversionException&)
00820    {
00821       iTimeWindow = String(OW_DEFAULT_OWBI1IFC_PROV_TTL).toInt32();
00822    }
00823    if (iTimeWindow < 0)
00824    {
00825       return;
00826    }
00827    DateTime dt;
00828    dt.setToCurrent();
00829    OpenWBEM::MutexLock l(m_guard);
00830    for (ProviderMap::iterator iter = m_provs.begin();
00831         iter != m_provs.end();)
00832    {
00833       DateTime provDt = iter->second->getProvider()->getLastAccessTime();
00834       provDt.addMinutes(iTimeWindow);
00835       if (provDt < dt && iter->second->getProvider()->canUnload())
00836       {
00837          OW_LOG_INFO(env->getLogger(COMPONENT_NAME), Format("Unloading Provider %1", iter->first));
00838          iter->second = 0;
00839          m_provs.erase(iter++);
00840          continue;
00841       }
00842 
00843       ++iter;
00844    }
00845 }
00846 
00847 void BI1ProviderIFC::doShuttingDown(const OpenWBEM::ProviderEnvironmentIFCRef& env)
00848 {
00849    
00850    
00851    OpenWBEM::MutexLock l(m_guard);
00852    ProviderMap provsCopy(m_provs);
00853    l.release();
00854 
00855    ProviderEnvironmentIFCRef bi1env = wrapProvEnv(env);
00856    ProviderMap::iterator it, itend = provsCopy.end();
00857    for (it = provsCopy.begin(); it != itend; ++it)
00858    {
00859       try
00860       {
00861          it->second->getProvider()->shuttingDown(bi1env);
00862       }
00863       catch (Exception& e)
00864       {
00865          OW_LOG_ERROR(env->getLogger(COMPONENT_NAME), Format("Caught exception while calling shuttingDown() on provider: %1", e));
00866       }
00867    }
00868 
00869 }
00870 
00871 } 
00872 
00873 OW_PROVIDERIFCFACTORY(OWBI1::BI1ProviderIFC, owowbi1provifc)
00874