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;
63 template<
unsigned int which,
typename C>
64 std::map<
typename C::value_type::first_type,
65 typename C::value_type::second_type> pairsToMap(
const C& container) {
66 typedef typename C::value_type::first_type first_type;
67 typedef typename C::value_type::second_type second_type;
69 typedef typename C::const_iterator const_iterator;
71 std::map<first_type, second_type> result;
72 for (const_iterator it = container.begin(); it != container.end(); ++it) {
74 result[it->first] = it->second;
76 result[it->second] = it->first;
85 Factory& Factory::getInstance() {
90 return Factory::getInstanceBase();
94 return rsc::patterns::Singleton<Factory>::getInstance();
98 logger(Logger::getLogger(
"rsb.Factory")),
99 pluginManager(new rsc::plugins::Manager()) {
103 rsc::logging::OptionBasedConfigurator configurator;
104 configure(configurator,
"rsb.conf",
"RSC_", 0, 0,
false, Version::installPrefix());
108 RSCINFO(this->
logger,
"Registering default implementations");
119 RSCINFO(this->
logger,
"Processing plugin configuration");
121 string versioned = str(boost::format(
"rsb%1%.%2%")
123 % RSB_VERSION_MINOR);
124 vector<boost::filesystem::path> defaultPath;
128 defaultPath.push_back(userHomeDirectory() / (
"." + versioned) /
"plugins");
129 }
catch (
const runtime_error& e) {
131 "Failed to determine user-specific plugin directory: "
134 defaultPath.push_back(Version::libdir() / versioned /
"plugins");
135 rsc::plugins::Configurator configurator(
pluginManager, defaultPath);
136 configure(configurator,
"rsb.conf",
"RSB_", 0, 0,
true, Version::installPrefix());
148 set<string> availableTransports;
151 for (set<InPullFactory::ConnectorInfo>::const_iterator it
152 = infos.begin(); it != infos.end(); ++it) {
153 availableTransports.insert(it->getName());
157 for (set<InPushFactory::ConnectorInfo>::const_iterator it
158 = infos.begin(); it != infos.end(); ++it) {
159 availableTransports.insert(it->getName());
163 for (set<OutFactory::ConnectorInfo>::const_iterator it
164 = infos.begin(); it != infos.end(); ++it) {
165 availableTransports.insert(it->getName());
170 for (set<string>::const_iterator it = availableTransports.begin();
171 it != availableTransports.end(); ++it) {
184 configure(this->
defaultConfig,
"rsb.conf",
"RSB_", 0, 0,
true, Version::installPrefix());
190 RSCWARN(
logger,
"No transports are enabled. This is probably a configuration error or an internal RSB error.");
200 const string& dataType,
231 boost::recursive_mutex::scoped_lock lock(
configMutex);
236 boost::recursive_mutex::scoped_lock lock(
configMutex);
244 vector<InPullConnectorPtr>
247 vector<InPullConnectorPtr> connectors;
248 set<ParticipantConfig::Transport> configuredTransports = config.
getTransports();
249 for (set<ParticipantConfig::Transport>::const_iterator transportIt =
250 configuredTransports.begin(); transportIt
251 != configuredTransports.end(); ++transportIt) {
252 RSCDEBUG(
logger,
"Trying to add connector " << *transportIt);
254 Properties options = transportIt->getOptions();
255 RSCDEBUG(
logger,
"Supplied connector options " << transportIt->getOptions());
258 if (!options.has(
"converters")) {
259 RSCDEBUG(
logger,
"Converter configuration for transport `"
260 << transportIt->getName() <<
"': " << transportIt->getConverters());
263 = converterRepository<string>()
264 ->getConvertersForDeserialization(pairsToMap<1> (transportIt->getConverters()));
265 RSCDEBUG(
logger,
"Selected converters for transport `"
266 << transportIt->getName() <<
"': " << converters);
267 options[
"converters"] = converters;
270 }
catch (
const exception& e) {
271 throw runtime_error(boost::str(boost::format(
"Error configuring connector `%1%', in-pull: %2%")
272 % transportIt->getName() % e.what()));
278 vector<InPushConnectorPtr>
281 vector<InPushConnectorPtr> connectors;
282 set<ParticipantConfig::Transport> configuredTransports = config.
getTransports();
283 for (set<ParticipantConfig::Transport>::const_iterator transportIt =
284 configuredTransports.begin(); transportIt
285 != configuredTransports.end(); ++transportIt) {
286 RSCDEBUG(
logger,
"Trying to add connector " << *transportIt);
288 Properties options = transportIt->getOptions();
289 RSCDEBUG(
logger,
"Supplied connector options " << transportIt->getOptions());
292 if (!options.has(
"converters")) {
293 RSCDEBUG(
logger,
"Converter configuration for transport `"
294 << transportIt->getName() <<
"': " << transportIt->getConverters());
297 = converterRepository<string>()
298 ->getConvertersForDeserialization(pairsToMap<1> (transportIt->getConverters()));
299 RSCDEBUG(
logger,
"Selected converters for transport `"
300 << transportIt->getName() <<
"': " << converters);
301 options[
"converters"] = converters;
304 }
catch (
const exception& e) {
305 throw runtime_error(boost::str(boost::format(
"Error configuring connector `%1%', in-push: %2%")
306 % transportIt->getName() % e.what()));
312 vector<OutConnectorPtr>
315 vector<OutConnectorPtr> connectors;
316 set<ParticipantConfig::Transport> configuredTransports = config.
getTransports();
317 for (set<ParticipantConfig::Transport>::const_iterator transportIt =
318 configuredTransports.begin(); transportIt
319 != configuredTransports.end(); ++transportIt) {
320 RSCDEBUG(
logger,
"Trying to add connector " << *transportIt);
322 Properties options = transportIt->getOptions();
323 RSCDEBUG(
logger,
"Supplied connector options " << transportIt->getOptions());
326 if (!options.has(
"converters")) {
327 RSCDEBUG(
logger,
"Converter configuration for transport `"
328 << transportIt->getName() <<
"': " << transportIt->getConverters());
331 = converterRepository<string>()
332 ->getConvertersForSerialization(pairsToMap<2> (transportIt->getConverters()));
333 RSCDEBUG(
logger,
"Selected converters for transport `"
334 << transportIt->getName() <<
"': " << converters);
335 options[
"converters"] = converters;
338 }
catch (
const exception& e) {
339 throw runtime_error(boost::str(boost::format(
"Error configuring connector `%1%', out: %2%")
340 % transportIt->getName() % e.what()));
patterns::RemoteServerPtr createRemoteServer(const Scope &scope, const ParticipantConfig &listenerConfig=getFactory().getDefaultParticipantConfig(), const ParticipantConfig &informerConfig=getFactory().getDefaultParticipantConfig())
Creates a RemoteServer object for the server at scope scope.
void registerDefaultEventProcessingStrategies()
std::vector< transport::OutConnectorPtr > createOutConnectors(const ParticipantConfig &config)
ParticipantConfig getDefaultParticipantConfig() const
Returns the default configuration for new participants.
std::set< ConnectorInfo > getConnectorInfos() const
A Service implementation that structures services locally.
void addTransport(const Transport &transport)
Adds a transport to the list of desired transport mechanisms.
boost::shared_ptr< Reader > ReaderPtr
Factory & getFactory()
Returns a factory for client-level RSB objects.
ReaderPtr createReader(const Scope &scope, const ParticipantConfig &config=getFactory().getDefaultParticipantConfig())
Creates a new Reader object for the specified scope.
boost::shared_ptr< Server > ServerPtr
std::vector< transport::InPushConnectorPtr > createInPushConnectors(const ParticipantConfig &config)
boost::shared_ptr< Listener > ListenerPtr
patterns::ServerPtr createServer(const Scope &scope, const ParticipantConfig &listenerConfig=getFactory().getDefaultParticipantConfig(), const ParticipantConfig &informerConfig=getFactory().getDefaultParticipantConfig())
Creates a Server object that exposes methods under the scope scope.
boost::shared_ptr< OutConnector > OutConnectorPtr
std::vector< transport::InPullConnectorPtr > createInPullConnectors(const ParticipantConfig &config)
boost::shared_ptr< ConverterSelectionStrategy< WireType > > Ptr
ServicePtr createService(const Scope &scope)
Creates a Service instance operating on the given scope.
Description of a desired transport.
void registerDefaultTransports()
ListenerPtr createListener(const Scope &scope, const ParticipantConfig &config=getFactory().getDefaultParticipantConfig())
Creates a new listener for the specified scope.
Factory for RSB user-level domain objects for communication patterns.
A Listener receives events published by rsb::Informer objects by participating in a channel with a su...
boost::shared_ptr< Service > ServicePtr
A Reader receives events published by a informers by participating in a channel with a suitable scope...
Transport & mutableTransport(const std::string &name)
Returns a single configured transport which can be modified in place.
boost::shared_ptr< InPushConnector > InPushConnectorPtr
ParticipantConfig defaultConfig
Always acquire configMutex before reading or writing the config.
A class describing the configuration of Participant instances.
InPullFactory & getInPullFactory()
void setDefaultParticipantConfig(const ParticipantConfig &config)
Sets the default config for participants that will be used for every new participant that is created ...
boost::shared_ptr< InformerBase > InformerBasePtr
boost::shared_ptr< RemoteServer > RemoteServerPtr
InPushFactory & getInPushFactory()
rsc::logging::LoggerPtr logger
OutFactory & getOutFactory()
void registerDefaultConverters()
rsc::plugins::ManagerPtr pluginManager
The server side of a request-reply-based communication channel.
boost::recursive_mutex configMutex
boost::shared_ptr< InPullConnector > InPullConnectorPtr
Scope is a descriptor for a hierarchical channel of the unified bus.
std::set< Transport > getTransports(bool includeDisabled=false) const
Returns the set of desired transports for a participant.
rsc::plugins::ManagerPtr getPluginManager() const
Returns the plugin manager instance used by the RSB core.
void setEnabled(bool value)
InformerBasePtr createInformerBase(const Scope &scope, const std::string &dataType="", const ParticipantConfig &config=getFactory().getDefaultParticipantConfig())
Creates and returns a new Informer that publishes Event s under the Scope scope.
The client side of a request-reply-based communication channel.