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_CIMXMLParser.hpp"
00038 #include "OW_CIMException.hpp"
00039 #include "OW_Format.hpp"
00040 #include "OW_Assertion.hpp"
00041 #include "OW_XMLUnescape.hpp"
00042 #include <algorithm> 
00043 
00044 namespace OW_NAMESPACE
00045 {
00046 
00048 CIMXMLParser::CIMXMLParser(const String& str)
00049    : XMLPullParser(str)
00050 {
00051 }
00053 CIMXMLParser::CIMXMLParser(std::istream& istr)
00054    : XMLPullParser(istr)
00055 {
00056 }
00058 CIMXMLParser::CIMXMLParser()
00059    : XMLPullParser()
00060 {
00061 }
00062 
00063 
00064 CIMXMLParser::ElemEntry CIMXMLParser::g_elems[] =
00065 {
00066    { "CIM", CIMXMLParser::E_CIM },
00067    { "CLASS", CIMXMLParser::E_CLASS },
00068    { "CLASSNAME", CIMXMLParser::E_CLASSNAME },
00069    { "CLASSPATH", CIMXMLParser::E_CLASSPATH },
00070    { "DECLARATION", CIMXMLParser::E_DECLARATION },
00071    { "DECLGROUP", CIMXMLParser::E_DECLGROUP },
00072    { "DECLGROUP.WITHNAME", CIMXMLParser::E_DECLGROUP_WITHNAME },
00073    { "DECLGROUP.WITHPATH", CIMXMLParser::E_DECLGROUP_WITHPATH },
00074    { "ERROR", CIMXMLParser::E_ERROR },
00075    { "EXPMETHODCALL", CIMXMLParser::E_EXPMETHODCALL },
00076    { "EXPMETHODRESPONSE", CIMXMLParser::E_EXPMETHODRESPONSE },
00077    { "EXPPARAMVALUE", CIMXMLParser::E_EXPPARAMVALUE },
00078    { "HOST", CIMXMLParser::E_HOST },
00079    { "IMETHODCALL", CIMXMLParser::E_IMETHODCALL },
00080    { "IMETHODRESPONSE", CIMXMLParser::E_IMETHODRESPONSE },
00081    { "IMPLICITKEY", CIMXMLParser::E_IMPLICITKEY },
00082    { "INSTANCE", CIMXMLParser::E_INSTANCE },
00083    { "INSTANCENAME", CIMXMLParser::E_INSTANCENAME },
00084    { "INSTANCEPATH", CIMXMLParser::E_INSTANCEPATH },
00085    { "IPARAMVALUE", CIMXMLParser::E_IPARAMVALUE },
00086    { "IRETURNVALUE", CIMXMLParser::E_IRETURNVALUE },
00087    { "KEYBINDING", CIMXMLParser::E_KEYBINDING },
00088    { "KEYVALUE", CIMXMLParser::E_KEYVALUE },
00089    { "LOCALCLASSPATH", CIMXMLParser::E_LOCALCLASSPATH },
00090    { "LOCALINSTANCEPATH", CIMXMLParser::E_LOCALINSTANCEPATH },
00091    { "LOCALNAMESPACEPATH", CIMXMLParser::E_LOCALNAMESPACEPATH },
00092    { "MESSAGE", CIMXMLParser::E_MESSAGE },
00093    { "METHOD", CIMXMLParser::E_METHOD },
00094    { "METHODCALL", CIMXMLParser::E_METHODCALL },
00095    { "METHODRESPONSE", CIMXMLParser::E_METHODRESPONSE },
00096    { "MULTIEXPREQ", CIMXMLParser::E_MULTIEXPREQ },
00097    { "MULTIEXPRSP", CIMXMLParser::E_MULTIEXPRSP },
00098    { "MULTIREQ", CIMXMLParser::E_MULTIREQ },
00099    { "MULTIRSP", CIMXMLParser::E_MULTIRSP },
00100    { "NAMESPACE", CIMXMLParser::E_NAMESPACE },
00101    { "NAMESPACEPATH", CIMXMLParser::E_NAMESPACEPATH },
00102    { "OBJECTPATH", CIMXMLParser::E_OBJECTPATH },
00103    { "PARAMETER", CIMXMLParser::E_PARAMETER },
00104    { "PARAMETER.ARRAY", CIMXMLParser::E_PARAMETER_ARRAY },
00105    { "PARAMETER.REFARRAY", CIMXMLParser::E_PARAMETER_REFARRAY },
00106    { "PARAMETER.REFERENCE", CIMXMLParser::E_PARAMETER_REFERENCE },
00107    { "PARAMVALUE", CIMXMLParser::E_PARAMVALUE },
00108    { "PROPERTY", CIMXMLParser::E_PROPERTY },
00109    { "PROPERTY.ARRAY", CIMXMLParser::E_PROPERTY_ARRAY },
00110    { "PROPERTY.REFERENCE", CIMXMLParser::E_PROPERTY_REFERENCE },
00111    { "QUALIFIER", CIMXMLParser::E_QUALIFIER },
00112    { "QUALIFIER.DECLARATION", CIMXMLParser::E_QUALIFIER_DECLARATION },
00113    { "RETURNVALUE", CIMXMLParser::E_RETURNVALUE },
00114    { "SCOPE", CIMXMLParser::E_SCOPE },
00115    { "SIMPLEEXPREQ", CIMXMLParser::E_SIMPLEEXPREQ },
00116    { "SIMPLEEXPRSP", CIMXMLParser::E_SIMPLEEXPRSP },
00117    { "SIMPLEREQ", CIMXMLParser::E_SIMPLEREQ },
00118    { "SIMPLERSP", CIMXMLParser::E_SIMPLERSP },
00119    { "VALUE", CIMXMLParser::E_VALUE },
00120    { "VALUE.ARRAY", CIMXMLParser::E_VALUE_ARRAY },
00121    { "VALUE.NAMEDINSTANCE", CIMXMLParser::E_VALUE_NAMEDINSTANCE },
00122    { "VALUE.NAMEDOBJECT", CIMXMLParser::E_VALUE_NAMEDOBJECT },
00123    { "VALUE.OBJECT", CIMXMLParser::E_VALUE_OBJECT },
00124    { "VALUE.OBJECTWITHLOCALPATH", CIMXMLParser::E_VALUE_OBJECTWITHLOCALPATH },
00125    { "VALUE.OBJECTWITHPATH", CIMXMLParser::E_VALUE_OBJECTWITHPATH },
00126    { "VALUE.REFARRAY", CIMXMLParser::E_VALUE_REFARRAY },
00127    { "VALUE.REFERENCE", CIMXMLParser::E_VALUE_REFERENCE },
00128    { "garbage", CIMXMLParser::E_UNKNOWN }
00129 };
00130       
00131 CIMXMLParser::ElemEntry* CIMXMLParser::g_elemsEnd = &CIMXMLParser::g_elems[0] +
00132    (sizeof(CIMXMLParser::g_elems)/sizeof(*CIMXMLParser::g_elems)) - 1;
00134 inline bool
00135 CIMXMLParser::elemEntryCompare(const CIMXMLParser::ElemEntry& f1,
00136    const CIMXMLParser::ElemEntry& f2)
00137 {
00138    return (strcmp(f1.name, f2.name) < 0);
00139 }
00141 CIMXMLParser::tokenId
00142 CIMXMLParser::getTokenFromName(const char* name)
00143 {
00144    ElemEntry e = { 0, CIMXMLParser::E_UNKNOWN };
00145    e.name = name;
00146    ElemEntry* i = std::lower_bound(g_elems, g_elemsEnd, e, elemEntryCompare);
00147    if (i == g_elemsEnd || strcmp((*i).name, name) != 0)
00148    {
00149       return CIMXMLParser::E_UNKNOWN;
00150    }
00151    else
00152    {
00153       return i->id;
00154    }
00155 }
00156 
00157 const char* const CIMXMLParser::A_ARRAYSIZE              = "ARRAYSIZE";
00158 const char* const CIMXMLParser::A_ASSOCCLASS          = "ASSOCCLASS";
00159 const char* const CIMXMLParser::A_CLASSNAME              = "CLASSNAME";
00160 const char* const CIMXMLParser::A_CLASSORIGIN            = "CLASSORIGIN";
00161 const char* const CIMXMLParser::A_DEEPINHERITANCE        = "DEEPINHERITANCE";
00162 const char* const CIMXMLParser::A_INCLUDECLASSORIGIN  = "INCLUDECLASSORIGIN";
00163 const char* const CIMXMLParser::A_INCLUDEQUALIFIERS      = "INCLUDEQUALIFIERS";
00164 const char* const CIMXMLParser::A_INSTANCENAME           = "INSTANCENAME";
00165 const char* const CIMXMLParser::A_XML_LANG               = "xml:lang";
00166 const char* const CIMXMLParser::A_LOCALONLY              = "LOCALONLY";
00167 const char* const CIMXMLParser::A_MODIFIEDCLASS       = "MODIFIEDCLASS";
00168 const char* const CIMXMLParser::A_NAME                   = "NAME";
00169 const char* const CIMXMLParser::A_NEWVALUE               = "NEWVALUE";
00170 const char* const CIMXMLParser::A_OBJECTNAME          = "OBJECTNAME";
00171 const char* const CIMXMLParser::A_OVERRIDABLE            = "OVERRIDABLE";
00172 const char* const CIMXMLParser::A_PARAMTYPE                    = "PARAMTYPE";
00173 const char* const CIMXMLParser::A_PROPAGATED             = "PROPAGATED";
00174 const char* const CIMXMLParser::A_PROPERTYLIST           = "PROPERTYLIST";
00175 const char* const CIMXMLParser::A_PROPERTYNAME           = "PROPERTYNAME";
00176 const char* const CIMXMLParser::A_REFERENCECLASS         = "REFERENCECLASS";
00177 const char* const CIMXMLParser::A_RESULTCLASS            = "RESULTCLASS";
00178 const char* const CIMXMLParser::A_RESULTROLE          = "RESULTROLE";
00179 const char* const CIMXMLParser::A_ROLE                   = "ROLE";
00180 const char* const CIMXMLParser::A_SUPERCLASS          = "SUPERCLASS";
00181 const char* const CIMXMLParser::A_TOINSTANCE             = "TOINSTANCE"; 
00182 const char* const CIMXMLParser::A_TOSUBCLASS             = "TOSUBCLASS";
00183 const char* const CIMXMLParser::A_TRANSLATABLE           = "TRANSLATABLE";
00184 const char* const CIMXMLParser::A_TYPE                   = "TYPE";
00185 const char* const CIMXMLParser::A_VALUETYPE              = "VALUETYPE";
00186 const char* const CIMXMLParser::A_CIMVERSION = "CIMVERSION";
00187 const char* const CIMXMLParser::A_DTDVERSION = "DTDVERSION";
00188 const char* const CIMXMLParser::A_ID = "ID";
00189 const char* const CIMXMLParser::A_PROTOCOLVERSION = "PROTOCOLVERSION";
00190 const char* const CIMXMLParser::A_CODE    = "CODE";
00191 const char* const CIMXMLParser::A_DESCRIPTION      = "DESCRIPTION";
00192 const char* const CIMXMLParser::A_ISARRAY = "ISARRAY";
00193 const char* const CIMXMLParser::A_EMBEDDEDOBJECT = "EmbeddedObject";
00194 const char* const CIMXMLParser::AV_CIMVERSION20_VALUE = "2.0";
00195 const char* const CIMXMLParser::AV_CIMVERSION21_VALUE = "2.1";
00196 const char* const CIMXMLParser::AV_CIMVERSION22_VALUE = "2.2";
00197 const char* const CIMXMLParser::AV_DTDVERSION20_VALUE = "2.0";
00198 const char* const CIMXMLParser::AV_DTDVERSION21_VALUE = "2.1";
00199 const char* const CIMXMLParser::AV_PROTOCOLVERSION10_VALUE = "1.0";
00200 const char* const CIMXMLParser::AV_PROTOCOLVERSION11_VALUE = "1.1";
00201 const char* const CIMXMLParser::AV_EMBEDDEDOBJECT_OBJECT_VALUE = "object";
00202 const char* const CIMXMLParser::AV_EMBEDDEDOBJECT_INSTANCE_VALUE = "instance";
00203 const char* const CIMXMLParser::P_ClassName        = "ClassName";
00204 const char* const CIMXMLParser::P_PropertyList     = "PropertyList";
00205 const char* const CIMXMLParser::P_DeepInheritance           = "DeepInheritance";
00206 const char* const CIMXMLParser::P_LocalOnly           = "LocalOnly";
00207 const char* const CIMXMLParser::P_IncludeQualifiers            = "IncludeQualifiers";
00208 const char* const CIMXMLParser::P_IncludeClassOrigin           = "IncludeClassOrigin";
00209 const char* const CIMXMLParser::P_ModifiedClass = "ModifiedClass";
00210 const char* const CIMXMLParser::P_ModifiedInstance = "ModifiedInstance";
00211 const char* const CIMXMLParser::P_InstanceName  = "InstanceName";
00212 const char* const CIMXMLParser::P_PropertyName  = "PropertyName";
00213 const char* const CIMXMLParser::P_NewValue         = "NewValue";
00214 const char* const CIMXMLParser::P_Role          = "Role";
00215 const char* const CIMXMLParser::P_ResultRole    = "ResultRole";
00216 const char* const CIMXMLParser::P_ObjectName    = "ObjectName";
00217 const char* const CIMXMLParser::P_AssocClass    = "AssocClass";
00218 const char* const CIMXMLParser::P_ResultClass      = "ResultClass";
00219 const char* const CIMXMLParser::P_QueryLanguage = "QueryLanguage";
00220 const char* const CIMXMLParser::P_Query = "Query";
00221 const char* const CIMXMLParser::P_QualifierName = "QualifierName";
00222 const char* const CIMXMLParser::P_QualifierDeclaration = "QualifierDeclaration";
00223 
00224 
00226 void
00227 CIMXMLParser::mustGetChildId(CIMXMLParser::tokenId tId)
00228 {
00229    if (!m_good)
00230    {
00231       m_good = false;
00232       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00233          "CIMXMLParser has reached EOF");
00234    }
00235    getChild();
00236    if (!m_good || !tokenIsId(tId))
00237    {
00238       m_good = false;
00239       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00240          Format("CIMXMLParser::mustGetChild(CIMXMLParser::tokenId tId=%1) failed.  parser = %2",
00241             g_elems[tId].name, *this).c_str());
00242    }
00243 }
00245 void
00246 CIMXMLParser::mustTokenIsId(CIMXMLParser::tokenId tId) const
00247 {
00248    if (!tokenIs(g_elems[tId].name))
00249    {
00250       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00251          Format("CIMXMLParser::mustTokenIs(CIMXMLParser::tokenId tId=%1) failed.  parser = %2",
00252             g_elems[tId].name, *this).c_str());
00253    }
00254 }
00256 void
00257 CIMXMLParser::getNextId(CIMXMLParser::tokenId beginTok, bool throwIfError)
00258 {
00259    while (m_good)
00260    {
00261       if (m_curTok.type == XMLToken::START_TAG)
00262       {
00263          if (m_curTok.text.equals(g_elems[beginTok].name))
00264          {
00265             break;
00266          }
00267       }
00268       nextToken();
00269    }
00270    if (!m_good && throwIfError)
00271    {
00272       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00273          Format("CIMXMLParser::getNext(CIMXMLParser::tokenId beginTok=%1) failed.  parser = %2",
00274             g_elems[beginTok].name, *this).c_str());
00275    }
00276 }
00277 
00278 } 
00279