move fairmq json parser to fairmq/options

This commit is contained in:
winckler 2015-06-15 15:55:11 +02:00
parent f54fbb0f59
commit a2ebbbe450
6 changed files with 150 additions and 106 deletions

View File

@ -6,7 +6,9 @@
# copied verbatim in the file "LICENSE" # # copied verbatim in the file "LICENSE" #
################################################################################ ################################################################################
#Temporary for test #Temporary for test
add_subdirectory (options/ProgOptionTest) #add_subdirectory (options/ProgOptionTest)
configure_file(${CMAKE_SOURCE_DIR}/fairmq/options/ProgOptionTest/macro/bsampler-sink.json ${CMAKE_BINARY_DIR}/bin/bsampler-sink.json)
Set(INCLUDE_DIRECTORIES Set(INCLUDE_DIRECTORIES
${CMAKE_SOURCE_DIR}/fairmq ${CMAKE_SOURCE_DIR}/fairmq
${CMAKE_SOURCE_DIR}/fairmq/devices ${CMAKE_SOURCE_DIR}/fairmq/devices
@ -76,7 +78,7 @@ set(SRCS
"devices/FairMQMerger.cxx" "devices/FairMQMerger.cxx"
"options/FairProgOptions.cxx" "options/FairProgOptions.cxx"
"options/FairMQProgOptions.cxx" "options/FairMQProgOptions.cxx"
"options/FairMQChannel.cxx" "options/FairMQParser.cxx"
"FairMQPoller.cxx" "FairMQPoller.cxx"
"examples/req-rep/FairMQExampleClient.cxx" "examples/req-rep/FairMQExampleClient.cxx"
"examples/req-rep/FairMQExampleServer.cxx" "examples/req-rep/FairMQExampleServer.cxx"

View File

@ -7,7 +7,6 @@
#include "FairMQParser.h" #include "FairMQParser.h"
#include "FairMQLogger.h" #include "FairMQLogger.h"
#include <boost/property_tree/xml_parser.hpp>
// WARNING : pragma commands to hide boost (1.54.0) warning // WARNING : pragma commands to hide boost (1.54.0) warning
// TODO : remove these pragma commands when boost will fix this issue in future release // TODO : remove these pragma commands when boost will fix this issue in future release
@ -18,11 +17,10 @@
namespace FairMQParser namespace FairMQParser
{ {
no_id_exception NoIdErr;
// TODO : add key-value map<string,string> parameter for replacing/updating values from keys // TODO : add key-value map<string,string> parameter for replacing/updating values from keys
// function that convert property tree (given the xml or json structure) to FairMQMap // function that convert property tree (given the xml or json structure) to FairMQMap
FairMQMap boost_ptree_to_MQMap(const boost::property_tree::ptree& pt, const std::string& device_id, const std::string& root_node, const std::string& format_flag) FairMQMap ptreeToMQMap(const boost::property_tree::ptree& pt, const std::string& device_id, const std::string& root_node, const std::string& format_flag)
{ {
// Create fair mq map // Create fair mq map
FairMQMap MQChannelMap; FairMQMap MQChannelMap;
@ -31,10 +29,6 @@ namespace FairMQParser
std::string kdevice_id; std::string kdevice_id;
std::string kchannel; std::string kchannel;
if(device_id.empty())
throw NoIdErr;
// do a first loop just to print the device-id in xml/json input // do a first loop just to print the device-id in xml/json input
for(const auto& p : pt.get_child(root_node)) for(const auto& p : pt.get_child(root_node))
{ {
@ -156,97 +150,19 @@ namespace FairMQParser
////////////////////////////////////////////////////////////////////////////
//----------- filename version
FairMQMap XML::UserParser(const std::string& filename, const std::string& device_id, const std::string& root_node)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filename, pt);
return boost_ptree_to_MQMap(pt,device_id,root_node,"xml");
}
//----------- stringstream version
FairMQMap XML::UserParser(std::stringstream& input_ss, const std::string& device_id, const std::string& root_node)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(input_ss, pt);
return boost_ptree_to_MQMap(pt,device_id,root_node,"xml");
}
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
FairMQMap JSON::UserParser(const std::string& filename, const std::string& device_id, const std::string& root_node) FairMQMap JSON::UserParser(const std::string& filename, const std::string& device_id, const std::string& root_node)
{ {
boost::property_tree::ptree pt; boost::property_tree::ptree pt;
boost::property_tree::read_json(filename, pt); boost::property_tree::read_json(filename, pt);
return boost_ptree_to_MQMap(pt,device_id,root_node,"json"); return ptreeToMQMap(pt,device_id,root_node,"json");
} }
FairMQMap JSON::UserParser(std::stringstream& input_ss, const std::string& device_id, const std::string& root_node) FairMQMap JSON::UserParser(std::stringstream& input_ss, const std::string& device_id, const std::string& root_node)
{ {
boost::property_tree::ptree pt; boost::property_tree::ptree pt;
boost::property_tree::read_json(input_ss, pt); boost::property_tree::read_json(input_ss, pt);
return boost_ptree_to_MQMap(pt,device_id,root_node,"json"); return ptreeToMQMap(pt,device_id,root_node,"json");
} }
// other xml examples
////////////////////////////////////////////////////////////////////////////
boost::property_tree::ptree MQXML2::UserParser(const std::string& filename)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filename, pt);
return pt;
}
// TODO : finish implementation
////////////////////////////////////////////////////////////////////////////
boost::property_tree::ptree MQXML3::UserParser(const std::string& filename, const std::string& devicename)
{
// Create an empty property tree object
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filename, pt);
// Create fair mq map
auto xml = pt.get_child("");
std::vector<std::pair<std::string, boost::property_tree::ptree>> match;
std::pair<std::string, boost::property_tree::ptree> device_match;
ProcessTree(xml.begin (), xml.end (), std::back_inserter(match),
[] (const std::string& key) { return key == "device"; });
// for each device
for (const auto& pair: match)
{
if(pair.second.get<std::string>("<xmlattr>.name") == devicename)
{
device_match=pair;
}
else
{
//match.erase(std::remove(match.begin(), match.end(), pair), match.end());
continue;
}
//std::cout << "pair.first " << pair.first << std::endl;//device
//std::cout << "\t node = " << pair.first
// << "\t name = " << pair.second.get<std::string>("<xmlattr>.name")
// << "\t id = " << pair.second.get<std::string>("<xmlattr>.id");
//std::cout<<std::endl;
}
return device_match.second;
}
} // end FairMQParser namespace } // end FairMQParser namespace

View File

@ -0,0 +1,38 @@
/*
* File: FairMQParser.h
* Author: winckler
*
* Created on May 14, 2015, 5:01 PM
*/
#ifndef FAIRMQPARSER_H
#define FAIRMQPARSER_H
// FairRoot
#include "FairMQChannel.h"
// Boost
#include <boost/property_tree/ptree.hpp>
// std
#include <string>
#include <vector>
#include <map>
namespace FairMQParser
{
typedef std::map<std::string, std::vector<FairMQChannel> > FairMQMap;
FairMQMap ptreeToMQMap(const boost::property_tree::ptree& pt, const std::string& device_id, const std::string& root_node, const std::string& format_flag="json");
struct JSON
{
FairMQMap UserParser(const std::string& filename, const std::string& device_id, const std::string& root_node="fairMQOptions");
FairMQMap UserParser(std::stringstream& input_ss, const std::string& device_id, const std::string& root_node="fairMQOptions");
};
} // end FairMQParser namespace
#endif /* FAIRMQPARSER_H */

View File

@ -52,7 +52,7 @@ ${Boost_LIBRARY_DIRS}
link_directories(${LINK_DIRECTORIES}) link_directories(${LINK_DIRECTORIES})
Set(SRCS Set(SRCS
lib/FairMQParser.cxx lib/FairMQParserExample.cxx
) )
Set(LIBRARY_NAME ProgOptionTest) Set(LIBRARY_NAME ProgOptionTest)

View File

@ -0,0 +1,97 @@
/*
* File: FairMQParserExample.cxx
* Author: winckler
*
* Created on May 14, 2015, 5:01 PM
*/
#include "FairMQParserExample.h"
#include "FairMQLogger.h"
#include <boost/property_tree/xml_parser.hpp>
namespace FairMQParser
{
////////////////////////////////////////////////////////////////////////////
//----------- filename version
FairMQMap XML::UserParser(const std::string& filename, const std::string& device_id, const std::string& root_node)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filename, pt);
return ptreeToMQMap(pt,device_id,root_node,"xml");
}
//----------- stringstream version
FairMQMap XML::UserParser(std::stringstream& input_ss, const std::string& device_id, const std::string& root_node)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(input_ss, pt);
return ptreeToMQMap(pt,device_id,root_node,"xml");
}
// other xml examples
////////////////////////////////////////////////////////////////////////////
boost::property_tree::ptree MQXML2::UserParser(const std::string& filename)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filename, pt);
return pt;
}
// TODO : finish implementation
////////////////////////////////////////////////////////////////////////////
boost::property_tree::ptree MQXML3::UserParser(const std::string& filename, const std::string& devicename)
{
// Create an empty property tree object
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filename, pt);
// Create fair mq map
auto xml = pt.get_child("");
std::vector<std::pair<std::string, boost::property_tree::ptree>> match;
std::pair<std::string, boost::property_tree::ptree> device_match;
ProcessTree(xml.begin (), xml.end (), std::back_inserter(match),
[] (const std::string& key) { return key == "device"; });
// for each device
for (const auto& pair: match)
{
if(pair.second.get<std::string>("<xmlattr>.name") == devicename)
{
device_match=pair;
}
else
{
//match.erase(std::remove(match.begin(), match.end(), pair), match.end());
continue;
}
//std::cout << "pair.first " << pair.first << std::endl;//device
//std::cout << "\t node = " << pair.first
// << "\t name = " << pair.second.get<std::string>("<xmlattr>.name")
// << "\t id = " << pair.second.get<std::string>("<xmlattr>.id");
//std::cout<<std::endl;
}
return device_match.second;
}
} // end FairMQParser namespace

View File

@ -1,15 +1,16 @@
/* /*
* File: FairMQParser.h * File: FairMQParserExample.h
* Author: winckler * Author: winckler
* *
* Created on May 14, 2015, 5:01 PM * Created on May 14, 2015, 5:01 PM
*/ */
#ifndef FAIRMQPARSER_H #ifndef FAIRMQPARSEREXAMPLE_H
#define FAIRMQPARSER_H #define FAIRMQPARSEREXAMPLE_H
// FairRoot // FairRoot
#include "FairMQChannel.h" #include "FairMQChannel.h"
#include "FairMQParser.h"
// Boost // Boost
#include <boost/property_tree/ptree.hpp> #include <boost/property_tree/ptree.hpp>
@ -23,9 +24,6 @@
namespace FairMQParser namespace FairMQParser
{ {
typedef std::map<std::string, std::vector<FairMQChannel> > FairMQMap;
FairMQMap boost_ptree_to_MQMap(const boost::property_tree::ptree& pt, const std::string& device_id, const std::string& root_node, const std::string& format_flag="json");
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// XML //////////////////////////////////// /////////////////////////////////// XML ////////////////////////////////////
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
@ -52,14 +50,7 @@ namespace FairMQParser
boost::property_tree::ptree UserParser(const std::string& filename, const std::string& root_node); boost::property_tree::ptree UserParser(const std::string& filename, const std::string& root_node);
}; };
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// JSON ///////////////////////////////////
////////////////////////////////////////////////////////////////////////////
struct JSON
{
FairMQMap UserParser(const std::string& filename, const std::string& device_id, const std::string& root_node="fairMQOptions");
FairMQMap UserParser(std::stringstream& input_ss, const std::string& device_id, const std::string& root_node="fairMQOptions");
};
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
@ -94,10 +85,10 @@ namespace FairMQParser
{ {
virtual const char* what() const throw() virtual const char* what() const throw()
{ {
return "Empty string for the device-id in FairMQParser::boost_ptree_to_MQMap(...) function"; return "Empty string for the device-id in FairMQParser::ptreeToMQMap(...) function";
} }
}; };
} // end FairMQParser namespace } // end FairMQParser namespace
#endif /* FAIRMQPARSER_H */ #endif /* FAIRMQPARSEREXAMPLE_H */