/*
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
#include "Resource.hpp"
#include "ResourceLocator.hpp"
namespace ousia {
/* Helper functions for the internal maps */
static std::unordered_map reverseMap(
const std::unordered_map &m)
{
std::unordered_map res;
for (auto e : m) {
res.emplace(e.second, e.first);
}
return res;
}
/* Internal maps */
static const std::unordered_map
NAME_RESOURCE_TYPE_MAP{{"document", ResourceType::DOCUMENT},
{"domain", ResourceType::DOMAIN_DESC},
{"typesystem", ResourceType::TYPESYSTEM},
{"attributes", ResourceType::ATTRIBUTES},
{"stylesheet", ResourceType::STYLESHEET},
{"script", ResourceType::SCRIPT},
{"data", ResourceType::DATA}};
static const std::unordered_map
RESOURCE_TYPE_NAME_MAP = reverseMap(NAME_RESOURCE_TYPE_MAP);
/* Class Resource */
Resource::Resource()
: Resource(false, NullResourceLocator, ResourceType::UNKNOWN, "")
{
}
Resource::Resource(bool valid, const ResourceLocator &locator,
ResourceType type, const std::string &location)
: valid(valid), locator(&locator), type(type), location(location)
{
}
std::unique_ptr Resource::stream() const
{
return locator->stream(location);
}
std::string Resource::getResourceTypeName(ResourceType resourceType)
{
auto it = RESOURCE_TYPE_NAME_MAP.find(resourceType);
if (it != RESOURCE_TYPE_NAME_MAP.end()) {
return it->second;
}
return "unknown";
}
ResourceType Resource::getResourceTypeByName(const std::string &name)
{
std::string normName = Utils::toLower(name);
auto it = NAME_RESOURCE_TYPE_MAP.find(normName);
if (it != NAME_RESOURCE_TYPE_MAP.end()) {
return it->second;
}
return ResourceType::UNKNOWN;
}
/* Operators */
std::ostream &operator<<(std::ostream &os, ResourceType resourceType)
{
return os << Resource::getResourceTypeName(resourceType);
}
/* NullResource instance */
const Resource NullResource{};
}