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 201 of file FWConfigurationManager.cc.

Member Enumeration Documentation

Constructor & Destructor Documentation

FWXMLConfigParser::FWXMLConfigParser ( istream &  f)
inline

Definition at line 212 of file FWConfigurationManager.cc.

213  : SimpleSAXParser(f),
215  m_first(0)
216  {}
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 332 of file FWConfigurationManager.cc.

References m_first.

333  {
334  return m_first.get();
335  }
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 315 of file FWConfigurationManager.cc.

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

316  {
318  // We ignore whitespace but complain about any text which is not
319  // in the <string> tag.
320  if (m_state == IN_BEGIN_STRING)
321  {
322  m_configs.back().second->addValue(data);
324  }
325  else if (strspn(data.c_str(), " \t\n") != data.size())
326  throw ParserError("Unexpected text " + data);
327  }
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 284 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, and m_state.

285  {
288  {
289  if (tag != "config")
290  throw ParserError("Wrong closing tag found " + tag);
291 
292  FWConfiguration *current = m_configs.back().second;
293  std::string key = m_configs.back().first;
294  m_configs.pop_back();
295  if (!m_configs.empty())
296  m_configs.back().second->addKeyValue(key, *current);
298  }
299  else if (m_state == IN_BEGIN_STRING && tag == "string")
300  {
301  m_configs.back().second->addValue("");
303  }
304  else if (m_state == IN_STORED_STRING && tag == "string")
306  else
307  throw ParserError("Wrong closing tag found " + tag);
308  }
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 219 of file FWConfigurationManager.cc.

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

Referenced by startElement().

220  {
221  std::string name;
222  int version = 0;
223  for (size_t i = 0, e = attributes.size(); i != e; ++i)
224  {
225  Attribute &attr = attributes[i];
226  if (attr.key == "name")
227  name = attr.value;
228  else if (attr.key == "version")
229  {
230  char *endptr;
231  version = strtol(attr.value.c_str(), &endptr, 10);
232  if (endptr == attr.value.c_str())
233  throw ParserError("Version must be an integer.");
234  }
235  else
236  throw ParserError("Unexpected attribute " + attr.key);
237  }
238  m_configs.push_back(std::make_pair(name, new FWConfiguration(version)));
239  }
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 245 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().

246  {
248  if (m_state == IN_BEGIN_DOCUMENT)
249  {
250  if (tag != "config")
251  throw ParserError("Expecting toplevel <config> tag");
253  m_first.reset(m_configs.back().second);
255  }
256  else if (m_state == IN_PUSHED_CONFIG)
257  {
258  if (tag == "config")
260  else if (tag == "string")
262  else
263  throw ParserError("Unexpected element " + tag);
264  }
265  else if (m_state == IN_POPPED_CONFIG)
266  {
267  if (tag != "config")
268  throw ParserError("Unexpected element " + tag);
271  }
272  else
273  throw ParserError("Wrong opening tag found " + tag);
274  }
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 338 of file FWConfigurationManager.cc.

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

std::string FWXMLConfigParser::m_currentConfigName
private

Definition at line 342 of file FWConfigurationManager.cc.

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

Definition at line 340 of file FWConfigurationManager.cc.

Referenced by config(), and startElement().

enum STATES FWXMLConfigParser::m_state
private

Definition at line 339 of file FWConfigurationManager.cc.

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