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 
00035 #include "OW_config.h"
00036 #include "OW_WQLInstancePropertySource.hpp"
00037 #include "OW_CIMProperty.hpp"
00038 #include "OW_CIMClass.hpp"
00039 #include "OW_CIMValue.hpp"
00040 #include "OW_CIMValueCast.hpp"
00041 #include "OW_Bool.hpp"
00042 
00043 namespace OW_NAMESPACE
00044 {
00045 
00047 WQLInstancePropertySource::~WQLInstancePropertySource()
00048 {
00049 }
00051 bool WQLInstancePropertySource::evaluateISA(const String &propertyName, const String &className) const
00052 {
00053    StringArray propNames = propertyName.tokenize(".");
00054    if (propNames.empty())
00055    {
00056       return false;
00057    }
00058    if (propNames[0] == ci.getClassName())
00059    {
00060       propNames.remove(0);
00061    }
00062    return evaluateISAAux(ci, propNames, className);
00063 }
00065 bool WQLInstancePropertySource::getValue(const String &propertyName, WQLOperand &value) const
00066 {
00067    StringArray propNames = propertyName.tokenize(".");
00068    if (propNames.empty())
00069    {
00070       return false;
00071    }
00072    if (propNames[0].equalsIgnoreCase(ci.getClassName()))
00073    {
00074       propNames.remove(0);
00075    }
00076    return getValueAux(ci, propNames, value);
00077 }
00079 bool WQLInstancePropertySource::evaluateISAAux(const CIMInstance& ci, StringArray propNames, const String &className) const
00080 {
00081    if (propNames.empty())
00082    {
00083       return classIsDerivedFrom(ci.getClassName(), className);
00084    }
00085    CIMProperty p = ci.getProperty(propNames[0]);
00086    if (!p)
00087    {
00088       return false;
00089    }
00090    CIMValue v = p.getValue();
00091    switch (v.getType())
00092    {
00093       case CIMDataType::EMBEDDEDINSTANCE:
00094       {
00095          propNames.remove(0);
00096          CIMInstance embed;
00097          v.get(embed);
00098          if (!embed)
00099          {
00100             return false;
00101          }
00102          return evaluateISAAux(embed, propNames, className);
00103       }
00104       default:
00105          return false;
00106    }
00107 }
00109 bool WQLInstancePropertySource::classIsDerivedFrom(const String& cls, const String& className) const
00110 {
00111    CIMName curClassName = cls;
00112    while (curClassName != CIMName())
00113    {
00114       if (curClassName == className)
00115       {
00116          return true;
00117       }
00118       
00119       CIMClass cls2 = m_hdl->getClass(m_ns, curClassName.toString());
00120       curClassName = cls2.getSuperClass();
00121    }
00122    return false;
00123 }
00125 bool WQLInstancePropertySource::getValueAux(const CIMInstance& ci, const StringArray& propNames, WQLOperand& value)
00126 {
00127    if (propNames.empty())
00128    {
00129       return false;
00130    }
00131    CIMProperty p = ci.getProperty(propNames[0]);
00132    if (!p)
00133    {
00134       return false;
00135    }
00136    CIMValue v = p.getValue();
00137    switch (v.getType())
00138    {
00139       case CIMDataType::DATETIME:
00140       case CIMDataType::CIMNULL:
00141          value = WQLOperand();
00142          break;
00143       case CIMDataType::UINT8:
00144       case CIMDataType::SINT8:
00145       case CIMDataType::UINT16:
00146       case CIMDataType::SINT16:
00147       case CIMDataType::UINT32:
00148       case CIMDataType::SINT32:
00149       case CIMDataType::UINT64:
00150       case CIMDataType::SINT64:
00151       case CIMDataType::CHAR16:
00152       {
00153          Int64 x;
00154          CIMValueCast::castValueToDataType(v, CIMDataType::SINT64).get(x);
00155          value = WQLOperand(x, WQL_INTEGER_VALUE_TAG);
00156          break;
00157       }
00158       case CIMDataType::STRING:
00159          value = WQLOperand(v.toString(), WQL_STRING_VALUE_TAG);
00160          break;
00161       case CIMDataType::BOOLEAN:
00162       {
00163          Bool b;
00164          v.get(b);
00165          value = WQLOperand(b, WQL_BOOLEAN_VALUE_TAG);
00166          break;
00167       }
00168       case CIMDataType::REAL32:
00169       case CIMDataType::REAL64:
00170       {
00171          Real64 x;
00172          CIMValueCast::castValueToDataType(v, CIMDataType::REAL64).get(x);
00173          value = WQLOperand(x, WQL_DOUBLE_VALUE_TAG);
00174          break;
00175       }
00176       case CIMDataType::REFERENCE:
00177          value = WQLOperand(v.toString(), WQL_STRING_VALUE_TAG);
00178          break;
00179       case CIMDataType::EMBEDDEDCLASS:
00180          value = WQLOperand();
00181          break;
00182       case CIMDataType::EMBEDDEDINSTANCE:
00183       {
00184          CIMInstance embed;
00185          v.get(embed);
00186          if (!embed)
00187          {
00188             return false;
00189          }
00190          StringArray newPropNames(propNames.begin() + 1, propNames.end());
00191          return getValueAux(embed, newPropNames, value);
00192       }
00193       break;
00194       default:
00195          value = WQLOperand();
00196          break;
00197    }
00198    return true;
00199 }
00200 
00201 } 
00202