diff options
author | Andreas Stöckel <astoecke@techfak.uni-bielefeld.de> | 2015-01-23 15:31:34 +0100 |
---|---|---|
committer | Andreas Stöckel <andreas@somweyr.de> | 2015-01-23 15:31:34 +0100 |
commit | ea55274d4d5a6066f73380352274d568caa2d079 (patch) | |
tree | 87fa77af7a6957028f64f805fd660358fd3ef2f3 /src/core/resource | |
parent | a5e14d8304716289f7ede9834d063bb212f76e83 (diff) |
Fixed ResourceManager and ResourceUtils
Diffstat (limited to 'src/core/resource')
-rw-r--r-- | src/core/resource/ResourceManager.cpp | 41 | ||||
-rw-r--r-- | src/core/resource/ResourceUtils.cpp | 25 |
2 files changed, 32 insertions, 34 deletions
diff --git a/src/core/resource/ResourceManager.cpp b/src/core/resource/ResourceManager.cpp index 4a42609..f154c9c 100644 --- a/src/core/resource/ResourceManager.cpp +++ b/src/core/resource/ResourceManager.cpp @@ -18,12 +18,14 @@ #include <vector> +#include <core/common/CharReader.hpp> #include <core/common/Exceptions.hpp> #include <core/common/Logger.hpp> #include <core/common/Rtti.hpp> #include <core/common/Utils.hpp> #include <core/model/Node.hpp> #include <core/parser/ParserContext.hpp> +#include <core/parser/Parser.hpp> #include <core/Registry.hpp> #include "ResourceManager.hpp" @@ -33,17 +35,7 @@ namespace ousia { /* Static helper functions */ -static bool typeSetsIntersect(const RttiSet &s1, const RttiSet &s2) -{ - for (const Rtti *t1 : s1) { - if (t1->isOneOf(s2)) { - return true; - } - } - return false; -} - -static void logUnsopportedType(Logger &logger, const RttiSet &supportedTypes) +static void logUnsopportedType(Logger &logger, Resource &resource, const RttiSet &supportedTypes) { // Build a list containing the expected type names std::vector<std::string> expected; @@ -52,8 +44,8 @@ static void logUnsopportedType(Logger &logger, const RttiSet &supportedTypes) } // Log the actual error message - ctx.logger.error( - std::string("Expected the file \"") + resource.location + + logger.error( + std::string("Expected the file \"") + resource.getLocation() + std::string("\" to define one of the following internal types ") + Utils::join(expected, ", ", "{", "}")); } @@ -101,7 +93,7 @@ Rooted<Node> ResourceManager::parse(ParserContext &ctx, Resource &resource, if (mime.empty()) { mime = ctx.registry.getMimetypeForFilename(resource.getLocation()); if (mime.empty()) { - ctx.logger.error(std::string("Filename \"") + path + + ctx.logger.error(std::string("Filename \"") + resource.getLocation() + std::string( "\" has an unknown file extension. Explicitly " "specify a mimetype.")); @@ -122,8 +114,8 @@ Rooted<Node> ResourceManager::parse(ParserContext &ctx, Resource &resource, } // Make sure the parser returns at least one of the supported types - if (!typeSetsIntersect(parserDescr.second, supportedTypes)) { - logUnsopportedType(ctx.logger, supportedTypes); + if (!Rtti::setIsOneOf(parserDescr.second, supportedTypes)) { + logUnsopportedType(ctx.logger, resource, supportedTypes); return nullptr; } @@ -133,7 +125,14 @@ Rooted<Node> ResourceManager::parse(ParserContext &ctx, Resource &resource, // We can now try to parse the given file Rooted<Node> node; try { - CharReader reader(resource.stream(), sourceId); + // Set the current source id in the logger instance + ScopedLogger logger(ctx.logger, SourceLocation{sourceId}); + + // Fetch the input stream and create a char reader + std::unique_ptr<std::istream> is = resource.stream(); + CharReader reader(*is, sourceId); + + // Actually parse the input stream node = parser->parse(reader, ctx); if (node == nullptr) { throw LoggableException{"Internal error: Parser returned null."}; @@ -174,7 +173,7 @@ SourceId ResourceManager::getSourceId(const Resource &resource) const Resource &ResourceManager::getResource(SourceId sourceId) const { auto it = resources.find(sourceId); - if (it != resourced.end()) { + if (it != resources.end()) { return it->second; } return NullResource; @@ -239,7 +238,7 @@ Rooted<Node> ResourceManager::link(ParserContext &ctx, const std::string &path, // Make sure the node has one of the supported types if (!node->type().isOneOf(supportedTypes)) { - logUnsopportedType(ctx.logger, supportedTypes); + logUnsopportedType(ctx.logger, resource, supportedTypes); return nullptr; } @@ -260,7 +259,7 @@ Rooted<Node> ResourceManager::link(ParserContext &ctx, const std::string &path, } // Continue with the usual include routine - return include(ctx, path, mimetype, rel, supportedTypes, relativeResource); + return link(ctx, path, mimetype, rel, supportedTypes, relativeResource); } SourceContext ResourceManager::buildContext(const SourceLocation &location) @@ -274,5 +273,3 @@ SourceContext ResourceManager::buildContext(const SourceLocation &location) } -#endif /* _OUSIA_RESOURCE_MANAGER_HPP_ */ - diff --git a/src/core/resource/ResourceUtils.cpp b/src/core/resource/ResourceUtils.cpp index 26faaad..7c42716 100644 --- a/src/core/resource/ResourceUtils.cpp +++ b/src/core/resource/ResourceUtils.cpp @@ -16,8 +16,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <core/common/Rtti.hpp> #include <core/common/Logger.hpp> +#include <core/common/Rtti.hpp> +#include <core/common/Utils.hpp> #include "ResourceUtils.hpp" @@ -42,15 +43,15 @@ static const std::unordered_map<std::string, ResourceType> RelResourceTypeMap{ /** * Map mapping from relations to the corresponding Rtti descriptor. */ -static const std::unordered_map<std::string, Rtti *> RelRttiTypeMap{ - {"document", &RttiTypes::DOCUMENT}, - {"domain", &RttiTypes::DOMAIN}, - {"typesystem", &RttiTypes::TYPESYSTEM}}; +static const std::unordered_map<std::string, const Rtti *> RelRttiTypeMap{ + {"document", &RttiTypes::Document}, + {"domain", &RttiTypes::Domain}, + {"typesystem", &RttiTypes::Typesystem}}; /** * Map mapping from Rtti pointers to the corresponding ResourceType. */ -static const std::unordered_map<Rtti *, ResourceType> RttiResourceTypeMap{ +static const std::unordered_map<const Rtti *, ResourceType> RttiResourceTypeMap{ {&RttiTypes::Document, ResourceType::DOCUMENT}, {&RttiTypes::Domain, ResourceType::DOMAIN_DESC}, {&RttiTypes::Typesystem, ResourceType::TYPESYSTEM}}; @@ -80,7 +81,7 @@ ResourceType ResourceUtils::deduceResourceType(const std::string &rel, ResourceType ResourceUtils::deduceResourceType(const std::string &rel, Logger &logger) { - std::string s = Utils::toLowercase(rel); + std::string s = Utils::toLower(rel); if (!s.empty()) { auto it = RelResourceTypeMap.find(s); if (it != RelResourceTypeMap.end()) { @@ -97,8 +98,8 @@ ResourceType ResourceUtils::deduceResourceType(const RttiSet &supportedTypes, Logger &logger) { if (supportedTypes.size() == 1U) { - auto it = RttiResourceTypeMap.find(supportedTypes[0]); - if (it != RelResourceTypeMap.end()) { + auto it = RttiResourceTypeMap.find(*supportedTypes.begin()); + if (it != RttiResourceTypeMap.end()) { return it->second; } } @@ -107,14 +108,14 @@ ResourceType ResourceUtils::deduceResourceType(const RttiSet &supportedTypes, const Rtti *ResourceUtils::deduceRttiType(const std::string &rel) { - std::string s = Utils::toLowercase(rel); + std::string s = Utils::toLower(rel); if (!s.empty()) { auto it = RelRttiTypeMap.find(s); if (it != RelRttiTypeMap.end()) { return it->second; } } - return &ResourceType::Node; + return &RttiTypes::Node; } RttiSet ResourceUtils::limitRttiTypes(const RttiSet &supportedTypes, @@ -128,7 +129,7 @@ RttiSet ResourceUtils::limitRttiTypes(const RttiSet &supportedTypes, { RttiSet res; for (const Rtti *supportedType : supportedTypes) { - if (supportedType.isa(type)) { + if (supportedType->isa(*type)) { res.insert(supportedType); } } |