24 #include "exceptions.h"
26 #include <utils/misc/string_conversions.h>
31 #include <libxml++/libxml++.h>
34 using namespace xmlpp;
48 dom =
new DomParser();
50 dom->set_substitute_entities();
51 dom->parse_file(config_filename);
52 root = dom->get_document()->get_root_node();
71 std::vector<InterfaceField>
74 vector<InterfaceField> result;
75 NodeSet set = node->find(
"field");
76 for (NodeSet::iterator i = set.begin(); i != set.end(); ++i) {
79 const Element * el =
dynamic_cast<const Element *
>(*i);
82 const Element::AttributeList& attrs = el->get_attributes();
83 for(Element::AttributeList::const_iterator iter = attrs.begin(); iter != attrs.end(); ++iter) {
84 const Attribute* attr = *iter;
93 NodeSet nameset = (*i)->find(
"text()");
94 if ( nameset.size() == 0 ) {
97 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(nameset[0]);
98 if ( ! comment_node ) {
111 for (vector<InterfaceField>::iterator i = result.begin(); i != result.end(); ++i) {
112 for (vector<InterfaceField>::iterator j = i + 1; j != result.end(); ++j) {
113 if ( (*i).getName() == (*j).getName() ) {
129 std::vector<InterfacePseudoMap>
132 vector<InterfacePseudoMap> result;
133 NodeSet set = node->find(
"pseudomap");
134 for (NodeSet::iterator i = set.begin(); i != set.end(); ++i) {
135 const Element *el =
dynamic_cast<const Element *
>(*i);
136 std::string pm_name, pm_type, pm_keytype;
140 attr = el->get_attribute(
"name");
142 pm_name = attr->get_value();
144 attr = el->get_attribute(
"type");
146 pm_type = attr->get_value();
148 attr = el->get_attribute(
"keytype");
150 pm_keytype = attr->get_value();
155 NodeSet comment_set = (*i)->find(
"text()");
156 if ( comment_set.size() == 0) {
159 std::string pm_comment =
"";
160 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
161 if ( comment_node ) {
162 pm_comment = comment_node->get_content();
169 NodeSet ref_nodes = (*i)->find(
"mapref");
170 for (NodeSet::iterator r = ref_nodes.begin(); r != ref_nodes.end(); ++r) {
171 NodeSet ref_set = (*r)->find(
"text()");
172 if ( ref_set.size() == 0) {
176 const Element *el =
dynamic_cast<const Element *
>(*r);
178 attr = el->get_attribute(
"key");
180 std::string mapref_key = attr->get_value();
182 const TextNode *text_node =
dynamic_cast<const TextNode *
>(ref_set[0]);
186 for (vector<InterfaceField>::iterator j = fields.begin(); j != fields.end(); ++j) {
187 if ( (*j).getName() == text_node->get_content() ) {
189 if ( j->getLengthValue() > 0 ) {
192 pm.
addRef(text_node->get_content(), mapref_key);
209 result.push_back(pm);
214 for (vector<InterfacePseudoMap>::iterator i = result.begin(); i != result.end(); ++i) {
215 for (vector<InterfacePseudoMap>::iterator j = i + 1; j != result.end(); ++j) {
216 if ( (*i).getName() == (*j).getName() ) {
220 for (vector<InterfaceField>::iterator f = fields.begin(); f != fields.end(); ++f) {
221 if ( i->getName() == f->getName() ) {
238 for (vector<InterfaceField>::iterator i = fields.begin(); i != fields.end(); ++i) {
239 cout <<
" Field: name=" << (*i).getName() <<
" type=" << (*i).getType();
240 if ( (*i).getLength() !=
"" ) {
241 cout <<
" length=" << (*i).getLength();
243 if ( (*i).getValidFor() !=
"" ) {
244 cout <<
" validfor=" << (*i).getValidFor();
246 if ( (*i).getDefaultValue() !=
"" ) {
247 cout <<
" default=" << (*i).getDefaultValue();
249 vector<string> flags = (*i).getFlags();
250 if ( flags.size() > 0 ) {
252 vector<string>::iterator j = flags.begin();
253 while (j != flags.end()) {
256 if ( j != flags.end()) {
271 for (vector<InterfacePseudoMap>::iterator i = pseudo_maps.begin(); i != pseudo_maps.end(); ++i) {
272 cout <<
" PseudoMap: name=" << i->getName()
273 <<
" type=" << i->getType()
274 <<
" keytype=" << i->getKeyType() << endl;
277 InterfacePseudoMap::RefList::iterator j;
278 for (j = reflist.begin(); j != reflist.end(); ++j) {
279 cout <<
" Ref: field=" << j->first
280 <<
" key=" << j->second << endl;
297 vector<InterfaceEnumConstant> & enum_constants,
298 vector<InterfaceField> & data_fields,
299 vector<InterfacePseudoMap> & pseudo_maps,
300 vector<InterfaceMessage> & messages)
302 cout <<
"Constants" << endl;
303 for (vector<InterfaceConstant>::iterator i = constants.begin(); i != constants.end(); ++i) {
304 cout <<
" Constant: name=" << (*i).getName() <<
" type=" << (*i).getType()
305 <<
" value=" << (*i).getValue() << endl;
308 cout <<
"EnumConstants" << endl;
309 for (vector<InterfaceEnumConstant>::iterator i = enum_constants.begin(); i != enum_constants.end(); ++i) {
310 cout <<
" EnumConstant: name=" << (*i).get_name() << endl;
311 vector<InterfaceEnumConstant::EnumItem> items = (*i).get_items();
312 vector<InterfaceEnumConstant::EnumItem>::iterator j;
313 for (j = items.begin(); j != items.end(); ++j) {
314 cout <<
" Item: " << j->name <<
"(" << j->comment <<
")" << endl;
318 cout <<
"Data block" << endl;
319 printFields(data_fields);
320 printPseudoMaps(pseudo_maps);
321 for (vector<InterfaceMessage>::iterator i = messages.begin(); i != messages.end(); ++i) {
322 cout <<
"Message: name=" << (*i).getName() << endl;
323 vector<InterfaceField> msg_fields = (*i).getFields();
324 printFields(msg_fields);
333 printParsed(constants, enum_constants, data_fields, pseudo_maps, messages);
344 enum_constants.clear();
352 const Element * el =
dynamic_cast<const Element *
>(root);
356 attr = el->get_attribute(
"name");
360 name = attr->get_value();
362 attr = el->get_attribute(
"author");
364 author = attr->get_value();
366 attr = el->get_attribute(
"year");
368 year = attr->get_value();
370 attr = el->get_attribute(
"created");
372 creation_date = attr->get_value();
382 NodeSet constants_set = root->find(
"/interface/constants");
383 if ( constants_set.size() > 1 ) {
386 if ( constants_set.size() == 1 ) {
388 set = constants_set[0]->find(
"constant");
389 for (NodeSet::iterator i = set.begin(); i != set.end(); ++i) {
392 NodeSet nameset = (*i)->find(
"text()");
393 if ( nameset.size() == 0 ) {
396 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(nameset[0]);
397 if ( ! comment_node ) {
400 std::string const_comment = comment_node->get_content();
406 std::string const_name;
408 el =
dynamic_cast<const Element *
>(*i);
412 attr = el->get_attribute(
"type");
416 type = attr->get_value();
418 attr = el->get_attribute(
"name");
422 const_name = attr->get_value();
424 attr = el->get_attribute(
"value");
428 value = attr->get_value();
436 constants.push_back(constant);
443 for (vector<InterfaceConstant>::iterator i = constants.begin(); i != constants.end(); ++i) {
444 for (vector<InterfaceConstant>::iterator j = i + 1; j != constants.end(); ++j) {
445 if ( (*i).getName() == (*j).getName() ) {
455 set = constants_set[0]->find(
"enum");
456 for (NodeSet::iterator i = set.begin(); i != set.end(); ++i) {
458 std::string enum_comment;
459 NodeSet comment_set = (*i)->find(
"comment/text()");
460 if ( comment_set.size() == 0 ) {
463 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
464 if ( comment_node ) {
465 enum_comment = comment_node->get_content();
472 el =
dynamic_cast<const Element *
>(*i);
476 attr = el->get_attribute(
"name");
480 enum_name = attr->get_value();
489 NodeSet items = (*i)->find(
"item");
490 if ( items.size() == 0 ) {
494 for (NodeSet::iterator j = items.begin(); j != items.end(); ++j) {
496 std::string item_name;
497 std::string item_value;
498 el =
dynamic_cast<const Element *
>(*j);
502 attr = el->get_attribute(
"name");
506 item_name = attr->get_value();
509 val_attr = el->get_attribute(
"value");
511 item_value = val_attr->get_value();
518 comment_set = (*j)->find(
"text()");
519 if ( comment_set.size() == 0) {
522 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
523 if ( comment_node ) {
524 if (item_value !=
"") {
525 enum_constant.
add_item(item_name, comment_node->get_content(),
528 enum_constant.
add_item(item_name, comment_node->get_content());
535 enum_constants.push_back(enum_constant);
537 vector<InterfaceEnumConstant>::iterator i;
538 for (i = enum_constants.begin(); i != enum_constants.end(); ++i) {
539 vector<InterfaceEnumConstant>::iterator j;
540 for (j = i + 1; j != enum_constants.end(); ++j) {
541 if ( i->get_name() == j->get_name() ) {
552 set = root->find(
"/interface/data");
553 if ( set.size() > 1 ) {
555 }
else if ( set.size() == 0 ) {
559 data_fields = getFields(set[0]);
560 if ( data_fields.size() == 0 ) {
564 pseudo_maps = getPseudoMaps(set[0], data_fields);
566 NodeSet comment_set = root->find(
"/interface/data/comment/text()");
567 if ( comment_set.size() == 0) {
570 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
571 if ( comment_node ) {
572 data_comment = comment_node->get_content();
581 set = root->find(
"/interface/message");
582 for (NodeSet::iterator i = set.begin(); i != set.end(); ++i) {
583 std::string msg_name;
584 std::string msg_comment;
586 el =
dynamic_cast<const Element *
>(*i);
589 attr = el->get_attribute(
"name");
593 msg_name = attr->get_value();
598 comment_set = (*i)->find(
"text()");
599 if ( comment_set.size() == 0) {
602 comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
603 if ( comment_node ) {
604 msg_comment = comment_node->get_content();
610 vector<InterfaceField> msg_fields = getFields(*i);
612 NodeSet ref_nodes = (*i)->find(
"ref/text()");
613 for (NodeSet::iterator r = ref_nodes.begin(); r != ref_nodes.end(); ++r) {
614 const TextNode *text_node =
dynamic_cast<const TextNode *
>(*r);
618 for (vector<InterfaceField>::iterator j = data_fields.begin(); j != data_fields.end(); ++j) {
619 if ( (*j).getName() == text_node->get_content() ) {
621 msg_fields.push_back(*j);
633 for (vector<InterfaceField>::iterator k = msg_fields.begin(); k != msg_fields.end(); ++k) {
634 for (vector<InterfaceField>::iterator j = k + 1; j != msg_fields.end(); ++j) {
635 if ( (*k).getName() == (*j).getName() ) {
644 messages.push_back(msg);
690 return creation_date;
698 std::vector<InterfaceConstant>
709 std::vector<InterfaceEnumConstant>
712 return enum_constants;
720 std::vector<InterfaceField>
731 std::vector<InterfacePseudoMap>
753 std::vector<InterfaceMessage>
InterfaceParser(std::string config_filename)
Constructor.
void setFields(const std::vector< InterfaceField > &fields)
Set fields of message.
Thrown if document contains illegal content.
Interface generator internal representation of a constant as parsed from the XML template file...
void printParsed(std::vector< InterfaceConstant > &constants, std::vector< InterfaceEnumConstant > &enum_constants, std::vector< InterfaceField > &data_fields, std::vector< InterfacePseudoMap > &pseudo_maps, std::vector< InterfaceMessage > &messages)
Print parsed config.
void parse()
Parse config.
Interface generator internal representation of a enum constant as parsed from the XML template file...
std::string getName() const
Get name of field.
void printPseudoMaps(std::vector< InterfacePseudoMap > &pseudo_maps)
Print pseudo maps.
void printFields(std::vector< InterfaceField > &fields)
Print fields.
Interface generator internal representation of a field as parsed from the XML template file...
void print()
Print parsed data.
Interface generator internal representation of a message as parsed from the XML template file...
static int to_int(std::string s)
Convert string to an int value.
Thrown if illegal value is supplied.
std::vector< InterfacePseudoMap > getPseudoMaps()
Get data pseudo maps.
std::vector< InterfaceField > getFields(xmlpp::Node *node)
Get parsed fields.
void valid()
Assert validity.
~InterfaceParser()
Destructor.
std::string getInterfaceAuthor()
Get interface author.
std::string getDataComment()
Get data comment.
Base class for exceptions in Fawkes.
std::list< std::pair< std::string, std::string > > RefList
Reference list.
Thrown if name is ambiguous.
void setComment(const std::string &comment)
Set comment of field.
std::vector< InterfaceMessage > getMessages()
Get messages.
std::vector< InterfaceField > getDataFields()
Get data fields.
Interface generator internal representation of a pseudo map as parsed from the XML template file...
std::string getInterfaceCreationDate()
Get interface creation date as string Only valid after parse().
void print_trace()
Prints trace to stderr.
void addRef(std::string fieldname, std::string key)
Add reference.
std::string getInterfaceName()
Get interface name.
Thrown if document was invalid.
std::vector< InterfaceEnumConstant > getEnumConstants()
Get enum constants.
void valid()
Assert validity.
std::string getInterfaceYear()
Get interface copyright year.
void add_item(std::string name, std::string comment)
Add an item without custom value.
std::vector< InterfaceConstant > getConstants()
Get constants.
void setAttribute(const std::string &attr_name, const std::string &attr_value)
Set attribute.
Thrown if illegal type is supplied.