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 &notificationList) {
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 &notificationList) {
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 &notificationList) {
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 &notificationList) {
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