#10713 Add flag used to detect if resolveReferences is called from initAfterRead

This commit is contained in:
Magne Sjaastad
2023-10-13 11:07:39 +02:00
parent 6a8b72c0c5
commit 69b513bcb1
4 changed files with 59 additions and 2 deletions

View File

@@ -15,6 +15,8 @@ PdmObjectHandle::PdmObjectHandle()
{
m_parentField = nullptr;
m_isDeletable = false;
m_isInsideInitAfterRead = false;
}
//--------------------------------------------------------------------------------------------------

View File

@@ -159,6 +159,11 @@ private:
std::set<PdmObjectHandle**> m_pointersReferencingMe;
bool m_isDeletable;
// m_isInsideInitAfterRead is used to detect if resolveReferencesRecursively() is called from initAfterRead()
// Use friend class to avoid public noise
friend class PdmXmlObjectHandle;
bool m_isInsideInitAfterRead;
};
} // namespace caf

View File

@@ -6,6 +6,7 @@
#include "cafPdmFieldHandle.h"
#include <QDebug>
#include <QXmlStreamReader>
#include <QXmlStreamWriter>
@@ -341,6 +342,9 @@ void PdmXmlObjectHandle::initAfterReadRecursively( PdmObjectHandle* object )
{
if ( object == nullptr ) return;
// Set flag to be able to detect if resolveReferencesRecursively() is called from initAfterRead()
object->m_isInsideInitAfterRead = true;
std::vector<PdmFieldHandle*> fields = object->fields();
std::vector<PdmObjectHandle*> children;
@@ -365,6 +369,16 @@ void PdmXmlObjectHandle::initAfterReadRecursively( PdmObjectHandle* object )
{
xmlObject->initAfterRead();
}
object->m_isInsideInitAfterRead = false;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmXmlObjectHandle::initAfterReadRecursively()
{
initAfterReadRecursively( this->m_owner );
}
//--------------------------------------------------------------------------------------------------
@@ -375,6 +389,34 @@ void PdmXmlObjectHandle::resolveReferencesRecursively( PdmObjectHandle*
{
if ( object == nullptr ) return;
assert( !object->m_isInsideInitAfterRead );
if ( object->m_isInsideInitAfterRead )
{
// In release, the assert above is not triggered, but the resolving might still fail.
// In RelWithDebInfo, the following message will be available from the debug output window
QString text =
"Calling resolveReferencesRecursively() from initAfterRead() is not supported, "
"as the object model might not be complete. If the object model is incomplete, the resolving might "
"fail and assign a null pointer to the pointer field.";
qDebug() << text;
std::vector<PdmFieldHandle*> fields = object->fields();
if ( !fields.empty() )
{
text = " Field keywords: ";
for ( auto f : fields )
{
text += f->keyword() + ", ";
}
}
qDebug() << text;
return;
}
std::vector<PdmFieldHandle*> fields = object->fields();
std::vector<PdmObjectHandle*> children;
@@ -455,6 +497,14 @@ void PdmXmlObjectHandle::setupBeforeSaveRecursively( PdmObjectHandle* object )
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmXmlObjectHandle::setupBeforeSaveRecursively()
{
setupBeforeSaveRecursively( this->m_owner );
}
//--------------------------------------------------------------------------------------------------
/// Implementation of xmlCapability() defined in cafPdmObjectHandle.h
//--------------------------------------------------------------------------------------------------

View File

@@ -51,8 +51,8 @@ public:
/// Check if a string is a valid Xml element name
static bool isValidXmlElementName( const QString& name );
void initAfterReadRecursively() { initAfterReadRecursively( this->m_owner ); };
void setupBeforeSaveRecursively() { setupBeforeSaveRecursively( this->m_owner ); };
void initAfterReadRecursively();
void setupBeforeSaveRecursively();
// Never call resolveReferencesRecursively() from initAfterRead(), as the document is not fully imported and the
// resolving might fail. The object needs to be fully inserted into the document before resolving references.