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