#2444 Batch : Fix support for multiple replaceCase in command file

This commit is contained in:
Magne Sjaastad
2018-02-05 08:47:10 +01:00
parent 5a7133f6e2
commit 082b82214d
5 changed files with 248 additions and 36 deletions

View File

@@ -18,11 +18,14 @@
#include "RicfCommandFileExecutor.h"
#include "RifcCommandFileReader.h"
#include "RicfCommandObject.h"
#include "RiaLogging.h"
#include "RicfCloseProject.h"
#include "RicfCommandObject.h"
#include "RicfOpenProject.h"
#include "RicfReplaceCase.h"
#include "RifcCommandFileReader.h"
namespace caf {
template<>
void RicfCommandFileExecutor::ExportTypeEnum::setUp()
@@ -54,22 +57,44 @@ RicfCommandFileExecutor::~RicfCommandFileExecutor()
//--------------------------------------------------------------------------------------------------
void RicfCommandFileExecutor::executeCommands(QTextStream& stream)
{
std::vector<RicfCommandObject*> commands = RicfCommandFileReader::readCommands(stream, caf::PdmDefaultObjectFactory::instance(), &m_messages);
for (auto message : m_messages.m_messages)
std::vector<RicfCommandObject*> executableCommands;
{
if (message.first == RicfMessages::MESSAGE_WARNING)
std::vector<RicfCommandObject*> fileCommands = RicfCommandFileReader::readCommands(stream, caf::PdmDefaultObjectFactory::instance(), &m_messages);
for (auto message : m_messages.m_messages)
{
RiaLogging::warning(QString("Command file parsing warning: %1").arg(message.second));
}
else
{
RiaLogging::error(QString("Command file parsing error: %1").arg(message.second));
return;
if (message.first == RicfMessages::MESSAGE_WARNING)
{
RiaLogging::warning(QString("Command file parsing warning: %1").arg(message.second));
}
else
{
RiaLogging::error(QString("Command file parsing error: %1").arg(message.second));
for (auto& command : fileCommands)
{
delete command;
command = nullptr;
}
return;
}
}
executableCommands = RicfCommandFileExecutor::prepareFileCommandsForExecution(fileCommands);
}
for (RicfCommandObject* command : commands)
for (auto& command : executableCommands)
{
command->execute();
delete command;
command = nullptr;
}
// All command objects should be deleted and grounded at this point
for (auto c : executableCommands)
{
CAF_ASSERT(c == nullptr);
}
}
@@ -119,3 +144,66 @@ RicfCommandFileExecutor* RicfCommandFileExecutor::instance()
static RicfCommandFileExecutor* commandFileExecutorInstance = new RicfCommandFileExecutor();
return commandFileExecutorInstance;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::vector<RicfCommandObject*> RicfCommandFileExecutor::prepareFileCommandsForExecution(const std::vector<RicfCommandObject*>& commandsReadFromFile)
{
// This function will merge multiple RicfSingleCaseReplace object by a single RicfMultiCaseReplace object
// A command file version for multi case replace was rejected by @hhgs 2018-02-02
//
// The reason for this is based on two requirements
// 1. Ability to aggregate info from multiple replaceCase() statements in a command file
// 2. Improve performance, as a replace case is implemented by reading a project file from XML and replace file paths
// during project loading
std::vector<RicfCommandObject*> executableCommands;
{
std::vector<RicfSingleCaseReplace*> objectsToBeDeleted;
std::vector<RicfSingleCaseReplace*> batchOfReplaceCaseFileObjects;
std::map<int, QString> aggregatedCasePathPairs;
for (RicfCommandObject* command : commandsReadFromFile)
{
RicfSingleCaseReplace* fileReplaceCase = dynamic_cast<RicfSingleCaseReplace*>(command);
if (fileReplaceCase)
{
aggregatedCasePathPairs[fileReplaceCase->caseId()] = fileReplaceCase->filePath();
batchOfReplaceCaseFileObjects.push_back(fileReplaceCase);
objectsToBeDeleted.push_back(fileReplaceCase);
}
else
{
if (!batchOfReplaceCaseFileObjects.empty())
{
RicfMultiCaseReplace* multiCaseReplace = new RicfMultiCaseReplace;
multiCaseReplace->setCaseReplacePairs(aggregatedCasePathPairs);
executableCommands.push_back(multiCaseReplace);
batchOfReplaceCaseFileObjects.clear();
}
if (dynamic_cast<RicfOpenProject*>(command) || dynamic_cast<RicfCloseProject*>(command))
{
// Reset aggregation when openProject or closeProject is issued
aggregatedCasePathPairs.clear();
}
executableCommands.push_back(command);
}
}
// Delete RicfSingleCaseReplace objects, as they are replaced by RicfMultiCaseReplace
for (auto objToDelete : objectsToBeDeleted)
{
delete objToDelete;
objToDelete = nullptr;
}
}
return executableCommands;
}