1 /** 2 * UGENE - Integrated Bioinformatics Tools. 3 * Copyright (C) 2008-2021 UniPro <ugene@unipro.ru> 4 * http://ugene.net 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 2 9 * of the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 19 * MA 02110-1301, USA. 20 */ 21 22 #ifndef _U2_WORKFLOW_HR_SCHEMA_SERIALIZER_H_ 23 #define _U2_WORKFLOW_HR_SCHEMA_SERIALIZER_H_ 24 25 #include <QByteArray> 26 #include <QObject> 27 #include <QString> 28 #include <QStringList> 29 30 #include <U2Core/global.h> 31 32 #include <U2Lang/ActorModel.h> 33 #include <U2Lang/Aliasing.h> 34 #include <U2Lang/Dataset.h> 35 #include <U2Lang/GrouperOutSlot.h> 36 #include <U2Lang/Port.h> 37 #include <U2Lang/Schema.h> 38 #include <U2Lang/URLContainer.h> 39 40 #include "Utils.h" 41 42 namespace U2 { 43 44 using namespace Workflow; 45 using namespace WorkflowSerialize; 46 47 class AttributeConfig; 48 class DataConfig; 49 class ExternalProcessConfig; 50 class Marker; 51 52 class U2LANG_EXPORT HRSchemaSerializer : public QObject { 53 Q_OBJECT 54 public: 55 typedef QMap<ActorId, QString> NamesMap; 56 57 static void parseHeader(Tokenizer &tokenizer, Metadata *meta); 58 static void parseIncludes(Tokenizer &tokenizer, QList<QString> includedUrls); 59 static void parseBodyHeader(Tokenizer &tokenizer, Metadata *meta, bool needName = true); 60 static Actor *parseElementsDefinition(Tokenizer &tokenizer, const QString &actorName, QMap<QString, Actor *> &actorMap, QMap<ActorId, ActorId> *idMap = nullptr); 61 static ValidatorDesc parseValidator(const QString &desc, U2OpStatus &os); 62 static void parseGrouperOutSlots(Actor *proc, const QStringList &outSlots, const QString &attrId); 63 static QPair<Port *, Port *> parseDataflow(Tokenizer &tokenizer, const QString &srcTok, const QMap<QString, Actor *> &actorMap); 64 static QString parseAt(const QString &dottedStr, int ind); 65 static QString parseAfter(const QString &dottedStr, int ind); 66 static QMap<ActorId, QVariantMap> parseIteration(Tokenizer &tokenizer, 67 const QMap<QString, Actor *> &actorMap, 68 bool pasteMode = false); 69 static void parseActorBindings(Tokenizer &tokenizer, WorkflowSchemaReaderData &data); 70 static void parseParameterAliases(Tokenizer &tokenizer, const QMap<QString, Actor *> &actorMap); 71 static void parsePortAliases(Tokenizer &tokenizer, const QMap<QString, Actor *> &actorMap, QList<PortAlias> &portAliases); 72 73 static void finalizeGrouperSlots(const QMap<QString, Actor *> &actorMap); 74 75 // -------------- backward compatibility -------------- 76 static void parseOldAliases(Tokenizer &tokenizer, const QMap<QString, Actor *> &actorMap); 77 static void parseAliasesHelp(Tokenizer &tokenizer, const QList<Actor *> &procs); 78 static Actor *deprecatedActorsReplacer(const QString &id, const QString &protoId, ParsedPairs &pairs); 79 // ---------------------------------------------------- 80 81 // if slot has no val-> add it to binding 82 static void addEmptyValsToBindings(const QList<Actor *> &procs); 83 // idMap not null in copy mode 84 static QString string2Schema(const QString &data, Schema *schema, Metadata *meta = nullptr, QMap<ActorId, ActorId> *idMap = nullptr, QList<QString> includedUrls = QList<QString>()); 85 // the method checks port relations: 86 // if the attribute has port relation and the port has a link - the value of attribute must be set to the value that allows port enabling 87 static void postProcessing(Schema *schema); 88 89 static void addPart(QString &to, const QString &w); 90 static QString header2String(const Metadata *meta); 91 static QString makeBlock(const QString &title, const QString &name, const QString &blockItself, int tabsNum = 1, bool nl = false, bool sc = false); 92 static QString makeEqualsPair(const QString &key, const QString &value, int tabsNum = 2, bool quoteEmpty = false); 93 static QString makeArrowPair(const QString &left, const QString &right, int tabsNum = 1); 94 static QString scriptBlock(const QString &scriptText, int tabsNum = 3); 95 static QString includesDefinition(const QList<Actor *> &procs); 96 static QString elementsDefinition(const QList<Actor *> &procs, const NamesMap &nmap, bool copyMode = false); 97 static QString markersDefinition(Attribute *attribute); 98 static QString grouperOutSlotsDefinition(Attribute *attribute); 99 static QString actorBindings(const ActorBindingsGraph &graph, const NamesMap &nmap, bool copyMode = false); 100 static QString dataflowDefinition(const QList<Actor *> &procs, const NamesMap &nmap); 101 static QString schemaParameterAliases(const QList<Actor *> &procs, const NamesMap &nmap); 102 static QString schemaPortAliases(const NamesMap &nmap, const QList<PortAlias> &portAliases); 103 static NamesMap generateElementNames(const QList<Actor *> &procs); 104 static QString schema2String(const Schema &schema, const Metadata *meta, bool copyMode = false); 105 static QString items2String(const QList<Actor *> &actors, const Metadata *meta); 106 107 static ExternalProcessConfig *string2Actor(const QString &bytes); 108 static QString actor2String(ExternalProcessConfig *cfg); 109 static ExternalProcessConfig *parseActorBody(Tokenizer &tokenizer); 110 static void parsePorts(Tokenizer &tokenizer, QList<DataConfig> &ports); 111 static void parseAttributes(Tokenizer &tokenizer, QList<AttributeConfig> &attrs); 112 113 static QMap<ActorId, ActorId> deepCopy(const Schema &from, Schema *to, U2OpStatus &os); 114 115 static bool isHeaderLine(const QString &line); 116 static QString valueString(const QString &s, bool quoteEmpty = false); 117 118 static void saveSchema(Schema *schema, Metadata *meta, const QString &url, U2OpStatus &os); 119 120 static Marker *parseMarker(ParsedPairs &pairs, const QString &MARKER_TYPE, const QString &MARKER_NAME); 121 122 private: 123 static GrouperSlotAction parseAction(Tokenizer &tokenizer); 124 static QList<Dataset> parseUrlAttribute(const QString attrId, QList<StrStrPair> &blockPairs); 125 static void deprecatedUrlAttribute(Actor *proc, const QString &urls); 126 static URLContainer *parseDirectoryUrl(Tokenizer &tokenizer); 127 static URLContainer *parseDbSelectUrl(Tokenizer &tokenizer); 128 static URLContainer *createDbObjectUrl(const QString &dbUrl, const qint64 objId, const QString &dataType, const QString &objCachedName); 129 static DbFolderUrlContainer *createDbFolderUrl(const QString &dbUrl, const QString &dataType, const QString &path, bool recursive); 130 static void checkHeaderLine(const QString &line, Tokenizer &tokenizer); 131 static void parseMarkers(Actor *proc, const QStringList &markers, const QString &attrId); 132 static Marker *parseMarker(const QString &def); 133 }; 134 135 } // namespace U2 136 137 #endif // _U2_WORKFLOW_HR_SCHEMA_SERIALIZER_H_ 138