00001
00005
00006 #include <cassert>
00007 #include <iostream>
00008 #include <sstream>
00009 #include <fstream>
00010 #include <string>
00011
00012 #include <boost/date_time/posix_time/posix_time.hpp>
00013 #include <boost/date_time/gregorian/gregorian.hpp>
00014 #include <boost/program_options.hpp>
00015 #include <boost/tokenizer.hpp>
00016 #include <boost/lexical_cast.hpp>
00017
00018 #include <stdair/stdair_types.hpp>
00019 #include <stdair/bom/BomArchive.hpp>
00020 #include <stdair/bom/BookingRequestStruct.hpp>
00021 #include <stdair/bom/TravelSolutionStruct.hpp>
00022 #include <stdair/service/Logger.hpp>
00023 #include <stdair/STDAIR_Service.hpp>
00024 #include <stdair/config/stdair-paths.hpp>
00025
00026
00030 const std::string K_STDAIR_DEFAULT_LOG_FILENAME ("stdair.log");
00031
00035 const std::string K_STDAIR_DEFAULT_INPUT_FILENAME (STDAIR_SAMPLE_DIR
00036 "/schedule01.csv");
00037
00042 const bool K_STDAIR_DEFAULT_BUILT_IN_INPUT = false;
00043
00049 const bool K_STDAIR_DEFAULT_BUILT_FOR_RMOL = false;
00050
00056 const bool K_STDAIR_DEFAULT_BUILT_FOR_CRS = false;
00057
00062 const int K_STDAIR_EARLY_RETURN_STATUS = 99;
00063
00064
00065
00066 template<class T> std::ostream& operator<< (std::ostream& os,
00067 const std::vector<T>& v) {
00068 std::copy (v.begin(), v.end(), std::ostream_iterator<T> (std::cout, " "));
00069 return os;
00070 }
00071
00073 int readConfiguration (int argc, char* argv[], bool& ioIsBuiltin,
00074 bool& ioIsForRMOL, bool& ioIsForCRS,
00075 stdair::Filename_T& ioInputFilename,
00076 std::string& ioLogFilename) {
00077
00078 ioIsBuiltin = K_STDAIR_DEFAULT_BUILT_IN_INPUT;
00079
00080
00081 ioIsForRMOL = K_STDAIR_DEFAULT_BUILT_FOR_RMOL;
00082
00083
00084 ioIsForCRS = K_STDAIR_DEFAULT_BUILT_FOR_CRS;
00085
00086
00087 boost::program_options::options_description generic ("Generic options");
00088 generic.add_options()
00089 ("prefix", "print installation prefix")
00090 ("version,v", "print version string")
00091 ("help,h", "produce help message");
00092
00093
00094
00095
00096 boost::program_options::options_description config ("Configuration");
00097 config.add_options()
00098 ("builtin,b",
00099 "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")
00100 ("rmol,r",
00101 "Build a sample BOM tree for RMOL (i.e., a dummy flight-date with a single leg-cabin)")
00102 ("crs,c",
00103 "Build a sample BOM tree for CRS")
00104 ("input,i",
00105 boost::program_options::value< std::string >(&ioInputFilename)->default_value(K_STDAIR_DEFAULT_INPUT_FILENAME),
00106 "(CVS) input file for the demand distributions")
00107 ("log,l",
00108 boost::program_options::value< std::string >(&ioLogFilename)->default_value(K_STDAIR_DEFAULT_LOG_FILENAME),
00109 "Filename for the logs")
00110 ;
00111
00112
00113
00114 boost::program_options::options_description hidden ("Hidden options");
00115 hidden.add_options()
00116 ("copyright",
00117 boost::program_options::value< std::vector<std::string> >(),
00118 "Show the copyright (license)");
00119
00120 boost::program_options::options_description cmdline_options;
00121 cmdline_options.add(generic).add(config).add(hidden);
00122
00123 boost::program_options::options_description config_file_options;
00124 config_file_options.add(config).add(hidden);
00125 boost::program_options::options_description visible ("Allowed options");
00126 visible.add(generic).add(config);
00127
00128 boost::program_options::positional_options_description p;
00129 p.add ("copyright", -1);
00130
00131 boost::program_options::variables_map vm;
00132 boost::program_options::
00133 store (boost::program_options::command_line_parser (argc, argv).
00134 options (cmdline_options).positional(p).run(), vm);
00135
00136 std::ifstream ifs ("stdair.cfg");
00137 boost::program_options::store (parse_config_file (ifs, config_file_options),
00138 vm);
00139 boost::program_options::notify (vm);
00140
00141 if (vm.count ("help")) {
00142 std::cout << visible << std::endl;
00143 return K_STDAIR_EARLY_RETURN_STATUS;
00144 }
00145
00146 if (vm.count ("version")) {
00147 std::cout << PACKAGE_NAME << ", version " << PACKAGE_VERSION << std::endl;
00148 return K_STDAIR_EARLY_RETURN_STATUS;
00149 }
00150
00151 if (vm.count ("prefix")) {
00152 std::cout << "Installation prefix: " << PREFIXDIR << std::endl;
00153 return K_STDAIR_EARLY_RETURN_STATUS;
00154 }
00155
00156 if (vm.count ("builtin")) {
00157 ioIsBuiltin = true;
00158 }
00159
00160 if (vm.count ("rmol")) {
00161 ioIsForRMOL = true;
00162
00163
00164 ioIsBuiltin = false;
00165 }
00166
00167 if (vm.count ("crs")) {
00168 ioIsForCRS = true;
00169
00170
00171 ioIsBuiltin = false;
00172 }
00173
00174 const std::string isBuiltinStr = (ioIsBuiltin == true)?"yes":"no";
00175 std::cout << "The BOM should be built-in? " << isBuiltinStr << std::endl;
00176
00177 const std::string isForRMOLStr = (ioIsForRMOL == true)?"yes":"no";
00178 std::cout << "The BOM should be built-in for RMOL? " << isForRMOLStr
00179 << std::endl;
00180
00181 const std::string isForCRSStr = (ioIsForCRS == true)?"yes":"no";
00182 std::cout << "The BOM should be built-in for CRS? " << isForCRSStr
00183 << std::endl;
00184
00185 if (ioIsBuiltin == false && ioIsForRMOL == false && ioIsForCRS == false) {
00186 if (vm.count ("input")) {
00187 ioInputFilename = vm["input"].as< std::string >();
00188 std::cout << "Input filename is: " << ioInputFilename << std::endl;
00189
00190 } else {
00191 std::cerr << "Either one among the -b/--builtin, -r/--rmol, -c/--crs "
00192 << "or -i/--input options must be specified" << std::endl;
00193 }
00194 }
00195
00196 if (vm.count ("log")) {
00197 ioLogFilename = vm["log"].as< std::string >();
00198 std::cout << "Log filename is: " << ioLogFilename << std::endl;
00199 }
00200
00201 return 0;
00202 }
00203
00204
00205
00206 int main (int argc, char* argv[]) {
00207
00208
00209
00210 bool isBuiltin;
00211
00212
00213 bool isForRMOL;
00214
00215
00216 bool isForCRS;
00217
00218
00219 stdair::Filename_T lInputFilename;
00220
00221
00222 std::string lLogFilename;
00223
00224
00225 const int lOptionParserStatus =
00226 readConfiguration (argc, argv, isBuiltin, isForRMOL, isForCRS,
00227 lInputFilename, lLogFilename);
00228
00229 if (lOptionParserStatus == K_STDAIR_EARLY_RETURN_STATUS) {
00230 return 0;
00231 }
00232
00233
00234 std::ofstream logOutputFile;
00235
00236 logOutputFile.open (lLogFilename.c_str());
00237 logOutputFile.clear();
00238
00239 const stdair::BasLogParams lLogParams (stdair::LOG::DEBUG, logOutputFile);
00240 stdair::STDAIR_Service stdairService (lLogParams);
00241
00242
00243 STDAIR_LOG_DEBUG ("Welcome to stdair");
00244
00245
00246 if (isBuiltin == true || isForRMOL == true || isForCRS == true) {
00247
00248 if (isForRMOL == true) {
00249
00250 stdairService.buildDummyInventory (300);
00251
00252 } else if (isForCRS == true) {
00253
00254 stdair::TravelSolutionList_T lTravelSolutionList;
00255 stdairService.buildSampleTravelSolutions (lTravelSolutionList);
00256
00257
00258 const stdair::BookingRequestStruct& lBookingRequest =
00259 stdairService.buildSampleBookingRequest();
00260
00261
00262 STDAIR_LOG_DEBUG ("Booking request: " << lBookingRequest.display());
00263
00264 const std::string& lCSVDump =
00265 stdairService.csvDisplay (lTravelSolutionList);
00266 STDAIR_LOG_DEBUG (lCSVDump);
00267
00268 } else {
00269 assert (isBuiltin == true);
00270
00271
00272 stdairService.buildSampleBom();
00273 }
00274
00275 } else {
00276
00277
00278
00279
00280 STDAIR_LOG_DEBUG ("StdAir will parse " << lInputFilename
00281 << " and build the corresponding BOM tree.");
00282 }
00283
00284
00285 const std::string& lCSVDump = stdairService.csvDisplay();
00286 STDAIR_LOG_DEBUG (lCSVDump);
00287
00288
00289 logOutputFile.close();
00290
00291
00292
00293
00294
00295
00296
00297
00298 return 0;
00299 }
00300