QJsonObject WorkflowJSONConnector::createJSONOperationMetadata(const SPWorkFlowNode& node, const std::vector<SPWorkFlowNode>& outNodes) { QJsonObject jsonMeta; jsonMeta["longname"] = node->name(); jsonMeta["label"] = node->label(); jsonMeta["description"] = node->description(); quint64 nid = node->id(); std::vector<SPWorkFlowNode>::const_iterator p = std::find_if( outNodes.begin(), outNodes.end(), [nid] (const SPWorkFlowNode& nod) { return nod->id() == nid; } ); if (p != outNodes.end()) jsonMeta["final"] = true; else jsonMeta["final"] = false; IOperationMetaData op = node->operation(); if (op.isValid()){ QString provider = op->resource()["namespace"].toString(); jsonMeta["resource"] = provider; jsonMeta["syntax"] = op->resource()["syntax"].toString(); QString keywords = op->resource()["keyword"].toString(); jsonMeta["keywords"] = keywords; jsonMeta["outputparametercount"] = (int) op->outputParameterCount(); } jsonMeta["inputparametercount"] = node->inputCount(); return jsonMeta; }
/** * Executes an operation (or workflow) and generates output * @param parameters the input and output parameters that the user filled in */ QString OperationCatalogModel::executeoperation(quint64 operationid, const QString& parameters, QVariant runparams) { try { IOperationMetaData metadata; metadata.prepare(operationid); auto opExpr = OperationExpression::createExpression(operationid, parameters); if ( metadata.isValid() && opExpr.isValid()){ if ( metadata->resource().hasProperty("runinmainthread")){ // some operations may not run in a different thread. particular operations that invoke methods from the qml which must run in the mainthread OperationWorker::run(opExpr); }else { QThread* thread = new QThread; thread->setProperty("runparameters",runparams); OperationWorker* worker = new OperationWorker(opExpr); worker->moveToThread(thread); thread->setProperty("workingcatalog", qVariantFromValue(context()->workingCatalog())); thread->connect(thread, &QThread::started, worker, &OperationWorker::process); thread->connect(worker, &OperationWorker::finished, thread, &QThread::quit); thread->connect(worker, &OperationWorker::finished, worker, &OperationWorker::deleteLater); thread->connect(thread, &QThread::finished, thread, &QThread::deleteLater); thread->connect(worker, &OperationWorker::finished, this, &OperationCatalogModel::workerFinished); thread->start(); return "TODO"; } } return sUNDEF; } catch (const ErrorObject& err){ emit error(err.message()); } return sUNDEF; }
void WorkflowModel::selectOperation(const QString& id) { IOperationMetaData op; op.prepare(id.toULongLong()); if ( op.isValid()){ _selectedOperation.clear(); _selectedOperation.append(new IlwisObjectModel(op->resource(),this)); } emit selectionChanged(); }