/* * TimeTableCatalogFactory.cc * * Created on: 8 août 2013 * Author: CS */ #include "TimeTableCatalogFactory.hh" #include "AsciiReader.hh" #include "SpaceReader.hh" #include "SpaceWriter.hh" #include "InternalXMLReader.hh" #include "VOTableReader.hh" #include "AsciiWriter.hh" #include "InternalXMLWriter.hh" #include "VOTableWriter.hh" #include namespace TimeTableCatalog { std::unique_ptr TimeTableCatalogFactory::_instance = nullptr; std::once_flag TimeTableCatalogFactory::_onceFlag; std::map TimeTableCatalogFactory::_readers = std::map(); std::map TimeTableCatalogFactory::_writers = std::map(); TimeTableCatalogFactory::TimeTableCatalogFactory() { // register readers registerReader(AsciiReader::FORMAT, new AsciiReader(std::string())); registerReader(InternalXMLReader::FORMAT, new InternalXMLReader(std::string())); registerReader(VOTableReader::FORMAT, new VOTableReader(std::string())); registerReader(SpaceReader::FORMAT, new SpaceReader(std::string())); // register writers registerWriter(AsciiWriter::FORMAT, new AsciiWriter(std::string())); registerWriter(InternalXMLWriter::FORMAT, new InternalXMLWriter(std::string())); registerWriter(VOTableWriter::FORMAT, new VOTableWriter(std::string())); registerWriter(SpaceWriter::FORMAT, new SpaceWriter(std::string())); } TimeTableCatalogFactory::~TimeTableCatalogFactory() { std::map::const_iterator itr; for (itr = _readers.begin(); itr != _readers.end(); ++itr) { delete (*itr).second; } std::map::const_iterator itw; for (itw = _writers.begin(); itw != _writers.end(); ++itw) { delete (*itw).second; } } void TimeTableCatalogFactory::registerReader(const std::string& pKey, AbstractReader* pReader) { // register if not already in if (_readers.find(pKey) == _readers.end()) { _readers[pKey] = pReader; } } void TimeTableCatalogFactory::registerWriter(const std::string& pKey, AbstractWriter* pWriter) { // register if not already in if (_writers.find(pKey) == _writers.end()) { _writers[pKey] = pWriter; } } std::string TimeTableCatalogFactory::getReaderType( const std::string& pPath) { for (std::map::const_iterator iterator = TimeTableCatalogFactory::_readers.begin(); iterator != TimeTableCatalogFactory::_readers.end(); ++iterator) { if (iterator->second->canRead(pPath)) { return iterator->first; } } return std::string(); } /** * Checks a reader exists for this type. */ bool TimeTableCatalogFactory::canRead(const std::string& pType) const { for (std::map::const_iterator iterator = TimeTableCatalogFactory::_readers.begin(); iterator != TimeTableCatalogFactory::_readers.end(); ++iterator) { if (pType == iterator->first) { return true; } } return false; } std::unique_ptr TimeTableCatalogFactory::createReader( const std::string& pKey, const std::string& pPath) const { std::map::const_iterator it = _readers.find(pKey); if (it != _readers.end()) { return ((*it).second)->createInstance(pPath); } return 0; } std::unique_ptr TimeTableCatalogFactory::createWriter( const std::string& pKey, const std::string& pPath, const std::string& pName) const { std::map::const_iterator it = _writers.find(pKey); if (it != _writers.end()) { return ((*it).second)->createInstance(pPath, pName); } return 0; } /** * Reads a time table. */ void TimeTable::read(const std::string& ppath, const std::string& ptype) { std::unique_ptr reader = TimeTableCatalogFactory::getInstance().createReader(ptype, ppath); reader->read(*this); } /** * Writes a time table. */ std::string TimeTable::write(const std::string& ppath, const std::string& ptype, const std::string& pName) const { std::unique_ptr writer = TimeTableCatalogFactory::getInstance().createWriter(ptype, ppath, pName); return writer->write(*this); } /** * Reads a time table and writes it into another format. */ void TimeTable::convert(const std::string& pInPath, const std::string& pInType, const std::string& pOutPath, const std::string& pName, const std::string& pOutType) { read(pInPath, pInType); write(pOutPath, pOutType, pName); } } /* namespace TimeTableCatalog */