SpaceWriter.cc 6.92 KB
/*
 * SpaceWriter.cc
 *
 *  Created on: 31/05/2021
 *      Author: akka
 */

#include <iostream>

#include "SpaceData.hh"
#include "SpaceWriter.hh"
#include <fstream>
#include "TimeTableCatalogUtil.hh"

#include <boost/algorithm/string.hpp>

namespace TimeTableCatalog {

const std::string SpaceWriter::FORMAT = "SPACE";

SpaceWriter::SpaceWriter(const std::string& pPath, const std::string& pName) :
		AbstractWriter(pPath, pName) {

}

SpaceWriter::~SpaceWriter() {
}

// ----------------- PUBLIC --------------------------

std::string SpaceWriter::write(const TimeTable& pTT) {
	LOG4CXX_DEBUG(logger, "Opening file " << getFile(pTT));
	std::ofstream ttfile(getFile(pTT), std::ios::out);

	// -- open file
	if (ttfile) {
		LOG4CXX_DEBUG(logger, "Writing metadata");
		writeMetaData(pTT, ttfile);
		LOG4CXX_DEBUG(logger, "Writing intervals");
		writeIntervals(pTT, ttfile);
	}
	LOG4CXX_DEBUG(logger, "End Of writing");
	// -- close file
	ttfile.close();

	return getFile(pTT);
}

/**
 * Creates an instance of this.
 */
std::unique_ptr<AbstractWriter> SpaceWriter::createInstance(
		const std::string& pPath, const std::string& pName) {
	return std::unique_ptr < AbstractWriter > (new SpaceWriter(pPath, pName));
}

/**
 * Gets the tt file expected extension, starting with .
 */
const std::string SpaceWriter::getExtension() const {
	return ".txt";
}

// ----------------- PRIVATE --------------------------

void SpaceWriter::writeMetaData(const TimeTable& pTT,
		std::ostream& pOut) {
                    // write version 
                     pOut << "# " <<SpaceData::EVENT_TABLE_VERSION_KEYWORD << " " << pTT._eventTableVersion << std::endl;
                     	// -- write ListTitle
	pOut << "# " << SpaceData::LIST_TITLE_KEYWORD<< " " << pTT._name << std::endl;
                          	// -- write ListID
	pOut << "# " << SpaceData::LIST_ID_KEYWORD<< " " << pTT._listID << std::endl;
        
        	// -- write creation date
	pOut << "# " << SpaceData::CREATION_DATE_KEYWORD << " ";
	writeTimeData(pTT._creationDate, pTT._extTimeFormat, pOut);
	pOut << std::endl;
        
        	// -- write modify date
	pOut << "# " << SpaceData::MODIFY_DATE_KEYWORD << " ";
                    if(pTT._modificationDate == 0){
                             pOut <<"0001-01-01T00:00:00:00.000Z";
                    }else{
                            writeTimeData(pTT._modificationDate, pTT._extTimeFormat, pOut);
                    }
	pOut << std::endl;
        
                    ParameterDescriptionList pdl = pTT.getParameterDescritptions();
                    // FieldNames
                   pOut << "# " << SpaceData::FIELD_NAMES_KEYWORD << " "<< "t_begin" <<" "<< "t_end"<<" ";
	for (auto parameterDescription : pdl) {
		pOut << parameterDescription.getId() << " ";
	}
                   pOut <<std::endl;
                   
                     // FieldUnits
                   pOut << "# " << SpaceData::FIELD_UNIT_KEYWORD << " "<< "DateTime" <<" "<< "DateTime"<<" ";
                    std::string unit;
                   for (auto parameterDescription : pdl) {
                                        unit = parameterDescription.getUnit().empty() ? "None" :  parameterDescription.getUnit();
		pOut << unit << " ";
	}
                   pOut <<std::endl;
                   
                   // FieldTypes
                   pOut << "# " << SpaceData::FIELD_TYPES_KEYWORD << " "<< "char" <<" "<< "char"<<" ";
                   for (auto parameterDescription : pdl) {
		pOut << getTypeAsString(parameterDescription.getType()) << " ";
	}
                   pOut <<std::endl;
                   
                   // # FieldNulls
                    pOut << "# " << SpaceData::FIELD_NULLS_KEYWORD << " "<< " "<< "0001-01-01T00:00:00:00.000Z" <<" "<< "0001-01-01T00:00:00:00.000Z"<<" ";;
                   for (auto parameterDescription : pdl) {
		pOut << parameterDescription.getNull() << " ";
	}
                   pOut <<std::endl;                  
                   
                   //ListStartDate
                   pOut << "# " << SpaceData::LIST_START_DATE_KEYWORD << " ";
                   if(pTT._listStartDate == 0){
                           pOut <<"0001-01-01T00:00:00:00.000Z";
                   }else{ 
                           writeTimeData(pTT._listStartDate, pTT._extTimeFormat, pOut);
                   }
	pOut << std::endl;
        
                   //ListStopDate
                   pOut << "# " << SpaceData::LIST_STOP_DATE_KEYWORD << " ";
                   if(pTT._listStopDate == 0){
                           pOut <<"0001-01-01T00:00:00:00.000Z";
                   }else{ 
                           writeTimeData(pTT._listStopDate, pTT._extTimeFormat, pOut);
                   }
	pOut <<  std::endl;
        
                    // Contact:
                    pOut << "# " << SpaceData::CONTACT_KEYWORD << " " << pTT._contact << std::endl;
                    
                    // Contact:
                    pOut << "# " << SpaceData::CONTACT_ID_KEYWORD << " " << pTT._contactID << std::endl;
        
        
	// -- write description
                    pOut << "# " << SpaceData::DESCRIPTION_KEYWORD <<std::endl;
	for (auto line : pTT._description) {
		pOut << "# " << line << std::endl;
	}
                    if(! pTT._history.empty()) {
                             std::string history = pTT._history;
                             boost::replace_all(history, "\n", "\n# ");
                             pOut << "# " << history << std::endl;
                    }
        
                    // repeat variable names
                    pOut << "# " << "t_begin" <<" "<< "t_end"<<" ";
                     for (auto parameterDescription : pdl) {
		pOut << parameterDescription.getId() << " ";
	}
                    pOut <<  std::endl;
}

void SpaceWriter::writeIntervals(const TimeTable& pTT, std::ostream& pOut) {
	ParameterDescriptionList pdl = pTT.getParameterDescritptions();

	for (TimeInterval interval : pTT.getIntervals()) {
		writeTimeData(interval._startTime, pTT._extTimeFormat, pOut);
		pOut << SpaceData::SEPARATOR;
		writeTimeData(interval._stopTime, pTT._extTimeFormat, pOut);

		// If the TT has a parameter description list, write parameter data
		if (pdl.empty() == false) {
			for (auto parameterDescription : pdl) {
				std::vector<std::string> dataValues = interval.getParameterData (parameterDescription.getId());

				for (auto dataValue : dataValues) {
					pOut << SpaceData::SEPARATOR << dataValue;
				}
			}
		}

		// skip to next line
		pOut << std::endl;
	}
}

std::string SpaceWriter::getTypeAsString(ParameterDescription::ParameterType type) {
	switch (type) {
		case ParameterDescription::ParameterType::Unknown:
			return "string";
		case ParameterDescription::ParameterType::Double:
			return "double";
		case ParameterDescription::ParameterType::Date:
			return "date";
		case ParameterDescription::ParameterType::String:
			return "string";
		case ParameterDescription::ParameterType::Integer:
			return "integer";
	}
	return "string";
}

} /* namespace TimeTableCatalog */