jdl-api-cpp-3.4.4
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DAGAd.h
Go to the documentation of this file.
1 /*
2 Copyright (c) Members of the EGEE Collaboration. 2004.
3 See http://www.eu-egee.org/partners/ for details on the
4 copyright holders.
5 
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
9 
10  http://www.apache.org/licenses/LICENSE-2.0
11 
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
15 either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18 */
19 
20 // File: DAGAd.h
21 // Author: Francesco Giacomini <Francesco.Giacomini@cnaf.infn.it>
22 // Marco Cecchi
23 
24 // $Id: DAGAd.h,v 1.5.2.2.6.1 2011/09/01 13:29:09 mcecchi Exp $
25 
26 #ifndef GLITE_WMS_COMMON_REQUESTAD_DAGAD_H
27 #define GLITE_WMS_COMMON_REQUESTAD_DAGAD_H
28 
29 #include <string>
30 #include <utility>
31 #include <map>
32 #include <set>
33 #include <iosfwd>
34 #include <classad_distribution.h>
35 #include <exception>
36 
37 #include <boost/shared_ptr.hpp>
38 #include <boost/utility.hpp>
39 #include <boost/tuple/tuple.hpp>
40 #include <boost/config.hpp>
41 
42 #include "glite/wmsutils/classads/classad_utils.h"
43 
44 //graph libraries
45 #include <boost/graph/adjacency_list.hpp>
46 #include <boost/graph/graph_traits.hpp>
47 #include <boost/graph/depth_first_search.hpp>
48 #include <boost/graph/visitors.hpp>
49 
50 namespace glite {
51 namespace jdl {
52 
53 namespace utilities = glite::wmsutils::classads;
54 
55 class DAG_Error: public std::exception
56 {
57 protected:
58  std::string m_msg;
59 public:
60  virtual char const* what() const throw() { return "Invalid DAG"; }
61  virtual ~DAG_Error() throw() { };
62 };
63 
64 class NotDAG: public DAG_Error
65 {
66 public:
67  virtual char const* what() const throw() {
68  return "'node_type' must be \"dag\"";
69  }
70 };
71 
73 {
74 public:
75  virtual char const* what() const throw() {
76  return "'max_running_nodes' has to be an integer > 0";
77  }
78 };
79 
80 class InvalidNodes: public DAG_Error
81 {
82 public:
83  virtual char const* what() const throw() {
84  return "'nodes' not valid";
85  }
86 };
87 
89 {
90 public:
91  virtual char const* what() const throw() {
92  return "'dependencies' not valid";
93  }
94 };
95 
97 {
98 public:
99  virtual char const* what() const throw() {
100  return "Invalid reference in 'dependencies'";
101  }
102 };
103 
104 class DAG_HasCycle: public DAG_Error
105 {
106 public:
107  virtual char const* what() const throw() {
108  return "DAG has a cycle";
109  }
110 };
111 
113 {
114 private:
115  std::string m_type;
116 public:
117  Invalid_DAG_NodeType(std::string const& type)
118  : DAG_Error(), m_type(type)
119  { }
120  virtual char const* what() throw() {
121  m_msg = "'node_type': " + m_type + " is not valid";
122  return m_msg.c_str();
123  }
124  virtual ~Invalid_DAG_NodeType() throw() { }
125 };
126 
128 {
129 public:
130  virtual char const* what() const throw() {
131  return "'node_retry_count' must be an integer >= 0";
132  }
133 };
134 
135 class DAG_NodeError: public std::exception
136 {
137 protected:
138  std::string m_node_name;
139  std::string m_msg;
140 public:
141  DAG_NodeError(std::string const& node_name)
142  : m_node_name(node_name) { }
143  virtual char const* what() throw()
144  {
145  m_msg = "Invalid node " + m_node_name;
146  return m_msg.c_str();
147  }
148  std::string node() const { return m_node_name; }
149  virtual ~DAG_NodeError() throw() { };
150 };
151 
153 {
154 public:
155  virtual char const* what() throw()
156  {
157  m_msg = "Neither 'ad' nor 'file' specified" +
158  (m_node_name.empty() ? "" : " for node " + m_node_name);
159  return m_msg.c_str();
160  }
161  NeitherAdNorFile(std::string const& node)
162  : DAG_NodeError(node) { }
163 };
164 
166 {
167 public:
168  virtual char const* what() throw()
169  {
170  m_msg = "Both 'ad' and 'file' specified" +
171  (m_node_name.empty() ? "" : " for node " + m_node_name);
172  return m_msg.c_str();
173  }
174  BothAdAndFile(std::string const& node)
175  : DAG_NodeError(node) { }
176 };
177 
179 {
180  std::string m_description;
181 public:
182  virtual char const* what() throw()
183  {
184  m_msg = "'file' not valid" +
185  (m_description.empty() ? "" : " (" + m_description + ")");
186  (m_node_name.empty() ? "" : " for node " + m_node_name);
187  return m_msg.c_str();
188  }
190  std::string const& node,
191  std::string const& description
192  )
193  : DAG_NodeError(node), m_description(description) { }
194  virtual ~InvalidDescriptionFilename() throw() { };
195 };
196 
198 {
199 public:
200  virtual char const* what() throw()
201  {
202  m_msg = "'description' not valid" +
203  (m_node_name.empty() ? "" : " for node " + m_node_name);
204  return m_msg.c_str();
205  }
206  InvalidDescription(std::string const& node)
207  : DAG_NodeError(node) { }
208 };
209 
211 {
212 public:
213  virtual char const* what() throw()
214  {
215  m_msg = "'node_retry_count' must be an integer >= 0" +
216  (m_node_name.empty() ? "" : " for node " + m_node_name);
217  return m_msg.c_str();
218  }
219  InvalidRetryCount(std::string const& node)
220  : DAG_NodeError(node) { }
221 };
222 
224 {
225  std::string m_type;
226 public:
227  virtual char const* what() throw()
228  {
229  m_msg = "node_type not valid" +
230  (m_type.empty() ? "" : " (" + m_type + ")");
231  (m_node_name.empty() ? "" : " for node " + m_node_name);
232  return m_msg.c_str();
233  }
234  InvalidNodeType(std::string const& node, std::string const& type)
235  : DAG_NodeError(node), m_type(type) { }
236  virtual ~InvalidNodeType() throw() { };
237 };
238 
240 {
241  class Implementation;
242  boost::shared_ptr<Implementation> m_impl;
243 
244 public:
245  DAGNodeInfo();
246  DAGNodeInfo(classad::ClassAd const& node_description,
247  std::string const& node_type = std::string(),
248  std::string const& node_name = std::string()
249  );
251 
252 public:
253  std::string description_file() const;
254  bool replace_description_file(std::string const& file);
255  classad::ClassAd const* description_ad() const;
256  bool replace_description_ad(classad::ClassAd* ad);
257  bool description_file_for_ad(std::string const& file);
258  bool description_ad_for_file(classad::ClassAd* ad);
259 
260  std::string type() const;
261 
262  int retry_count() const;
263  bool retry_count(int n);
264 
265  classad::ClassAd as_classad() const;
266 };
267 
269  : public std::iterator<
270  std::input_iterator_tag
271  ,std::pair<std::string, DAGNodeInfo>
272  ,ptrdiff_t
273  ,std::pair<std::string, DAGNodeInfo> const*
274  ,std::pair<std::string, DAGNodeInfo> const&
275 >
276 {
277  friend bool operator==(DAGAdNodeIterator const& lhs,
278  DAGAdNodeIterator const& rhs
279  );
280 
281  classad::ClassAd const* m_nodes;
282  classad::ClassAd::const_iterator m_node;
283  value_type m_value;
284 
285  bool is_good() const
286  {
287  return m_node != m_nodes->end();
288  }
289 
290  void set_value();
291 
292 public:
293 
296  DAGAdNodeIterator(classad::ClassAd const* nodes,
297  classad::ClassAd::const_iterator it
298  );
299  DAGAdNodeIterator(DAGAdNodeIterator const& other);
303  reference operator*() const;
304 
305  pointer operator->() const
306  {
307  return &(operator*());
308  }
309 
310 };
311 
312 inline bool operator==(DAGAdNodeIterator const& lhs,
313  DAGAdNodeIterator const& rhs
314 ) {
315  return lhs.m_nodes == rhs.m_nodes && lhs.m_node == rhs.m_node;
316 }
317 
318 inline bool operator!=(DAGAdNodeIterator const& lhs,
319  DAGAdNodeIterator const& rhs
320 ) {
321  return !(lhs == rhs);
322 }
323 
325  : public std::iterator<
326  std::input_iterator_tag
327  ,std::pair<DAGAdNodeIterator, DAGAdNodeIterator>
328  ,ptrdiff_t
329  ,std::pair<DAGAdNodeIterator, DAGAdNodeIterator> const*
330  ,std::pair<DAGAdNodeIterator, DAGAdNodeIterator> const&
331 >
332 {
333  friend bool operator==(DAGAdDependencyIterator const& lhs,
334  DAGAdDependencyIterator const& rhs);
335 
337  typedef classad::ExprList::iterator Iterator;
338 
339  classad::ClassAd const* m_dag;
344  value_type m_value;
345 
346  static classad::ExprList* parents(classad::ExprTree* dep)
347  {
348  assert(utilities::is_expression_list(dep));
349  classad::ExprTree* et = *static_cast<classad::ExprList*>(dep)->begin();
350  assert(utilities::is_expression_list(et));
351  return static_cast<classad::ExprList*>(et);
352  }
353  static classad::ExprList* children(classad::ExprTree* dep)
354  {
355  assert(utilities::is_expression_list(dep));
356  classad::ExprTree* et = *++static_cast<classad::ExprList*>(dep)->begin();
357  assert(utilities::is_expression_list(et));
358  return static_cast<classad::ExprList*>(et);
359  }
360  bool is_good() const { return m_dep != m_dep_end; }
361  void set_value();
362 
363  DAGAdDependencyIterator(classad::ClassAd const* dag = 0, bool begin = false);
364 
365  // copy ctor, operator=() and dtor are ok
366 
369 
370  reference operator*() const
371  {
372  return m_value;
373  }
374 
375  pointer operator->() const
376  {
377  return &(operator*());
378  }
379 };
380 
381 inline bool operator==(DAGAdDependencyIterator const& lhs,
382  DAGAdDependencyIterator const& rhs)
383 {
384  return (!lhs.is_good() && !rhs.is_good())
385  || (lhs.is_good() && rhs.is_good()
386  && lhs.m_dep == rhs.m_dep
387  && lhs.m_parent == rhs.m_parent
388  && lhs.m_child == rhs.m_child
389  );
390 }
391 
392 inline bool operator!=(DAGAdDependencyIterator const& lhs,
393  DAGAdDependencyIterator const& rhs)
394 {
395  return !(lhs == rhs);
396 }
397 
398 class DAGAd: boost::noncopyable
399 {
400 public:
401 
403  typedef DAGAdNodeIterator::value_type node_value_type;
405  typedef DAGAdDependencyIterator::value_type dependency_value_type;
406 
407  typedef boost::property<
408  boost::vertex_name_t, std::string, boost::property<
409  boost::vertex_color_t, boost::default_color_type
411 
412  typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperties> Graph_t; // bidirectional to have in_edges
413  typedef boost::graph_traits<Graph_t>::vertex_descriptor Vertex;
414  typedef boost::graph_traits<Graph_t >::vertex_iterator VertexIterator;
415  typedef boost::graph_traits<Graph_t>::in_edge_iterator InEdgeIterator;
416 
417 private:
418  boost::shared_ptr<classad::ClassAd> m_ad;
419  Graph_t m_graph;
420 
421 public:
422  DAGAd();
423  explicit DAGAd(classad::ClassAd const& ad);
424 
425  Graph_t& graph() { return m_graph; }
426  classad::ClassAd const& ad() const;
427 
428  // set the default node type
429  // if new_value is "" the attribute becomes unspecified
430  // return the previous value ("" means unspecified)
431  std::string default_node_type(std::string const& new_value);
432 
433  // get the default node type
434  // "" means unspecified
435  std::string default_node_type() const;
436 
437  // set the default retry count for a node
438  // if new_value is -1 the attribute becomes unspecified
439  // return the previous value (-1 means unspecified)
440  int default_node_retry_count(int new_value);
441 
442  // get the default retry count for a node
443  // -1 means unspecified
444  int default_node_retry_count() const;
445 
446  bool add_node(std::string const& name, DAGNodeInfo const& info);
447  bool replace_node(std::string const& name, DAGNodeInfo const& info);
448  bool remove_node(std::string const& name);
449  std::size_t num_nodes() const;
450  node_iterator find(std::string const& name) const;
451 
452  bool add_dependency(std::string const& first, std::string const& second);
453  bool remove_dependency(std::string const& first, std::string const& second);
454  std::size_t num_dependencies() const;
455 
456  bool set_generic(std::string const& attribute, classad::ExprTree* value);
457  classad::ExprTree const* get_generic(std::string const& attribute) const;
458  bool remove_generic(std::string const& attribute);
459 
460  std::pair<dependency_iterator, dependency_iterator> classad_dependencies() const;
461  std::pair<node_iterator, node_iterator> nodes() const;
462 
463  struct Attributes
464  {
465  static std::string const TYPE;
466  static std::string const NODES;
467  static std::string const DEPENDENCIES;
468  static std::string const NODE_RETRY_COUNT;
469  static std::string const NODE_TYPE;
470  static std::string const DESCRIPTION_FILE;
471  static std::string const DESCRIPTION_AD;
472  };
473 };
474 
475 } // jdl namespace
476 } // glite namespace
477 
478 #endif
static classad::ExprList * parents(classad::ExprTree *dep)
Definition: DAGAd.h:346
Definition: DAGAd.h:197
Definition: DAGAd.h:88
static std::string const NODE_RETRY_COUNT
Definition: DAGAd.h:468
Definition: DAGAd.h:80
std::size_t num_nodes() const
std::string default_node_type() const
DAGAdNodeIterator::value_type node_value_type
Definition: DAGAd.h:403
classad::ExprList::iterator Iterator
Definition: DAGAd.h:337
boost::graph_traits< Graph_t >::in_edge_iterator InEdgeIterator
Definition: DAGAd.h:415
Iterator m_dep_end
Definition: DAGAd.h:341
virtual char const * what() const
Definition: DAGAd.h:99
DAGAdDependencyIterator & operator++()
std::pair< node_iterator, node_iterator > nodes() const
Definition: DAGAd.h:112
InvalidDescription(std::string const &node)
Definition: DAGAd.h:206
std::string m_msg
Definition: DAGAd.h:139
pointer operator->() const
Definition: DAGAd.h:305
Definition: DAGAd.h:135
bool add_dependency(std::string const &first, std::string const &second)
DAGAdDependencyIterator dependency_iterator
Definition: DAGAd.h:404
virtual char const * what() const
Definition: DAGAd.h:75
DAGAdNodeIterator & operator++()
Iterator m_parent
Definition: DAGAd.h:342
DAG_NodeError(std::string const &node_name)
Definition: DAGAd.h:141
NeitherAdNorFile(std::string const &node)
Definition: DAGAd.h:161
static std::string const NODES
Definition: DAGAd.h:466
value_type m_value
Definition: DAGAd.h:344
std::pair< dependency_iterator, dependency_iterator > classad_dependencies() const
Definition: DAGAd.h:104
virtual ~DAG_Error()
Definition: DAGAd.h:61
std::size_t num_dependencies() const
Definition: DAGAd.h:398
virtual ~Invalid_DAG_NodeType()
Definition: DAGAd.h:124
static std::string const DESCRIPTION_FILE
Definition: DAGAd.h:470
bool operator==(DAGAdNodeIterator const &lhs, DAGAdNodeIterator const &rhs)
Definition: DAGAd.h:312
static std::string const TYPE
Definition: DAGAd.h:465
InvalidRetryCount(std::string const &node)
Definition: DAGAd.h:219
classad::ClassAd as_classad() const
Definition: DAGAd.h:165
virtual char const * what()
Definition: DAGAd.h:168
std::string node() const
Definition: DAGAd.h:148
static std::string const DEPENDENCIES
Definition: DAGAd.h:467
static std::string const DESCRIPTION_AD
Definition: DAGAd.h:471
DAGAdNodeIterator & operator=(DAGAdNodeIterator const &other)
DAGAdNodeIterator node_iterator
Definition: DAGAd.h:336
BothAdAndFile(std::string const &node)
Definition: DAGAd.h:174
Definition: DAGAd.h:223
~DAGNodeInfo()
Definition: DAGAd.h:250
classad::ClassAd const * m_dag
Definition: DAGAd.h:339
Graph_t & graph()
Definition: DAGAd.h:425
classad::ClassAd const * description_ad() const
std::string m_node_name
Definition: DAGAd.h:138
std::string description_file() const
bool is_good() const
Definition: DAGAd.h:360
virtual char const * what()
Definition: DAGAd.h:213
virtual char const * what()
Definition: DAGAd.h:155
virtual char const * what()
Definition: DAGAd.h:200
virtual char const * what()
Definition: DAGAd.h:120
static classad::ExprList * children(classad::ExprTree *dep)
Definition: DAGAd.h:353
node_iterator find(std::string const &name) const
Definition: DAGAd.h:268
bool description_file_for_ad(std::string const &file)
virtual char const * what() const
Definition: DAGAd.h:130
boost::graph_traits< Graph_t >::vertex_descriptor Vertex
Definition: DAGAd.h:413
virtual char const * what()
Definition: DAGAd.h:182
Definition: DAGAd.h:64
bool set_generic(std::string const &attribute, classad::ExprTree *value)
virtual char const * what()
Definition: DAGAd.h:227
classad::ClassAd const & ad() const
friend bool operator==(DAGAdNodeIterator const &lhs, DAGAdNodeIterator const &rhs)
Definition: DAGAd.h:312
Invalid_DAG_NodeType(std::string const &type)
Definition: DAGAd.h:117
Definition: DAGAd.h:210
reference operator*() const
Definition: DAGAd.h:370
DAGAdDependencyIterator(classad::ClassAd const *dag=0, bool begin=false)
Definition: DAGAd.h:127
virtual char const * what() const
Definition: DAGAd.h:60
bool replace_node(std::string const &name, DAGNodeInfo const &info)
bool remove_generic(std::string const &attribute)
virtual char const * what()
Definition: DAGAd.h:143
static std::string const NODE_TYPE
Definition: DAGAd.h:469
virtual char const * what() const
Definition: DAGAd.h:107
Definition: DAGAd.h:55
std::string m_msg
Definition: DAGAd.h:58
std::string type() const
Iterator m_child
Definition: DAGAd.h:343
Definition: DAGAd.h:152
virtual ~InvalidNodeType()
Definition: DAGAd.h:236
bool description_ad_for_file(classad::ClassAd *ad)
int default_node_retry_count() const
InvalidDescriptionFilename(std::string const &node, std::string const &description)
Definition: DAGAd.h:189
DAGAdNodeIterator node_iterator
Definition: DAGAd.h:402
friend bool operator==(DAGAdDependencyIterator const &lhs, DAGAdDependencyIterator const &rhs)
Definition: DAGAd.h:381
bool replace_description_file(std::string const &file)
classad::ExprTree const * get_generic(std::string const &attribute) const
virtual ~DAG_NodeError()
Definition: DAGAd.h:149
Iterator m_dep
Definition: DAGAd.h:340
Definition: DAGAd.h:239
Definition: DAGAd.h:463
bool add_node(std::string const &name, DAGNodeInfo const &info)
bool operator!=(DAGAdNodeIterator const &lhs, DAGAdNodeIterator const &rhs)
Definition: DAGAd.h:318
virtual char const * what() const
Definition: DAGAd.h:67
InvalidNodeType(std::string const &node, std::string const &type)
Definition: DAGAd.h:234
DAGAdDependencyIterator::value_type dependency_value_type
Definition: DAGAd.h:405
bool remove_dependency(std::string const &first, std::string const &second)
boost::graph_traits< Graph_t >::vertex_iterator VertexIterator
Definition: DAGAd.h:414
boost::adjacency_list< boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperties > Graph_t
Definition: DAGAd.h:412
pointer operator->() const
Definition: DAGAd.h:375
virtual char const * what() const
Definition: DAGAd.h:83
virtual char const * what() const
Definition: DAGAd.h:91
boost::property< boost::vertex_name_t, std::string, boost::property< boost::vertex_color_t, boost::default_color_type > > VertexProperties
Definition: DAGAd.h:410
~DAGAdNodeIterator()
Definition: DAGAd.h:295
bool remove_node(std::string const &name)
reference operator*() const
virtual ~InvalidDescriptionFilename()
Definition: DAGAd.h:194
int retry_count() const
bool replace_description_ad(classad::ClassAd *ad)