Version: 9.15.0
VisitorSaveState.cxx
Go to the documentation of this file.
1 // Copyright (C) 2006-2025 CEA, EDF
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 
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 
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 
88 {
89  if (!_out) throw Exception("No file open for dump state");
90  _out << "</graphState>" << endl;
91  _out.close();
92 }
93 
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 
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 
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 
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 
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 
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 
215 {
216  node->ComposedNode::accept(this);
217 }
218 
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 
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 
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 
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 
299 {
300  visitElementaryNode(node);
301 }
302 
304 {
305  visitElementaryNode(node);
306 }
307 
309 {
310  visitElementaryNode(node);
311 }
312 
314 {
315  visitElementaryNode(node);
316 }
317 
319 {
320  visitElementaryNode(node);
321 }
322 
324 {
325  visitElementaryNode(node);
326 }
327 
329 {
330  visitElementaryNode(node);
331 }
332 
334 {
335  visitElementaryNode(node);
336 }
337 
339 {
340  visitElementaryNode(node);
341 }
#define DEBTRACE(msg)
Definition: YacsTrace.hxx:31
: Interface for management of storage of data formated dynamically in its TypeCode....
Definition: Any.hxx:79
virtual int getIntValue() const =0
Composed node to group elementary and composed nodes.
Definition: Bloc.hxx:36
Base class for all composed nodes.
std::string getChildName(const Node *node) const
std::string getName() const
Class for data parameters specification.
Definition: DataNode.hxx:38
Base class for dynamically (fully or semifully) built graphs.
Definition: DynParaLoop.hxx:41
Base class for all calculation nodes.
std::list< OutputPort * > getSetOfOutputPort() const
std::list< InputPort * > getSetOfInputPort() const
YACS::StatesForNode getState() const
Loop node for parametric calculation.
Class for for loop node.
Definition: ForLoop.hxx:33
InputPort * edGetNbOfTimesInputPort()
Definition: ForLoop.hxx:45
Class for calculation node (function) inlined (and executed) in the schema.
Definition: InlineNode.hxx:93
Class for calculation node (script) inlined (and executed) in the schema.
Definition: InlineNode.hxx:44
Base class for Input Ports.
Definition: InputPort.hxx:44
virtual bool isEmpty()
Definition: InputPort.cxx:70
virtual void * get() const =0
Base class for loop node.
Definition: Loop.hxx:147
int getNbOfTurns() const
Definition: Loop.hxx:162
virtual YACS::StatesForNode getState() const
Definition: Node.hxx:118
class to build optimization loops
Base class for all schema objects.
Definition: Proc.hxx:44
Class for calculation node associated with a component service.
Definition: ServiceNode.hxx:35
Control node that emulates the C switch.
Definition: Switch.hxx:85
InputPort * edGetConditionPort()
Definition: Switch.hxx:115
virtual void visitOptimizerLoop(OptimizerLoop *node)
std::map< int, std::string > _nodeStateName
virtual void visitStudyInNode(DataNode *node)
void visitForEachLoop(ForEachLoop *node) override
virtual void visitServiceInlineNode(ServiceInlineNode *node)
virtual void visitDynParaLoop(DynParaLoop *node)
virtual void visitWhileLoop(WhileLoop *node)
virtual void visitSwitch(Switch *node)
virtual void visitOutNode(DataNode *node)
VisitorSaveState(ComposedNode *root)
virtual void visitInlineFuncNode(InlineFuncNode *node)
virtual void visitElementaryNode(ElementaryNode *node)
virtual void visitServiceNode(ServiceNode *node)
void visitForEachLoopDyn(ForEachLoopDyn *node) override
virtual void visitServerNode(ServerNode *node)
virtual void visitBloc(Bloc *node)
virtual void visitLoop(Loop *node)
virtual void visitProc(Proc *node)
virtual void visitStudyOutNode(DataNode *node)
void openFileDump(const std::string &xmlDump)
virtual void visitInlineNode(InlineNode *node)
virtual void visitForLoop(ForLoop *node)
virtual void visitPresetNode(DataNode *node)
ComposedNode * _root
Definition: Visitor.hxx:85
Class for a while loop.
Definition: WhileLoop.hxx:39
InputPort * edGetConditionPort()
Definition: WhileLoop.hxx:48
const char * what(void) const noexcept
Definition: Exception.cxx:50
@ FAILED
Definition: define.hxx:51
@ DESACTIVATED
Definition: define.hxx:42
@ EXECFAILED
Definition: define.hxx:46
@ TOLOAD
Definition: define.hxx:38
@ LOADED
Definition: define.hxx:39
@ READY
Definition: define.hxx:37
@ ACTIVATED
Definition: define.hxx:41
@ INTERNALERR
Definition: define.hxx:49
@ DONE
Definition: define.hxx:43
@ TOACTIVATE
Definition: define.hxx:40
@ SUSPENDED
Definition: define.hxx:44
@ PAUSE
Definition: define.hxx:47
@ DISABLED
Definition: define.hxx:50
@ LOADFAILED
Definition: define.hxx:45
@ ERROR
Definition: define.hxx:52