From b61de477f91e9f6ec68a7e7b9ab5d4bddc632843 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Tue, 20 Jan 2015 17:46:00 +0100 Subject: Moved some files around --- CMakeLists.txt | 17 +-- src/plugins/boost/FileLocator.cpp | 91 ---------------- src/plugins/boost/FileLocator.hpp | 92 ----------------- src/plugins/filesystem/FileLocator.cpp | 91 ++++++++++++++++ src/plugins/filesystem/FileLocator.hpp | 92 +++++++++++++++++ test/plugins/boost/FileLocatorTest.cpp | 155 ---------------------------- test/plugins/filesystem/FileLocatorTest.cpp | 155 ++++++++++++++++++++++++++++ 7 files changed, 347 insertions(+), 346 deletions(-) delete mode 100644 src/plugins/boost/FileLocator.cpp delete mode 100644 src/plugins/boost/FileLocator.hpp create mode 100644 src/plugins/filesystem/FileLocator.cpp create mode 100644 src/plugins/filesystem/FileLocator.hpp delete mode 100644 test/plugins/boost/FileLocatorTest.cpp create mode 100644 test/plugins/filesystem/FileLocatorTest.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 623ae7c..b30e3f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,11 +140,12 @@ ADD_LIBRARY(ousia_core # src/core/script/ScriptEngine ) -ADD_LIBRARY(ousia_boost - src/plugins/boost/FileLocator +ADD_LIBRARY(ousia_filesystem + src/plugins/filesystem/FileLocator + src/plugins/filesystem/SpecialPaths ) -TARGET_LINK_LIBRARIES(ousia_boost +TARGET_LINK_LIBRARIES(ousia_filesystem ousia_core ${Boost_LIBRARIES} ) @@ -229,14 +230,14 @@ IF(TEST) ousia_core ) - ADD_EXECUTABLE(ousia_test_boost - test/plugins/boost/FileLocatorTest + ADD_EXECUTABLE(ousia_test_filesystem + test/plugins/filesystem/FileLocatorTest ) - TARGET_LINK_LIBRARIES(ousia_test_boost + TARGET_LINK_LIBRARIES(ousia_test_filesystem ${GTEST_LIBRARIES} ousia_core - ousia_boost + ousia_filesystem ) ADD_EXECUTABLE(ousia_test_css @@ -281,7 +282,7 @@ IF(TEST) # Register the unit tests ADD_TEST(ousia_test_core ousia_test_core) - ADD_TEST(ousia_test_boost ousia_test_boost) + ADD_TEST(ousia_test_filesystem ousia_test_filesystem) ADD_TEST(ousia_test_css ousia_test_css) ADD_TEST(ousia_test_html ousia_test_html) ADD_TEST(ousia_test_xml ousia_test_xml) diff --git a/src/plugins/boost/FileLocator.cpp b/src/plugins/boost/FileLocator.cpp deleted file mode 100644 index 9ab398e..0000000 --- a/src/plugins/boost/FileLocator.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - 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 . -*/ - -#include "FileLocator.hpp" - -#include - -#include - -namespace ousia { - -void FileLocator::addSearchPath(const std::string &path, - std::set types) -{ - // Canonicalize the given path - std::string canonicalPath = - boost::filesystem::canonical(path).generic_string(); - - // Insert the path for all given types. - for (auto &type : types) { - auto it = searchPaths.find(type); - if (it != searchPaths.end()) { - it->second.push_back(canonicalPath); - } else { - searchPaths.insert({type, {canonicalPath}}); - } - } -} - -bool FileLocator::doLocate(Resource &resource, const std::string &path, - const ResourceType type, - const std::string &relativeTo) const -{ - boost::filesystem::path base(relativeTo); - if (boost::filesystem::exists(base)) { - // Look if 'relativeTo' is a directory already. - if (!boost::filesystem::is_directory(base)) { - // If not we use the parent directory. - base = base.parent_path(); - } - - // Use the / operator to append the path. - base /= path; - - // If we already found a fitting resource there, use that. - if (boost::filesystem::exists(base)) { - std::string location = - boost::filesystem::canonical(base).generic_string(); - resource = Resource(true, *this, type, location); - return true; - } - } - - // Otherwise look in the search paths. - auto it = searchPaths.find(type); - if (it != searchPaths.end()) { - for (boost::filesystem::path p : it->second) { - p /= path; - if (boost::filesystem::exists(p)) { - std::string location = - boost::filesystem::canonical(p).generic_string(); - resource = Resource(true, *this, type, location); - return true; - } - } - } - return false; -} - -std::unique_ptr FileLocator::doStream( - const std::string &location) const -{ - std::unique_ptr ifs{new std::ifstream(location)}; - return std::move(ifs); -} -} diff --git a/src/plugins/boost/FileLocator.hpp b/src/plugins/boost/FileLocator.hpp deleted file mode 100644 index ffe5c8f..0000000 --- a/src/plugins/boost/FileLocator.hpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - 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 . -*/ - -#ifndef _OUSIA_FILE_LOCATOR_HPP_ -#define _OUSIA_FILE_LOCATOR_HPP_ - -#include -#include - -#include -#include -#include - -namespace ousia { - -/** - * A ResourceLocator is a class able to locate resources in some way, usually - * on the hard drive. - * - * We specify this as an abstract superclass to have an interface layer between - * the program core and possible future extensions in terms of resource - * locations (e.g. online resources, .zip files, etc.). - */ -class FileLocator : public ResourceLocator { -public: - /** - * Type alias representing a Res - */ - using SearchPaths = std::map>; - -private: - /** - * Internal variable containing all stored search paths. - */ - SearchPaths searchPaths; - -protected: - bool doLocate(Resource &resource, const std::string &path, - const ResourceType type, - const std::string &relativeTo) const override; - - std::unique_ptr 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 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 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); - - /** - * 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_ */ - diff --git a/src/plugins/filesystem/FileLocator.cpp b/src/plugins/filesystem/FileLocator.cpp new file mode 100644 index 0000000..9ab398e --- /dev/null +++ b/src/plugins/filesystem/FileLocator.cpp @@ -0,0 +1,91 @@ +/* + 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 . +*/ + +#include "FileLocator.hpp" + +#include + +#include + +namespace ousia { + +void FileLocator::addSearchPath(const std::string &path, + std::set types) +{ + // Canonicalize the given path + std::string canonicalPath = + boost::filesystem::canonical(path).generic_string(); + + // Insert the path for all given types. + for (auto &type : types) { + auto it = searchPaths.find(type); + if (it != searchPaths.end()) { + it->second.push_back(canonicalPath); + } else { + searchPaths.insert({type, {canonicalPath}}); + } + } +} + +bool FileLocator::doLocate(Resource &resource, const std::string &path, + const ResourceType type, + const std::string &relativeTo) const +{ + boost::filesystem::path base(relativeTo); + if (boost::filesystem::exists(base)) { + // Look if 'relativeTo' is a directory already. + if (!boost::filesystem::is_directory(base)) { + // If not we use the parent directory. + base = base.parent_path(); + } + + // Use the / operator to append the path. + base /= path; + + // If we already found a fitting resource there, use that. + if (boost::filesystem::exists(base)) { + std::string location = + boost::filesystem::canonical(base).generic_string(); + resource = Resource(true, *this, type, location); + return true; + } + } + + // Otherwise look in the search paths. + auto it = searchPaths.find(type); + if (it != searchPaths.end()) { + for (boost::filesystem::path p : it->second) { + p /= path; + if (boost::filesystem::exists(p)) { + std::string location = + boost::filesystem::canonical(p).generic_string(); + resource = Resource(true, *this, type, location); + return true; + } + } + } + return false; +} + +std::unique_ptr FileLocator::doStream( + const std::string &location) const +{ + std::unique_ptr ifs{new std::ifstream(location)}; + return std::move(ifs); +} +} diff --git a/src/plugins/filesystem/FileLocator.hpp b/src/plugins/filesystem/FileLocator.hpp new file mode 100644 index 0000000..ffe5c8f --- /dev/null +++ b/src/plugins/filesystem/FileLocator.hpp @@ -0,0 +1,92 @@ +/* + 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 . +*/ + +#ifndef _OUSIA_FILE_LOCATOR_HPP_ +#define _OUSIA_FILE_LOCATOR_HPP_ + +#include +#include + +#include +#include +#include + +namespace ousia { + +/** + * A ResourceLocator is a class able to locate resources in some way, usually + * on the hard drive. + * + * We specify this as an abstract superclass to have an interface layer between + * the program core and possible future extensions in terms of resource + * locations (e.g. online resources, .zip files, etc.). + */ +class FileLocator : public ResourceLocator { +public: + /** + * Type alias representing a Res + */ + using SearchPaths = std::map>; + +private: + /** + * Internal variable containing all stored search paths. + */ + SearchPaths searchPaths; + +protected: + bool doLocate(Resource &resource, const std::string &path, + const ResourceType type, + const std::string &relativeTo) const override; + + std::unique_ptr 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 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 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); + + /** + * 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_ */ + diff --git a/test/plugins/boost/FileLocatorTest.cpp b/test/plugins/boost/FileLocatorTest.cpp deleted file mode 100644 index 473b15e..0000000 --- a/test/plugins/boost/FileLocatorTest.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - 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 . -*/ - -#include - -#include - -#include - -namespace ousia { -TEST(FileLocator, testAddSearchPath) -{ - FileLocator instance; - ASSERT_EQ(0U, instance.getSearchPaths().size()); - - // Read the canonical path of "." - std::string canonicalPath = - boost::filesystem::canonical(".").generic_string(); - - // Add one path for three types. - instance.addSearchPath(".", - {ResourceType::DOMAIN_DESC, ResourceType::SCRIPT, - ResourceType::TYPESYSTEM}); - - ASSERT_EQ(3U, instance.getSearchPaths().size()); - - auto it = instance.getSearchPaths().find(ResourceType::DOMAIN_DESC); - - ASSERT_EQ(1U, it->second.size()); - ASSERT_EQ(canonicalPath, it->second[0]); - - it = instance.getSearchPaths().find(ResourceType::SCRIPT); - - ASSERT_EQ(1U, it->second.size()); - ASSERT_EQ(canonicalPath, it->second[0]); - - it = instance.getSearchPaths().find(ResourceType::TYPESYSTEM); - - ASSERT_EQ(1U, it->second.size()); - ASSERT_EQ(canonicalPath, it->second[0]); - - // Add another path for only one of those types. - - std::string canonicalPath2 = - boost::filesystem::canonical("..").generic_string(); - - instance.addSearchPath("..", {ResourceType::DOMAIN_DESC}); - - ASSERT_EQ(3U, instance.getSearchPaths().size()); - - it = instance.getSearchPaths().find(ResourceType::DOMAIN_DESC); - - ASSERT_EQ(2U, it->second.size()); - ASSERT_EQ(canonicalPath, it->second[0]); - ASSERT_EQ(canonicalPath2, it->second[1]); -} - -void assert_located(const FileLocator &instance, const std::string &path, - const std::string &relativeTo, - ResourceType type = ResourceType::DOMAIN_DESC) -{ - Resource res; - ASSERT_TRUE(instance.locate(res, path, type, relativeTo)); - ASSERT_TRUE(res.isValid()); - boost::filesystem::path p(res.getLocation()); - ASSERT_TRUE(boost::filesystem::exists(p)); - ASSERT_EQ(path, p.filename()); -} - -void assert_not_located(const FileLocator &instance, const std::string &path, - const std::string &relativeTo, - ResourceType type = ResourceType::DOMAIN_DESC) -{ - Resource res; - ASSERT_FALSE(instance.locate(res, path, type, relativeTo)); - ASSERT_FALSE(res.isValid()); -} - -TEST(FileLocator, testLocate) -{ - // Initialization - boost::filesystem::path start("."); - start = boost::filesystem::canonical(start); - std::string relativeTo; - - if (start.filename() == "build") { - relativeTo = ".."; - start = start.parent_path(); - } else if (start.filename() == "application") { - relativeTo = "."; - } else { - ASSERT_TRUE(false); - } - FileLocator instance; - - // We should be able to find the CMakeLists file in the main directory. - assert_located(instance, "CMakeLists.txt", relativeTo); - // But not the FileLocator.hpp - assert_not_located(instance, "FileLocator.hpp", relativeTo); - - // Add the respective search path. - instance.addSearchPath((start / "src/plugins/boost").generic_string(), - {ResourceType::DOMAIN_DESC}); - // Now we should be able to find both. - assert_located(instance, "CMakeLists.txt", relativeTo); - assert_located(instance, "FileLocator.hpp", relativeTo); - // but only with the correct type. - assert_not_located(instance, "FileLocator.hpp", relativeTo, - ResourceType::SCRIPT); -} - -TEST(FileLocator, testStream) -{ - // Initialization - boost::filesystem::path start("."); - start = boost::filesystem::canonical(start); - std::string relativeTo; - - if (start.filename() == "build") { - relativeTo = ".."; - start = start.parent_path(); - } else if (start.filename() == "application") { - relativeTo = "."; - } else { - ASSERT_TRUE(false); - } - FileLocator instance; - // Locate the CMakeLists.txt - Resource res; - instance.locate(res, "CMakeLists.txt", ResourceType::DOMAIN_DESC, - relativeTo); - // Stream the content. - auto is_ptr = res.stream(); - // get the beginning. - char buf[256]; - is_ptr->getline(buf, 256); - std::string first_line(buf); - ASSERT_EQ("# Ousía", first_line); -} -} diff --git a/test/plugins/filesystem/FileLocatorTest.cpp b/test/plugins/filesystem/FileLocatorTest.cpp new file mode 100644 index 0000000..473b15e --- /dev/null +++ b/test/plugins/filesystem/FileLocatorTest.cpp @@ -0,0 +1,155 @@ +/* + 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 . +*/ + +#include + +#include + +#include + +namespace ousia { +TEST(FileLocator, testAddSearchPath) +{ + FileLocator instance; + ASSERT_EQ(0U, instance.getSearchPaths().size()); + + // Read the canonical path of "." + std::string canonicalPath = + boost::filesystem::canonical(".").generic_string(); + + // Add one path for three types. + instance.addSearchPath(".", + {ResourceType::DOMAIN_DESC, ResourceType::SCRIPT, + ResourceType::TYPESYSTEM}); + + ASSERT_EQ(3U, instance.getSearchPaths().size()); + + auto it = instance.getSearchPaths().find(ResourceType::DOMAIN_DESC); + + ASSERT_EQ(1U, it->second.size()); + ASSERT_EQ(canonicalPath, it->second[0]); + + it = instance.getSearchPaths().find(ResourceType::SCRIPT); + + ASSERT_EQ(1U, it->second.size()); + ASSERT_EQ(canonicalPath, it->second[0]); + + it = instance.getSearchPaths().find(ResourceType::TYPESYSTEM); + + ASSERT_EQ(1U, it->second.size()); + ASSERT_EQ(canonicalPath, it->second[0]); + + // Add another path for only one of those types. + + std::string canonicalPath2 = + boost::filesystem::canonical("..").generic_string(); + + instance.addSearchPath("..", {ResourceType::DOMAIN_DESC}); + + ASSERT_EQ(3U, instance.getSearchPaths().size()); + + it = instance.getSearchPaths().find(ResourceType::DOMAIN_DESC); + + ASSERT_EQ(2U, it->second.size()); + ASSERT_EQ(canonicalPath, it->second[0]); + ASSERT_EQ(canonicalPath2, it->second[1]); +} + +void assert_located(const FileLocator &instance, const std::string &path, + const std::string &relativeTo, + ResourceType type = ResourceType::DOMAIN_DESC) +{ + Resource res; + ASSERT_TRUE(instance.locate(res, path, type, relativeTo)); + ASSERT_TRUE(res.isValid()); + boost::filesystem::path p(res.getLocation()); + ASSERT_TRUE(boost::filesystem::exists(p)); + ASSERT_EQ(path, p.filename()); +} + +void assert_not_located(const FileLocator &instance, const std::string &path, + const std::string &relativeTo, + ResourceType type = ResourceType::DOMAIN_DESC) +{ + Resource res; + ASSERT_FALSE(instance.locate(res, path, type, relativeTo)); + ASSERT_FALSE(res.isValid()); +} + +TEST(FileLocator, testLocate) +{ + // Initialization + boost::filesystem::path start("."); + start = boost::filesystem::canonical(start); + std::string relativeTo; + + if (start.filename() == "build") { + relativeTo = ".."; + start = start.parent_path(); + } else if (start.filename() == "application") { + relativeTo = "."; + } else { + ASSERT_TRUE(false); + } + FileLocator instance; + + // We should be able to find the CMakeLists file in the main directory. + assert_located(instance, "CMakeLists.txt", relativeTo); + // But not the FileLocator.hpp + assert_not_located(instance, "FileLocator.hpp", relativeTo); + + // Add the respective search path. + instance.addSearchPath((start / "src/plugins/boost").generic_string(), + {ResourceType::DOMAIN_DESC}); + // Now we should be able to find both. + assert_located(instance, "CMakeLists.txt", relativeTo); + assert_located(instance, "FileLocator.hpp", relativeTo); + // but only with the correct type. + assert_not_located(instance, "FileLocator.hpp", relativeTo, + ResourceType::SCRIPT); +} + +TEST(FileLocator, testStream) +{ + // Initialization + boost::filesystem::path start("."); + start = boost::filesystem::canonical(start); + std::string relativeTo; + + if (start.filename() == "build") { + relativeTo = ".."; + start = start.parent_path(); + } else if (start.filename() == "application") { + relativeTo = "."; + } else { + ASSERT_TRUE(false); + } + FileLocator instance; + // Locate the CMakeLists.txt + Resource res; + instance.locate(res, "CMakeLists.txt", ResourceType::DOMAIN_DESC, + relativeTo); + // Stream the content. + auto is_ptr = res.stream(); + // get the beginning. + char buf[256]; + is_ptr->getline(buf, 256); + std::string first_line(buf); + ASSERT_EQ("# Ousía", first_line); +} +} -- cgit v1.2.3