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_CIMQualifier.hpp"
00038 #include "OW_StringBuffer.hpp"
00039 #include "OW_Assertion.hpp"
00040 #include "OW_BinarySerialization.hpp"
00041 #include "OW_StrictWeakOrdering.hpp"
00042 #include "OW_NULLValueException.hpp"
00043 #include "OW_CIMValue.hpp"
00044 #include "OW_CIMQualifierType.hpp"
00045 #include "OW_CIMFlavor.hpp"
00046 #include "OW_COWIntrusiveCountableBase.hpp"
00047 
00048 namespace OW_NAMESPACE
00049 {
00050 
00051 using std::istream;
00052 using std::ostream;
00054 struct CIMQualifier::QUALData : public COWIntrusiveCountableBase
00055 {
00056    QUALData() 
00057       : m_qualifierValue(CIMNULL)
00058       , m_propagated(false) 
00059    {}
00060    CIMName m_name;
00061    CIMValue m_qualifierValue;
00062    CIMQualifierType m_qualifierType;
00063    Bool m_propagated;
00064    CIMFlavorArray m_flavors;
00065    String m_language;
00066    QUALData* clone() const { return new QUALData(*this); }
00067 };
00069 bool operator<(const CIMQualifier::QUALData& x, const CIMQualifier::QUALData& y)
00070 {
00071    return StrictWeakOrdering(
00072       x.m_name, y.m_name,
00073       x.m_language, y.m_language,
00074       x.m_qualifierValue, y.m_qualifierValue,
00075       x.m_qualifierType, y.m_qualifierType,
00076       x.m_propagated, y.m_propagated,
00077       x.m_flavors, y.m_flavors);
00078 }
00080 CIMQualifier::CIMQualifier() :
00081    CIMElement(), m_pdata(new QUALData)
00082 {
00083 }
00085 CIMQualifier::CIMQualifier(CIMNULL_t) :
00086    CIMElement(), m_pdata(0)
00087 {
00088 }
00090 CIMQualifier::CIMQualifier(const CIMName& name) :
00091    CIMElement(), m_pdata(new QUALData)
00092 {
00093    m_pdata->m_name = name;
00094 }
00096 CIMQualifier::CIMQualifier(const char* name) :
00097    CIMElement(), m_pdata(new QUALData)
00098 {
00099    m_pdata->m_name = name;
00100 }
00102 CIMQualifier::CIMQualifier(const CIMQualifierType& cgt) :
00103    CIMElement(), m_pdata(new QUALData)
00104 {
00105    m_pdata->m_name = cgt.getName();
00106    m_pdata->m_qualifierType = cgt;
00107    m_pdata->m_qualifierValue = cgt.getDefaultValue();
00108    m_pdata->m_flavors = cgt.getFlavors();
00109 }
00111 CIMQualifier::CIMQualifier(const CIMQualifier& x) :
00112    CIMElement(), m_pdata(x.m_pdata)
00113 {
00114 }
00116 CIMQualifier::~CIMQualifier()
00117 {
00118 }
00120 void
00121 CIMQualifier::setNull()
00122 {
00123    m_pdata = NULL;
00124 }
00126 CIMQualifier&
00127 CIMQualifier::operator= (const CIMQualifier& x)
00128 {
00129    m_pdata = x.m_pdata;
00130    return *this;
00131 }
00133 bool
00134 CIMQualifier::isKeyQualifier() const
00135 {
00136    return m_pdata->m_name == CIMQualifier::CIM_QUAL_KEY;
00137 }
00139 bool
00140 CIMQualifier::isAssociationQualifier() const
00141 {
00142    return m_pdata->m_name == CIMQualifier::CIM_QUAL_ASSOCIATION;
00143 }
00145 CIMValue
00146 CIMQualifier::getValue() const
00147 {
00148    return m_pdata->m_qualifierValue;
00149 }
00151 CIMValue
00152 CIMQualifier::getValueT() const
00153 {
00154    if (!m_pdata->m_qualifierValue)
00155    {
00156       OW_THROW(NULLValueException, "");
00157    }
00158    return m_pdata->m_qualifierValue;
00159 }
00161 CIMQualifier&
00162 CIMQualifier::setValue(const CIMValue& value)
00163 {
00164    m_pdata->m_qualifierValue = value;
00165    return *this;
00166 }
00168 CIMQualifier&
00169 CIMQualifier::setDefaults(const CIMQualifierType& qtype)
00170 {
00171    m_pdata->m_qualifierType = qtype;
00172    return *this;
00173 }
00175 CIMQualifierType
00176 CIMQualifier::getDefaults() const
00177 {
00178    return m_pdata->m_qualifierType;
00179 }
00181 bool
00182 CIMQualifier::hasFlavor(const CIMFlavor& flavor) const
00183 {
00184    if (flavor)
00185    {
00186       size_t tsize = m_pdata->m_flavors.size();
00187       for (size_t i = 0; i < tsize; i++)
00188       {
00189          if (m_pdata->m_flavors[i].getFlavor() == flavor.getFlavor())
00190          {
00191             return true;
00192          }
00193       }
00194    }
00195    return(false);
00196 }
00198 CIMQualifier&
00199 CIMQualifier::addFlavor(const CIMFlavor& flavor)
00200 {
00201    if (flavor)
00202    {
00203       Int32 flavorValue = flavor.getFlavor();
00204       
00205       
00206       
00207       size_t tsize = m_pdata->m_flavors.size();
00208       for (size_t i = 0; i < tsize; i++)
00209       {
00210          if (m_pdata->m_flavors[i].getFlavor() == flavorValue)
00211          {
00212             return *this;
00213          }
00214       }
00215       switch (flavorValue)
00216       {
00217          case CIMFlavor::ENABLEOVERRIDE:
00218             removeFlavor(CIMFlavor::DISABLEOVERRIDE);
00219             break;
00220          case CIMFlavor::DISABLEOVERRIDE:
00221             removeFlavor(CIMFlavor::ENABLEOVERRIDE);
00222             break;
00223          case CIMFlavor::RESTRICTED:
00224             removeFlavor(CIMFlavor::TOSUBCLASS);
00225             break;
00226          case CIMFlavor::TOSUBCLASS:
00227             removeFlavor(CIMFlavor::RESTRICTED);
00228             break;
00229       }
00230       m_pdata->m_flavors.append(flavor);
00231    }
00232    return *this;
00233 }
00235 CIMQualifier&
00236 CIMQualifier::removeFlavor(Int32 flavor)
00237 {
00238    size_t i = 0;
00239    while (i < m_pdata->m_flavors.size())
00240    {
00241       if (m_pdata->m_flavors[i].getFlavor() == flavor)
00242       {
00243          m_pdata->m_flavors.remove(i);
00244       }
00245       else
00246       {
00247          ++i;
00248       }
00249    }
00250    return *this;
00251 }
00253 bool
00254 CIMQualifier::hasValue() const
00255 {
00256    return (m_pdata->m_qualifierValue) ? true : false;
00257 }
00259 bool
00260 CIMQualifier::equals(const CIMQualifier& arg) const
00261 {
00262    return m_pdata->m_name == arg.getName();
00263 }
00265 CIMFlavorArray
00266 CIMQualifier::getFlavor() const
00267 {
00268    return m_pdata->m_flavors;
00269 }
00271 CIMQualifier&
00272 CIMQualifier::setPropagated(bool propagated)
00273 {
00274    m_pdata->m_propagated = propagated;
00275    return *this;
00276 }
00278 bool
00279 CIMQualifier::getPropagated() const
00280 {
00281    return m_pdata->m_propagated;
00282 }
00284 CIMQualifier& 
00285 CIMQualifier::setLanguage(const String& language)
00286 {
00287    OW_ASSERT(hasFlavor(CIMFlavor::TRANSLATE));
00288    m_pdata->m_language = language;
00289    return *this;
00290 }
00292 String
00293 CIMQualifier::getLanguage() const
00294 {
00295    return m_pdata->m_language;
00296 }
00298 String
00299 CIMQualifier::getName() const
00300 {
00301    return m_pdata->m_name.toString();
00302 }
00304 void
00305 CIMQualifier::setName(const CIMName& name)
00306 {
00307    m_pdata->m_name = name;
00308 }
00310 void
00311 CIMQualifier::readObject(istream &istrm)
00312 {
00313    CIMName name;
00314    CIMValue qualifierValue(CIMNULL);
00315    CIMQualifierType qualifierType(CIMNULL);
00316    Bool propagated;
00317    CIMFlavorArray flavors;
00318    Bool isValue;
00319    String language;
00320 
00321    UInt32 version = CIMBase::readSig( istrm, OW_CIMQUALIFIERSIG, OW_CIMQUALIFIERSIG_V, CIMQualifier::SERIALIZATION_VERSION );
00322 
00323    name.readObject(istrm);
00324    isValue.readObject(istrm);
00325    if (isValue)
00326    {
00327       qualifierValue.readObject(istrm);
00328    }
00329    qualifierType.readObject(istrm);
00330    propagated.readObject(istrm);
00331    BinarySerialization::readArray(istrm, flavors);
00332 
00333    
00334    if (version > 0)
00335    {
00336       language.readObject(istrm);
00337    }
00338 
00339    if (!m_pdata)
00340    {
00341       m_pdata = new QUALData;
00342    }
00343    m_pdata->m_name = name;
00344    m_pdata->m_qualifierValue = qualifierValue;
00345    m_pdata->m_qualifierType = qualifierType;
00346    m_pdata->m_propagated = propagated;
00347    m_pdata->m_flavors = flavors;
00348    m_pdata->m_language = language;
00349 }
00351 void
00352 CIMQualifier::writeObject(ostream &ostrm) const
00353 {
00354    CIMBase::writeSig(ostrm, OW_CIMQUALIFIERSIG_V, CIMQualifier::SERIALIZATION_VERSION);
00355 
00356    m_pdata->m_name.writeObject(ostrm);
00357    CIMValue qv = m_pdata->m_qualifierValue;
00358    if (!qv && m_pdata->m_qualifierType)
00359    {
00360       qv = m_pdata->m_qualifierType.getDefaultValue();
00361    }
00362    if (m_pdata->m_qualifierValue)
00363    {
00364       Bool(true).writeObject(ostrm);
00365       qv.writeObject(ostrm);
00366    }
00367    else
00368    {
00369       Bool(false).writeObject(ostrm);
00370    }
00371    m_pdata->m_qualifierType.writeObject(ostrm);
00372    m_pdata->m_propagated.writeObject(ostrm);
00373    BinarySerialization::writeArray(ostrm, m_pdata->m_flavors);
00374    m_pdata->m_language.writeObject(ostrm);
00375 }
00377 String
00378 CIMQualifier::toMOF() const
00379 {
00380    StringBuffer rv;
00381    rv += m_pdata->m_name.toString();
00382    
00383    if (!m_pdata->m_language.empty())
00384    {
00385       rv += '_';
00386       rv += m_pdata->m_language;
00387    }
00388 
00389    if (m_pdata->m_qualifierValue 
00390       && m_pdata->m_name != CIMName("Association")
00391       && m_pdata->m_name != CIMName("Indication"))
00392    {
00393       if (!m_pdata->m_qualifierValue.isArray())
00394       {
00395          rv += '(';
00396       }
00397       rv += m_pdata->m_qualifierValue.toMOF();
00398       if (!m_pdata->m_qualifierValue.isArray())
00399       {
00400          rv += ')';
00401       }
00402    }
00403    
00404    return rv.releaseString();
00405 }
00407 String
00408 CIMQualifier::toString() const
00409 {
00410    StringBuffer rv("CIMQualifier(");
00411    rv += m_pdata->m_name.toString();
00412    if (!m_pdata->m_language.empty())
00413    {
00414       rv += '_';
00415       rv += m_pdata->m_language;
00416    }
00417    rv += ')';
00418    return rv.releaseString();
00419 }
00421 
00422 CIMQualifier
00423 CIMQualifier::createKeyQualifier()
00424 {
00425    CIMQualifier cq(CIMQualifier::CIM_QUAL_KEY);
00426    cq.setValue(CIMValue(Bool(true)));
00427    return cq;
00428 }
00430 bool operator<(const CIMQualifier& x, const CIMQualifier& y)
00431 {
00432    return *x.m_pdata < *y.m_pdata;
00433 }
00434 
00435 const char* const CIMQualifier::CIM_QUAL_ASSOCIATION  = "Association";
00436 const char* const CIMQualifier::CIM_QUAL_INDICATION      = "Indication";
00437 
00438 const char* const CIMQualifier::CIM_QUAL_ABSTRACT     = "Abstract";
00439 const char* const CIMQualifier::CIM_QUAL_AGGREGATE       = "Aggregate";
00440 const char* const CIMQualifier::CIM_QUAL_AGGREGATION  = "Aggregation";
00441 const char* const CIMQualifier::CIM_QUAL_ALIAS        = "Alias";
00442 const char* const CIMQualifier::CIM_QUAL_ARRAYTYPE       = "ArrayType";
00443 const char* const CIMQualifier::CIM_QUAL_BITMAP       = "BitMap";
00444 const char* const CIMQualifier::CIM_QUAL_BITVALUES       = "BitValues";
00445 const char* const CIMQualifier::CIM_QUAL_COMPOSITION    = "Composition";
00446 const char* const CIMQualifier::CIM_QUAL_COUNTER      = "Counter";
00447 const char* const CIMQualifier::CIM_QUAL_DELETE         = "Delete";
00448 const char* const CIMQualifier::CIM_QUAL_DEPRECATED     = "Deprecated";
00449 const char* const CIMQualifier::CIM_QUAL_DESCRIPTION  = "Description";
00450 const char* const CIMQualifier::CIM_QUAL_DISPLAYNAME  = "DisplayName";
00451 const char* const CIMQualifier::CIM_QUAL_DN             = "DN";
00452 const char* const CIMQualifier::CIM_QUAL_EMBEDDEDOBJECT = "EmbeddedObject";
00453 const char* const CIMQualifier::CIM_QUAL_EXCEPTION      = "Exception";
00454 const char* const CIMQualifier::CIM_QUAL_EXPENSIVE      = "Expensive";
00455 const char* const CIMQualifier::CIM_QUAL_EXPERIMENTAL   = "Experimental";
00456 const char* const CIMQualifier::CIM_QUAL_GAUGE        = "Gauge";
00457 const char* const CIMQualifier::CIM_QUAL_IFDELETED      = "Ifdeleted";
00458 const char* const CIMQualifier::CIM_QUAL_IN             = "In";
00459 const char* const CIMQualifier::CIM_QUAL_INVISIBLE      = "Invisible";
00460 const char* const CIMQualifier::CIM_QUAL_KEY            = "Key";
00461 const char* const CIMQualifier::CIM_QUAL_LARGE          = "Large";
00462 const char* const CIMQualifier::CIM_QUAL_MAPPINGSTRINGS  = "MappingStrings";
00463 const char* const CIMQualifier::CIM_QUAL_MAX          = "Max";
00464 const char* const CIMQualifier::CIM_QUAL_MAXLEN         = "MaxLen";
00465 const char* const CIMQualifier::CIM_QUAL_MAXVALUE     = "MaxValue";
00466 const char* const CIMQualifier::CIM_QUAL_MIN          = "Min";
00467 const char* const CIMQualifier::CIM_QUAL_MINLEN         = "MinLen";
00468 const char* const CIMQualifier::CIM_QUAL_MINVALUE     = "MinValue";
00469 const char* const CIMQualifier::CIM_QUAL_MODELCORRESPONDENCE = "ModelCorrespondence";
00470 const char* const CIMQualifier::CIM_QUAL_NONLOCAL     = "Nonlocal";
00471 const char* const CIMQualifier::CIM_QUAL_NONLOCALTYPE    = "NonlocalType";
00472 const char* const CIMQualifier::CIM_QUAL_NULLVALUE       = "NullValue";
00473 const char* const CIMQualifier::CIM_QUAL_OCTETSTRING    = "Octetstring";
00474 const char* const CIMQualifier::CIM_QUAL_OUT          = "Out";
00475 const char* const CIMQualifier::CIM_QUAL_OVERRIDE     = "Override";
00476 const char* const CIMQualifier::CIM_QUAL_PROPAGATED   = "Propagated";
00477 const char* const CIMQualifier::CIM_QUAL_PROPERTYUSAGE  = "PropertyUsage";
00478 const char* const CIMQualifier::CIM_QUAL_PROVIDER       = "Provider";
00479 const char* const CIMQualifier::CIM_QUAL_READ         = "Read";
00480 const char* const CIMQualifier::CIM_QUAL_REQUIRED     = "Required";
00481 const char* const CIMQualifier::CIM_QUAL_REVISION     = "Revision";
00482 const char* const CIMQualifier::CIM_QUAL_SCHEMA         = "Schema";
00483 const char* const CIMQualifier::CIM_QUAL_SOURCE         = "Source";
00484 const char* const CIMQualifier::CIM_QUAL_SOURCETYPE     = "SourceType";
00485 const char* const CIMQualifier::CIM_QUAL_STATIC         = "Static";
00486 const char* const CIMQualifier::CIM_QUAL_SYNTAX         = "Syntax";
00487 const char* const CIMQualifier::CIM_QUAL_SYNTAXTYPE     = "SyntaxType";
00488 const char* const CIMQualifier::CIM_QUAL_TERMINAL     = "Terminal";
00489 const char* const CIMQualifier::CIM_QUAL_TRIGGERTYPE    = "TriggerType";
00490 const char* const CIMQualifier::CIM_QUAL_UNITS        = "Units";
00491 const char* const CIMQualifier::CIM_QUAL_UNKNOWNVALUES  = "UnknownValues";
00492 const char* const CIMQualifier::CIM_QUAL_UNSUPPORTEDVALUES = "UnsupportedValues";
00493 const char* const CIMQualifier::CIM_QUAL_VALUEMAP     = "ValueMap";
00494 const char* const CIMQualifier::CIM_QUAL_VALUES         = "Values";
00495 const char* const CIMQualifier::CIM_QUAL_VERSION      = "Version";
00496 const char* const CIMQualifier::CIM_QUAL_WEAK         = "Weak";
00497 const char* const CIMQualifier::CIM_QUAL_WRITE        = "Write";
00498 
00499 } 
00500