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_CIMProperty.hpp"
00038 #include "OW_StringBuffer.hpp"
00039 #include "OW_CIMValueCast.hpp"
00040 #include "OW_BinarySerialization.hpp"
00041 #include "OW_NULLValueException.hpp"
00042 #include "OW_StrictWeakOrdering.hpp"
00043 #include "OW_NoSuchQualifierException.hpp"
00044 #include "OW_CIMDataType.hpp"
00045 #include "OW_CIMQualifier.hpp"
00046 #include "OW_CIMException.hpp"
00047 #include "OW_COWIntrusiveCountableBase.hpp"
00048 
00049 namespace OW_NAMESPACE
00050 {
00051 
00052 using std::istream;
00053 using std::ostream;
00054 using namespace WBEMFlags;
00055 struct CIMProperty::PROPData : public COWIntrusiveCountableBase
00056 {
00057    PROPData();
00058    CIMName m_name;
00059    CIMQualifierArray m_qualifiers;
00060    
00061    
00062    
00063    
00064    
00065    
00066    CIMDataType m_propertyDataType;
00067    
00068    
00069    
00070    
00071    Int32 m_sizeDataType;
00072    CIMName m_override;
00073    CIMName m_originClass;
00074    CIMValue m_cimValue;
00075    
00076    Bool m_propagated;
00077    PROPData* clone() const { return new PROPData(*this); }
00078 };
00079 CIMProperty::PROPData::PROPData() :
00080    m_sizeDataType(-1), m_cimValue(CIMNULL), m_propagated(false)
00081 {
00082 }
00083 bool operator<(const CIMProperty::PROPData& x, const CIMProperty::PROPData& y)
00084 {
00085    return StrictWeakOrdering(
00086       x.m_name, y.m_name,
00087       x.m_cimValue, y.m_cimValue,
00088       x.m_qualifiers, y.m_qualifiers,
00089       x.m_propertyDataType, y.m_propertyDataType,
00090       x.m_sizeDataType, y.m_sizeDataType,
00091       x.m_override, y.m_override,
00092       x.m_originClass, y.m_originClass,
00093       x.m_propagated, y.m_propagated);
00094 }
00096 CIMProperty::CIMProperty() :
00097    CIMElement(), m_pdata(new PROPData)
00098 {
00099 }
00101 CIMProperty::CIMProperty(CIMNULL_t) :
00102    CIMElement(), m_pdata(0)
00103 {
00104 }
00106 CIMProperty::CIMProperty(const CIMName& name) :
00107    CIMElement(), m_pdata(new PROPData)
00108 {
00109    m_pdata->m_name = name;
00110 }
00112 CIMProperty::CIMProperty(const char* name) :
00113    CIMElement(), m_pdata(new PROPData)
00114 {
00115    m_pdata->m_name = name;
00116 }
00118 CIMProperty::CIMProperty(const CIMName& name,
00119    const CIMValue& value) :
00120    CIMElement(), m_pdata(new PROPData)
00121 {
00122    m_pdata->m_name = name;
00123    m_pdata->m_cimValue = value;
00124    m_pdata->m_propertyDataType = value.getCIMDataType();
00125 }
00127 CIMProperty::CIMProperty(const CIMName& name,
00128    const CIMDataType& dt) :
00129    CIMElement(), m_pdata(new PROPData)
00130 {
00131    m_pdata->m_name = name;
00132    m_pdata->m_propertyDataType = dt;
00133 }
00135 CIMProperty::CIMProperty(const CIMProperty& x) :
00136    CIMElement(), m_pdata(x.m_pdata)
00137 {
00138 }
00140 CIMProperty::~CIMProperty()
00141 {
00142 }
00144 void
00145 CIMProperty::setNull()
00146 {
00147    m_pdata = NULL;
00148 }
00150 CIMProperty&
00151 CIMProperty::operator= (const CIMProperty& x)
00152 {
00153    m_pdata = x.m_pdata;
00154    return *this;
00155 }
00157 CIMProperty
00158 CIMProperty::clone(EIncludeQualifiersFlag includeQualifiers,
00159    EIncludeClassOriginFlag includeClassOrigin) const
00160 {
00161    CIMProperty cp;
00162    if (includeQualifiers)
00163    {
00164       cp.m_pdata->m_qualifiers = m_pdata->m_qualifiers;
00165    }
00166    if (includeClassOrigin)
00167    {
00168       cp.m_pdata->m_originClass = m_pdata->m_originClass;
00169    }
00170    cp.m_pdata->m_propertyDataType = m_pdata->m_propertyDataType;
00171    cp.m_pdata->m_sizeDataType = m_pdata->m_sizeDataType;
00172    cp.m_pdata->m_name = m_pdata->m_name;
00173    cp.m_pdata->m_override = m_pdata->m_override;
00174    if (m_pdata->m_cimValue && m_pdata->m_cimValue.getType() == CIMDataType::EMBEDDEDINSTANCE)
00175    {
00176       if (m_pdata->m_cimValue.getCIMDataType().isArrayType())
00177       {
00178          CIMInstanceArray array = m_pdata->m_cimValue.toCIMInstanceArray();
00179          for(CIMInstanceArray::iterator i = array.begin(); i != array.end(); i++ )
00180          {
00181             *i = i->clone(E_NOT_LOCAL_ONLY, includeQualifiers, includeClassOrigin);
00182          }
00183          cp.m_pdata->m_cimValue = CIMValue(array);
00184       }
00185       else
00186       {
00187          cp.m_pdata->m_cimValue = CIMValue(m_pdata->m_cimValue.toCIMInstance().clone(E_NOT_LOCAL_ONLY, includeQualifiers, includeClassOrigin));
00188       }
00189    }
00190    else
00191    {
00192       cp.m_pdata->m_cimValue = m_pdata->m_cimValue;
00193    }
00194    cp.m_pdata->m_propagated = m_pdata->m_propagated;
00195    return cp;
00196 }
00198 CIMQualifierArray
00199 CIMProperty::getQualifiers() const
00200 {
00201    return m_pdata->m_qualifiers;
00202 }
00204 CIMProperty&
00205 CIMProperty::setQualifiers(const CIMQualifierArray& quals)
00206 {
00207    m_pdata->m_qualifiers = quals;
00208    return *this;
00209 }
00211 String
00212 CIMProperty::getOriginClass() const
00213 {
00214    return m_pdata->m_originClass.toString();
00215 }
00217 CIMProperty&
00218 CIMProperty::setOriginClass(const CIMName& originCls)
00219 {
00220    m_pdata->m_originClass = originCls;
00221    return *this;
00222 }
00224 CIMProperty&
00225 CIMProperty::setValue(const CIMValue& val)
00226 {
00227    if (m_pdata->m_propertyDataType && val && val.getCIMDataType() != m_pdata->m_propertyDataType &&
00228       val.getType() != CIMDataType::EMBEDDEDCLASS && val.getType() != CIMDataType::EMBEDDEDINSTANCE)
00229    {
00230       m_pdata->m_cimValue = CIMValueCast::castValueToDataType(val, m_pdata->m_propertyDataType);
00231    }
00232    else
00233    {
00234       m_pdata->m_cimValue = val;
00235    }
00236    return *this;
00237 }
00239 CIMValue
00240 CIMProperty::getValue() const
00241 {
00242    return m_pdata->m_cimValue;
00243 }
00245 CIMValue
00246 CIMProperty::getValueT() const
00247 {
00248    if (!m_pdata->m_cimValue)
00249    {
00250       OW_THROW(NULLValueException, m_pdata->m_name.toString().c_str());
00251    }
00252    return m_pdata->m_cimValue;
00253 }
00255 CIMProperty&
00256 CIMProperty::setDataType(const CIMDataType& type)
00257 {
00258    m_pdata->m_propertyDataType = type;
00259    if (m_pdata->m_cimValue)
00260    {
00261       if (m_pdata->m_propertyDataType.getType() != m_pdata->m_cimValue.getType()
00262          || m_pdata->m_propertyDataType.isArrayType() !=
00263          m_pdata->m_cimValue.isArray())
00264       {
00265          if (m_pdata->m_cimValue.getType() != CIMDataType::EMBEDDEDCLASS &&
00266             m_pdata->m_cimValue.getType() != CIMDataType::EMBEDDEDINSTANCE)
00267          {
00268             m_pdata->m_cimValue = CIMValueCast::castValueToDataType(
00269                m_pdata->m_cimValue, m_pdata->m_propertyDataType);
00270          }
00271       }
00272    }
00273    return *this;
00274 }
00276 CIMProperty&
00277 CIMProperty::setDataType(const CIMDataType::Type& type)
00278 {
00279    return setDataType(CIMDataType(type));
00280 }
00282 CIMDataType
00283 CIMProperty::getDataType() const
00284 {
00285    return m_pdata->m_propertyDataType;
00286 }
00288 Int32
00289 CIMProperty::getSize() const
00290 {
00291    return m_pdata->m_sizeDataType;
00292 }
00294 CIMProperty&
00295 CIMProperty::setDataSize(Int32 size)
00296 {
00297    m_pdata->m_sizeDataType = size;
00298    return *this;
00299 }
00301 CIMProperty&
00302 CIMProperty::setOverridingProperty(const CIMName& opname)
00303 {
00304    m_pdata->m_override = opname;
00305    return *this;
00306 }
00308 String
00309 CIMProperty::getOverridingProperty() const
00310 {
00311    return m_pdata->m_override.toString();
00312 }
00314 bool
00315 CIMProperty::isReference() const
00316 {
00317    return m_pdata->m_propertyDataType.isReferenceType();
00318 }
00320 CIMQualifier
00321 CIMProperty::getQualifier(const CIMName& name) const
00322 {
00323    size_t tsize = m_pdata->m_qualifiers.size();
00324    for (size_t i = 0; i < tsize; i++)
00325    {
00326       CIMQualifier nq = m_pdata->m_qualifiers[i];
00327       if (nq.getName() == name)
00328       {
00329          return nq;
00330       }
00331    }
00332    return CIMQualifier(CIMNULL);
00333 }
00335 CIMQualifier
00336 CIMProperty::getQualifierT(const CIMName& name) const
00337 {
00338    CIMQualifier rval = getQualifier(name);
00339    if (!rval)
00340    {
00341       OW_THROW(NoSuchQualifierException, name.toString().c_str());
00342    }
00343    return rval;
00344 }
00346 CIMProperty&
00347 CIMProperty::setQualifier(const CIMQualifier& qual)
00348 {
00349    if (qual)
00350    {
00351       CIMName qualName = qual.getName();
00352       for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00353       {
00354          if (m_pdata->m_qualifiers[i].getName() == qualName)
00355          {
00356             m_pdata->m_qualifiers[i] = qual;
00357             return *this;
00358          }
00359       }
00360       m_pdata->m_qualifiers.append(qual);
00361    }
00362    return *this;
00363 }
00365 CIMProperty&
00366 CIMProperty::addQualifier(const CIMQualifier& qual)
00367 {
00368    size_t tsize = m_pdata->m_qualifiers.size();
00369    for (size_t i = 0; i < tsize; i++)
00370    {
00371       CIMQualifier nq = m_pdata->m_qualifiers[i];
00372       if (nq.getName().equalsIgnoreCase(qual.getName()))
00373       {
00374          String msg("Qualifier ");
00375          msg += qual.getName();
00376          msg += " already exists";
00377          OW_THROWCIMMSG(CIMException::ALREADY_EXISTS, msg.c_str());
00378       }
00379    }
00380    m_pdata->m_qualifiers.append(qual);
00381    return *this;
00382 }
00384 bool
00385 CIMProperty::removeQualifier(const CIMName& name)
00386 {
00387    size_t tsize = m_pdata->m_qualifiers.size();
00388    for (size_t i = 0; i < tsize; i++)
00389    {
00390       CIMQualifier nq = m_pdata->m_qualifiers[i];
00391       if (nq.getName() == name)
00392       {
00393          m_pdata->m_qualifiers.remove(i);
00394          return true;
00395       }
00396    }
00397    return false;
00398 }
00400 bool
00401 CIMProperty::isKey() const
00402 {
00403    
00404    if (getDataType().isReferenceType()
00405       || hasTrueQualifier(CIMQualifier::CIM_QUAL_KEY))
00406    {
00407       return true;
00408    }
00409    return false;
00410 }
00412 CIMProperty
00413 CIMProperty::filter(ELocalOnlyFlag localOnly, EIncludeQualifiersFlag includeQualifiers) const
00414 {
00415    
00416    
00417    
00418    
00419    if (localOnly && m_pdata->m_propagated)
00420    {
00421       return CIMProperty(CIMNULL);
00422    }
00423    CIMProperty cp;
00424    cp.m_pdata->m_propertyDataType = m_pdata->m_propertyDataType;
00425    cp.m_pdata->m_sizeDataType = m_pdata->m_sizeDataType;
00426    cp.m_pdata->m_name = m_pdata->m_name;
00427    cp.m_pdata->m_override = m_pdata->m_override;
00428    cp.m_pdata->m_originClass = m_pdata->m_originClass;
00429    cp.m_pdata->m_cimValue = m_pdata->m_cimValue;
00430    cp.m_pdata->m_propagated = m_pdata->m_propagated;
00431    if (includeQualifiers)
00432    {
00433       cp.m_pdata->m_qualifiers = m_pdata->m_qualifiers;
00434    }
00435    return cp;
00436 }
00438 CIMProperty&
00439 CIMProperty::setPropagated(bool propagated)
00440 {
00441    m_pdata->m_propagated = propagated;
00442    return *this;
00443 }
00445 bool
00446 CIMProperty::getPropagated() const
00447 {
00448    return m_pdata->m_propagated;
00449 }
00451 String
00452 CIMProperty::getName() const
00453 {
00454    return m_pdata->m_name.toString();
00455 }
00457 void
00458 CIMProperty::setName(const CIMName& name)
00459 {
00460    m_pdata->m_name = name;
00461 }
00463 CIMProperty&
00464 CIMProperty::clearQualifiers()
00465 {
00466    m_pdata->m_qualifiers.clear();
00467    return *this;
00468 }
00470 CIMProperty&
00471 CIMProperty::clearNonKeyQualifiers()
00472 {
00473    CIMQualifier key = getQualifier(CIMQualifier::CIM_QUAL_KEY);
00474    m_pdata->m_qualifiers.clear();
00475    if (key)
00476    {
00477       addQualifier(key);
00478    }
00479    return *this;
00480 }
00482 void
00483 CIMProperty::writeObject(ostream &ostrm) const
00484 {
00485    writeObject(ostrm, E_INCLUDE_QUALIFIERS);
00486 }
00488 void
00489 CIMProperty::writeObject(ostream &ostrm, EIncludeQualifiersFlag includeQualifiers) const
00490 {
00491    CIMBase::writeSig( ostrm, OW_CIMPROPERTYSIG );
00492    m_pdata->m_name.writeObject(ostrm);
00493    m_pdata->m_override.writeObject(ostrm);
00494    m_pdata->m_originClass.writeObject(ostrm);
00495    m_pdata->m_propertyDataType.writeObject(ostrm);
00496    BinarySerialization::writeLen(ostrm, m_pdata->m_sizeDataType);
00497    m_pdata->m_propagated.writeObject(ostrm);
00498    if (includeQualifiers)
00499    {
00500       BinarySerialization::writeArray(ostrm, m_pdata->m_qualifiers);
00501    }
00502    else
00503    {
00504       BinarySerialization::writeArray(ostrm, CIMQualifierArray());
00505    }
00506    if (m_pdata->m_cimValue)
00507    {
00508       Bool(true).writeObject(ostrm);
00509       m_pdata->m_cimValue.writeObject(ostrm);
00510    }
00511    else
00512    {
00513       Bool(false).writeObject(ostrm);
00514    }
00515 }
00517 void
00518 CIMProperty::readObject(istream &istrm)
00519 {
00520    CIMName name;
00521    CIMName override;
00522    CIMName originClass;
00523    CIMValue cimValue(CIMNULL);
00524    CIMDataType propertyDataType(CIMNULL);
00525    UInt32 sizeDataType;
00526    Bool propagated;
00527    CIMQualifierArray qualifiers;
00528    CIMBase::readSig( istrm, OW_CIMPROPERTYSIG );
00529    name.readObject(istrm);
00530    override.readObject(istrm);
00531    originClass.readObject(istrm);
00532    propertyDataType.readObject(istrm);
00533    BinarySerialization::readLen(istrm, sizeDataType);
00534    propagated.readObject(istrm);
00535    BinarySerialization::readArray(istrm, qualifiers);
00536    Bool isValue;
00537    isValue.readObject(istrm);
00538    if (isValue)
00539    {
00540       cimValue.readObject(istrm);
00541    }
00542    if (!m_pdata)
00543    {
00544       m_pdata = new PROPData;
00545    }
00546    m_pdata->m_name = name;
00547    m_pdata->m_override = override;
00548    m_pdata->m_originClass = originClass;
00549    m_pdata->m_cimValue = cimValue;
00550    m_pdata->m_propertyDataType = propertyDataType;
00551    m_pdata->m_sizeDataType = sizeDataType;
00552    m_pdata->m_propagated = propagated;
00553    m_pdata->m_qualifiers = qualifiers;
00554 }
00556 String
00557 CIMProperty::toString() const
00558 {
00559    StringBuffer rv = m_pdata->m_propertyDataType.toString() + ":"
00560       + m_pdata->m_name.toString() + "=";
00561    if (m_pdata->m_cimValue)
00562    {
00563       rv += m_pdata->m_cimValue.toString();
00564    }
00565    else
00566    {
00567       rv += "null";
00568    }
00569    return rv.releaseString();
00570 }
00572 String
00573 CIMProperty::toMOF() const
00574 {
00575    
00576    StringBuffer rv;
00577    if (m_pdata->m_qualifiers.size() > 0)
00578    {
00579       rv += "  [";
00580       for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00581       {
00582          CIMQualifier nq = m_pdata->m_qualifiers[i];
00583          if (i > 0)
00584          {
00585             rv += ',';
00586 
00587          }
00588          rv += nq.toMOF();
00589       }
00590       rv += "]\n";
00591    }
00592    rv += "  ";
00593    rv += m_pdata->m_propertyDataType.toMOF();
00594    rv += ' ';
00595    rv += m_pdata->m_name.toString();
00596    
00597    rv += m_pdata->m_propertyDataType.getArrayMOF();
00598    if (m_pdata->m_cimValue)
00599    {
00600       rv += '=';
00601       rv += m_pdata->m_cimValue.toMOF();
00602    }
00603    rv += ";\n";
00604    return rv.releaseString();
00605 }
00607 const char* const CIMProperty::NAME_PROPERTY = "Name";
00609 bool operator<(const CIMProperty& x, const CIMProperty& y)
00610 {
00611    return *x.m_pdata < *y.m_pdata;
00612 }
00614 bool
00615 CIMProperty::hasTrueQualifier(const CIMName& name) const
00616 {
00617    CIMQualifier q = getQualifier(name);
00618    if (!q)
00619    {
00620       return false;
00621    }
00622    CIMValue v = q.getValue();
00623    if (!v)
00624    {
00625       return false;
00626    }
00627    if (v.getType() != CIMDataType::BOOLEAN)
00628    {
00629       return false;
00630    }
00631    Bool b;
00632    v.get(b);
00633    return b;
00634 }
00635 
00636 } 
00637