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 #include "URLContainer.h"
23
24 #include <U2Core/U2SafePoints.h>
25
26 #include <U2Lang/DbFolderScanner.h>
27 #include <U2Lang/SharedDbUrlUtils.h>
28 #include <U2Lang/WorkflowUtils.h>
29
30 namespace U2 {
31
toUniversal(const QString & url)32 static QString toUniversal(const QString &url) {
33 return QFileInfo(url).absoluteFilePath();
34 }
35
URLContainer(const QString & _url,bool convertUrlToAbsolute)36 URLContainer::URLContainer(const QString &_url, bool convertUrlToAbsolute)
37 : url(convertUrlToAbsolute ? toUniversal(_url) : _url) {
38 }
39
~URLContainer()40 URLContainer::~URLContainer() {
41 }
42
getUrl() const43 const QString &URLContainer::getUrl() const {
44 return url;
45 }
46
47 //////////////////////////////////////////////////////////////////////////
48
createUrlContainer(const QString & url)49 URLContainer *URLContainerFactory::createUrlContainer(const QString &url) {
50 if (SharedDbUrlUtils::isDbObjectUrl(url)) {
51 return new DbObjUrlContainer(url);
52 } else if (SharedDbUrlUtils::isDbFolderUrl(url)) {
53 return new DbFolderUrlContainer(url);
54 }
55
56 QFileInfo info(url);
57 if (!info.exists()) {
58 return nullptr;
59 }
60
61 if (info.isDir()) {
62 return new DirUrlContainer(url);
63 } else {
64 return new FileUrlContainer(url);
65 }
66 }
67
68 //////////////////////////////////////////////////////////////////////////
69
FileUrlContainer(const QString & url)70 FileUrlContainer::FileUrlContainer(const QString &url)
71 : URLContainer(url) {
72 }
73
getFileUrls()74 FilesIterator *FileUrlContainer::getFileUrls() {
75 return FilesIteratorFactory::createFileList(QStringList() << url);
76 }
77
clone()78 URLContainer *FileUrlContainer::clone() {
79 return new FileUrlContainer(url);
80 }
81
accept(URLContainerVisitor * visitor)82 void FileUrlContainer::accept(URLContainerVisitor *visitor) {
83 visitor->visit(this);
84 }
85
validateUrl(NotificationsList & notificationList)86 bool FileUrlContainer::validateUrl(NotificationsList ¬ificationList) {
87 return WorkflowUtils::validateInputFiles(url, notificationList);
88 }
89
90 //////////////////////////////////////////////////////////////////////////
91
DbObjUrlContainer(const QString & url)92 DbObjUrlContainer::DbObjUrlContainer(const QString &url)
93 : URLContainer(url, false) {
94 }
95
getFileUrls()96 FilesIterator *DbObjUrlContainer::getFileUrls() {
97 return FilesIteratorFactory::createFileList(QStringList() << url);
98 }
99
clone()100 URLContainer *DbObjUrlContainer::clone() {
101 return new DbObjUrlContainer(url);
102 }
103
accept(URLContainerVisitor * visitor)104 void DbObjUrlContainer::accept(URLContainerVisitor *visitor) {
105 visitor->visit(this);
106 }
107
validateUrl(NotificationsList & notificationList)108 bool DbObjUrlContainer::validateUrl(NotificationsList ¬ificationList) {
109 return WorkflowUtils::validateInputDbObject(url, notificationList);
110 }
111
112 //////////////////////////////////////////////////////////////////////////
113
DirUrlContainer(const QString & url)114 DirUrlContainer::DirUrlContainer(const QString &url)
115 : URLContainer(url), recursive(false) {
116 }
117
DirUrlContainer(const QString & url,const QString & _incFilter,const QString & _excFilter,bool _recursive)118 DirUrlContainer::DirUrlContainer(const QString &url, const QString &_incFilter, const QString &_excFilter, bool _recursive)
119 : URLContainer(url), incFilter(_incFilter), excFilter(_excFilter), recursive(_recursive) {
120 }
121
getFileUrls()122 FilesIterator *DirUrlContainer::getFileUrls() {
123 return FilesIteratorFactory::createDirectoryScanner(QStringList() << url, incFilter, excFilter, recursive);
124 }
125
clone()126 URLContainer *DirUrlContainer::clone() {
127 DirUrlContainer *cloned = new DirUrlContainer(url);
128 cloned->incFilter = incFilter;
129 cloned->excFilter = excFilter;
130 cloned->recursive = recursive;
131 return cloned;
132 }
133
accept(URLContainerVisitor * visitor)134 void DirUrlContainer::accept(URLContainerVisitor *visitor) {
135 visitor->visit(this);
136 }
137
validateUrl(NotificationsList & notificationList)138 bool DirUrlContainer::validateUrl(NotificationsList ¬ificationList) {
139 bool res = WorkflowUtils::validateInputDirs(url, notificationList);
140 if (!res) {
141 return false;
142 }
143
144 FilesIterator *it = getFileUrls();
145 SAFE_POINT(nullptr != it, "NULL fileIterator!", false);
146 while (it->hasNext()) {
147 QString fileUrl = it->getNextFile();
148 bool urlIsValid = WorkflowUtils::validateInputFiles(fileUrl, notificationList);
149 res = res && urlIsValid;
150 }
151 return res;
152 }
153
getIncludeFilter() const154 const QString &DirUrlContainer::getIncludeFilter() const {
155 return incFilter;
156 }
157
getExcludeFilter() const158 const QString &DirUrlContainer::getExcludeFilter() const {
159 return excFilter;
160 }
161
isRecursive() const162 bool DirUrlContainer::isRecursive() const {
163 return recursive;
164 }
165
setIncludeFilter(const QString & value)166 void DirUrlContainer::setIncludeFilter(const QString &value) {
167 incFilter = value;
168 }
169
setExcludeFilter(const QString & value)170 void DirUrlContainer::setExcludeFilter(const QString &value) {
171 excFilter = value;
172 }
173
setRecursive(bool value)174 void DirUrlContainer::setRecursive(bool value) {
175 recursive = value;
176 }
177
178 //////////////////////////////////////////////////////////////////////////
179
DbFolderUrlContainer(const QString & url)180 DbFolderUrlContainer::DbFolderUrlContainer(const QString &url)
181 : URLContainer(url, false), recursive(false) {
182 }
183
DbFolderUrlContainer(const QString & url,const QString & accFilter,const QString & objNameFilter,bool recursive)184 DbFolderUrlContainer::DbFolderUrlContainer(const QString &url, const QString &accFilter, const QString &objNameFilter, bool recursive)
185 : URLContainer(url, false), accFilter(accFilter), objNameFilter(objNameFilter), recursive(recursive) {
186 }
187
getFileUrls()188 FilesIterator *DbFolderUrlContainer::getFileUrls() {
189 return new DbFolderScanner(url, accFilter, objNameFilter, recursive);
190 }
191
clone()192 URLContainer *DbFolderUrlContainer::clone() {
193 return new DbFolderUrlContainer(url, accFilter, objNameFilter, recursive);
194 }
195
accept(URLContainerVisitor * visitor)196 void DbFolderUrlContainer::accept(URLContainerVisitor *visitor) {
197 visitor->visit(this);
198 }
199
validateUrl(NotificationsList & notificationList)200 bool DbFolderUrlContainer::validateUrl(NotificationsList ¬ificationList) {
201 bool res = WorkflowUtils::validateInputDbFolders(url, notificationList);
202 if (!res) {
203 return false;
204 }
205
206 FilesIterator *it = getFileUrls();
207 SAFE_POINT(nullptr != it, "Invalid DB object iterator", false);
208 while (it->hasNext()) {
209 QString fileUrl = it->getNextFile();
210 bool urlIsValid = WorkflowUtils::validateInputDbObject(fileUrl, notificationList);
211 res = res && urlIsValid;
212 }
213 return res;
214 }
215
getSequenceAccFilter() const216 const QString &DbFolderUrlContainer::getSequenceAccFilter() const {
217 return accFilter;
218 }
219
getObjNameFilter() const220 const QString &DbFolderUrlContainer::getObjNameFilter() const {
221 return objNameFilter;
222 }
223
setSequenceAccFilter(const QString & acc)224 void DbFolderUrlContainer::setSequenceAccFilter(const QString &acc) {
225 accFilter = acc;
226 }
227
setObjNameFilter(const QString & name)228 void DbFolderUrlContainer::setObjNameFilter(const QString &name) {
229 objNameFilter = name;
230 }
231
isRecursive() const232 bool DbFolderUrlContainer::isRecursive() const {
233 return recursive;
234 }
235
setRecursive(bool value)236 void DbFolderUrlContainer::setRecursive(bool value) {
237 recursive = value;
238 }
239
~URLContainerVisitor()240 URLContainerVisitor::~URLContainerVisitor() {
241 // do nothing
242 }
243
244 } // namespace U2
245