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 "OW_ProviderManager.hpp"
00038 #include "OW_ProviderProxies.hpp"
00039 #include "OW_Format.hpp"
00040 #include "OW_CppPolledProviderIFC.hpp"
00041 #include "OW_CppIndicationExportProviderIFC.hpp"
00042 #include "OW_Assertion.hpp"
00043 #include "OW_CIMValue.hpp"
00044 #include "OW_CIMQualifier.hpp"
00045 #include "OW_CIMClass.hpp"
00046 #include "OW_CIMMethod.hpp"
00047 #include "OW_CIMProperty.hpp"
00048 #include "OW_CppProviderIFC.hpp"
00049 #include "OW_OperationContext.hpp"
00050 #include "OW_Platform.hpp"
00051 #include "OW_RepositoryIFC.hpp"
00052 #include "OW_ServiceIFCNames.hpp"
00053 #include "OW_ConfigOpts.hpp"
00054 
00055 namespace OW_NAMESPACE
00056 {
00057 
00058 String ProviderManager::COMPONENT_NAME("ow.owcimomd.ProviderManager");
00059 
00061 String
00062 ProviderManager::getName() const
00063 {
00064    return ServiceIFCNames::ProviderManager;
00065 }
00067 void ProviderManager::load(const ProviderIFCLoaderRef& IFCLoader, const ServiceEnvironmentIFCRef& env)
00068 {
00069    IFCLoader->loadIFCs(m_IFCArray);
00070 
00071    
00072    if (env->getConfigItem(ConfigOpts::DISABLE_CPP_PROVIDER_INTERFACE_opt, OW_DEFAULT_DISABLE_CPP_PROVIDER_INTERFACE) != "true")
00073    {
00074       
00075       
00076       ProviderIFCBaseIFCRef::element_type cpppi(new CppProviderIFC);
00077       
00078       m_IFCArray.push_back(ProviderIFCBaseIFCRef(SharedLibraryRef(0), cpppi));
00079    }
00080 }
00081 
00083 void ProviderManager::shutdown()
00084 {
00085    MutexLock lock(m_guard);
00086    
00087    m_registeredInstProvs.clear();
00088    m_registeredSecInstProvs.clear();
00089 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00090    m_registeredAssocProvs.clear();
00091 #endif
00092    m_registeredMethProvs.clear();
00093    m_registeredPropProvs.clear();
00094    m_registeredIndProvs.clear();
00095    m_IFCArray.clear();
00096 
00097    m_env = 0;
00098 }
00099 
00100 namespace
00101 {
00103 class ProviderEnvironmentServiceEnvironmentWrapper : public ProviderEnvironmentIFC
00104 {
00105 public:
00106    ProviderEnvironmentServiceEnvironmentWrapper(ServiceEnvironmentIFCRef env_)
00107       : env(env_)
00108       , m_context()
00109    {}
00110    virtual CIMOMHandleIFCRef getCIMOMHandle() const
00111    {
00112       return env->getCIMOMHandle(m_context);
00113    }
00114    
00115    virtual CIMOMHandleIFCRef getRepositoryCIMOMHandle() const
00116    {
00117       return env->getCIMOMHandle(m_context, ServiceEnvironmentIFC::E_BYPASS_PROVIDERS);
00118    }
00119    
00120    virtual RepositoryIFCRef getRepository() const
00121    {
00122       return env->getRepository();
00123    }
00124    virtual LoggerRef getLogger() const
00125    {
00126       return env->getLogger();
00127    }
00128    virtual LoggerRef getLogger(const String& componentName) const
00129    {
00130       return env->getLogger(componentName);
00131    }
00132    virtual String getConfigItem(const String &name, const String& defRetVal="") const
00133    {
00134       return env->getConfigItem(name, defRetVal);
00135    }
00136    virtual StringArray getMultiConfigItem(const String &itemName, 
00137       const StringArray& defRetVal, const char* tokenizeSeparator = 0) const
00138    {
00139       return env->getMultiConfigItem(itemName, defRetVal, tokenizeSeparator);
00140    }
00141    virtual String getUserName() const
00142    {
00143       return Platform::getCurrentUserName();
00144    }
00145    virtual OperationContext& getOperationContext()
00146    {
00147       return m_context;
00148    }
00149    virtual ProviderEnvironmentIFCRef clone() const
00150    {
00151       return ProviderEnvironmentIFCRef(new ProviderEnvironmentServiceEnvironmentWrapper(env));
00152    }
00153 private:
00154    ServiceEnvironmentIFCRef env;
00155    mutable OperationContext m_context;
00156 };
00157 
00158 } 
00159 
00161 void ProviderManager::shuttingDown()
00162 {
00163    ProviderEnvironmentIFCRef penv = ProviderEnvironmentIFCRef(
00164       new ProviderEnvironmentServiceEnvironmentWrapper(m_env));
00165 
00166    size_t const n = m_IFCArray.size();
00167    for (size_t i = 0; i < n; ++i)
00168    {
00169       m_IFCArray[i]->shuttingDown(penv);
00170    }
00171 }
00172 
00173 namespace {
00175 void registerProviderInfo(
00176    const ProviderEnvironmentIFCRef& env,
00177    const String& name_,
00178    const ProviderIFCBaseIFCRef& ifc,
00179    const String& providerName,
00180    ProviderManager::ProvRegMap_t& regMap)
00181 {
00182    String name(name_);
00183    name.toLowerCase();
00184    
00185    ProviderManager::ProvRegMap_t::const_iterator ci = regMap.find(name);
00186    if (ci != regMap.end())
00187    {
00188       OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format("More than one provider is registered to instrument class (%1). %2::%3 and %4::%5",
00189          name, ci->second.ifc->getName(), ci->second.provName, ifc->getName(), providerName));
00190       return;
00191    }
00192    OW_LOG_DEBUG(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Registering provider %1::%2 for %3", ifc->getName(), providerName, name));
00193    
00194    ProviderManager::ProvReg reg;
00195    reg.ifc = ifc;
00196    reg.provName = providerName;
00197    regMap.insert(std::make_pair(name, reg));
00198 }
00199 
00201 
00202 
00203 
00204 void registerProviderInfo(
00205    const ProviderEnvironmentIFCRef& env,
00206    const String& name_,
00207    const ProviderIFCBaseIFCRef& ifc,
00208    const String& providerName,
00209    ProviderManager::MultiProvRegMap_t& regMap)
00210 {
00211    String name(name_);
00212    name.toLowerCase();
00213    OW_LOG_DEBUG(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Registering provider %1::%2 for %3", ifc->getName(), providerName, name));
00214    
00215    ProviderManager::ProvReg reg;
00216    reg.ifc = ifc;
00217    reg.provName = providerName;
00218    regMap.insert(std::make_pair(name, reg));
00219 }
00220 
00222 
00223 void processProviderClassExtraInfo(
00224    const ProviderEnvironmentIFCRef& env,
00225    const String& name,
00226    const StringArray& extra,
00227    const ProviderIFCBaseIFCRef& ifc,
00228    const String& providerName,
00229    ProviderManager::ProvRegMap_t& regMap)
00230 {
00231    if (extra.empty())
00232    {
00233       registerProviderInfo(env, name, ifc, providerName, regMap);
00234    }
00235    else
00236    {
00237       for (size_t i = 0; i < extra.size(); ++i)
00238       {
00239          String extraName = extra[i];
00240          if (extraName.empty())
00241          {
00242             OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Provider sub-name is "
00243                "empty for %1 by provider %2::%3",
00244                name, ifc->getName(), providerName));
00245             continue;
00246          }
00247          registerProviderInfo(env, name + "/" + extraName, ifc, providerName, regMap);
00248       }
00249    }
00250 }
00252 
00253 void processProviderClassExtraInfo(
00254    const ProviderEnvironmentIFCRef& env,
00255    const String& name,
00256    const StringArray& extra,
00257    const ProviderIFCBaseIFCRef& ifc,
00258    const String& providerName,
00259    ProviderManager::MultiProvRegMap_t& regMap)
00260 {
00261    if (!extra.empty())
00262    {
00263       
00264       registerProviderInfo(env, name + "/*", ifc, providerName, regMap);
00265       for (size_t i = 0; i < extra.size(); ++i)
00266       {
00267          String extraName = extra[i];
00268          if (extraName.empty())
00269          {
00270             OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Provider sub-name is "
00271                "empty for %1 by provider %2::%3",
00272                name, ifc->getName(), providerName));
00273             continue;
00274          }
00275          registerProviderInfo(env, name + '/' + extraName, ifc, providerName, regMap);
00276       }
00277    }
00278    else
00279    {
00280       
00281       registerProviderInfo(env, name, ifc, providerName, regMap);
00282    }
00283 }
00285 template <typename ClassInfoT>
00286 inline String getClassName(const ClassInfoT& classInfo)
00287 {
00288    return classInfo.className;
00289 }
00290 inline String getClassName(const IndicationProviderInfoEntry& classInfo)
00291 {
00292    return classInfo.indicationName;
00293 }
00295 template <typename RegMapT, typename ClassInfoT>
00296 void processProviderClassInfo(
00297    const ProviderEnvironmentIFCRef& env,
00298    const ClassInfoT& classInfo,
00299    const ProviderIFCBaseIFCRef& ifc,
00300    const String& providerName,
00301    RegMapT& regMap)
00302 {
00303    if (classInfo.namespaces.empty())
00304    {
00305       registerProviderInfo(env, getClassName(classInfo), ifc, providerName, regMap);
00306    }
00307    else
00308    {
00309       for (size_t l = 0; l < classInfo.namespaces.size(); ++l)
00310       {
00311          String ns = classInfo.namespaces[l];
00312          if (ns.empty())
00313          {
00314             OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Provider namespace is "
00315                "empty for class %1 by provider %2::%3",
00316                getClassName(classInfo), ifc->getName(), providerName));
00317             continue;
00318          }
00319          String name = ns + ":" + getClassName(classInfo);
00320          registerProviderInfo(env, name, ifc, providerName, regMap);
00321       }
00322    }
00323 }
00325 void processProviderClassInfo(
00326    const ProviderEnvironmentIFCRef& env,
00327    const MethodProviderInfo::ClassInfo& classInfo,
00328    const ProviderIFCBaseIFCRef& ifc,
00329    const String& providerName,
00330    ProviderManager::ProvRegMap_t& regMap)
00331 {
00332    if (classInfo.namespaces.empty())
00333    {
00334       processProviderClassExtraInfo(env, classInfo.className, classInfo.methods, ifc, providerName, regMap);
00335    }
00336    else
00337    {
00338       for (size_t l = 0; l < classInfo.namespaces.size(); ++l)
00339       {
00340          String ns = classInfo.namespaces[l];
00341          if (ns.empty())
00342          {
00343             OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Provider namespace is "
00344                "empty for class %1 by provider %2::%3",
00345                classInfo.className, ifc->getName(), providerName));
00346             continue;
00347          }
00348          String name = ns + ":" + classInfo.className;
00349          processProviderClassExtraInfo(env, name, classInfo.methods, ifc, providerName, regMap);
00350       }
00351    }
00352 }
00354 void processProviderClassInfo(
00355    const ProviderEnvironmentIFCRef& env,
00356    const IndicationProviderInfo::ClassInfo& classInfo,
00357    const ProviderIFCBaseIFCRef& ifc,
00358    const String& providerName,
00359    ProviderManager::MultiProvRegMap_t& regMap)
00360 {
00361    if (classInfo.namespaces.empty())
00362    {
00363       processProviderClassExtraInfo(env, classInfo.indicationName, classInfo.classes, ifc, providerName, regMap);
00364    }
00365    else
00366    {
00367       for (size_t l = 0; l < classInfo.namespaces.size(); ++l)
00368       {
00369          String ns = classInfo.namespaces[l];
00370          if (ns.empty())
00371          {
00372             OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format("Provider namespace is "
00373                "empty for class %1 by provider %2::%3",
00374                classInfo.indicationName, ifc->getName(), providerName));
00375             continue;
00376          }
00377          String name = ns + ":" + classInfo.indicationName;
00378          processProviderClassExtraInfo(env, name, classInfo.classes, ifc, providerName, regMap);
00379       }
00380    }
00381 }
00383 template <typename ProviderInfoT, typename RegMapT>
00384 void processProviderInfo(
00385    const ProviderEnvironmentIFCRef& env,
00386    const Array<ProviderInfoT>& providerInfo,
00387    const ProviderIFCBaseIFCRef& ifc,
00388    RegMapT& regMap)
00389 {
00390    
00391    for (size_t j = 0; j < providerInfo.size(); ++j)
00392    {
00393       
00394       String providerName = providerInfo[j].getProviderName();
00395       if (providerName.empty())
00396       {
00397          OW_LOG_ERROR(env->getLogger(ProviderManager::COMPONENT_NAME), Format(
00398             "Provider name not supplied for provider class registrations from IFC %1", ifc->getName()));
00399          continue;
00400       }
00401       
00402       typedef typename ProviderInfoT::ClassInfo ClassInfo;
00403       typedef typename ProviderInfoT::ClassInfoArray ClassInfoArray;
00404       ClassInfoArray const& classInfos = providerInfo[j].getClassInfo();
00405       for (size_t k = 0; k < classInfos.size(); ++k)
00406       {
00407          ClassInfo classInfo(classInfos[k]);
00408          processProviderClassInfo(env, classInfo, ifc, providerName, regMap);
00409       }
00410    }
00411 }
00412 
00413 } 
00415 void ProviderManager::init(const ServiceEnvironmentIFCRef& env)
00416 {
00417    m_env = env;
00418 
00419    m_logger = env->getLogger(COMPONENT_NAME);
00420 
00421    ProviderEnvironmentIFCRef penv = ProviderEnvironmentIFCRef(
00422       new ProviderEnvironmentServiceEnvironmentWrapper(env));
00423 
00424    for (size_t i = 0; i < m_IFCArray.size(); ++i)
00425    {
00426       InstanceProviderInfoArray instanceProviderInfo;
00427       SecondaryInstanceProviderInfoArray secondaryInstanceProviderInfo;
00428 
00429 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00430       AssociatorProviderInfoArray associatorProviderInfo;
00431 #endif
00432 
00433       MethodProviderInfoArray methodProviderInfo;
00434       IndicationProviderInfoArray indicationProviderInfo;
00435 
00436       m_IFCArray[i]->init(penv,
00437          instanceProviderInfo,
00438          secondaryInstanceProviderInfo,
00439 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00440          associatorProviderInfo,
00441 #endif
00442          methodProviderInfo,
00443          indicationProviderInfo);
00444 
00445       processProviderInfo(penv, instanceProviderInfo, m_IFCArray[i], m_registeredInstProvs);
00446       processProviderInfo(penv, secondaryInstanceProviderInfo, m_IFCArray[i], m_registeredSecInstProvs);
00447 
00448 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00449       processProviderInfo(penv, associatorProviderInfo, m_IFCArray[i], m_registeredAssocProvs);
00450 #endif
00451 
00452       processProviderInfo(penv, methodProviderInfo, m_IFCArray[i], m_registeredMethProvs);
00453       processProviderInfo(penv, indicationProviderInfo, m_IFCArray[i], m_registeredIndProvs);
00454    }
00455 
00456    StringArray restrictedNamespaces = m_env->getMultiConfigItem(ConfigOpts::EXPLICIT_REGISTRATION_NAMESPACES_opt, StringArray(), " \t");
00457    m_restrictedNamespaces.insert(restrictedNamespaces.begin(), restrictedNamespaces.end());
00458 }
00459 
00461 bool
00462 ProviderManager::isRestrictedNamespace(const String& ns) const
00463 {
00464    String lns(ns);
00465    lns.toLowerCase();
00466    return (m_restrictedNamespaces.find(lns) != m_restrictedNamespaces.end());
00467 }
00468 
00469 namespace
00470 {
00471 
00472 #ifdef OW_THREADS_RUN_AS_USER
00473 
00474 inline InstanceProviderIFCRef
00475 wrapProvider(InstanceProviderIFCRef pref, const ProviderEnvironmentIFCRef& env)
00476 {
00477    if (!pref)
00478    {
00479       return pref;
00480    }
00481    return InstanceProviderIFCRef(new InstanceProviderProxy(pref, env));
00482 }
00483 inline SecondaryInstanceProviderIFCRef
00484 wrapProvider(SecondaryInstanceProviderIFCRef pref, const ProviderEnvironmentIFCRef& env)
00485 {
00486    if (!pref)
00487    {
00488       return pref;
00489    }
00490    return SecondaryInstanceProviderIFCRef(new SecondaryInstanceProviderProxy(pref, env));
00491 }
00492 inline MethodProviderIFCRef
00493 wrapProvider(MethodProviderIFCRef pref, const ProviderEnvironmentIFCRef& env)
00494 {
00495    if (!pref)
00496    {
00497       return pref;
00498    }
00499    return MethodProviderIFCRef(new MethodProviderProxy(pref, env));
00500 }
00501 
00502 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00503 inline AssociatorProviderIFCRef
00504 wrapProvider(AssociatorProviderIFCRef pref,
00505    const ProviderEnvironmentIFCRef& env)
00506 {
00507    if (!pref)
00508    {
00509       return pref;
00510    }
00511    return AssociatorProviderIFCRef(new AssociatorProviderProxy(pref, env));
00512 }
00513 #endif
00514 
00515 #else // OW_SETUID_PROVIDERS
00516 
00517 inline InstanceProviderIFCRef
00518 wrapProvider(InstanceProviderIFCRef pref, const ProviderEnvironmentIFCRef& env)
00519 {
00520    return pref;
00521 }
00522 inline SecondaryInstanceProviderIFCRef
00523 wrapProvider(SecondaryInstanceProviderIFCRef pref, const ProviderEnvironmentIFCRef& env)
00524 {
00525    return pref;
00526 }
00527 inline MethodProviderIFCRef
00528 wrapProvider(MethodProviderIFCRef pref, const ProviderEnvironmentIFCRef& env)
00529 {
00530    return pref;
00531 }
00532 
00533 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00534 inline AssociatorProviderIFCRef
00535 wrapProvider(AssociatorProviderIFCRef pref,
00536    const ProviderEnvironmentIFCRef& env)
00537 {
00538    return pref;
00539 }
00540 #endif
00541 
00542 #endif   // OW_SETUID_PROVIDERS
00543 
00544 }
00545 
00547 InstanceProviderIFCRef
00548 ProviderManager::getInstanceProvider(const ProviderEnvironmentIFCRef& env,
00549    const String& ns, const CIMClass& cc) const
00550 {
00551    ProvRegMap_t::const_iterator ci;
00552    if(!isRestrictedNamespace(ns) || cc.getName().equalsIgnoreCase("__Namespace"))
00553    {
00554       
00555       
00556       ci = m_registeredInstProvs.find(cc.getName().toLowerCase());
00557       if (ci != m_registeredInstProvs.end())
00558       {
00559          return wrapProvider(ci->second.ifc->getInstanceProvider(env,
00560             ci->second.provName.c_str()), env);
00561       }
00562    }
00563 
00564    
00565    
00566    String nsAndClassName = ns + ':' + cc.getName();
00567    nsAndClassName.toLowerCase();
00568    ci = m_registeredInstProvs.find(nsAndClassName);
00569    if (ci != m_registeredInstProvs.end())
00570    {
00571       return wrapProvider(ci->second.ifc->getInstanceProvider(env,
00572             ci->second.provName.c_str()), env);
00573    }
00574    
00575    CIMQualifier qual = cc.getQualifier(
00576       CIMQualifier::CIM_QUAL_PROVIDER);
00577    if (qual)
00578    {
00579       String provStr;
00580       ProviderIFCBaseIFCRef theIFC = getProviderIFC(env, qual, provStr);
00581       if (theIFC)
00582       {
00583          return wrapProvider(theIFC->getInstanceProvider(env,
00584             provStr.c_str()), env);
00585       }
00586    }
00587    return InstanceProviderIFCRef(0);
00588 }
00589 
00591 SecondaryInstanceProviderIFCRefArray
00592 ProviderManager::getSecondaryInstanceProviders(const ProviderEnvironmentIFCRef& env,
00593    const String& ns, const CIMName& className) const
00594 {
00595    String lowerName = className.toString();
00596    lowerName.toLowerCase();
00597    MultiProvRegMap_t::const_iterator lci;
00598    MultiProvRegMap_t::const_iterator uci;
00599 
00600    std::pair<MultiProvRegMap_t::const_iterator, 
00601       MultiProvRegMap_t::const_iterator> range;
00602 
00603    lci =  m_registeredSecInstProvs.end();
00604    if(!isRestrictedNamespace(ns))
00605    {
00606       
00607       
00608       range = m_registeredSecInstProvs.equal_range(lowerName);
00609       lci = range.first;
00610       uci = range.second;
00611    }
00612 
00613    if (lci == m_registeredSecInstProvs.end())
00614    {
00615       
00616       
00617       String nsAndClassName = ns + ':' + lowerName;
00618       nsAndClassName.toLowerCase();
00619       range = m_registeredSecInstProvs.equal_range(nsAndClassName);
00620       lci = range.first;
00621       uci = range.second;
00622    }
00623 
00624    SecondaryInstanceProviderIFCRefArray rval;
00625    if (lci != m_registeredSecInstProvs.end())
00626    {
00627       
00628       for (MultiProvRegMap_t::const_iterator tci = lci; tci != uci; ++tci)
00629       {
00630          rval.push_back(wrapProvider(tci->second.ifc->getSecondaryInstanceProvider(env, tci->second.provName.c_str()), env));
00631       }
00632    }
00633    return rval;
00634 }
00635 
00637 MethodProviderIFCRef
00638 ProviderManager::getMethodProvider(const ProviderEnvironmentIFCRef& env,
00639    const String& ns, const CIMClass& cc, const CIMMethod& method) const
00640 {
00641    ProvRegMap_t::const_iterator ci;
00642    CIMName methodName = method.getName();
00643    
00644    if(!isRestrictedNamespace(ns))
00645    {
00646       
00647       
00648       ci = m_registeredMethProvs.find(cc.getName().toLowerCase());
00649       if (ci != m_registeredMethProvs.end())
00650       {
00651          return wrapProvider(ci->second.ifc->getMethodProvider(env,
00652                ci->second.provName.c_str()), env);
00653       }
00654 
00655       
00656       
00657       String classAndMethodName = cc.getName() + '/' + methodName.toString();
00658       classAndMethodName.toLowerCase();
00659       ci = m_registeredMethProvs.find(classAndMethodName);
00660       if (ci != m_registeredMethProvs.end())
00661       {
00662          return wrapProvider(ci->second.ifc->getMethodProvider(env,
00663                ci->second.provName.c_str()), env);
00664       }
00665    }
00666 
00667    
00668    
00669    String nsAndClassName = ns + ':' + cc.getName();
00670    nsAndClassName.toLowerCase();
00671    ci = m_registeredMethProvs.find(nsAndClassName);
00672    if (ci != m_registeredMethProvs.end())
00673    {
00674       return wrapProvider(ci->second.ifc->getMethodProvider(env,
00675             ci->second.provName.c_str()), env);
00676    }
00677    
00678    
00679    String name = ns + ':' + cc.getName() + '/' + methodName.toString();
00680    name.toLowerCase();
00681    ci = m_registeredMethProvs.find(name);
00682    if (ci != m_registeredMethProvs.end())
00683    {
00684       return wrapProvider(ci->second.ifc->getMethodProvider(env,
00685          ci->second.provName.c_str()), env);
00686    }
00687    
00688    CIMQualifier qual = method.getQualifier(
00689       CIMQualifier::CIM_QUAL_PROVIDER);
00690    if (qual)
00691    {
00692       String provStr;
00693       ProviderIFCBaseIFCRef theIFC = getProviderIFC(env, qual, provStr);
00694       if (theIFC)
00695       {
00696          return wrapProvider(theIFC->getMethodProvider(env,
00697             provStr.c_str()), env);
00698       }
00699    }
00700    
00701    
00702    qual = cc.getQualifier(
00703       CIMQualifier::CIM_QUAL_PROVIDER);
00704    if (qual)
00705    {
00706       String provStr;
00707       ProviderIFCBaseIFCRef theIFC = getProviderIFC(env, qual, provStr);
00708       if (theIFC)
00709       {
00710          return wrapProvider(theIFC->getMethodProvider(env,
00711             provStr.c_str()), env);
00712       }
00713    }
00714    return MethodProviderIFCRef(0);
00715 }
00716 
00717 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00718 
00719 AssociatorProviderIFCRef
00720 ProviderManager::getAssociatorProvider(const ProviderEnvironmentIFCRef& env,
00721    const String& ns, const CIMClass& cc) const
00722 {
00723    ProvRegMap_t::const_iterator ci;
00724    if(!isRestrictedNamespace(ns))
00725    {
00726       
00727       
00728       ci = m_registeredAssocProvs.find(cc.getName().toLowerCase());
00729       if (ci != m_registeredAssocProvs.end())
00730       {
00731          return wrapProvider(ci->second.ifc->getAssociatorProvider(env,
00732                ci->second.provName.c_str()), env);
00733       }
00734    }
00735 
00736    
00737    
00738    String nsAndClassName = ns + ':' + cc.getName();
00739    nsAndClassName.toLowerCase();
00740    ci = m_registeredAssocProvs.find(nsAndClassName);
00741    if (ci != m_registeredAssocProvs.end())
00742    {
00743       return wrapProvider(ci->second.ifc->getAssociatorProvider(env,
00744             ci->second.provName.c_str()), env);
00745    }
00746    
00747    CIMQualifier qual = cc.getQualifier(
00748       CIMQualifier::CIM_QUAL_PROVIDER);
00749    if (qual)
00750    {
00751       String provStr;
00752       ProviderIFCBaseIFCRef theIFC = getProviderIFC(env, qual, provStr);
00753       if (theIFC)
00754       {
00755          return wrapProvider(theIFC->getAssociatorProvider(env,
00756             provStr.c_str()), env);
00757       }
00758    }
00759    return AssociatorProviderIFCRef(0);
00760 }
00761 #endif // #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00762 
00763 IndicationExportProviderIFCRefArray
00764 ProviderManager::getIndicationExportProviders(
00765    const ProviderEnvironmentIFCRef& env) const
00766 {
00767    IndicationExportProviderIFCRefArray rv;
00768    for (size_t i = 0; i < m_IFCArray.size(); i++)
00769    {
00770       IndicationExportProviderIFCRefArray pra =
00771             m_IFCArray[i]->getIndicationExportProviders(env);
00772       if (pra.size() > 0)
00773       {
00774          rv.appendArray(pra);
00775       }
00776    }
00777    return rv;
00778 }
00780 PolledProviderIFCRefArray
00781 ProviderManager::getPolledProviders(
00782    const ProviderEnvironmentIFCRef& env) const
00783 {
00784    PolledProviderIFCRefArray rv;
00785    for (size_t i = 0; i < m_IFCArray.size(); i++)
00786    {
00787       PolledProviderIFCRefArray pra =
00788             m_IFCArray[i]->getPolledProviders(env);
00789       if (pra.size() > 0)
00790       {
00791          rv.appendArray(pra);
00792       }
00793    }
00794    return rv;
00795 }
00796 
00798 void 
00799 ProviderManager::findIndicationProviders(
00800    const ProviderEnvironmentIFCRef& env,
00801    const String& ns,
00802    const CIMName& className,
00803    const ProviderManager::MultiProvRegMap_t& indProvs,
00804    IndicationProviderIFCRefArray& rval) const
00805 {
00806    typedef ProviderManager::MultiProvRegMap_t::const_iterator citer_t;
00807    std::pair<citer_t, citer_t> range;
00808 
00809    range.first = indProvs.end();
00810 
00811    if(!isRestrictedNamespace(ns))
00812    {
00813       range = indProvs.equal_range(className.toString());
00814    }
00815 
00816    if (range.first == indProvs.end())
00817    {
00818       
00819       
00820       
00821       String nsAndClassName = ns + ':' + className.toString();
00822       nsAndClassName.toLowerCase();
00823       range = indProvs.equal_range(nsAndClassName);
00824    }
00825 
00826    if (range.first != indProvs.end())
00827    {
00828       
00829       for (citer_t tci = range.first; tci != range.second; ++tci)
00830       {
00831          rval.push_back(tci->second.ifc->getIndicationProvider(env, tci->second.provName.c_str()));
00832       }
00833    }
00834 }
00835 
00837 IndicationProviderIFCRefArray
00838 ProviderManager::getIndicationProviders(const ProviderEnvironmentIFCRef& env,
00839    const String& ns, const CIMName& indicationClassName,
00840    const CIMNameArray& monitoredClassNames) const
00841 {
00842    IndicationProviderIFCRefArray providers;
00843    String lowerName = indicationClassName.toString();
00844    lowerName.toLowerCase();
00845 
00846    
00847    findIndicationProviders(env, ns, lowerName, m_registeredIndProvs, providers);
00848 
00849    if (monitoredClassNames.empty())
00850    {
00851       
00852       findIndicationProviders(env, ns, lowerName + "/*", m_registeredIndProvs, providers);
00853    }
00854    else
00855    {
00856       
00857       for (size_t i = 0; i < monitoredClassNames.size(); ++i)
00858       {
00859          
00860          String key = lowerName + '/' + monitoredClassNames[i].toString();
00861          key.toLowerCase();
00862          findIndicationProviders(env, ns, key, m_registeredIndProvs, providers);
00863       }
00864 
00865    }
00866 
00867    
00868    std::sort(providers.begin(), providers.end());
00869    providers.erase(std::unique(providers.begin(), providers.end()), providers.end());
00870 
00871    return providers;
00872 }
00874 void
00875 ProviderManager::unloadProviders(const ProviderEnvironmentIFCRef& env)
00876 {
00877    for (size_t i = 0; i < m_IFCArray.size(); i++)
00878    {
00879       try
00880       {
00881          m_IFCArray[i]->unloadProviders(env);
00882       }
00883       catch (const Exception& e)
00884       {
00885          OW_LOG_ERROR(m_logger, Format("Caught exception while calling unloadProviders for provider interface %1: %2", m_IFCArray[i]->getName(), e));
00886       }
00887    }
00888 }
00890 ProviderIFCBaseIFCRef
00891 ProviderManager::getProviderIFC(const ProviderEnvironmentIFCRef& env,
00892    const CIMQualifier& qual,
00893    String& provStr) const
00894 {
00895    ProviderIFCBaseIFCRef rref;
00896    provStr = String();
00897    if (!qual.getName().equalsIgnoreCase(CIMQualifier::CIM_QUAL_PROVIDER))
00898    {
00899       OW_LOG_ERROR(m_logger, Format("Provider Manager - invalid provider qualifier: %1",
00900          qual.getName()));
00901       return rref;
00902    }
00903    CIMValue cv = qual.getValue();
00904    if (cv.getType() != CIMDataType::STRING || cv.isArray())
00905    {
00906       CIMDataType dt(cv.getType());
00907       if (cv.isArray())
00908       {
00909          dt.setToArrayType(cv.getArraySize());
00910       }
00911       OW_LOG_ERROR(m_logger, Format(
00912          "Provider Manager - qualifier has incompatible data type: %1",
00913          dt.toString()));
00914       return rref;
00915    }
00916    String qvstr;
00917    cv.get(qvstr);
00918    size_t ndxoffset = 2;
00919    size_t ndx = qvstr.indexOf("::");
00920    if (ndx == String::npos)
00921    {
00922       ndx = qvstr.indexOf(":");
00923       if (ndx == String::npos)
00924       {
00925          OW_LOG_ERROR(m_logger, Format(
00926             "Provider Manager - Invalid Format for provider string: %1", qvstr));
00927          return rref;
00928       }
00929       ndxoffset = 1;
00930    }
00931    String ifcStr = qvstr.substring(0, ndx);
00932    provStr = qvstr.substring(ndx+ndxoffset);
00933    for (size_t i = 0; i < m_IFCArray.size(); i++)
00934    {
00935       if (ifcStr.equalsIgnoreCase(m_IFCArray[i]->getName()))
00936       {
00937          rref = m_IFCArray[i];
00938          break;
00939       }
00940    }
00941    if (!rref)
00942    {
00943       OW_LOG_ERROR(m_logger, Format(
00944          "Provider Manager - Invalid provider interface identifier: %1",
00945          ifcStr));
00946    }
00947    return rref;
00948 }
00949 
00950 } 
00951