30 #include <boost/filesystem/fstream.hpp>
32 #include <rsc/config/Configuration.h>
33 #include <rsc/config/Environment.h>
35 #include <rsc/logging/OptionBasedConfigurator.h>
37 #include <rsc/plugins/Manager.h>
38 #include <rsc/plugins/Configurator.h>
40 #include <rsb/Version.h>
54 using namespace rsc::config;
55 using namespace rsc::logging;
56 using namespace rsc::runtime;
58 using namespace rsb::converter;
59 using namespace rsb::transport;
69 std::map<
typename C::value_type::first_type,
70 typename C::value_type::second_type>
72 typedef typename C::value_type::first_type first_type;
73 typedef typename C::value_type::second_type second_type;
75 typedef typename C::const_iterator const_iterator;
77 std::map<first_type, second_type> result;
78 for (const_iterator it = container.begin(); it != container.end(); ++it) {
81 result[it->first] = it->second;
84 if (result.find(it->second) != result.end()) {
85 throw std::invalid_argument(
88 "Multiple wire-schemas (%1%, %2%) selected for data-type %3%.\n"
89 "Probably you wrote the lines transport.<name>.cpp.%1% = %3% "
90 "and transport.<name>.cpp.%2% = %3% in you rsb config. One of "
91 "these should be deleted.")
98 result[it->second] = it->first;
102 throw std::runtime_error(
"got unexpected serialization direction");
111 rsc::logging::LoggerPtr logger) {
113 RSCDEBUG(logger,
"Supplied connector options " << options);
126 RSCDEBUG(logger,
"Converter configuration for transport `"
133 = converterRepository<string>()
134 ->getConvertersForSerialization
135 (converterSelectionToMap(config.
getConverters(), direction));
137 case DESERIALIZATION:
139 = converterRepository<string>()
140 ->getConvertersForDeserialization
141 (converterSelectionToMap(config.
getConverters(), direction));
145 throw std::runtime_error(
"got unexpected serialization direction");
147 RSCDEBUG(logger,
"Selected converters for transport `"
148 << config.
getName() <<
"': " << converters);
149 options[
"converters"] = converters;
159 Factory& Factory::getInstance() {
164 return Factory::getInstanceBase();
168 return rsc::patterns::Singleton<Factory>::getInstance();
172 logger(Logger::getLogger(
"rsb.Factory")),
173 pluginManager(new rsc::plugins::Manager()) {
177 rsc::logging::OptionBasedConfigurator configurator;
178 configure(configurator,
"rsb.conf",
"RSC_", 0, 0,
false, Version::installPrefix());
182 RSCINFO(this->logger,
"Registering default implementations");
193 RSCINFO(this->logger,
"Processing plugin configuration");
195 string versioned = str(boost::format(
"rsb%1%.%2%")
197 % RSB_VERSION_MINOR);
198 vector<boost::filesystem::path> defaultPath;
202 defaultPath.push_back(userHomeDirectory() / (
"." + versioned) /
"plugins");
203 }
catch (
const runtime_error& e) {
204 RSCWARN(this->logger,
205 "Failed to determine user-specific plugin directory: "
208 defaultPath.push_back(Version::libdir() / versioned /
"plugins");
209 rsc::plugins::Configurator configurator(
pluginManager, defaultPath);
210 configure(configurator,
"rsb.conf",
"RSB_", 0, 0,
true, Version::installPrefix());
224 for (set<string>::const_iterator it = availableTransports.begin();
225 it != availableTransports.end(); ++it) {
238 configure(this->
defaultConfig,
"rsb.conf",
"RSB_", 0, 0,
true, Version::installPrefix());
244 RSCWARN(logger,
"No transports are enabled. This is probably a configuration error or an internal RSB error.");
254 const string& dataType,
285 boost::recursive_mutex::scoped_lock lock(
configMutex);
290 boost::recursive_mutex::scoped_lock lock(
configMutex);
298 vector<InPullConnectorPtr>
301 vector<InPullConnectorPtr> connectors;
302 set<ParticipantConfig::Transport> configuredTransports = config.
getTransports();
303 for (set<ParticipantConfig::Transport>::const_iterator transportIt =
304 configuredTransports.begin(); transportIt
305 != configuredTransports.end(); ++transportIt) {
306 RSCDEBUG(logger,
"Trying to add connector " << *transportIt);
309 .createInst(transportIt->getName(),
310 prepareConnectorOptions(*transportIt,
313 }
catch (
const exception& e) {
314 throw runtime_error(boost::str(boost::format(
"Error configuring connector `%1%', in-pull: %2%")
315 % transportIt->getName() % e.what()));
321 vector<InPushConnectorPtr>
324 vector<InPushConnectorPtr> connectors;
325 set<ParticipantConfig::Transport> configuredTransports = config.
getTransports();
326 for (set<ParticipantConfig::Transport>::const_iterator transportIt =
327 configuredTransports.begin(); transportIt
328 != configuredTransports.end(); ++transportIt) {
329 RSCDEBUG(logger,
"Trying to add connector " << *transportIt);
332 .createInst(transportIt->getName(),
333 prepareConnectorOptions(*transportIt,
336 }
catch (
const exception& e) {
337 throw runtime_error(boost::str(boost::format(
"Error configuring connector `%1%', in-push: %2%")
338 % transportIt->getName() % e.what()));
344 vector<OutConnectorPtr>
347 vector<OutConnectorPtr> connectors;
348 set<ParticipantConfig::Transport> configuredTransports = config.
getTransports();
349 for (set<ParticipantConfig::Transport>::const_iterator transportIt =
350 configuredTransports.begin(); transportIt
351 != configuredTransports.end(); ++transportIt) {
352 RSCDEBUG(logger,
"Trying to add connector " << *transportIt);
355 .createInst(transportIt->getName(),
356 prepareConnectorOptions(*transportIt,
359 }
catch (
const exception& e) {
360 throw runtime_error(boost::str(boost::format(
"Error configuring connector `%1%', out: %2%")
361 % transportIt->getName() % e.what()));