Removed dependency to TriggerManager
introduces Messanger class which allows to send messages directly to
subscribed targets, which allows to break dependencies between classes.
Testes:
- All unit tests are passing
- Links are correctly updated
- Report is correctly updated by Trigger Action
Signed-off-by: Krzysztof Grobelny <krzysztof.grobelny@intel.com>
Change-Id: I32d3aaba22f9ec07e611f53fe553bd27e1c04c6d
diff --git a/src/trigger.cpp b/src/trigger.cpp
index 34609b3..6982267 100644
--- a/src/trigger.cpp
+++ b/src/trigger.cpp
@@ -1,8 +1,11 @@
#include "trigger.hpp"
+#include "messages/collect_trigger_id.hpp"
+#include "messages/trigger_presence_changed_ind.hpp"
#include "trigger_manager.hpp"
#include "types/report_types.hpp"
#include "types/trigger_types.hpp"
+#include "utils/contains.hpp"
#include "utils/conversion_trigger.hpp"
#include "utils/transform.hpp"
@@ -17,15 +20,14 @@
std::vector<std::shared_ptr<interfaces::Threshold>>&& thresholdsIn,
interfaces::TriggerManager& triggerManager,
interfaces::JsonStorage& triggerStorageIn,
- const interfaces::TriggerFactory& triggerFactory, Sensors sensorsIn,
- interfaces::ReportManager& reportManagerIn) :
+ const interfaces::TriggerFactory& triggerFactory, Sensors sensorsIn) :
id(idIn),
name(nameIn), triggerActions(std::move(triggerActionsIn)),
path(triggerDir + id), reportIds(std::move(reportIdsIn)),
thresholds(std::move(thresholdsIn)),
fileName(std::to_string(std::hash<std::string>{}(id))),
triggerStorage(triggerStorageIn), sensors(std::move(sensorsIn)),
- reportManager(reportManagerIn)
+ messanger(ioc)
{
deleteIface = objServer->add_unique_interface(
path, deleteIfaceName, [this, &ioc, &triggerManager](auto& dbusIface) {
@@ -34,11 +36,8 @@
{
triggerStorage.remove(fileName);
}
- for (const auto& reportId : *reportIds)
- {
- reportManager.updateTriggerIds(reportId, id,
- TriggerIdUpdate::Remove);
- }
+ messanger.send(messages::TriggerPresenceChangedInd{
+ messages::Presence::Removed, id, {}});
boost::asio::post(ioc, [this, &triggerManager] {
triggerManager.removeTrigger(this);
});
@@ -114,10 +113,9 @@
sdbusplus::vtable::property_::emits_change,
[this](auto newVal, auto& oldVal) {
TriggerManager::verifyReportIds(newVal);
- updateTriggerIdsInReports(newVal);
- reportIds->clear();
- std::copy(newVal.begin(), newVal.end(),
- std::back_inserter(*reportIds));
+ *reportIds = newVal;
+ messanger.send(messages::TriggerPresenceChangedInd{
+ messages::Presence::Exist, id, *reportIds});
oldVal = std::move(newVal);
return 1;
},
@@ -155,10 +153,16 @@
threshold->initialize();
}
- for (const auto& reportId : *reportIds)
- {
- reportManager.updateTriggerIds(reportId, id, TriggerIdUpdate::Add);
- }
+ messanger.on_receive<messages::CollectTriggerIdReq>(
+ [this](const auto& msg) {
+ if (utils::contains(*reportIds, msg.reportId))
+ {
+ messanger.send(messages::CollectTriggerIdResp{id});
+ }
+ });
+
+ messanger.send(messages::TriggerPresenceChangedInd{
+ messages::Presence::Exist, id, *reportIds});
}
bool Trigger::storeConfiguration() const
@@ -200,26 +204,3 @@
}
return true;
}
-
-void Trigger::updateTriggerIdsInReports(
- const std::vector<std::string>& newReportIds)
-{
- std::vector<std::string> toBeRemoved, toBeAdded;
- size_t maxSize = std::max(reportIds->size(), newReportIds.size());
- toBeRemoved.reserve(maxSize);
- toBeAdded.reserve(maxSize);
- std::set_difference(reportIds->begin(), reportIds->end(),
- newReportIds.begin(), newReportIds.end(),
- std::back_inserter(toBeRemoved));
- std::set_difference(newReportIds.begin(), newReportIds.end(),
- reportIds->begin(), reportIds->end(),
- std::back_inserter(toBeAdded));
- for (auto& reportId : toBeRemoved)
- {
- reportManager.updateTriggerIds(reportId, id, TriggerIdUpdate::Remove);
- }
- for (auto& reportId : toBeAdded)
- {
- reportManager.updateTriggerIds(reportId, id, TriggerIdUpdate::Add);
- }
-}