Author: robbinspg
Date: Wed Dec  6 02:23:28 2006
New Revision: 483011

URL: http://svn.apache.org/viewvc?view=rev&rev=483011
Log:
TUSCANY-950 Copy non-containment references

Modified:
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.h
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp
    
incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp
    incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp
    incubator/tuscany/cpp/sdo/runtime/core/test/sdotest.cpp
    incubator/tuscany/cpp/sdo/runtime/core/test/sdotest2.cpp

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp 
(original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.cpp Wed 
Dec  6 02:23:28 2006
@@ -29,6 +29,8 @@
 
 #include "commonj/sdo/CopyHelper.h"
 
+#include <iostream>
+using namespace std;
 namespace commonj{
 namespace sdo{
 
@@ -262,7 +264,9 @@
      */
     DataObjectPtr CopyHelper::copy(DataObjectPtr dataObject)
     {
-        return internalCopy(dataObject, true);
+        DataObjectPtr newob = internalCopy(dataObject, true);
+        resolveReferences(dataObject, newob);
+        return newob;
     }
 
     DataObjectPtr CopyHelper::internalCopy(DataObjectPtr dataObject,
@@ -325,15 +329,10 @@
                                 if (seqProperty.isReference())
                                 {
                                     // add just the reference into the sequence
-                                    // doesn't seem to bother in the non 
sequenced
-                                    // code so need to check with SDO people 
-                                    // In the mean time I'll thrown and 
exception
-                                    // just in case we get here
-                                    std::string msg("Attempt to close 
sequenced data object which has non containment reference ");
-                                    msg += (const char *)seqPropertyName;
-                                    SDO_THROW_EXCEPTION("internalCopy", 
-                                                        
SDOUnsupportedOperationException,
-                                                        msg.c_str());
+                                    // This will be resolved to a new 
reference later
+                                    // This is really bad but we need to add 
something to the
+                                    // sequence here to maintain the ordering
+                                    toSequence->addDataObject(seqProperty, 0);
                                 }
                                 else
                                 {
@@ -378,15 +377,31 @@
                             {
                                 DataObjectList& dolold = 
dataObject->getList(pl[i]);
                                 DataObjectList& dolnew = newob->getList(pl[i]);
-                                for (unsigned int i=0;i< dolold.size(); i++)
-                                {
-                                    
dolnew.append(internalCopy(dolold[i],true));
+                                for (unsigned int li=0;li< dolold.size(); li++)
+                                {    
+                                    // references are maintained to the old 
object if it
+                                    // is outside of the copy tree
+                                    if (pl[i].isReference()) 
+                                    {
+                                        // have to resolve references in a 2nd 
pass
+                                    }
+                                    else
+                                    {
+                                        
dolnew.append(internalCopy(dolold[li],true));
+                                    }
                                 }
                             }
                             else 
                             {
                                 DataObjectPtr dob = 
dataObject->getDataObject(pl[i]);
-                                
newob->setDataObject(pl[i],internalCopy(dob,true));
+                                if (pl[i].isReference()) 
+                                {
+                                    // have to resolve references in a 2nd pass
+                                }
+                                else
+                                {
+                                    
newob->setDataObject(pl[i],internalCopy(dob,true));
+                                }
                             }
                         }
                     }
@@ -409,6 +424,131 @@
 
         return newob;
     }
+
+    void CopyHelper::resolveReferences(DataObjectPtr oldDO, DataObjectPtr 
newDO)
+    {
+        // Iterate through the properties to find references.
+        // If the reference is to a DataObject with the copied tree then we can
+        // set it to reference the DO in the new tree, otherwise it is left 
unset.
+
+        findReferences(oldDO, newDO, oldDO, newDO);
+
+    }
+
+    void CopyHelper::findReferences(DataObjectPtr oldDO, DataObjectPtr newDO,
+        DataObjectPtr obj, DataObjectPtr newObj)
+    {
+        if ( obj->getType().isSequencedType() )
+        {
+            Sequence* fromSequence = obj->getSequence();
+            int sequence_length = fromSequence->size();
+            
+            Sequence* toSequence = newObj->getSequence();
+            
+            for (int i=0;i < sequence_length; i++)
+            {
+                if (!fromSequence->isText(i) )
+                {
+                    const Property& seqProperty = 
fromSequence->getProperty(i); 
+                    SDOXMLString seqPropertyName = seqProperty.getName();
+                    const Type& seqPropertyType = seqProperty.getType();
+
+                    if (seqProperty.isReference())
+                    {  
+                        DataObjectPtr ref = findReference(oldDO, newDO, 
fromSequence->getDataObjectValue(i));
+                        if (ref)
+                        {
+                            if (seqProperty.isMany())
+                            {
+                                int index = fromSequence->getListIndex(i);
+                                
newObj->getList(seqProperty).setDataObject(index, ref);
+                            }
+                            else
+                            {
+                                toSequence->setDataObjectValue(i, ref);
+                            }
+
+                        }
+                    }
+                    else if (seqPropertyType.isDataObjectType())
+                    {
+                        findReferences(oldDO, newDO, 
fromSequence->getDataObjectValue(i), toSequence->getDataObjectValue(i));
+                    }
+                }
+ 
+             } // for all elements in sequence
+ 
+        }       
+        else
+        {
+            PropertyList pl = obj->getInstanceProperties();
+            for (unsigned int i=0;i < pl.size(); i++)
+            {
+                if (!obj->isSet(pl[i]))
+                    continue;
+
+                if (!pl[i].getType().isDataObjectType())
+                    continue;
+
+                if (pl[i].isMany())
+                {
+                    DataObjectList& dolold = obj->getList(pl[i]);
+                    DataObjectList& dolnew = newObj->getList(pl[i]);
+                    for (unsigned int li=0;li< dolold.size(); li++)
+                    {
+                        if (pl[i].isReference())
+                        {
+                            DataObjectPtr ref = findReference(oldDO, newDO, 
dolold[li]);
+                            if (ref)
+                            {
+                                dolnew.setDataObject(li, ref);
+                            }
+                        }
+                        else
+                        {
+                            findReferences(oldDO, newDO, dolold[li], 
dolnew[li]);
+                        }
+                    }
+                }
+                else 
+                {
+                    if (pl[i].isReference())
+                    {
+                        DataObjectPtr ref = findReference(oldDO, newDO,  
obj->getDataObject(pl[i]));
+                        if (ref)
+                        {
+                            newObj->setDataObject(pl[i], ref);
+                        }
+                    }
+                    else
+                    {
+                        findReferences(oldDO, newDO, 
obj->getDataObject(pl[i]), newObj->getDataObject(pl[i]));
+                    }
+                }
+            }
+        }
+    }
+
+    DataObjectPtr CopyHelper::findReference(DataObjectPtr oldDO, DataObjectPtr 
newDO, DataObjectPtr ref)
+    {
+        SDOString rootXPath = oldDO->objectToXPath();
+        SDOString refXPath = ref->objectToXPath();
+
+        DataObjectPtr newRef;
+        if (refXPath.find(refXPath) == 0)
+        {
+            SDOString relXPath = refXPath.substr(rootXPath.length());
+            if (relXPath == "")
+                newRef = newDO;
+            if (relXPath.find("/") == 0)
+                relXPath = relXPath.substr(1);
+            newRef = newDO->getDataObject(relXPath);
+        }
+
+        return newRef;
+    }
+
+
 }
 };
 

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.h
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.h?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.h 
(original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/CopyHelper.h Wed Dec 
 6 02:23:28 2006
@@ -65,6 +65,9 @@
     static void transfersequenceitem(Sequence *to, Sequence *from, const 
Property& p, int index);
 
     static DataObjectPtr internalCopy(DataObjectPtr dataObject, bool fullCopy);
+    static void resolveReferences(DataObjectPtr oldDO, DataObjectPtr newDO);
+    static void findReferences(DataObjectPtr oldDO, DataObjectPtr newDO, 
DataObjectPtr obj, DataObjectPtr newObj);
+    static DataObjectPtr findReference(DataObjectPtr oldDO, DataObjectPtr 
newDO, DataObjectPtr ref);
 
 };
 };

Modified: 
incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp 
(original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp 
Wed Dec  6 02:23:28 2006
@@ -98,7 +98,7 @@
         }
     }
 
-       rootElementName.erase();
+    rootElementName.erase();
 
 }
 
@@ -267,7 +267,7 @@
                                 bool isData,
                                 bool isFromList)
 {
-       addType(uri.c_str(), inTypeName.c_str(), isSeq, isOp, isAbs, isData, 
isFromList);
+    addType(uri.c_str(), inTypeName.c_str(), isSeq, isOp, isAbs, isData, 
isFromList);
 }
 
 // ===================================================================
@@ -724,7 +724,7 @@
 
 const Type& DataFactoryImpl::getType(const SDOString& uri, const SDOString& 
inTypeName) const
 {
-       return getType(uri.c_str(), inTypeName.c_str());
+    return getType(uri.c_str(), inTypeName.c_str());
 }
 
 // ===================================================================
@@ -778,16 +778,16 @@
 }
 
 void DataFactoryImpl::setBaseType(const SDOString& typeuri,
-                                                                 const 
SDOString& typenam,
-                                                                 const 
SDOString& baseuri,
-                                                                 const 
SDOString& basename,
-                                                                 bool 
isRestriction)
-{
-       setBaseType(typeuri.c_str(),
-               typenam.c_str(),
-               baseuri.c_str(),
-               basename.c_str(),
-               isRestriction);
+                                  const SDOString& typenam,
+                                  const SDOString& baseuri,
+                                  const SDOString& basename,
+                                  bool isRestriction)
+{
+    setBaseType(typeuri.c_str(),
+        typenam.c_str(),
+        baseuri.c_str(),
+        basename.c_str(),
+        isRestriction);
 }
 
 
@@ -1302,7 +1302,7 @@
                               const SDOString& typenam,
                               const SDOString& alias)
 {
-       setAlias(typeuri.c_str(), typenam.c_str(), alias.c_str());
+    setAlias(typeuri.c_str(), typenam.c_str(), alias.c_str());
 }
 
 // ===================================================================
@@ -1325,7 +1325,7 @@
                               const SDOString& propname,
                               const SDOString& alias)
 {
-       setAlias(typeuri.c_str(), typenam.c_str(), propname.c_str(), 
alias.c_str());
+    setAlias(typeuri.c_str(), typenam.c_str(), propname.c_str(), 
alias.c_str());
 }
 
 // ===================================================================
@@ -1682,6 +1682,8 @@
     {
         if (pl[i].getType().isDataObjectType())
         {
+            if (pl[i].isReference())
+                continue;
             if (!checkType(pl[i].getType())) return false;
         }
     }
@@ -2176,7 +2178,7 @@
 
 bool DataFactoryImpl::generateInterface(const SDOString& fileroot, const 
SDOString& factoryname)
 {
-       return generateInterface(fileroot.c_str(), factoryname.c_str());
+    return generateInterface(fileroot.c_str(), factoryname.c_str());
 }
     
     std::ostream& DataFactoryImpl::printSelf(std::ostream &os)

Modified: 
incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp 
(original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/DataObjectImpl.cpp 
Wed Dec  6 02:23:28 2006
@@ -944,7 +944,7 @@
 
     void DataObjectImpl::undefineProperty(unsigned int index)
     {
-               if (index < openBase) return;
+        if (index < openBase) return;
         unsigned int point = index - openBase;
         if (point >= openProperties.size()) return;
 
@@ -1592,32 +1592,32 @@
     }
 
    /**
-        * This method is used internally to find the index of a 
-        * property. If differs from the public getPropertyIndex method
-        * in that if the type of the containing object is open a new
-        * index is created. In the public version and error is thrown
-        */
+     * This method is used internally to find the index of a 
+     * property. If differs from the public getPropertyIndex method
+     * in that if the type of the containing object is open a new
+     * index is created. In the public version and error is thrown
+     */
     unsigned int DataObjectImpl::getPropertyIndexInternal(const Property& p)
     {
-               unsigned int index;
+        unsigned int index;
 
-               try 
-               {
+        try 
+        {
             index = getPropertyIndex(p);
-               }
-               catch ( SDOPropertyNotFoundException e )
-               {
-                       // this could mean that this data object has an open 
-                       // type. getPropertyIndex fails in this case because it
-                       // tries to access the index of the property 
-                       // and it doesn't exist because it hasn't been created 
yet. 
-                       // This new method is used where properties are being 
set
-                       // based on existing property objects. This is likely 
to 
-                       // occur when a data object is being copied. In this 
case
-                       // we want properties that are open to be copied also 
-                       // so we need to create the property and provide the 
index
-                       if ( this->getType().isOpenType() )
-                       {
+        }
+        catch ( SDOPropertyNotFoundException e )
+        {
+            // this could mean that this data object has an open 
+            // type. getPropertyIndex fails in this case because it
+            // tries to access the index of the property 
+            // and it doesn't exist because it hasn't been created yet. 
+            // This new method is used where properties are being set
+            // based on existing property objects. This is likely to 
+            // occur when a data object is being copied. In this case
+            // we want properties that are open to be copied also 
+            // so we need to create the property and provide the index
+            if ( this->getType().isOpenType() )
+            {
                 const Property *prop = NULL;
                 
                 // need to treat many valued properties specially
@@ -1629,19 +1629,19 @@
                 }
                 else
                 {
-                               prop = defineProperty(p.getName(), p.getType());
+                    prop = defineProperty(p.getName(), p.getType());
                 }
                 
                 index = getPropertyIndex(p);
-                       }
-                       else
-                       {
-                               throw e;
-                       }
-               }
+            }
+            else
+            {
+                throw e;
+            }
+        }
 
-               return index;
-       }
+        return index;
+    }
 
 
     const Property& DataObjectImpl::getProperty(unsigned int index)
@@ -2279,9 +2279,9 @@
                         DataObjectList& dol = d->getList((Property&)*p);
                         long idx;
                         DataObjectImpl* dx = d->findDataObject(prop,&idx);
-                                               // fix this. This is the only 
place the 2nd parm to findDataObject
-                                               // is used. Need a better way 
to do this
-                                               unsigned int index = (unsigned 
int)idx;
+                        // fix this. This is the only place the 2nd parm to 
findDataObject
+                        // is used. Need a better way to do this
+                        unsigned int index = (unsigned int)idx;
                         if (index >= 0)
                         {
                             if(index < dol.size())
@@ -2347,6 +2347,9 @@
             {
                  isData = true;
             }
+
+            if (pl[i].isReference())
+                continue;
 
             if (!d->isSet(pl[i]) || d->isNull(pl[i]))
             {

Modified: 
incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- 
incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp 
(original)
+++ 
incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOSchemaSAX2Parser.cpp 
Wed Dec  6 02:23:28 2006
@@ -540,8 +540,27 @@
                                 SDOSchemaSAX2Parser& schemaParser,
                                 SDOXMLString& schemaLocation)
         {
-            int i,j,k;
+            xmlChar* absoluteUri;
             SDOXMLString sl = getCurrentFile();
+                       /*
+                       * Build an absolute URL using the current file as the 
base and
+                       * the schemaLocation as the relative part, using the 
rules in
+                       * RFC 2396 5.2. Resolving Relative References to 
Absolute Form
+                       */
+                       try {
+                               absoluteUri = xmlBuildURI(schemaLocation, sl);
+                               if (-1 != schemaParser.parse((const 
char*)absoluteUri)) {
+                                       if (absoluteUri) xmlFree(absoluteUri);
+                                       return 1;
+                               }
+                       }
+                       catch (SDORuntimeException e)
+                       {
+                       }
+                       
+                       if (absoluteUri) xmlFree(absoluteUri);
+
+                       int i,j,k;
           
             i = sl.lastIndexOf('/');
             j = sl.lastIndexOf('\\');

Modified: incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp 
(original)
+++ incubator/tuscany/cpp/sdo/runtime/core/src/commonj/sdo/SDOUtils.cpp Wed Dec 
 6 02:23:28 2006
@@ -194,7 +194,15 @@
                             out << cc;
                             out << endl;
                             incr++;
-                            printDataObject(out, dol[j],incr);
+                            if (pl[i].isReference())
+                            {
+                                printTabs(out, incr);
+                                out << "Reference Value: " << 
dol[j]->objectToXPath() <<endl;
+                            }
+                            else
+                            {
+                                printDataObject(out, dol[j],incr);
+                            }
                             incr--;
                             out << endl;
                         }
@@ -217,7 +225,15 @@
                     else
                     {
                         incr++;
-                        printDataObject(out, 
dataObject->getDataObject(pl[i]),incr);
+                        if (pl[i].isReference())
+                        {
+                            printTabs(out, incr);
+                            out  << "Reference Value: " << 
dataObject->getDataObject(pl[i])->objectToXPath() <<endl;
+                        }
+                        else
+                        {
+                            printDataObject(out, 
dataObject->getDataObject(pl[i]),incr);
+                        }
                         incr--;
                     }
                 }

Modified: incubator/tuscany/cpp/sdo/runtime/core/test/sdotest.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/test/sdotest.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/test/sdotest.cpp (original)
+++ incubator/tuscany/cpp/sdo/runtime/core/test/sdotest.cpp Wed Dec  6 02:23:28 
2006
@@ -188,11 +188,13 @@
        DataObjectPtr project = root->createDataObject("project");
        project->setCString("id", "The TTP Project");
        DataObjectPtr str = project->createDataObject("string");
+       str->setDataObject("proj", project);
        str->setCString("value", "The Recursive Acronym Project");
        DataObjectPtr wp1 = project->createDataObject("packages");
        DataObjectPtr wp2 = project->createDataObject("packages");
        wp1->setCString("name", "Work Package 1");
        wp2->setCString("name", "Work Package 2");
+       project->setDataObject("wp", wp2);
        DataObjectPtr li1 = wp1->createDataObject("lineitems");
        DataObjectPtr li2 = wp1->createDataObject("lineitems");
        DataObjectPtr li3 = wp2->createDataObject("lineitems");
@@ -211,7 +213,6 @@
        str4->setCString("value", "String4");
 
        if (!transferto(root, dfp_right, false)) return 0;
-
        return 1;
     }
     catch (SDORuntimeException e)
@@ -9147,14 +9148,14 @@
       unsigned int j = 0;
       if ((i = myXSDHelper->getErrorCount()) > 0)
       {
-        cout << "XSD Loading reported some errors:" << endl;
-        for (j=0;j<i;j++)
-        {
-           const char *m = myXSDHelper->getErrorMessage(j);
-           if (m != 0) cout << m;
-           cout << endl;
-           return 0;
-        }
+     cout << "XSD Loading reported some errors:" << endl;
+     for (j=0;j<i;j++)
+     {
+        const char *m = myXSDHelper->getErrorMessage(j);
+        if (m != 0) cout << m;
+        cout << endl;
+        return 0;
+     }
       }
 
       /** 
@@ -9172,14 +9173,14 @@
        */
       if ((i = myXMLHelper->getErrorCount()) > 0)
       {
-        cout << "XML Loading reported some errors:" << endl;
-        for (j=0;j<i;j++)
-        {
-           const char *m = myXMLHelper->getErrorMessage(j);
-           if (m != 0) cout << m;
-           cout << endl;
-           return 0;
-        }
+     cout << "XML Loading reported some errors:" << endl;
+     for (j=0;j<i;j++)
+     {
+        const char *m = myXMLHelper->getErrorMessage(j);
+        if (m != 0) cout << m;
+        cout << endl;
+        return 0;
+     }
       }
 
       DataObjectPtr original = myXMLDocument->getRootDataObject();

Modified: incubator/tuscany/cpp/sdo/runtime/core/test/sdotest2.cpp
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/cpp/sdo/runtime/core/test/sdotest2.cpp?view=diff&rev=483011&r1=483010&r2=483011
==============================================================================
--- incubator/tuscany/cpp/sdo/runtime/core/test/sdotest2.cpp (original)
+++ incubator/tuscany/cpp/sdo/runtime/core/test/sdotest2.cpp Wed Dec  6 
02:23:28 2006
@@ -134,10 +134,15 @@
    dfp->addType("Namespace", "Root");
    dfp->addPropertyToType("Namespace","Root","project",
                          "Namespace","Project", false, false, true);
+ dfp->addPropertyToType("Namespace","Project","wp",
+                         "Namespace","WorkPackage", false, false, false);
 
    dfp->addPropertyToType("Namespace","StringHolder","value",
                          "commonj.sdo","String", false, false, false);
    
+   dfp->addPropertyToType("Namespace","StringHolder","proj",
+                         "Namespace","Project", false, false, false);
+
    dfp->addPropertyToType("Namespace","Project","id",
                          "commonj.sdo","String", false, false, false);
     
@@ -526,7 +531,7 @@
 
 
     unsigned int i,j;
-       int rc;
+    int rc;
 
     try {
 
@@ -1497,7 +1502,7 @@
         xsh->defineFile("tuscany963.xsd");
         XMLHelperPtr myXMLHelper = HelperProvider::getXMLHelper(mdg);
         XMLDocumentPtr myXMLDocument = myXMLHelper->loadFile("tuscany963.xml");
-               myXMLHelper->save(myXMLDocument, "tuscany963.out.xml");
+        myXMLHelper->save(myXMLDocument, "tuscany963.out.xml");
         
 
         return comparefiles("tuscany963.out.xml" ,"tuscany963.out.xml.txt");



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

Reply via email to