Teuchos - Trilinos Tools Package  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Teuchos_XMLParameterListReader.cpp
1 // @HEADER
2 // *****************************************************************************
3 // Teuchos: Common Tools Package
4 //
5 // Copyright 2004 NTESS and the Teuchos contributors.
6 // SPDX-License-Identifier: BSD-3-Clause
7 // *****************************************************************************
8 // @HEADER
9 
12 #include "Teuchos_Assert.hpp"
13 #include "Teuchos_ParameterEntryXMLConverterDB.hpp"
16 
17 
18 namespace Teuchos {
19 
20 
22 : _allowDuplicateSublists(true)
23 {;}
24 
26 { return _allowDuplicateSublists; }
27 
29 { _allowDuplicateSublists = policy; }
30 
32  const XMLObject& xml, RCP<DependencySheet> depSheet) const
33 {
35  xml.getTag()
36  !=
39  "XMLParameterListReader expected tag " <<
41  <<", found " << xml.getTag());
43  IDtoValidatorMap validatorIDsMap;
44  int validatorsIndex =
46  if(validatorsIndex != -1){
47  convertValidators(xml.getChild(validatorsIndex), validatorIDsMap);
48  }
49  EntryIDsMap entryIDsMap;
50  convertParameterList(xml, rtn, entryIDsMap, validatorIDsMap);
51 
52  int dependencyIndex = xml.findFirstChild(
54  if(dependencyIndex != -1){
55  convertDependencies(
56  depSheet,
57  xml.getChild(dependencyIndex),
58  entryIDsMap,
59  validatorIDsMap);
60  }
61  return rtn;
62 }
63 
64 
67 {
69  xml.getTag()
70  !=
73  "XMLParameterListReader expected tag " <<
75  <<", found " << xml.getTag());
77  IDtoValidatorMap validatorIDsMap;
78  int validatorsIndex =
80  if(validatorsIndex != -1){
81  convertValidators(xml.getChild(validatorsIndex), validatorIDsMap);
82  }
83  EntryIDsMap entryIDsMap;
84  convertParameterList(xml, rtn, entryIDsMap, validatorIDsMap);
85  ParameterList toReturn = ParameterList(*rtn);
86  return toReturn;
87 }
88 
89 
90 void XMLParameterListReader::convertValidators(
91  const XMLObject& xml, IDtoValidatorMap& validatorIDsMap) const
92 {
93  std::set<const XMLObject*> validatorsWithPrototypes;
94  for (int i=0; i<xml.numChildren(); ++i){
95  if (xml.getChild(i).hasAttribute(
97  {
98  validatorsWithPrototypes.insert(&xml.getChild(i));
99  }
100  else{
101  RCP<ParameterEntryValidator> insertedValidator =
103  xml.getChild(i), validatorIDsMap);
107  testForDuplicateValidatorIDs(xmlID, validatorIDsMap);
109  xmlID,
110  insertedValidator));
111  }
112  }
113 
114  for (
115  std::set<const XMLObject*>::const_iterator it =
116  validatorsWithPrototypes.begin();
117  it!=validatorsWithPrototypes.end();
118  ++it)
119  {
120  RCP<ParameterEntryValidator> insertedValidator =
121  ValidatorXMLConverterDB::convertXML(*(*it), validatorIDsMap);
123  (*it)->getRequired<ParameterEntryValidator::ValidatorID>(
125  testForDuplicateValidatorIDs(xmlID, validatorIDsMap);
127  xmlID, insertedValidator));
128  }
129 }
130 
131 
132 void
133 XMLParameterListReader::convertParameterList(const XMLObject& xml,
134  RCP<ParameterList> parentList,
135  EntryIDsMap& entryIDsMap, const IDtoValidatorMap& validatorIDsMap) const
136 {
139  BadParameterListElementException,
140  "XMLParameterListReader expected tag " <<
142  <<", found the tag "
143  << xml.getTag());
144 
145  if(xml.hasAttribute(XMLParameterListWriter::getNameAttributeName())){
146  parentList->setName(
148  }
149 
150  for (int i=0; i<xml.numChildren(); i++) {
151 
152  XMLObject child = xml.getChild(i);
153 
156  &&
157  child.getTag() != ParameterEntry::getTagName()
158  &&
160  &&
162  BadParameterListElementException,
163  "XMLParameterListReader expected tag "
165  << ParameterEntry::getTagName() << ", but found "
166  << child.getTag() << " tag.");
167 
168 
169  if(
171  ||
172  child.getTag() == ParameterEntry::getTagName()
173  )
174  {
175 
176  std::string name;
177  if (child.getTag()==XMLParameterListWriter::getParameterListTagName()) {
178  if ( child.hasAttribute(XMLParameterListWriter::getNameAttributeName()) ) {
179  name = child.getRequired(XMLParameterListWriter::getNameAttributeName());
180  }
181  else {
182  // the name needs to be unique: generate one
183  std::ostringstream ss;
184  ss << "child" << i;
185  name = ss.str();
186  }
188  _allowDuplicateSublists == false
189  &&
190  parentList->isSublist(name) == true,
191  DuplicateParameterSublist,
192  "XMLParameterListReader encountered duplicate sublist \"" << name << "\", in violation"
193  << " of the policy specified by XMLParameterListReader::setAllowsDuplicateSublists()." );
194  RCP<ParameterList> newList = sublist(parentList, name);
195  convertParameterList(child, newList, entryIDsMap, validatorIDsMap);
196  }
197  else if (child.getTag() == ParameterEntry::getTagName()) {
199  !child.hasAttribute(XMLParameterListWriter::getNameAttributeName()),
200  NoNameAttributeExecption,
201  "All child nodes of a ParameterList must have a name attribute!" <<
202  std::endl << std::endl);
203  name = child.getRequired(XMLParameterListWriter::getNameAttributeName());
204  parentList->setEntry(
206  if(child.hasAttribute(ValidatorXMLConverter::getIdAttributeName())){
207  IDtoValidatorMap::const_iterator result = validatorIDsMap.find(
208  child.getRequired<ParameterEntryValidator::ValidatorID>(
210  TEUCHOS_TEST_FOR_EXCEPTION(result == validatorIDsMap.end(),
211  MissingValidatorDefinitionException,
212  "Could not find validator with id: "
213  << child.getRequired(
215  << std::endl <<
216  "Bad Parameter: " << name << std::endl << std::endl);
217  parentList->getEntryRCP(name)->setValidator(result->second);
218  }
219  }
220  if(child.hasAttribute(ParameterEntryXMLConverter::getIdAttributeName())){
221  insertEntryIntoMap(child, parentList->getEntryRCP(name), entryIDsMap);
222  }
223  }
224  }
225 }
226 
227 void XMLParameterListReader::testForDuplicateValidatorIDs(
229  const IDtoValidatorMap& currentMap) const
230 {
231  TEUCHOS_TEST_FOR_EXCEPTION(currentMap.find(potentialNewID) != currentMap.end(),
232  DuplicateValidatorIDsException,
233  "Validators with duplicate ids found!" << std::endl <<
234  "Bad ID: " << potentialNewID);
235 }
236 
237 void XMLParameterListReader::convertDependencies(
238  RCP<DependencySheet> depSheet,
239  const XMLObject& xml,
240  const EntryIDsMap& entryIDsMap,
241  const IDtoValidatorMap& validatorIDsMap) const
242 {
243  if(xml.hasAttribute(DependencySheet::getNameAttributeName())){
244  depSheet->setName(
245  xml.getAttribute(DependencySheet::getNameAttributeName()));
246  }
247  for(int i = 0; i < xml.numChildren(); ++i){
248  RCP<Dependency> currentDep = DependencyXMLConverterDB::convertXML(
249  xml.getChild(i),
250  entryIDsMap,
251  validatorIDsMap);
252  depSheet->addDependency(currentDep);
253  }
254 }
255 
256 void XMLParameterListReader::insertEntryIntoMap(
257  const XMLObject& xmlObj,
258  RCP<ParameterEntry> entryToInsert,
259  EntryIDsMap& entryIDsMap) const
260 {
261  if(xmlObj.hasAttribute(ParameterEntryXMLConverter::getIdAttributeName()))
262  {
264  xmlObj.getRequired<ParameterEntry::ParameterEntryID>(
266  TEUCHOS_TEST_FOR_EXCEPTION(entryIDsMap.find(xmlID) != entryIDsMap.end(),
267  DuplicateParameterIDsException,
268  "Parameters/ParameterList with duplicate ids found!" << std::endl <<
269  "Bad ID: " << xmlID << std::endl << std::endl);
270  entryIDsMap.insert(EntryIDsMap::value_type(xmlID, entryToInsert));
271  }
272 }
273 
274 
275 } // namespace Teuchos
276 
Writes an XML object to a parameter list.
static const std::string & getIdAttributeName()
const std::string & getTag() const
Return the tag of the current node.
Maps Validators to integers.
bool getAllowsDuplicateSublists() const
Specifies the current policy regarding duplicated sublists. See setAllowsDuplicateSublists() for more...
A database for DependencyXMLConverters.
static const std::string & getTagName()
Get the string that should be used as the tag name for all parameters when they are serialized to xml...
ValidatorMap::const_iterator const_iterator
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
static const std::string & getValidatorsTagName()
static const std::string & getPrototypeIdAttributeName()
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Deprecated.
Representation of an XML data tree. XMLObject is a ref-counted handle to a XMLObjectImplem object...
static const std::string & getDependenciesTagName()
A database for ValidatorXMLConverters.
Writes a ParameterList to an XML object.
RCP< ParameterList > toParameterList(const XMLObject &xml, RCP< DependencySheet > depSheet) const
A list of parameters of arbitrary type.
static RCP< ParameterEntryValidator > convertXML(const XMLObject &xmlObject, const IDtoValidatorMap &validatorIDsMap)
Given an XMLObject converts the XMLObject to a ParameterEntryValidator and inserts the validator into...
std::map< ParameterEntry::ParameterEntryID, RCP< ParameterEntry > > EntryIDsMap
Convenience typedef.
static ParameterEntry convertXML(const XMLObject &xmlObj)
Converts XML to a ParameterEntry.
Thrown when the root xml tag for a parameter list is incorrect.
std::pair< ParameterEntryValidator::ValidatorID, RCP< ParameterEntryValidator > > IDValidatorPair
int numChildren() const
Return the number of child nodes owned by this node.
Smart reference counting pointer class for automatic garbage collection.
int findFirstChild(std::string tagName) const
Returns the index of the first child found with the given tag name. Returns -1 if no child is found...
const XMLObject & getChild(int i) const
Return the i-th child node.
bool hasAttribute(const std::string &name) const
Find out if the current node has an attribute of the specified name.
static const std::string & getParameterListTagName()
static const std::string & getNameAttributeName()
static RCP< Dependency > convertXML(const XMLObject &xmlObject, const XMLParameterListReader::EntryIDsMap &entryIDsMap, const IDtoValidatorMap &validatorIDsMap)
Given an XMLObject converts the XMLObject to a Dependency.
const std::string & getRequired(const std::string &name) const
Get an attribute, throwing an std::exception if it is not found.
void insert(IDValidatorPair toInsert)
inserts an IDValidatorPair into the map.
static const std::string & getNameAttributeName()
When serializing to XML, this string should be used as the name of the name attribute.
void setAllowsDuplicateSublists(bool policy)
Set policy regarding duplicated sublists.