ARC SDK
JobDescriptionParserPlugin.h
Go to the documentation of this file.
1 // -*- indent-tabs-mode: nil -*-
2 
3 #ifndef __ARC_JOBDESCRIPTIONPARSERPLUGIN_H__
4 #define __ARC_JOBDESCRIPTIONPARSERPLUGIN_H__
5 
10 #include <map>
11 #include <string>
12 
13 #include <arc/loader/Loader.h>
14 #include <arc/loader/Plugin.h>
15 
16 
17 namespace Arc {
18 
19  class JobDescription;
20  class Logger;
21 
27  public:
28  typedef enum {
29  Success,
30  Failure,
31  WrongLanguage
32  } Result;
33  JobDescriptionParserPluginResult(void):v_(Success) { };
34  JobDescriptionParserPluginResult(bool v):v_(v?Success:Failure) { };
35  JobDescriptionParserPluginResult(Result v):v_(v) { };
36  operator bool(void) { return (v_ == Success); };
37  bool operator!(void) { return (v_ != Success); };
38  bool operator==(bool v) { return ((v_ == Success) == v); };
39  bool operator==(Result v) { return (v_ == v); };
40  private:
41  Result v_;
42  };
43 
45 
55  : public Plugin {
56  public:
57  virtual ~JobDescriptionParserPlugin();
58 
59  virtual JobDescriptionParserPluginResult Parse(const std::string& source, std::list<JobDescription>& jobdescs, const std::string& language = "", const std::string& dialect = "") const = 0;
60  virtual JobDescriptionParserPluginResult UnParse(const JobDescription& job, std::string& output, const std::string& language, const std::string& dialect = "") const = 0;
61  const std::list<std::string>& GetSupportedLanguages() const { return supportedLanguages; }
62  bool IsLanguageSupported(const std::string& language) const { return std::find(supportedLanguages.begin(), supportedLanguages.end(), language) != supportedLanguages.end(); }
63  const std::string& GetError(void) { return error; };
64 
65  protected:
66  JobDescriptionParserPlugin(PluginArgument* parg);
67 
68  std::string& SourceLanguage(JobDescription& j) const;
69 
70  std::list<std::string> supportedLanguages;
71 
72  mutable std::string error;
73 
74  static Logger logger;
75  };
76 
86  : public Loader {
87 
88  public:
93 
99 
104  JobDescriptionParserPlugin* load(const std::string& name);
105 
109  const std::list<JobDescriptionParserPlugin*>& GetJobDescriptionParserPlugins() const { return jdps; }
110 
111  class iterator {
112  private:
114  iterator& operator=(const iterator& it) { return *this; }
115  public:
116  ~iterator() {}
117  //iterator& operator=(const iterator& it) { current = it.current; jdpl = it.jdpl; return *this; }
118  JobDescriptionParserPlugin& operator*() { return **current; }
119  const JobDescriptionParserPlugin& operator*() const { return **current; }
120  JobDescriptionParserPlugin* operator->() { return *current; }
121  const JobDescriptionParserPlugin* operator->() const { return *current; }
122  iterator& operator++();
123  operator bool() { return !jdpl->jdpDescs.empty() || current != jdpl->jdps.end(); }
124 
126  private:
127  void LoadNext();
128 
129  std::list<JobDescriptionParserPlugin*>::iterator current;
131  };
132 
133  iterator GetIterator() { return iterator(*this); }
134 
135  private:
136  std::list<JobDescriptionParserPlugin*> jdps;
137  std::list<ModuleDesc> jdpDescs;
138 
139  void scan();
140  bool scaningDone;
141  };
142 } // namespace Arc
143 
144 #endif // __ARC_JOBDESCRIPTIONPARSERPLUGIN_H__