#include "input.hh" #include "inputcsv.hh" #include "inputlogcsv.hh" #include "calibrationrequest.hh" #include "configuration.hh" #include "posexcept.hh" #include "stock.hh" using namespace std ; /* *** Constructors *** */ Input::Input() { medium = NULL ; initialise_input_medium() ; initialise_log_media() ; } Input::~Input() { delete medium ; } /* *** Operations *** */ void Input::initialise_input_medium() { if (! Configuration::is_configured("input.medium")) throw no_input_medium() ; const string &medium_name = Configuration::string_value("input.medium") ; if (medium_name == "CSV") { if (! Configuration::is_configured("input.csv-file")) throw no_input_csv_file() ; medium = new InputCSV(Configuration::string_value("input.csv-file")) ; } else throw input_medium_type_unknown(medium_name) ; } void Input::initialise_log_media() { if (! Configuration::is_configured("log.medium")) return ; if (Configuration::value_exists_in_string_vector("log.medium", "none")) return ; const vector &media_names = Configuration::string_vector_value("log.medium") ; for (vector::const_iterator i = media_names.begin() ; i != media_names.end() ; ++i) { if (*i == "CSV") initialise_log_csv() ; else throw input_medium_type_unknown(*i) ; } } void Input::initialise_log_csv() { if (! Configuration::is_configured("log.csv-file")) throw no_log_csv_file() ; log_media.push_back( new InputLogCSV( Configuration::string_value("log.csv-file"))) ; } const Request& Input::get_next_request() const { if (! eof()) { const Request &request = medium->get_next_request() ; add_request_to_stock(request) ; log_current_request() ; } return medium->get_current_request() ; } bool Input::eof() const { if (medium == NULL) throw null_input_medium() ; return medium->eof() ; } void Input::add_request_to_stock(const Request &request) const { // For the moment we add only the CalibrationRequests to the Stock const CalibrationRequest *calibration_request = dynamic_cast(&request) ; if (calibration_request == NULL) return ; // Add request to the Stock const CalibrationRequest &stock_calibration_request = Stock::find_create_calibration_request(*calibration_request) ; // Add the request to the request list of its reference point stock_calibration_request.reference_point_backward_link() ; } void Input::log_current_request() const { for (vector::const_iterator i = log_media.begin() ; i != log_media.end() ; ++i) (*i)->log_request(medium->get_current_request()) ; }