Switch to use ComponentManager for traits/components
Removed the old StateManager, CommandManager and related classes
and switched over to using ComponentManager for all device trait and
component definitions as well as device state.
Change-Id: I99b99a935ba217703d31aa523a3124cca0fa3e90
Reviewed-on: https://weave-review.googlesource.com/1788
Reviewed-by: Alex Vakulenko <avakulenko@google.com>
diff --git a/src/privet/cloud_delegate.cc b/src/privet/cloud_delegate.cc
index 139bfc6..9c8a619 100644
--- a/src/privet/cloud_delegate.cc
+++ b/src/privet/cloud_delegate.cc
@@ -15,11 +15,10 @@
#include <weave/provider/task_runner.h>
#include "src/backoff_entry.h"
-#include "src/commands/command_manager.h"
+#include "src/component_manager.h"
#include "src/config.h"
#include "src/device_registration_info.h"
#include "src/privet/constants.h"
-#include "src/states/state_manager.h"
namespace weave {
namespace privet {
@@ -42,26 +41,28 @@
public:
CloudDelegateImpl(provider::TaskRunner* task_runner,
DeviceRegistrationInfo* device,
- CommandManager* command_manager,
- StateManager* state_manager)
+ ComponentManager* component_manager)
: task_runner_{task_runner},
device_{device},
- command_manager_{command_manager},
- state_manager_{state_manager} {
+ component_manager_{component_manager} {
device_->GetMutableConfig()->AddOnChangedCallback(base::Bind(
&CloudDelegateImpl::OnConfigChanged, weak_factory_.GetWeakPtr()));
device_->AddGcdStateChangedCallback(base::Bind(
&CloudDelegateImpl::OnRegistrationChanged, weak_factory_.GetWeakPtr()));
- command_manager_->AddCommandDefChanged(base::Bind(
- &CloudDelegateImpl::OnCommandDefChanged, weak_factory_.GetWeakPtr()));
- command_manager_->AddCommandAddedCallback(base::Bind(
+ component_manager_->AddTraitDefChangedCallback(base::Bind(
+ &CloudDelegateImpl::NotifyOnTraitDefsChanged,
+ weak_factory_.GetWeakPtr()));
+ component_manager_->AddCommandAddedCallback(base::Bind(
&CloudDelegateImpl::OnCommandAdded, weak_factory_.GetWeakPtr()));
- command_manager_->AddCommandRemovedCallback(base::Bind(
+ component_manager_->AddCommandRemovedCallback(base::Bind(
&CloudDelegateImpl::OnCommandRemoved, weak_factory_.GetWeakPtr()));
-
- state_manager_->AddChangedCallback(base::Bind(
- &CloudDelegateImpl::OnStateChanged, weak_factory_.GetWeakPtr()));
+ component_manager_->AddStateChangedCallback(base::Bind(
+ &CloudDelegateImpl::NotifyOnComponentTreeChanged,
+ weak_factory_.GetWeakPtr()));
+ component_manager_->AddComponentTreeChangedCallback(base::Bind(
+ &CloudDelegateImpl::NotifyOnComponentTreeChanged,
+ weak_factory_.GetWeakPtr()));
}
~CloudDelegateImpl() override = default;
@@ -139,10 +140,20 @@
: "";
}
- const base::DictionaryValue& GetState() const override { return state_; }
+ const base::DictionaryValue& GetLegacyCommandDef() const override {
+ return component_manager_->GetLegacyCommandDefinitions();
+ }
- const base::DictionaryValue& GetCommandDef() const override {
- return command_defs_;
+ const base::DictionaryValue& GetLegacyState() const override {
+ return component_manager_->GetLegacyState();
+ }
+
+ const base::DictionaryValue& GetComponents() const override {
+ return component_manager_->GetComponents();
+ }
+
+ const base::DictionaryValue& GetTraits() const override {
+ return component_manager_->GetTraits();
}
void AddCommand(const base::DictionaryValue& command,
@@ -162,11 +173,13 @@
}
std::string id;
- if (!command_manager_->AddCommand(command, role, &id, &error))
+ auto command_instance = component_manager_->ParseCommandInstance(
+ command, Command::Origin::kLocal, role, &id, &error);
+ if (!command_instance)
return callback.Run({}, std::move(error));
-
+ component_manager_->AddCommand(std::move(command_instance));
command_owners_[id] = user_info.user_id();
- callback.Run(*command_manager_->FindCommand(id)->ToJson(), nullptr);
+ callback.Run(*component_manager_->FindCommand(id)->ToJson(), nullptr);
}
void GetCommand(const std::string& id,
@@ -200,7 +213,7 @@
for (const auto& it : command_owners_) {
if (CanAccessCommand(it.second, user_info, nullptr)) {
list_value.Append(
- command_manager_->FindCommand(it.first)->ToJson().release());
+ component_manager_->FindCommand(it.first)->ToJson().release());
}
}
@@ -241,21 +254,6 @@
NotifyOnDeviceInfoChanged();
}
- void OnStateChanged() {
- state_.Clear();
- const auto& state = state_manager_->GetState();
- state_.MergeDictionary(&state);
- NotifyOnStateChanged();
- }
-
- void OnCommandDefChanged() {
- command_defs_.Clear();
- const base::DictionaryValue& commands =
- command_manager_->GetCommandDictionary().GetCommandsAsJson();
- command_defs_.MergeDictionary(&commands);
- NotifyOnCommandDefsChanged();
- }
-
void OnRegisterSuccess(const std::string& cloud_id) {
VLOG(1) << "Device registered: " << cloud_id;
setup_state_ = SetupState(SetupState::kSuccess);
@@ -304,7 +302,7 @@
return nullptr;
}
- auto command = command_manager_->FindCommand(command_id);
+ auto command = component_manager_->FindCommand(command_id);
if (!command)
return ReturnNotFound(command_id, error);
@@ -329,8 +327,7 @@
provider::TaskRunner* task_runner_{nullptr};
DeviceRegistrationInfo* device_{nullptr};
- CommandManager* command_manager_{nullptr};
- StateManager* state_manager_{nullptr};
+ ComponentManager* component_manager_{nullptr};
// Primary state of GCD.
ConnectionState connection_state_{ConnectionState::kDisabled};
@@ -338,12 +335,6 @@
// State of the current or last setup.
SetupState setup_state_{SetupState::kNone};
- // Current device state.
- base::DictionaryValue state_;
-
- // Current commands definitions.
- base::DictionaryValue command_defs_;
-
// Map of command IDs to user IDs.
std::map<std::string, uint64_t> command_owners_;
@@ -367,22 +358,21 @@
std::unique_ptr<CloudDelegate> CloudDelegate::CreateDefault(
provider::TaskRunner* task_runner,
DeviceRegistrationInfo* device,
- CommandManager* command_manager,
- StateManager* state_manager) {
+ ComponentManager* component_manager) {
return std::unique_ptr<CloudDelegateImpl>{new CloudDelegateImpl{
- task_runner, device, command_manager, state_manager}};
+ task_runner, device, component_manager}};
}
void CloudDelegate::NotifyOnDeviceInfoChanged() {
FOR_EACH_OBSERVER(Observer, observer_list_, OnDeviceInfoChanged());
}
-void CloudDelegate::NotifyOnCommandDefsChanged() {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnCommandDefsChanged());
+void CloudDelegate::NotifyOnTraitDefsChanged() {
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnTraitDefsChanged());
}
-void CloudDelegate::NotifyOnStateChanged() {
- FOR_EACH_OBSERVER(Observer, observer_list_, OnStateChanged());
+void CloudDelegate::NotifyOnComponentTreeChanged() {
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnComponentTreeChanged());
}
} // namespace privet
diff --git a/src/privet/cloud_delegate.h b/src/privet/cloud_delegate.h
index 6396519..e1b1887 100644
--- a/src/privet/cloud_delegate.h
+++ b/src/privet/cloud_delegate.h
@@ -22,9 +22,8 @@
namespace weave {
-class CommandManager;
+class ComponentManager;
class DeviceRegistrationInfo;
-class StateManager;
namespace provider {
class TaskRunner;
@@ -48,8 +47,8 @@
virtual ~Observer() {}
virtual void OnDeviceInfoChanged() {}
- virtual void OnCommandDefsChanged() {}
- virtual void OnStateChanged() {}
+ virtual void OnTraitDefsChanged() {}
+ virtual void OnComponentTreeChanged() {}
};
// Returns the ID of the device.
@@ -95,11 +94,17 @@
// Returns cloud id if the registered device or empty string if unregistered.
virtual std::string GetCloudId() const = 0;
- // Returns dictionary with device state.
- virtual const base::DictionaryValue& GetState() const = 0;
+ // Returns dictionary with device state (for legacy APIs).
+ virtual const base::DictionaryValue& GetLegacyState() const = 0;
- // Returns dictionary with commands definitions.
- virtual const base::DictionaryValue& GetCommandDef() const = 0;
+ // Returns dictionary with commands definitions (for legacy APIs).
+ virtual const base::DictionaryValue& GetLegacyCommandDef() const = 0;
+
+ // Returns dictionary with component tree.
+ virtual const base::DictionaryValue& GetComponents() const = 0;
+
+ // Returns dictionary with trait definitions.
+ virtual const base::DictionaryValue& GetTraits() const = 0;
// Adds command created from the given JSON representation.
virtual void AddCommand(const base::DictionaryValue& command,
@@ -126,15 +131,14 @@
}
void NotifyOnDeviceInfoChanged();
- void NotifyOnCommandDefsChanged();
- void NotifyOnStateChanged();
+ void NotifyOnTraitDefsChanged();
+ void NotifyOnComponentTreeChanged();
// Create default instance.
static std::unique_ptr<CloudDelegate> CreateDefault(
provider::TaskRunner* task_runner,
DeviceRegistrationInfo* device,
- CommandManager* command_manager,
- StateManager* state_manager);
+ ComponentManager* component_manager);
private:
base::ObserverList<Observer> observer_list_;
diff --git a/src/privet/mock_delegates.h b/src/privet/mock_delegates.h
index 2186f2f..0cfa4ed 100644
--- a/src/privet/mock_delegates.h
+++ b/src/privet/mock_delegates.h
@@ -153,8 +153,10 @@
MOCK_CONST_METHOD0(GetSetupState, const SetupState&());
MOCK_METHOD3(Setup, bool(const std::string&, const std::string&, ErrorPtr*));
MOCK_CONST_METHOD0(GetCloudId, std::string());
- MOCK_CONST_METHOD0(GetState, const base::DictionaryValue&());
- MOCK_CONST_METHOD0(GetCommandDef, const base::DictionaryValue&());
+ MOCK_CONST_METHOD0(GetLegacyState, const base::DictionaryValue&());
+ MOCK_CONST_METHOD0(GetLegacyCommandDef, const base::DictionaryValue&());
+ MOCK_CONST_METHOD0(GetComponents, const base::DictionaryValue&());
+ MOCK_CONST_METHOD0(GetTraits, const base::DictionaryValue&());
MOCK_METHOD3(AddCommand,
void(const base::DictionaryValue&,
const UserInfo&,
@@ -185,8 +187,11 @@
EXPECT_CALL(*this, GetSetupState()).WillRepeatedly(ReturnRef(setup_state_));
EXPECT_CALL(*this, GetCloudId()).WillRepeatedly(Return("TestCloudId"));
test_dict_.Set("test", new base::DictionaryValue);
- EXPECT_CALL(*this, GetCommandDef()).WillRepeatedly(ReturnRef(test_dict_));
- EXPECT_CALL(*this, GetState()).WillRepeatedly(ReturnRef(test_dict_));
+ EXPECT_CALL(*this, GetLegacyState()).WillRepeatedly(ReturnRef(test_dict_));
+ EXPECT_CALL(*this,
+ GetLegacyCommandDef()).WillRepeatedly(ReturnRef(test_dict_));
+ EXPECT_CALL(*this, GetTraits()).WillRepeatedly(ReturnRef(test_dict_));
+ EXPECT_CALL(*this, GetComponents()).WillRepeatedly(ReturnRef(test_dict_));
}
ConnectionState connection_state_{ConnectionState::kOnline};
diff --git a/src/privet/privet_handler.cc b/src/privet/privet_handler.cc
index 157feed..d609787 100644
--- a/src/privet/privet_handler.cc
+++ b/src/privet/privet_handler.cc
@@ -378,7 +378,7 @@
ReplyToUpdateRequest(req.callback);
}
-void PrivetHandler::OnCommandDefsChanged() {
+void PrivetHandler::OnTraitDefsChanged() {
++command_defs_fingerprint_;
auto pred = [this](const UpdateRequestParameters& params) {
return params.command_defs_fingerprint < 0;
@@ -390,7 +390,7 @@
update_requests_.erase(last, update_requests_.end());
}
-void PrivetHandler::OnStateChanged() {
+void PrivetHandler::OnComponentTreeChanged() {
++state_fingerprint_;
auto pred = [this](const UpdateRequestParameters& params) {
return params.state_fingerprint < 0;
@@ -762,8 +762,7 @@
const UserInfo& user_info,
const RequestCallback& callback) {
base::DictionaryValue output;
- base::DictionaryValue* defs = cloud_->GetState().DeepCopy();
- output.Set(kStateKey, defs);
+ output.Set(kStateKey, cloud_->GetLegacyState().DeepCopy());
output.SetString(kFingerprintKey, std::to_string(state_fingerprint_));
callback.Run(http::kOk, output);
@@ -773,8 +772,7 @@
const UserInfo& user_info,
const RequestCallback& callback) {
base::DictionaryValue output;
- base::DictionaryValue* defs = cloud_->GetCommandDef().DeepCopy();
- output.Set(kCommandsKey, defs);
+ output.Set(kCommandsKey, cloud_->GetLegacyCommandDef().DeepCopy());
output.SetString(kFingerprintKey, std::to_string(command_defs_fingerprint_));
callback.Run(http::kOk, output);
diff --git a/src/privet/privet_handler.h b/src/privet/privet_handler.h
index fb9cc94..cc80d43 100644
--- a/src/privet/privet_handler.h
+++ b/src/privet/privet_handler.h
@@ -45,8 +45,8 @@
WifiDelegate* wifi);
~PrivetHandler() override;
- void OnCommandDefsChanged() override;
- void OnStateChanged() override;
+ void OnTraitDefsChanged() override;
+ void OnComponentTreeChanged() override;
std::vector<std::string> GetHttpPaths() const;
std::vector<std::string> GetHttpsPaths() const;
diff --git a/src/privet/privet_handler_unittest.cc b/src/privet/privet_handler_unittest.cc
index c212e54..517dda8 100644
--- a/src/privet/privet_handler_unittest.cc
+++ b/src/privet/privet_handler_unittest.cc
@@ -630,7 +630,7 @@
EXPECT_PRED2(IsEqualJson, "{'state': {'test': {}}, 'fingerprint': '0'}",
HandleRequest("/privet/v3/state", "{}"));
- cloud_.NotifyOnStateChanged();
+ cloud_.NotifyOnComponentTreeChanged();
EXPECT_PRED2(IsEqualJson, "{'state': {'test': {}}, 'fingerprint': '1'}",
HandleRequest("/privet/v3/state", "{}"));
@@ -640,7 +640,7 @@
EXPECT_PRED2(IsEqualJson, "{'commands': {'test':{}}, 'fingerprint': '0'}",
HandleRequest("/privet/v3/commandDefs", "{}"));
- cloud_.NotifyOnCommandDefsChanged();
+ cloud_.NotifyOnTraitDefsChanged();
EXPECT_PRED2(IsEqualJson, "{'commands': {'test':{}}, 'fingerprint': '1'}",
HandleRequest("/privet/v3/commandDefs", "{}"));
@@ -735,8 +735,8 @@
TEST_F(PrivetHandlerSetupTest, CheckForUpdates_NoInput) {
EXPECT_CALL(device_, GetHttpRequestTimeout())
.WillOnce(Return(base::TimeDelta::Max()));
- cloud_.NotifyOnCommandDefsChanged();
- cloud_.NotifyOnStateChanged();
+ cloud_.NotifyOnTraitDefsChanged();
+ cloud_.NotifyOnComponentTreeChanged();
const char kInput[] = "{}";
const char kExpected[] = R"({
'commandsFingerprint': '1',
@@ -750,8 +750,8 @@
TEST_F(PrivetHandlerSetupTest, CheckForUpdates_AlreadyChanged) {
EXPECT_CALL(device_, GetHttpRequestTimeout())
.WillOnce(Return(base::TimeDelta::Max()));
- cloud_.NotifyOnCommandDefsChanged();
- cloud_.NotifyOnStateChanged();
+ cloud_.NotifyOnTraitDefsChanged();
+ cloud_.NotifyOnComponentTreeChanged();
const char kInput[] = R"({
'commandsFingerprint': '0',
'stateFingerprint': '0'
@@ -775,7 +775,7 @@
EXPECT_PRED2(IsEqualJson, "{}",
HandleRequest("/privet/v3/checkForUpdates", kInput));
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnCommandDefsChanged();
+ cloud_.NotifyOnTraitDefsChanged();
EXPECT_EQ(1, GetResponseCount());
const char kExpected[] = R"({
'commandsFingerprint': '1',
@@ -794,7 +794,7 @@
EXPECT_PRED2(IsEqualJson, "{}",
HandleRequest("/privet/v3/checkForUpdates", kInput));
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnStateChanged();
+ cloud_.NotifyOnComponentTreeChanged();
EXPECT_EQ(1, GetResponseCount());
const char kExpected[] = R"({
'commandsFingerprint': '0',
@@ -812,9 +812,9 @@
EXPECT_PRED2(IsEqualJson, "{}",
HandleRequest("/privet/v3/checkForUpdates", kInput));
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnCommandDefsChanged();
+ cloud_.NotifyOnTraitDefsChanged();
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnStateChanged();
+ cloud_.NotifyOnComponentTreeChanged();
EXPECT_EQ(1, GetResponseCount());
const char kExpected[] = R"({
'commandsFingerprint': '1',
@@ -832,9 +832,9 @@
EXPECT_PRED2(IsEqualJson, "{}",
HandleRequest("/privet/v3/checkForUpdates", kInput));
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnStateChanged();
+ cloud_.NotifyOnComponentTreeChanged();
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnCommandDefsChanged();
+ cloud_.NotifyOnTraitDefsChanged();
EXPECT_EQ(1, GetResponseCount());
const char kExpected[] = R"({
'commandsFingerprint': '1',
@@ -953,7 +953,7 @@
EXPECT_PRED2(IsEqualJson, "{}",
HandleRequest("/privet/v3/checkForUpdates", kInput));
EXPECT_EQ(0, GetResponseCount());
- cloud_.NotifyOnCommandDefsChanged();
+ cloud_.NotifyOnTraitDefsChanged();
EXPECT_EQ(1, GetResponseCount());
const char kExpected[] = R"({
'commandsFingerprint': '1',
diff --git a/src/privet/privet_manager.cc b/src/privet/privet_manager.cc
index e3485c0..a308eec 100644
--- a/src/privet/privet_manager.cc
+++ b/src/privet/privet_manager.cc
@@ -18,6 +18,7 @@
#include <weave/provider/network.h>
#include "src/bind_lambda.h"
+#include "src/component_manager.h"
#include "src/device_registration_info.h"
#include "src/http_constants.h"
#include "src/privet/auth_manager.h"
@@ -47,15 +48,14 @@
HttpServer* http_server,
Wifi* wifi,
DeviceRegistrationInfo* device,
- CommandManager* command_manager,
- StateManager* state_manager) {
+ ComponentManager* component_manager) {
disable_security_ = device->GetSettings().disable_security;
device_ = DeviceDelegate::CreateDefault(
task_runner_, http_server->GetHttpPort(), http_server->GetHttpsPort(),
http_server->GetRequestTimeout());
- cloud_ = CloudDelegate::CreateDefault(task_runner_, device, command_manager,
- state_manager);
+ cloud_ = CloudDelegate::CreateDefault(task_runner_, device,
+ component_manager);
cloud_observer_.Add(cloud_.get());
auth_.reset(new AuthManager(device->GetSettings().secret,
diff --git a/src/privet/privet_manager.h b/src/privet/privet_manager.h
index 95dbbb8..1342584 100644
--- a/src/privet/privet_manager.h
+++ b/src/privet/privet_manager.h
@@ -27,11 +27,10 @@
namespace weave {
-class CommandManager;
+class ComponentManager;
class DeviceRegistrationInfo;
class DnsServiceDiscovery;
class Network;
-class StateManager;
namespace privet {
@@ -52,8 +51,7 @@
provider::HttpServer* http_server,
provider::Wifi* wifi,
DeviceRegistrationInfo* device,
- CommandManager* command_manager,
- StateManager* state_manager);
+ ComponentManager* component_manager);
std::string GetCurrentlyConnectedSsid() const;