Author: ajborley
Date: Tue Sep 26 08:06:12 2006
New Revision: 450075

URL: http://svn.apache.org/viewvc?view=rev&rev=450075
Log:
Added compareDataObjects and compareProperties utility methods

Modified:
    incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.cpp
    incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.h

Modified: incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.cpp?view=diff&rev=450075&r1=450074&r2=450075
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.cpp 
(original)
+++ incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.cpp Tue 
Sep 26 08:06:12 2006
@@ -109,6 +109,242 @@
                 cout << "  ";
             }            
         }        
+
+        const bool Utils::compareProperties(DataObjectPtr dataObject1, const 
Property& prop1, DataObjectPtr dataObject2, const Property& prop2, string& diff)
+        {            
+            if(strcmp(prop1.getName(),prop2.getName()) != 0)
+            {
+                diff.append("Differing names for Properties:\n");
+                diff.append(prop1.getName());
+                diff.append("\n");
+                diff.append(prop2.getName());                        
+                return false;
+            }
+
+            const Type& propertyType1 = prop1.getType();
+            const Type& propertyType2 = prop2.getType();
+
+            if(strcmp(propertyType1.getName(), propertyType2.getName()) != 0 ||
+               strcmp(propertyType1.getURI(),propertyType2.getURI()) != 0 )
+            {
+                diff.append("Differing types for Properties:\n");
+                diff.append(propertyType1.getName());
+                diff.append("#");
+                diff.append(propertyType1.getURI());
+                diff.append("\n");
+                diff.append(propertyType2.getName());
+                diff.append("#");
+                diff.append(propertyType2.getURI());
+                return false;
+            }
+            if (dataObject1->isSet(prop1) != dataObject2->isSet(prop2))
+            {
+                diff.append("Property ");
+                diff.append(prop1.getName());
+                diff.append(" is set on one DataObject but not the other"); 
+                return false;
+            }
+                                
+            if (dataObject1->isSet(prop1))
+            {
+                
+                if (prop1.isMany() != prop2.isMany())
+                {
+                    diff.append("Property ");
+                    diff.append(prop1.getName());
+                    diff.append(" is many on one DataObject but not the 
other"); 
+                    return false;
+                }
+                if (propertyType1.isDataType() != propertyType2.isDataType())
+                {
+                    diff.append("Property ");
+                    diff.append(prop1.getName());
+                    diff.append(" is dataType on one DataObject but not the 
other"); 
+                    return false;
+                }
+
+                
//////////////////////////////////////////////////////////////////////
+                // For a many-valued property get the list of values
+                
//////////////////////////////////////////////////////////////////////
+                if (prop1.isMany())
+                {
+                    DataObjectList& dol1 = dataObject1->getList(prop1);
+                    DataObjectList& dol2 = dataObject2->getList(prop2);
+                    if (dol1.size() != dol2.size())
+                    {
+                        diff.append("Property ");
+                        diff.append(prop1.getName());
+                        diff.append(" is many but has differing number of 
elements"); 
+                        return false;
+                    }
+
+                    for (int j = 0; j <dol1.size(); j++)
+                    {                               
+
+                        if (propertyType1.isDataType())
+                        {
+                            if( strcmp(dol1.getCString(j), dol2.getCString(j)) 
!= 0)
+                            {
+                                diff.append("Differing value for Property ");
+                                diff.append(prop1.getName());
+                                diff.append("[");                              
 
+                                diff += ((int)j);
+                                diff.append("]:\n");
+                                diff.append(dol1.getCString(j));
+                                diff.append("\n");
+                                diff.append(dol2.getCString(j));
+                                return false;
+                            }
+                        }
+                        else
+                        {
+                            if(!compareDataObjects(dol1[j], dol2[j], diff))
+                            {
+                                return false;
+                            }
+                        }
+                    }
+                } // end IsMany
+                
+                
+                
//////////////////////////////////////////////////////////////////////
+                // For a primitive data type compare the values
+                
//////////////////////////////////////////////////////////////////////
+                else if (propertyType1.isDataType())
+                {
+                    if( strcmp(dataObject1->getCString(prop1), 
dataObject2->getCString(prop2)) != 0)
+                    {
+                        diff.append("Differing value for Property ");
+                        diff.append(prop1.getName());
+                        diff.append(":\n");
+                        diff.append(dataObject1->getCString(prop1));
+                        diff.append("\n");
+                        diff.append(dataObject2->getCString(prop2));
+                        return false;
+                    }
+                }
+                
+                
//////////////////////////////////////////////////////////////////////
+                // For a dataobject compare the DOs
+                
//////////////////////////////////////////////////////////////////////
+                else
+                {
+                    if(!compareDataObjects(dataObject1->getDataObject(prop1), 
dataObject2->getDataObject(prop2), diff))
+                    {
+                        return false;
+                    }
+                }
+            }                    
+            return true;
+        }
+
+        const bool Utils::compareDataObjects(DataObjectPtr dataObject1, 
DataObjectPtr dataObject2, string& diff)
+        {
+            if (!dataObject1 || !dataObject2)
+            {
+                diff.append("Cannot compare null DataObjects");
+                return false;
+            }
+
+            const Type& dataObject1Type = dataObject1->getType();
+            const Type& dataObject2Type = dataObject2->getType();
+
+            if( strcmp(dataObject1Type.getURI(), dataObject2Type.getURI()) != 
0 ||
+                strcmp(dataObject1Type.getName(), dataObject2Type.getName()) 
!= 0 )
+            {
+                diff.append("DataObject Types differ:\n");
+                diff.append(dataObject1Type.getURI());
+                diff.append("#");
+                diff.append(dataObject1Type.getName());
+                diff.append("\n");
+                diff.append(dataObject2Type.getURI());
+                diff.append("#");
+                diff.append(dataObject2Type.getName());
+                return false;
+            }
+            
+            
//////////////////////////////////////////////////////////////////////////
+            // Iterate over all the properties
+            
//////////////////////////////////////////////////////////////////////////
+            PropertyList pl1 = dataObject1->getInstanceProperties();
+            PropertyList pl2 = dataObject2->getInstanceProperties();
+            if (pl1.size() != pl2.size())
+            {
+                diff.append("Differing number of properties");
+                return false;
+            }
+
+            if (pl1.size() != 0)
+            {
+                for (int i = 0; i < pl1.size(); i++)
+                {
+                    if(!compareProperties(dataObject1, pl1[i], dataObject2, 
pl2[i], diff))
+                    {
+                        return false;
+                    }
+                }
+            }
+            else
+            {
+                if(dataObject1->getType().isOpenType() != 
dataObject2->getType().isOpenType() && 
+                   dataObject1->getType().isDataObjectType() != 
dataObject2->getType().isDataObjectType())
+                {
+                    diff.append("DataObject is open & DO type on one but not 
the other"); 
+                    return false;
+                }
+
+                // Compare elements under an open DataObject 
+                if(dataObject1->getType().isOpenType() && 
dataObject1->getType().isDataObjectType())
+                {
+                    SequencePtr sequence1 = dataObject1->getSequence();
+                    SequencePtr sequence2 = dataObject2->getSequence();
+
+                    if (sequence1 != NULL && sequence2 != NULL)
+                    {
+                        if (sequence1->size() != sequence1->size())
+                        {
+                            diff.append("Open DataObjects have differing 
number of elements"); 
+                            return false;
+                        }
+
+                        for (int i = 0; i < sequence1->size(); i++)
+                        {
+                            if (sequence1->isText(i) != sequence2->isText(i))
+                            {
+                                diff.append("Open DataObjects have differing 
element types at position "); 
+                                diff += ((int) i);
+                                return false;
+                            }
+                            if (sequence1->isText(i))
+                            {                                
+                                if( strcmp(sequence1->getCStringValue(i), 
sequence2->getCStringValue(i)) != 0)
+                                {
+                                    diff.append("Differing value for element 
at position ");
+                                    diff += ((int) i);
+                                    diff.append(":\n");
+                                    diff.append(sequence1->getCStringValue(i));
+                                    diff.append("\n");
+                                    diff.append(sequence2->getCStringValue(i));
+                                    return false;
+                                }
+                            }
+                            else 
+                            {
+                                const Property& p1 = sequence1->getProperty(i);
+                                const Property& p2 = sequence2->getProperty(i);
+
+                                if(!compareProperties(dataObject1, p1, 
dataObject2, p2, diff))
+                                {
+                                    return false;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            return true;
+        }
     
         void Utils::printDO(DataObjectPtr dataObject, int increment)
         {

Modified: incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.h
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.h?view=diff&rev=450075&r1=450074&r2=450075
==============================================================================
--- incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.h 
(original)
+++ incubator/tuscany/cpp/sca/runtime/core/src/tuscany/sca/util/Utils.h Tue Sep 
26 08:06:12 2006
@@ -54,7 +54,10 @@
             static void printDO(commonj::sdo::DataObjectPtr dataObject, int 
increment=0);
             static void printTypes(commonj::sdo::DataFactoryPtr df);
             static void printType(const commonj::sdo::Type& type, int 
increment=0);
-            
+
+            static const bool compareDataObjects(commonj::sdo::DataObjectPtr 
dataObject1, commonj::sdo::DataObjectPtr dataObject2, string& diff);
+            static const bool compareProperties(commonj::sdo::DataObjectPtr 
dataObject1, const commonj::sdo::Property& prop1, commonj::sdo::DataObjectPtr 
dataObject2, const commonj::sdo::Property& prop2, string& diff);
+
         private:
             static void tabs(int increment=0);
         };



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to