mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#3822 AppFwk : Improve resolve of PtrField
This commit is contained in:
parent
687aadcfde
commit
90550fe561
@ -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;
|
||||
};
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user