OW_CIMServer.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2001-2004 Vintela, Inc. All rights reserved.
00003 *
00004 * Redistribution and use in source and binary forms, with or without
00005 * modification, are permitted provided that the following conditions are met:
00006 *
00007 *  - Redistributions of source code must retain the above copyright notice,
00008 *    this list of conditions and the following disclaimer.
00009 *
00010 *  - Redistributions in binary form must reproduce the above copyright notice,
00011 *    this list of conditions and the following disclaimer in the documentation
00012 *    and/or other materials provided with the distribution.
00013 *
00014 *  - Neither the name of Vintela, Inc. nor the names of its
00015 *    contributors may be used to endorse or promote products derived from this
00016 *    software without specific prior written permission.
00017 *
00018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00020 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00021 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc. OR THE CONTRIBUTORS
00022 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00023 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00024 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00025 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00026 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00027 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00028 * POSSIBILITY OF SUCH DAMAGE.
00029 *******************************************************************************/
00030 
00036 #include "OW_config.h"
00037 #include "OW_CIMServer.hpp"
00038 #include "OW_CIMValueCast.hpp"
00039 #include "OW_ConfigOpts.hpp"
00040 #include "OW_Format.hpp"
00041 #include "OW_WQLIFC.hpp"
00042 #include "OW_Assertion.hpp"
00043 #include "OW_CIMParamValue.hpp"
00044 #include "OW_CIMRepository.hpp"
00045 #include "OW_NoSuchProviderException.hpp"
00046 #include "OW_CIMValue.hpp"
00047 #include "OW_CIMProperty.hpp"
00048 #include "OW_CIMQualifierType.hpp"
00049 #include "OW_CIMQualifier.hpp"
00050 #include "OW_CIMMethod.hpp"
00051 #include "OW_CIMParameter.hpp"
00052 #include "OW_CIMObjectPath.hpp"
00053 #include "OW_CIMInstance.hpp"
00054 #include "OW_OperationContext.hpp"
00055 #include "OW_MutexLock.hpp"
00056 #include "OW_UserInfo.hpp"
00057 #include "OW_ResultHandlers.hpp"
00058 #include "OW_AuthorizerManager.hpp" 
00059 #include "OW_ProviderEnvironmentIFC.hpp"
00060 #include "OW_ProviderManager.hpp"
00061 #include "OW_ServiceIFCNames.hpp"
00062 
00063 #include <iterator>
00064 
00065 namespace OW_NAMESPACE
00066 {
00067 
00068 using namespace WBEMFlags;
00069 
00071 namespace
00072 {
00073    const String COMPONENT_NAME("ow.owcimomd.CIMServer");
00074    const char* const DEPRECATED__NamespaceClassName = "__Namespace";
00075 
00076    class AuthorizerEnabler
00077    {
00078    public:
00079       AuthorizerEnabler(const AuthorizerManagerRef& authorizerMgr,
00080          OperationContext& context, bool turnOff=false)
00081       : m_authorizerMgr(authorizerMgr)
00082       , m_context(context)
00083       {
00084          if (turnOff)
00085          {
00086             m_authorizerMgr->turnOff(m_context);
00087          }
00088       }
00089 
00090       ~AuthorizerEnabler()
00091       {
00092          m_authorizerMgr->turnOn(m_context);
00093       }
00094 
00095    private:
00096       AuthorizerManagerRef m_authorizerMgr;
00097       OperationContext& m_context;
00098    };
00099 
00100    class ClonedCIMServerProviderEnvironment : public ProviderEnvironmentIFC
00101    {
00102    public:
00103       ClonedCIMServerProviderEnvironment(
00104          const ServiceEnvironmentIFCRef& env)
00105          : m_env(env)
00106       {}
00107       virtual String getConfigItem(const String &name,
00108          const String& defRetVal="") const
00109       {
00110          return m_env->getConfigItem(name, defRetVal);
00111       }
00112       virtual StringArray getMultiConfigItem(const String &itemName, 
00113          const StringArray& defRetVal, const char* tokenizeSeparator = 0) const
00114       {
00115          return m_env->getMultiConfigItem(itemName, defRetVal, tokenizeSeparator);
00116       }
00117       virtual CIMOMHandleIFCRef getCIMOMHandle() const
00118       {
00119          return m_env->getCIMOMHandle(m_context,
00120             ServiceEnvironmentIFC::E_USE_PROVIDERS);
00121       }
00122       
00123       virtual CIMOMHandleIFCRef getRepositoryCIMOMHandle() const
00124       {
00125          return m_env->getCIMOMHandle(m_context,
00126             ServiceEnvironmentIFC::E_BYPASS_PROVIDERS);
00127       }
00128       
00129       virtual RepositoryIFCRef getRepository() const
00130       {
00131          return m_env->getRepository();
00132       }
00133       virtual LoggerRef getLogger() const
00134       {
00135          return m_env->getLogger(COMPONENT_NAME);
00136       }
00137       virtual LoggerRef getLogger(const String& componentName) const
00138       {
00139          return m_env->getLogger(componentName);
00140       }
00141       virtual String getUserName() const
00142       {
00143          return m_context.getUserInfo().getUserName();
00144       }
00145       virtual OperationContext& getOperationContext()
00146       {
00147          return m_context;
00148       }
00149       virtual ProviderEnvironmentIFCRef clone() const
00150       {
00151          return ProviderEnvironmentIFCRef(new ClonedCIMServerProviderEnvironment(m_env));
00152       }
00153    private:
00154       mutable OperationContext m_context;
00155       ServiceEnvironmentIFCRef m_env;
00156    };
00157 
00158    class CIMServerProviderEnvironment : public ProviderEnvironmentIFC
00159    {
00160    public:
00161       CIMServerProviderEnvironment(OperationContext& context,
00162          const ServiceEnvironmentIFCRef& env)
00163          : m_context(context)
00164          , m_env(env)
00165       {}
00166       virtual String getConfigItem(const String &name,
00167          const String& defRetVal="") const
00168       {
00169          return m_env->getConfigItem(name, defRetVal);
00170       }
00171       virtual StringArray getMultiConfigItem(const String &itemName, 
00172          const StringArray& defRetVal, const char* tokenizeSeparator = 0) const
00173       {
00174          return m_env->getMultiConfigItem(itemName, defRetVal, tokenizeSeparator);
00175       }
00176       virtual CIMOMHandleIFCRef getCIMOMHandle() const
00177       {
00178          return m_env->getCIMOMHandle(m_context,
00179             ServiceEnvironmentIFC::E_USE_PROVIDERS,
00180             ServiceEnvironmentIFC::E_NO_LOCKING);
00181       }
00182       
00183       virtual CIMOMHandleIFCRef getRepositoryCIMOMHandle() const
00184       {
00185          return m_env->getCIMOMHandle(m_context,
00186             ServiceEnvironmentIFC::E_BYPASS_PROVIDERS,
00187             ServiceEnvironmentIFC::E_NO_LOCKING);
00188       }
00189       
00190       virtual RepositoryIFCRef getRepository() const
00191       {
00192          return m_env->getRepository();
00193       }
00194       virtual LoggerRef getLogger() const
00195       {
00196          return m_env->getLogger(COMPONENT_NAME);
00197       }
00198       virtual LoggerRef getLogger(const String& componentName) const
00199       {
00200          return m_env->getLogger(componentName);
00201       }
00202       virtual String getUserName() const
00203       {
00204          return m_context.getUserInfo().getUserName();
00205       }
00206       virtual OperationContext& getOperationContext()
00207       {
00208          return m_context;
00209       }
00210       virtual ProviderEnvironmentIFCRef clone() const
00211       {
00212          return ProviderEnvironmentIFCRef(new ClonedCIMServerProviderEnvironment(m_env));
00213       }
00214    private:
00215       OperationContext& m_context;
00216       ServiceEnvironmentIFCRef m_env;
00217    };
00218 
00219    inline ProviderEnvironmentIFCRef createProvEnvRef(OperationContext& context,
00220       const ServiceEnvironmentIFCRef& env)
00221    {
00222       return ProviderEnvironmentIFCRef(new CIMServerProviderEnvironment(context, env));
00223    }
00224 
00225    inline void logOperation(const LoggerRef& lgr, const OperationContext& context, const char* operation, const String& ns, const String& objectName = String())
00226    {
00227       // avoid the overhead of formatting the message if we're not going to log this.
00228       ELogLevel level = lgr->getLogLevel();
00229       if (level == E_DEBUG_LEVEL || level == E_INFO_LEVEL)
00230       {
00231          String userString;
00232          String user = context.getStringDataWithDefault(OperationContext::USER_NAME);
00233          if (!user.empty())
00234          {
00235             userString = " for user: " + user;
00236          }
00237          String optObjectName;
00238          if (!objectName.empty())
00239          {
00240             optObjectName = ':' + objectName;
00241          }
00242          OW_LOG_INFO(lgr, Format("CIMServer doing operation: %1 on %2%3%4", operation, ns, optObjectName, userString));
00243       }
00244    }
00245 }
00246 
00248 CIMServer::CIMServer(const ServiceEnvironmentIFCRef& env,
00249    const ProviderManagerRef& provManager,
00250    const RepositoryIFCRef& cimRepository,
00251    const AuthorizerManagerRef& authorizerMgr)
00252    : RepositoryIFC()
00253    , m_provManager(provManager)
00254    , m_nsClass_Namespace(CIMNULL)
00255    , m_env(env)
00256    , m_cimRepository(cimRepository)
00257    , m_realRepository(dynamic_pointer_cast<CIMRepository>(m_cimRepository))
00258    , m_authorizerMgr(authorizerMgr)
00259    , m_logger(env->getLogger(COMPONENT_NAME))
00260 {
00261 }
00263 CIMServer::~CIMServer()
00264 {
00265    try
00266    {
00267       close();
00268    }
00269    catch (...)
00270    {
00271       // don't let exceptions escape
00272    }
00273 }
00275 void
00276 CIMServer::open(const String& path)
00277 {
00278 }
00280 void
00281 CIMServer::close()
00282 {
00283 }
00284 
00286 String
00287 CIMServer::getName() const
00288 {
00289    return ServiceIFCNames::CIMServer;
00290 }
00291 
00293 StringArray
00294 CIMServer::getDependencies() const
00295 {
00296    StringArray rv;
00297    rv.push_back(ServiceIFCNames::AuthorizerManager);
00298    rv.push_back(ServiceIFCNames::CIMRepository);
00299    rv.push_back(ServiceIFCNames::ProviderManager);
00300    return rv;
00301 }
00302 
00304 void
00305 CIMServer::init(const ServiceEnvironmentIFCRef& env)
00306 {
00307    // not much to do here, the ctor already did it all.
00308 }
00309 
00311 void
00312 CIMServer::shutdown()
00313 {
00314    m_provManager = 0;
00315    m_env = 0;
00316    m_cimRepository = 0;
00317    m_realRepository = 0;
00318    m_authorizerMgr = 0;
00319 }
00321 void
00322 CIMServer::_checkNameSpaceAccess(OperationContext& context, const String& ns,
00323    Authorizer2IFC::EAccessType acType)
00324 {
00325    if (!m_authorizerMgr->allowAccessToNameSpace(m_env, ns, acType,
00326       context))
00327    {
00328       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00329          Format("Access to namespace %1 is not allowed", ns).c_str());
00330    }
00331 }
00332 #if !defined(OW_DISABLE_INSTANCE_MANIPULATION) && !defined(OW_DISABLE_NAMESPACE_MANIPULATION)
00333 
00334 void
00335 CIMServer::createNameSpace(const String& ns,
00336    OperationContext& context)
00337 {
00338    if (!m_authorizerMgr->allowCreateNameSpace(
00339       m_env, ns, context))
00340    {
00341       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00342          Format("Creation of namespace %1 is not allowed",
00343             ns).c_str());
00344    }
00345 
00346    logOperation(m_logger, context, "createNameSpace", ns);
00347    m_cimRepository->createNameSpace(ns,context);
00348 }
00350 void
00351 CIMServer::deleteNameSpace(const String& ns,
00352    OperationContext& context)
00353 {
00354    if (!m_authorizerMgr->allowDeleteNameSpace(
00355       m_env, ns, context))
00356    {
00357       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00358          Format("Deletion of namespace %1 is not allowed",
00359             ns).c_str());
00360    }
00361 
00362    logOperation(m_logger, context, "deleteNameSpace", ns);
00363    m_cimRepository->deleteNameSpace(ns,context);
00364 }
00365 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00366 
00367 void
00368 CIMServer::enumNameSpace(StringResultHandlerIFC& result,
00369    OperationContext& context)
00370 {
00371    if (!m_authorizerMgr->allowEnumNameSpace(
00372       m_env, context))
00373    {
00374       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00375          "Enumeration of namespaces is not allowed");
00376    }
00377 
00378    // Don't need to check ACLs, since this is a result of calling enumInstances.
00379    logOperation(m_logger, context, "enumNameSpace", String());
00380    m_cimRepository->enumNameSpace(result,context);
00381 }
00383 CIMQualifierType
00384 CIMServer::getQualifierType(const String& ns,
00385    const String& qualifierName,
00386    OperationContext& context)
00387 {
00388    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00389 
00390    if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00391    {
00392       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00393          Format("Read of qualifier %1 is not allowed",
00394             qualifierName).c_str());
00395    }
00396 
00397    logOperation(m_logger, context, "GetQualifier", ns, qualifierName);
00398    return m_cimRepository->getQualifierType(ns,qualifierName,context);
00399 }
00400 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00401 
00402 void
00403 CIMServer::enumQualifierTypes(
00404    const String& ns,
00405    CIMQualifierTypeResultHandlerIFC& result,
00406    OperationContext& context)
00407 {
00408    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00409 
00410    if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00411    {
00412       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00413          "Enumeration of qualifiers is not allowed");
00414    }
00415 
00416    logOperation(m_logger, context, "EnumerateQualifiers", ns);
00417    m_cimRepository->enumQualifierTypes(ns,result,context);
00418 }
00420 void
00421 CIMServer::deleteQualifierType(const String& ns, const String& qualName,
00422    OperationContext& context)
00423 {
00424    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00425 
00426    if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00427       Authorizer2IFC::E_DELETE, context))
00428    {
00429       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00430          Format("Deletion of qualifier %1 is not allowed",
00431             qualName).c_str());
00432    }
00433 
00434    logOperation(m_logger, context, "DeleteQualifier", ns, qualName);
00435    m_cimRepository->deleteQualifierType(ns,qualName,context);
00436 }
00438 void
00439 CIMServer::setQualifierType(
00440    const String& ns,
00441    const CIMQualifierType& qt, OperationContext& context)
00442 {
00443    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00444 
00445    if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00446       Authorizer2IFC::E_MODIFY, context))
00447    {
00448       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00449          Format("Modification of qualifier %1 is not allowed",
00450             qt.getName()).c_str());
00451    }
00452 
00453    logOperation(m_logger, context, "SetQualifier", ns, qt.getName());
00454    m_cimRepository->setQualifierType(ns,qt,context);
00455 }
00456 #endif // #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00457 
00458 CIMClass
00459 CIMServer::getClass(
00460    const String& ns, const String& className, ELocalOnlyFlag localOnly,
00461    EIncludeQualifiersFlag includeQualifiers, EIncludeClassOriginFlag includeClassOrigin,
00462    const StringArray* propertyList, OperationContext& context)
00463 {
00464    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00465 
00466    if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00467    {
00468       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00469          Format("Read of class %1 is not allowed", className).c_str());
00470    }
00471 
00472    logOperation(m_logger, context, "GetClass", ns, className);
00473    CIMClass theClass = _getNameSpaceClass(className);
00474    if (!theClass)
00475    {
00476       theClass = m_cimRepository->getClass(ns,className,localOnly,
00477          includeQualifiers,includeClassOrigin,propertyList,context);
00478    }
00479    return theClass;
00480 }
00482 CIMClass
00483 CIMServer::_instGetClass(const String& ns, const CIMName& className,
00484    ELocalOnlyFlag localOnly,
00485    EIncludeQualifiersFlag includeQualifiers, EIncludeClassOriginFlag includeClassOrigin,
00486    const StringArray* propertyList, OperationContext& context)
00487 {
00488    CIMClass theClass = _getNameSpaceClass(className);
00489    if (!theClass)
00490    {
00491       try
00492       {
00493          theClass = m_cimRepository->getClass(ns,className.toString(),localOnly,
00494             includeQualifiers,includeClassOrigin,propertyList,context);
00495       }
00496       catch (CIMException& e)
00497       {
00498          if (e.getErrNo() == CIMException::NOT_FOUND)
00499          {
00500             e.setErrNo(CIMException::INVALID_CLASS);
00501          }
00502          throw e;
00503       }
00504    }
00505    return theClass;
00506 }
00507 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00508 
00509 CIMClass
00510 CIMServer::deleteClass(const String& ns, const String& className,
00511    OperationContext& context)
00512 {
00513    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00514 
00515    if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00516       Authorizer2IFC::E_DELETE, context))
00517    {
00518       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00519          Format("Deletion of class %1 is not allowed",
00520             className).c_str());
00521    }
00522 
00523    logOperation(m_logger, context, "DeleteClass", ns, className);
00524    return m_cimRepository->deleteClass(ns,className,context);
00525 }
00527 void
00528 CIMServer::createClass(const String& ns, const CIMClass& cimClass,
00529    OperationContext& context)
00530 {
00531    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00532 
00533    if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00534       Authorizer2IFC::E_CREATE, context))
00535    {
00536       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00537          Format("Creation of class %1 is not allowed",
00538             cimClass.getName()).c_str());
00539    }
00540 
00541    logOperation(m_logger, context, "GetClass", ns, cimClass.getName());
00542    if (cimClass.getName().equalsIgnoreCase(DEPRECATED__NamespaceClassName))
00543    {
00544       OW_THROWCIMMSG(CIMException::ALREADY_EXISTS,
00545          Format("Creation of class %1 is not allowed",
00546             cimClass.getName()).c_str());
00547    }
00548    m_cimRepository->createClass(ns,cimClass,context);
00549 }
00551 CIMClass
00552 CIMServer::modifyClass(
00553    const String& ns,
00554    const CIMClass& cc,
00555    OperationContext& context)
00556 {
00557    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_WRITE);
00558 
00559    if (!m_authorizerMgr->allowWriteSchema(m_env, ns,
00560       Authorizer2IFC::E_MODIFY, context))
00561    {
00562       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00563          Format("Modification of class %1 is not allowed",
00564             cc.getName()).c_str());
00565    }
00566 
00567    logOperation(m_logger, context, "ModifyClass", ns, cc.getName());
00568    return m_cimRepository->modifyClass(ns,cc,context);
00569 }
00570 #endif // #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00571 
00572 void
00573 CIMServer::enumClasses(const String& ns,
00574       const String& className,
00575       CIMClassResultHandlerIFC& result,
00576       EDeepFlag deep, ELocalOnlyFlag localOnly, EIncludeQualifiersFlag includeQualifiers,
00577       EIncludeClassOriginFlag includeClassOrigin, OperationContext& context)
00578 {
00579    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00580 
00581    if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00582    {
00583       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00584          "Enumeration of classes is not allowed");
00585    }
00586 
00587    logOperation(m_logger, context, "EnumerateClasses", ns, className);
00588    m_cimRepository->enumClasses(ns,className,result,deep,localOnly,
00589       includeQualifiers,includeClassOrigin,context);
00590 }
00592 void
00593 CIMServer::enumClassNames(
00594    const String& ns,
00595    const String& className,
00596    StringResultHandlerIFC& result,
00597    EDeepFlag deep, OperationContext& context)
00598 {
00599    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00600 
00601    if (!m_authorizerMgr->allowReadSchema(m_env, ns, context))
00602    {
00603       OW_THROWCIMMSG(CIMException::ACCESS_DENIED,
00604          "Enumeration of class names is not allowed");
00605    }
00606 
00607    logOperation(m_logger, context, "EnumerateClassNames", ns, className);
00608    m_cimRepository->enumClassNames(ns,className,result,deep,context);
00609 }
00611 namespace
00612 {
00613    class InstNameEnumerator : public CIMClassResultHandlerIFC
00614    {
00615    public:
00616       InstNameEnumerator(
00617          const String& ns_,
00618          CIMObjectPathResultHandlerIFC& result_,
00619          OperationContext& context_,
00620          const ServiceEnvironmentIFCRef& env_,
00621          CIMServer* server_)
00622          : ns(ns_)
00623          , result(result_)
00624          , context(context_)
00625          , m_env(env_)
00626          , server(server_)
00627       {}
00628    protected:
00629       virtual void doHandle(const CIMClass &cc)
00630       {
00631          LoggerRef lgr(m_env->getLogger(COMPONENT_NAME));
00632          if (lgr->getLogLevel() == E_DEBUG_LEVEL)
00633          {
00634             OW_LOG_DEBUG(lgr, Format("CIMServer InstNameEnumerator enumerated derived instance names: %1:%2", ns,
00635                cc.getName()));
00636          }
00637          server->_getCIMInstanceNames(ns, cc.getName(), cc, result, context);
00638       }
00639    private:
00640       String ns;
00641       CIMObjectPathResultHandlerIFC& result;
00642       OperationContext& context;
00643       const ServiceEnvironmentIFCRef& m_env;
00644       CIMServer* server;
00645    };
00646 }
00648 void
00649 CIMServer::enumInstanceNames(
00650    const String& ns,
00651    const String& className,
00652    CIMObjectPathResultHandlerIFC& result,
00653    EDeepFlag deep,
00654    OperationContext& context)
00655 {
00656    _checkNameSpaceAccess(context, ns, Authorizer2IFC::E_READ);
00657 
00658    logOperation(m_logger, context, "EnumerateInstanceNames", ns, className);
00659 
00660    InstNameEnumerator ie(ns, result, context, m_env, this);
00661    CIMClass theClass = _instGetClass(ns, className,E_NOT_LOCAL_ONLY,
00662       E_INCLUDE_QUALIFIERS,E_INCLUDE_CLASS_ORIGIN,0,context);
00663    ie.handle(theClass);
00664    // If this is the namespace class then just return now
00665    if (className.equalsIgnoreCase(DEPRECATED__NamespaceClassName)
00666       || !deep)
00667    {
00668       return;
00669    }
00670    else
00671    {
00672       // TODO: measure whether it would be faster to use
00673       // enumClassNames + getClass() here.
00674       m_cimRepository->enumClasses(ns,className,ie,deep,E_NOT_LOCAL_ONLY,
00675          E_INCLUDE_QUALIFIERS,E_INCLUDE_CLASS_ORIGIN,context);
00676    }
00677 }
00679 // PRIVATE
00680 void
00681 CIMServer::_getCIMInstanceNames(const String& ns, const CIMName& className,
00682    const CIMClass& theClass, CIMObjectPathResultHandlerIFC& result,
00683    OperationContext& context)
00684 {
00685    InstanceProviderIFCRef instancep = _getInstanceProvider(ns, theClass, context);
00686    if (instancep)
00687    {
00688       instancep->enumInstanceNames(createProvEnvRef(context, m_env),
00689          ns, className.toString(), result, theClass);
00690    }
00691    else
00692    {
00693       m_cimRepository->enumInstanceNames(ns,className.toString(),result,E_SHALLOW,context);
00694    }
00695 }
00697 namespace
00698 {
00699    class InstEnumerator : public CIMClassResultHandlerIFC
00700    {
00701    public:
00702       InstEnumerator(
00703          const String& ns_,
00704          CIMInstanceResultHandlerIFC& result_,
00705          OperationContext& context_,
00706          const ServiceEnvironmentIFCRef& env_,
00707          CIMServer* server_,
00708          EDeepFlag deep_,
00709          ELocalOnlyFlag localOnly_,
00710          EIncludeQualifiersFlag includeQualifiers_,
00711          EIncludeClassOriginFlag includeClassOrigin_,
00712          const StringArray* propertyList_,
00713          const CIMClass& theTopClass_)
00714          : ns(ns_)
00715          , result(result_)
00716          , context(context_)
00717          , m_env(env_)
00718          , server(server_)
00719          , deep(deep_)
00720          , localOnly(localOnly_)
00721          , includeQualifiers(includeQualifiers_)
00722          , includeClassOrigin(includeClassOrigin_)
00723          , propertyList(propertyList_)
00724          , theTopClass(theTopClass_)
00725       {}
00726    protected:
00727       virtual void doHandle(const CIMClass &cc)
00728       {
00729          LoggerRef lgr(m_env->getLogger(COMPONENT_NAME));
00730          if (lgr->getLogLevel() == E_DEBUG_LEVEL)
00731          {
00732             OW_LOG_DEBUG(lgr, Format("CIMServer InstEnumerator Enumerating"
00733                " derived instance names: %1:%2", ns, cc.getName()));
00734          }
00735          server->_getCIMInstances(ns, cc.getName(), theTopClass, cc,
00736             result, localOnly, deep, includeQualifiers,
00737             includeClassOrigin, propertyList, context);
00738       }
00739    private:
00740       String ns;
00741       CIMInstanceResultHandlerIFC& result;
00742       OperationContext& context;
00743       const ServiceEnvironmentIFCRef& m_env;
00744       CIMServer* server;
00745       EDeepFlag deep;
00746       ELocalOnlyFlag localOnly;
00747       EIncludeQualifiersFlag includeQualifiers;
00748       EIncludeClassOriginFlag includeClassOrigin;
00749       const StringArray* propertyList;
00750       const CIMClass& theTopClass;
00751    };
00752 }
00753 
00755 void
00756 CIMServer::enumInstances(
00757    const String& ns,
00758    const String& className,
00759    CIMInstanceResultHandlerIFC& result, EDeepFlag deep,
00760    ELocalOnlyFlag localOnly, EIncludeQualifiersFlag includeQualifiers, EIncludeClassOriginFlag includeClassOrigin,
00761    const StringArray* propertyList, EEnumSubclassesFlag enumSubclasses,
00762    OperationContext&am