26 #ifndef GLITE_WMS_COMMON_REQUESTAD_DAGAD_H
27 #define GLITE_WMS_COMMON_REQUESTAD_DAGAD_H
34 #include <classad_distribution.h>
37 #include <boost/shared_ptr.hpp>
38 #include <boost/utility.hpp>
39 #include <boost/tuple/tuple.hpp>
40 #include <boost/config.hpp>
42 #include "glite/wmsutils/classads/classad_utils.h"
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>
53 namespace utilities = glite::wmsutils::classads;
60 virtual char const*
what()
const throw() {
return "Invalid DAG"; }
67 virtual char const*
what()
const throw() {
68 return "'node_type' must be \"dag\"";
75 virtual char const*
what()
const throw() {
76 return "'max_running_nodes' has to be an integer > 0";
83 virtual char const*
what()
const throw() {
84 return "'nodes' not valid";
91 virtual char const*
what()
const throw() {
92 return "'dependencies' not valid";
99 virtual char const*
what()
const throw() {
100 return "Invalid reference in 'dependencies'";
107 virtual char const*
what()
const throw() {
108 return "DAG has a cycle";
120 virtual char const*
what() throw() {
121 m_msg =
"'node_type': " + m_type +
" is not valid";
122 return m_msg.c_str();
130 virtual char const*
what()
const throw() {
131 return "'node_retry_count' must be an integer >= 0";
143 virtual char const*
what() throw()
146 return m_msg.c_str();
155 virtual char const*
what() throw()
157 m_msg =
"Neither 'ad' nor 'file' specified" +
159 return m_msg.c_str();
168 virtual char const*
what() throw()
170 m_msg =
"Both 'ad' and 'file' specified" +
172 return m_msg.c_str();
180 std::string m_description;
182 virtual char const*
what() throw()
184 m_msg =
"'file' not valid" +
185 (m_description.empty() ?
"" :
" (" + m_description +
")");
187 return m_msg.c_str();
190 std::string
const&
node,
191 std::string
const& description
200 virtual char const*
what() throw()
202 m_msg =
"'description' not valid" +
204 return m_msg.c_str();
213 virtual char const*
what() throw()
215 m_msg =
"'node_retry_count' must be an integer >= 0" +
217 return m_msg.c_str();
227 virtual char const*
what() throw()
229 m_msg =
"node_type not valid" +
230 (m_type.empty() ?
"" :
" (" + m_type +
")");
232 return m_msg.c_str();
241 class Implementation;
242 boost::shared_ptr<Implementation> m_impl;
246 DAGNodeInfo(classad::ClassAd
const& node_description,
247 std::string
const& node_type = std::string(),
248 std::string
const& node_name = std::string()
260 std::string
type()
const;
269 :
public std::iterator<
270 std::input_iterator_tag
271 ,std::pair<std::string, DAGNodeInfo>
273 ,std::pair<std::string, DAGNodeInfo> const*
274 ,std::pair<std::string, DAGNodeInfo> const&
281 classad::ClassAd
const* m_nodes;
282 classad::ClassAd::const_iterator m_node;
287 return m_node != m_nodes->end();
297 classad::ClassAd::const_iterator it
315 return lhs.m_nodes == rhs.m_nodes && lhs.m_node == rhs.m_node;
321 return !(lhs == rhs);
325 :
public std::iterator<
326 std::input_iterator_tag
327 ,std::pair<DAGAdNodeIterator, DAGAdNodeIterator>
329 ,std::pair<DAGAdNodeIterator, DAGAdNodeIterator> const*
330 ,std::pair<DAGAdNodeIterator, DAGAdNodeIterator> const&
346 static classad::ExprList*
parents(classad::ExprTree* dep)
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);
353 static classad::ExprList*
children(classad::ExprTree* dep)
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);
395 return !(lhs == rhs);
407 typedef boost::property<
408 boost::vertex_name_t, std::string, boost::property<
409 boost::vertex_color_t, boost::default_color_type
412 typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, VertexProperties>
Graph_t;
413 typedef boost::graph_traits<Graph_t>::vertex_descriptor
Vertex;
418 boost::shared_ptr<classad::ClassAd> m_ad;
423 explicit DAGAd(classad::ClassAd
const&
ad);
426 classad::ClassAd
const&
ad()
const;
452 bool add_dependency(std::string
const& first, std::string
const& second);
456 bool set_generic(std::string
const& attribute, classad::ExprTree* value);
457 classad::ExprTree
const*
get_generic(std::string
const& attribute)
const;
461 std::pair<node_iterator, node_iterator>
nodes()
const;
static classad::ExprList * parents(classad::ExprTree *dep)
Definition: DAGAd.h:346
static std::string const NODE_RETRY_COUNT
Definition: DAGAd.h:468
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
InvalidDescription(std::string const &node)
Definition: DAGAd.h:206
std::string m_msg
Definition: DAGAd.h:139
pointer operator->() const
Definition: DAGAd.h:305
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
virtual ~DAG_Error()
Definition: DAGAd.h:61
std::size_t num_dependencies() const
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
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
~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
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
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
reference operator*() const
Definition: DAGAd.h:370
DAGAdDependencyIterator(classad::ClassAd const *dag=0, bool begin=false)
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
std::string m_msg
Definition: DAGAd.h:58
Iterator m_child
Definition: DAGAd.h:343
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
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
bool replace_description_ad(classad::ClassAd *ad)