(file) Return to CIMClassRep.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/CIMClassRep.cpp between version 1.11 and 1.62

version 1.11, 2001/05/20 21:30:25 version 1.62, 2004/10/07 13:51:08
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%2003////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000 The Open Group, BMC Software, Tivoli Systems, IBM  // 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.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a  // Permission is hereby granted, free of charge, to any person obtaining a copy
 // copy of this software and associated documentation files (the "Software"),  // of this software and associated documentation files (the "Software"), to
 // to deal in the Software without restriction, including without limitation  // deal in the Software without restriction, including without limitation the
 // the rights to use, copy, modify, merge, publish, distribute, sublicense,  // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 // and/or sell copies of the Software, and to permit persons to whom the  // sell copies of the Software, and to permit persons to whom the Software is
 // Software is furnished to do so, subject to the following conditions:  // furnished to do so, subject to the following conditions:
 // //
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER  // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 // DEALINGS IN THE SOFTWARE.  // 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.
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Mike Brasher (mbrasher@bmc.com) // Author: Mike Brasher (mbrasher@bmc.com)
 // //
 // Modified By:  // Modified By: Karl Schopmeyer(k.schopmeyer@attglobal.net)
   //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
   //              Carol Ann Krug Graves, Hewlett-Packard Company
   //                (carolann_graves@hp.com)
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include "CIMClass.h"  #include "CIMClassRep.h"
 #include "DeclContext.h" #include "DeclContext.h"
   #include "Resolver.h"
 #include "Indentor.h" #include "Indentor.h"
 #include "CIMName.h" #include "CIMName.h"
 #include "CIMQualifierNames.h" #include "CIMQualifierNames.h"
   #include "CIMScope.h"
 #include "XmlWriter.h" #include "XmlWriter.h"
   #include "MofWriter.h"
   #include <Pegasus/Common/Tracer.h>
   #include <Pegasus/Common/MessageLoader.h> //l10n
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
   PEGASUS_USING_STD;
  
 CIMClassRep::CIMClassRep( CIMClassRep::CIMClassRep(
     const String& className,      const CIMName& className,
     const String& superClassName)      const CIMName& superClassName)
     : _className(className), _superClassName(superClassName), _resolved(false)      :
       CIMObjectRep(CIMObjectPath(String(), CIMNamespaceName(), className)),
       _superClassName(superClassName)
 { {
     if (!CIMName::legal(className))  
         throw IllegalName();  
   
     if (superClassName.size() && !CIMName::legal(superClassName))  
         throw IllegalName();  
 } }
  
 CIMClassRep::~CIMClassRep() CIMClassRep::~CIMClassRep()
 { {
   
 } }
  
 Boolean CIMClassRep::isAssociation() const Boolean CIMClassRep::isAssociation() const
 { {
     Uint32 pos = findQualifier(CIMQualifierNames::ASSOCIATION);      Uint32 index = findQualifier(CIMQualifierNames::ASSOCIATION);
  
     if (pos == Uint32(-1))      if (index == PEG_NOT_FOUND)
         return false;         return false;
  
     Boolean flag;     Boolean flag;
  
     const CIMValue& value = getQualifier(pos).getValue();      const CIMValue& value = getQualifier(index).getValue();
  
     if (value.getType() != CIMType::BOOLEAN)      if (value.getType() != CIMTYPE_BOOLEAN)
         return false;         return false;
  
     value.get(flag);     value.get(flag);
Line 71 
Line 80 
  
 Boolean CIMClassRep::isAbstract() const Boolean CIMClassRep::isAbstract() const
 { {
     Uint32 pos = findQualifier(CIMQualifierNames::ABSTRACT);      Uint32 index = findQualifier(CIMQualifierNames::ABSTRACT);
  
     if (pos == Uint32(-1))      if (index == PEG_NOT_FOUND)
         return false;         return false;
  
     Boolean flag;     Boolean flag;
     const CIMValue& value = getQualifier(pos).getValue();      const CIMValue& value = getQualifier(index).getValue();
  
     if (value.getType() != CIMType::BOOLEAN)      if (value.getType() != CIMTYPE_BOOLEAN)
         return false;         return false;
  
     value.get(flag);     value.get(flag);
     return flag;     return flag;
 } }
   void CIMClassRep::setSuperClassName(const CIMName& superClassName)
 void CIMClassRep::setSuperClassName(const String& superClassName)  
 { {
     if (!CIMName::legal(superClassName))  
         throw IllegalName();  
   
     _superClassName = superClassName;     _superClassName = superClassName;
 } }
  
 void CIMClassRep::addProperty(const CIMProperty& x) void CIMClassRep::addProperty(const CIMProperty& x)
 { {
     if (!x)      if (x.isUninitialized())
         throw UnitializedHandle();          throw UninitializedObjectException();
  
     // Reject addition of duplicate property name:     // Reject addition of duplicate property name:
  
     if (findProperty(x.getName()) != Uint32(-1))      if (findProperty(x.getName()) != PEG_NOT_FOUND){
         throw AlreadyExists();          //l10n
                   //throw AlreadyExistsException
     // Reject addition of references to non-associations:              //("property \"" + x.getName().getString () + "\"");
           MessageLoaderParms parms("Common.CIMClassRep.PROPERTY",
     if (!isAssociation() && x.getValue().getType() == CIMType::REFERENCE)                                                           "property \"$0\"",
         throw AddedReferenceToClass(_className);                                                           x.getName().getString());
           throw AlreadyExistsException(parms);
     // Set the class origin:  
     // ATTN: put this check in other places:  
  
     if (x.getClassOrigin().size() == 0)  
         CIMProperty(x).setClassOrigin(_className);  
   
     // Add the property:  
   
     _properties.append(x);  
 } }
  
 void CIMClassRep::removeProperty(Uint32 pos)      // Reject addition of a reference property without a referenceClassName
 {  
     if (pos >= _properties.size())  
         throw OutOfBounds();  
  
     _properties.remove(pos);      if ((x.getType() == CIMTYPE_REFERENCE) &&
 }          (x.getReferenceClassName().isNull()))
   
 Uint32 CIMClassRep::findProperty(const String& name)  
 {  
     for (Uint32 i = 0, n = _properties.size(); i < n; i++)  
     {     {
         if (CIMName::equal(_properties[i].getName(), name))          throw TypeMismatchException();
             return i;  
     }  
   
     return Uint32(-1);  
 } }
  
 Boolean CIMClassRep::existsProperty(const String& name)      // Set the class origin:
 {      // ATTN: put this check in other places:
     return (findProperty(name) != Uint32(-1)) ?  
                     true : false;  
 }  
  
 CIMProperty CIMClassRep::getProperty(Uint32 pos)      if (x.getClassOrigin().isNull())
 {          CIMProperty(x).setClassOrigin(_reference.getClassName());
     if (pos >= _properties.size())  
         throw OutOfBounds();  
  
     return _properties[pos];      // Add the property:
 }  
  
 Uint32 CIMClassRep::getPropertyCount() const      _properties.append(x);
 {  
     return _properties.size();  
 } }
  
 void CIMClassRep::addMethod(const CIMMethod& x) void CIMClassRep::addMethod(const CIMMethod& x)
 { {
     if (!x)      if (x.isUninitialized())
         throw UnitializedHandle();          throw UninitializedObjectException();
  
     // Reject duplicate method names:     // Reject duplicate method names:
  
     if (findMethod(x.getName()) != Uint32(-1))      if (findMethod(x.getName()) != PEG_NOT_FOUND){
         throw AlreadyExists();          //l10n
                   //throw AlreadyExistsException
               //("method \"" + x.getName().getString() + "\"");
           MessageLoaderParms parms("Common.CIMClassRep.METHOD",
                                                            "method \"$0\"",
                                                            x.getName().getString());
           throw AlreadyExistsException(parms);
   
       }
  
     // Add the method:     // Add the method:
  
     _methods.append(x);     _methods.append(x);
 } }
  
 Uint32 CIMClassRep::findMethod(const String& name)  Uint32 CIMClassRep::findMethod(const CIMName& name) const
 { {
     for (Uint32 i = 0, n = _methods.size(); i < n; i++)     for (Uint32 i = 0, n = _methods.size(); i < n; i++)
     {     {
         if (CIMName::equal(_methods[i].getName(), name))          if (name.equal(_methods[i].getName()))
             return i;             return i;
     }     }
  
     return Uint32(-1);      return PEG_NOT_FOUND;
 } }
  
 Boolean CIMClassRep::existsMethod(const String& name)  CIMMethod CIMClassRep::getMethod(Uint32 index)
 { {
     return(findMethod(name) != Uint32(-1)) ?      if (index >= _methods.size())
                         true : false;          throw IndexOutOfBoundsException();
 }  
 CIMMethod CIMClassRep::getMethod(Uint32 pos)  
 {  
     if (pos >= _methods.size())  
         throw OutOfBounds();  
  
     return _methods[pos];      return _methods[index];
 } }
  
 Uint32 CIMClassRep::getMethodCount() const Uint32 CIMClassRep::getMethodCount() const
 { {
     return _methods.size();     return _methods.size();
 } }
 //ATTN: Ks 18 May  
 void CIMClassRep::removeMethod(Uint32 pos)  void CIMClassRep::removeMethod(Uint32 index)
 { {
     if (pos >= _methods.size())      if (index >= _methods.size())
         throw OutOfBounds();          throw IndexOutOfBoundsException();
  
     _methods.remove(pos);      _methods.remove(index);
 } }
  
 void CIMClassRep::resolve( void CIMClassRep::resolve(
     DeclContext* context,     DeclContext* context,
     const String& nameSpace)      const CIMNamespaceName& nameSpace)
 { {
           PEG_METHOD_ENTER(TRC_OBJECTRESOLUTION, "CIMClassRep::resolve()");
 #if 0 #if 0
     if (_resolved)     if (_resolved)
         throw ClassAlreadyResolved(_className);          throw ClassAlreadyResolved(_reference.getClassName());
 #endif #endif
   
     if (!context)     if (!context)
         throw NullPointer();         throw NullPointer();
  
     if (_superClassName.size())          PEG_TRACE_STRING(TRC_OBJECTRESOLUTION, Tracer::LEVEL3,
                   String("CIMClassRep::resolve  class = ") +
                   _reference.getClassName().getString() + ", superclass = " +
                   _superClassName.getString());
   
       if (!_superClassName.isNull())
     {     {
                   //cout << "KSTEST Class Resolve with Super class " << getClassName()
                   //<< " superClass " << _superClassName << endl;
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
         // First check to see if the super-class really exists:                  // First check to see if the super-class really exists and the subclassing legal:
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
   
         CIMConstClass superClass         CIMConstClass superClass
             = context->lookupClass(nameSpace, _superClassName);             = context->lookupClass(nameSpace, _superClassName);
  
         if (!superClass)                  if (superClass.isUninitialized())
             throw PEGASUS_CIM_EXCEPTION(INVALID_SUPERCLASS, _superClassName);                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_SUPERCLASS,
                             _superClassName.getString());
   
  
 #if 0 #if 0
         if (!superClass._rep->_resolved)         if (!superClass._rep->_resolved)
             throw ClassNotResolved(_superClassName);             throw ClassNotResolved(_superClassName);
 #endif #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         // Iterate all the properties of *this* class. Resolve each one and
         // set the class-origin:         // set the class-origin:
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
  
                   Boolean isAssociationClass = isAssociation();
   
         for (Uint32 i = 0, n = _properties.size(); i < n; i++)         for (Uint32 i = 0, n = _properties.size(); i < n; i++)
         {         {
             CIMProperty& property = _properties[i];             CIMProperty& property = _properties[i];
             Uint32 pos = superClass.findProperty(property.getName());  
  
             if (pos == Uint32(-1))              if(property.getValue().getType() == CIMTYPE_REFERENCE)
               {
                           if (!isAssociationClass)
                           {
                                   //l10n
                               //throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
                                   //"Non-assocation class contains reference property");
                               throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_INVALID_PARAMETER,
                                                   MessageLoaderParms("Common.CIMClassRep.NON_ASSOCIATION_CLASS_CONTAINS_REFERENCE_PROPERTY",
                                                                                      "Non-assocation class contains reference property"));
   
                           }
                           if(property.getReferenceClassName().isNull())
             {             {
                 property.resolve(context, nameSpace, false);                              throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_INVALID_PARAMETER,
                                   MessageLoaderParms("Common.CIMClassRep.REFERENCE_PROPERTY_MISSING_REFERENCE_CLASS_NAME",
                                                                                      "Reference Property for CIMClass Definition missing ReferenceClass Name"));
                           }
               }
   
   
                           Uint32 index = superClass.findProperty(property.getName());
   
                           if (index == PEG_NOT_FOUND)
                           {
                               Resolver::resolveProperty (property, context,
                                   nameSpace, false, true);
             }             }
             else             else
             {             {
                 CIMConstProperty superClassProperty = superClass.getProperty(pos);                                  CIMConstProperty superClassProperty =
                 property.resolve(context, nameSpace, false, superClassProperty);                                  superClass.getProperty(index);
                               Resolver::resolveProperty (property, context,
                                   nameSpace, false, superClassProperty, true);
             }             }
         }         }
  
Line 275 
Line 299 
             // insert it (setting the propagated flag). Otherwise, change             // insert it (setting the propagated flag). Otherwise, change
             // the class-origin and propagated flag accordingly.             // the class-origin and propagated flag accordingly.
  
             Uint32 pos = Uint32(-1);                          Uint32 index = PEG_NOT_FOUND;
                           /*       ATTN: KS move to simpler version of the find
             for (Uint32 j = m, n = _properties.size(); j < n; j++)             for (Uint32 j = m, n = _properties.size(); j < n; j++)
             {             {
                 if (CIMName::equal(                                  if (CIMName::equal(_properties[j].getName(),
                     _properties[j].getName(),  
                     superClassProperty.getName()))                     superClassProperty.getName()))
                 {                 {
                     pos = j;                                          index = j;
                     break;                     break;
                 }                 }
             }             }
                           */
                           index = findProperty(superClassProperty.getName());
  
             // If property exists in super class but not in this one, then             // If property exists in super class but not in this one, then
             // clone and insert it. Otherwise, the properties class             // clone and insert it. Otherwise, the properties class
             // origin was set above.             // origin was set above.
  
             if (pos == Uint32(-1))                          CIMProperty superproperty = superClassProperty.clone();
   
                           if (index == PEG_NOT_FOUND)
             {             {
                 CIMProperty property = superClassProperty.clone();                                  superproperty.setPropagated(true);
                 property.setPropagated(true);                                  _properties.insert(m++, superproperty);
                 _properties.insert(m++, property);                          }
                           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
             }             }
         }         }
  
Line 308 
Line 380 
         for (Uint32 i = 0, n = _methods.size(); i < n; i++)         for (Uint32 i = 0, n = _methods.size(); i < n; i++)
         {         {
             CIMMethod& method = _methods[i];             CIMMethod& method = _methods[i];
             Uint32 pos = superClass.findMethod(method.getName());                          Uint32 index = superClass.findMethod(method.getName());
  
             if (pos == Uint32(-1))                          if (index == PEG_NOT_FOUND)
             {             {
                 method.resolve(context, nameSpace);                              Resolver::resolveMethod (method, context,
                                   nameSpace);
             }             }
             else             else
             {             {
                 CIMConstMethod superClassMethod = superClass.getMethod(pos);                                  CIMConstMethod superClassMethod = superClass.getMethod(index);
                 method.resolve(context, nameSpace, superClassMethod);                              Resolver::resolveMethod (method, context,
                                   nameSpace, superClassMethod);
             }             }
         }         }
  
Line 334 
Line 408 
             // insert it (setting the propagated flag). Otherwise, change             // insert it (setting the propagated flag). Otherwise, change
             // the class-origin and propagated flag accordingly.             // the class-origin and propagated flag accordingly.
  
             Uint32 pos = Uint32(-1);                          Uint32 index = PEG_NOT_FOUND;
                           /**********************  KS move to simpler version
             for (Uint32 j = m, n = _methods.size(); j < n; j++)             for (Uint32 j = m, n = _methods.size(); j < n; j++)
             {             {
                 if (CIMName::equal(                                  if (CIMName::equal(_methods[j].getName(),
                     _methods[j].getName(),  
                     superClassMethod.getName()))                     superClassMethod.getName()))
                 {                 {
                     pos = j;                                          index = j;
                     break;                     break;
                 }                 }
             }             }
Line 351 
Line 424 
             // clone and insert it. Otherwise, the method's class origin             // clone and insert it. Otherwise, the method's class origin
             // has already been set above.             // has already been set above.
  
             if (pos == Uint32(-1))                          if (index == PEG_NOT_FOUND)
                           {
                                   CIMMethod method = superClassMethod.clone();
                                   method.setPropagated(true);
                                   _methods.insert(m++, method);
                           }
                           */
                           if((index = findMethod(superClassMethod.getName())) == PEG_NOT_FOUND)
             {             {
                 CIMMethod method = superClassMethod.clone();                 CIMMethod method = superClassMethod.clone();
                 method.setPropagated(true);                 method.setPropagated(true);
Line 362 
Line 442 
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
         // Validate the qualifiers of this class:         // Validate the qualifiers of this class:
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
                   //cout << "KSTEST Class Qualifiers resolve for class" << getClassName() << endl;
         _qualifiers.resolve(         _qualifiers.resolve(
             context,             context,
             nameSpace,             nameSpace,
             isAssociation() ? CIMScope::ASSOCIATION : CIMScope::CLASS,             isAssociation() ? CIMScope::ASSOCIATION : CIMScope::CLASS,
             false,             false,
             superClass._rep->_qualifiers);                          superClass._rep->_qualifiers,
                           true);
     }     }
     else      else        // No SuperClass exsts
     {     {
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
         // Resolve each property:         // Resolve each property:
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
                   //cout << "KSTEST Class Resolve, No Super class " << getClassName() << endl;
  
         for (Uint32 i = 0, n = _properties.size(); i < n; i++)         for (Uint32 i = 0, n = _properties.size(); i < n; i++)
             _properties[i].resolve(context, nameSpace, false);                      Resolver::resolveProperty (_properties[i], context,
                           nameSpace, false, true);
  
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
         // Resolve each method:         // Resolve each method:
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
  
         for (Uint32 i = 0, n = _methods.size(); i < n; i++)         for (Uint32 i = 0, n = _methods.size(); i < n; i++)
             _methods[i].resolve(context, nameSpace);                      Resolver::resolveMethod (_methods[i], context, nameSpace);
  
         //----------------------------------------------------------------------         //----------------------------------------------------------------------
         // Resolve the qualifiers:         // Resolve the qualifiers:
Line 397 
Line 480 
             nameSpace,             nameSpace,
             isAssociation() ? CIMScope::ASSOCIATION : CIMScope::CLASS,             isAssociation() ? CIMScope::ASSOCIATION : CIMScope::CLASS,
             false,             false,
             dummy);                          dummy,
                           true);
     }     }
  
     // _resolved = true;     // _resolved = true;
 } }
  
   CIMInstance CIMClassRep::buildInstance(Boolean includeQualifiers,
       Boolean includeClassOrigin,
       const CIMPropertyList& propertyList) const
   {
   
       // Create the new instance
       CIMInstance newInstance(_reference.getClassName());
   
       // Copy qualifiers if required
       if (includeQualifiers)
       {
           for (Uint32 i = 0 ; i < getQualifierCount() ; i++)
           {
               newInstance.addQualifier(getQualifier(i).clone());
           }
       }
   
       // Copy Properties
       for (Uint32 i = 0 ; i < _properties.size() ; i++)
       {
           CIMConstProperty p = getProperty(i);
           CIMName name = p.getName();
           Array<CIMName> pl = propertyList.getPropertyNameArray();
           if (propertyList.isNull() || Contains(pl, name))
           {
               CIMProperty p = getProperty(i).clone();
               if (!includeQualifiers && p.getQualifierCount() != 0)
               {
                   for (Uint32 j = 0 ; j < getQualifierCount() ; j++)
                   {
                       p.removeQualifier(i - 1);
                   }
               }
               if (!includeClassOrigin)
               {
                   p.setClassOrigin(CIMName());
               }
               newInstance.addProperty(p);
   
               // Delete class origin attribute if required
           }
       }
   
       return(newInstance);
   }
   
 void CIMClassRep::toXml(Array<Sint8>& out) const void CIMClassRep::toXml(Array<Sint8>& out) const
 { {
     // Class opening element:     // Class opening element:
  
     out << "<CLASS ";     out << "<CLASS ";
     out << " NAME=\"" << _className << "\" ";      out << " NAME=\"" << _reference.getClassName() << "\" ";
  
     if (_superClassName.size())      if (!_superClassName.isNull())
         out << " SUPERCLASS=\"" << _superClassName << "\" ";         out << " SUPERCLASS=\"" << _superClassName << "\" ";
  
     out << ">\n";     out << ">\n";
Line 422 
Line 552 
     // Parameters:     // Parameters:
  
     for (Uint32 i = 0, n = _properties.size(); i < n; i++)     for (Uint32 i = 0, n = _properties.size(); i < n; i++)
         _properties[i].toXml(out);          XmlWriter::appendPropertyElement(out, _properties[i]);
  
     // Methods:     // Methods:
  
     for (Uint32 i = 0, n = _methods.size(); i < n; i++)     for (Uint32 i = 0, n = _methods.size(); i < n; i++)
         _methods[i].toXml(out);          XmlWriter::appendMethodElement(out, _methods[i]);
  
     // Class closing element:     // Class closing element:
  
     out << "</CLASS>\n";     out << "</CLASS>\n";
 } }
   /** toMof prepares an 8-bit string with the MOF for the class.
       The BNF for this is:
       <pre>
       classDeclaration    =    [ qualifierList ]
                                CLASS className [ alias ] [ superClass ]
                                "{" *classFeature "}" ";"
  
 void CIMClassRep::print(PEGASUS_STD(ostream) &os) const      superClass          =    :" className
 {  
     Array<Sint8> tmp;  
     toXml(tmp);  
     tmp.append('\0');  
     XmlWriter::indentedPrint(os, tmp.getData(), 4);  
     // cout << tmp.getData() << endl;  
 }  
  
 CIMClassRep::CIMClassRep()      classFeature        =    propertyDeclaration | methodDeclaration
 {  
  
 }  */
  
 CIMClassRep::CIMClassRep(const CIMClassRep& x) :  void CIMClassRep::toMof(Array<Sint8>& out) const
     Sharable(),  
     _className(x._className),  
     _superClassName(x._superClassName),  
     _resolved(x._resolved)  
 { {
     x._qualifiers.cloneTo(_qualifiers);      // Get and format the class qualifiers
       out << "\n//    Class " << _reference.getClassName();
       if (_qualifiers.getCount())
           out << "\n";
       out << "\n";
       _qualifiers.toMof(out);
  
     _properties.reserve(x._properties.size());      // Separate qualifiers from Class Name
       out << "\n";
  
     for (Uint32 i = 0, n = x._properties.size(); i < n; i++)      // output class statement
         _properties.append(x._properties[i].clone());      out << "class " << _reference.getClassName();
  
     _methods.reserve(x._methods.size());      if (!_superClassName.isNull())
           out << " : " << _superClassName;
  
     for (Uint32 i = 0, n = x._methods.size(); i < n; i++)      out << "\n{";
         _methods.append(x._methods[i].clone());  
 }  
  
 CIMClassRep& CIMClassRep::operator=(const CIMClassRep& x)      // format the Properties:
       for (Uint32 i = 0, n = _properties.size(); i < n; i++)
 { {
     return *this;          // Generate MOF if this property not propagated
           // Note that the test is required only because
           // there is an error in getclass that does not
           // test the localOnly flag.
           if (!_properties[i].getPropagated())
               MofWriter::appendPropertyElement(out, _properties[i]);
 } }
  
 Boolean CIMClassRep::identical(const CIMClassRep* x) const      // Format the Methods:  for non-propagated methods
       for (Uint32 i = 0, n = _methods.size(); i < n; i++)
 { {
     if (_className != x->_className)          if (!_methods[i].getPropagated())
         return false;              MofWriter::appendMethodElement(out, _methods[i]);
       }
  
     if (_superClassName != x->_superClassName)      // Class closing element:
         return false;      out << "\n};\n";
   }
  
     if (!_qualifiers.identical(x->_qualifiers))  
         return false;  
  
     // Compare properties:  CIMClassRep::CIMClassRep()
   {
   }
  
   CIMClassRep::CIMClassRep(const CIMClassRep& x) :
       CIMObjectRep(x),
       _superClassName(x._superClassName)
     {     {
         const Array<CIMProperty>& tmp1 = _properties;      _methods.reserveCapacity(x._methods.size());
         const Array<CIMProperty>& tmp2 = x->_properties;  
  
         if (tmp1.size() != tmp2.size())      for (Uint32 i = 0, n = x._methods.size(); i < n; i++)
             return false;          _methods.append(x._methods[i].clone());
   }
  
         for (Uint32 i = 0, n = tmp1.size(); i < n; i++)  Boolean CIMClassRep::identical(const CIMObjectRep* x) const
         {         {
             if (!tmp1[i].identical(tmp2[i]))      if (!CIMObjectRep::identical(x))
           return false;
   
       const CIMClassRep* tmprep = dynamic_cast<const CIMClassRep*>(x);
       if (!tmprep)
                 return false;                 return false;
         }  
     }  
  
     // Compare methods:      if (!_superClassName.equal (tmprep->_superClassName))
           return false;
   
       //
       // Check methods:
       //
  
     {     {
         const Array<CIMMethod>& tmp1 = _methods;         const Array<CIMMethod>& tmp1 = _methods;
         const Array<CIMMethod>& tmp2 = x->_methods;          const Array<CIMMethod>& tmp2 = tmprep->_methods;
  
         if (tmp1.size() != tmp2.size())         if (tmp1.size() != tmp2.size())
             return false;             return false;
Line 513 
Line 661 
             if (!tmp1[i].identical(tmp2[i]))             if (!tmp1[i].identical(tmp2[i]))
                 return false;                 return false;
  
             if (tmp1[i].getClassOrigin() != tmp2[i].getClassOrigin())              if (!tmp1[i].getClassOrigin().equal (tmp2[i].getClassOrigin()))
                 return false;                 return false;
  
             if (tmp1[i].getPropagated() != tmp2[i].getPropagated())             if (tmp1[i].getPropagated() != tmp2[i].getPropagated())
Line 521 
Line 669 
         }         }
     }     }
  
     if (_resolved != x->_resolved)      if (_resolved != tmprep->_resolved)
         return false;         return false;
  
     return true;     return true;
 } }
  
 void CIMClassRep::getKeyNames(Array<String>& keyNames) const  void CIMClassRep::getKeyNames(Array<CIMName>& keyNames) const
 { {
     keyNames.clear();     keyNames.clear();
  
Line 535 
Line 683 
     {     {
         CIMConstProperty property = getProperty(i);         CIMConstProperty property = getProperty(i);
  
         if (property.isKey())          Uint32 index;
           if ((index = property.findQualifier (CIMName ("key"))) != PEG_NOT_FOUND)
           {
               CIMValue value;
               value = property.getQualifier (index).getValue ();
               if (!value.isNull ())
               {
                   Boolean isKey;
                   value.get (isKey);
                   if (isKey)
             keyNames.append(property.getName());             keyNames.append(property.getName());
     }     }
 } }
       }
   }
   
   Boolean CIMClassRep::hasKeys() const
   {
       for (Uint32 i = 0, n = getPropertyCount(); i < n; i++)
       {
           CIMConstProperty property = getProperty(i);
   
           Uint32 index;
           if ((index = property.findQualifier (CIMName ("key"))) != PEG_NOT_FOUND)
           {
               CIMValue value;
               value = property.getQualifier (index).getValue ();
               if (!value.isNull ())
               {
                   Boolean isKey;
                   value.get (isKey);
                   if (isKey)
                       return true;
               }
           }
       }
   
       return false;
   }
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END
   


Legend:
Removed from v.1.11  
changed lines
  Added in v.1.62

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2