00001 #include "AnalysisAlgorithmMap.h"
00002 #include "AnalysisAlgorithm.h"
00003 #include "CalibrationController/IS/TestData.h"
00004 #include <sstream>
00005
00006 using namespace std;
00007
00008 namespace SctAnalysis {
00009
00010 typedef map<string, shared_ptr<AnalysisAlgorithm> > MapType;
00011
00012 AnalysisAlgorithmMap& AnalysisAlgorithmMap::instance() {
00013 static AnalysisAlgorithmMap* instance = new AnalysisAlgorithmMap();
00014 return *instance;
00015 }
00016
00017 shared_ptr <AnalysisAlgorithm> AnalysisAlgorithmMap::getAlgorithm(shared_ptr<const TestData> testData, const string& moduleName) const throw(Sct::InvalidArgument) {
00018 if (!testData.get()) throw Sct::InvalidArgumentError("Attempt to use null TestData",__FILE__,__LINE__);
00019 string nameToUse = testData->testName;
00020 if (nameToUse=="NONE") {
00021 shared_ptr<AnalysisAlgorithm> alg;
00022 return alg;
00023 }
00024
00025 if (testData->analysisAlgorithm!=""){
00026 nameToUse=testData->analysisAlgorithm;
00027 }
00028
00029 if (algMap.count(nameToUse) == 0) {
00030 Sct::InvalidArgumentError iae("No map for Test: " + nameToUse, __FILE__, __LINE__);
00031 iae.setSeverity(MRS_DIAGNOSTIC);
00032 throw iae;
00033 }
00034
00035 return (*algMap.find(nameToUse)).second->clone(testData, moduleName);
00036 }
00037
00038 bool AnalysisAlgorithmMap::setAlgorithm(const string testName, auto_ptr<AnalysisAlgorithm> alg) throw() {
00039 algMap[testName] = shared_ptr<AnalysisAlgorithm>(alg);
00040 std::cout << "Have registered algorithm for test [" << testName << "]" << std::endl;
00041 return true;
00042 }
00043
00044 string AnalysisAlgorithmMap::getStatus(string testName) {
00045 if (algMap.count(testName) == 0) {
00046 return string();
00047 }
00048 return algMap[testName]->getStatus();
00049 }
00050
00051 string AnalysisAlgorithmMap::getAllStatus() {
00052 ostringstream status;
00053 for (MapType::const_iterator i=algMap.begin(); i!=algMap.end(); ++i) {
00054 status << i->first << " Algorithm " << i->second->getStatus() << "\n";
00055 }
00056 return status.str();
00057 }
00058
00059 std::list<std::string> AnalysisAlgorithmMap::listAlgorithms(){
00060 std::list<std::string> alg_list;
00061 for (MapType::const_iterator i=algMap.begin(); i!=algMap.end(); ++i) {
00062 alg_list.push_back(i->first);
00063 }
00064 return alg_list;
00065 }
00066
00067 }