21 #include "eckit/exception/Exceptions.h"
28 using namespace eckit;
33 std::map<std::string, AbstractToolFactory *> *AbstractToolFactory::toolFactories = 0;
35 class MatchAll :
public std::vector<std::string> {
40 const std::vector<std::string> AbstractToolFactory::matchAll = MatchAll();
42 std::vector<test::TestCase*>* AbstractToolFactory::testCases(
const std::vector<std::string> &patterns)
44 ASSERT(toolFactories != 0);
46 std::vector<test::TestCase*> *v =
new std::vector<test::TestCase*>();
48 for (std::map<std::string,AbstractToolFactory*>::iterator it = toolFactories->begin();
49 it != toolFactories->end();
52 std::string testName = it->first;
53 if (testName.find(
"Test") == std::string::npos
54 || !Tool::matchAny(patterns, testName))
58 char *argv[] = {
const_cast<char*
>(
"test"), 0};
65 testCase->
name(testName);
66 v->push_back(testCase);
70 Log::warning() <<
"AbstractToolFactory::testCases: " << testName
71 <<
" is not a TestCase. Skipping" << std::endl;
80 ASSERT(toolFactories);
82 std::map<std::string,AbstractToolFactory*>::const_iterator it = toolFactories->find(
name);
84 ASSERT(
"Unknown tool" && it != toolFactories->end());
89 void AbstractToolFactory::printToolHelp(
const std::string&
name, std::ostream &s)
91 findTool(
name).help(s);
95 void AbstractToolFactory::printToolUsage(
const std::string&
name, std::ostream &s)
101 void AbstractToolFactory::printToolsHelp(std::ostream &s)
103 ASSERT(toolFactories);
105 for (std::map<std::string,AbstractToolFactory*>::iterator it = toolFactories->begin();
106 it != toolFactories->end();
109 std::string toolName = it->first;
112 if (toolName.find(
"Test") == std::string::npos && !toolFactory->
experimental())
114 s << toolName <<
":\t";
115 toolFactory->
help(s);
116 s << std::endl <<
"Usage:" << std::endl <<
"\t";
117 toolFactory->
usage(toolName, s);
118 s << std::endl << std::endl;
123 void AbstractToolFactory::listTools(std::ostream& s)
125 ASSERT(toolFactories);
127 for (std::map<std::string,AbstractToolFactory*>::iterator it = toolFactories->begin();
128 it != toolFactories->end();
131 std::string toolName = it->first;
134 if (toolName.find(
"Test") == std::string::npos && !toolFactory->
experimental())
136 s <<
" " << toolName <<
" ";
137 toolFactory->
help(s);
143 Tool* AbstractToolFactory::createTool(
const std::string&
name,
int argc,
char **argv)
149 return factory->
create(argc, argv);
152 AbstractToolFactory::AbstractToolFactory(
const std::string&
name)
154 if (toolFactories == 0)
155 toolFactories =
new std::map<std::string, AbstractToolFactory *>();
157 (*toolFactories)[
name] =
this;
160 AbstractToolFactory::~AbstractToolFactory()
164 delete toolFactories;