00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_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
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
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 }
00228 (*m_ostrEntity) << "</MULTIRSP>";
00229 }
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
00262 OW_THROWCIM(CIMException::NOT_SUPPORTED);
00263 }
00264 else
00265 {
00266 ostr << "<IMETHODRESPONSE NAME=\"" << m_functionName <<
00267 "\">";
00268
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
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325 void
00326 XMLExecute::getParameters(CIMXMLParser& parser,
00327 CIMParamValueArray& params)
00328 {
00329
00330
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();
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
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
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
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
00475
00476 i->isSet = true;
00477
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();
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();
00579 }
00580
00581
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
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
00663
00664 String cins = ci.getNameSpace();
00665 if (cins.empty())
00666 {
00667 cins = ns;
00668 }
00669 CIMObjectPath cop( cins, ci );
00670
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
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
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& , 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& , 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
00789
00790 CIMClass cimClass = XMLCIMFactory::createClass(parser);
00791 hdl.modifyClass(ns, cimClass);
00792 }
00794 void XMLExecute::deleteClass(ostream& , 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();
00810 CIMInstance cimInstance = XMLCIMFactory::createInstance(parser);
00811 CIMName className = cimInstance.getClassName();
00812
00813
00814 if (className == "__Namespace")
00815 {
00816 CIMProperty prop = cimInstance.getProperty(
00817 CIMProperty::NAME_PROPERTY);
00818
00819
00820 if (!prop)
00821 {
00822 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00823 "Name property not specified for new namespace");
00824 }
00825
00826
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& , 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& , 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& , 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& , 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& , 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& ,
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& p