Properly instantiate plugins

This commit is contained in:
Dennis Luxen 2013-09-19 18:55:19 +02:00
parent 41df92bb93
commit ab1d3d1ced
2 changed files with 44 additions and 37 deletions

View File

@ -34,8 +34,9 @@ OSRM::OSRM(const char * server_ini_path, const bool use_shared_memory)
{
if( !use_shared_memory ) {
if( !testDataFile(server_ini_path) ){
std::string error_message = std::string(server_ini_path) + " not found";
throw OSRMException(error_message.c_str());
std::string error_message(server_ini_path);
error_message += " not found";
throw OSRMException(error_message);
}
IniFile serverConfig(server_ini_path);
@ -91,56 +92,59 @@ OSRM::OSRM(const char * server_ini_path, const bool use_shared_memory)
base_path
);
objects = new QueryObjectsStorage(
hsgr_path.string(),
ram_index_path.string(),
file_index_path.string(),
node_data_path.string(),
edge_data_path.string(),
name_data_path.string(),
timestamp_path.string()
);
RegisterPlugin(new HelloWorldPlugin());
RegisterPlugin(new LocatePlugin(objects));
RegisterPlugin(new NearestPlugin(objects));
RegisterPlugin(new TimestampPlugin(objects));
RegisterPlugin(new ViaRoutePlugin(objects));
query_data_facade = new InternalDataFacade<QueryEdge::EdgeData>();
} else {
//TODO: fetch pointers from shared memory
//TODO: objects = new QueryObjectsStorage()
query_data_facade = new SharedDataFacade<QueryEdge::EdgeData>();
//TODO: generate shared memory plugins
RegisterPlugin(new HelloWorldPlugin());
RegisterPlugin(new LocatePlugin(objects));
RegisterPlugin(new NearestPlugin(objects));
RegisterPlugin(new TimestampPlugin(objects));
RegisterPlugin(new ViaRoutePlugin(objects));
}
//The following plugins handle all requests.
RegisterPlugin(
new HelloWorldPlugin()
);
RegisterPlugin(
new LocatePlugin<BaseDataFacade<QueryEdge::EdgeData> >(
query_data_facade
)
);
RegisterPlugin(
new NearestPlugin<BaseDataFacade<QueryEdge::EdgeData> >(
query_data_facade
)
);
RegisterPlugin(
new TimestampPlugin<BaseDataFacade<QueryEdge::EdgeData> >(
query_data_facade
)
);
RegisterPlugin(
new ViaRoutePlugin<BaseDataFacade<QueryEdge::EdgeData> >(
query_data_facade
)
);
}
OSRM::~OSRM() {
BOOST_FOREACH(PluginMap::value_type & plugin_pointer, pluginMap) {
BOOST_FOREACH(PluginMap::value_type & plugin_pointer, plugin_map) {
delete plugin_pointer.second;
}
delete objects;
}
void OSRM::RegisterPlugin(BasePlugin * plugin) {
SimpleLogger().Write() << "loaded plugin: " << plugin->GetDescriptor();
if( pluginMap.find(plugin->GetDescriptor()) != pluginMap.end() ) {
delete pluginMap.find(plugin->GetDescriptor())->second;
if( plugin_map.find(plugin->GetDescriptor()) != plugin_map.end() ) {
delete plugin_map.find(plugin->GetDescriptor())->second;
}
pluginMap.emplace(plugin->GetDescriptor(), plugin);
plugin_map.emplace(plugin->GetDescriptor(), plugin);
}
void OSRM::RunQuery(RouteParameters & route_parameters, http::Reply & reply) {
const PluginMap::const_iterator & iter = pluginMap.find(route_parameters.service);
if(pluginMap.end() != iter) {
const PluginMap::const_iterator & iter = plugin_map.find(
route_parameters.service
);
if(plugin_map.end() != iter) {
reply.status = http::Reply::ok;
iter->second->HandleRequest(route_parameters, reply );
} else {

View File

@ -57,8 +57,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class OSRM : boost::noncopyable {
private:
typedef boost::unordered_map<std::string, BasePlugin *> PluginMap;
QueryObjectsStorage * objects;
BaseDataFacade<QueryEdge::EdgeData> * query_data_facade;
public:
OSRM(
@ -68,10 +66,15 @@ public:
);
~OSRM();
void RunQuery(RouteParameters & route_parameters, http::Reply & reply);
private:
void RegisterPlugin(BasePlugin * plugin);
PluginMap pluginMap;
//base class pointer to the objects
BaseDataFacade<QueryEdge::EdgeData> * query_data_facade;
PluginMap plugin_map;
const bool use_shared_memory;
};
#endif //OSRM_H