7 #include <stdair/basic/BasFileMgr.hpp>
8 #include <stdair/bom/BomRoot.hpp>
9 #include <stdair/service/Logger.hpp>
15 namespace bsc = boost::spirit::classic;
19 namespace ScheduleParserHelper {
27 : _flightPeriod (ioFlightPeriod) {
39 const stdair::AirlineCode_T lAirlineCode (iStr, iStrEnd);
85 const stdair::DateOffset_T oneDay (1);
104 stdair::DOW_String_T lDow (iStr, iStrEnd);
117 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
146 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
279 stdair::AirportCode_T lBoardingPoint (iStr, iStrEnd);
292 stdair::AirportCode_T lOffPoint (iStr, iStrEnd);
316 std::string lClasses (iStr, iStrEnd);
340 std::ostringstream ostr;
354 std::string lClasses (iStr, iStrEnd);
378 _bomRoot (ioBomRoot) {
467 : _bomRoot (ioBomRoot),
468 _flightPeriod (ioFlightPeriod) {
472 template<
typename ScannerT>
476 flight_period_list = *(not_to_be_parsed
480 not_to_be_parsed =bsc::
481 lexeme_d[bsc::comment_p(
"//") |bsc::comment_p(
"/*",
"*/")
484 flight_period = flight_key
486 >>
';' >> segment_section
487 >> flight_period_end[
doEndFlight (
self._bomRoot,
self._flightPeriod)]
494 flight_key = airline_code
495 >>
';' >> flight_number
498 >>
';' >> dow[
storeDow(
self._flightPeriod)]
510 lexeme_d[(
year_p)[bsc::assign_a(
self._flightPeriod._itYear)]
512 >> (
month_p)[bsc::assign_a(
self._flightPeriod._itMonth)]
514 >> (
day_p)[bsc::assign_a(
self._flightPeriod._itDay)]
518 dow =bsc::lexeme_d[
dow_p ]
521 leg = leg_key >>
';' >> leg_details >> +(
';' >> leg_cabin_details )
541 lexeme_d[(
hours_p)[bsc::assign_a(
self._flightPeriod._itHours)]
543 >> (
minutes_p)[bsc::assign_a(
self._flightPeriod._itMinutes)]
545 >> (
seconds_p)[bsc::assign_a(
self._flightPeriod._itSeconds)])
549 date_offset =bsc::ch_p(
'/')
550 >> (
int1_p)[bsc::assign_a(
self._flightPeriod._dateOffset)]
564 generic_segment | specific_segment_list
567 generic_segment =bsc::
569 >> +(
';' >> segment_cabin_details)
572 specific_segment_list =bsc::
574 >> +(
';' >> segment_key >> full_segment_cabin_details)
577 full_segment_cabin_details =
578 +(
';' >> segment_cabin_details)
581 segment_cabin_details =
584 >> *(
';' >> family_cabin_details)
587 family_cabin_details =
594 BOOST_SPIRIT_DEBUG_NODE (flight_period_list);
595 BOOST_SPIRIT_DEBUG_NODE (flight_period);
596 BOOST_SPIRIT_DEBUG_NODE (not_to_be_parsed);
597 BOOST_SPIRIT_DEBUG_NODE (flight_period_end);
598 BOOST_SPIRIT_DEBUG_NODE (flight_key);
599 BOOST_SPIRIT_DEBUG_NODE (airline_code);
600 BOOST_SPIRIT_DEBUG_NODE (flight_number);
601 BOOST_SPIRIT_DEBUG_NODE (date);
602 BOOST_SPIRIT_DEBUG_NODE (dow);
603 BOOST_SPIRIT_DEBUG_NODE (leg);
604 BOOST_SPIRIT_DEBUG_NODE (leg_key);
605 BOOST_SPIRIT_DEBUG_NODE (leg_details);
606 BOOST_SPIRIT_DEBUG_NODE (time);
607 BOOST_SPIRIT_DEBUG_NODE (date_offset);
608 BOOST_SPIRIT_DEBUG_NODE (leg_cabin_details);
609 BOOST_SPIRIT_DEBUG_NODE (segment_section);
610 BOOST_SPIRIT_DEBUG_NODE (segment_key);
611 BOOST_SPIRIT_DEBUG_NODE (generic_segment);
612 BOOST_SPIRIT_DEBUG_NODE (specific_segment_list);
613 BOOST_SPIRIT_DEBUG_NODE (full_segment_cabin_details);
614 BOOST_SPIRIT_DEBUG_NODE (segment_cabin_details);
615 BOOST_SPIRIT_DEBUG_NODE (family_cabin_details);
619 template<
typename ScannerT>
620 bsc::rule<ScannerT>
const&
622 return flight_period_list;
637 const stdair::Filename_T& iFilename)
638 : _filename (iFilename), _bomRoot (ioBomRoot) {
643 void FlightPeriodFileParser::init() {
645 const bool doesExistAndIsReadable =
646 stdair::BasFileMgr::doesExistAndIsReadable (_filename);
648 if (doesExistAndIsReadable ==
false) {
649 STDAIR_LOG_ERROR (
"The schedule file " << _filename
650 <<
" does not exist or can not be read.");
653 +
" does not exist or can not be read");
660 if (!_startIterator) {
661 STDAIR_LOG_ERROR (
"The schedule file " << _filename <<
" can not be open."
664 throw ScheduleInputFileNotFoundException (
"The file " + _filename
665 +
" does not exist or can not be read");
669 _endIterator = _startIterator.make_end();
674 bool oResult =
false;
676 STDAIR_LOG_DEBUG (
"Parsing schedule input file: " << _filename);
685 bsc::parse_info<iterator_t> info =
686 bsc::parse (_startIterator, _endIterator, lFPParser,
687 bsc::space_p - bsc::eol_p);
692 const std::string hasBeenFullyReadStr = (info.full ==
true)?
"":
"not ";
693 if (oResult ==
true) {
694 STDAIR_LOG_DEBUG (
"Parsing of schedule input file: " << _filename
695 <<
" succeeded: read " << info.length
696 <<
" characters. The input file has "
697 << hasBeenFullyReadStr
698 <<
"been fully read. Stop point: " << info.stop);
702 STDAIR_LOG_ERROR (
"Parsing of schedule input file: " << _filename
703 <<
" failed: read " << info.length
704 <<
" characters. The input file has "
705 << hasBeenFullyReadStr
706 <<
"been fully read. Stop point: " << info.stop);