1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
/*
Ousía
Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file FileLocator.hpp
*
* Contains the FileLocator class which is used to locate resources and to
* canonicalize file system paths.
*
* @author Benjamin Paaßen (bpassen@techfak.uni-bielefeld.de)
*/
#ifndef _OUSIA_FILE_LOCATOR_HPP_
#define _OUSIA_FILE_LOCATOR_HPP_
#include <core/resource/Resource.hpp>
#include <core/resource/ResourceLocator.hpp>
#include <map>
#include <set>
#include <vector>
namespace ousia {
/**
* The FileLocator class is an implementation of the abstract ResourceLocator
* interface used to locate resources in the filesystem.
*/
class FileLocator : public ResourceLocator {
public:
/**
* Type alias representing the internal search path list.
*/
using SearchPaths = std::map<ResourceType, std::vector<std::string>>;
private:
/**
* Internal variable containing all stored search paths.
*/
SearchPaths searchPaths;
/**
* Internally used to add a search path to the given vector without
* duplications.
*
* @parm path is the path that should be added to the vector (must be
* canonicalized).
* @parm paths is the list to which the path should be added.
*/
void addPath(const std::string &path, std::vector<std::string> &paths);
/**
* Internally used to add the default search paths for various resource
* types relative to a certain parent directory.
*
* @param relativeTo is the base directory relative to which the search
* paths ought to be setup.
*/
void addDefaultSearchPaths(const std::string &relativeTo);
protected:
bool doLocate(Resource &resource, const std::string &path,
const ResourceType type,
const std::string &relativeTo) const override;
std::vector<std::string> doAutocomplete(
const std::string &path, const ResourceType type,
const std::string &relativeTo) const override;
std::unique_ptr<std::istream> doStream(
const std::string &location) const override;
public:
FileLocator() : searchPaths() {}
/**
* Adds a search paths for the given types.
*
* @param path is a fully qualified/canonical path to a directory.
* @param types is a set of Resource Types. The FileLocator will look for
* resources of the specified types at the given path in the
* future.
*/
void addSearchPath(const std::string &path, std::set<ResourceType> types);
/**
* Adds a search path. Implicitly adds the search path for the "unknown"
*
* @param path is a fully qualified/canonical path to a directory.
* @param type is a single type for which the path should be added.
*/
void addSearchPath(const std::string &path,
ResourceType type = ResourceType::UNKNOWN);
/**
* Adds platform-specific default search paths. These include
* (in order of their precedence):
* <ul>
* <li>The user application data directory (~/.local/share/ousia/ on
* UNIX)</li>
* <li>The global application data directory used for make install
* (default is /usr/local/share on UNIX)</li>
* </ul>
* Resource type specific subdirectories (ontology, typesytem, etc.)
* are automatically added to the aforementioned paths.
*/
void addDefaultSearchPaths();
/**
* Adds a search path for a unit test. This function should not be used
* outside the code in the "test" folder.
*
* @param subdir is the subdirectory in the "testdata" directory that should
* be added.
* @param type is a single type for which the path should be added.
*/
void addUnittestSearchPath(const std::string &subdir,
ResourceType type = ResourceType::UNKNOWN);
/**
* Returns the backing map containing all search paths for a given type.
* This is read-only.
*/
const SearchPaths &getSearchPaths() const { return searchPaths; }
};
}
#endif /* _OUSIA_FILE_LOCATOR_HPP_ */
|