📄 cimclassrep.cpp
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions://// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include "CIMClassRep.h"#include "DeclContext.h"#include "Resolver.h"#include "Indentor.h"#include "CIMName.h"#include "CIMQualifierNames.h"#include "CIMScope.h"#include "XmlWriter.h"#include "MofWriter.h"#include <Pegasus/Common/Tracer.h>#include <Pegasus/Common/MessageLoader.h>#include "CIMNameUnchecked.h"#include "StrLit.h"#include "CIMInstanceRep.h"PEGASUS_NAMESPACE_BEGINPEGASUS_USING_STD;CIMClassRep::CIMClassRep( const CIMName& className, const CIMName& superClassName) : CIMObjectRep(CIMObjectPath(String(), CIMNamespaceName(), className)), _superClassName(superClassName){}CIMClassRep::~CIMClassRep(){}Boolean CIMClassRep::isAssociation() const{ Uint32 index = findQualifier(CIMQualifierNames::ASSOCIATION); if (index == PEG_NOT_FOUND) return false; Boolean flag; const CIMValue& value = getQualifier(index).getValue(); if (value.getType() != CIMTYPE_BOOLEAN) return false; value.get(flag); return flag;}Boolean CIMClassRep::isAbstract() const{ Uint32 index = findQualifier(CIMQualifierNames::ABSTRACT); if (index == PEG_NOT_FOUND) return false; Boolean flag; const CIMValue& value = getQualifier(index).getValue(); if (value.getType() != CIMTYPE_BOOLEAN) return false; value.get(flag); return flag;}void CIMClassRep::setSuperClassName(const CIMName& superClassName){ _superClassName = superClassName;}void CIMClassRep::addProperty(const CIMProperty& x){ if (x.isUninitialized()) throw UninitializedObjectException(); // Reject addition of duplicate property name: if (findProperty(x.getName()) != PEG_NOT_FOUND) { MessageLoaderParms parms( "Common.CIMClassRep.PROPERTY", "property \"$0\"", x.getName().getString()); throw AlreadyExistsException(parms); } // Reject addition of a reference property without a referenceClassName if ((x.getType() == CIMTYPE_REFERENCE) && (x.getReferenceClassName().isNull())) { throw TypeMismatchException(); } // Add the property: _properties.append(x);}void CIMClassRep::addMethod(const CIMMethod& x){ if (x.isUninitialized()) throw UninitializedObjectException(); // Reject duplicate method names: if (findMethod(x.getName()) != PEG_NOT_FOUND) { MessageLoaderParms parms( "Common.CIMClassRep.METHOD", "method \"$0\"", x.getName().getString()); throw AlreadyExistsException(parms); } // Add the method: _methods.append(x);}Uint32 CIMClassRep::findMethod(const CIMName& name) const{ for (Uint32 i = 0, n = _methods.size(); i < n; i++) { if (name.equal(_methods[i].getName())) return i; } return PEG_NOT_FOUND;}CIMMethod CIMClassRep::getMethod(Uint32 index){ if (index >= _methods.size()) throw IndexOutOfBoundsException(); return _methods[index];}Uint32 CIMClassRep::getMethodCount() const{ return _methods.size();}void CIMClassRep::removeMethod(Uint32 index){ if (index >= _methods.size()) throw IndexOutOfBoundsException(); _methods.remove(index);}void CIMClassRep::resolve( DeclContext* context, const CIMNamespaceName& nameSpace){ PEG_METHOD_ENTER(TRC_OBJECTRESOLUTION, "CIMClassRep::resolve()");#if 0 if (_resolved) throw ClassAlreadyResolved(_reference.getClassName());#endif if (!context) throw NullPointer(); PEG_TRACE_STRING(TRC_OBJECTRESOLUTION, Tracer::LEVEL3, String("CIMClassRep::resolve class = ") + _reference.getClassName().getString() + ", superclass = " + _superClassName.getString()); if (!_superClassName.isNull()) { //---------------------------------------------------------------------- // First check to see if the super-class really exists and the // subclassing legal: //---------------------------------------------------------------------- CIMConstClass superClass = context->lookupClass(nameSpace, _superClassName); if (superClass.isUninitialized()) throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_SUPERCLASS, _superClassName.getString());#if 0 if (!superClass._rep->_resolved) throw ClassNotResolved(_superClassName);#endif // If subclass is abstract but superclass not, throw CIM Exception /* ATTN:KS-24 Mar 2002 P1 - Test this and confirm that rule is correct if isAbstract() && !superclass.isAbstract() throw PEGASUS_CIM_EXCEPTION( CIM_ERR_INVALID_SUPERCLASS, _superClassName); */ /*if (superclass.isTrueQualifier(CIMQualifierNames::TERMINAL) throw PEGASUS_CIM_EXCEPTION( CIM_ERR_INVALID_SUPERCLASS, _superClassName); */ //---------------------------------------------------------------------- // Iterate all the properties of *this* class. Resolve each one and // set the class-origin: //---------------------------------------------------------------------- Boolean isAssociationClass = isAssociation(); for (Uint32 i = 0, n = _properties.size(); i < n; i++) { CIMProperty& property = _properties[i]; if (!isAssociationClass && property.getValue().getType() == CIMTYPE_REFERENCE) { throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_INVALID_PARAMETER, MessageLoaderParms( "Common.CIMClassRep.NON_ASSOCIATION_CLASS_CONTAINS_" "REFERENCE_PROPERTY", "Non-assocation class contains reference property")); } Uint32 index = superClass.findProperty(property.getName()); if (index == PEG_NOT_FOUND) { Resolver::resolveProperty( property, context, nameSpace, false, true); if (property.getClassOrigin().isNull()) { property.setClassOrigin(getClassName()); } property.setPropagated(false); } else { CIMConstProperty superClassProperty = superClass.getProperty(index); Resolver::resolveProperty(property, context, nameSpace, false, superClassProperty, true); if (property.getClassOrigin().isNull()) { property.setClassOrigin( superClassProperty.getClassOrigin()); } } } //---------------------------------------------------------------------- // Now prepend all properties inherited from the super-class (that // are not overriden by this sub-class). //---------------------------------------------------------------------- // Iterate super-class properties: for (Uint32 i = 0, m = 0, n = superClass.getPropertyCount(); i < n; i++) { CIMConstProperty superClassProperty = superClass.getProperty(i); // Find the property in *this* class; if not found, then clone and // insert it (setting the propagated flag). Otherwise, change // the class-origin and propagated flag accordingly. Uint32 index = PEG_NOT_FOUND; /* ATTN: KS move to simpler version of the find for (Uint32 j = m, n = _properties.size(); j < n; j++) { if (_properties[j].getName() == superClassProperty.getName()) { index = j; break; } } */ index = findProperty(superClassProperty.getName()); // If property exists in super class but not in this one, then // clone and insert it. Otherwise, the properties class // origin was set above. CIMProperty superproperty = superClassProperty.clone(); if (index == PEG_NOT_FOUND) { superproperty.setPropagated(true); _properties.insert(m++, superproperty); } else { // Property Qualifiers must propagate if allowed // If property exists in the superclass and in the subclass, // then, enumerate the qualifiers of the superclass's property. // If a qualifier is defined on the superclass's property // but not on the subclass's, then add it to the subclass's // property's qualifier list. CIMProperty subproperty = _properties[index]; for (Uint32 i = 0, n = superproperty.getQualifierCount(); i < n; i++) { Uint32 index = PEG_NOT_FOUND; CIMQualifier superClassQualifier = superproperty.getQualifier(i); const CIMName name = superClassQualifier.getName(); /* ATTN KS This is replacement find function. if (Uint32 j = subproperty.findQualifier(q.getName()) == PEG_NOT_FOUND) { subproperty.addQualifier(superClassQualifier); } */ for (Uint32 j = 0, m = subproperty.getQualifierCount(); j < m; j++) { CIMConstQualifier q = subproperty.getQualifier(j); if (name.equal(q.getName())) { index = j; break; } } // end comparison of subclass property's qualifiers if (index == PEG_NOT_FOUND) { subproperty.addQualifier(superClassQualifier); } /* if ((index = subproperty.findQualifier(name)) == PEG_NOT_FOUND) { subproperty.addQualifier(superClassQualifier); } */ } // end iteration over superclass property's qualifiers } } //---------------------------------------------------------------------- // Iterate all the methods of *this* class. Resolve each one and // set the class-origin: //----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -