#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: public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override;
private: private:
FieldType* m_field; FieldType* m_field;
}; };
@ -40,7 +42,7 @@ public:
public: public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
void resolveReferences() override; bool resolveReferences() override;
private: private:
FieldType* m_field; FieldType* m_field;
@ -69,7 +71,7 @@ public:
public: public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
void resolveReferences() override; bool resolveReferences() override;
private: private:
FieldType* m_field; FieldType* m_field;
@ -93,6 +95,8 @@ public:
public: public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override;
private: private:
FieldType* m_field; FieldType* m_field;
}; };
@ -111,6 +115,7 @@ public:
public: public:
void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override; void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) override;
void writeFieldData(QXmlStreamWriter& xmlStream) const override; void writeFieldData(QXmlStreamWriter& xmlStream) const override;
bool resolveReferences() override;
private: private:
FieldType* m_field; 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); PdmFieldWriter<typename FieldType::FieldDataType>::writeFieldData(m_field->value(), xmlStream);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
template < typename FieldType>
bool caf::PdmFieldXmlCap<FieldType>::resolveReferences()
{
return true;
}
//================================================================================================== //==================================================================================================
/// XML Implementation for PdmPtrField<> /// XML Implementation for PdmPtrField<>
//================================================================================================== //==================================================================================================
@ -97,14 +107,16 @@ void caf::PdmFieldXmlCap<FieldType>::writeFieldData(QXmlStreamWriter& xmlStream)
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
template < typename DataType> template < typename DataType>
void caf::PdmFieldXmlCap< PdmPtrField<DataType*> >::resolveReferences() bool caf::PdmFieldXmlCap< PdmPtrField<DataType*> >::resolveReferences()
{ {
if (m_isResolved) return; if (m_isResolved) return true;
if (m_referenceString.isEmpty()) return; if (m_referenceString.isEmpty()) return true;
PdmObjectHandle* objHandle = PdmReferenceHelper::objectFromFieldReference(this->fieldHandle(), m_referenceString); PdmObjectHandle* objHandle = PdmReferenceHelper::objectFromFieldReference(this->fieldHandle(), m_referenceString);
m_field->setRawPtr(objHandle); m_field->setRawPtr(objHandle);
m_isResolved = true; m_isResolved = true;
return objHandle != nullptr;
} }
//================================================================================================== //==================================================================================================
@ -163,20 +175,29 @@ void caf::PdmFieldXmlCap<FieldType>::writeFieldData(QXmlStreamWriter& xmlStream)
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
template < typename DataType> template < typename DataType>
void caf::PdmFieldXmlCap< PdmPtrArrayField<DataType*> >::resolveReferences() bool caf::PdmFieldXmlCap< PdmPtrArrayField<DataType*> >::resolveReferences()
{ {
if(m_isResolved) return; if(m_isResolved) return true;
if(m_referenceString.isEmpty()) return; if(m_referenceString.isEmpty()) return true;
m_field->clear(); m_field->clear();
bool foundValidObjectFromString = true;
QStringList tokens = m_referenceString.split('|'); QStringList tokens = m_referenceString.split('|');
for(int i = 0; i < tokens.size(); ++i) for(int i = 0; i < tokens.size(); ++i)
{ {
PdmObjectHandle* objHandle = PdmReferenceHelper::objectFromFieldReference(this->fieldHandle(), tokens[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.push_back(NULL);
m_field->m_pointers.back().setRawPtr(objHandle); m_field->m_pointers.back().setRawPtr(objHandle);
} }
m_isResolved = true; 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<> /// 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 } // End namespace caf

View File

@ -40,7 +40,7 @@ public:
virtual void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) = 0; virtual void readFieldData(QXmlStreamReader& xmlStream, PdmObjectFactory* objectFactory) = 0;
virtual void writeFieldData(QXmlStreamWriter& xmlStream) const = 0; virtual void writeFieldData(QXmlStreamWriter& xmlStream) const = 0;
virtual void resolveReferences() { }; virtual bool resolveReferences() = 0;
protected: protected:
bool assertValid() const; 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; if (object == nullptr) return;
@ -315,14 +315,35 @@ void PdmXmlObjectHandle::resolveReferencesRecursively(PdmObjectHandle* object)
{ {
field->childObjects(&children); field->childObjects(&children);
field->xmlCapability()->resolveReferences(); bool resolvedOk = field->xmlCapability()->resolveReferences();
if (fieldWithFailingResolve && !resolvedOk)
{
fieldWithFailingResolve->push_back(field);
}
} }
} }
size_t cIdx; size_t cIdx;
for (cIdx = 0; cIdx < children.size(); ++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 <QString>
#include <vector>
class QXmlStreamReader; class QXmlStreamReader;
class QXmlStreamWriter; class QXmlStreamWriter;
@ -15,6 +17,7 @@ class PdmXmlFieldHandle;
class PdmObjectHandle; class PdmObjectHandle;
class PdmObjectFactory; class PdmObjectFactory;
class PdmReferenceHelper; class PdmReferenceHelper;
class PdmFieldHandle;
//================================================================================================== //==================================================================================================
@ -51,7 +54,8 @@ public:
void initAfterReadRecursively() { initAfterReadRecursively(this->m_owner); }; void initAfterReadRecursively() { initAfterReadRecursively(this->m_owner); };
void setupBeforeSaveRecursively() { setupBeforeSaveRecursively(this->m_owner); }; void setupBeforeSaveRecursively() { setupBeforeSaveRecursively(this->m_owner); };
void resolveReferencesRecursively() { resolveReferencesRecursively(this->m_owner); };
void resolveReferencesRecursively(std::vector<PdmFieldHandle*>* fieldWithFailingResolve = nullptr);
protected: // Virtual protected: // Virtual
/// Method gets called from PdmDocument after all objects are read. /// Method gets called from PdmDocument after all objects are read.
@ -68,7 +72,7 @@ protected: // Virtual
private: private:
void initAfterReadRecursively(PdmObjectHandle* object); void initAfterReadRecursively(PdmObjectHandle* object);
void setupBeforeSaveRecursively(PdmObjectHandle * object); void setupBeforeSaveRecursively(PdmObjectHandle * object);
void resolveReferencesRecursively(PdmObjectHandle* object); void resolveReferencesRecursively(PdmObjectHandle* object, std::vector<PdmFieldHandle*>* fieldWithFailingResolve);
private: private:
friend class PdmObjectHandle ; // Only temporary for void PdmObject::addFieldNoDefault( ) accessing findField friend class PdmObjectHandle ; // Only temporary for void PdmObject::addFieldNoDefault( ) accessing findField