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;
}
Example #3
0
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();

}