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_DOC_WORKERS_H_ 23 #define _U2_WORKFLOW_DOC_WORKERS_H_ 24 25 #include <U2Core/IOAdapter.h> 26 27 #include <U2Lang/CoreLibConstants.h> 28 29 #include "BaseDocWriter.h" 30 #include "CoreLib.h" 31 32 namespace U2 { 33 34 class DatasetFilesIterator; 35 36 namespace LocalWorkflow { 37 38 // generic sequence writer 39 class SeqWriter : public BaseDocWriter { 40 Q_OBJECT 41 public: 42 SeqWriter(Actor *a); 43 SeqWriter(Actor *a, const DocumentFormatId &fid); 44 45 static bool hasSequence(const QVariantMap &data); 46 static bool hasSequenceOrAnns(const QVariantMap &data); 47 static GObject *getSeqObject(const QVariantMap &data, WorkflowContext *context); 48 static GObject *getAnnObject(const QVariantMap &data, WorkflowContext *context); 49 50 protected: 51 int numSplitSequences; 52 int currentSplitSequence; 53 54 virtual void data2doc(Document *, const QVariantMap &); 55 virtual bool hasDataToWrite(const QVariantMap &data) const; 56 virtual QSet<GObject *> getObjectsToWrite(const QVariantMap &data) const; 57 virtual void storeEntry(IOAdapter *io, const QVariantMap &data, int entryNum); 58 59 virtual void takeParameters(U2OpStatus &os); 60 virtual QStringList takeUrlList(const QVariantMap &data, int metadataId, U2OpStatus &os); 61 virtual bool isStreamingSupport() const; 62 }; 63 64 class MSAWriter : public BaseDocWriter { 65 Q_OBJECT 66 public: MSAWriter(Actor * a,const DocumentFormatId & fid)67 MSAWriter(Actor *a, const DocumentFormatId &fid) 68 : BaseDocWriter(a, fid) { 69 } MSAWriter(Actor * a)70 MSAWriter(Actor *a) 71 : BaseDocWriter(a) { 72 } 73 74 protected: 75 virtual void data2doc(Document *, const QVariantMap &); 76 virtual bool isStreamingSupport() const; 77 virtual bool hasDataToWrite(const QVariantMap &data) const; 78 virtual QSet<GObject *> getObjectsToWrite(const QVariantMap &data) const; 79 80 public: 81 static void data2document(Document *, const QVariantMap &, WorkflowContext *); 82 }; 83 84 class TextReader : public BaseWorker { 85 Q_OBJECT 86 public: 87 TextReader(Actor *a); 88 89 void init(); 90 Task *tick(); 91 void cleanup(); 92 93 private: 94 DataTypePtr mtype; 95 CommunicationChannel *ch; 96 IOAdapter *io; 97 DatasetFilesIterator *urls; 98 QString url; 99 100 static const int MAX_LINE_LEN; 101 static const int READ_BLOCK_SIZE; 102 103 private: 104 void sendMessage(const QByteArray &data); 105 void processNextLine(); 106 Task *processUrlEntity(const QString &url); 107 Task *processFile(const QString &url); 108 Task *processDbObject(const QString &url); 109 Task *createDbObjectReadFailTask(const QString &url); 110 }; 111 112 class TextWriter : public BaseDocWriter { 113 Q_OBJECT 114 public: TextWriter(Actor * a)115 TextWriter(Actor *a) 116 : BaseDocWriter(a, BaseDocumentFormats::PLAIN_TEXT) { 117 } 118 119 protected: 120 virtual void data2doc(Document *, const QVariantMap &); 121 virtual bool isStreamingSupport() const; 122 virtual bool isSupportedSeveralMessages() const; 123 virtual bool hasDataToWrite(const QVariantMap &data) const; 124 virtual QSet<GObject *> getObjectsToWrite(const QVariantMap &data) const; 125 }; 126 127 class FastaWriter : public SeqWriter { 128 Q_OBJECT 129 public: FastaWriter(Actor * a)130 FastaWriter(Actor *a) 131 : SeqWriter(a, BaseDocumentFormats::FASTA) { 132 } 133 134 protected: 135 virtual void data2doc(Document *, const QVariantMap &); 136 virtual void storeEntry(IOAdapter *io, const QVariantMap &data, int entryNum); 137 virtual bool hasDataToWrite(const QVariantMap &data) const; 138 139 public: 140 static void data2document(Document *, const QVariantMap &, WorkflowContext *, int numSplitSequences, int currentSplit); 141 static U2Region getSplitRegion(int numSplitSequences, int currentSplit, qint64 seqLen); 142 static void streamingStoreEntry(DocumentFormat *format, IOAdapter *io, const QVariantMap &data, WorkflowContext *context, int entryNum); 143 }; 144 145 class GenbankWriter : public BaseDocWriter { 146 Q_OBJECT 147 public: GenbankWriter(Actor * a)148 GenbankWriter(Actor *a) 149 : BaseDocWriter(a, BaseDocumentFormats::PLAIN_GENBANK) { 150 } 151 152 protected: 153 void data2doc(Document *, const QVariantMap &) override; 154 void storeEntry(IOAdapter *io, const QVariantMap &data, int entryNum) override; 155 bool hasDataToWrite(const QVariantMap &data) const override; 156 QSet<GObject *> getObjectsToWrite(const QVariantMap &data) const override; 157 158 public: 159 static void data2document(Document *, const QVariantMap &, WorkflowContext *); 160 static void streamingStoreEntry(DocumentFormat *format, IOAdapter *io, const QVariantMap &data, WorkflowContext *context, int entryNum); 161 }; 162 163 class FastQWriter : public BaseDocWriter { 164 Q_OBJECT 165 public: FastQWriter(Actor * a)166 FastQWriter(Actor *a) 167 : BaseDocWriter(a, BaseDocumentFormats::FASTQ) { 168 } 169 170 protected: 171 virtual void data2doc(Document *, const QVariantMap &); 172 virtual void storeEntry(IOAdapter *io, const QVariantMap &data, int entryNum); 173 virtual bool hasDataToWrite(const QVariantMap &data) const; 174 virtual QSet<GObject *> getObjectsToWrite(const QVariantMap &data) const; 175 176 public: 177 static void data2document(Document *, const QVariantMap &, WorkflowContext *); 178 static void streamingStoreEntry(DocumentFormat *format, IOAdapter *io, const QVariantMap &data, WorkflowContext *context, int entryNum); 179 }; 180 181 class RawSeqWriter : public BaseDocWriter { 182 Q_OBJECT 183 public: RawSeqWriter(Actor * a)184 RawSeqWriter(Actor *a) 185 : BaseDocWriter(a, BaseDocumentFormats::RAW_DNA_SEQUENCE) { 186 } 187 188 protected: 189 virtual void data2doc(Document *, const QVariantMap &); 190 virtual void storeEntry(IOAdapter *io, const QVariantMap &data, int entryNum); 191 virtual bool hasDataToWrite(const QVariantMap &data) const; 192 virtual GObject *getObjectToWrite(const QVariantMap &data) const; 193 194 public: 195 static void data2document(Document *, const QVariantMap &, WorkflowContext *); 196 static void streamingStoreEntry(DocumentFormat *format, IOAdapter *io, const QVariantMap &data, WorkflowContext *context, int entryNum); 197 }; 198 199 class GFFWriter : public BaseDocWriter { 200 Q_OBJECT 201 public: GFFWriter(Actor * a)202 GFFWriter(Actor *a) 203 : BaseDocWriter(a, BaseDocumentFormats::GFF) { 204 } 205 206 protected: 207 virtual void data2doc(Document *, const QVariantMap &); 208 virtual bool hasDataToWrite(const QVariantMap &data) const; 209 virtual QSet<GObject *> getObjectsToWrite(const QVariantMap &data) const; 210 211 public: 212 static void data2document(Document *, const QVariantMap &, WorkflowContext *); 213 }; 214 215 class DataWorkerFactory : public DomainFactory { 216 public: DataWorkerFactory(const Descriptor & d)217 DataWorkerFactory(const Descriptor &d) 218 : DomainFactory(d) { 219 } ~DataWorkerFactory()220 virtual ~DataWorkerFactory() { 221 } 222 virtual Worker *createWorker(Actor *); 223 static void init(); 224 }; 225 226 } // namespace LocalWorkflow 227 } // namespace U2 228 229 #endif 230