CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Types | Private Attributes
FWXMLConfigParser Class Reference
Inheritance diagram for FWXMLConfigParser:
SimpleSAXParser

Public Member Functions

FWConfigurationconfig (void)
 
virtual void data (const std::string &data) override
 
virtual void endElement (const std::string &tag) override
 
 FWXMLConfigParser (istream &f)
 
void pushConfig (Attributes &attributes)
 
virtual void startElement (const std::string &tag, Attributes &attributes) override
 
- Public Member Functions inherited from SimpleSAXParser
void parse (void)
 
 SimpleSAXParser (std::istream &f)
 
virtual ~SimpleSAXParser ()
 

Private Types

enum  STATES {
  IN_BEGIN_DOCUMENT, IN_PUSHED_CONFIG, IN_POPPED_CONFIG, IN_BEGIN_STRING,
  IN_STORED_STRING
}
 

Private Attributes

std::vector< std::pair
< std::string, FWConfiguration * > > 
m_configs
 
std::string m_currentConfigName
 
std::auto_ptr< FWConfigurationm_first
 
enum STATES m_state
 

Additional Inherited Members

- Public Types inherited from SimpleSAXParser
typedef std::vector< AttributeAttributes
 
enum  PARSER_STATES {
  IN_DOCUMENT, IN_BEGIN_TAG, IN_DONE, IN_BEGIN_ELEMENT,
  IN_ELEMENT_WHITESPACE, IN_END_ELEMENT, IN_ATTRIBUTE_KEY, IN_END_TAG,
  IN_DATA, IN_BEGIN_ATTRIBUTE_VALUE, IN_STRING, IN_END_ATTRIBUTE_VALUE,
  IN_STRING_ENTITY, IN_DATA_ENTITY
}
 

Detailed Description

Helper class which reads the XML configuration and constructs the FWConfiguration classes.

State machine for the parser can be found by cut and pasting the following in graphviz.

digraph { IN_BEGIN_DOCUMENT->IN_PUSHED_CONFIG [label = "beginElement(config)"]

IN_PUSHED_CONFIG->IN_PUSHED_CONFIG [label = "beginElement(config)"] IN_PUSHED_CONFIG->IN_POPPED_CONFIG [label = "endElement(config)"] IN_PUSHED_CONFIG->IN_BEGIN_STRING [label = "beginElement(string)"]

IN_POPPED_CONFIG->IN_PUSHED_CONFIG [label = "beginElement(config)"] IN_POPPED_CONFIG->IN_POPPED_CONFIG [label = "endElement(config)"] IN_POPPED_CONFIG->DONE [label = "top level config popped"]

IN_BEGIN_STRING->IN_STORED_STRING [label = "data()"]; IN_BEGIN_STRING->IN_PUSHED_CONFIG [label = "endElement(string)"]

IN_STORED_STRING->IN_PUSHED_CONFIG [label = "endElement(string)"] }

Definition at line 206 of file FWConfigurationManager.cc.

Member Enumeration Documentation

Constructor & Destructor Documentation

FWXMLConfigParser::FWXMLConfigParser ( istream &  f)
inline

Definition at line 217 of file FWConfigurationManager.cc.

218  : SimpleSAXParser(f),
220  m_first(0)
221  {}
std::auto_ptr< FWConfiguration > m_first
double f[11][100]
SimpleSAXParser(std::istream &f)

Member Function Documentation

FWConfiguration* FWXMLConfigParser::config ( void  )
inline

The parsed configuration. Notice that the parser owns it and destroys it when destroyed.

Definition at line 337 of file FWConfigurationManager.cc.

References m_first.

338  {
339  return m_first.get();
340  }
std::auto_ptr< FWConfiguration > m_first
virtual void FWXMLConfigParser::data ( const std::string &  data)
inlineoverridevirtual

Executes any transaction in the state machine which happens when the xml parser finds some data (i.e. text) between tags This is mainly used to handle <string> element contents but also whitespace between tags.

Reimplemented from SimpleSAXParser.

Definition at line 320 of file FWConfigurationManager.cc.

References debug_config_state_machine(), IN_BEGIN_STRING, IN_STORED_STRING, m_configs, and m_state.

Referenced by cuy.FindIssue::__init__().

321  {
323  // We ignore whitespace but complain about any text which is not
324  // in the <string> tag.
325  if (m_state == IN_BEGIN_STRING)
326  {
327  m_configs.back().second->addValue(data);
329  }
330  else if (strspn(data.c_str(), " \t\n") != data.size())
331  throw ParserError("Unexpected text " + data);
332  }
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
void debug_config_state_machine(const char *where, const std::string &tag, int state)
virtual void data(const std::string &data) override
virtual void FWXMLConfigParser::endElement ( const std::string &  tag)
inlineoverridevirtual

Executes any transaction in the state machine which happens when the xml parser closes an element.

Notice that we need to do addKeyValue on endElement (and carry around the FWConfigutation name) because of the "copy by value" policy of addKeyValue addition which would add empty FWConfiguration objects if done on startElement.

Reimplemented from SimpleSAXParser.

Definition at line 289 of file FWConfigurationManager.cc.

References cond::rpcobimon::current, debug_config_state_machine(), IN_BEGIN_STRING, IN_POPPED_CONFIG, IN_PUSHED_CONFIG, IN_STORED_STRING, combine::key, m_configs, m_state, and AlCaHLTBitMon_QueryRunRegistry::string.

290  {
293  {
294  if (tag != "config")
295  throw ParserError("Wrong closing tag found " + tag);
296 
297  FWConfiguration *current = m_configs.back().second;
298  std::string key = m_configs.back().first;
299  m_configs.pop_back();
300  if (!m_configs.empty())
301  m_configs.back().second->addKeyValue(key, *current);
303  }
304  else if (m_state == IN_BEGIN_STRING && tag == "string")
305  {
306  m_configs.back().second->addValue("");
308  }
309  else if (m_state == IN_STORED_STRING && tag == "string")
311  else
312  throw ParserError("Wrong closing tag found " + tag);
313  }
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
void debug_config_state_machine(const char *where, const std::string &tag, int state)
list key
Definition: combine.py:13
void FWXMLConfigParser::pushConfig ( Attributes attributes)
inline

Pushes the configuration on stack eventually

Definition at line 224 of file FWConfigurationManager.cc.

References asciidump::attr, alignCSCRings::e, i, SimpleSAXParser::Attribute::key, m_configs, mergeVDriftHistosByStation::name, AlCaHLTBitMon_QueryRunRegistry::string, SimpleSAXParser::Attribute::value, and BeamSplash_cfg::version.

Referenced by startElement().

225  {
227  int version = 0;
228  for (size_t i = 0, e = attributes.size(); i != e; ++i)
229  {
230  Attribute &attr = attributes[i];
231  if (attr.key == "name")
232  name = attr.value;
233  else if (attr.key == "version")
234  {
235  char *endptr;
236  version = strtol(attr.value.c_str(), &endptr, 10);
237  if (endptr == attr.value.c_str())
238  throw ParserError("Version must be an integer.");
239  }
240  else
241  throw ParserError("Unexpected attribute " + attr.key);
242  }
243  m_configs.push_back(std::make_pair(name, new FWConfiguration(version)));
244  }
int i
Definition: DBlmapReader.cc:9
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
list attributes
Definition: asciidump.py:415
tuple attr
Definition: asciidump.py:432
virtual void FWXMLConfigParser::startElement ( const std::string &  tag,
Attributes attributes 
)
inlineoverridevirtual

Executes any transaction in the state machine which happens when the xml parser finds an new element.

Reimplemented from SimpleSAXParser.

Definition at line 250 of file FWConfigurationManager.cc.

References debug_config_state_machine(), IN_BEGIN_DOCUMENT, IN_BEGIN_STRING, IN_POPPED_CONFIG, IN_PUSHED_CONFIG, m_configs, m_first, m_state, and pushConfig().

251  {
253  if (m_state == IN_BEGIN_DOCUMENT)
254  {
255  if (tag != "config")
256  throw ParserError("Expecting toplevel <config> tag");
258  m_first.reset(m_configs.back().second);
260  }
261  else if (m_state == IN_PUSHED_CONFIG)
262  {
263  if (tag == "config")
265  else if (tag == "string")
267  else
268  throw ParserError("Unexpected element " + tag);
269  }
270  else if (m_state == IN_POPPED_CONFIG)
271  {
272  if (tag != "config")
273  throw ParserError("Unexpected element " + tag);
276  }
277  else
278  throw ParserError("Wrong opening tag found " + tag);
279  }
std::auto_ptr< FWConfiguration > m_first
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
void debug_config_state_machine(const char *where, const std::string &tag, int state)
void pushConfig(Attributes &attributes)
list attributes
Definition: asciidump.py:415

Member Data Documentation

std::vector<std::pair<std::string, FWConfiguration *> > FWXMLConfigParser::m_configs
private

Definition at line 343 of file FWConfigurationManager.cc.

Referenced by data(), endElement(), pushConfig(), and startElement().

std::string FWXMLConfigParser::m_currentConfigName
private

Definition at line 347 of file FWConfigurationManager.cc.

std::auto_ptr<FWConfiguration> FWXMLConfigParser::m_first
private

Definition at line 345 of file FWConfigurationManager.cc.

Referenced by config(), and startElement().

enum STATES FWXMLConfigParser::m_state
private

Definition at line 344 of file FWConfigurationManager.cc.

Referenced by data(), endElement(), and startElement().