DownloadOutput.hh 7.11 KB
/**
 * DownloadOutput.hh
 *
 *  Created on: 02 oct. 2014
 *      Author: AKKA
 */

#ifndef PARAMOUTPUTASCIIFILE_HH_
#define PARAMOUTPUTASCIIFILE_HH_

#include "ParamOutput.hh"
#include "DownloadProperties.hh"
#include "DownloadLogger.hh"
#include "FileWriter.hh"
#include "ParameterIndexesTool.hh"
#include "StatisticProcess.hh"
#include "Catalog.hh"


#include <memory>

namespace AMDA {
namespace ParamOutputImpl {
namespace Download {

/**
 * @class DownloadOutput
 * @brief Implementation of a ParamOutput to download data.
 * @details
 */
class DownloadOutput: public AMDA::Parameters::VisitorOfParamData,
		public AMDA::Parameters::ParamOutput {
public:
	DownloadOutput(AMDA::Parameters::ParameterManager& pParameterManager);

	virtual ~DownloadOutput();

	/**
	 * @overload DataClient::establishConnection()
	 */
	virtual void establishConnection();

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataScalaireShort *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataScalaireFloat *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataScalaireDouble *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataScalaireLongDouble *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataScalaireInt *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataLogicalData *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab1DShort *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab1DFloat *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab1DDouble *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab1DLongDouble *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab1DInt *);

	/**
	 * @overload VisitorOfParamData::visit()
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab1DLogicalData *);

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DShort *)
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab2DShort *);

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DFloat *)
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab2DFloat *);

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DDouble *)
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab2DDouble *);

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DLongDouble *)
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab2DLongDouble *);

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DInt *)
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab2DInt *);

	/**
	 * @overload VisitorOfParamData::visit(ParamDataTab2DLogicalData *)
	 */
	virtual void visit(AMDA::Parameters::ParamDataTab2DLogicalData *);

	/*
	 * @brief Get Download request properties
	 */
	DownloadProperties& getDownloadProperties()
	{
			return _downloadProperties;
	}

	/*
	 * @brief Set Download request properties
	 */
	void setDownloadProperties(const DownloadProperties& downloadProperties)
	{
		_downloadProperties = downloadProperties;
	}

protected:
	/**
	 * @overload ParamOutput::init()
	 */
	virtual void init();

	/**
	 * @overload ParamOutput::apply()
	 */
	virtual void apply();

	/*
	 * @brief write information in file
	 */
	void writeInfo(bool isWriteIntervalInfo, bool isWriteOnlyIntervalInfo,
			bool isFinalizeInfoFile);

	/*
	 * @brief write AMDA information
	 */
	void writeAMDAInfo(void);

	/*
	 * @brief write request information
	 */
	void writeRequestInfo(void);

	/*
	 * @brief write param information
	 */
	void writeParamInfo(void);

	/*
	 * @brief write current interval information
	 */
	void writeIntervalInfo(void);

	/*
	 * @overload ParamOutput::terminate - Terminate output: Write too small intervals file
	 */
	virtual void terminate(void);

	/*
	 * @brief Get name of request TimeTable
	 */
	std::string getTTName(void);

	/*
	 * @brief Create a new data file
	 */
	void createNewDataFile(void);

	/*
	 * @brief Create parameters in relation with the download properties
	 */
	void createParameters(void);

	/*
	 * @brief create file writer associated to the requested file format
	 */
	void createFileWriter(void);

	/*
	 * @brief Get file path in relation with the sequence step
	 */
	std::string getFilePath(std::string extension, bool infoFile = false);

	/*
	 * @brief Get file info path in relation with the sequence step (only used if info is written is separate file)
	 */
	std::string getInfoFilePath(std::string extension);

	/*
	 * @brief Apply structure for "one-file"
	 */
	void applyOneFileStructure(bool isFirstInterval);

	/*
	 * @brief Apply structure for "one-file-per-interval"
	 */
	void applyOneFilePerInterval(bool separateInfoFile, bool isFirstInterval);

	/*
	 * @brief Apply structure for "one-file-per-parameter-per-interval"
	 */
	void applyOneFilePerParameterPerInterval(bool separateInfoFile, bool isFirstInterval);

	/*
	 * @brief Get parameter from server and write it
	 */
	void getParameterDataFromServer(std::string paramId);

	/*
	 * @brief Add the parameter definition in the current file if needed
	 */
	void addParameterInFile(std::string paramId, FileWriter::FileDataType type, bool isFirstParam, int dim1Size = 1, int dim2Size = 1);

	/*
	 * @brief Get parameter indexes
	 */
	void buildParamIndexes(std::string paramId, int dim1Size = 1, int dim2Size = 1);

	/*
	 * @brief To know if we need to create a too small interval file
	 */
	bool isNeedToGenerateTooSmallIntervalFile(void);

	/*
	 * @brief Build a too small interval file
	 */
	void buildTooSmallIntervalCatalog(void);

	/*
	 * @brief Init mean processes for small interval treatments
	 */
	void initMeanProcessMapForSmallInterval(std::map<std::string,std::shared_ptr<AMDA::Parameters::StatisticProcess>>& meanProcessMap);

private:
	/**
	 * Download properties
	 */
	DownloadProperties	_downloadProperties;

	/*
	 * File writer
	 */
	FileWriter::FileWriter *_fileWriter;

	/**
	 * @brief id of current output parameter.
	 */
	std::string _currentParamId;

	/**
	 * @brief id of the first output parameter.
	 */
	std::string _firstParamId;

	/**
	 * @brief list of indexes list for all output parameters (build during the first visit of each parameters)
	 */
	std::map<std::string, AMDA::Common::ParameterIndexComponentList> _paramsIndexList;

	/*
	 * @brief map to know if a parameter is already added in the current file
	 */
	std::map<std::string, bool> _paramDefinedInFile;

	/*
	 * @brief map of mean statistic processes for too small intervals
	 */
	std::map<std::string,std::shared_ptr<AMDA::Parameters::StatisticProcess>> _tooSmallIntervalProcessMap;

	/*
	 * @brief Index of current interval
	 */
	int _currentIntervalIndex;

	/*
	 * @brief Catalog for too small time intervals
	 */
	TimeTableCatalog::Catalog _smallIntervalsCatalog;;
};

} /* namespace Download */
} /* namespace ParamOutputImpl */
} /* namespace AMDA */

#endif /* PARAMOUTPUTASCIIFILE_HH_ */