fipa_acl  1.4
xml_format.cpp
Go to the documentation of this file.
1 #include "xml_format.h"
2 #include <boost/foreach.hpp>
3 #include <boost/algorithm/string/erase.hpp>
4 
5 namespace fipa {
6 namespace acl {
7 
8 TiXmlElement* XMLFormat::getDate(const base::Time& date)
9 {
10  TiXmlElement* dateElem = new TiXmlElement("date");
11  dateElem->LinkEndChild(new TiXmlText(dateToStr(date)));
12  return dateElem;
13 }
14 
15 const std::string XMLFormat::dateToStr(const base::Time& date)
16 {
17  std::string dateStr = date.toString(base::Time::Milliseconds, "%Y%m%dT%H%M%S");
18  boost::erase_all(dateStr, ":"); // Erase the colon
19  return dateStr;
20 }
21 
22 TiXmlElement* XMLFormat::getURL(const std::string& url, bool useHref)
23 {
24  TiXmlElement* urlElem = new TiXmlElement("url");
25  if(useHref)
26  {
27  urlElem->SetAttribute("href", url);
28  }
29  else
30  {
31  urlElem->LinkEndChild(new TiXmlText(url));
32  }
33  return urlElem;
34 }
35 
36 TiXmlElement* XMLFormat::getName(const std::string& name, bool useId)
37 {
38  TiXmlElement* nameElem = new TiXmlElement("name");
39  if(useId)
40  {
41  // XXX What is the difference between id and refid
42  nameElem->SetAttribute("id", name);
43  }
44  else
45  {
46  nameElem->LinkEndChild(new TiXmlText(name));
47  }
48  return nameElem;
49 }
50 
51 std::vector< TiXmlElement* > XMLFormat::getAgentIDSequence(const AgentIDList& aidl, bool useNameId, bool useUrlHref)
52 {
53  std::vector<TiXmlElement*> vec;
54  BOOST_FOREACH(AgentID aid, aidl)
55  {
56  vec.push_back(getAgentID(aid, useNameId, useUrlHref));
57  }
58  return vec;
59 }
60 
61 TiXmlElement* XMLFormat::getAgentID(const AgentID& aid, bool useNameId, bool useUrlHref)
62 {
63  TiXmlElement* aidElem = new TiXmlElement("agent-identifier");
64 
65  TiXmlElement* nameElem = getName(aid.getName(), useNameId);
66  aidElem->LinkEndChild(nameElem);
67 
68  std::vector<std::string> addresses = aid.getAddresses();
69  if(!addresses.empty())
70  {
71  TiXmlElement* addressesElem = new TiXmlElement("addresses");
72  BOOST_FOREACH(std::string address, addresses)
73  {
74  TiXmlElement* urlElem = getURL(address, useUrlHref);
75  addressesElem->LinkEndChild(urlElem);
76  }
77  aidElem->LinkEndChild(addressesElem);
78  }
79 
80  Resolvers resolvers = aid.getResolvers();
81  if(!resolvers.empty())
82  {
83  TiXmlElement* resolversElem = new TiXmlElement("resolvers");
84  BOOST_FOREACH(TiXmlElement* resolverElem, getAgentIDSequence(resolvers, useNameId, useUrlHref))
85  {
86  resolversElem->LinkEndChild(resolverElem);
87  }
88  aidElem->LinkEndChild(resolversElem);
89  }
90 
91  BOOST_FOREACH(TiXmlElement* elem, getUserdefinedParameters(aid.getUserdefParams()))
92  {
93  aidElem->LinkEndChild(elem);
94  }
95 
96  return aidElem;
97 }
98 
99 TiXmlElement* XMLFormat::getReceivedObject(const ReceivedObject& receivedObject)
100 {
101  // by/from definition uses url, example uses attribute "value"
102  // Jade also uses example spec, not ACTUAL spec!
103 
104  TiXmlElement* recvElem = new TiXmlElement( "received" );
105 
106  // As received objects are only used by envelopes, which have URLs without
107  // href attribute, getURL must be called with useHref=false
108  TiXmlElement* recvByElem = new TiXmlElement("received-by");
109  recvByElem->SetAttribute("value", receivedObject.getBy());
110  recvElem->LinkEndChild(recvByElem);
111 
112  if(receivedObject.getFrom() != "")
113  {
114  TiXmlElement* recvFromElem = new TiXmlElement("received-from");
115  recvFromElem->SetAttribute("value", receivedObject.getFrom());
116  recvElem->LinkEndChild(recvFromElem);
117  }
118 
119  TiXmlElement* recvDateElem = new TiXmlElement("received-date");
120  recvDateElem->SetAttribute("value", dateToStr(receivedObject.getDate()));
121  recvElem->LinkEndChild(recvDateElem);
122 
123  if(receivedObject.getId() != "")
124  {
125  TiXmlElement* recvIdElem = new TiXmlElement("received-id");
126  recvIdElem->SetAttribute("value", receivedObject.getId());
127  recvElem->LinkEndChild(recvIdElem);
128  }
129 
130  if(receivedObject.getVia() != "")
131  {
132  TiXmlElement* recvViaElem = new TiXmlElement("received-via");
133  recvViaElem->SetAttribute("value", receivedObject.getVia());
134  recvElem->LinkEndChild(recvViaElem);
135  }
136 
137  BOOST_FOREACH(TiXmlElement* elem, getUserdefinedParameters(receivedObject.getUserdefinedParameters()))
138  {
139  recvElem->LinkEndChild(elem);
140  }
141 
142  return recvElem;
143 }
144 
145 std::vector< TiXmlElement* > XMLFormat::getUserdefinedParameters(const UserdefinedParameterList& params)
146 {
147  std::vector<TiXmlElement*> vec;
148  BOOST_FOREACH(UserdefParam userdefParam, params)
149  {
150  TiXmlElement* userdefParamElem = new TiXmlElement("user-defined");
151  userdefParamElem->SetAttribute("href", "X-" + userdefParam.getName());
152  userdefParamElem->SetAttribute("type", "string");
153  userdefParamElem->LinkEndChild(new TiXmlText(userdefParam.getValue()));
154  vec.push_back(userdefParamElem);
155  }
156  return vec;
157 }
158 
159 } // end namespace acl
160 } // end namespace fipa
const UserdefinedParameterList & getUserdefinedParameters() const
const Resolvers & getResolvers() const
Get list of resolvers.
Definition: agent_id.h:127
const URL & getFrom() const
const std::string & getName() const
setter and getter methods for all fields; they do not result in deep-copies assignments/retreivals, but this can be easily changed if needed through the overloaded operator which do
Definition: agent_id.h:90
std::vector< UserdefParam > UserdefinedParameterList
Definition: userdef_param.h:94
const URL & getBy() const
std::vector< AgentID > AgentIDList
Definition: agent_id.h:20
const base::Time & getDate() const
const std::string & getValue() const
Definition: userdef_param.h:65
static TiXmlElement * getURL(const std::string &url, bool useHref)
Definition: xml_format.cpp:22
const std::vector< std::string > & getAddresses() const
Retrieve list of addresses.
Definition: agent_id.h:110
static const std::string dateToStr(const base::Time &date)
Definition: xml_format.cpp:15
static TiXmlElement * getAgentID(const AgentID &aid, bool useNameId, bool useUrlHref)
Definition: xml_format.cpp:61
AgentIDList Resolvers
Definition: agent_id.h:27
static TiXmlElement * getName(const std::string &name, bool useId)
Definition: xml_format.cpp:36
static TiXmlElement * getReceivedObject(const ReceivedObject &receivedObject)
Definition: xml_format.cpp:99
static std::vector< TiXmlElement * > getAgentIDSequence(const AgentIDList &aidl, bool useNameId, bool useUrlHref)
Definition: xml_format.cpp:51
const std::string & getName() const
Definition: userdef_param.h:77
const Via & getVia() const
static TiXmlElement * getDate(const base::Time &date)
Definition: xml_format.cpp:8
const ID & getId() const
overloaded equality operator for UserdefParam class objects
Definition: userdef_param.h:25
static std::vector< TiXmlElement * > getUserdefinedParameters(const UserdefinedParameterList &params)
Definition: xml_format.cpp:145
const std::vector< UserdefParam > & getUserdefParams() const
Get the all userdefined parameter.
Definition: agent_id.h:150
Implements the general AgentID functionality, which is present throughout the fipa specifications(FIP...
Definition: agent_id.h:37
Foundation of Physical Intelligent Agents.
Definition: conversation.cpp:6