#4429 Implement return values from the gRPC Command execution

This commit is contained in:
Gaute Lindkvist 2019-05-23 16:46:50 +02:00
parent 650af20e06
commit cc031e7895
10 changed files with 185 additions and 43 deletions

View File

@ -69,7 +69,7 @@
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RiaImportEclipseCaseTools::openEclipseCasesFromFile(const QStringList& fileNames, QStringList* openedFiles, bool noDialog) bool RiaImportEclipseCaseTools::openEclipseCasesFromFile(const QStringList& fileNames, FileCaseIdMap* openedFilesOut, bool noDialog)
{ {
RiaApplication* app = RiaApplication::instance(); RiaApplication* app = RiaApplication::instance();
RimProject* project = app->project(); RimProject* project = app->project();
@ -80,12 +80,15 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile(const QStringList& file
selector.determineFilesToImportFromGridFiles(fileNames); selector.determineFilesToImportFromGridFiles(fileNames);
std::vector<RifSummaryCaseFileResultInfo> summaryFileInfos = selector.summaryFileInfos(); std::vector<RifSummaryCaseFileResultInfo> summaryFileInfos = selector.summaryFileInfos();
FileCaseIdMap openedFiles;
// Import eclipse case files // Import eclipse case files
for (const QString& gridCaseFile : selector.gridCaseFiles()) for (const QString& gridCaseFile : selector.gridCaseFiles())
{ {
if (RiaImportEclipseCaseTools::openEclipseCaseFromFile(gridCaseFile)) int caseId = RiaImportEclipseCaseTools::openEclipseCaseFromFile(gridCaseFile);
if (caseId >= 0)
{ {
if(openedFiles) openedFiles->push_back(gridCaseFile); openedFiles.insert(std::make_pair(gridCaseFile, caseId));
} }
} }
@ -178,13 +181,18 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile(const QStringList& file
RiuPlotMainWindowTools::refreshToolbars(); RiuPlotMainWindowTools::refreshToolbars();
return true; if (openedFilesOut)
{
*openedFilesOut = openedFiles;
}
return !openedFiles.empty();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RiaImportEclipseCaseTools::openEclipseCaseFromFile(const QString& fileName) int RiaImportEclipseCaseTools::openEclipseCaseFromFile(const QString& fileName)
{ {
if (!caf::Utils::fileExists(fileName)) return false; if (!caf::Utils::fileExists(fileName)) return false;
@ -198,7 +206,7 @@ bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilter(const QString&
{ {
if (!caf::Utils::fileExists(fileName)) return false; if (!caf::Utils::fileExists(fileName)) return false;
return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(fileName, true); return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(fileName, true) >= 0;
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -259,7 +267,7 @@ bool RiaImportEclipseCaseTools::openMockModel(const QString& name)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(const QString& fileName, bool showTimeStepFilter) int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(const QString& fileName, bool showTimeStepFilter)
{ {
QFileInfo gridFileName(fileName); QFileInfo gridFileName(fileName);
QString caseName = gridFileName.completeBaseName(); QString caseName = gridFileName.completeBaseName();
@ -274,7 +282,7 @@ bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(const QStr
if (analysisModels == nullptr) if (analysisModels == nullptr)
{ {
delete rimResultReservoir; delete rimResultReservoir;
return false; return -1;
} }
if (RiaGuiApplication::isRunning()) if (RiaGuiApplication::isRunning())
@ -290,7 +298,7 @@ bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(const QStr
delete rimResultReservoir; delete rimResultReservoir;
return false; return -1;
} }
RimEclipseView* riv = rimResultReservoir->createAndAddReservoirView(); RimEclipseView* riv = rimResultReservoir->createAndAddReservoirView();
@ -306,7 +314,7 @@ bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl(const QStr
RiuMainWindow::instance()->selectAsCurrentItem(riv->cellResult()); RiuMainWindow::instance()->selectAsCurrentItem(riv->cellResult());
return true; return rimResultReservoir->caseId();
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------

View File

@ -18,6 +18,8 @@
#pragma once #pragma once
#include <map>
class QString; class QString;
class QStringList; class QStringList;
@ -27,7 +29,9 @@ class QStringList;
class RiaImportEclipseCaseTools class RiaImportEclipseCaseTools
{ {
public: public:
static bool openEclipseCasesFromFile(const QStringList& fileNames, QStringList* openedFiles = nullptr, bool noDialog = false); typedef std::map<QString, int> FileCaseIdMap;
static bool openEclipseCasesFromFile(const QStringList& fileNames, FileCaseIdMap* openedFilesOut = nullptr, bool noDialog = false);
static bool openEclipseCaseShowTimeStepFilter(const QString& fileName); static bool openEclipseCaseShowTimeStepFilter(const QString& fileName);
static bool openEclipseInputCaseFromFileNames(const QStringList& fileNames, QString* fileContainingGrid = nullptr); static bool openEclipseInputCaseFromFileNames(const QStringList& fileNames, QString* fileContainingGrid = nullptr);
@ -36,7 +40,7 @@ public:
static bool addEclipseCases(const QStringList& fileNames); static bool addEclipseCases(const QStringList& fileNames);
private: private:
static bool openEclipseCaseFromFile(const QString& fileName); static int openEclipseCaseFromFile(const QString& fileName);
static bool openEclipseCaseShowTimeStepFilterImpl(const QString& fileName, bool showTimeStepFilter); static int openEclipseCaseShowTimeStepFilterImpl(const QString& fileName, bool showTimeStepFilter);
}; };

View File

@ -24,6 +24,17 @@
#include <QStringList> #include <QStringList>
CAF_PDM_SOURCE_INIT(RicfLoadCaseResult, "loadCaseResult");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
RicfLoadCaseResult::RicfLoadCaseResult(int caseId)
{
CAF_PDM_InitObject("case_result", "", "", "");
CAF_PDM_InitField(&this->caseId, "id", caseId, "", "", "", "");
}
CAF_PDM_SOURCE_INIT(RicfLoadCase, "loadCase"); CAF_PDM_SOURCE_INIT(RicfLoadCase, "loadCase");
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
@ -39,12 +50,17 @@ RicfLoadCase::RicfLoadCase()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
RicfCommandResponse RicfLoadCase::execute() RicfCommandResponse RicfLoadCase::execute()
{ {
bool ok = RiaImportEclipseCaseTools::openEclipseCasesFromFile(QStringList({m_path()}), nullptr, true); RiaImportEclipseCaseTools::FileCaseIdMap fileCaseIdMap;
bool ok = RiaImportEclipseCaseTools::openEclipseCasesFromFile(QStringList({m_path()}), &fileCaseIdMap, true);
if (!ok) if (!ok)
{ {
QString error = QString("loadCase: Unable to load case from %1").arg(m_path()); QString error = QString("loadCase: Unable to load case from %1").arg(m_path());
RiaLogging::error(error); RiaLogging::error(error);
return RicfCommandResponse(RicfCommandResponse::COMMAND_ERROR, error); return RicfCommandResponse(RicfCommandResponse::COMMAND_ERROR, error);
} }
return RicfCommandResponse(); CAF_ASSERT(fileCaseIdMap.size() == 1u);
RicfLoadCaseResult result;
RicfCommandResponse response;
response.setResult(new RicfLoadCaseResult(fileCaseIdMap.begin()->second));
return response;
} }

View File

@ -22,6 +22,15 @@
#include "cafPdmField.h" #include "cafPdmField.h"
class RicfLoadCaseResult : public caf::PdmObject
{
CAF_PDM_HEADER_INIT;
public:
RicfLoadCaseResult(int caseId = -1);
public:
caf::PdmField<int> caseId;
};
//================================================================================================== //==================================================================================================
// //
// //

View File

@ -68,12 +68,12 @@ void RicImportEclipseCasesFeature::onActionTriggered(bool isChecked)
// Remember the path to next time // Remember the path to next time
app->setLastUsedDialogDirectory("BINARY_GRID", QFileInfo(result.rootDir).absoluteFilePath()); app->setLastUsedDialogDirectory("BINARY_GRID", QFileInfo(result.rootDir).absoluteFilePath());
QStringList newCaseFiles; RiaImportEclipseCaseTools::FileCaseIdMap newCaseFiles;
RiaImportEclipseCaseTools::openEclipseCasesFromFile(result.files, &newCaseFiles); RiaImportEclipseCaseTools::openEclipseCasesFromFile(result.files, &newCaseFiles);
for (const auto newCaseFile : newCaseFiles) for (const auto newCaseFileAndId : newCaseFiles)
{ {
RiaApplication::instance()->addToRecentFiles(newCaseFile); RiaApplication::instance()->addToRecentFiles(newCaseFileAndId.first);
} }
} }

View File

@ -184,12 +184,12 @@ void RicImportGeneralDataFeature::openFileDialog(ImportFileType fileTypes)
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames(const QStringList& fileNames) bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames(const QStringList& fileNames)
{ {
QStringList newCaseFiles; RiaImportEclipseCaseTools::FileCaseIdMap newCaseFiles;
if (RiaImportEclipseCaseTools::openEclipseCasesFromFile(fileNames, &newCaseFiles)) if (RiaImportEclipseCaseTools::openEclipseCasesFromFile(fileNames, &newCaseFiles))
{ {
for (const auto newCaseFile : newCaseFiles) for (const auto newCaseFileAndId : newCaseFiles)
{ {
RiaApplication::instance()->addToRecentFiles(newCaseFile); RiaApplication::instance()->addToRecentFiles(newCaseFileAndId.first);
} }
return true; return true;
} }

View File

@ -1,12 +1,13 @@
syntax = "proto3"; syntax = "proto3";
import "CaseInfo.proto";
import "Empty.proto"; import "Empty.proto";
package rips; package rips;
service Commands service Commands
{ {
rpc Execute(CommandParams) returns(Empty) {} rpc Execute(CommandParams) returns(CommandReply) {}
} }
message SetTimeStepParams message SetTimeStepParams
@ -58,3 +59,12 @@ message CommandParams
} }
} }
message CommandReply
{
oneof result
{
Empty emptyResult = 1;
Case loadCaseResult = 2;
}
}

View File

@ -39,7 +39,7 @@ using namespace google::protobuf;
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
grpc::Status RiaGrpcCommandService::Execute(grpc::ServerContext* context, const CommandParams* request, Empty* reply) grpc::Status RiaGrpcCommandService::Execute(grpc::ServerContext* context, const CommandParams* request, CommandReply* reply)
{ {
auto requestDescriptor = request->GetDescriptor(); auto requestDescriptor = request->GetDescriptor();
RiaLogging::info(QString::fromStdString(requestDescriptor->name())); RiaLogging::info(QString::fromStdString(requestDescriptor->name()));
@ -69,7 +69,7 @@ grpc::Status RiaGrpcCommandService::Execute(grpc::ServerContext* context, const
if (pdmValueFieldHandle) if (pdmValueFieldHandle)
{ {
RiaLogging::info(QString("Found Matching Parameter: %1").arg(parameterName)); RiaLogging::info(QString("Found Matching Parameter: %1").arg(parameterName));
assignFieldValue(pdmValueFieldHandle, params, parameter); assignPdmFieldValue(pdmValueFieldHandle, params, parameter);
} }
} }
} }
@ -82,6 +82,9 @@ grpc::Status RiaGrpcCommandService::Execute(grpc::ServerContext* context, const
{ {
context->AddInitialMetadata("warning", response.message().toStdString()); context->AddInitialMetadata("warning", response.message().toStdString());
} }
assignResultToReply(response.result(), reply);
return Status::OK; return Status::OK;
} }
} }
@ -95,13 +98,13 @@ std::vector<RiaAbstractGrpcCallback*> RiaGrpcCommandService::createCallbacks()
{ {
typedef RiaGrpcCommandService Self; typedef RiaGrpcCommandService Self;
return {new RiaGrpcCallback<Self, CommandParams, Empty>(this, &Self::Execute, &Self::RequestExecute)}; return {new RiaGrpcCallback<Self, CommandParams, CommandReply>(this, &Self::Execute, &Self::RequestExecute)};
} }
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
void RiaGrpcCommandService::assignFieldValue(caf::PdmValueField* pdmValueField, void RiaGrpcCommandService::assignPdmFieldValue(caf::PdmValueField* pdmValueField,
const Message& params, const Message& params,
const FieldDescriptor* paramDescriptor) const FieldDescriptor* paramDescriptor)
{ {
@ -158,5 +161,95 @@ void RiaGrpcCommandService::assignFieldValue(caf::PdmValueField* pdmValueFiel
pdmValueField->setFromQVariant(qValue); pdmValueField->setFromQVariant(qValue);
} }
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaGrpcCommandService::assignGrpcFieldValue(google::protobuf::Message* reply,
const google::protobuf::FieldDescriptor* fieldDescriptor,
const caf::PdmValueField* pdmValueField)
{
FieldDescriptor::Type fieldDataType = fieldDescriptor->type();
QVariant qValue = pdmValueField->toQVariant();
switch (fieldDataType)
{
case FieldDescriptor::TYPE_BOOL: {
reply->GetReflection()->SetBool(reply, fieldDescriptor, qValue.toBool());
break;
}
case FieldDescriptor::TYPE_INT32: {
reply->GetReflection()->SetInt32(reply, fieldDescriptor, qValue.toInt());
break;
}
case FieldDescriptor::TYPE_UINT32: {
reply->GetReflection()->SetUInt32(reply, fieldDescriptor, qValue.toUInt());
break;
}
case FieldDescriptor::TYPE_INT64: {
reply->GetReflection()->SetInt64(reply, fieldDescriptor, qValue.toLongLong());
break;
}
case FieldDescriptor::TYPE_UINT64: {
reply->GetReflection()->SetUInt64(reply, fieldDescriptor, qValue.toULongLong());
break;
}
case FieldDescriptor::TYPE_STRING: {
reply->GetReflection()->SetString(reply, fieldDescriptor, qValue.toString().toStdString());
break;
}
case FieldDescriptor::TYPE_FLOAT: {
reply->GetReflection()->SetFloat(reply, fieldDescriptor, qValue.toFloat());
break;
}
case FieldDescriptor::TYPE_DOUBLE: {
reply->GetReflection()->SetDouble(reply, fieldDescriptor, qValue.toDouble());
break;
}
case FieldDescriptor::TYPE_ENUM: {
reply->GetReflection()->SetEnumValue(reply, fieldDescriptor, qValue.toInt());
break;
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RiaGrpcCommandService::assignResultToReply(const caf::PdmObject* result, CommandReply* reply)
{
if (!result)
{
reply->set_allocated_emptyresult(new Empty);
return;
}
QString resultType = result->classKeyword();
auto replyDescriptor = reply->GetDescriptor();
auto oneofDescriptor = replyDescriptor->FindOneofByName("result");
const FieldDescriptor* matchingOneOf = nullptr;
for (int fieldIndex = 0; fieldIndex < oneofDescriptor->field_count(); ++fieldIndex)
{
auto fieldDescriptor = oneofDescriptor->field(fieldIndex);
if (fieldDescriptor->name() == resultType.toStdString())
{
matchingOneOf = fieldDescriptor;
break;
}
}
CAF_ASSERT(matchingOneOf);
Message* message = reply->GetReflection()->MutableMessage(reply, matchingOneOf);
CAF_ASSERT(message);
auto resultDescriptor = message->GetDescriptor();
for (int fieldIndex = 0; fieldIndex < resultDescriptor->field_count(); ++fieldIndex)
{
auto fieldDescriptor = resultDescriptor->field(fieldIndex);
const auto pdmField =
dynamic_cast<const caf::PdmValueField*>(result->findField(QString::fromStdString(fieldDescriptor->name())));
assignGrpcFieldValue(message, fieldDescriptor, pdmField);
}
}
static bool RiaGrpcCommandService_init = static bool RiaGrpcCommandService_init =
RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcCommandService>(typeid(RiaGrpcCommandService).hash_code()); RiaGrpcServiceFactory::instance()->registerCreator<RiaGrpcCommandService>(typeid(RiaGrpcCommandService).hash_code());

View File

@ -24,14 +24,10 @@
#include <grpcpp/grpcpp.h> #include <grpcpp/grpcpp.h>
#include <vector> #include <vector>
namespace rips
{
class Empty;
}
namespace caf namespace caf
{ {
class PdmValueField; class PdmValueField;
class PdmObject;
} }
namespace google namespace google
@ -48,11 +44,15 @@ class RiaAbstractGrpcCallback;
class RiaGrpcCommandService : public rips::Commands::AsyncService, public RiaGrpcServiceInterface class RiaGrpcCommandService : public rips::Commands::AsyncService, public RiaGrpcServiceInterface
{ {
public: public:
grpc::Status Execute(grpc::ServerContext* context, const rips::CommandParams* request, rips::Empty* reply) override; grpc::Status Execute(grpc::ServerContext* context, const rips::CommandParams* request, rips::CommandReply* reply) override;
std::vector<RiaAbstractGrpcCallback*> createCallbacks() override; std::vector<RiaAbstractGrpcCallback*> createCallbacks() override;
private: private:
void assignFieldValue(caf::PdmValueField* pdmValueField, void assignPdmFieldValue(caf::PdmValueField* pdmValueField,
const google::protobuf::Message& params, const google::protobuf::Message& params,
const google::protobuf::FieldDescriptor* paramDescriptor); const google::protobuf::FieldDescriptor* paramDescriptor);
void assignGrpcFieldValue(google::protobuf::Message* reply,
const google::protobuf::FieldDescriptor* fieldDescriptor,
const caf::PdmValueField* pdmValueField);
void assignResultToReply(const caf::PdmObject* result, rips::CommandReply* reply);
}; };

View File

@ -44,7 +44,7 @@ class CommandExecutor:
def execute(self, commandParams): def execute(self, commandParams):
try: try:
self.commands.Execute(commandParams) return self.commands.Execute(commandParams)
except grpc.RpcError as e: except grpc.RpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND: if e.code() == grpc.StatusCode.NOT_FOUND:
print("Command not found") print("Command not found")
@ -61,7 +61,9 @@ class CommandExecutor:
return self.execute(Commands_pb2.CommandParams(openProject=Commands_pb2.FilePathRequest(path=path))) return self.execute(Commands_pb2.CommandParams(openProject=Commands_pb2.FilePathRequest(path=path)))
def loadCase(self, path): def loadCase(self, path):
return self.execute(Commands_pb2.CommandParams(loadCase=Commands_pb2.FilePathRequest(path=path))) commandReply = self.execute(Commands_pb2.CommandParams(loadCase=Commands_pb2.FilePathRequest(path=path)))
assert commandReply.HasField("loadCaseResult")
return commandReply.loadCaseResult.id
def closeProject(self): def closeProject(self):
return self.execute(Commands_pb2.CommandParams(closeProject=Empty())) return self.execute(Commands_pb2.CommandParams(closeProject=Empty()))