##// END OF EJS Templates
Removed old Variable impl...
Removed old Variable impl Signed-off-by: Alexis Jeandet <alexis.jeandet@member.fsf.org>

File last commit:

r1416:f80abf731dd4
r1422:a323cf6b7201
Show More
AmdaResultParser.cpp
150 lines | 4.0 KiB | text/x-c | CppLexer
/ plugins / amda / src / AmdaResultParser.cpp
#include "AmdaResultParser.h"
#include "AmdaResultParserHelper.h"
#include <QFile>
#include <Data/IDataSeries.h>
#include <cmath>
Q_LOGGING_CATEGORY(LOG_AmdaResultParser, "AmdaResultParser")
namespace
{
/// Message in result file when the file was not found on server
const auto FILE_NOT_FOUND_MESSAGE = QStringLiteral("Not Found");
/// Checks if a line is a comment line
bool isCommentLine(const QString& line)
{
return line.startsWith("#");
}
/**
* Creates helper that will be used to read AMDA file, according to the type passed as parameter
* @param valueType the type of values expected in the AMDA file (scalars, vectors, spectrograms...)
* @return the helper created
*/
std::unique_ptr<IAmdaResultParserHelper> createHelper(DataSeriesType valueType)
{
switch (valueType)
{
case DataSeriesType::SCALAR:
return std::make_unique<ScalarParserHelper>();
case DataSeriesType::SPECTROGRAM:
return std::make_unique<SpectrogramParserHelper>();
case DataSeriesType::VECTOR:
return std::make_unique<VectorParserHelper>();
case DataSeriesType::NONE:
// Invalid case
break;
}
// Invalid cases
qCCritical(LOG_AmdaResultParser())
<< QObject::tr("Can't create helper to read result file: unsupported type");
return nullptr;
}
/**
* Reads properties of the stream passed as parameter
* @param helper the helper used to read properties line by line
* @param stream the stream to read
*/
void readProperties(IAmdaResultParserHelper& helper, QTextStream& stream)
{
// Searches properties in the comment lines (as long as the reading has not reached the data)
// AMDA V2: while (stream.readLineInto(&line) && !line.contains(DATA_HEADER_REGEX)) {
QString line {};
while (stream.readLineInto(&line) && isCommentLine(line))
{
helper.readPropertyLine(line);
}
}
/**
* Reads results of the stream passed as parameter
* @param helper the helper used to read results line by line
* @param stream the stream to read
*/
void readResults(IAmdaResultParserHelper& helper, QTextStream& stream)
{
QString line {};
// Skip comment lines
while (stream.readLineInto(&line) && isCommentLine(line))
{
}
if (!stream.atEnd())
{
do
{
helper.readResultLine(line);
} while (stream.readLineInto(&line));
}
}
} // namespace
std::shared_ptr<IDataSeries> AmdaResultParser::readTxt(
const QString& filePath, DataSeriesType type) noexcept
{
if (type == DataSeriesType::NONE)
{
qCCritical(LOG_AmdaResultParser())
<< QObject::tr("Can't retrieve AMDA data: the type of values to be read is unknown");
return nullptr;
}
QFile file { filePath };
if (!file.open(QFile::ReadOnly | QIODevice::Text))
{
qCCritical(LOG_AmdaResultParser())
<< QObject::tr("Can't retrieve AMDA data from file %1: %2")
.arg(filePath, file.errorString());
return nullptr;
}
return std::shared_ptr<IDataSeries> { AmdaResultParser::readTxt(QTextStream { &file }, type) };
}
IDataSeries* AmdaResultParser::readTxt(QTextStream stream, DataSeriesType type) noexcept
{
if (type == DataSeriesType::NONE)
{
return nullptr;
}
// Checks if the file was found on the server
auto firstLine = stream.readLine();
if (firstLine.compare(FILE_NOT_FOUND_MESSAGE) == 0)
{
return nullptr;
}
auto helper = createHelper(type);
Q_ASSERT(helper != nullptr);
// Reads header file to retrieve properties
stream.seek(0); // returns to the beginning of the file
readProperties(*helper, stream);
// Checks properties
if (helper->checkProperties())
{
// Reads results
// AMDA V2: remove line
stream.seek(0); // returns to the beginning of the file
readResults(*helper, stream);
// Creates data series
return helper->createSeries();
}
else
{
return nullptr;
}
}