diff --git a/Makefile.am b/Makefile.am index bf0ad8f..13a9fcd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -81,6 +81,10 @@ EVENTS = \ src/events/reverse-proxy.cc \ src/events/reverse-proxy.hh +LEGISLATOR = \ + src/legislator/legislator.cc \ + src/legislator/legislator-factory.cc + SOCKET = \ src/socket/default-socket.cc \ src/socket/default-socket.hh \ @@ -88,6 +92,7 @@ SOCKET = \ SOURCES = \ $(CONFIG) \ + $(LEGISLATOR) \ $(MISC) \ $(SOCKET) \ $(SCHEDULER) \ diff --git a/src/config/config.cc b/src/config/config.cc index 7ca7cb4..6cf1ad1 100644 --- a/src/config/config.cc +++ b/src/config/config.cc @@ -8,8 +8,9 @@ namespace paxos { - ServerConfig::ServerConfig(const std::vector& legislators) - : legislators_(legislators) + ServerConfig::ServerConfig(const std::vector& legislators, + const LegislatorConfig& self) + : legislators_(legislators), self_(self) { } @@ -61,7 +62,8 @@ namespace paxos } - static std::vector parse_legislators(const json& j) + static std::pair, LegislatorConfig> + parse_legislators(const json& j) { /* Get 'vhosts' value */ std::vector legislators; @@ -69,16 +71,20 @@ namespace paxos /* Create VHostConfig vector and fill with VHostConfig */ std::vector legislator_configs; + LegislatorConfig self; for (auto it : legislators) { /* Differenciable vhost checking */ auto legislator = it.get(); - - legislator_configs.push_back(legislator); + if (!legislator.is_self) + legislator_configs.push_back(legislator); + else + self = legislator; } - return legislator_configs; + return std::pair, LegislatorConfig> + (legislator_configs, self); } @@ -105,8 +111,8 @@ namespace paxos error_and_exit(1, e.what()); } - std::vector legislators = parse_legislators(json_dict); + auto legislators = parse_legislators(json_dict); - return ServerConfig(legislators); + return ServerConfig(legislators.first, legislators.second); } } diff --git a/src/config/config.hh b/src/config/config.hh index a630744..456efc1 100644 --- a/src/config/config.hh +++ b/src/config/config.hh @@ -16,10 +16,13 @@ namespace paxos struct ServerConfig { - ServerConfig(const std::vector& legislators); + ServerConfig(const std::vector& legislators, + const LegislatorConfig& self); std::vector legislators_; + LegislatorConfig self_; + static ServerConfig parse(const std::string& path); }; } diff --git a/src/legislator/legislator-factory.cc b/src/legislator/legislator-factory.cc new file mode 100644 index 0000000..ebd6d8c --- /dev/null +++ b/src/legislator/legislator-factory.cc @@ -0,0 +1,12 @@ +#include + +#include "legislator-factory.hh" + +namespace paxos +{ + shared_legislator LegislatorFactory::Create(LegislatorConfig& config) + { + auto shared = std::make_shared(config); + return shared; + } +} diff --git a/src/legislator/legislator-factory.hh b/src/legislator/legislator-factory.hh new file mode 100644 index 0000000..306b65f --- /dev/null +++ b/src/legislator/legislator-factory.hh @@ -0,0 +1,13 @@ +#pragma once + +#include "legislator.hh" +#include "config/config.hh" + +namespace paxos +{ + class LegislatorFactory + { + public: + static shared_legislator Create(LegislatorConfig& config); + }; +} diff --git a/src/legislator/legislator.cc b/src/legislator/legislator.cc index e69de29..c81dc0e 100644 --- a/src/legislator/legislator.cc +++ b/src/legislator/legislator.cc @@ -0,0 +1,9 @@ +#include "legislator.hh" + +namespace paxos +{ + Legislator::Legislator(const LegislatorConfig& config) + : config_(config) + { + } +} diff --git a/src/legislator/legislator.hh b/src/legislator/legislator.hh index 2b29dfd..b011d84 100644 --- a/src/legislator/legislator.hh +++ b/src/legislator/legislator.hh @@ -1,12 +1,14 @@ #pragma once -#include "legislator-config.hh" +#include "config/config.hh" namespace paxos { class Legislator { public: - LegislatorConfig config; + Legislator(const LegislatorConfig& config); + LegislatorConfig config_; - } + }; + using shared_legislator = std::shared_ptr; } diff --git a/src/main.cc b/src/main.cc index fbeaeab..ca67a40 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,10 +1,15 @@ #include #include "config/config.hh" +#include "legislator/legislator-factory.hh" int main(int, char **argv) { - paxos::ServerConfig config = paxos::ServerConfig::parse(argv[1]); - std::cout << config.legislators_[0].name << "\n"; + paxos::ServerConfig server_config = paxos::ServerConfig::parse(argv[1]); + + for (auto config : server_config.legislators_) + { + paxos::LegislatorFactory::Create(config); + } }