From 1531a38297aba844e3de56726165807ca2678555 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Wed, 8 Apr 2020 13:57:31 +0200 Subject: [PATCH] Make the duplicate UUID check more strict --- .../integrations/thingmanagerimplementation.cpp | 4 ++-- libnymea/integrations/pluginmetadata.cpp | 13 +++++++++---- libnymea/integrations/pluginmetadata.h | 3 ++- tools/nymea-plugininfocompiler/main.cpp | 5 ++++- .../nymea-plugininfocompiler/plugininfocompiler.cpp | 4 ++-- tools/nymea-plugininfocompiler/plugininfocompiler.h | 2 +- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/libnymea-core/integrations/thingmanagerimplementation.cpp b/libnymea-core/integrations/thingmanagerimplementation.cpp index 4f0d4380..71482546 100644 --- a/libnymea-core/integrations/thingmanagerimplementation.cpp +++ b/libnymea-core/integrations/thingmanagerimplementation.cpp @@ -1106,7 +1106,7 @@ void ThingManagerImplementation::loadPlugins() } QJsonObject pluginInfo = loader.metaData().value("MetaData").toObject(); - PluginMetadata metaData(pluginInfo); + PluginMetadata metaData(pluginInfo, false, false); if (!metaData.isValid()) { foreach (const QString &error, metaData.validationErrors()) { qCWarning(dcThingManager()) << error; @@ -1281,7 +1281,7 @@ void ThingManagerImplementation::loadConfiguredThings() // Try to load the device class from the cache QJsonObject pluginInfo = PluginInfoCache::loadPluginInfo(pluginId); if (!pluginInfo.empty()) { - PluginMetadata pluginMetadata(pluginInfo); + PluginMetadata pluginMetadata(pluginInfo, false, false); thingClass = pluginMetadata.thingClasses().findById(thingClassId); if (thingClass.isValid()) { m_supportedThings.insert(thingClassId, thingClass); diff --git a/libnymea/integrations/pluginmetadata.cpp b/libnymea/integrations/pluginmetadata.cpp index 65af11dd..2ca587ce 100644 --- a/libnymea/integrations/pluginmetadata.cpp +++ b/libnymea/integrations/pluginmetadata.cpp @@ -46,7 +46,9 @@ PluginMetadata::PluginMetadata() } -PluginMetadata::PluginMetadata(const QJsonObject &jsonObject, bool isBuiltIn): m_isBuiltIn(isBuiltIn) +PluginMetadata::PluginMetadata(const QJsonObject &jsonObject, bool isBuiltIn, bool strict): + m_isBuiltIn(isBuiltIn), + m_strictRun(strict) { parse(jsonObject); } @@ -834,9 +836,12 @@ QPair PluginMetadata::loadAndVerifyInputType(const QStri bool PluginMetadata::verifyDuplicateUuid(const QUuid &uuid) { if (m_allUuids.contains(uuid)) { - // FIXME: Drop debug, activate return! (see .h for more context) - qCWarning(dcPluginMetadata()) << "THIS PLUGIN USES DUPLICATE UUID" << uuid.toString() << "! THIS WILL STOP WORKING SOON."; -// return false; + // FIXME: Drop non-strict run! (see .h for more context) + if (m_strictRun) { + return false; + } else { + qCWarning(dcPluginMetadata()) << "THIS PLUGIN USES DUPLICATE UUID" << uuid.toString() << "! THIS IS NOT SUPPORTED AND MAY CAUSE RUNTIME ISSUES."; + } } if (m_currentScopUuids.contains(uuid)) { return false; diff --git a/libnymea/integrations/pluginmetadata.h b/libnymea/integrations/pluginmetadata.h index 2febed74..e95937e2 100644 --- a/libnymea/integrations/pluginmetadata.h +++ b/libnymea/integrations/pluginmetadata.h @@ -38,7 +38,7 @@ class PluginMetadata { public: PluginMetadata(); - PluginMetadata(const QJsonObject &jsonObject, bool isBuiltIn = false); + PluginMetadata(const QJsonObject &jsonObject, bool isBuiltIn = false, bool strict = true); bool isValid() const; QStringList validationErrors() const; @@ -80,6 +80,7 @@ private: // As strict as possible without breaking them, but this should be removed ASAP // and only m_allUuids should be used to check for dupes QList m_currentScopUuids; + bool m_strictRun = true; QStringList m_validationErrors; }; diff --git a/tools/nymea-plugininfocompiler/main.cpp b/tools/nymea-plugininfocompiler/main.cpp index 4a0bbd45..847e16e0 100644 --- a/tools/nymea-plugininfocompiler/main.cpp +++ b/tools/nymea-plugininfocompiler/main.cpp @@ -45,6 +45,7 @@ int main(int argc, char *argv[]) parser.addOption({{"o", "output"}, "Write generated output header to .", "file"}); parser.addOption({{"e", "extern"}, "Write generated output header (extern definitions) to .", "file"}); parser.addOption({{"t", "translations"}, "Write generated translations file stub to .", "directory"}); + parser.addOption({{"n", "non-strict"}, "Non-strict run. Don't exit on duplicate UUID warnings."}); parser.addPositionalArgument("input", "The input json file"); parser.process(a); @@ -54,9 +55,11 @@ int main(int argc, char *argv[]) return 1; } + bool strictMode = !parser.isSet("non-strict"); + PluginInfoCompiler pic; - int ret = pic.compile(parser.positionalArguments().first(), parser.value("output"), parser.value("extern"), parser.value("translations")); + int ret = pic.compile(parser.positionalArguments().first(), parser.value("output"), parser.value("extern"), parser.value("translations"), strictMode); return ret; diff --git a/tools/nymea-plugininfocompiler/plugininfocompiler.cpp b/tools/nymea-plugininfocompiler/plugininfocompiler.cpp index fecc0025..5c8fd059 100644 --- a/tools/nymea-plugininfocompiler/plugininfocompiler.cpp +++ b/tools/nymea-plugininfocompiler/plugininfocompiler.cpp @@ -43,7 +43,7 @@ PluginInfoCompiler::PluginInfoCompiler() } -int PluginInfoCompiler::compile(const QString &inputFile, const QString &outputFile, const QString outputFileExtern, const QString &translationsPath) +int PluginInfoCompiler::compile(const QString &inputFile, const QString &outputFile, const QString outputFileExtern, const QString &translationsPath, bool strictMode) { // First, process the input json... QFile jsonFile(inputFile); @@ -81,7 +81,7 @@ int PluginInfoCompiler::compile(const QString &inputFile, const QString &outputF } QJsonObject jsonObject = QJsonObject::fromVariantMap(jsonDoc.toVariant().toMap()); - PluginMetadata metadata(jsonObject); + PluginMetadata metadata(jsonObject, false, strictMode); if (!metadata.isValid()) { foreach (const QString &error, metadata.validationErrors()) { QDebug dbg = qWarning().noquote().nospace(); diff --git a/tools/nymea-plugininfocompiler/plugininfocompiler.h b/tools/nymea-plugininfocompiler/plugininfocompiler.h index a87592bd..8dfc8394 100644 --- a/tools/nymea-plugininfocompiler/plugininfocompiler.h +++ b/tools/nymea-plugininfocompiler/plugininfocompiler.h @@ -42,7 +42,7 @@ class PluginInfoCompiler public: PluginInfoCompiler(); - int compile(const QString &inputFile, const QString &outputFile, const QString outputFileExtern, const QString &translationsPath); + int compile(const QString &inputFile, const QString &outputFile, const QString outputFileExtern, const QString &translationsPath, bool strictMode); private: