Salome HOME
4e365a86d7c47485adec4e6a6e42e8b8e849a730
[modules/yacs.git] / src / engine / VisitorSaveState.cxx
1 // Copyright (C) 2006-2020  CEA/DEN, EDF R&D
2 //
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.
7 //
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.
12 //
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
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19
20 #include "ElementaryNode.hxx"
21 #include "Bloc.hxx"
22 #include "Proc.hxx"
23 #include "ForEachLoop.hxx"
24 #include "OptimizerLoop.hxx"
25 #include "Loop.hxx"
26 #include "ForLoop.hxx"
27 #include "WhileLoop.hxx"
28 #include "Switch.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"
35
36 #include "VisitorSaveState.hxx"
37
38 #include <iostream>
39 #include <string>
40
41 using namespace YACS::ENGINE;
42 using namespace std;
43
44 //#define _DEVDEBUG_
45 #include "YacsTrace.hxx"
46
47 VisitorSaveState::VisitorSaveState(ComposedNode *root): Visitor(root)
48 {
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";
64 }
65
66 VisitorSaveState::~VisitorSaveState()
67 {
68   if (_out)
69     {
70       _out << "</graphState>" << endl;
71       _out.close();
72     }
73 }
74
75 void VisitorSaveState::openFileDump(const std::string& xmlDump)
76 {
77   _out.open(xmlDump.c_str(), ios::out);
78   if (!_out)
79     {
80       string what = "Impossible to open file for writing: " + xmlDump;
81       throw Exception(what);
82     }
83   _out << "<?xml version='1.0'?>" << endl;
84   _out << "<graphState>" << endl;
85 }
86
87 void VisitorSaveState::closeFileDump()
88 {
89   if (!_out) throw Exception("No file open for dump state");
90   _out << "</graphState>" << endl;
91   _out.close();
92 }
93
94 void VisitorSaveState::visitElementaryNode(ElementaryNode *node)
95 {
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;
103
104   list<InputPort *> setOfInputPort = node->getSetOfInputPort();
105   list<InputPort *>::iterator iter;
106   for(iter = setOfInputPort.begin(); iter != setOfInputPort.end(); iter++)
107     {
108       _out << "    <inputPort>" << endl;
109       _out << "      <name>" << (*iter)->getName() << "</name>" << endl;
110       try
111         {
112           _out << "      ";
113           _out << (*iter)->dump();
114         }
115       catch (YACS::Exception &e)
116         {
117           DEBTRACE("caught YACS:Exception: " << e.what());
118           _out << "<value><error><![CDATA[" << e.what() << "]]></error></value>" << endl;
119         }
120       _out << "    </inputPort>" << endl;
121     }
122
123   list<OutputPort *> setOfOutputPort = node->getSetOfOutputPort();
124   list<OutputPort *>::iterator oiter;
125   for(oiter = setOfOutputPort.begin(); oiter != setOfOutputPort.end(); oiter++)
126     {
127       _out << "    <outputPort>" << endl;
128       _out << "      <name>" << (*oiter)->getName() << "</name>" << endl;
129       try
130         {
131           _out << "      ";
132           _out << (*oiter)->dump();
133         }
134       catch (YACS::Exception &e)
135         {
136           DEBTRACE("caught YACS:Exception: " << e.what());
137           _out << "<value><error><![CDATA[" << e.what() << "]]></error></value>" << endl;
138         }
139       _out << "    </outputPort>" << endl;
140     }
141
142   _out << "  </node>" << endl;
143 }
144
145 void VisitorSaveState::visitBloc(Bloc *node)
146 {
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;
155
156   _out << "  </node>" << endl;
157 }
158
159 void VisitorSaveState::visitProc(Proc *node)
160 {
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;
169
170   _out << "  </node>" << endl;
171 }
172
173 void VisitorSaveState::visitForEachLoop(ForEachLoop *node)
174 {
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;
183
184   _out << "  </node>" << endl;
185 }
186
187 void VisitorSaveState::visitForEachLoopDyn(ForEachLoopDyn *node)
188 {
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;
198 }
199
200 void VisitorSaveState::visitOptimizerLoop(OptimizerLoop *node)
201 {
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;
210
211   _out << "  </node>" << endl;
212 }
213
214 void VisitorSaveState::visitDynParaLoop(DynParaLoop *node)
215 {
216   node->ComposedNode::accept(this);
217 }
218
219 void VisitorSaveState::visitLoop(Loop *node)
220 {
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;
230
231   _out << "  </node>" << endl;
232 }
233
234 void VisitorSaveState::visitForLoop(ForLoop *node)
235 {
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();
246   if (ip->isEmpty())
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;
251
252   _out << "  </node>" << endl;
253 }
254
255 void VisitorSaveState::visitWhileLoop(WhileLoop *node)
256 {
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();
267   if (ip->isEmpty())
268     throw Exception("condition in WhileLoop empty, case not handled yet...");
269   if ( ConditionInputPort* cip = dynamic_cast<ConditionInputPort*>(ip) )
270   {
271     bool condition = cip->getValue();
272     _out << "    <condition>" << condition << "</condition>" << endl;
273   }
274
275   _out << "  </node>" << endl;
276 }
277
278 void VisitorSaveState::visitSwitch(Switch *node)
279 {
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();
289   if (ip->isEmpty())
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;
294  
295   _out << "  </node>" << endl;
296 }
297
298 void VisitorSaveState::visitInlineNode(InlineNode *node)
299 {
300   visitElementaryNode(node);
301 }
302
303 void VisitorSaveState::visitInlineFuncNode(InlineFuncNode *node)
304 {
305   visitElementaryNode(node);
306 }
307
308 void VisitorSaveState::visitServiceNode(ServiceNode *node)
309 {
310   visitElementaryNode(node);
311 }
312
313 void VisitorSaveState::visitServerNode(ServerNode *node)
314 {
315   visitElementaryNode(node);
316 }
317
318 void VisitorSaveState::visitServiceInlineNode(ServiceInlineNode *node)
319 {
320   visitElementaryNode(node);
321 }
322
323 void VisitorSaveState::visitPresetNode(DataNode *node)
324 {
325   visitElementaryNode(node);
326 }
327
328 void VisitorSaveState::visitOutNode(DataNode *node)
329 {
330   visitElementaryNode(node);
331 }
332
333 void VisitorSaveState::visitStudyInNode(DataNode *node)
334 {
335   visitElementaryNode(node);
336 }
337
338 void VisitorSaveState::visitStudyOutNode(DataNode *node)
339 {
340   visitElementaryNode(node);
341 }