refs #853, JSON exception handling adjustments for model reader

This commit is contained in:
Klaus Basan
2017-01-05 19:39:27 +01:00
committed by Mathew Sutcliffe
parent e956986bf4
commit b0bef3264c
3 changed files with 89 additions and 36 deletions

View File

@@ -375,58 +375,107 @@ namespace BlackCore
CLogMessage(this).info("Read '%1' '%2' from '%3'") << n << CEntityFlags::flagToString(CEntityFlags::ModelEntity) << urlString; CLogMessage(this).info("Read '%1' '%2' from '%3'") << n << CEntityFlags::flagToString(CEntityFlags::ModelEntity) << urlString;
} }
bool CModelDataReader::readFromJsonFiles(const QString &dir, CEntityFlags::Entity whatToRead) CStatusMessageList CModelDataReader::readFromJsonFiles(const QString &dir, CEntityFlags::Entity whatToRead)
{ {
QDir directory(dir); QDir directory(dir);
if (!directory.exists()) { return false; } if (!directory.exists())
{
return CStatusMessage(this).error("Missing directory '%1'") << dir;
}
whatToRead &= CEntityFlags::DistributorLiveryModel; // supported
BlackMisc::Network::CEntityFlags::Entity reallyRead = CEntityFlags::NoEntity; BlackMisc::Network::CEntityFlags::Entity reallyRead = CEntityFlags::NoEntity;
CStatusMessageList msgs;
if (whatToRead.testFlag(CEntityFlags::LiveryEntity)) if (whatToRead.testFlag(CEntityFlags::LiveryEntity))
{ {
QString liveriesJson(CFileUtils::readFileToString(CFileUtils::appendFilePaths(directory.absolutePath(), "liveries.json"))); const QString fileName = CFileUtils::appendFilePaths(directory.absolutePath(), "liveries.json");
if (!liveriesJson.isEmpty()) const QString liveriesJson(CFileUtils::readFileToString(fileName));
if (liveriesJson.isEmpty())
{
msgs.push_back(CStatusMessage(this).error("Failed to read from file/empty file '%1'") << fileName);
}
else
{
try
{ {
CLiveryList liveries; CLiveryList liveries;
liveries.convertFromJson(liveriesJson); //! \todo catch CJsonException or use convertFromJsonNoThrow liveries.convertFromJson(liveriesJson);
const int c = liveries.size(); const int c = liveries.size();
this->m_liveryCache.set(liveries); this->m_liveryCache.set(liveries);
emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, c); emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFinished, c);
reallyRead |= CEntityFlags::LiveryEntity; reallyRead |= CEntityFlags::LiveryEntity;
} }
catch (const CJsonException &ex)
{
emit dataRead(CEntityFlags::LiveryEntity, CEntityFlags::ReadFailed, 0);
msgs.push_back(ex.toStatusMessage(this, QString("Reading liveries from '%1'").arg(fileName)));
}
}
} }
if (whatToRead.testFlag(CEntityFlags::ModelEntity)) if (whatToRead.testFlag(CEntityFlags::ModelEntity))
{ {
QString modelsJson(CFileUtils::readFileToString(CFileUtils::appendFilePaths(directory.absolutePath(), "models.json"))); const QString fileName = CFileUtils::appendFilePaths(directory.absolutePath(), "models.json");
if (!modelsJson.isEmpty()) const QString modelsJson(CFileUtils::readFileToString(fileName));
if (modelsJson.isEmpty())
{
msgs.push_back(CStatusMessage(this).error("Failed to read from file/empty file '%1'") << fileName);
}
else
{
try
{ {
CAircraftModelList models; CAircraftModelList models;
models.convertFromJson(Json::jsonObjectFromString(modelsJson)); //! \todo catch CJsonException or use convertFromJsonNoThrow models.convertFromJson(Json::jsonObjectFromString(modelsJson));
const int c = models.size(); const int c = models.size();
this->m_modelCache.set(models); this->m_modelCache.set(models);
emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, c); emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFinished, c);
reallyRead |= CEntityFlags::ModelEntity; reallyRead |= CEntityFlags::ModelEntity;
} }
catch (const CJsonException &ex)
{
emit dataRead(CEntityFlags::ModelEntity, CEntityFlags::ReadFailed, 0);
msgs.push_back(ex.toStatusMessage(this, QString("Reading models from '%1'").arg(fileName)));
}
}
} }
if (whatToRead.testFlag(CEntityFlags::DistributorEntity)) if (whatToRead.testFlag(CEntityFlags::DistributorEntity))
{ {
QString distributorsJson(CFileUtils::readFileToString(CFileUtils::appendFilePaths(directory.absolutePath(), "distributors.json"))); const QString fileName = CFileUtils::appendFilePaths(directory.absolutePath(), "distributors.json");
if (!distributorsJson.isEmpty()) const QString distributorsJson(CFileUtils::readFileToString(fileName));
if (distributorsJson.isEmpty())
{
msgs.push_back(CStatusMessage(this).error("Failed to read from file/empty file '%1'") << fileName);
}
else
{
try
{ {
CDistributorList distributors; CDistributorList distributors;
distributors.convertFromJson(Json::jsonObjectFromString(distributorsJson)); //! \todo catch CJsonException or use convertFromJsonNoThrow distributors.convertFromJson(Json::jsonObjectFromString(distributorsJson));
const int c = distributors.size(); const int c = distributors.size();
this->m_distributorCache.set(distributors); this->m_distributorCache.set(distributors);
emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, c); emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished, c);
reallyRead |= CEntityFlags::DistributorEntity; reallyRead |= CEntityFlags::DistributorEntity;
} }
catch (const CJsonException &ex)
{
emit dataRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFailed, 0);
msgs.push_back(ex.toStatusMessage(this, QString("Reading distributors from '%1'").arg(fileName)));
}
}
} }
return (reallyRead & CEntityFlags::DistributorLiveryModel) == whatToRead; if (msgs.isSuccess() && (reallyRead & CEntityFlags::DistributorLiveryModel) == whatToRead)
{
return CStatusMessage(this).info("Updated caches for '%1' from '%2'") << CEntityFlags::flagToString(reallyRead) << dir;
}
else
{
return msgs;
}
} }
bool CModelDataReader::readFromJsonFilesInBackground(const QString &dir, CEntityFlags::Entity whatToRead) bool CModelDataReader::readFromJsonFilesInBackground(const QString &dir, CEntityFlags::Entity whatToRead)
@@ -434,8 +483,11 @@ namespace BlackCore
if (dir.isEmpty() || whatToRead == CEntityFlags::NoEntity) { return false; } if (dir.isEmpty() || whatToRead == CEntityFlags::NoEntity) { return false; }
QTimer::singleShot(0, this, [this, dir, whatToRead]() QTimer::singleShot(0, this, [this, dir, whatToRead]()
{ {
bool s = this->readFromJsonFiles(dir, whatToRead); const CStatusMessageList msgs = this->readFromJsonFiles(dir, whatToRead);
Q_UNUSED(s); if (msgs.isFailure())
{
CLogMessage::preformatted(msgs);
}
}); });
return true; return true;
} }

View File

@@ -116,7 +116,7 @@ namespace BlackCore
bool areAllDataRead() const; bool areAllDataRead() const;
//! Read to JSON file //! Read to JSON file
bool readFromJsonFiles(const QString &dir, BlackMisc::Network::CEntityFlags::Entity whatToRead = BlackMisc::Network::CEntityFlags::DistributorLiveryModel); BlackMisc::CStatusMessageList readFromJsonFiles(const QString &dir, BlackMisc::Network::CEntityFlags::Entity whatToRead = BlackMisc::Network::CEntityFlags::DistributorLiveryModel);
//! Read from static DB data file //! Read from static DB data file
bool readFromJsonFilesInBackground(const QString &dir, BlackMisc::Network::CEntityFlags::Entity whatToRead = BlackMisc::Network::CEntityFlags::DistributorLiveryModel); bool readFromJsonFilesInBackground(const QString &dir, BlackMisc::Network::CEntityFlags::Entity whatToRead = BlackMisc::Network::CEntityFlags::DistributorLiveryModel);

View File

@@ -1203,9 +1203,10 @@ namespace BlackCore
} }
if (s && this->m_modelDataReader) if (s && this->m_modelDataReader)
{ {
s = inBackground ? if(inBackground) { return this->m_modelDataReader->readFromJsonFilesInBackground(dir); }
this->m_modelDataReader->readFromJsonFilesInBackground(dir) : const CStatusMessageList msgs = this->m_modelDataReader->readFromJsonFiles(dir);
this->m_modelDataReader->readFromJsonFiles(dir); if (msgs.isFailure()) { CLogMessage::preformatted(msgs); }
return msgs.isSuccess();
} }
if (s && this->m_airportDataReader) if (s && this->m_airportDataReader)
{ {