23 #include "exceptions.h" 25 #include <utils/misc/string_conversions.h> 26 #include <interface/interface.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();
361 if (name.length() > __INTERFACE_TYPE_SIZE) {
363 __INTERFACE_TYPE_SIZE);
366 attr = el->get_attribute(
"author");
368 author = attr->get_value();
370 attr = el->get_attribute(
"year");
372 year = attr->get_value();
374 attr = el->get_attribute(
"created");
376 creation_date = attr->get_value();
386 NodeSet constants_set = root->find(
"/interface/constants");
387 if ( constants_set.size() > 1 ) {
390 if ( constants_set.size() == 1 ) {
392 set = constants_set[0]->find(
"constant");
393 for (NodeSet::iterator i =
set.begin(); i !=
set.end(); ++i) {
396 NodeSet nameset = (*i)->find(
"text()");
397 if ( nameset.size() == 0 ) {
400 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(nameset[0]);
401 if ( ! comment_node ) {
404 std::string const_comment = comment_node->get_content();
410 std::string const_name;
412 el =
dynamic_cast<const Element *
>(*i);
416 attr = el->get_attribute(
"type");
420 type = attr->get_value();
422 attr = el->get_attribute(
"name");
426 const_name = attr->get_value();
428 attr = el->get_attribute(
"value");
432 value = attr->get_value();
440 constants.push_back(constant);
447 for (vector<InterfaceConstant>::iterator i = constants.begin(); i != constants.end(); ++i) {
448 for (vector<InterfaceConstant>::iterator j = i + 1; j != constants.end(); ++j) {
449 if ( (*i).getName() == (*j).getName() ) {
459 set = constants_set[0]->find(
"enum");
460 for (NodeSet::iterator i =
set.begin(); i !=
set.end(); ++i) {
462 std::string enum_comment;
463 NodeSet comment_set = (*i)->find(
"comment/text()");
464 if ( comment_set.size() == 0 ) {
467 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
468 if ( comment_node ) {
469 enum_comment = comment_node->get_content();
476 el =
dynamic_cast<const Element *
>(*i);
480 attr = el->get_attribute(
"name");
484 enum_name = attr->get_value();
493 NodeSet items = (*i)->find(
"item");
494 if ( items.size() == 0 ) {
498 for (NodeSet::iterator j = items.begin(); j != items.end(); ++j) {
500 std::string item_name;
501 std::string item_value;
502 el =
dynamic_cast<const Element *
>(*j);
506 attr = el->get_attribute(
"name");
510 item_name = attr->get_value();
513 val_attr = el->get_attribute(
"value");
515 item_value = val_attr->get_value();
522 comment_set = (*j)->find(
"text()");
523 if ( comment_set.size() == 0) {
526 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
527 if ( comment_node ) {
528 if (item_value !=
"") {
529 enum_constant.
add_item(item_name, comment_node->get_content(),
532 enum_constant.
add_item(item_name, comment_node->get_content());
539 enum_constants.push_back(enum_constant);
541 vector<InterfaceEnumConstant>::iterator i;
542 for (i = enum_constants.begin(); i != enum_constants.end(); ++i) {
543 vector<InterfaceEnumConstant>::iterator j;
544 for (j = i + 1; j != enum_constants.end(); ++j) {
545 if ( i->get_name() == j->get_name() ) {
556 set = root->find(
"/interface/data");
557 if (
set.size() > 1 ) {
559 }
else if (
set.size() == 0 ) {
563 data_fields = getFields(
set[0]);
564 if ( data_fields.size() == 0 ) {
568 pseudo_maps = getPseudoMaps(
set[0], data_fields);
570 NodeSet comment_set = root->find(
"/interface/data/comment/text()");
571 if ( comment_set.size() == 0) {
574 const TextNode *comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
575 if ( comment_node ) {
576 data_comment = comment_node->get_content();
585 set = root->find(
"/interface/message");
586 for (NodeSet::iterator i =
set.begin(); i !=
set.end(); ++i) {
587 std::string msg_name;
588 std::string msg_comment;
590 el =
dynamic_cast<const Element *
>(*i);
593 attr = el->get_attribute(
"name");
597 msg_name = attr->get_value();
602 comment_set = (*i)->find(
"text()");
603 if ( comment_set.size() == 0) {
606 comment_node =
dynamic_cast<const TextNode *
>(comment_set[0]);
607 if ( comment_node ) {
608 msg_comment = comment_node->get_content();
614 vector<InterfaceField> msg_fields = getFields(*i);
616 NodeSet ref_nodes = (*i)->find(
"ref/text()");
617 for (NodeSet::iterator r = ref_nodes.begin(); r != ref_nodes.end(); ++r) {
618 const TextNode *text_node =
dynamic_cast<const TextNode *
>(*r);
622 for (vector<InterfaceField>::iterator j = data_fields.begin(); j != data_fields.end(); ++j) {
623 if ( (*j).getName() == text_node->get_content() ) {
625 msg_fields.push_back(*j);
637 for (vector<InterfaceField>::iterator k = msg_fields.begin(); k != msg_fields.end(); ++k) {
638 for (vector<InterfaceField>::iterator j = k + 1; j != msg_fields.end(); ++j) {
639 if ( (*k).getName() == (*j).getName() ) {
646 msg.setFields(msg_fields);
648 messages.push_back(msg);
694 return creation_date;
702 std::vector<InterfaceConstant>
713 std::vector<InterfaceEnumConstant>
716 return enum_constants;
724 std::vector<InterfaceField>
735 std::vector<InterfacePseudoMap>
757 std::vector<InterfaceMessage>
InterfaceParser(std::string config_filename)
Constructor.
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...
void printPseudoMaps(std::vector< InterfacePseudoMap > &pseudo_maps)
Print pseudo maps.
void printFields(std::vector< InterfaceField > &fields)
Print fields.
std::string getName() const
Get name of field.
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.