1 // Copyright (C) 2006-2021 CEA/DEN, EDF R&D
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Lesser General Public License for more details.
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 #include "ElementaryNode.hxx"
23 #include "ForEachLoop.hxx"
24 #include "OptimizerLoop.hxx"
26 #include "ForLoop.hxx"
27 #include "WhileLoop.hxx"
29 #include "InputPort.hxx"
30 #include "InlineNode.hxx"
31 #include "ServiceNode.hxx"
32 #include "ServerNode.hxx"
33 #include "ServiceInlineNode.hxx"
34 #include "DataNode.hxx"
36 #include "VisitorSaveState.hxx"
41 using namespace YACS::ENGINE;
45 #include "YacsTrace.hxx"
47 VisitorSaveState::VisitorSaveState(ComposedNode *root): Visitor(root)
49 _nodeStateName[YACS::READY] ="READY";
50 _nodeStateName[YACS::TOLOAD] ="TOLOAD";
51 _nodeStateName[YACS::LOADED] ="LOADED";
52 _nodeStateName[YACS::TOACTIVATE] ="TOACTIVATE";
53 _nodeStateName[YACS::ACTIVATED] ="ACTIVATED";
54 _nodeStateName[YACS::DESACTIVATED] ="DESACTIVATED";
55 _nodeStateName[YACS::DONE] ="DONE";
56 _nodeStateName[YACS::SUSPENDED] ="SUSPENDED";
57 _nodeStateName[YACS::LOADFAILED] ="LOADFAILED";
58 _nodeStateName[YACS::EXECFAILED] ="EXECFAILED";
59 _nodeStateName[YACS::PAUSE] ="PAUSE";
60 _nodeStateName[YACS::INTERNALERR] ="INTERNALERR";
61 _nodeStateName[YACS::DISABLED] ="DISABLED";
62 _nodeStateName[YACS::FAILED] ="FAILED";
63 _nodeStateName[YACS::ERROR] ="ERROR";
66 VisitorSaveState::~VisitorSaveState()
70 _out << "</graphState>" << endl;
75 void VisitorSaveState::openFileDump(const std::string& xmlDump)
77 _out.open(xmlDump.c_str(), ios::out);
80 string what = "Impossible to open file for writing: " + xmlDump;
81 throw Exception(what);
83 _out << "<?xml version='1.0'?>" << endl;
84 _out << "<graphState>" << endl;
87 void VisitorSaveState::closeFileDump()
89 if (!_out) throw Exception("No file open for dump state");
90 _out << "</graphState>" << endl;
94 void VisitorSaveState::visitElementaryNode(ElementaryNode *node)
96 if (!_out) throw Exception("No file open for dump state");
97 string name = _root->getChildName(node);
98 DEBTRACE("VisitorSaveState::visitElementaryNode --- " << name);
99 _out << " <node type='elementaryNode'>" << endl;
100 _out << " <name>" << name << "</name>" << endl;
101 int nodeState = node->getState();
102 _out << " <state>" << _nodeStateName[nodeState] << "</state>" << endl;
104 list<InputPort *> setOfInputPort = node->getSetOfInputPort();
105 list<InputPort *>::iterator iter;
106 for(iter = setOfInputPort.begin(); iter != setOfInputPort.end(); iter++)
108 _out << " <inputPort>" << endl;
109 _out << " <name>" << (*iter)->getName() << "</name>" << endl;
113 _out << (*iter)->dump();
115 catch (YACS::Exception &e)
117 DEBTRACE("caught YACS:Exception: " << e.what());
118 _out << "<value><error><![CDATA[" << e.what() << "]]></error></value>" << endl;
120 _out << " </inputPort>" << endl;
123 list<OutputPort *> setOfOutputPort = node->getSetOfOutputPort();
124 list<OutputPort *>::iterator oiter;
125 for(oiter = setOfOutputPort.begin(); oiter != setOfOutputPort.end(); oiter++)
127 _out << " <outputPort>" << endl;
128 _out << " <name>" << (*oiter)->getName() << "</name>" << endl;
132 _out << (*oiter)->dump();
134 catch (YACS::Exception &e)
136 DEBTRACE("caught YACS:Exception: " << e.what());
137 _out << "<value><error><![CDATA[" << e.what() << "]]></error></value>" << endl;
139 _out << " </outputPort>" << endl;
142 _out << " </node>" << endl;
145 void VisitorSaveState::visitBloc(Bloc *node)
147 node->ComposedNode::accept(this);
148 if (!_out) throw Exception("No file open for dump state");
149 string name = _root->getName();
150 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
151 DEBTRACE("VisitorSaveState::visitBloc ------------- " << name);
152 _out << " <node type='bloc'>" << endl;
153 _out << " <name>" << name << "</name>" << endl;
154 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
156 _out << " </node>" << endl;
159 void VisitorSaveState::visitProc(Proc *node)
161 node->ComposedNode::accept(this);
162 if (!_out) throw Exception("No file open for dump state");
163 string name = _root->getName();
164 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
165 DEBTRACE("VisitorSaveState::visitProc ------------- " << name);
166 _out << " <node type='proc'>" << endl;
167 _out << " <name>" << name << "</name>" << endl;
168 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
170 _out << " </node>" << endl;
173 void VisitorSaveState::visitForEachLoop(ForEachLoop *node)
175 node->ComposedNode::accept(this);
176 if (!_out) throw Exception("No file open for dump state");
177 string name = _root->getName();
178 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
179 DEBTRACE("VisitorSaveState::visitForEachLoop ------ " << name);
180 _out << " <node type='forEachLoop'>" << endl;
181 _out << " <name>" << name << "</name>" << endl;
182 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
184 _out << " </node>" << endl;
187 void VisitorSaveState::visitForEachLoopDyn(ForEachLoopDyn *node)
189 node->ComposedNode::accept(this);
190 if (!_out) throw Exception("No file open for dump state");
191 string name = _root->getName();
192 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
193 DEBTRACE("VisitorSaveState::visitForEachLoopDyn ------ " << name);
194 _out << " <node type='forEachLoopDyn'>" << endl;
195 _out << " <name>" << name << "</name>" << endl;
196 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
197 _out << " </node>" << endl;
200 void VisitorSaveState::visitOptimizerLoop(OptimizerLoop *node)
202 node->ComposedNode::accept(this);
203 if (!_out) throw Exception("No file open for dump state");
204 string name = _root->getName();
205 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
206 DEBTRACE("VisitorSaveState::visitOptimizerLoop ------ " << name);
207 _out << " <node type='optimizerLoop'>" << endl;
208 _out << " <name>" << name << "</name>" << endl;
209 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
211 _out << " </node>" << endl;
214 void VisitorSaveState::visitDynParaLoop(DynParaLoop *node)
216 node->ComposedNode::accept(this);
219 void VisitorSaveState::visitLoop(Loop *node)
221 node->ComposedNode::accept(this);
222 if (!_out) throw Exception("No file open for dump state");
223 string name = _root->getName();
224 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
225 DEBTRACE("VisitorSaveState::visitLoop ------------- " << name);
226 _out << " <node type ='loop'>" << endl;
227 _out << " <name>" << name << "</name>" << endl;
228 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
229 _out << " <nbdone>" << node->getNbOfTurns() << "</nbdone>" << endl;
231 _out << " </node>" << endl;
234 void VisitorSaveState::visitForLoop(ForLoop *node)
236 node->ComposedNode::accept(this);
237 if (!_out) throw Exception("No file open for dump state");
238 string name = _root->getName();
239 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
240 DEBTRACE("VisitorSaveState::visitForLoop ---------- " << name);
241 _out << " <node type='forLoop'>" << endl;
242 _out << " <name>" << name << "</name>" << endl;
243 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
244 _out << " <nbdone>" << node->getNbOfTurns() << "</nbdone>" << endl;
245 InputPort * ip = node->edGetNbOfTimesInputPort();
247 throw Exception("NbOfTimesInputPort in forLoop empty, case not handled yet...");
248 Any *val = static_cast<Any*>(ip->get());
249 int nsteps = val->getIntValue();
250 _out << " <nsteps>" << nsteps << "</nsteps>" << endl;
252 _out << " </node>" << endl;
255 void VisitorSaveState::visitWhileLoop(WhileLoop *node)
257 node->ComposedNode::accept(this);
258 if (!_out) throw Exception("No file open for dump state");
259 string name = _root->getName();
260 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
261 DEBTRACE("VisitorSaveState::visitWhileLoop -------- " << name);
262 _out << " <node type='whileLoop'>" << endl;
263 _out << " <name>" << name << "</name>" << endl;
264 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
265 _out << " <nbdone>" << node->getNbOfTurns() << "</nbdone>" << endl;
266 InputPort * ip = node->edGetConditionPort();
268 throw Exception("condition in WhileLoop empty, case not handled yet...");
269 if ( ConditionInputPort* cip = dynamic_cast<ConditionInputPort*>(ip) )
271 bool condition = cip->getValue();
272 _out << " <condition>" << condition << "</condition>" << endl;
275 _out << " </node>" << endl;
278 void VisitorSaveState::visitSwitch(Switch *node)
280 node->ComposedNode::accept(this);
281 if (!_out) throw Exception("No file open for dump state");
282 string name = _root->getName();
283 if (static_cast<ComposedNode*>(node) != _root) name = _root->getChildName(node);
284 DEBTRACE("VisitorSaveState::visitSwitch ----------- " << name);
285 _out << " <node type='switch'>" << endl;
286 _out << " <name>" << name << "</name>" << endl;
287 _out << " <state>" << _nodeStateName[node->getState()] << "</state>" << endl;
288 InputPort * ip = node->edGetConditionPort();
290 throw Exception("condition in switch empty, case not handled yet...");
291 Any *val = static_cast<Any*>(ip->get());
292 int condition = val->getIntValue();
293 _out << " <condition>" << condition << "</condition>" << endl;
295 _out << " </node>" << endl;
298 void VisitorSaveState::visitInlineNode(InlineNode *node)
300 visitElementaryNode(node);
303 void VisitorSaveState::visitInlineFuncNode(InlineFuncNode *node)
305 visitElementaryNode(node);
308 void VisitorSaveState::visitServiceNode(ServiceNode *node)
310 visitElementaryNode(node);
313 void VisitorSaveState::visitServerNode(ServerNode *node)
315 visitElementaryNode(node);
318 void VisitorSaveState::visitServiceInlineNode(ServiceInlineNode *node)
320 visitElementaryNode(node);
323 void VisitorSaveState::visitPresetNode(DataNode *node)
325 visitElementaryNode(node);
328 void VisitorSaveState::visitOutNode(DataNode *node)
330 visitElementaryNode(node);
333 void VisitorSaveState::visitStudyInNode(DataNode *node)
335 visitElementaryNode(node);
338 void VisitorSaveState::visitStudyOutNode(DataNode *node)
340 visitElementaryNode(node);