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