OW_XMLExecute.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_XMLExecute.hpp"
00038 #include "OW_Format.hpp"
00039 #include "OW_XMLClass.hpp"
00040 #include "OW_CIMXMLParser.hpp"
00041 #include "OW_XMLEscape.hpp"
00042 #include "OW_Assertion.hpp"
00043 #include "OW_CIMErrorException.hpp"
00044 #include "OW_CIMMethod.hpp"
00045 #include "OW_CIMParameter.hpp"
00046 #include "OW_CIMValue.hpp"
00047 #include "OW_CIMNameSpace.hpp"
00048 #include "OW_CIMProperty.hpp"
00049 #include "OW_TempFileStream.hpp"
00050 #include "OW_CIMClass.hpp"
00051 #include "OW_CIMFeatures.hpp"
00052 #include "OW_XMLCIMFactory.hpp"
00053 #include "OW_CIMtoXML.hpp"
00054 #include "OW_CIMParamValue.hpp"
00055 #include "OW_CIMObjectPath.hpp"
00056 #include "OW_CIMInstance.hpp"
00057 #include "OW_CIMQualifierType.hpp"
00058 #include "OW_CIMQualifier.hpp"
00059 #include "OW_SocketUtils.hpp"
00060 #include "OW_SocketException.hpp"
00061 #include "OW_Logger.hpp"
00062 #include "OW_OperationContext.hpp"
00063 #include "OW_ExceptionIds.hpp"
00064 #include "OW_ResultHandlerIFC.hpp"
00065 #include "OW_ServiceIFCNames.hpp"
00066 #include "OW_ConfigOpts.hpp"
00067 
00068 #include <algorithm>
00069 
00070 #define OW_LOGDEBUG(msg) OW_LOG_DEBUG(this->getEnvironment()->getLogger(COMPONENT_NAME), msg)
00071 #define OW_LOGINFO(msg) OW_LOG_INFO(this->getEnvironment()->getLogger(COMPONENT_NAME), msg)
00072 #define OW_LOGERROR(msg) OW_LOG_ERROR(this->getEnvironment()->getLogger(COMPONENT_NAME), msg)
00073 #define OW_LOGFATALERROR(msg) OW_LOG_FATAL_ERROR(this->getEnvironment()->getLogger(COMPONENT_NAME), msg)
00074 
00075 namespace OW_NAMESPACE
00076 {
00077 
00078 namespace
00079 {
00080    const String COMPONENT_NAME("ow.requesthandler.cimxml");
00081 }
00082 
00083 OW_DECLARE_EXCEPTION(BadStream)
00084 OW_DEFINE_EXCEPTION_WITH_ID(BadStream)
00085 using std::ostream;
00086 using namespace WBEMFlags;
00087 
00088 template<typename T> inline static void checkStream(T& str)
00089 {
00090    if (!str.good())
00091    {
00092       OW_THROW(BadStreamException, "The stream is bad");
00093    }
00094 }
00095 XMLExecute::FuncEntry XMLExecute::g_funcs[] =
00096 {
00097    // This list must be kept in alphabetical order!
00098 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00099    { "associatornames", &XMLExecute::associatorNames },
00100    { "associators", &XMLExecute::associators },
00101 #endif
00102 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00103    { "createclass", &XMLExecute::createClass },
00104 #endif
00105 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00106    { "createinstance", &XMLExecute::createInstance },
00107 #endif
00108 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00109    { "deleteclass", &XMLExecute::deleteClass },
00110 #endif
00111 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00112    { "deleteinstance", &XMLExecute::deleteInstance },
00113 #endif
00114 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00115    { "deletequalifier", &XMLExecute::deleteQualifier },
00116 #endif
00117    { "enumerateclasses", &XMLExecute::enumerateClasses },
00118    { "enumerateclassnames", &XMLExecute::enumerateClassNames },
00119    { "enumerateinstancenames", &XMLExecute::enumerateInstanceNames },
00120    { "enumerateinstances", &XMLExecute::enumerateInstances },
00121 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00122    { "enumeratequalifiers", &XMLExecute::enumerateQualifiers },
00123 #endif
00124    { "execquery", &XMLExecute::execQuery },
00125    { "getclass", &XMLExecute::getClass },
00126    { "getinstance", &XMLExecute::getInstance },
00127 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00128    { "getproperty", &XMLExecute::getProperty },
00129 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00130    { "getqualifier", &XMLExecute::getQualifier },
00131 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00132    { "modifyclass", &XMLExecute::modifyClass },
00133 #endif
00134 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00135    { "modifyinstance", &XMLExecute::modifyInstance },
00136 #endif
00137 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00138    { "referencenames", &XMLExecute::referenceNames },
00139    { "references", &XMLExecute::references },
00140 #endif
00141 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00142 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00143    { "setproperty", &XMLExecute::setProperty },
00144 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00145 #endif
00146 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00147    { "setqualifier", &XMLExecute::setQualifier },
00148 #endif
00149    { "garbage", 0 }
00150 };
00151 XMLExecute::FuncEntry* XMLExecute::g_funcsEnd = &XMLExecute::g_funcs[0] +
00152    (sizeof(XMLExecute::g_funcs)/sizeof(*XMLExecute::g_funcs)) - 1;
00154 bool
00155 XMLExecute::funcEntryCompare(const XMLExecute::FuncEntry& f1,
00156    const XMLExecute::FuncEntry& f2)
00157 {
00158    return (strcmp(f1.name, f2.name) < 0);
00159 }
00161 XMLExecute::XMLExecute()
00162    : RequestHandlerIFCXML(),
00163    m_ostrEntity(NULL),
00164    m_ostrError(NULL),
00165    m_isIntrinsic(false),
00166    m_functionName(),
00167    m_commMechPath(CIMNULL),
00168    m_hostedAccessPointPath(CIMNULL),
00169    m_commMechForManager(CIMNULL)
00170 {
00171 }
00173 XMLExecute::~XMLExecute()
00174 {
00175 }
00177 String
00178 XMLExecute::getName() const
00179 {
00180    return ServiceIFCNames::XMLExecute;
00181 }
00183 StringArray
00184 XMLExecute::getDependencies() const
00185 {
00186    StringArray rv;
00187    rv.push_back(ServiceIFCNames::CIMServer);
00188    return rv;
00189 }
00190 
00192 // Private
00193 int
00194 XMLExecute::executeXML(CIMXMLParser& parser, ostream* ostrEntity,
00195    ostream* ostrError, OperationContext& context)
00196 {
00197    clearError();
00198    m_ostrEntity = ostrEntity;
00199    m_ostrError = ostrError;
00200    m_isIntrinsic = false;
00201    String messageId = parser.mustGetAttribute(CIMXMLParser::A_ID);
00202    parser.getChild();
00203    if (!parser)
00204    {
00205       OW_THROW(CIMErrorException, CIMErrorException::request_not_loosely_valid);
00206    }
00207    makeXMLHeader(messageId, *m_ostrEntity);
00208    if (parser.getToken() == CIMXMLParser::E_MULTIREQ)
00209    {
00210       (*m_ostrEntity) << "<MULTIRSP>";
00211       parser.getChild();
00212       while (parser.tokenIsId(CIMXMLParser::E_SIMPLEREQ))
00213       {
00214          TempFileStream ostrEnt, ostrErr(500);
00215          processSimpleReq(parser, ostrEnt, ostrErr, context);
00216          if (hasError())
00217          {
00218             (*m_ostrEntity) << ostrErr.rdbuf();
00219             clearError();
00220          }
00221          else
00222          {
00223             (*m_ostrEntity) << ostrEnt.rdbuf();
00224          }
00225          parser.getNextTag();
00226          parser.mustGetEndTag();
00227       } // while
00228       (*m_ostrEntity) << "</MULTIRSP>";
00229    } // if MULTIRSP
00230    else if (parser.getToken() == CIMXMLParser::E_SIMPLEREQ)
00231    {
00232       makeXMLHeader(messageId, *m_ostrError);
00233       processSimpleReq(parser, *m_ostrEntity, *m_ostrError, context);
00234    }
00235    else
00236    {
00237       OW_THROWCIMMSG(CIMException::FAILED,
00238          "No <SIMPLEREQ> or <MULTIREQ> tag");
00239    }
00240    if (!hasError())
00241    {
00242       (*m_ostrEntity) << "</MESSAGE></CIM>\r\n";
00243    }
00244    return 0;
00245 }
00247 void
00248 XMLExecute::executeIntrinsic(ostream& ostr,
00249    CIMXMLParser& parser, CIMOMHandleIFC& hdl,
00250    const String& ns)
00251 {
00252    String functionNameLC = m_functionName;
00253    functionNameLC.toLowerCase();
00254    OW_LOGDEBUG(Format("Got function name. calling function %1",
00255       functionNameLC));
00256    FuncEntry fe = { 0, 0 };
00257    fe.name = functionNameLC.c_str();
00258    FuncEntry* i = std::lower_bound(g_funcs, g_funcsEnd, fe, funcEntryCompare);
00259    if (i == g_funcsEnd || strcmp((*i).name, fe.name) != 0)
00260    {
00261       // they sent over an intrinsic method call we don't know about
00262       OW_THROWCIM(CIMException::NOT_SUPPORTED);
00263    }
00264    else
00265    {
00266       ostr << "<IMETHODRESPONSE NAME=\"" << m_functionName <<
00267          "\">";
00268       // call the member function that was found
00269       (this->*((*i).func))(ostr, parser, ns, hdl);
00270       ostr << "</IMETHODRESPONSE>";
00271    }
00272 }
00274 void
00275 XMLExecute::executeExtrinsic(ostream& ostr, CIMXMLParser& parser,
00276    CIMOMHandleIFC& lch)
00277 {
00278    ostr << "<METHODRESPONSE NAME=\"" << m_functionName <<
00279       "\">";
00280    doInvokeMethod(ostr, parser, m_functionName, lch);
00281    ostr << "</METHODRESPONSE>";
00282 }
00284 void
00285 XMLExecute::doInvokeMethod(ostream& ostr, CIMXMLParser& parser,
00286    const String& methodName, CIMOMHandleIFC& hdl)
00287 {
00288    CIMParamValueArray inParams;
00289    CIMParamValueArray outParams;
00290    CIMObjectPath path = XMLCIMFactory::createObjectPath(parser);
00291    
00292    getParameters(parser, inParams);
00293    CIMValue cv = hdl.invokeMethod(path.getNameSpace(), path, methodName,
00294       inParams, outParams);
00295    if (cv)
00296    {
00297       ostr << "<RETURNVALUE PARAMTYPE=\"";
00298       CIMtoXML(cv.getCIMDataType(), ostr);
00299       ostr << "\" ";
00300       if (cv.getCIMDataType().isEmbeddedObjectType())
00301       {
00302          ostr << "EmbeddedObject=\"object\" ";
00303       }
00304       ostr << '>';
00305       CIMtoXML(cv, ostr);
00306       ostr << "</RETURNVALUE>";
00307    }
00308    for (size_t i=0; i < outParams.size(); i++)
00309    {
00310       CIMParamValueToXML(outParams[i], ostr);
00311    }
00312 }
00314 // STATIC
00315 //
00316 // Reads paramters for extrinsinc method calls
00317 //
00318 // Paramlist is the list of parameters (in) for this method, params will
00319 // be returned with input parameters in the same order as IN's were found in the
00320 // paramlist.
00321 //
00322 // paramlist is a vector of all the IN CIMParameters
00323 // params is a vector of CIMValues
00324 //
00325 void
00326 XMLExecute::getParameters(CIMXMLParser& parser,
00327    CIMParamValueArray& params)
00328 {
00329    //
00330    // Process parameters
00331    //
00332    while (parser.tokenIsId(CIMXMLParser::E_PARAMVALUE))
00333    {
00334       String parameterName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00335       String parameterType = parser.getAttribute(CIMXMLParser::A_PARAMTYPE);
00336       if (parameterType.empty())
00337       {
00338          parameterType = "string";
00339       }
00340 
00341       XMLCIMFactory::EEmbeddedObjectFlag embeddedObjectType = XMLCIMFactory::getEmbeddedObjectType(parser);
00342 
00343       parser.getNextTag();
00344       int token = parser.getToken();
00345       if (token != CIMXMLParser::E_VALUE
00346          && token != CIMXMLParser::E_VALUE_REFERENCE
00347          && token != CIMXMLParser::E_VALUE_ARRAY
00348          && token != CIMXMLParser::E_VALUE_REFARRAY
00349          )
00350       {
00351          params.push_back(CIMParamValue(parameterName,
00352             CIMValue(CIMNULL)));
00353       }
00354       else
00355       {
00356          params.push_back(CIMParamValue(parameterName, XMLCIMFactory::createValue(parser, parameterType, embeddedObjectType)));
00357       }
00358       parser.mustGetEndTag(); // pass </PARAMVALUE>
00359    }
00360 }
00362 namespace
00363 {
00364    class CIMObjectPathXMLOutputter : public CIMObjectPathResultHandlerIFC
00365    {
00366    public:
00367       CIMObjectPathXMLOutputter(ostream& ostr_, const String& host, const String& ns)
00368       : ostr(ostr_)
00369       , m_host(host)
00370       , m_namespace(ns)
00371       {}
00372    protected:
00373       virtual void doHandle(const CIMObjectPath &cop_)
00374       {
00375          ostr << "<OBJECTPATH>";
00376          // Make sure all outgoing object paths have our host name, instead of 127.0.0.1
00377          CIMObjectPath cop(cop_);
00378          if (cop.getFullNameSpace().isLocal())
00379          {
00380             try
00381             {
00382                cop.setHost(m_host);
00383             }
00384             catch (const SocketException& e)
00385             {
00386             }
00387          }
00388          if (cop.isClassPath())
00389          {
00390             CIMClassPathtoXML(cop, ostr);
00391          }
00392          else
00393          {
00394             // make sure the namespace is set
00395             if (cop.getNameSpace().empty())
00396             {
00397                cop.setNameSpace(m_namespace);
00398             }
00399             CIMInstancePathtoXML(cop, ostr);
00400          }
00401          ostr << "</OBJECTPATH>";
00402          checkStream(ostr);
00403       }
00404    private:
00405       ostream& ostr;
00406       String m_host;
00407       String m_namespace;
00408    };
00409 }
00411 namespace
00412 {
00413    struct param
00414    {
00415       enum Type
00416       {
00417          CLASSNAME,
00418          BOOLEAN,
00419          STRINGARRAY,
00420          INSTANCENAME,
00421          NAMEDINSTANCE,
00422          STRING,
00423          OBJECTNAME,
00424          PROPERTYVALUE
00425       };
00426       String name;
00427       bool optional;
00428       Type type;
00429       CIMValue defaultVal;
00430       bool isSet;
00431       CIMValue val;
00432       param(const String& name_,
00433          bool optional_ = true,
00434          Type type_ = STRING,
00435          const CIMValue& defaultVal_ = CIMValue(CIMNULL))
00436          : name(name_)
00437          , optional(optional_)
00438          , type(type_)
00439          , defaultVal(defaultVal_)
00440          , isSet(false)
00441          , val(CIMNULL)
00442       {}
00443    };
00444    struct name_comparer
00445    {
00446       name_comparer(const String& s_)
00447       : s(s_)
00448       {}
00449       bool operator()(const param& p)
00450       {
00451          return p.name.equalsIgnoreCase(s);
00452       }
00453       String s;
00454    };
00456    void getParameterValues(CIMXMLParser& parser,
00457       Array<param>& params)
00458    {
00459       // scan all the parameters and set them
00460       while (parser.tokenIsId(CIMXMLParser::E_IPARAMVALUE))
00461       {
00462          String name = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00463          Array<param>::iterator i = std::find_if (params.begin(), params.end(),
00464             name_comparer(name));
00465          if (i == params.end())
00466          {
00467             OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00468                Format("Parameter %1 is not a valid parameter", name).c_str());
00469          }
00470          
00471          parser.getNextTag();
00472          if (parser.tokenIsId(CIMXMLParser::E_IPARAMVALUE))
00473          {
00474             // pointing at </IPARAMVALUE>, thus
00475             // IPARAMVALUE was empty, so the value is NULL
00476             i->isSet = true;
00477             // should already be this: i->val = CIMValue();
00478          }
00479          else
00480          {
00481             switch (i->type)
00482             {
00483                case param::CLASSNAME:
00484                   if (!parser.tokenIsId(CIMXMLParser::E_CLASSNAME))
00485                   {
00486                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00487                         Format("Parameter %1 is the wrong type.  Expected <CLASSNAME> tag.",
00488                            i->name).c_str());
00489                   }
00490                   i->isSet = true;
00491                   i->val = CIMValue(XMLCIMFactory::createObjectPath(parser).getClassName());
00492                   break;
00493                case param::BOOLEAN:
00494                   if (!parser.tokenIsId(CIMXMLParser::E_VALUE))
00495                   {
00496                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00497                         Format("Parameter %1 is the wrong type.  Expected <VALUE> tag.",
00498                            i->name).c_str());
00499                   }
00500                   i->isSet = true;
00501                   i->val = XMLCIMFactory::createValue(parser, "boolean", XMLCIMFactory::E_VALUE_NOT_EMBEDDED_OBJECT);
00502                   break;
00503                case param::STRINGARRAY:
00504                   if (!parser.tokenIsId(CIMXMLParser::E_VALUE_ARRAY))
00505                   {
00506                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00507                         Format("Parameter %1 is the wrong type.  Expected <VALUE.ARRAY> tag.",
00508                            i->name).c_str());
00509                   }
00510                   i->isSet = true;
00511                   i->val = XMLCIMFactory::createValue(parser, "string", XMLCIMFactory::E_VALUE_NOT_EMBEDDED_OBJECT);
00512                   break;
00513                case param::INSTANCENAME:
00514                   if (!parser.tokenIsId(CIMXMLParser::E_INSTANCENAME))
00515                   {
00516                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00517                         Format("Parameter %1 is the wrong type.  Expected <INSTANCENAME> tag.",
00518                            i->name).c_str());
00519                   }
00520                   i->isSet = true;
00521                   i->val = CIMValue(XMLCIMFactory::createObjectPath(parser));
00522                   break;
00523                case param::NAMEDINSTANCE:
00524                {
00525                   if (!parser.tokenIsId(CIMXMLParser::E_VALUE_NAMEDINSTANCE))
00526                   {
00527                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00528                         Format("Parameter %1 is the wrong type.  Expected <VALUE.NAMEDINSTANCE> tag. %2",
00529                            i->name, parser).c_str());
00530                   }
00531                   i->isSet = true;
00532                   parser.mustGetChildId(CIMXMLParser::E_INSTANCENAME);
00533                   CIMObjectPath ipath(XMLCIMFactory::createObjectPath(parser));
00534                   CIMInstance inst(XMLCIMFactory::createInstance(parser));
00535                   parser.mustGetEndTag(); // pass </VALUE.NAMEDINSTANCE>
00536                   inst.setKeys(ipath.getKeys());
00537                   i->val = CIMValue(inst);
00538                   break;
00539                }
00540                case param::STRING:
00541                   if (!parser.tokenIsId(CIMXMLParser::E_VALUE))
00542                   {
00543                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00544                         Format("Parameter %1 is the wrong type.  Expected <VALUE> tag.",
00545                            i->name).c_str());
00546                   }
00547                   i->isSet = true;
00548                   i->val = XMLCIMFactory::createValue(parser, "string", XMLCIMFactory::E_VALUE_NOT_EMBEDDED_OBJECT);
00549                   break;
00550                case param::OBJECTNAME:
00551                   if (!parser.tokenIsId(CIMXMLParser::E_INSTANCENAME)
00552                      && !parser.tokenIsId(CIMXMLParser::E_CLASSNAME))
00553                   {
00554                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00555                         Format("Parameter %1 is the wrong type.  Expected <INSTANCENAME> or <CLASSNAME> tag.",
00556                            i->name).c_str());
00557                   }
00558                   i->isSet = true;
00559                   i->val = CIMValue(XMLCIMFactory::createObjectPath(parser));
00560                   break;
00561                case param::PROPERTYVALUE:
00562                   if (!parser.tokenIsId(CIMXMLParser::E_VALUE)
00563                      && !parser.tokenIsId(CIMXMLParser::E_VALUE_ARRAY)
00564                      && !parser.tokenIsId(CIMXMLParser::E_VALUE_REFERENCE))
00565                   {
00566                      OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00567                         Format("Parameter %1 is the wrong type.  Expected <VALUE> or <VALUE.ARRAY> or <VALUE.REFERENCE> tag.",
00568                            i->name).c_str());
00569                   }
00570                   i->isSet = true;
00571                   i->val = XMLCIMFactory::createValue(parser, "string", XMLCIMFactory::E_VALUE_NOT_EMBEDDED_OBJECT);
00572                   break;
00573                default:
00574                   OW_ASSERT(0);
00575                   break;
00576             }
00577          }
00578          parser.mustGetEndTag(); // pass </IPARAMVALUE>
00579       }
00580       // make sure all the parameters were set that don't have defaults
00581       // and assign the defaults to those that weren't set.
00582       for (size_t i = 0; i < params.size(); ++i)
00583       {
00584          if (params[i].optional == false && params[i].isSet == false)
00585          {
00586             OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00587                Format("Non-optional parameter %1 was not given",
00588                   params[i].name).c_str());
00589          }
00590          if (params[i].isSet == false)
00591          {
00592             params[i].val = params[i].defaultVal;
00593          }
00594          // make sure that booleans and strings always have a valid value
00595          if (!params[i].val)
00596          {
00597             switch (params[i].type)
00598             {
00599                case param::BOOLEAN:
00600                   params[i].val = CIMValue(false);
00601                   break;
00602                case param::STRING:
00603                case param::CLASSNAME:
00604                   params[i].val = CIMValue("");
00605                   break;
00606                
00607                default:
00608                   break;
00609             }
00610          }
00611       }
00612    }
00613 }
00614 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00615 
00616 void
00617 XMLExecute::associatorNames(ostream& ostr, CIMXMLParser& parser,
00618    const String& ns, CIMOMHandleIFC& hdl)
00619 {
00620    Array<param> params;
00621    params.push_back(param(CIMXMLParser::P_ObjectName, false, param::OBJECTNAME));
00622    params.push_back(param(CIMXMLParser::P_AssocClass, true, param::CLASSNAME));
00623    params.push_back(param(CIMXMLParser::P_ResultClass, true, param::CLASSNAME));
00624    params.push_back(param(CIMXMLParser::P_Role, true, param::STRING, CIMValue("")));
00625    params.push_back(param(CIMXMLParser::P_ResultRole, true, param::STRING, CIMValue("")));
00626    getParameterValues(parser, params);
00627    CIMObjectPath objectName = params[0].val.toCIMObjectPath();
00628    String assocClass;
00629    if (params[1].isSet)
00630    {
00631       assocClass = params[1].val.toString();
00632    }
00633    String resultClass;
00634    if (params[2].isSet)
00635    {
00636       resultClass = params[2].val.toString();
00637    }
00638    ostr << "<IRETURNVALUE>";
00639    CIMObjectPathXMLOutputter handler(ostr, getHost(), ns);
00640    hdl.associatorNames(ns, objectName, handler, assocClass, resultClass,
00641       params[3].val.toString(), params[4].val.toString());
00642    ostr << "</IRETURNVALUE>";
00643 }
00645 namespace
00646 {
00647    class AssocCIMInstanceXMLOutputter : public CIMInstanceResultHandlerIFC
00648    {
00649    public:
00650       AssocCIMInstanceXMLOutputter(
00651          std::ostream& ostr_,
00652          const String& ns_,
00653          const String& host_)
00654       : ostr(ostr_)
00655       , ns(ns_)
00656       , m_host(host_)
00657       {}
00658    protected:
00659       virtual void doHandle(const CIMInstance &ci)
00660       {
00661          ostr <<  "<VALUE.OBJECTWITHPATH>";
00662          // If instance has a namespace, use that
00663          // instead of what we were constructed with
00664          String cins = ci.getNameSpace();
00665          if (cins.empty())
00666          {
00667             cins = ns;
00668          }
00669          CIMObjectPath cop( cins, ci );
00670          // Make sure all outgoing object paths have our host name, instead of 127.0.0.1
00671          cop.setHost(m_host);
00672          CIMInstancePathAndInstancetoXML(ci, ostr, cop);
00673          ostr << "</VALUE.OBJECTWITHPATH>\n";
00674          checkStream(ostr);
00675       
00676       }
00677       std::ostream& ostr;
00678       String ns;
00679       String m_host;
00680    };
00681    class AssocCIMClassXMLOutputter : public CIMClassResultHandlerIFC
00682    {
00683    public:
00684       AssocCIMClassXMLOutputter(
00685          std::ostream& ostr_,
00686          const String& ns_)
00687       : ostr(ostr_)
00688       , ns(ns_)
00689       {}
00690    protected:
00691       virtual void doHandle(const CIMClass &cc)
00692       {
00693          ostr <<  "<VALUE.OBJECTWITHPATH>";
00694          CIMObjectPath cop(cc.getName(), ns);
00695          CIMClassPathtoXML(cop,ostr);
00696          CIMtoXML(cc, ostr);
00697          ostr << "</VALUE.OBJECTWITHPATH>\n";
00698          checkStream(ostr);
00699       
00700       }
00701       std::ostream& ostr;
00702       const String& ns;
00703    };
00704 }
00706 void XMLExecute::associators(ostream& ostr,
00707    CIMXMLParser& parser, const String& ns, CIMOMHandleIFC& hdl)
00708 {
00709    Array<param> params;
00710    params.push_back(param(CIMXMLParser::P_ObjectName, false, param::OBJECTNAME));
00711    params.push_back(param(CIMXMLParser::P_AssocClass, true, param::CLASSNAME));
00712    params.push_back(param(CIMXMLParser::P_ResultClass, true, param::CLASSNAME));
00713    params.push_back(param(CIMXMLParser::P_Role, true, param::STRING, CIMValue("")));
00714    params.push_back(param(CIMXMLParser::P_ResultRole, true, param::STRING, CIMValue("")));
00715    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(false)));
00716    params.push_back(param(CIMXMLParser::P_IncludeClassOrigin, true, param::BOOLEAN, CIMValue(false)));
00717    params.push_back(param(CIMXMLParser::P_PropertyList, true, param::STRINGARRAY, CIMValue(CIMNULL)));
00718    getParameterValues(parser, params);
00719    CIMObjectPath objectName = params[0].val.toCIMObjectPath();
00720    String assocClass;
00721    if (params[1].isSet)
00722    {
00723       assocClass = params[1].val.toString();
00724    }
00725    String resultClass;
00726    if (params[2].isSet)
00727    {
00728       resultClass = params[2].val.toString();
00729    }
00730    StringArray propertyList;
00731    StringArray* pPropList = 0;
00732    if (params[7].isSet)
00733    {
00734       propertyList = params[7].val.toStringArray();
00735       pPropList = &propertyList;
00736    }
00737    
00738    bool includeQualifiers = params[5].val.toBool();
00739    bool includeClassOrigin = params[6].val.toBool();
00740    String role = params[3].val.toString();
00741    String resultRole = params[4].val.toString();
00742    ostr << "<IRETURNVALUE>";
00743    if (objectName.isClassPath())
00744    {
00745       // class path
00746       AssocCIMClassXMLOutputter handler(ostr, ns);
00747       hdl.associatorsClasses(ns, objectName, handler,
00748          assocClass, resultClass, role, resultRole,
00749          includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
00750          includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
00751          pPropList);
00752    }
00753    else
00754    {
00755       // instance path
00756       AssocCIMInstanceXMLOutputter handler(ostr, ns,
00757          getHost());
00758       hdl.associators(ns, objectName, handler,
00759          assocClass, resultClass, role, resultRole,
00760          includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
00761          includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
00762          pPropList);
00763    }
00764    ostr << "</IRETURNVALUE>";
00765 }
00766 #endif // #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
00767 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00768 
00769 void XMLExecute::createClass(ostream& /*ostr*/, CIMXMLParser& parser,
00770    const String& ns, CIMOMHandleIFC& hdl)
00771 {
00772    parser.mustGetChild();
00773    hdl.createClass( ns, XMLCIMFactory::createClass(parser) );
00774 }
00776 void
00777 XMLExecute::modifyClass(ostream& /*ostr*/, CIMXMLParser& parser,
00778    const String& ns, CIMOMHandleIFC& hdl)
00779 {
00780    String name = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00781    if (!name.equalsIgnoreCase(CIMXMLParser::P_ModifiedClass))
00782    {
00783       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00784          Format("Parameter name was %1", name).c_str());
00785    }
00786    parser.mustGetChild();
00787    //
00788    // Process <CLASS> element
00789    //
00790    CIMClass cimClass = XMLCIMFactory::createClass(parser);
00791    hdl.modifyClass(ns, cimClass);
00792 }
00794 void XMLExecute::deleteClass(ostream& /*ostr*/, CIMXMLParser& parser,
00795    const String& ns, CIMOMHandleIFC& hdl)
00796 {
00797    Array<param> params;
00798    params.push_back(param(CIMXMLParser::P_ClassName, false, param::CLASSNAME));
00799    getParameterValues(parser, params);
00800    String className = params[0].val.toString();
00801    hdl.deleteClass(ns, className);
00802 }
00803 #endif // #ifndef OW_DISABLE_SCHEMA_MANIPULATION
00804 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00805 
00806 void XMLExecute::createInstance(ostream& ostr, CIMXMLParser& parser,
00807    const String& ns, CIMOMHandleIFC& hdl)
00808 {
00809    parser.mustGetChild();     // Point parser to <INSTANCE> tag
00810    CIMInstance cimInstance = XMLCIMFactory::createInstance(parser);
00811    CIMName className = cimInstance.getClassName();
00812    //CIMObjectPath realPath = CIMObjectPath(className, path.getNameSpace());
00813    // Special treatment for __Namespace class
00814    if (className == "__Namespace")
00815    {
00816       CIMProperty prop = cimInstance.getProperty(
00817          CIMProperty::NAME_PROPERTY);
00818       // Need the name property since it contains the name of the new
00819       // name space
00820       if (!prop)
00821       {
00822          OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00823             "Name property not specified for new namespace");
00824       }
00825       // If the name property didn't come across as a key, then
00826       // set the name property as the key
00827       if (!prop.isKey())
00828       {
00829          prop.addQualifier(CIMQualifier::createKeyQualifier());
00830       }
00831       cimInstance.setProperty(prop);
00832    }
00833    ostr << "<IRETURNVALUE>";
00834    CIMObjectPath newPath = hdl.createInstance(ns, cimInstance);
00835    CIMInstanceNametoXML(newPath, ostr);
00836    ostr << "</IRETURNVALUE>";
00837 }
00839 void
00840 XMLExecute::modifyInstance(ostream& /*ostr*/, CIMXMLParser& parser,
00841    const String& ns, CIMOMHandleIFC& hdl)
00842 {
00843    Array<param> params;
00844    params.push_back(param(CIMXMLParser::P_ModifiedInstance, false, param::NAMEDINSTANCE));
00845    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(true)));
00846    params.push_back(param(CIMXMLParser::P_PropertyList, true, param::STRINGARRAY, CIMValue(CIMNULL)));
00847    
00848    getParameterValues(parser, params);
00849    
00850    StringArray propertyList;
00851    StringArray* pPropList = 0;
00852    if (params[2].isSet)
00853    {
00854       propertyList = params[2].val.toStringArray();
00855       pPropList = &propertyList;
00856    }
00857    
00858    bool includeQualifiers = params[1].val.toBool();
00859    CIMInstance modifiedInstance(CIMNULL);
00860    params[0].val.get(modifiedInstance);
00861    hdl.modifyInstance(ns, modifiedInstance,
00862       includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
00863       pPropList);
00864 }
00866 void
00867 XMLExecute::deleteInstance(ostream& /*ostr*/, CIMXMLParser& parser,
00868    const String& ns, CIMOMHandleIFC& hdl)
00869 {
00870    String name = parser.getAttribute( CIMXMLParser::A_NAME );
00871    if ( !name.equalsIgnoreCase( "InstanceName" ) )
00872    {
00873       OW_THROWCIMMSG( CIMException::INVALID_PARAMETER,
00874          String( "Parameter name was " + name ).c_str() );
00875    }
00876    parser.mustGetChild();
00877    CIMObjectPath instPath = XMLCIMFactory::createObjectPath(parser);
00878    hdl.deleteInstance( ns, instPath );
00879 }
00880 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00881 
00882 void
00883 XMLExecute::setProperty(ostream& /*ostr*/, CIMXMLParser& parser,
00884    const String& ns, CIMOMHandleIFC& hdl)
00885 {
00886    Array<param> params;
00887    params.push_back(param(CIMXMLParser::P_InstanceName, false, param::INSTANCENAME));
00888    params.push_back(param(CIMXMLParser::P_PropertyName, false, param::STRING, CIMValue("")));
00889    params.push_back(param(CIMXMLParser::P_NewValue, true, param::PROPERTYVALUE));
00890    getParameterValues(parser, params);
00891    CIMObjectPath instpath = params[0].val.toCIMObjectPath();
00892    hdl.setProperty(ns, instpath, params[1].val.toString(), params[2].val);
00893 }
00894 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
00895 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
00896 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00897 
00898 void
00899 XMLExecute::setQualifier(ostream& /*ostr*/, CIMXMLParser& parser,
00900    const String& ns, CIMOMHandleIFC& hdl)
00901 {
00902    String argName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00903    if (!argName.equalsIgnoreCase(CIMXMLParser::P_QualifierDeclaration))
00904    {
00905       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00906          "invalid qualifier xml");
00907    }
00908    parser.mustGetChildId(
00909       CIMXMLParser::E_QUALIFIER_DECLARATION);
00910    
00911    CIMQualifierType cimQualifier;
00912    XMLQualifier::processQualifierDecl(parser, cimQualifier);
00913    hdl.setQualifierType(ns, cimQualifier);
00914 }
00916 void
00917 XMLExecute::deleteQualifier(ostream& /*ostr*/, CIMXMLParser& parser,
00918    const String& ns, CIMOMHandleIFC& hdl)
00919 {
00920    String qualName = XMLQualifier::getQualifierName(parser);
00921    hdl.deleteQualifierType(ns, qualName);
00922 }
00924 namespace
00925 {
00926    class CIMQualifierTypeXMLOutputter : public CIMQualifierTypeResultHandlerIFC
00927    {
00928    public:
00929       CIMQualifierTypeXMLOutputter(
00930          std::ostream& ostr_)
00931       : ostr(ostr_)
00932       {}
00933    protected:
00934       virtual void doHandle(const CIMQualifierType &i)
00935       {
00936          CIMtoXML(i, ostr);
00937          checkStream(ostr);
00938       }
00939       std::ostream& ostr;
00940    };
00941 }
00943 void
00944 XMLExecute::enumerateQualifiers(ostream& ostr, CIMXMLParser& /*parser*/,
00945    const String& ns, CIMOMHandleIFC& hdl)
00946 {
00947    ostr << "<IRETURNVALUE>";
00948    CIMQualifierTypeXMLOutputter handler(ostr);
00949    hdl.enumQualifierTypes(ns, handler);
00950    ostr << "</IRETURNVALUE>";
00951 }
00952 #endif // #ifndef OW_DISABLE_QUALIFIER_DECLARATION
00953 
00954 namespace
00955 {
00956    class ClassNameXMLWriter : public StringResultHandlerIFC
00957    {
00958    public:
00959       ClassNameXMLWriter(std::ostream& ostr_) : ostr(ostr_) {}
00960    protected:
00961       virtual void doHandle(const String &name)
00962       {
00963          ostr << "<CLASSNAME NAME=\"" << name <<
00964             "\"/>";
00965          checkStream(ostr);
00966       }
00967    private:
00968       std::ostream& ostr;
00969    };
00970 }
00972 void
00973 XMLExecute::enumerateClassNames(ostream& ostr, CIMXMLParser& parser,
00974    const String& ns, CIMOMHandleIFC& hdl)
00975 {
00976    Array<param> params;
00977    params.push_back(param(CIMXMLParser::P_ClassName, true, param::CLASSNAME, CIMValue("")));
00978    params.push_back(param(CIMXMLParser::P_DeepInheritance, true, param::BOOLEAN, CIMValue(false)));
00979    getParameterValues(parser, params);
00980    String className = params[0].val.toString();
00981    EDeepFlag deepInheritance(
00982       params[1].val.toBool() ? E_DEEP : E_SHALLOW);
00983    ostr << "<IRETURNVALUE>";
00984    ClassNameXMLWriter handler(ostr);
00985    hdl.enumClassNames(ns, className, handler,
00986       deepInheritance);
00987    ostr << "</IRETURNVALUE>";
00988 }
00990 namespace
00991 {
00992    class CIMClassXMLOutputter : public CIMClassResultHandlerIFC
00993    {
00994    public:
00995       CIMClassXMLOutputter(ostream& ostr_)
00996       : ostr(ostr_)
00997       {}
00998    protected:
00999       virtual void doHandle(const CIMClass &c)
01000       {
01001          CIMtoXML(c, ostr);
01002          checkStream(ostr);
01003       }
01004    private:
01005       ostream& ostr;
01006    };
01007 }
01009 void
01010 XMLExecute::enumerateClasses( ostream& ostr, CIMXMLParser& parser,
01011    const String& ns, CIMOMHandleIFC& hdl)
01012 {
01013    Array<param> params;
01014    params.push_back(param(CIMXMLParser::P_ClassName, true, param::CLASSNAME));
01015    params.push_back(param(CIMXMLParser::P_DeepInheritance, true, param::BOOLEAN, CIMValue(false)));
01016    params.push_back(param(CIMXMLParser::P_LocalOnly, true, param::BOOLEAN, CIMValue(true)));
01017    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(true)));
01018    params.push_back(param(CIMXMLParser::P_IncludeClassOrigin, true, param::BOOLEAN, CIMValue(false)));
01019    getParameterValues(parser, params);
01020    String className;
01021    if (params[0].isSet)
01022    {
01023       className = params[0].val.toString();
01024    }
01025    ostr << "<IRETURNVALUE>";
01026    bool deep = params[1].val.toBool();
01027    bool localOnly = params[2].val.toBool();
01028    bool includeQualifiers = params[3].val.toBool();
01029    bool includeClassOrigin = params[4].val.toBool();
01030    CIMClassXMLOutputter handler(ostr);
01031    hdl.enumClass(ns, className, handler,
01032       deep ? E_DEEP : E_SHALLOW,
01033       localOnly ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY,
01034       includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
01035       includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN);
01036    ostr << "</IRETURNVALUE>";
01037 }
01039 namespace
01040 {
01041    class CIMInstanceNameXMLOutputter : public CIMObjectPathResultHandlerIFC
01042    {
01043    public:
01044       CIMInstanceNameXMLOutputter(ostream& ostr_)
01045       : ostr(ostr_)
01046       {}
01047    protected:
01048       virtual void doHandle(const CIMObjectPath &cop)
01049       {
01050          CIMInstanceNametoXML(cop, ostr);
01051          checkStream(ostr);
01052       }
01053    private:
01054       ostream& ostr;
01055    };
01056 }
01058 void
01059 XMLExecute::enumerateInstanceNames(ostream& ostr, CIMXMLParser& parser,
01060    const String& ns, CIMOMHandleIFC& hdl)
01061 {
01062    Array<param> params;
01063    params.push_back(param(CIMXMLParser::P_ClassName, false, param::CLASSNAME));
01064    getParameterValues(parser, params);
01065    String className = params[0].val.toString();
01066    
01067    ostr << "<IRETURNVALUE>";
01068    CIMInstanceNameXMLOutputter handler(ostr);
01069    hdl.enumInstanceNames(ns, className, handler);
01070    ostr << "</IRETURNVALUE>";
01071 }
01073 namespace
01074 {
01075    class CIMInstanceXMLOutputter : public CIMInstanceResultHandlerIFC
01076    {
01077    public:
01078       CIMInstanceXMLOutputter(
01079          std::ostream& ostr_,
01080          const String& ns_)
01081       : ostr(ostr_)
01082       , ns(ns_)
01083       {}
01084    protected:
01085       virtual void doHandle(const CIMInstance &i)
01086       {
01087          const CIMInstance& cimInstance = i;
01088          CIMObjectPath cop(ns, cimInstance);
01089          ostr << "<VALUE.NAMEDINSTANCE>";
01090          CIMInstanceNameAndInstancetoXML(cimInstance, ostr, cop);
01091          ostr << "</VALUE.NAMEDINSTANCE>";
01092          checkStream(ostr);
01093       }
01094       std::ostream& ostr;
01095       String ns;
01096    };
01097 }
01099 void
01100 XMLExecute::enumerateInstances(ostream& ostr, CIMXMLParser& parser,
01101    const String& ns, CIMOMHandleIFC& hdl)
01102 {
01103    Array<param> params;
01104    params.push_back(param(CIMXMLParser::P_ClassName, false, param::CLASSNAME));
01105    params.push_back(param(CIMXMLParser::P_LocalOnly, true, param::BOOLEAN, CIMValue(true)));
01106    params.push_back(param(CIMXMLParser::P_DeepInheritance, true, param::BOOLEAN, CIMValue(true)));
01107    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(false)));
01108    params.push_back(param(CIMXMLParser::P_IncludeClassOrigin, true, param::BOOLEAN, CIMValue(false)));
01109    params.push_back(param(CIMXMLParser::P_PropertyList, true, param::STRINGARRAY, CIMValue(CIMNULL)));
01110    getParameterValues(parser, params);
01111    String className = params[0].val.toString();
01112    StringArray propertyList;
01113    StringArray* pPropList = 0;
01114    if (params[5].isSet)
01115    {
01116       propertyList = params[5].val.toStringArray();
01117       pPropList = &propertyList;
01118    }
01119    bool localOnly = params[1].val.toBool();
01120    bool deep = params[2].val.toBool();
01121    bool includeQualifiers = params[3].val.toBool();
01122    bool includeClassOrigin = params[4].val.toBool();
01123    ostr << "<IRETURNVALUE>";
01124    CIMInstanceXMLOutputter handler(ostr, ns);
01125    hdl.enumInstances(ns, className, handler,
01126       deep ? E_DEEP : E_SHALLOW,
01127       localOnly ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY,
01128       includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
01129       includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
01130       pPropList);
01131    ostr << "</IRETURNVALUE>";
01132 }
01134 void
01135 XMLExecute::getClass(ostream& ostr, CIMXMLParser& parser,
01136    const String& ns, CIMOMHandleIFC& hdl)
01137 {
01138    Array<param> params;
01139    params.push_back(param(CIMXMLParser::P_ClassName, false, param::CLASSNAME));
01140    params.push_back(param(CIMXMLParser::P_LocalOnly, true, param::BOOLEAN, CIMValue(true)));
01141    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(true)));
01142    params.push_back(param(CIMXMLParser::P_IncludeClassOrigin, true, param::BOOLEAN, CIMValue(false)));
01143    params.push_back(param(CIMXMLParser::P_PropertyList, true, param::STRINGARRAY, CIMValue(CIMNULL)));
01144    getParameterValues(parser, params);
01145    String className = params[0].val.toString();
01146    StringArray propertyList;
01147    StringArray* pPropList = 0;
01148    if (params[4].isSet)
01149    {
01150       propertyList = params[4].val.toStringArray();
01151       pPropList = &propertyList;
01152    }
01153    bool localOnly = params[1].val.toBool();
01154    bool includeQualifiers = params[2].val.toBool();
01155    bool includeClassOrigin = params[3].val.toBool();
01156    ostr << "<IRETURNVALUE>";
01157    CIMClass cimClass = hdl.getClass(ns, className,
01158       localOnly ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY,
01159       includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
01160       includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
01161       pPropList);
01162    
01163    CIMtoXML(cimClass, ostr);
01164    ostr << "</IRETURNVALUE>";
01165 }
01167 void
01168 XMLExecute::getInstance(ostream& ostr, CIMXMLParser& parser,
01169    const String& ns, CIMOMHandleIFC& hdl)
01170 {
01171    Array<param> params;
01172    params.push_back(param(CIMXMLParser::P_InstanceName, false, param::INSTANCENAME));
01173    params.push_back(param(CIMXMLParser::P_LocalOnly, true, param::BOOLEAN, CIMValue(true)));
01174    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(false)));
01175    params.push_back(param(CIMXMLParser::P_IncludeClassOrigin, true, param::BOOLEAN, CIMValue(false)));
01176    params.push_back(param(CIMXMLParser::P_PropertyList, true, param::STRINGARRAY, CIMValue(CIMNULL)));
01177    getParameterValues(parser, params);
01178    CIMObjectPath instancePath = params[0].val.toCIMObjectPath();
01179    StringArray propertyList;
01180    StringArray* pPropList = 0;
01181    if (params[4].isSet)
01182    {
01183       propertyList = params[4].val.toStringArray();
01184       pPropList = &propertyList;
01185    }
01186    bool localOnly = params[1].val.toBool();
01187    bool includeQualifiers = params[2].val.toBool();
01188    bool includeClassOrigin = params[3].val.toBool();
01189    ostr << "<IRETURNVALUE>";
01190    CIMInstance cimInstance = hdl.getInstance(ns, instancePath,
01191       localOnly ? E_LOCAL_ONLY : E_NOT_LOCAL_ONLY,
01192       includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
01193       includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
01194       pPropList);
01195    CIMInstancetoXML(cimInstance, ostr);
01196    ostr << "</IRETURNVALUE>";
01197 }
01198 #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
01199 
01200 void
01201 XMLExecute::getProperty(ostream& ostr, CIMXMLParser& parser,
01202    const String& ns, CIMOMHandleIFC& hdl)
01203 {
01204    Array<param> params;
01205    params.push_back(param(CIMXMLParser::P_InstanceName, false, param::INSTANCENAME));
01206    params.push_back(param(CIMXMLParser::P_PropertyName, false, param::STRING, CIMValue("")));
01207    getParameterValues(parser, params);
01208    CIMObjectPath instpath = params[0].val.toCIMObjectPath();
01209    ostr << "<IRETURNVALUE>";
01210    CIMValue cv = hdl.getProperty(ns, instpath, params[1].val.toString());
01211    if (cv)
01212    {
01213       CIMtoXML(cv, ostr);
01214    }
01215    ostr << "</IRETURNVALUE>";
01216 }
01217 #endif // #if !defined(OW_DISABLE_PROPERTY_OPERATIONS)
01218 
01219 void
01220 XMLExecute::getQualifier(ostream& ostr, CIMXMLParser& parser,
01221    const String& ns, CIMOMHandleIFC& hdl)
01222 {
01223    String qualifierName = XMLQualifier::getQualifierName(parser);
01224    ostr << "<IRETURNVALUE>";
01225    CIMQualifierType qual = hdl.getQualifierType(ns, qualifierName);
01226    CIMtoXML(qual, ostr);
01227    ostr << "</IRETURNVALUE>";
01228 }
01229 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
01230 
01231 void
01232 XMLExecute::referenceNames(ostream& ostr, CIMXMLParser& parser,
01233    const String& ns,CIMOMHandleIFC& hdl)
01234 {
01235    Array<param> params;
01236    params.push_back(param(CIMXMLParser::P_ObjectName, false, param::OBJECTNAME));
01237    params.push_back(param(CIMXMLParser::P_ResultClass, true, param::CLASSNAME));
01238    params.push_back(param(CIMXMLParser::P_Role, true, param::STRING, CIMValue("")));
01239    getParameterValues(parser, params);
01240    CIMObjectPath path = params[0].val.toCIMObjectPath();
01241    String resultClass;
01242    if (params[1].isSet)
01243    {
01244       resultClass = params[1].val.toString();
01245    }
01246    ostr << "<IRETURNVALUE>";
01247    CIMObjectPathXMLOutputter handler(ostr, getHost(), ns);
01248    hdl.referenceNames(ns, path, handler, resultClass, params[2].val.toString());
01249    ostr << "</IRETURNVALUE>";
01250 }
01252 void
01253 XMLExecute::references(ostream& ostr, CIMXMLParser& parser,
01254    const String& ns, CIMOMHandleIFC& hdl)
01255 {
01256    Array<param> params;
01257    params.push_back(param(CIMXMLParser::P_ObjectName, false, param::OBJECTNAME));
01258    params.push_back(param(CIMXMLParser::P_ResultClass, true, param::CLASSNAME));
01259    params.push_back(param(CIMXMLParser::P_Role, true, param::STRING, CIMValue("")));
01260    params.push_back(param(CIMXMLParser::P_IncludeQualifiers, true, param::BOOLEAN, CIMValue(false)));
01261    params.push_back(param(CIMXMLParser::P_IncludeClassOrigin, true, param::BOOLEAN, CIMValue(false)));
01262    params.push_back(param(CIMXMLParser::P_PropertyList, true, param::STRINGARRAY, CIMValue(CIMNULL)));
01263    getParameterValues(parser, params);
01264    CIMObjectPath path = params[0].val.toCIMObjectPath();
01265    String resultClass;
01266    if (params[1].isSet)
01267    {
01268       resultClass = params[1].val.toString();
01269    }
01270    StringArray propertyList;
01271    StringArray* pPropList = 0;
01272    if (params[5].isSet)
01273    {
01274       propertyList = params[5].val.toStringArray();
01275       pPropList = &propertyList;
01276    }
01277    
01278    bool includeQualifiers = params[3].val.toBool();
01279    bool includeClassOrigin = params[4].val.toBool();
01280    String role = params[2].val.toString();
01281    
01282    ostr << "<IRETURNVALUE>";
01283    if (path.isClassPath())
01284    {
01285       // It's a class
01286       AssocCIMClassXMLOutputter handler(ostr, ns);
01287       hdl.referencesClasses(ns, path, handler, resultClass,
01288          role,
01289          includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
01290          includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
01291          pPropList);
01292    }
01293    else
01294    {
01295       AssocCIMInstanceXMLOutputter handler(ostr, ns,
01296          getHost());
01297       hdl.references(ns, path, handler, resultClass,
01298          role,
01299          includeQualifiers ? E_INCLUDE_QUALIFIERS : E_EXCLUDE_QUALIFIERS,
01300          includeClassOrigin ? E_INCLUDE_CLASS_ORIGIN : E_EXCLUDE_CLASS_ORIGIN,
01301          pPropList);
01302    }
01303    ostr << "</IRETURNVALUE>";
01304 }
01305 #endif // #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
01306 
01307 namespace
01308 {
01309    class execQueryXMLOutputter : public CIMInstanceResultHandlerIFC
01310    {
01311    public:
01312       execQueryXMLOutputter(std::ostream& ostr_, const String& ns_)
01313       : ostr(ostr_)
01314       , ns(ns_)
01315       {}
01316    protected:
01317       virtual void doHandle(const CIMInstance &i)
01318       {
01319          // If instance has a namespace, use that
01320          // instead of what we were constructed with
01321          String cins = i.getNameSpace();
01322          if (cins.empty())
01323          {
01324             cins = ns;
01325          }
01326          CIMObjectPath cop(cins, i);
01327          ostr << "<VALUE.OBJECTWITHPATH>";
01328          CIMInstancePathAndInstancetoXML(i, ostr, cop);
01329          ostr << "</VALUE.OBJECTWITHPATH>";
01330          checkStream(ostr);
01331       }
01332    private:
01333       std::ostream& ostr;
01334       const String& ns;
01335    };
01336 }
01338 void
01339 XMLExecute::execQuery(ostream& ostr, CIMXMLParser& parser,
01340    const String& ns, CIMOMHandleIFC& hdl)
01341 {
01342    Array<param> params;
01343    params.push_back(param(CIMXMLParser::P_QueryLanguage, false, param::STRING));
01344    params.push_back(param(CIMXMLParser::P_Query, false, param::STRING));
01345    getParameterValues(parser, params);
01346    ostr << "<IRETURNVALUE>";
01347    execQueryXMLOutputter handler(ostr, ns);
01348    hdl.execQuery(ns, handler, params[1].val.toString(), params[0].val.toString());
01349    ostr << "</IRETURNVALUE>";
01350 }
01352 void
01353 XMLExecute::processSimpleReq(CIMXMLParser& parser, ostream& ostrEntity,
01354    ostream& ostrError, OperationContext& context)
01355 {
01356    try
01357    {
01358       ostrEntity << "<SIMPLERSP>";
01359       
01360       // start out pointing to SIMPLEREQ
01361       OW_ASSERT(parser.tokenIsId(CIMXMLParser::E_SIMPLEREQ));
01362       // <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
01363       parser.mustGetChild();
01364       if (parser.getToken() == CIMXMLParser::E_METHODCALL)
01365       {
01366          m_isIntrinsic = false;
01367       }
01368       else if (parser.getToken() == CIMXMLParser::E_IMETHODCALL)
01369       {
01370          m_isIntrinsic = true;
01371       }
01372       else
01373       {
01374          OW_THROWCIMMSG(CIMException::FAILED,
01375             "No <METHODCALL> or <IMETHODCALL> element");
01376       }
01377       // <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH, IPARAMVALUE*)>
01378       // <!ATTLIST IMETHODCALL %CIMName;>
01379       // or
01380       // <!ELEMENT METHODCALL ((LOCALINSTANCEPATH|LOCALCLASSPATH),PARAMVALUE*)>
01381       // <!ATTLIST METHODCALL %CIMName;>
01382       m_functionName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
01383       parser.mustGetChild();
01384       CIMOMHandleIFCRef hdl = this->getEnvironment()->getCIMOMHandle(context);
01385       if (m_isIntrinsic)
01386       {
01387          // <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
01388          parser.mustGetChildId(CIMXMLParser::E_NAMESPACE);
01389          String nameSpace = XMLClass::getNameSpace(parser);
01390          
01391          // move past LOCALNAMESPACEPATH to IPARAMVALUE*
01392          parser.mustGetEndTag();
01393          executeIntrinsic(ostrEntity, parser, *hdl, nameSpace);
01394       }
01395       else
01396       {
01397          executeExtrinsic(ostrEntity, parser, *hdl);
01398       }
01399       ostrEntity << "</SIMPLERSP>";
01400    }
01401    catch (CIMException& ce)
01402    {
01403       OW_LOGDEBUG(Format("XMLExecute::processSimpleReq caught CIM "
01404          "exception:\nCode: %1\nFile: %2\n Line: %3\nMessage: %4",
01405          ce.getErrNo(), ce.getFile(), ce.getLine(), ce.getMessage()));
01406       outputError(ce.getErrNo(), ce.getDescription(), ostrError);
01407    }
01408 }
01410 void
01411 XMLExecute::doOptions(CIMFeatures& cf,
01412    OperationContext& context)
01413 {
01414    cf = this->getEnvironment()->getCIMOMHandle(context)->getServerFeatures();
01415 }
01417 RequestHandlerIFC*
01418 XMLExecute::clone() const
01419 {
01420    OW_ASSERT(!m_ostrEntity);
01421    OW_ASSERT(!m_ostrError);
01422    return new XMLExecute(*this);
01423 }
01425 // Protected
01426 void
01427 XMLExecute::outputError(CIMException::ErrNoType errorCode,
01428    const String& msg, ostream& ostr)
01429 {
01430    setError(errorCode, msg);
01431    ostr << "<SIMPLERSP>\r\n";
01432    if (m_isIntrinsic)
01433    {
01434       ostr << "<IMETHODRESPONSE NAME=\"" << m_functionName << "\">\r\n";
01435    }
01436    else
01437    {
01438       ostr << "<METHODRESPONSE NAME=\"" << m_functionName << "\">\r\n";
01439    }
01440 
01441    ostr << "<ERROR CODE=\"" << errorCode << "\"";
01442    // always have to send DESCRIPTION, since there are clients that can't handle it not being there.
01443    //if (!msg.empty())
01444    //{
01445       ostr << " DESCRIPTION=\"" <<
01446       XMLEscape(msg) <<
01447       "\"";
01448    //}
01449    ostr << "></ERROR>\r\n";
01450 
01451    if (m_isIntrinsic)
01452    {
01453       ostr << "</IMETHODRESPONSE>\r\n";
01454    }
01455    else
01456    {
01457       ostr << "</METHODRESPONSE>\r\n";
01458    }
01459    ostr << "</SIMPLERSP>\r\n";
01460 }
01461 
01463 void
01464 XMLExecute::init(const ServiceEnvironmentIFCRef& env)
01465 {
01466    setEnvironment(env);
01467 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
01468    LoggerRef logger(env->getLogger(COMPONENT_NAME));
01469    // Create the interop instance of CIM_CIMXMLCommunicationMechanism.
01470    // There are no properties in it which are dynamic, just it's existence is.
01471    // So we just create/delete it and let the repository do all the work :-)
01472    try
01473    {
01474       String interopNS = env->getConfigItem(ConfigOpts::INTEROP_SCHEMA_NAMESPACE_opt, OW_DEFAULT_INTEROP_SCHEMA_NAMESPACE);
01475       OperationContext context;
01476       CIMOMHandleIFCRef hdl(env->getCIMOMHandle(context));
01477       
01478       CIMClass CIM_CIMXMLCommunicationMechanism(hdl->getClass(interopNS, "CIM_CIMXMLCommunicationMechanism"));
01479 
01480       CIMInstance commMech(CIM_CIMXMLCommunicationMechanism.newInstance());
01481 
01482       // CIM_ServiceAccessPoint properties -- all the keys
01483       // since we are weakly associated to the same system the ObjectManager is, we'll get it and use it's keys.
01484       CIMObjectPathArray objectManagers(hdl->enumInstanceNamesA(interopNS, "CIM_ObjectManager"));
01485       if (objectManagers.size() != 1)
01486       {
01487          OW_THROWCIMMSG(CIMException::FAILED, Format("Expected 1 instance of CIM_ObjectManager, got %1", objectManagers.size()).c_str());
01488       }
01489 
01490       CIMObjectPath& objectManager(objectManagers[0]);
01491       commMech.updatePropertyValue("SystemCreationClassName", objectManager.getKeyValue("SystemCreationClassName"));
01492       commMech.updatePropertyValue("SystemName", objectManager.getKeyValue("SystemName"));
01493       commMech.updatePropertyValue("CreationClassName", CIMValue("CIM_CIMXMLCommunicationMechanism"));
01494       commMech.updatePropertyValue("Name", CIMValue("cim-xml"));
01495 
01496       // CIM_CIMXMLCommunicationMechanism properties
01497       commMech.updatePropertyValue("CIMValidated", CIMValue(true));
01498       commMech.updatePropertyValue("CIMXMLProtocolVersion", CIMValue(UInt16(1))); // 1 means 1.0
01499       commMech.updatePropertyValue("Version", CIMValue("1.1"));
01500       
01501       // CIM_ObjectManagerCommunicationMechanism properties
01502       enum
01503       {
01504          E_FP_Unknown = 0,
01505          E_FP_Other = 1,
01506          E_FP_Basic_Read = 2,
01507          E_FP_Basic_Write = 3,
01508          E_FP_Schema_Manipulation = 4,
01509          E_FP_Instance_Manipulation = 5,
01510          E_FP_Association_Traversal = 6,
01511          E_FP_Query_Execution = 7,
01512          E_FP_Qualifier_Declaration = 8,
01513          E_FP_Indications = 9
01514       };
01515 
01516       UInt16Array functionalProfilesSupported;
01517       functionalProfilesSupported.push_back(E_FP_Basic_Read);
01518       functionalProfilesSupported.push_back(E_FP_Basic_Write);
01519 #ifndef OW_DISABLE_SCHEMA_MANIPULATION
01520       functionalProfilesSupported.push_back(E_FP_Schema_Manipulation);
01521 #endif
01522 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
01523       functionalProfilesSupported.push_back(E_FP_Instance_Manipulation);
01524 #endif
01525 #ifndef OW_DISABLE_ASSOCIATION_TRAVERSAL
01526       functionalProfilesSupported.push_back(E_FP_Association_Traversal);
01527 #endif
01528       functionalProfilesSupported.push_back(E_FP_Query_Execution);
01529 #ifndef OW_DISABLE_QUALIFIER_DECLARATION
01530       functionalProfilesSupported.push_back(E_FP_Qualifier_Declaration);
01531 #endif
01532       if (!env->getConfigItem(ConfigOpts::DISABLE_INDICATIONS_opt, OW_DEFAULT_DISABLE_INDICATIONS).equalsIgnoreCase("true"))
01533       {
01534          functionalProfilesSupported.push_back(E_FP_Indications);
01535       }
01536 
01537       commMech.updatePropertyValue("FunctionalProfilesSupported", CIMValue(functionalProfilesSupported));
01538       commMech.updatePropertyValue("MultipleOperationsSupported", CIMValue(true));
01539 
01540       enum
01541       {
01542          E_AM_Unknown = 0,
01543          E_AM_Other = 1,
01544          E_AM_None = 2,
01545          E_AM_Basic = 3,
01546          E_AM_Digest = 4
01547       };
01548 
01549       UInt16Array authenticationMechanismsSupported;
01550       authenticationMechanismsSupported.push_back(E_AM_Other); // for OWLocal
01551       authenticationMechanismsSupported.push_back(E_AM_Basic);
01552 #ifndef OW_DISABLE_DIGEST
01553       authenticationMechanismsSupported.push_back(E_AM_Digest);
01554 #endif
01555       commMech.updatePropertyValue("AuthenticationMechanismsSupported", CIMValue(authenticationMechanismsSupported));
01556 
01557       StringArray authenticationMechanismDescriptions(1, "OWLocal");
01558       commMech.updatePropertyValue("AuthenticationMechanismDescriptions", CIMValue(authenticationMechanismDescriptions));
01559 
01560       // CIM_ManagedElement properties
01561       commMech.updatePropertyValue("ElementName", CIMValue("CIM/XML Communication Mechanism"));
01562 
01563       // CIM_ManagedSystemElement properties
01564       UInt16Array operationalStatus;
01565       operationalStatus.push_back(2); // OK
01566       commMech.updatePropertyValue("OperationalStatus", CIMValue(operationalStatus));
01567 
01568       // create it and save the path so we can delete it at shutdown time.
01569       try
01570       {
01571          // if one was hanging around from before, get rid of it.
01572          hdl->deleteInstance(interopNS, CIMObjectPath(interopNS, commMech));
01573       }
01574       catch (CIMException&)
01575       {
01576          // just ignore this.
01577       }
01578       m_commMechPath = hdl->createInstance(interopNS, commMech);
01579       m_commMechPath.setNameSpace(interopNS);
01580       OW_LOG_DEBUG(logger, Format("Sucessfully created instance of CIM_CIMXMLCommunicationMechanism. Saving path: %1", m_commMechPath.toString()));
01581 
01582       
01583       // now create the instance of HostedAccessPoint that associates the commMech with the system
01584       CIMClass CIM_HostedAccessPoint(hdl->getClass(interopNS, "CIM_HostedAccessPoint"));
01585       CIMInstance hostedAccessPoint(CIM_HostedAccessPoint.newInstance());
01586       hostedAccessPoint.updatePropertyValue("Dependent", CIMValue(m_commMechPath));
01587 
01588       // build the path to the CIM_System
01589       CIMObjectPath systemPath(objectManager.getKeyValue("SystemCreationClassName").toString(), interopNS);
01590       systemPath.setKeyValue("CreationClassName", objectManager.getKeyValue("SystemCreationClassName"));
01591       systemPath.setKeyValue("Name", objectManager.getKeyValue("SystemName"));
01592 
01593       hostedAccessPoint.updatePropertyValue("Antecedent", CIMValue(systemPath));
01594 
01595       // create it and save the path so we can delete it at shutdown time.
01596       try
01597       {
01598          // if one was hanging around from before, get rid of it.
01599          hdl->deleteInstance(interopNS, CIMObjectPath(interopNS, hostedAccessPoint));
01600       }
01601       catch (CIMException&)
01602       {
01603          // just ignore this.
01604       }
01605       m_hostedAccessPointPath = hdl->createInstance(interopNS, hostedAccessPoint);
01606       m_hostedAccessPointPath.setNameSpace(interopNS);
01607       OW_LOG_DEBUG(logger, Format("Sucessfully created instance of CIM_HostedAccessPoint. Saving path: %1", m_hostedAccessPointPath.toString()));
01608    
01609       
01610       // now create the instance of OpenWBEM_CIMXMLCommMechanismForOpenWBEMManager that associates the commMech with the OpenWBEM_ObjectManager
01611       CIMClass OpenWBEM_CIMXMLCommMechanismForOpenWBEMManager(hdl->getClass(interopNS, "OpenWBEM_CIMXMLCommMechanismForOpenWBEMManager"));
01612       CIMInstance commMechForManager(OpenWBEM_CIMXMLCommMechanismForOpenWBEMManager.newInstance());
01613       commMechForManager.updatePropertyValue("Dependent", CIMValue(m_commMechPath));
01614       commMechForManager.updatePropertyValue("Antecedent", CIMValue(objectManager));
01615 
01616       // create it and save the path so we can delete it at shutdown time.
01617       try
01618       {
01619          // if one was hanging around from before, get rid of it.
01620          hdl->deleteInstance(interopNS, CIMObjectPath(interopNS, commMechForManager));
01621       }
01622       catch (CIMException&)
01623       {
01624          // just ignore this.
01625       }
01626       m_commMechForManager = hdl->createInstance(interopNS, commMechForManager);
01627       m_commMechForManager.setNameSpace(interopNS);
01628       OW_LOG_DEBUG(logger, Format("Sucessfully created instance of OpenWBEM_CIMXMLCommMechanismForOpenWBEMManager. Saving path: %1",
01629          m_commMechForManager.toString()));
01630    }
01631    catch (CIMException& e)
01632    {
01633       // Something's not set up right. oh well, just log it. It's not even an error, maybe they don't have or want the interop schema.
01634       OW_LOG_DEBUG(logger, Format("Failed creating CIM_CIMXMLCommunicationMechanism: %1", e));
01635    }
01636 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
01637    
01638 }
01639 
01641 namespace
01642 {
01643 void cleanupInteropInstance(const CIMObjectPath& path, const LoggerRef& logger, const ServiceEnvironmentIFCRef& env)
01644 {
01645 #ifndef OW_DISABLE_INSTANCE_MANIPULATION
01646    if (path)
01647    {
01648       OW_LOG_DEBUG(logger, "XMLExecute::shutdown() cleaning up CIM_HostedAccessPoint instance");
01649 
01650       try
01651       {
01652          String interopNS(path.getNameSpace());
01653          OperationContext context;
01654          CIMOMHandleIFCRef hdl(env->getCIMOMHandle(context));
01655          hdl->deleteInstance(interopNS, path);
01656       }
01657       catch (CIMException& e)
01658       {
01659          // Something's not set up right. oh well, just log it. It's not even an error, maybe they don't have or want the interop schema.
01660          OW_LOG_DEBUG(logger, Format("Failed deleting: %1", e));
01661       }
01662    }
01663 #endif // #ifndef OW_DISABLE_INSTANCE_MANIPULATION
01664 }
01665 } // end unnamed namespace
01666 
01668 void
01669 XMLExecute::shutdown()
01670 {
01671    // clean up the instances we created in init()
01672    ServiceEnvironmentIFCRef env(getEnvironment());
01673    OW_ASSERT(env);
01674    LoggerRef logger(env->getLogger(COMPONENT_NAME));
01675    OW_ASSERT(logger);
01676 
01677    cleanupInteropInstance(m_commMechPath, logger, env);
01678    cleanupInteropInstance(m_hostedAccessPointPath, logger, env);
01679    cleanupInteropInstance(m_commMechForManager, logger, env);
01680 
01681    // clear the reference to the environment
01682    setEnvironment(ServiceEnvironmentIFCRef());
01683 }
01684 
01685 } // end namespace OW_NAMESPACE
01686 
01688 OW_REQUEST_HANDLER_FACTORY(OW_NAMESPACE::XMLExecute,XMLExecute);
01689 

Generated on Thu Feb 9 08:48:19 2006 for openwbem by  doxygen 1.4.6