version 1.58, 2006/11/07 21:38:14
|
version 1.64, 2008/02/29 18:55:06
|
|
|
#include "Resolver.h" | #include "Resolver.h" |
#include "CIMQualifierDecl.h" | #include "CIMQualifierDecl.h" |
#include "CIMName.h" | #include "CIMName.h" |
#include "Indentor.h" |
|
#include "XmlWriter.h" | #include "XmlWriter.h" |
#include "MofWriter.h" | #include "MofWriter.h" |
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/MessageLoader.h> //l10n |
#include <Pegasus/Common/MessageLoader.h> |
#include "StrLit.h" | #include "StrLit.h" |
#include "ArrayIterator.h" | #include "ArrayIterator.h" |
|
#include "CIMQualifierRep.h" |
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
PEGASUS_USING_STD; | PEGASUS_USING_STD; |
| |
CIMQualifierList::CIMQualifierList() |
static CIMName _KEY("Key"); |
|
|
|
CIMQualifierList::CIMQualifierList() : |
|
_keyIndex(PEGASUS_ORDEREDSET_INDEX_UNKNOWN) |
{ | { |
| |
} | } |
|
|
if (qualifier.isUninitialized()) | if (qualifier.isUninitialized()) |
throw UninitializedObjectException(); | throw UninitializedObjectException(); |
| |
if (find(qualifier.getName()) != PEG_NOT_FOUND){ |
if (find(qualifier.getName()) != PEG_NOT_FOUND) |
|
{ |
MessageLoaderParms parms("Common.CIMQualifierList.QUALIFIER", | MessageLoaderParms parms("Common.CIMQualifierList.QUALIFIER", |
"qualifier \"$0\"", | "qualifier \"$0\"", |
qualifier.getName().getString()); | qualifier.getName().getString()); |
|
|
| |
_qualifiers.append(qualifier); | _qualifiers.append(qualifier); |
| |
|
// Update key index: |
|
if (_keyIndex == PEGASUS_ORDEREDSET_INDEX_UNKNOWN && |
|
qualifier._rep->_name == _KEY) |
|
_keyIndex = _qualifiers.size()-1; |
|
|
return *this; | return *this; |
} | } |
//ATTN: Why do we not do the outofbounds check here. KS 18 May 2k |
|
CIMQualifier& CIMQualifierList::getQualifier(Uint32 index) | CIMQualifier& CIMQualifierList::getQualifier(Uint32 index) |
{ | { |
return _qualifiers[index]; | return _qualifiers[index]; |
} | } |
| |
//ATTN: added ks 18 may 2001. Should we have outofbounds? |
|
void CIMQualifierList::removeQualifier(Uint32 index) | void CIMQualifierList::removeQualifier(Uint32 index) |
{ | { |
_qualifiers.remove(index); | _qualifiers.remove(index); |
|
_keyIndex = PEGASUS_ORDEREDSET_INDEX_UNKNOWN; |
} | } |
| |
Uint32 CIMQualifierList::find(const CIMName& name) const |
void CIMQualifierList::clear() |
{ | { |
ConstArrayIterator<CIMQualifier> qualifiers(_qualifiers); |
_qualifiers.clear(); |
|
} |
| |
for (Uint32 i = 0, n = qualifiers.size(); i < n; i++) |
Uint32 CIMQualifierList::find(const CIMName& name) const |
{ | { |
if (name.equal(qualifiers[i].getName())) |
return _qualifiers.find(name, generateCIMNameTag(name)); |
return i; |
|
} | } |
| |
return PEG_NOT_FOUND; |
|
} |
|
Boolean CIMQualifierList::isTrue(const CIMName& name) const | Boolean CIMQualifierList::isTrue(const CIMName& name) const |
{ | { |
Uint32 index = find(name); | Uint32 index = find(name); |
|
|
return flag; | return flag; |
} | } |
| |
Uint32 CIMQualifierList::findReverse(const CIMName& name) const |
|
{ |
|
for (Uint32 i = _qualifiers.size(); i; --i) |
|
{ |
|
if (name.equal(_qualifiers[i-1].getName())) |
|
return i - 1; |
|
} |
|
|
|
return PEG_NOT_FOUND; |
|
} |
|
|
|
void CIMQualifierList::resolve( | void CIMQualifierList::resolve( |
DeclContext* declContext, | DeclContext* declContext, |
const CIMNamespaceName & nameSpace, | const CIMNamespaceName & nameSpace, |
|
|
CIMQualifierList& inheritedQualifiers, | CIMQualifierList& inheritedQualifiers, |
Boolean propagateQualifiers) // Apparently not used ks 24 mar 2002 | Boolean propagateQualifiers) // Apparently not used ks 24 mar 2002 |
{ | { |
|
_keyIndex = PEGASUS_ORDEREDSET_INDEX_UNKNOWN; |
|
|
PEG_METHOD_ENTER(TRC_OBJECTRESOLUTION, "CIMQualifierList::resolve()"); | PEG_METHOD_ENTER(TRC_OBJECTRESOLUTION, "CIMQualifierList::resolve()"); |
// For each qualifier in the qualifiers array, the following | // For each qualifier in the qualifiers array, the following |
// is checked: | // is checked: |
|
|
nameSpace, q.getName()); | nameSpace, q.getName()); |
| |
if (qd.isUninitialized()) | if (qd.isUninitialized()) |
|
{ |
|
PEG_METHOD_EXIT(); |
throw UndeclaredQualifier(q.getName().getString ()); | throw UndeclaredQualifier(q.getName().getString ()); |
|
} |
| |
//---------------------------------------------------------------------- | //---------------------------------------------------------------------- |
// 2. Check the type and isArray. Must be the same: | // 2. Check the type and isArray. Must be the same: |
//---------------------------------------------------------------------- | //---------------------------------------------------------------------- |
| |
if (!(q.getType() == qd.getType() && q.isArray() == qd.isArray())) | if (!(q.getType() == qd.getType() && q.isArray() == qd.isArray())) |
|
{ |
|
PEG_METHOD_EXIT(); |
throw BadQualifierType(q.getName().getString ()); | throw BadQualifierType(q.getName().getString ()); |
|
} |
| |
#ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT | #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT |
//---------------------------------------------------------------------- | //---------------------------------------------------------------------- |
|
|
{ | { |
String embeddedInstType("EmbeddedInstance(\""); | String embeddedInstType("EmbeddedInstance(\""); |
embeddedInstType = embeddedInstType + className + "\")"; | embeddedInstType = embeddedInstType + className + "\")"; |
|
PEG_METHOD_EXIT(); |
throw BadQualifierType(embeddedInstType); | throw BadQualifierType(embeddedInstType); |
} | } |
} | } |
|
|
// ks Mar 2002. Reinstalled 23 March 2002 to test. | // ks Mar 2002. Reinstalled 23 March 2002 to test. |
| |
if (!(qd.getScope().hasScope (scope))) | if (!(qd.getScope().hasScope (scope))) |
|
{ |
|
PEG_METHOD_EXIT(); |
throw BadQualifierScope | throw BadQualifierScope |
(qd.getName().getString (), scope.toString ()); | (qd.getName().getString (), scope.toString ()); |
|
} |
| |
//---------------------------------------------------------------------- | //---------------------------------------------------------------------- |
// Resolve the qualifierflavor. Since Flavors are a combination of | // Resolve the qualifierflavor. Since Flavors are a combination of |
|
|
// Do not allow change from disable override to enable override. | // Do not allow change from disable override to enable override. |
if ((!qd.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE)) | if ((!qd.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE)) |
&& (q.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE))) | && (q.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE))) |
|
{ |
|
PEG_METHOD_EXIT(); |
throw BadQualifierOverride(q.getName().getString ()); | throw BadQualifierOverride(q.getName().getString ()); |
|
} |
| |
Resolver::resolveQualifierFlavor( | Resolver::resolveQualifierFlavor( |
q, CIMFlavor (qd.getFlavor ()), false); | q, CIMFlavor (qd.getFlavor ()), false); |
|
|
// don't allow change override to notoverride. | // don't allow change override to notoverride. |
if (!(iq.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE)) | if (!(iq.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE)) |
&& q.getFlavor ().hasFlavor (CIMFlavor::OVERRIDABLE)) | && q.getFlavor ().hasFlavor (CIMFlavor::OVERRIDABLE)) |
|
{ |
|
PEG_METHOD_EXIT(); |
throw BadQualifierOverride(q.getName().getString ()); | throw BadQualifierOverride(q.getName().getString ()); |
|
} |
| |
if (!(iq.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE)) | if (!(iq.getFlavor ().hasFlavor(CIMFlavor::OVERRIDABLE)) |
&& iq.getFlavor ().hasFlavor(CIMFlavor::TOSUBCLASS)) | && iq.getFlavor ().hasFlavor(CIMFlavor::TOSUBCLASS)) |
|
|
CIMValue iqv = iq.getValue(); | CIMValue iqv = iq.getValue(); |
if (!(qv == iqv)) | if (!(qv == iqv)) |
{ | { |
|
PEG_METHOD_EXIT(); |
throw BadQualifierOverride(q.getName().getString()); | throw BadQualifierOverride(q.getName().getString()); |
} | } |
} | } |
|
|
| |
CIMQualifier q = iq.clone(); | CIMQualifier q = iq.clone(); |
q.setPropagated(true); | q.setPropagated(true); |
_qualifiers.prepend(q); |
_qualifiers.insert(0, q); |
} | } |
|
PEG_METHOD_EXIT(); |
} | } |
| |
void CIMQualifierList::toXml(Buffer& out) const | void CIMQualifierList::toXml(Buffer& out) const |
|
|
{ | { |
Buffer tmp; | Buffer tmp; |
toXml(tmp); | toXml(tmp); |
tmp.append('\0'); |
|
os << tmp.getData() << PEGASUS_STD(endl); | os << tmp.getData() << PEGASUS_STD(endl); |
} | } |
| |
|
|
| |
void CIMQualifierList::cloneTo(CIMQualifierList& x) const | void CIMQualifierList::cloneTo(CIMQualifierList& x) const |
{ | { |
|
x._keyIndex = PEGASUS_ORDEREDSET_INDEX_UNKNOWN; |
x._qualifiers.clear(); | x._qualifiers.clear(); |
x._qualifiers.reserveCapacity(_qualifiers.size()); | x._qualifiers.reserveCapacity(_qualifiers.size()); |
| |
for (Uint32 i = 0, n = _qualifiers.size(); i < n; i++) | for (Uint32 i = 0, n = _qualifiers.size(); i < n; i++) |
x._qualifiers.append(_qualifiers[i].clone()); | x._qualifiers.append(_qualifiers[i].clone()); |
|
x._keyIndex = _keyIndex; |
|
} |
|
|
|
Boolean CIMQualifierList::isKey() const |
|
{ |
|
static Uint32 _KEY_TAG = generateCIMNameTag(_KEY); |
|
|
|
// Resolve key index if unresolved. |
|
|
|
if (_keyIndex == PEGASUS_ORDEREDSET_INDEX_UNKNOWN) |
|
{ |
|
Uint32 pos = _qualifiers.find(_KEY, _KEY_TAG); |
|
((CIMQualifierList*)this)->_keyIndex = int(pos); |
|
} |
|
|
|
// If no key qualifier in list, then return false (default key value). |
|
|
|
if (_keyIndex == PEGASUS_ORDEREDSET_INDEX_NOTFOUND) |
|
return false; |
|
|
|
// Obtain value of key qualifier. |
|
|
|
const CIMValue& value = _qualifiers[_keyIndex]._rep->_value; |
|
if (!value.isNull() && |
|
value.getType() == CIMTYPE_BOOLEAN) |
|
{ |
|
Boolean boolVal; |
|
value.get(boolVal); |
|
return boolVal; |
|
} |
|
|
|
return false; |
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |