00001
00002 #include <cassert>
00003 #include <iostream>
00004 #include <sstream>
00005 #include <fstream>
00006 #include <vector>
00007 #include <string>
00008
00009 #include <boost/date_time/posix_time/posix_time.hpp>
00010 #include <boost/date_time/gregorian/gregorian.hpp>
00011 #include <boost/tokenizer.hpp>
00012 #include <boost/program_options.hpp>
00013
00014 #include <stdair/stdair_basic_types.hpp>
00015 #include <stdair/basic/BasConst_General.hpp>
00016 #include <stdair/basic/BasDBParams.hpp>
00017 #include <stdair/basic/BasLogParams.hpp>
00018
00019 #include <trademgen/TRADEMGEN_Service.hpp>
00020 #include <trademgen/config/trademgen-paths.hpp>
00021
00022
00023
00024 typedef std::vector<std::string> WordList_T;
00025
00026
00027
00031 const std::string K_TRADEMGEN_DEFAULT_LOG_FILENAME ("trademgen_with_db.log");
00032
00036 const std::string K_TRADEMGEN_DEFAULT_INPUT_FILENAME (STDAIR_SAMPLE_DIR
00037 "/demand01.csv");
00038
00043 const bool K_TRADEMGEN_DEFAULT_BUILT_IN_INPUT = false;
00044
00048 const stdair::RandomSeed_T K_TRADEMGEN_DEFAULT_RANDOM_SEED =
00049 stdair::DEFAULT_RANDOM_SEED;
00050
00054 const std::string K_TRADEMGEN_DEFAULT_QUERY_STRING ("my good old query");
00055
00059 const std::string K_TRADEMGEN_DEFAULT_DB_USER ("dsim");
00060 const std::string K_TRADEMGEN_DEFAULT_DB_PASSWD ("dsim");
00061 const std::string K_TRADEMGEN_DEFAULT_DB_DBNAME ("sim_dsim");
00062 const std::string K_TRADEMGEN_DEFAULT_DB_HOST ("localhost");
00063 const std::string K_TRADEMGEN_DEFAULT_DB_PORT ("3306");
00064
00065
00066
00067 void tokeniseStringIntoWordList (const std::string& iPhrase,
00068 WordList_T& ioWordList) {
00069
00070 ioWordList.clear();
00071
00072
00073 typedef boost::tokenizer<boost::char_separator<char> > Tokeniser_T;
00074
00075
00076 const boost::char_separator<char> lSepatorList(" .,;:|+-*/_=!@#$%`~^&(){}[]?'<>\"");
00077
00078
00079 Tokeniser_T lTokens (iPhrase, lSepatorList);
00080 for (Tokeniser_T::const_iterator tok_iter = lTokens.begin();
00081 tok_iter != lTokens.end(); ++tok_iter) {
00082 const std::string& lTerm = *tok_iter;
00083 ioWordList.push_back (lTerm);
00084 }
00085
00086 }
00087
00088
00089 std::string createStringFromWordList (const WordList_T& iWordList) {
00090 std::ostringstream oStr;
00091
00092 unsigned short idx = iWordList.size();
00093 for (WordList_T::const_iterator itWord = iWordList.begin();
00094 itWord != iWordList.end(); ++itWord, --idx) {
00095 const std::string& lWord = *itWord;
00096 oStr << lWord;
00097 if (idx > 1) {
00098 oStr << " ";
00099 }
00100 }
00101
00102 return oStr.str();
00103 }
00104
00105
00106
00107
00108 template<class T> std::ostream& operator<< (std::ostream& os,
00109 const std::vector<T>& v) {
00110 std::copy (v.begin(), v.end(), std::ostream_iterator<T> (std::cout, " "));
00111 return os;
00112 }
00113
00115 const int K_TRADEMGEN_EARLY_RETURN_STATUS = 99;
00116
00118 int readConfiguration (int argc, char* argv[], bool& ioIsBuiltin,
00119 stdair::RandomSeed_T& ioRandomSeed,
00120 std::string& ioQueryString,
00121 stdair::Filename_T& ioInputFilename,
00122 std::string& ioLogFilename,
00123 std::string& ioDBUser, std::string& ioDBPasswd,
00124 std::string& ioDBHost, std::string& ioDBPort,
00125 std::string& ioDBDBName) {
00126
00127
00128 ioIsBuiltin = K_TRADEMGEN_DEFAULT_BUILT_IN_INPUT;
00129
00130
00131 if (ioQueryString.empty() == true) {
00132 ioQueryString = K_TRADEMGEN_DEFAULT_QUERY_STRING;
00133 }
00134
00135
00136 WordList_T lWordList;
00137 tokeniseStringIntoWordList (ioQueryString, lWordList);
00138
00139
00140 boost::program_options::options_description generic ("Generic options");
00141 generic.add_options()
00142 ("prefix", "print installation prefix")
00143 ("version,v", "print version string")
00144 ("help,h", "produce help message");
00145
00146
00147
00148 boost::program_options::options_description config ("Configuration");
00149 config.add_options()
00150 ("builtin,b",
00151 "The sample BOM tree can be either built-in or parsed from an input file. That latter must then be given with the -i/--input option")
00152 ("seed,s",
00153 boost::program_options::value<stdair::RandomSeed_T>(&ioRandomSeed)->default_value(K_TRADEMGEN_DEFAULT_RANDOM_SEED),
00154 "Seed for the random generation")
00155 ("input,i",
00156 boost::program_options::value< std::string >(&ioInputFilename)->default_value(K_TRADEMGEN_DEFAULT_INPUT_FILENAME),
00157 "(CVS) input file for the demand distributions")
00158 ("log,l",
00159 boost::program_options::value< std::string >(&ioLogFilename)->default_value(K_TRADEMGEN_DEFAULT_LOG_FILENAME),
00160 "Filepath for the logs")
00161 ("user,u",
00162 boost::program_options::value< std::string >(&ioDBUser)->default_value(K_TRADEMGEN_DEFAULT_DB_USER),
00163 "SQL database user (e.g., dsim)")
00164 ("passwd,p",
00165 boost::program_options::value< std::string >(&ioDBPasswd)->default_value(K_TRADEMGEN_DEFAULT_DB_PASSWD),
00166 "SQL database password (e.g., dsim)")
00167 ("host,H",
00168 boost::program_options::value< std::string >(&ioDBHost)->default_value(K_TRADEMGEN_DEFAULT_DB_HOST),
00169 "SQL database hostname (e.g., localhost)")
00170 ("port,P",
00171 boost::program_options::value< std::string >(&ioDBPort)->default_value(K_TRADEMGEN_DEFAULT_DB_PORT),
00172 "SQL database port (e.g., 3306)")
00173 ("dbname,m",
00174 boost::program_options::value< std::string >(&ioDBDBName)->default_value(K_TRADEMGEN_DEFAULT_DB_DBNAME),
00175 "SQL database name (e.g., sim_dsim)")
00176 ("query,q",
00177 boost::program_options::value< WordList_T >(&lWordList)->multitoken(),
00178 "Query word list")
00179 ;
00180
00181
00182
00183 boost::program_options::options_description hidden ("Hidden options");
00184 hidden.add_options()
00185 ("copyright",
00186 boost::program_options::value< std::vector<std::string> >(),
00187 "Show the copyright (license)");
00188
00189 boost::program_options::options_description cmdline_options;
00190 cmdline_options.add(generic).add(config).add(hidden);
00191
00192 boost::program_options::options_description config_file_options;
00193 config_file_options.add(config).add(hidden);
00194
00195 boost::program_options::options_description visible ("Allowed options");
00196 visible.add(generic).add(config);
00197
00198 boost::program_options::positional_options_description p;
00199 p.add ("copyright", -1);
00200
00201 boost::program_options::variables_map vm;
00202 boost::program_options::
00203 store (boost::program_options::command_line_parser (argc, argv).
00204 options (cmdline_options).positional(p).run(), vm);
00205
00206 std::ifstream ifs ("trademgen_with_db.cfg");
00207 boost::program_options::store (parse_config_file (ifs, config_file_options),
00208 vm);
00209 boost::program_options::notify (vm);
00210
00211 if (vm.count ("help")) {
00212 std::cout << visible << std::endl;
00213 return K_TRADEMGEN_EARLY_RETURN_STATUS;
00214 }
00215
00216 if (vm.count ("version")) {
00217 std::cout << PACKAGE_NAME << ", version " << PACKAGE_VERSION << std::endl;
00218 return K_TRADEMGEN_EARLY_RETURN_STATUS;
00219 }
00220
00221 if (vm.count ("prefix")) {
00222 std::cout << "Installation prefix: " << PREFIXDIR << std::endl;
00223 return K_TRADEMGEN_EARLY_RETURN_STATUS;
00224 }
00225
00226 if (vm.count ("builtin")) {
00227 ioIsBuiltin = true;
00228 }
00229 const std::string isBuiltinStr = (ioIsBuiltin == true)?"yes":"no";
00230 std::cout << "The BOM should be built-in? " << isBuiltinStr << std::endl;
00231
00232 if (ioIsBuiltin == false) {
00233
00234
00235 if (vm.count ("input")) {
00236 ioInputFilename = vm["input"].as< std::string >();
00237 std::cout << "Input filename is: " << ioInputFilename << std::endl;
00238
00239 } else {
00240
00241
00242 std::cerr << "Either one among the -b/--builtin and -i/--input "
00243 << "options must be specified" << std::endl;
00244 }
00245 }
00246
00247 if (vm.count ("log")) {
00248 ioLogFilename = vm["log"].as< std::string >();
00249 std::cout << "Log filename is: " << ioLogFilename << std::endl;
00250 }
00251
00252 if (vm.count ("user")) {
00253 ioDBUser = vm["user"].as< std::string >();
00254 std::cout << "SQL database user name is: " << ioDBUser << std::endl;
00255 }
00256
00257 if (vm.count ("passwd")) {
00258 ioDBPasswd = vm["passwd"].as< std::string >();
00259
00260 }
00261
00262 if (vm.count ("host")) {
00263 ioDBHost = vm["host"].as< std::string >();
00264 std::cout << "SQL database host name is: " << ioDBHost << std::endl;
00265 }
00266
00267 if (vm.count ("port")) {
00268 ioDBPort = vm["port"].as< std::string >();
00269 std::cout << "SQL database port number is: " << ioDBPort << std::endl;
00270 }
00271
00272 if (vm.count ("dbname")) {
00273 ioDBDBName = vm["dbname"].as< std::string >();
00274 std::cout << "SQL database name is: " << ioDBDBName << std::endl;
00275 }
00276
00277
00278 std::cout << "The random generation seed is: " << ioRandomSeed << std::endl;
00279
00280 ioQueryString = createStringFromWordList (lWordList);
00281 std::cout << "The query string is: " << ioQueryString << std::endl;
00282
00283 return 0;
00284 }
00285
00286
00287
00288 int main (int argc, char* argv[]) {
00289
00290
00291 bool isBuiltin;
00292
00293
00294 stdair::RandomSeed_T lRandomSeed;
00295
00296
00297 std::string lQuery;
00298
00299
00300 stdair::Filename_T lInputFilename;
00301
00302
00303 std::string lLogFilename;
00304
00305
00306 std::string lDBUser;
00307 std::string lDBPasswd;
00308 std::string lDBHost;
00309 std::string lDBPort;
00310 std::string lDBDBName;
00311
00312
00313 const stdair::AirlineCode_T lAirlineCode ("BA");
00314
00315
00316 const int lOptionParserStatus =
00317 readConfiguration (argc, argv, isBuiltin, lRandomSeed, lQuery,
00318 lInputFilename, lLogFilename,
00319 lDBUser, lDBPasswd, lDBHost, lDBPort, lDBDBName);
00320
00321 if (lOptionParserStatus == K_TRADEMGEN_EARLY_RETURN_STATUS) {
00322 return 0;
00323 }
00324
00325
00326 stdair::BasDBParams lDBParams (lDBUser, lDBPasswd, lDBHost, lDBPort,
00327 lDBDBName);
00328
00329
00330 std::ofstream logOutputFile;
00331
00332 logOutputFile.open (lLogFilename.c_str());
00333 logOutputFile.clear();
00334
00335
00336 const stdair::BasLogParams lLogParams (stdair::LOG::DEBUG, logOutputFile);
00337
00338
00339 TRADEMGEN::TRADEMGEN_Service trademgenService (lLogParams, lDBParams,
00340 lRandomSeed);
00341
00342
00343 if (isBuiltin == true) {
00344
00345 trademgenService.buildSampleBom();
00346
00347 } else {
00348
00349 trademgenService.parseAndLoad (lInputFilename);
00350 }
00351
00352
00353 trademgenService.displayAirlineListFromDB();
00354
00355
00356 logOutputFile.close();
00357
00358 return 0;
00359 }