00001
00002
00003 #ifndef __ARC_JOBDESCRIPTIONPARSER_H__
00004 #define __ARC_JOBDESCRIPTIONPARSER_H__
00005
00006 #include <map>
00007 #include <string>
00008
00009 #include <arc/loader/Loader.h>
00010 #include <arc/loader/Plugin.h>
00011
00012
00013 namespace Arc {
00014
00015 class JobDescription;
00016 class Logger;
00017
00018 class JobDescriptionParserResult {
00019 public:
00020 typedef enum {
00021 Success,
00022 Failure,
00023 WrongLanguage
00024 } Result;
00025 JobDescriptionParserResult(void):v_(Success) { };
00026 JobDescriptionParserResult(bool v):v_(v?Success:Failure) { };
00027 JobDescriptionParserResult(Result v):v_(v) { };
00028 operator bool(void) { return (v_ == Success); };
00029 bool operator!(void) { return (v_ != Success); };
00030 bool operator==(bool v) { return ((v_ == Success) == v); };
00031 bool operator==(Result v) { return (v_ == v); };
00032 private:
00033 Result v_;
00034 };
00035
00037
00043 class JobDescriptionParser
00044 : public Plugin {
00045 public:
00046 virtual ~JobDescriptionParser();
00047
00048 virtual JobDescriptionParserResult Parse(const std::string& source, std::list<JobDescription>& jobdescs, const std::string& language = "", const std::string& dialect = "") const = 0;
00049 virtual JobDescriptionParserResult UnParse(const JobDescription& job, std::string& output, const std::string& language, const std::string& dialect = "") const = 0;
00050 const std::list<std::string>& GetSupportedLanguages() const { return supportedLanguages; }
00051 bool IsLanguageSupported(const std::string& language) const { return std::find(supportedLanguages.begin(), supportedLanguages.end(), language) != supportedLanguages.end(); }
00052 const std::string& GetError(void) { return error; };
00053
00054 protected:
00055 JobDescriptionParser(PluginArgument* parg);
00056
00057 std::string& SourceLanguage(JobDescription& j) const;
00058
00059 std::list<std::string> supportedLanguages;
00060
00061 mutable std::string error;
00062
00063 static Logger logger;
00064 };
00065
00069 class JobDescriptionParserLoader
00070 : public Loader {
00071
00072 public:
00075 JobDescriptionParserLoader();
00076
00080 ~JobDescriptionParserLoader();
00081
00085 JobDescriptionParser* load(const std::string& name);
00086
00089 const std::list<JobDescriptionParser*>& GetJobDescriptionParsers() const {
00090 return jdps;
00091 }
00092
00093 class iterator {
00094 private:
00095 iterator(JobDescriptionParserLoader& jdpl);
00096 iterator& operator=(const iterator& it) { return *this; }
00097 public:
00098 ~iterator() {}
00099
00100 JobDescriptionParser& operator*() { return **current; }
00101 const JobDescriptionParser& operator*() const { return **current; }
00102 JobDescriptionParser* operator->() { return *current; }
00103 const JobDescriptionParser* operator->() const { return *current; }
00104 iterator& operator++();
00105 operator bool() { return !jdpl->jdpDescs.empty() || current != jdpl->jdps.end(); }
00106
00107 friend class JobDescriptionParserLoader;
00108 private:
00109 void LoadNext();
00110
00111 std::list<JobDescriptionParser*>::iterator current;
00112 JobDescriptionParserLoader* jdpl;
00113 };
00114
00115 iterator GetIterator() { return iterator(*this); }
00116
00117 private:
00118 std::list<JobDescriptionParser*> jdps;
00119 std::list<ModuleDesc> jdpDescs;
00120
00121 void scan();
00122 bool scaningDone;
00123 };
00124 }
00125
00126 #endif // __ARC_JOBDESCRIPTIONPARSER_H__