BUG#: 7626
[tpot/pegasus/.git] / src / Pegasus / Common / CIMInstanceRep.cpp
index dab19a84375c7a21f0542c52757718990a3a7870..b4b01a562f5240df4f73d80bca9bb113769cb663 100644 (file)
@@ -1,42 +1,31 @@
-//%2005////////////////////////////////////////////////////////////////////////
+//%LICENSE////////////////////////////////////////////////////////////////
 //
-// 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.
+// Licensed to The Open Group (TOG) under one or more contributor license
+// agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
+// this work for additional information regarding copyright ownership.
+// Each contributor licenses this file to you under the OpenPegasus Open
+// Source License; you may not use this file except in compliance with the
+// License.
 //
-// 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.
+// 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.
 //
-// Author: Mike Brasher (mbrasher@bmc.com)
+// 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.
 //
-// Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
-//              Sushma Fernandes, Hewlett-Packard Company 
-//              (sushma_fernandes@hp.com)
-//              Carol Ann Krug Graves, Hewlett-Packard Company
-//                  (carolann_graves@hp.com)
-//              David Dillard, VERITAS Software Corp.
-//                  (david.dillard@veritas.com)
-//              Yi Zhou, Hewlett-Packard Company (yi.zhou@hp.com)
+//////////////////////////////////////////////////////////////////////////
 //
 //%/////////////////////////////////////////////////////////////////////////////
 
 #include "CIMScope.h"
 #include "DeclContext.h"
 #include "Resolver.h"
-#include "Indentor.h"
 #include "CIMName.h"
 #include "Constants.h"
-#include "XmlWriter.h"
-#include "MofWriter.h"
 #include "StrLit.h"
 
 PEGASUS_USING_STD;
@@ -76,49 +62,39 @@ void CIMInstanceRep::resolve(
 {
     // ATTN: Verify that references are initialized.
 
-#if 0
-    if (_resolved)
-       throw InstanceAlreadyResolved();
-#endif
-
     if (!context)
-       throw NullPointer();
+        throw NullPointer();
 
     //----------------------------------------------------------------------
     // First obtain the class:
     //----------------------------------------------------------------------
 
     CIMConstClass cimClass =
-       context->lookupClass(nameSpace, _reference.getClassName());
+        context->lookupClass(nameSpace, _reference.getClassName());
 
     if (cimClass.isUninitialized())
-       throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_CLASS, 
+        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_CLASS,
             _reference.getClassName().getString ());
 
     cimClassOut = cimClass;
 
-#if 0
-    if (!cimClass._rep->_resolved)
-       throw ClassNotResolved(_reference.getClassName());
-#endif
-
     //----------------------------------------------------------------------
     // Disallow instantiation of abstract classes.
     //----------------------------------------------------------------------
 
     if (cimClass.isAbstract())
-       throw InstantiatedAbstractClass(_reference.getClassName().getString ());
+        throw InstantiatedAbstractClass(_reference.getClassName().getString ());
 
     //----------------------------------------------------------------------
     // Validate and propagate qualifiers.
     //----------------------------------------------------------------------
     _qualifiers.resolve(
-       context,
-       nameSpace,
+        context,
+        nameSpace,
         (cimClass.isAssociation()) ? CIMScope::ASSOCIATION : CIMScope::CLASS,
-       false,
-       cimClass._rep->_qualifiers,
-       propagateQualifiers);
+        false,
+        cimClass._rep->_qualifiers,
+        propagateQualifiers);
 
     //----------------------------------------------------------------------
     // First iterate the properties of this instance and verify that
@@ -129,53 +105,53 @@ void CIMInstanceRep::resolve(
 
     for (Uint32 i = 0, n = _properties.size(); i < n; i++)
     {
-       CIMProperty& property = _properties[i];
+        CIMProperty& property = _properties[i];
 
-       Uint32 index = cimClass.findProperty(property.getName());
+        Uint32 index = cimClass.findProperty(property.getName());
 
-       if (index == PEG_NOT_FOUND)
+        if (index == PEG_NOT_FOUND)
         {
             //
             //  Allow addition of Creator property to Indication Subscription,
             //  Filter and Handler instances
             //
-// l10n add language property support           
-            if (!(((className.equal 
+// l10n add language property support
+            if (!(((className.equal
                     (CIMName (PEGASUS_CLASSNAME_INDSUBSCRIPTION))) ||
-                (className.equal 
+                (className.equal
                     (CIMName (PEGASUS_CLASSNAME_FORMATTEDINDSUBSCRIPTION))) ||
-                (className.equal 
+                (className.equal
                     (CIMName (PEGASUS_CLASSNAME_INDHANDLER_CIMXML))) ||
-                                                               (className.equal 
+                (className.equal
                     (CIMName (PEGASUS_CLASSNAME_LSTNRDST_CIMXML))) ||
-                (className.equal 
+                (className.equal
                     (CIMName (PEGASUS_CLASSNAME_INDHANDLER_SNMP))) ||
 #ifdef  PEGASUS_ENABLE_SYSTEM_LOG_HANDLER
-                (className.equal 
+                (className.equal
                     (CIMName (PEGASUS_CLASSNAME_LSTNRDST_SYSTEM_LOG))) ||
 #endif
 #ifdef  PEGASUS_ENABLE_EMAIL_HANDLER
-                (className.equal 
+                (className.equal
                     (CIMName (PEGASUS_CLASSNAME_LSTNRDST_EMAIL))) ||
 #endif
                 (className.equal (CIMName (PEGASUS_CLASSNAME_INDFILTER)))) &&
-                ((property.getName ().equal 
+                ((property.getName ().equal
                     (CIMName (PEGASUS_PROPERTYNAME_INDSUB_CREATOR))) ||
-                (property.getName ().equal 
+                (property.getName ().equal
                     (CIMName (PEGASUS_PROPERTYNAME_INDSUB_ACCEPTLANGS))) ||
-                (property.getName ().equal 
+                (property.getName ().equal
+                    (CIMName (PEGASUS_PROPERTYNAME_LSTNRDST_CREATIONTIME))) ||
+                (property.getName ().equal
                     (CIMName (PEGASUS_PROPERTYNAME_INDSUB_CONTENTLANGS))))))
             {
-               throw NoSuchProperty(property.getName().getString ());
+                throw NoSuchProperty(property.getName().getString ());
             }
         }
         else
         {
-           // resolve the property
-           Resolver::resolveProperty (property, context, nameSpace, true, 
+            // resolve the property
+            Resolver::resolveProperty (property, context, nameSpace, true,
                 cimClass.getProperty (index), propagateQualifiers);
-        // Ensure that the PROPAGATED attribute is false
-        property.setPropagated(false);
         }
     }
 
@@ -184,102 +160,52 @@ void CIMInstanceRep::resolve(
     // instance. Copy over the class-origin and set the propagated flag
     // to true. NOTE: The propagated flag indicates that the property
     // was not part of the property set input with the create and
-    // was inherited from the default in the class (see cimxml spec sect 3.1.5) 
+    // was inherited from the default in the class (see cimxml spec sect 3.1.5)
     //----------------------------------------------------------------------
 
     for (Uint32 i = 0, m = 0, n = cimClass.getPropertyCount(); i < n; i++)
     {
-       CIMConstProperty property = cimClass.getProperty(i);
-       const CIMName& name = property.getName();
-    
-       // See if this instance already contains a property with this name:
-    
-       Boolean found = false;
-    
-       for (Uint32 j = m, n = _properties.size(); j < n; j++)
-       {
-           if (name.equal(_properties[j].getName()))
-           {
-                       found = true;
-                       break;
-           }
-       }
-
-               if (!found)
-               {
-                       CIMProperty p = property.clone();
-                       p.setPropagated(true);
-                       _properties.insert(m++, p);
-               }
-    }
+        CIMConstProperty property = cimClass.getProperty(i);
+        const CIMName& name = property.getName();
 
-#if 0
-    _resolved = true;
-#endif
-}
-
-CIMInstanceRep::CIMInstanceRep()
-{
+        // See if this instance already contains a property with this name:
 
-}
+        Boolean found = false;
 
-CIMInstanceRep::CIMInstanceRep(const CIMInstanceRep& x) : CIMObjectRep(x)
-{
-
-}
-
-void CIMInstanceRep::toXml(Buffer& out) const
-{
-    // Class opening element:
-
-    out << STRLIT("<INSTANCE ");
-    out << STRLIT(" CLASSNAME=\"") << _reference.getClassName();
-    out << STRLIT("\" ");
-    out << STRLIT(">\n");
-
-    // Qualifiers:
-
-    _qualifiers.toXml(out);
-
-    // Parameters:
-
-    for (Uint32 i = 0, n = _properties.size(); i < n; i++)
-       XmlWriter::appendPropertyElement(out, _properties[i]);
-
-    // Class closing element:
+        for (Uint32 j = m, s = _properties.size(); j < s; j++)
+        {
+            if (name.equal(_properties[j].getName()))
+            {
+                found = true;
+                break;
+            }
+        }
 
-    out << STRLIT("</INSTANCE>\n");
+        if (!found)
+        {
+            CIMProperty p;
+            if (propagateQualifiers)
+            {
+                p = property.clone();
+            }
+            else
+            {
+                p = CIMProperty(
+                    property.getName(),
+                    property.getValue(),
+                    property.getArraySize(),
+                    property.getReferenceClassName(),
+                    property.getClassOrigin(),
+                    property.getPropagated());
+            }
+            p.setPropagated(true);
+            _properties.insert(m++, p);
+        }
+    }
 }
 
-void CIMInstanceRep::toMof(Buffer& out) const
+CIMInstanceRep::CIMInstanceRep(const CIMInstanceRep& x) : CIMObjectRep(x)
 {
-    // Get and format the class qualifiers
-    out << STRLIT("\n//Instance of Class ") << _reference.getClassName();
-    if (_qualifiers.getCount())
-       out.append('\n');
-    _qualifiers.toMof(out);
-
-    // Separate qualifiers from Class Name
-    out.append('\n');
-
-    // output class statement
-    out << STRLIT("instance of class ") << _reference.getClassName();
-
-    out << STRLIT("\n{");
-
-    // format the Properties:
-    for (Uint32 i = 0, n = _properties.size(); i < n; i++)
-    {
-       // 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]);
-    }
-
-    // Class closing element:
-    out << STRLIT("\n};\n");
 }
 
 CIMObjectPath CIMInstanceRep::buildPath(
@@ -299,7 +225,7 @@ CIMObjectPath CIMInstanceRep::buildPath(
     cimClass.getKeyNames(keyNames);
 
     if (keyNames.size() == 0)
-       return CIMObjectPath("", CIMNamespaceName(), className);
+        return CIMObjectPath("", CIMNamespaceName(), className);
 
     //--------------------------------------------------------------------------
     // Get type and value for each key (building up key bindings):
@@ -309,20 +235,16 @@ CIMObjectPath CIMInstanceRep::buildPath(
 
     for (Uint32 i = 0, n = keyNames.size(); i < n; i++)
     {
-       const CIMName& keyName = keyNames[i];
+        const CIMName& keyName = keyNames[i];
 
-       Uint32 index = findProperty(keyName);
+        Uint32 index = findProperty(keyName);
         if (index == PEG_NOT_FOUND)
         {
             throw NoSuchProperty(keyName.getString());
         }
 
-       CIMConstProperty tmp = getProperty(index);
-
-       if (keyName.equal(tmp.getName()))
-       {
-           keyBindings.append(CIMKeyBinding(keyName, tmp.getValue()));
-       }
+        CIMConstProperty tmp = getProperty(index);
+        keyBindings.append(CIMKeyBinding(keyName, tmp.getValue()));
     }
 
     return CIMObjectPath(String(), CIMNamespaceName(), className, keyBindings);
@@ -331,13 +253,15 @@ CIMObjectPath CIMInstanceRep::buildPath(
 // KS Mar 05 - The following removal functions are very inefficient and should
 // be optimized to avoid the multiple memory moves.  Actually, the remove
 // qualifiers should be added as a function and optimized that once.
-void CIMInstanceRep::filter(Boolean includeQualifiers, Boolean includeClassOrigin,
-                        const CIMPropertyList& propertyList)
+void CIMInstanceRep::filter(
+    Boolean includeQualifiers,
+    Boolean includeClassOrigin,
+    const CIMPropertyList& propertyList)
 {
     // Filter any qualifiers from this instance.
     if (!includeQualifiers && _qualifiers.getCount() > 0)
     {
-        while( _qualifiers.getCount() )
+        while (_qualifiers.getCount())
         {
             _qualifiers.removeQualifier(0);
         }
@@ -359,7 +283,7 @@ void CIMInstanceRep::filter(Boolean includeQualifiers, Boolean includeClassOrigi
             // remove qualifiers if required.
             if (!includeQualifiers && _properties[i].getQualifierCount() > 0)
             {
-                while( _properties[i].getQualifierCount() > 0 )
+                while (_properties[i].getQualifierCount() > 0)
                 {
                     _properties[i].removeQualifier(0);
                 }