CMS 3D CMS Logo

List of all members | Public Member Functions | Private Types | Private Attributes
FWXMLConfigParser Class Reference

#include <FWXMLConfigParser.h>

Inheritance diagram for FWXMLConfigParser:
SimpleSAXParser

Public Member Functions

FWConfigurationconfig (void)
 
void data (const std::string &data) override
 
void debug_config_state_machine (const char *where, const std::string &tag, int state)
 
void endElement (const std::string &tag) override
 
 FWXMLConfigParser (std::istream &f)
 
void pushConfig (Attributes &attributes)
 
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::unique_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 33 of file FWXMLConfigParser.h.

Member Enumeration Documentation

Constructor & Destructor Documentation

FWXMLConfigParser::FWXMLConfigParser ( std::istream &  f)
inline

Definition at line 44 of file FWXMLConfigParser.h.

45  : SimpleSAXParser(f),
47  m_first(nullptr)
48  {}
double f[11][100]
std::unique_ptr< FWConfiguration > m_first
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 164 of file FWXMLConfigParser.h.

References m_first.

Referenced by FWPartialConfigGUI::FWPartialConfigGUI(), and FWPartialConfigSaveGUI::WriteConfig().

165  {
166  return m_first.get();
167  }
std::unique_ptr< FWConfiguration > m_first
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 147 of file FWXMLConfigParser.h.

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

148  {
150  // We ignore whitespace but complain about any text which is not
151  // in the <string> tag.
152  if (m_state == IN_BEGIN_STRING)
153  {
154  m_configs.back().second->addValue(data);
156  }
157  else if (strspn(data.c_str(), " \t\n") != data.size())
158  throw ParserError("Unexpected text " + data);
159  }
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
void debug_config_state_machine(const char *where, const std::string &tag, int state)
void data(const std::string &data) override
void FWXMLConfigParser::debug_config_state_machine ( const char *  where,
const std::string &  tag,
int  state 
)
inline

Definition at line 171 of file FWXMLConfigParser.h.

References MessageLogger_cfi::cerr.

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

172 {
173 #ifdef FW_CONFIG_PARSER_DEBUG
174  static char *debug_states[] = {
175  "IN_BEGIN_DOCUMENT",
176  "IN_PUSHED_CONFIG",
177  "IN_POPPED_CONFIG",
178  "IN_BEGIN_STRING",
179  "IN_STORED_STRING"
180  };
181 
182  std::cerr << " " << where << " tag/data " << tag << "in state " << debug_states[state] << std::endl;
183 #endif
184 }
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 116 of file FWXMLConfigParser.h.

References debug_config_state_machine(), IN_BEGIN_STRING, IN_POPPED_CONFIG, IN_PUSHED_CONFIG, IN_STORED_STRING, crabWrapper::key, m_configs, m_state, and AlCaHLTBitMon_QueryRunRegistry::string.

117  {
120  {
121  if (tag != "config")
122  throw ParserError("Wrong closing tag found " + tag);
123 
124  FWConfiguration *current = m_configs.back().second;
125  std::string key = m_configs.back().first;
126  m_configs.pop_back();
127  if (!m_configs.empty())
128  m_configs.back().second->addKeyValue(key, *current);
130  }
131  else if (m_state == IN_BEGIN_STRING && tag == "string")
132  {
133  m_configs.back().second->addValue("");
135  }
136  else if (m_state == IN_STORED_STRING && tag == "string")
138  else
139  throw ParserError("Wrong closing tag found " + tag);
140  }
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
void debug_config_state_machine(const char *where, const std::string &tag, int state)
void FWXMLConfigParser::pushConfig ( Attributes attributes)
inline

Pushes the configuration on stack eventually

Definition at line 51 of file FWXMLConfigParser.h.

References MillePedeFileConverter_cfg::e, mps_fire::i, SimpleSAXParser::Attribute::key, m_configs, dataset::name, AlCaHLTBitMon_QueryRunRegistry::string, SimpleSAXParser::Attribute::value, and jets_cff::version.

Referenced by startElement().

52  {
54  int version = 0;
55  for (size_t i = 0, e = attributes.size(); i != e; ++i)
56  {
57  Attribute &attr = attributes[i];
58  if (attr.key == "name")
59  name = attr.value;
60  else if (attr.key == "version")
61  {
62  char *endptr;
63  version = strtol(attr.value.c_str(), &endptr, 10);
64  if (endptr == attr.value.c_str())
65  throw ParserError("Version must be an integer.");
66  }
67  else
68  throw ParserError("Unexpected attribute " + attr.key);
69  }
70  m_configs.push_back(std::make_pair(name, new FWConfiguration(version)));
71  }
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
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 77 of file FWXMLConfigParser.h.

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().

78  {
81  {
82  if (tag != "config")
83  throw ParserError("Expecting toplevel <config> tag");
84  pushConfig(attributes);
85  m_first.reset(m_configs.back().second);
87  }
88  else if (m_state == IN_PUSHED_CONFIG)
89  {
90  if (tag == "config")
91  pushConfig(attributes);
92  else if (tag == "string")
94  else
95  throw ParserError("Unexpected element " + tag);
96  }
97  else if (m_state == IN_POPPED_CONFIG)
98  {
99  if (tag != "config")
100  throw ParserError("Unexpected element " + tag);
101  pushConfig(attributes);
103  }
104  else
105  throw ParserError("Wrong opening tag found " + tag);
106  }
std::vector< std::pair< std::string, FWConfiguration * > > m_configs
void pushConfig(Attributes &attributes)
void debug_config_state_machine(const char *where, const std::string &tag, int state)
std::unique_ptr< FWConfiguration > m_first

Member Data Documentation

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

Definition at line 187 of file FWXMLConfigParser.h.

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

std::string FWXMLConfigParser::m_currentConfigName
private

Definition at line 191 of file FWXMLConfigParser.h.

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

Definition at line 189 of file FWXMLConfigParser.h.

Referenced by config(), and startElement().

enum STATES FWXMLConfigParser::m_state
private

Definition at line 188 of file FWXMLConfigParser.h.

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