1 // @HEADER
2 // ***********************************************************************
3 //
4 //                    Teuchos: Common Tools Package
5 //                 Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #include "Teuchos_XMLParameterListWriter.hpp"
43 #include "Teuchos_ParameterEntryXMLConverterDB.hpp"
44 #include "Teuchos_ValidatorXMLConverterDB.hpp"
45 #include "Teuchos_XMLParameterListExceptions.hpp"
46 #include "Teuchos_DependencyXMLConverterDB.hpp"
47 
48 
49 namespace Teuchos{
50 
51 
XMLParameterListWriter()52 XMLParameterListWriter::XMLParameterListWriter()
53 {;}
54 
55 
56 XMLObject
toXML(const ParameterList & p,RCP<const DependencySheet> depSheet) const57 XMLParameterListWriter::toXML(
58   const ParameterList& p,
59   RCP<const DependencySheet> depSheet) const
60 {
61   EntryIDsMap entryIDsMap;
62   ValidatortoIDMap validatorIDsMap;
63   ParameterEntry::ParameterEntryID peIDCounter = 0;
64 
65   //We build an initial map full of validators that are located in the
66   //parameter list. That way we can convert the parameter entries.
67   buildInitialValidatorMap(p, validatorIDsMap);
68 
69   XMLObject toReturn =
70     convertParameterList(p, peIDCounter, entryIDsMap, validatorIDsMap);
71   toReturn.addAttribute(getNameAttributeName(), p.name());
72 
73   if(!depSheet.is_null()){
74     XMLObject deps =
75       convertDependencies(depSheet, entryIDsMap, validatorIDsMap);
76     toReturn.addChild(deps);
77   }
78 
79   //Validators must be done after depencneies because dependencies might add
80   //entries to the validator map. KLN 09/20/2010
81   XMLObject validators = convertValidators(p, validatorIDsMap);
82   toReturn.addChild(validators);
83 
84   return toReturn;
85 }
86 
buildInitialValidatorMap(const ParameterList & p,ValidatortoIDMap & validatorIDsMap) const87 void XMLParameterListWriter::buildInitialValidatorMap(
88   const ParameterList& p,
89   ValidatortoIDMap& validatorIDsMap) const
90 {
91   for (ParameterList::ConstIterator i=p.begin(); i!=p.end(); ++i) {
92     const ParameterEntry& entry = p.entry(i);
93     if(entry.isList()){
94       buildInitialValidatorMap(
95         getValue<ParameterList>(entry),
96         validatorIDsMap);
97     }
98     else if(nonnull(entry.validator())){
99       validatorIDsMap.insert(entry.validator());
100     }
101   }
102 }
103 
104 
convertValidators(const ParameterList &,ValidatortoIDMap & validatorIDsMap) const105 XMLObject XMLParameterListWriter::convertValidators(
106   const ParameterList& /* p */, ValidatortoIDMap& validatorIDsMap) const
107 {
108   XMLObject validators(getValidatorsTagName());
109   for(
110     ValidatortoIDMap::const_iterator it = validatorIDsMap.begin();
111     it != validatorIDsMap.end();
112     ++it)
113   {
114     validators.addChild(
115       ValidatorXMLConverterDB::convertValidator(it->first, validatorIDsMap));
116   }
117   return validators;
118 }
119 
120 
convertParameterList(const ParameterList & p,ParameterEntry::ParameterEntryID & idCounter,EntryIDsMap & entryIDsMap,const ValidatortoIDMap & validatorIDsMap) const121 XMLObject XMLParameterListWriter::convertParameterList(
122   const ParameterList& p,
123   ParameterEntry::ParameterEntryID& idCounter,
124   EntryIDsMap& entryIDsMap,
125   const ValidatortoIDMap& validatorIDsMap) const
126 {
127   XMLObject rtn(getParameterListTagName());
128 
129   for (ParameterList::ConstIterator i=p.begin(); i!=p.end(); ++i){
130     RCP<const ParameterEntry> entry = p.getEntryRCP(i->first);
131     if(entry->isList()){
132       XMLObject newPL = convertParameterList(
133         getValue<ParameterList>(entry),
134         idCounter,
135         entryIDsMap,
136         validatorIDsMap);
137       newPL.addAttribute(
138         getNameAttributeName(), p.name(i));
139       newPL.addAttribute(
140         ParameterEntryXMLConverter::getIdAttributeName(), idCounter);
141       entryIDsMap.insert(EntryIDsMap::value_type(entry, idCounter));
142       rtn.addChild(newPL);
143       ++idCounter;
144     }
145     else{
146       rtn.addChild(ParameterEntryXMLConverterDB::convertEntry(
147         entry, p.name(i), idCounter, validatorIDsMap));
148       entryIDsMap.insert(EntryIDsMap::value_type(entry, idCounter));
149       ++idCounter;
150     }
151   }
152   return rtn;
153 }
154 
155 XMLObject
convertDependencies(RCP<const DependencySheet> depSheet,const EntryIDsMap & entryIDsMap,ValidatortoIDMap & validatorIDsMap) const156 XMLParameterListWriter::convertDependencies(
157   RCP<const DependencySheet> depSheet,
158   const EntryIDsMap& entryIDsMap,
159   ValidatortoIDMap& validatorIDsMap) const
160 {
161   XMLObject toReturn(getDependenciesTagName());
162   toReturn.addAttribute(
163     DependencySheet::getNameAttributeName(),
164     depSheet->getName()
165   );
166 
167   for(
168     DependencySheet::DepSet::const_iterator it = depSheet->depBegin();
169     it != depSheet->depEnd();
170     ++it)
171   {
172     toReturn.addChild(DependencyXMLConverterDB::convertDependency(
173       *it, entryIDsMap, validatorIDsMap));
174   }
175   return toReturn;
176 }
177 
178 
179 } // namespace Teuchos
180 
181