CIMInstance ObjectNormalizer::processInstance( const CIMInstance& cimInstance) const { // pre-checks if (!_enableNormalization || _cimClass.isUninitialized()) { // do nothing return cimInstance; } /* // ATTN: moving similar logic to the response handlers because this // type of error should be checked regardless with or without // normalization enabled. if (cimInstance.isUninitialized()) { throw CIMException(CIM_ERR_FAILED, "unintialized instance object."); } */ CIMInstance normalizedInstance(_cimClass.getClassName()); // proces object path normalizedInstance.setPath( processInstanceObjectPath(cimInstance.getPath())); // process instance qualifiers if (_includeQualifiers) { // propagate class qualifiers for (Uint32 i = 0, n = _cimClass.getQualifierCount(); i < n; i++) { CIMConstQualifier referenceQualifier = _cimClass.getQualifier(i); Uint32 pos = cimInstance.findQualifier(referenceQualifier.getName()); // update value if qualifier is present in the specified property if (pos != PEG_NOT_FOUND) { CIMConstQualifier cimQualifier = cimInstance.getQualifier(pos); CIMQualifier normalizedQualifier = _processQualifier( referenceQualifier, cimQualifier); normalizedInstance.addQualifier(normalizedQualifier); } else { normalizedInstance.addQualifier(referenceQualifier.clone()); } } } // check property names and types. any properties in the class but not // in the instance are implicitly dropped. for (Uint32 i = 0, n = cimInstance.getPropertyCount(); i < n; i++) { CIMConstProperty instProperty = cimInstance.getProperty(i); Uint32 pos = _cimClass.findProperty(instProperty.getName()); if (pos != PEG_NOT_FOUND) { CIMConstProperty cimProperty = _cimClass.getProperty(pos); CIMProperty normalizedProperty = processProperty( cimProperty, instProperty, _includeQualifiers, _includeClassOrigin, _context.get(), _nameSpace); normalizedInstance.addProperty(normalizedProperty); } } return normalizedInstance; }
void test01() { const CIMNamespaceName NAMESPACE = CIMNamespaceName("/zzz"); // Create and populate a declaration context: SimpleDeclContext* context = new SimpleDeclContext; context->addQualifierDecl( NAMESPACE, CIMQualifierDecl(CIMName("counter"), false, CIMScope::PROPERTY)); context->addQualifierDecl( NAMESPACE, CIMQualifierDecl(CIMName("classcounter"), false, CIMScope::CLASS)); context->addQualifierDecl( NAMESPACE, CIMQualifierDecl(CIMName("min"), String(), CIMScope::PROPERTY)); context->addQualifierDecl( NAMESPACE, CIMQualifierDecl(CIMName("max"), String(), CIMScope::PROPERTY)); context->addQualifierDecl(NAMESPACE, CIMQualifierDecl(CIMName("Description"), String(), CIMScope::PROPERTY)); CIMClass class1(CIMName("MyClass")); class1 .addProperty(CIMProperty(CIMName("count"), Uint32(55)) .addQualifier(CIMQualifier(CIMName("counter"), true)) .addQualifier(CIMQualifier(CIMName("min"), String("0"))) .addQualifier(CIMQualifier(CIMName("max"), String("1")))) .addProperty(CIMProperty(CIMName("message"), String("Hello")) .addQualifier(CIMQualifier(CIMName("description"), String("My Message")))) .addProperty(CIMProperty(CIMName("ratio"), Real32(1.5))); // Test assert(class1.findProperty(CIMName("count")) != PEG_NOT_FOUND); assert(class1.findProperty(CIMName("message")) != PEG_NOT_FOUND); assert(class1.findProperty(CIMName("ratio")) != PEG_NOT_FOUND); Resolver::resolveClass(class1, context, NAMESPACE); context->addClass(NAMESPACE, class1); if (verbose) { XmlWriter::printClassElement(class1); } CIMInstance instance0(CIMName("MyClass")); assert(instance0.getClassName().equal(CIMName("MyClass"))); instance0.setPath(CIMObjectPath("//localhost/root/cimv2:MyClass.Foo=1")); assert(instance0.getPath() == CIMObjectPath("//localhost/root/cimv2:MyClass.Foo=1")); CIMInstance instance1(CIMName("MyClass")); instance1.addQualifier(CIMQualifier(CIMName("classcounter"), true)); instance1.addProperty(CIMProperty(CIMName("message"), String("Goodbye"))); assert(instance1.findProperty(CIMName("message")) != PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("count")) == PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("ratio")) == PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("nuts")) == PEG_NOT_FOUND); assert(instance1.getPropertyCount() == 1); if (verbose) { XmlWriter::printInstanceElement(instance1); } Resolver::resolveInstance(instance1, context, NAMESPACE, true); if (verbose) { XmlWriter::printInstanceElement(instance1); } // Now test for properties after resolution. assert(instance1.findProperty(CIMName("message")) != PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("count")) != PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("ratio")) != PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("nuts")) == PEG_NOT_FOUND); assert(instance1.getPropertyCount() == 3); // Now remove a property Uint32 posProperty; posProperty = instance1.findProperty(CIMName("count")); instance1.removeProperty(posProperty); assert(instance1.findProperty(CIMName("message")) != PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("count")) == PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("ratio")) != PEG_NOT_FOUND); assert(instance1.findProperty(CIMName("nuts")) == PEG_NOT_FOUND); assert(instance1.getPropertyCount() == 2); // Instance qualifier tests CIMQualifier cq=instance1.getQualifier(instance1.findQualifier( CIMName("classcounter"))); const CIMInstance instance2 = instance1.clone(); assert(instance2.identical(instance1)); assert(instance1.findQualifier(CIMName("nuts")) == PEG_NOT_FOUND); assert(instance2.findQualifier(CIMName("nuts")) == PEG_NOT_FOUND); assert(instance1.getQualifierCount() != 4); assert(instance1.getQualifierCount() == 1); assert(instance2.getQualifierCount() == 1); if (verbose) { XmlWriter::printInstanceElement(instance2); } // Tests for CIMConstInstance CIMConstInstance cinstance1(CIMName("MyClass")), cinstance3; CIMConstInstance ccopy(cinstance1); cinstance1 = instance1; assert(cinstance1.identical(instance1)); assert(cinstance1.getQualifierCount() == 1); CIMConstQualifier ccq = cinstance1.getQualifier(cinstance1.findQualifier( CIMName("classcounter"))); assert(cinstance1.findProperty(CIMName("message")) != PEG_NOT_FOUND); CIMConstProperty ccp = cinstance1.getProperty(cinstance1.findProperty(CIMName("message"))); cinstance3 = cinstance1; assert(cinstance3.identical(cinstance1)); assert(cinstance1.getClassName() == CIMName("MyClass")); assert(cinstance1.getClassName().equal(CIMName("MyClass"))); assert(cinstance1.getClassName().equal(CIMName("MYCLASS"))); assert(cinstance1.getClassName().equal(CIMName("myclass"))); assert(!cinstance1.getClassName().equal(CIMName("blob"))); assert(cinstance1.getQualifierCount() != 4); assert(cinstance1.getPropertyCount() == 2); CIMConstInstance cinstance2 = cinstance1.clone(); assert(cinstance2.identical(cinstance1)); if (verbose) { XmlWriter::printInstanceElement(cinstance1); } cinstance1.buildPath(class1); assert( !cinstance1.isUninitialized() ); delete context; }