14 #include "eckit/io/MultiHandle.h"
15 #include "eckit/utils/StringTools.h"
16 #include "eckit/exception/Exceptions.h"
23 using namespace eckit;
27 DataHandleFactory::DataHandleFactory(
const std::string& prefix)
49 throw UserError(std::string(
"No factory for '") +
prefix +
"://' data descriptors");
56 const std::string delimiter(
"://");
57 size_t pos (handleDescriptor.find(delimiter));
58 if (pos != std::string::npos)
59 return make_pair(handleDescriptor.substr(0, pos), handleDescriptor.substr(pos + delimiter.size()));
62 if (StringTools::startsWith(StringTools::lower(
StringTools::trim(handleDescriptor)),
"retrieve,")
63 || StringTools::startsWith(StringTools::lower(
StringTools::trim(handleDescriptor)),
"stage,")
64 || StringTools::startsWith(StringTools::lower(
StringTools::trim(handleDescriptor)),
"list,")
65 || StringTools::startsWith(StringTools::lower(
StringTools::trim(handleDescriptor)),
"archive,"))
66 return std::make_pair(std::string(
"mars"), handleDescriptor);
68 return std::make_pair(std::string(
"file"), handleDescriptor);
74 std::vector<std::string> ds;
75 ds.push_back(dataDescriptor);
82 std::vector<DataHandle*> handles;
83 for (
size_t i(0);
i < dataDescriptors.size(); ++
i)
85 std::pair<std::string,std::string> p (
splitPrefix(dataDescriptors[
i]));
93 std::pair<std::string,std::string> p (
splitPrefix(s));
94 std::unique_ptr<DataHandle>
d (
makeHandle(p.first, p.second));
102 std::pair<std::string,std::string> p (
splitPrefix(s));
103 std::unique_ptr<DataHandle>
d (
makeHandle(p.first, p.second));
104 d->openForWrite(length);
static void registerFactories()
std::string prefix() const
static eckit::DataHandle * makeHandle(const std::string &, const std::string &)
static eckit::DataHandle * openForRead(const std::string &)
static void buildMultiHandle(eckit::MultiHandle &, const std::vector< std::string > &)
std::map< std::string, DataHandleFactory * > Storage
static std::pair< std::string, std::string > splitPrefix(const std::string &)
virtual ~DataHandleFactory()
static Storage & factories()
static eckit::DataHandle * openForWrite(const std::string &, const eckit::Length &=eckit::Length(0))
std::string trim(const std::string &str)