#3822 AppFwk : Improve resolve of PtrField

This commit is contained in:
Magne Sjaastad 2018-12-04 14:10:18 +01:00
parent 687aadcfde
commit 90550fe561
5 changed files with 84 additions and 14 deletions

View File

@ -16,6 +16,8 @@ public:
public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override;
private:
FieldType* m_field;
};
@ -40,7 +42,7 @@ public:
public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override;
void resolveReferences() override;
bool resolveReferences() override;
private:
FieldType* m_field;
@ -69,7 +71,7 @@ public:
public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override;
void resolveReferences() override;
bool resolveReferences() override;
private:
FieldType* m_field;
@ -93,6 +95,8 @@ public:
public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override;
private:
FieldType* m_field;
};
@ -111,6 +115,7 @@ public:
public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override;
private:
FieldType* m_field;
};

View File

@ -38,6 +38,16 @@ void caf::PdmFieldXmlCap<FieldType>::writeFieldData(QXmlStreamWriter& xmlStream)
PdmFieldWriter<typename FieldType::FieldDataType>::writeFieldData(m_field->value(), xmlStream);
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template < typename FieldType>
bool caf::PdmFieldXmlCap<FieldType>::resolveReferences()
{
return true;
}
//==================================================================================================
/// XML Implementation for PdmPtrField<>
//==================================================================================================
@ -97,14 +107,16 @@ void caf::PdmFieldXmlCap<FieldType>::writeFieldData(QXmlStreamWriter& xmlStream)
///
//--------------------------------------------------------------------------------------------------
template < typename DataType>
void caf::PdmFieldXmlCap< PdmPtrField<DataType*> >::resolveReferences()
bool caf::PdmFieldXmlCap< PdmPtrField<DataType*> >::resolveReferences()
{
if (m_isResolved) return;
if (m_referenceString.isEmpty()) return;
if (m_isResolved) return true;
if (m_referenceString.isEmpty()) return true;
PdmObjectHandle* objHandle = PdmReferenceHelper::objectFromFieldReference(this->fieldHandle(), m_referenceString);
m_field->setRawPtr(objHandle);
m_isResolved = true;
return objHandle != nullptr;
}
//==================================================================================================
@ -163,20 +175,29 @@ void caf::PdmFieldXmlCap<FieldType>::writeFieldData(QXmlStreamWriter& xmlStream)
///
//--------------------------------------------------------------------------------------------------
template < typename DataType>
void caf::PdmFieldXmlCap< PdmPtrArrayField<DataType*> >::resolveReferences()
bool caf::PdmFieldXmlCap< PdmPtrArrayField<DataType*> >::resolveReferences()
{
if(m_isResolved) return;
if(m_referenceString.isEmpty()) return;
if(m_isResolved) return true;
if(m_referenceString.isEmpty()) return true;
m_field->clear();
bool foundValidObjectFromString = true;
QStringList tokens = m_referenceString.split('|');
for(int i = 0; i < tokens.size(); ++i)
{
PdmObjectHandle* objHandle = PdmReferenceHelper::objectFromFieldReference(this->fieldHandle(), tokens[i]);
if (!tokens[i].isEmpty() && !objHandle)
{
foundValidObjectFromString = false;
}
m_field->m_pointers.push_back(NULL);
m_field->m_pointers.back().setRawPtr(objHandle);
}
m_isResolved = true;
return foundValidObjectFromString;
}
@ -281,6 +302,15 @@ void caf::PdmFieldXmlCap< caf::PdmChildField<DataType*> >::writeFieldData(QXmlSt
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template < typename DataType>
bool caf::PdmFieldXmlCap<caf::PdmChildField<DataType *>>::resolveReferences()
{
return true;
}
//==================================================================================================
/// XML Implementation for PdmChildArrayField<>
//==================================================================================================
@ -373,4 +403,14 @@ void caf::PdmFieldXmlCap< caf::PdmChildArrayField<DataType*> >::readFieldData(QX
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template < typename DataType>
bool caf::PdmFieldXmlCap<caf::PdmChildArrayField<DataType *>>::resolveReferences()
{
return true;
}
} // End namespace caf

View File

@ -40,7 +40,7 @@ public:
virtual void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) = 0;
virtual void writeFieldData(QXmlStreamWriter& xmlStream) const = 0;
virtual void resolveReferences() { };
virtual bool resolveReferences() = 0;
protected:
bool assertValid() const;

View File

@ -299,7 +299,7 @@ void PdmXmlObjectHandle::initAfterReadRecursively(PdmObjectHandle* object)
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmXmlObjectHandle::resolveReferencesRecursively(PdmObjectHandle* object)
void PdmXmlObjectHandle::resolveReferencesRecursively(PdmObjectHandle* object, std::vector<PdmFieldHandle*>* fieldWithFailingResolve)
{
if (object == nullptr) return;
@ -315,14 +315,35 @@ void PdmXmlObjectHandle::resolveReferencesRecursively(PdmObjectHandle* object)
{
field->childObjects(&children);
field->xmlCapability()->resolveReferences();
bool resolvedOk = field->xmlCapability()->resolveReferences();
if (fieldWithFailingResolve && !resolvedOk)
{
fieldWithFailingResolve->push_back(field);
}
}
}
size_t cIdx;
for (cIdx = 0; cIdx < children.size(); ++cIdx)
{
resolveReferencesRecursively(children[cIdx]);
resolveReferencesRecursively(children[cIdx], fieldWithFailingResolve);
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmXmlObjectHandle::resolveReferencesRecursively(std::vector<PdmFieldHandle*>* fieldWithFailingResolve /*= nullptr*/)
{
std::vector<PdmFieldHandle*> tempFields;
resolveReferencesRecursively(this->m_owner, &tempFields);
if (fieldWithFailingResolve)
{
for (auto f : tempFields)
{
fieldWithFailingResolve->push_back(f);
}
}
}

View File

@ -4,6 +4,8 @@
#include <QString>
#include <vector>
class QXmlStreamReader;
class QXmlStreamWriter;
@ -15,6 +17,7 @@ class PdmXmlFieldHandle;
class PdmObjectHandle;
class PdmObjectFactory;
class PdmReferenceHelper;
class PdmFieldHandle;
//==================================================================================================
@ -51,7 +54,8 @@ public:
void initAfterReadRecursively() { initAfterReadRecursively(this->m_owner); };
void setupBeforeSaveRecursively() { setupBeforeSaveRecursively(this->m_owner); };
void resolveReferencesRecursively() { resolveReferencesRecursively(this->m_owner); };
void resolveReferencesRecursively(std::vector<PdmFieldHandle*>* fieldWithFailingResolve = nullptr);
protected: // Virtual
/// Method gets called from PdmDocument after all objects are read.
@ -68,7 +72,7 @@ protected: // Virtual
private:
void initAfterReadRecursively(PdmObjectHandle* object);
void setupBeforeSaveRecursively(PdmObjectHandle * object);
void resolveReferencesRecursively(PdmObjectHandle* object);
void resolveReferencesRecursively(PdmObjectHandle* object, std::vector<PdmFieldHandle*>* fieldWithFailingResolve);
private:
friend class PdmObjectHandle ; // Only temporary for void PdmObject::addFieldNoDefault( ) accessing findField