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_XMLQualifier.hpp"
00038 #include "OW_CIMFlavor.hpp"
00039 #include "OW_CIMScope.hpp"
00040 #include "OW_CIMQualifierType.hpp"
00041 #include "OW_CIMDataType.hpp"
00042 #include "OW_CIMValue.hpp"
00043 #include "OW_XMLCIMFactory.hpp"
00044 #include "OW_CIMException.hpp"
00045 #include "OW_CIMXMLParser.hpp"
00046 #include "OW_CIMName.hpp"
00047 
00048 namespace OW_NAMESPACE
00049 {
00050 
00051 namespace XMLQualifier
00052 {
00053 
00054 void
00055 processQualifierDecl(CIMXMLParser& parser,
00056    CIMQualifierType& cimQualifier)
00057 {
00058    if (!parser.tokenIsId(CIMXMLParser::E_QUALIFIER_DECLARATION))
00059    {
00060       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER, "Expected but did not find <QUALIFIER.DECLARATION>");
00061    }
00062    CIMName superClassName;
00063    CIMName inClassName;
00064    CIMName qualName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00065    cimQualifier.setName(qualName);
00066    String qualType = parser.mustGetAttribute(CIMXMLParser::A_TYPE);
00067    CIMDataType dt = CIMDataType::getDataType(qualType);
00068    String qualISARRAY = parser.getAttribute(CIMXMLParser::A_ISARRAY);
00069    if (qualISARRAY.equalsIgnoreCase("true"))
00070    {
00071       String qualArraySize = parser.getAttribute(CIMXMLParser::A_ARRAYSIZE);
00072       if (!qualArraySize.empty())
00073       {
00074          try
00075          {
00076             dt.setToArrayType(qualArraySize.toInt32());
00077          }
00078          catch (const StringConversionException&)
00079          {
00080             OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00081                "Invalid array size");
00082          }
00083       }
00084       else
00085       {
00086          dt.setToArrayType(-1);  
00087       }
00088    }
00089    cimQualifier.setDataType(dt);
00090    String qualFlavor = parser.getAttribute("OVERRIDABLE");
00091    if (qualFlavor.equalsIgnoreCase("false"))
00092    {
00093       cimQualifier.addFlavor(CIMFlavor(CIMFlavor::DISABLEOVERRIDE));
00094    }
00095    else
00096    {
00097       cimQualifier.addFlavor(CIMFlavor(CIMFlavor::ENABLEOVERRIDE));
00098    }
00099    qualFlavor = parser.getAttribute("TOSUBCLASS");
00100    if (qualFlavor.equalsIgnoreCase("false"))
00101    {
00102       cimQualifier.addFlavor(CIMFlavor(CIMFlavor::RESTRICTED));
00103    }
00104    else
00105    {
00106       cimQualifier.addFlavor(CIMFlavor(CIMFlavor::TOSUBCLASS));
00107    }
00108    
00109    
00110    
00111    
00112    
00113    qualFlavor = parser.getAttribute("TRANSLATABLE");
00114    if (qualFlavor.equalsIgnoreCase("true"))
00115    {
00116       cimQualifier.addFlavor(CIMFlavor(CIMFlavor::TRANSLATE));
00117    }
00118    parser.getNextTag();
00119    if (parser.tokenIsId(CIMXMLParser::E_SCOPE))
00120    {
00121       
00122       processScope(parser,cimQualifier,"CLASS",CIMScope::CLASS);
00123       processScope(parser,cimQualifier,"ASSOCIATION",CIMScope::ASSOCIATION);
00124       processScope(parser,cimQualifier,"REFERENCE",CIMScope::REFERENCE);
00125       processScope(parser,cimQualifier,"PROPERTY",CIMScope::PROPERTY);
00126       processScope(parser,cimQualifier,"METHOD",CIMScope::METHOD);
00127       processScope(parser,cimQualifier,"PARAMETER",CIMScope::PARAMETER);
00128       processScope(parser,cimQualifier,"INDICATION",CIMScope::INDICATION);
00129       if (cimQualifier.hasScope(CIMScope::CLASS) &&
00130          cimQualifier.hasScope(CIMScope::ASSOCIATION) &&
00131          cimQualifier.hasScope(CIMScope::REFERENCE) &&
00132          cimQualifier.hasScope(CIMScope::PROPERTY) &&
00133          cimQualifier.hasScope(CIMScope::METHOD) &&
00134          cimQualifier.hasScope(CIMScope::PARAMETER) &&
00135          cimQualifier.hasScope(CIMScope::INDICATION))
00136       {
00137          cimQualifier.addScope(CIMScope::ANY); 
00138       }
00139       parser.mustGetNextTag();
00140       parser.mustGetEndTag();
00141    }
00142    else
00143    {
00144       
00145       
00146       
00147       cimQualifier.addScope(CIMScope::ANY);
00148    }
00149    if (parser.tokenIsId(CIMXMLParser::E_VALUE) ||
00150       parser.tokenIsId(CIMXMLParser::E_VALUE_ARRAY))
00151    {
00152       
00153       CIMValue val = XMLCIMFactory::createValue(parser,qualType, XMLCIMFactory::E_VALUE_NOT_EMBEDDED_OBJECT);
00154       cimQualifier.setDefaultValue(val);
00155    }
00156    parser.mustGetEndTag(); 
00157 }
00159 void
00160 processScope(CIMXMLParser& parser,
00161       CIMQualifierType& cqt, const char* attrName,
00162       CIMScope::Scope scopeValue)
00163 {
00164    String scope = parser.getAttribute(attrName);
00165    if (scope.empty())
00166    {
00167       return;
00168    }
00169 
00170    if (scope.equalsIgnoreCase("true"))
00171    {
00172       cqt.addScope(CIMScope(scopeValue));
00173    }
00174    else if (!scope.equalsIgnoreCase("false"))
00175    {
00176       OW_THROWCIM(CIMException::FAILED);
00177    }
00178 }
00180 String
00181 getQualifierName(CIMXMLParser& parser)
00182 {
00183    if (!parser.tokenIsId(CIMXMLParser::E_IPARAMVALUE))
00184    {
00185       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00186          "Expected IPARAMVALUE to lead into QualifierName");
00187    }
00188    String propertyName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00189    if (!propertyName.equalsIgnoreCase(CIMXMLParser::P_QualifierName))
00190    {
00191       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00192             "Cannot find qualifier name");
00193    }
00194    parser.getChild();
00195    if (!parser.tokenIsId(CIMXMLParser::E_VALUE))
00196    {
00197       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00198             "Cannot find value for qualifier name");
00199    }
00200    parser.mustGetNext();
00201    if (!parser.isData())
00202    {
00203       OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00204             "Cannot find value for qualifier name");
00205    }
00206    String name = parser.getData();
00207    parser.mustGetNextTag();
00208    parser.mustGetEndTag();
00209    return name;
00210 }
00211 
00212 } 
00213 } 
00214