From b8d323226f8f8194bbe22beb3156899e1920f6b0 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 18 Oct 2016 04:35:24 +0200 Subject: [PATCH] refs #748, fixed airport JSON bugs and removed workaround * removed workaround in web data services * removed convertFromDatabaseJson functions, not needed * changed to use the correct static fromDatabaseJson functions * fixed prefixes * load correct Country object by loading it as nested object * key and timestamp was missing in CAirport tuple metadata --- src/blackcore/db/airportdatareader.cpp | 21 ++++++------- src/blackcore/db/airportdatareader.h | 4 +-- src/blackcore/webdataservices.cpp | 3 +- src/blackmisc/aviation/airport.cpp | 42 +++++--------------------- src/blackmisc/aviation/airport.h | 13 ++++---- src/blackmisc/aviation/airportlist.cpp | 13 ++++---- src/blackmisc/aviation/airportlist.h | 4 +-- src/blackmisc/network/entityflags.h | 12 ++++---- 8 files changed, 39 insertions(+), 73 deletions(-) diff --git a/src/blackcore/db/airportdatareader.cpp b/src/blackcore/db/airportdatareader.cpp index 6b098e2cb..686a85024 100644 --- a/src/blackcore/db/airportdatareader.cpp +++ b/src/blackcore/db/airportdatareader.cpp @@ -21,7 +21,7 @@ namespace BlackCore { namespace Db { - CAirportDataReader::CAirportDataReader(QObject* parent, const CDatabaseReaderConfigList &config) : + CAirportDataReader::CAirportDataReader(QObject *parent, const CDatabaseReaderConfigList &config) : CDatabaseReader(parent, config, QStringLiteral("CAirportDataReader")) { // void @@ -65,7 +65,7 @@ namespace BlackCore void CAirportDataReader::ps_parseAirportData(QNetworkReply *nwReply) { - CDatabaseReader::JsonDatastoreResponse res = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply); + const CDatabaseReader::JsonDatastoreResponse res = this->setStatusAndTransformReplyIntoDatastoreResponse(nwReply); if (res.hasErrorMessage()) { CLogMessage::preformatted(res.lastWarningOrAbove()); @@ -74,29 +74,26 @@ namespace BlackCore } CAirportList airports; - if (res.isRestricted()) { airports = this->getAirports(); - CAirportList updates; - updates.convertFromDatabaseJson(res); + CAirportList updates(CAirportList::fromDatabaseJson(res)); airports.replaceOrAddObjectsByKey(updates); } else { - airports.convertFromDatabaseJson(res); + airports = CAirportList::fromDatabaseJson(res); } - int size = airports.size(); - qint64 timestamp = lastModifiedMsSinceEpoch(nwReply); - if (size > 0 && timestamp < 0) + const int size = airports.size(); + qint64 latestTimestamp = airports.latestTimestampMsecsSinceEpoch(); + if (size > 0 && latestTimestamp < 0) { CLogMessage(this).error("No timestamp in airport list, setting to last modified value"); - timestamp = lastModifiedMsSinceEpoch(nwReply); + latestTimestamp = lastModifiedMsSinceEpoch(nwReply); } - m_airportCache.set(airports, timestamp); - + m_airportCache.set(airports, latestTimestamp); emit dataRead(CEntityFlags::AirportEntity, CEntityFlags::ReadFinished, airports.size()); } diff --git a/src/blackcore/db/airportdatareader.h b/src/blackcore/db/airportdatareader.h index 239ceca24..4a98c1070 100644 --- a/src/blackcore/db/airportdatareader.h +++ b/src/blackcore/db/airportdatareader.h @@ -45,11 +45,11 @@ namespace BlackCore //! \copydoc BlackCore::Db::CDatabaseReader::getCacheTimestamp() QDateTime getCacheTimestamp(BlackMisc::Network::CEntityFlags::Entity entities) const override; - //! \copydoc BlackCore::Db::CDatabaseReader:;getCacheCount() + //! \copydoc BlackCore::Db::CDatabaseReader::getCacheCount() int getCacheCount(BlackMisc::Network::CEntityFlags::Entity entity) const override; protected: - //! \copydoc BlackCore::Db::CDatabaseReader::syncronizeCaches() + //! \copydoc BlackCore::Db::CDatabaseReader::synchronizeCaches() void synchronizeCaches(BlackMisc::Network::CEntityFlags::Entity entities) override; //! \copydoc BlackCore::Db::CDatabaseReader::invalidateCaches() diff --git a/src/blackcore/webdataservices.cpp b/src/blackcore/webdataservices.cpp index a4ffab050..327bee740 100644 --- a/src/blackcore/webdataservices.cpp +++ b/src/blackcore/webdataservices.cpp @@ -756,9 +756,8 @@ namespace BlackCore CLogMessage(cats).info("Read data %1 entries: %2 state: %3") << CEntityFlags::flagToString(entity) << number << CEntityFlags::flagToString(state); } - //! \todo adjust value when airports are ready this->m_swiftDbEntitiesRead |= entity; - if (((static_cast(this->m_swiftDbEntitiesRead)) & static_cast(CEntityFlags::AllDbEntitiesNoInfoObjectsNoAirports)) > 0) + if (((static_cast(this->m_swiftDbEntitiesRead)) & static_cast(CEntityFlags::AllDbEntities)) > 0) { emit allSwiftDbDataRead(); } diff --git a/src/blackmisc/aviation/airport.cpp b/src/blackmisc/aviation/airport.cpp index bf15afb5f..d02e860a9 100644 --- a/src/blackmisc/aviation/airport.cpp +++ b/src/blackmisc/aviation/airport.cpp @@ -51,45 +51,17 @@ namespace BlackMisc (void)QT_TRANSLATE_NOOP("Aviation", "Airport"); } - void CAirport::convertFromDatabaseJson(const QJsonObject &json) - { - Q_ASSERT(json.value("icao").isString()); - setIcao(json.value("icao").toString()); - - if (json.value("alpha3").isString() && json.value("country").isString()) - { - CCountry country(json.value("alpha3").toString(), json.value("country").toString()); - setCountry(country); - } - - Q_ASSERT(json.value("name").isString()); - setDescriptiveName(json.value("name").toString()); - - Q_ASSERT(json.value("altitude").isDouble()); - setElevation(CLength(json.value("altitude").toInt(), CLengthUnit::ft())); - - Q_ASSERT(json.value("latitude").isDouble()); - Q_ASSERT(json.value("longitude").isDouble()); - CCoordinateGeodetic pos(json.value("latitude").toDouble(), json.value("longitude").toDouble(), 0); - setPosition(pos); - - setOperating(json.value("operating").toString() == QStringLiteral("Y")); - } - CAirport CAirport::fromDatabaseJson(const QJsonObject &json, const QString &prefix) { - CAirport airport(json.value("icao").toString()); - airport.setDescriptiveName(json.value("name").toString()); - airport.setElevation(CLength(json.value("altitude").toInt(), CLengthUnit::ft())); - CCoordinateGeodetic pos(json.value("latitude").toDouble(), json.value("longitude").toDouble(), 0); + CAirport airport(json.value(prefix + "icao").toString()); + airport.setDescriptiveName(json.value(prefix + "name").toString()); + airport.setElevation(CLength(json.value(prefix + "altitude").toInt(), CLengthUnit::ft())); + const CCoordinateGeodetic pos(json.value(prefix + "latitude").toDouble(), json.value(prefix + "longitude").toDouble(), 0); airport.setPosition(pos); - airport.setOperating(json.value("operating").toString() == QStringLiteral("Y")); + airport.setOperating(json.value(prefix + "operating").toString() == QStringLiteral("Y")); - if (json.value("alpha3").isString() && json.value("country").isString()) - { - CCountry country(json.value("alpha3").toString(), json.value("country").toString()); - airport.setCountry(country); - } + const CCountry country = CCountry::fromDatabaseJson(json, "ctry_"); + airport.setCountry(country); airport.setKeyAndTimestampFromDatabaseJson(json, prefix); return airport; diff --git a/src/blackmisc/aviation/airport.h b/src/blackmisc/aviation/airport.h index 99f7d4b37..93d684e53 100644 --- a/src/blackmisc/aviation/airport.h +++ b/src/blackmisc/aviation/airport.h @@ -36,9 +36,9 @@ namespace BlackMisc { //! Value object encapsulating information about an airpot. class BLACKMISC_EXPORT CAirport : - public CValueObject, - public BlackMisc::Db::IDatastoreObjectWithIntegerKey, - public Geo::ICoordinateWithRelativePosition + public CValueObject, + public BlackMisc::Db::IDatastoreObjectWithIntegerKey, + public Geo::ICoordinateWithRelativePosition { public: //! Properties by index @@ -142,11 +142,8 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::String::toQString QString convertToQString(bool i18n = false) const; - //! \copydoc BlackMisc::CValueObject::convertFromJson - void convertFromDatabaseJson(const QJsonObject &json); - //! Object from JSON - static CAirport fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString("apt_")); + static CAirport fromDatabaseJson(const QJsonObject &json, const QString &prefix = QString()); private: CAirportIcaoCode m_icao; @@ -157,6 +154,8 @@ namespace BlackMisc BLACK_METACLASS( CAirport, + BLACK_METAMEMBER(dbKey), + BLACK_METAMEMBER(timestampMSecsSinceEpoch), BLACK_METAMEMBER(icao), BLACK_METAMEMBER(descriptiveName), BLACK_METAMEMBER(position), diff --git a/src/blackmisc/aviation/airportlist.cpp b/src/blackmisc/aviation/airportlist.cpp index 77c8c140e..6314cc929 100644 --- a/src/blackmisc/aviation/airportlist.cpp +++ b/src/blackmisc/aviation/airportlist.cpp @@ -60,16 +60,15 @@ namespace BlackMisc return icaos; } - void CAirportList::convertFromDatabaseJson(const QJsonArray &json) + CAirportList CAirportList::fromDatabaseJson(const QJsonArray &array) { - clear(); - for (const QJsonValue &value : json) + CAirportList airports; + for (const QJsonValue &value : array) { - QJsonObject object = value.toObject(); - CAirport airport; - airport.convertFromDatabaseJson(object); - push_back(airport); + const CAirport airport(CAirport::fromDatabaseJson(value.toObject())); + airports.push_back(airport); } + return airports; } } // namespace } // namespace diff --git a/src/blackmisc/aviation/airportlist.h b/src/blackmisc/aviation/airportlist.h index 8527ff9b1..c19d350b2 100644 --- a/src/blackmisc/aviation/airportlist.h +++ b/src/blackmisc/aviation/airportlist.h @@ -55,8 +55,8 @@ namespace BlackMisc //! All ICAO codes QStringList allIcaoCodes(bool sorted) const; - //! Reads the airport list from database JSON - void convertFromDatabaseJson(const QJsonArray& json); + //! From our DB JSON + static CAirportList fromDatabaseJson(const QJsonArray &array); }; } //namespace } // namespace diff --git a/src/blackmisc/network/entityflags.h b/src/blackmisc/network/entityflags.h index f54907ecf..8bc6ce54c 100644 --- a/src/blackmisc/network/entityflags.h +++ b/src/blackmisc/network/entityflags.h @@ -46,12 +46,12 @@ namespace BlackMisc VatsimStatusFile = 1 << 10, //!< the VATSIM status file (URLs for data files etc.) AirportEntity = 1 << 11, //!< airports AllEntities = ((1 << 12) - 1), //!< everything - AllIcaoEntities = AircraftIcaoEntity | AirlineIcaoEntity, //!< all ICAO codes - AllIcaoAndCountries = AircraftIcaoEntity | AirlineIcaoEntity | CountryEntity, //!< all ICAO codes and countries - DistributorLiveryModel = DistributorEntity | LiveryEntity | ModelEntity, //!< Combinded - AllDbEntities = AllIcaoAndCountries | DistributorLiveryModel | InfoObjectEntity | AirportEntity, //!< All DB stuff - AllDbEntitiesNoInfoObjects = AllIcaoAndCountries | DistributorLiveryModel | AirportEntity, //!< All DB entities, no info objects - AllDbEntitiesNoInfoObjectsNoAirports = AllIcaoAndCountries | DistributorLiveryModel //!< All DB entities, no info objects and airports + AllIcaoEntities = AircraftIcaoEntity | AirlineIcaoEntity, //!< all ICAO codes + AllIcaoAndCountries = AircraftIcaoEntity | AirlineIcaoEntity | CountryEntity, //!< all ICAO codes and countries + DistributorLiveryModel = DistributorEntity | LiveryEntity | ModelEntity, //!< Combinded + AllDbEntities = AllIcaoAndCountries | DistributorLiveryModel | InfoObjectEntity | AirportEntity, //!< All DB stuff + AllDbEntitiesNoInfoObjects = AllIcaoAndCountries | DistributorLiveryModel | AirportEntity, //!< All DB entities, no info objects + AllDbEntitiesNoInfoObjectsNoAirports = AllIcaoAndCountries | DistributorLiveryModel //!< All DB entities, no info objects and airports }; Q_DECLARE_FLAGS(Entity, EntityFlag)