summaryrefslogtreecommitdiffstats
path: root/tags/cpp-sdo-1.0.incubating-M3-RC1/runtime/core/src/commonj/sdo/CopyHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tags/cpp-sdo-1.0.incubating-M3-RC1/runtime/core/src/commonj/sdo/CopyHelper.cpp')
-rw-r--r--tags/cpp-sdo-1.0.incubating-M3-RC1/runtime/core/src/commonj/sdo/CopyHelper.cpp554
1 files changed, 0 insertions, 554 deletions
diff --git a/tags/cpp-sdo-1.0.incubating-M3-RC1/runtime/core/src/commonj/sdo/CopyHelper.cpp b/tags/cpp-sdo-1.0.incubating-M3-RC1/runtime/core/src/commonj/sdo/CopyHelper.cpp
deleted file mode 100644
index 92ee508ef0..0000000000
--- a/tags/cpp-sdo-1.0.incubating-M3-RC1/runtime/core/src/commonj/sdo/CopyHelper.cpp
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* $Rev$ $Date$ */
-
-#include "commonj/sdo/Property.h"
-#include "commonj/sdo/Type.h"
-#include "commonj/sdo/TypeList.h"
-#include "commonj/sdo/Sequence.h"
-#include "commonj/sdo/RefCountingPointer.h"
-#include "commonj/sdo/DataObjectImpl.h"
-
-
-#include "commonj/sdo/CopyHelper.h"
-
-#include <iostream>
-using namespace std;
-namespace commonj{
-namespace sdo{
-
- /** CopyHelper provides static copying helper functions.
- *
- * CopyHelper provides shallow and deep copy of data objects.
- * copyShallow() copies the DataType members of the data object.
- * copy() copies all the members and recurses downwards though
- * the data graph
- */
-
- void CopyHelper::transferitem(DataObjectPtr to, DataObjectPtr from, const Property& p)
- {
- switch (p.getTypeEnum())
- {
- case Type::BooleanType:
- to->setBoolean( p, from->getBoolean(p));
- break;
- case Type::ByteType:
- to->setByte( p, from->getByte(p));
- break;
- case Type::CharacterType:
- to->setCharacter( p, from->getCharacter(p));
- break;
- case Type::IntegerType:
- to->setInteger( p, from->getInteger(p));
- break;
- case Type::ShortType:
- to->setShort( p,from->getShort(p));
- break;
- case Type::DoubleType:
- to->setDouble( p, from->getDouble(p));
- break;
- case Type::FloatType:
- to->setFloat( p, from->getFloat(p));
- break;
- case Type::LongType:
- to->setLong( p, from->getLong(p));
- break;
- case Type::DateType:
- to->setDate( p, from->getDate(p));
- break;
- case Type::BigDecimalType:
- case Type::BigIntegerType:
- case Type::UriType:
- case Type::StringType:
- {
- unsigned int siz = from->getLength(p);
- if (siz > 0)
- {
- wchar_t * buf = new wchar_t[siz];
- from->getString(p,buf, siz);
- to->setString(p, buf, siz);
- delete[] buf;
- }
- }
- break;
- case Type::BytesType:
- {
- unsigned int siz = from->getLength(p);
- if (siz > 0)
- {
- char * buf = new char[siz];
- from->getBytes(p,buf, siz);
- to->setBytes(p, buf, siz);
- delete buf;
- }
- }
- break;
- default:
- break;
- } // switch
- }
-
- void CopyHelper::transferlist(DataObjectList& to, DataObjectList& from, Type::Types t)
- {
- for (unsigned int i=0;i< from.size(); i++)
- {
- switch (t)
- {
- case Type::BooleanType:
- to.append(from.getBoolean(i));
- break;
- case Type::ByteType:
- to.append(from.getByte(i));
- break;
- case Type::CharacterType:
- to.append(from.getCharacter(i));
- break;
-#if __WORDSIZE ==64
- case Type::IntegerType:
- to.append((int64_t)(from.getInteger(i)));
- break;
-#else
- case Type::IntegerType:
- to.append(from.getInteger(i));
- break;
-#endif
- case Type::ShortType:
- to.append(from.getShort(i));
- break;
- case Type::DoubleType:
- to.append(from.getDouble(i));
- break;
- case Type::FloatType:
- to.append(from.getFloat(i));
- break;
- case Type::LongType:
- to.append(from.getLong(i));
- break;
- case Type::DateType:
- to.append(from.getDate(i));
- break;
- case Type::BigDecimalType:
- case Type::BigIntegerType:
- case Type::UriType:
- case Type::StringType:
- {
- unsigned int siz = from.getLength(i);
- if (siz > 0)
- {
- wchar_t * buf = new wchar_t[siz];
- from.getString(i,buf,siz);
- to.append(buf,siz);
- delete buf;
- }
- }
- break;
-
- case Type::BytesType:
- {
- unsigned int siz = from.getLength(i);
- if (siz > 0)
- {
- char * buf = new char[siz];
- from.getBytes(i,buf,siz);
- to.append(buf,siz);
- delete buf;
- }
- }
- break;
-
- default:
- break;
- } // case
- } // for
- } // method
-
-
-
- void CopyHelper::transfersequenceitem(Sequence *to, Sequence *from, const Property& p, int index)
- {
- switch (p.getTypeEnum())
- {
- case Type::BooleanType:
- to->addBoolean( p, from->getBooleanValue(index));
- break;
- case Type::ByteType:
- to->addByte( p, from->getByteValue(index));
- break;
- case Type::CharacterType:
- to->addCharacter( p, from->getCharacterValue(index));
- break;
- case Type::IntegerType:
- to->addInteger( p, from->getIntegerValue(index));
- break;
- case Type::ShortType:
- to->addShort( p,from->getShortValue(index));
- break;
- case Type::DoubleType:
- to->addDouble( p, from->getDoubleValue(index));
- break;
- case Type::FloatType:
- to->addFloat( p, from->getFloatValue(index));
- break;
- case Type::LongType:
- to->addLong( p, from->getLongValue(index));
- break;
- case Type::DateType:
- to->addDate( p, from->getDateValue(index));
- break;
- case Type::BigDecimalType:
- case Type::BigIntegerType:
- case Type::UriType:
- case Type::StringType:
- {
- unsigned int siz = from->getLength(index);
- if (siz > 0)
- {
- wchar_t * buf = new wchar_t[siz];
- from->getStringValue(index, buf, siz);
- to->addString(p, buf, siz);
- delete[] buf;
- }
- }
- break;
- case Type::BytesType:
- {
- unsigned int siz = from->getLength(index);
- if (siz > 0)
- {
- char * buf = new char[siz];
- from->getBytesValue(index, buf, siz);
- to->addBytes(p, buf, siz);
- delete buf;
- }
- }
- break;
- default:
- break;
- } // switch
- }
-
- /** CopyHelper provides static copying helper functions.
- *
- * copyShallow() copies the DataType members of the data object.
- * copy() copies all the members and recurses downwards though
- * the data graph
- */
- DataObjectPtr CopyHelper::copyShallow(DataObjectPtr dataObject)
- {
- return internalCopy(dataObject, false);
-
- }
-
- /** CopyHelper provides static copying helper functions.
- *
- * copyShallow() copies the DataType members of the data object.
- * copy() copies all the members and recurses downwards though
- * the data graph
- */
- DataObjectPtr CopyHelper::copy(DataObjectPtr dataObject)
- {
- DataObjectPtr newob = internalCopy(dataObject, true);
- resolveReferences(dataObject, newob);
- return newob;
- }
-
- DataObjectPtr CopyHelper::internalCopy(DataObjectPtr dataObject,
- bool fullCopy)
- {
-
- DataObject* theob = dataObject;
- DataFactoryPtr fac = ((DataObjectImpl*)theob)->getDataFactory();
- if (!fac) return 0;
-
- const Type& t = dataObject->getType();
- DataObjectPtr newob = fac->create(t);
- if (!newob) return 0;
-
- if ( dataObject->getType().isSequencedType() )
- {
- Sequence* fromSequence = dataObject->getSequence();
- int sequence_length = fromSequence->size();
-
- Sequence* toSequence = newob->getSequence();
-
- for (int i=0;i < sequence_length; i++)
- {
- if ( fromSequence->isText(i) )
- {
- const char *text = fromSequence->getCStringValue(i);
- toSequence->addText(i, text);
- }
- else
- {
- const Property& seqProperty = fromSequence->getProperty(i);
- SDOXMLString seqPropertyName = seqProperty.getName();
- const Type& seqPropertyType = seqProperty.getType();
-
- if (seqPropertyType.isDataObjectType())
- {
- if (!fullCopy)
- {
- continue;
- }
- else
- {
- DataObjectPtr dob;
-
- // retrieve the data object to be copied
- if (seqProperty.isMany())
- {
- int index = fromSequence->getListIndex(i);
- dob = dataObject->getList(seqProperty)[index];
- }
- else
- {
- dob = dataObject->getDataObject(seqProperty);
- }
-
- // do the copying of referencing
- if (dob)
- {
- // Handle non-containment reference to DataObject
- if (seqProperty.isReference())
- {
- // add just the reference into the sequence
- // 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
- {
- // make a copy of the data object itself
- // and add it to the sequence
- toSequence->addDataObject(seqProperty,
- internalCopy(dob,
- true));
- }
- }
- }
- }
- else
- {
- // Sequence member is a primitive
- transfersequenceitem(toSequence,
- fromSequence,
- seqProperty,
- i);
-
- }
- } // is it a text element
- } // for all elements in sequence
- }
- else
- {
- PropertyList pl = dataObject->getInstanceProperties();
- for (unsigned int i=0;i < pl.size(); i++)
- {
- if (dataObject->isSet(pl[i]))
- {
- // data objects are only copied in the deep copy case
- if (pl[i].getType().isDataObjectType())
- {
- if (!fullCopy)
- {
- continue;
- }
- else
- {
- if (pl[i].isMany())
- {
- DataObjectList& dolold = dataObject->getList(pl[i]);
- DataObjectList& dolnew = newob->getList(pl[i]);
- 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]);
- if (pl[i].isReference())
- {
- // have to resolve references in a 2nd pass
- }
- else
- {
- newob->setDataObject(pl[i],internalCopy(dob,true));
- }
- }
- }
- }
- else
- {
- if (pl[i].isMany())
- {
- DataObjectList& dolold = dataObject->getList(pl[i]);
- DataObjectList& dolnew = newob->getList(pl[i]);
- transferlist(dolnew,dolold, pl[i].getTypeEnum());
- }
- else
- {
- transferitem(newob,dataObject, pl[i]);
- }
- } // else
- }
- }
- }
-
- 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;
- }
-
-
-}
-};
-